ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDZiZDhhYjguLmRlZGUxMTQgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMzE3LDYgKzMxNywxMiBAQAogUzogU2VhdHRsZSwgV2FzaGluZ3RvbiA5ODEyNi0yMDEwCiBTOiBVU0EKIAorTjogSm9oYW5uZXMgQmVyZworRTogam9oYW5uZXNAc2lwc29sdXRpb25zLm5ldAorVzogaHR0cDovL2pvaGFubmVzLnNpcHNvbHV0aW9ucy5uZXQvCitQOiAxMDI0RC85QUI3OENBNSBBRDAyIDAxNzYgNEUyOSBDMTM3IDFERjYgMDhEMiBGQzQ0IENGODYgOUFCNyA4Q0E1CitEOiBwb3dlcnBjICYgODAyLjExIGhhY2tlcgorCiBOOiBTdGVwaGVuIFIuIHZhbiBkZW4gQmVyZyAoQUtBIEJ1R2xlc3MpCiBFOiBiZXJnQHBvb2wuaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQogRDogR2VuZXJhbCBrZXJuZWwsIGdjYywgYW5kIGxpYmMgaGFja2VyCkBAIC0yMjg2LDE0ICsyMjkyLDE0IEBACiBTOiBHZXJtYW55CiAKIE46IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotRTogYWNtZUBtYW5kcml2YS5jb20KIEU6IGFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CitFOiBhcm5hbGRvLm1lbG9AZ21haWwuY29tCitFOiBhY21lQHJlZGhhdC5jb20KIFc6IGh0dHA6Ly9vb3BzLmdob3N0cHJvdG9jb2xzLm5ldDo4MS9ibG9nLwogUDogMTAyNEQvOTIyNERGMDEgRDVERiBFM0JCIEUzQzggQkNCQiBGOEFEICA4NDFBIEI2QUIgNDY4MSA5MjI0IERGMDEKIEQ6IElQWCwgTExDLCBEQ0NQLCBjeWMyeCwgd2wzNTAxX2NzLCBuZXQvIGhhY2tzCi1TOiBNYW5kcml2YQotUzogUi4gVG9jYW50aW5zLCA4OSAtIENyaXN0byBSZWkKLVM6IDgwMDUwLTQzMCAtIEN1cml0aWJhIC0gUGFyYW7hCitTOiBSLiBCcmFz7WxpbyBJdGliZXLqLCA0MjcwLzEwMTAgLSDBZ3VhIFZlcmRlCitTOiA4MDI0MC0wNjAgLSBDdXJpdGliYSAtIFBhcmFu4QogUzogQnJhemlsCiAKIE46IEthcnN0ZW4gTWVya2VyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggMTliNGM5Ni4uNmRhNjYzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMjExLDE1ICsyMTEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJSVB2NCBvbmx5IGNvbm5lY3Rpb24gdHJhY2tpbmcvTkFUL2hlbHBlcnMKLVdoZW46CTIuNi4yMgotV2h5OglUaGUgbmV3IGxheWVyIDMgaW5kZXBlbmRhbnQgY29ubmVjdGlvbiB0cmFja2luZyByZXBsYWNlcyB0aGUgb2xkCi0JSVB2NCBvbmx5IHZlcnNpb24uIEFmdGVyIHNvbWUgc3RhYmlsaXphdGlvbiBvZiB0aGUgbmV3IGNvZGUgdGhlCi0Jb2xkIG9uZSB3aWxsIGJlIHJlbW92ZWQuCi1XaG86CVBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJQUNQSSBob29rcyAoWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJKSBpbiBzcGVlZHN0ZXAtY2VudHJpbm8gZHJpdmVyCiBXaGVuOglEZWNlbWJlciAyMDA2CiBXaHk6CVNwZWVkc3RlcC1jZW50cmlubyBkcml2ZXIgd2l0aCBBQ1BJIGhvb2tzIGFuZCBhY3BpLWNwdWZyZXEgZHJpdmVyIGFyZQpAQCAtMjk0LDE4ICsyODUsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJV2lyZWxlc3MgZXh0ZW5zaW9ucyBvdmVyIG5ldGxpbmsgKENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LKQotV2hlbjoJd2l0aCB0aGUgbWVyZ2Ugb2Ygd2lyZWxlc3MtZGV2LCAyLjYuMjIgb3IgbGF0ZXIKLVdoeToJVGhlIG9wdGlvbi9jb2RlIGlzCi0JICogbm90IGVuYWJsZWQgb24gbW9zdCBrZXJuZWxzCi0JICogbm90IHJlcXVpcmVkIGJ5IGFueSB1c2Vyc3BhY2UgdG9vbHMgKGV4Y2VwdCBhbiBleHBlcmltZW50YWwgb25lLAotCSAgIGFuZCBldmVuIHRoZXJlIG9ubHkgZm9yIHNvbWUgcGFydHMsIG90aGVycyB1c2UgaW9jdGwpCi0JICogcG9pbnRsZXNzIHNpbmNlIHdleHQgaXMgbm8gbG9uZ2VyIGV2b2x2aW5nIGFuZCB0aGUgaW9jdGwKLQkgICBpbnRlcmZhY2UgbmVlZHMgdG8gYmUga2VwdAotV2hvOglKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJaTh4eF90Y28gd2F0Y2hkb2cgZHJpdmVyCiBXaGVuOglpbiAyLjYuMjIKIFdoeToJdGhlIGk4eHhfdGNvIHdhdGNoZG9nIGRyaXZlciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgaVRDT193ZHQKQEAgLTMxMywzICsyOTIsMjIgQEAKIFdobzoJV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CU11bHRpcGF0aCBjYWNoZWQgcm91dGluZyBzdXBwb3J0IGluIGlwdjQKK1doZW46CWluIDIuNi4yMworV2h5OglDb2RlIHdhcyBtZXJnZWQsIHRoZW4gc3VibWl0dGVyIGltbWVkaWF0ZWx5IGRpc2FwcGVhcmVkIGxlYXZpbmcKKwl1cyB3aXRoIG5vIG1haW50YWluZXIgYW5kIGxvdHMgb2YgYnVncy4gIFRoZSBjb2RlIHNob3VsZCBub3QgaGF2ZQorCWJlZW4gbWVyZ2VkIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIG1hbnkgYXNwZWN0cyBvZiBpdCdzCisJaW1wbGVtZW50YXRpb24gYXJlIGJsb2NraW5nIG1vcmUgY3JpdGljYWwgY29yZSBuZXR3b3JraW5nCisJZGV2ZWxvcG1lbnQuICBJdCdzIG1hcmtlZCBFWFBFUklNRU5UQUwgYW5kIG5vIGRpc3RyaWJ1dGlvbgorCWVuYWJsZXMgaXQgYmVjYXVzZSBpdCBjYXVzZSBvYnNjdXJlIGNyYXNoZXMgZHVlIHRvIHVuZml4YWJsZSBidWdzCisJKGludGVyZmFjZXMgZG9uJ3QgcmV0dXJuIGVycm9ycyBzbyBtZW1vcnkgYWxsb2NhdGlvbiBjYW4ndCBiZQorCWhhbmRsZWQsIGNhbGxpbmcgY29udGV4dHMgb2YgdGhlc2UgaW50ZXJmYWNlcyBtYWtlIGhhbmRsaW5nCisJZXJyb3JzIGltcG9zc2libGUgdG9vIGJlY2F1c2UgdGhleSBnZXQgY2FsbGVkIGFmdGVyIHdlJ3ZlCisJdG90YWxseSBjb21taXRlZCB0byBjcmVhdGluZyBhIHJvdXRlIG9iamVjdCwgZm9yIGV4YW1wbGUpLgorCVRoaXMgcHJvYmxlbSBoYXMgZXhpc3RlZCBmb3IgeWVhcnMgYW5kIG5vIGZvcndhcmQgcHJvZ3Jlc3MKKwloYXMgZXZlciBiZWVuIG1hZGUsIGFuZCBub2JvZHkgc3RlcHMgdXAgdG8gdHJ5IGFuZCBzYWx2YWdlCisJdGhpcyBjb2RlLCBzbyB3ZSdyZSBnb2luZyB0byBmaW5hbGx5IGp1c3QgZ2V0IHJpZCBvZiBpdC4KK1dobzoJRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZzLnR4dAppbmRleCAyZjQyMzdkLi4xMmFkNmM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Fmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZnMudHh0CkBAIC0xLDMxICsxLDgyIEBACisJCQkgICAgID09PT09PT09PT09PT09PT09PT09CiAJCQkgICAgIGtBRlM6IEFGUyBGSUxFU1lTVEVNCiAJCQkgICAgID09PT09PT09PT09PT09PT09PT09CiAKLUFCT1VUCitDb250ZW50czoKKworIC0gT3ZlcnZpZXcuCisgLSBVc2FnZS4KKyAtIE1vdW50cG9pbnRzLgorIC0gUHJvYyBmaWxlc3lzdGVtLgorIC0gVGhlIGNlbGwgZGF0YWJhc2UuCisgLSBTZWN1cml0eS4KKyAtIEV4YW1wbGVzLgorCisKKz09PT09PT09CitPVkVSVklFVworPT09PT09PT0KKworVGhpcyBmaWxlc3lzdGVtIHByb3ZpZGVzIGEgZmFpcmx5IHNpbXBsZSBzZWN1cmUgQUZTIGZpbGVzeXN0ZW0gZHJpdmVyLiBJdCBpcwordW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGRvZXMgbm90IHlldCBwcm92aWRlIHRoZSBmdWxsIGZlYXR1cmUgc2V0LiAgVGhlIGZlYXR1cmVzCitpdCBkb2VzIHN1cHBvcnQgaW5jbHVkZToKKworICgqKSBTZWN1cml0eSAoY3VycmVudGx5IG9ubHkgQUZTIGthc2VydmVyIGFuZCBLZXJiZXJvc0lWIHRpY2tldHMpLgorCisgKCopIEZpbGUgcmVhZGluZy4KKworICgqKSBBdXRvbW91bnRpbmcuCisKK0l0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgQUZTIGZlYXR1cmVzOgorCisgKCopIFdyaXRlIHN1cHBvcnQuCisKKyAoKikgTG9jYWwgY2FjaGluZy4KKworICgqKSBwaW9jdGwoKSBzeXN0ZW0gY2FsbC4KKworCis9PT09PT09PT09PQorQ09NUElMQVRJT04KKz09PT09PT09PT09CisKK1RoZSBmaWxlc3lzdGVtIHNob3VsZCBiZSBlbmFibGVkIGJ5IHR1cm5pbmcgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uCitvcHRpb25zOgorCisJQ09ORklHX0FGX1JYUlBDCQktIFRoZSBSeFJQQyBwcm90b2NvbCB0cmFuc3BvcnQKKwlDT05GSUdfUlhLQUQJCS0gVGhlIFJ4UlBDIEtlcmJlcm9zIHNlY3VyaXR5IGhhbmRsZXIKKwlDT05GSUdfQUZTCQktIFRoZSBBRlMgZmlsZXN5c3RlbQorCitBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHR1cm5lZCBvbiB0byBhaWQgZGVidWdnaW5nOgorCisJQ09ORklHX0FGX1JYUlBDX0RFQlVHCS0gUGVybWl0IEFGX1JYUlBDIGRlYnVnZ2luZyB0byBiZSBlbmFibGVkCisJQ09ORklHX0FGU19ERUJVRwktIFBlcm1pdCBBRlMgZGVidWdnaW5nIHRvIGJlIGVuYWJsZWQKKworVGhleSBwZXJtaXQgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZSB0dXJuZWQgb24gZHluYW1pY2FsbHkgYnkgbWFuaXB1bGF0aW5nCit0aGUgbWFza3MgaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKKworCS9zeXMvbW9kdWxlL2FmX3J4cnBjL3BhcmFtZXRlcnMvZGVidWcKKwkvc3lzL21vZHVsZS9hZnMvcGFyYW1ldGVycy9kZWJ1ZworCisKID09PT09Ci0KLVRoaXMgZmlsZXN5c3RlbSBwcm92aWRlcyBhIGZhaXJseSBzaW1wbGUgQUZTIGZpbGVzeXN0ZW0gZHJpdmVyLiBJdCBpcyB1bmRlcgotZGV2ZWxvcG1lbnQgYW5kIG9ubHkgcHJvdmlkZXMgdmVyeSBiYXNpYyBmYWNpbGl0aWVzLiBJdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydAotdGhlIGZvbGxvd2luZyBBRlMgZmVhdHVyZXM6Ci0KLQkoKikgV3JpdGUgc3VwcG9ydC4KLQkoKikgQ29tbXVuaWNhdGlvbnMgc2VjdXJpdHkuCi0JKCopIExvY2FsIGNhY2hpbmcuCi0JKCopIHBpb2N0bCgpIHN5c3RlbSBjYWxsLgotCSgqKSBBdXRvbWF0aWMgbW91bnRpbmcgb2YgZW1iZWRkZWQgbW91bnRwb2ludHMuCi0KLQogVVNBR0UKID09PT09CiAKIFdoZW4gaW5zZXJ0aW5nIHRoZSBkcml2ZXIgbW9kdWxlcyB0aGUgcm9vdCBjZWxsIG11c3QgYmUgc3BlY2lmaWVkIGFsb25nIHdpdGggYQogbGlzdCBvZiB2b2x1bWUgbG9jYXRpb24gc2VydmVyIElQIGFkZHJlc3NlczoKIAotCWluc21vZCByeHJwYy5vCisJaW5zbW9kIGFmX3J4cnBjLm8KKwlpbnNtb2QgcnhrYWQubwogCWluc21vZCBrYWZzLm8gcm9vdGNlbGw9Y2FtYnJpZGdlLnJlZGhhdC5jb206MTcyLjE2LjE4LjczOjE3Mi4xNi4xOC45MQogCi1UaGUgZmlyc3QgbW9kdWxlIGlzIGEgZHJpdmVyIGZvciB0aGUgUnhSUEMgcmVtb3RlIG9wZXJhdGlvbiBwcm90b2NvbCwgYW5kIHRoZQotc2Vjb25kIGlzIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBkcml2ZXIgZm9yIHRoZSBBRlMgZmlsZXN5c3RlbS4KK1RoZSBmaXJzdCBtb2R1bGUgaXMgdGhlIEFGX1JYUlBDIG5ldHdvcmsgcHJvdG9jb2wgZHJpdmVyLiAgVGhpcyBwcm92aWRlcyB0aGUKK1J4UlBDIHJlbW90ZSBvcGVyYXRpb24gcHJvdG9jb2wgYW5kIG1heSBhbHNvIGJlIGFjY2Vzc2VkIGZyb20gdXNlcnNwYWNlLiAgU2VlOgorCisJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dAorCitUaGUgc2Vjb25kIG1vZHVsZSBpcyB0aGUga2VyYmVyb3MgUnhSUEMgc2VjdXJpdHkgZHJpdmVyLCBhbmQgdGhlIHRoaXJkIG1vZHVsZQoraXMgdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGRyaXZlciBmb3IgdGhlIEFGUyBmaWxlc3lzdGVtLgogCiBPbmNlIHRoZSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLCBtb3JlIG1vZHVsZXMgY2FuIGJlIGFkZGVkIGJ5IHRoZSBmb2xsb3dpbmcKIHByb2NlZHVyZToKQEAgLTMzLDcgKzg0LDcgQEAKIAllY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPi9wcm9jL2ZzL2Fmcy9jZWxscwogCiBXaGVyZSB0aGUgcGFyYW1ldGVycyB0byB0aGUgImFkZCIgY29tbWFuZCBhcmUgdGhlIG5hbWUgb2YgYSBjZWxsIGFuZCBhIGxpc3Qgb2YKLXZvbHVtZSBsb2NhdGlvbiBzZXJ2ZXJzIHdpdGhpbiB0aGF0IGNlbGwuCit2b2x1bWUgbG9jYXRpb24gc2VydmVycyB3aXRoaW4gdGhhdCBjZWxsLCB3aXRoIHRoZSBsYXR0ZXIgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KIAogRmlsZXN5c3RlbXMgY2FuIGJlIG1vdW50ZWQgYW55d2hlcmUgYnkgY29tbWFuZHMgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgogCkBAIC00MiwxMSArOTMsNiBAQAogCW1vdW50IC10IGFmcyAiI3Jvb3QuYWZzLiIgL2FmcwogCW1vdW50IC10IGFmcyAiI3Jvb3QuY2VsbC4iIC9hZnMvY2FtYnJpZGdlCiAKLSAgTkI6IFdoZW4gdXNpbmcgdGhpcyBvbiBMaW51eCAyLjQsIHRoZSBtb3VudCBjb21tYW5kIGhhcyB0byBiZSBkaWZmZXJlbnQsCi0gICAgICBzaW5jZSB0aGUgZmlsZXN5c3RlbSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBkZXZpY2UgbmFtZSBhcmd1bWVudDoKLQotCW1vdW50IC10IGFmcyBub25lIC9hZnMgLW92b2w9IiNyb290LmFmcy4iCi0KIFdoZXJlIHRoZSBpbml0aWFsIGNoYXJhY3RlciBpcyBlaXRoZXIgYSBoYXNoIG9yIGEgcGVyY2VudCBzeW1ib2wgZGVwZW5kaW5nIG9uCiB3aGV0aGVyIHlvdSBkZWZpbml0ZWx5IHdhbnQgYSBSL1cgdm9sdW1lIChoYXNoKSBvciB3aGV0aGVyIHlvdSdkIHByZWZlciBhIFIvTwogdm9sdW1lLCBidXQgYXJlIHdpbGxpbmcgdG8gdXNlIGEgUi9XIHZvbHVtZSBpbnN0ZWFkIChwZXJjZW50KS4KQEAgLTYwLDU1ICsxMDYsNjYgQEAKIEFkZGl0aW9uYWwgY2VsbHMgY2FuIGJlIGFkZGVkIHRocm91Z2ggL3Byb2MgKHNlZSBsYXRlciBzZWN0aW9uKS4KIAogCis9PT09PT09PT09PQogTU9VTlRQT0lOVFMKID09PT09PT09PT09CiAKLUFGUyBoYXMgYSBjb25jZXB0IG9mIG1vdW50cG9pbnRzLiBUaGVzZSBhcmUgc3BlY2lhbGx5IGZvcm1hdHRlZCBzeW1ib2xpYyBsaW5rcwotKG9mIHRoZSBzYW1lIGZvcm0gYXMgdGhlICJkZXZpY2UgbmFtZSIgcGFzc2VkIHRvIG1vdW50KS4ga0FGUyBwcmVzZW50cyB0aGVzZQotdG8gdGhlIHVzZXIgYXMgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIHNwZWNpYWwgcHJvcGVydGllczoKK0FGUyBoYXMgYSBjb25jZXB0IG9mIG1vdW50cG9pbnRzLiBJbiBBRlMgdGVybXMsIHRoZXNlIGFyZSBzcGVjaWFsbHkgZm9ybWF0dGVkCitzeW1ib2xpYyBsaW5rcyAob2YgdGhlIHNhbWUgZm9ybSBhcyB0aGUgImRldmljZSBuYW1lIiBwYXNzZWQgdG8gbW91bnQpLiAga0FGUworcHJlc2VudHMgdGhlc2UgdG8gdGhlIHVzZXIgYXMgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIGEgZm9sbG93LWxpbmsgY2FwYWJpbGl0eQorKGllOiBzeW1ib2xpYyBsaW5rIHNlbWFudGljcykuICBJZiBhbnlvbmUgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZW0sIHRoZXkgd2lsbAorYXV0b21hdGljYWxseSBjYXVzZSB0aGUgdGFyZ2V0IHZvbHVtZSB0byBiZSBtb3VudGVkIChpZiBwb3NzaWJsZSkgb24gdGhhdCBzaXRlLgogCi0gICgqKSBUaGV5IGNhbm5vdCBiZSBsaXN0ZWQuIFJ1bm5pbmcgYSBwcm9ncmFtIGxpa2UgImxzIiBvbiB0aGVtIHdpbGwgaW5jdXIgYW4KLSAgICAgIEVSRU1PVEUgZXJyb3IgKE9iamVjdCBpcyByZW1vdGUpLgorQXV0b21hdGljYWxseSBtb3VudGVkIGZpbGVzeXN0ZW1zIHdpbGwgYmUgYXV0b21hdGljYWxseSB1bm1vdW50ZWQgYXBwcm94aW1hdGVseQordHdlbnR5IG1pbnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIGxhc3QgdXNlZC4gIEFsdGVybmF0aXZlbHkgdGhleSBjYW4gYmUgdW5tb3VudGVkCitkaXJlY3RseSB3aXRoIHRoZSB1bW91bnQoKSBzeXN0ZW0gY2FsbC4KIAotICAoKikgT3RoZXIgb2JqZWN0cyBjYW4ndCBiZSBsb29rZWQgdXAgaW5zaWRlIG9mIHRoZW0uIFRoaXMgYWxzbyBpbmN1cnMgYW4KLSAgICAgIEVSRU1PVEUgZXJyb3IuCitNYW51YWxseSB1bm1vdW50aW5nIGFuIEFGUyB2b2x1bWUgd2lsbCBjYXVzZSBhbnkgaWRsZSBzdWJtb3VudHMgdXBvbiBpdCB0byBiZQorY3VsbGVkIGZpcnN0LiAgSWYgYWxsIGFyZSBjdWxsZWQsIHRoZW4gdGhlIHJlcXVlc3RlZCB2b2x1bWUgd2lsbCBhbHNvIGJlCit1bm1vdW50ZWQsIG90aGVyd2lzZSBlcnJvciBFQlVTWSB3aWxsIGJlIHJldHVybmVkLgogCi0gICgqKSBUaGV5IGNhbiBiZSBxdWVyaWVkIHdpdGggdGhlIHJlYWRsaW5rKCkgc3lzdGVtIGNhbGwsIHdoaWNoIHdpbGwgcmV0dXJuCi0gICAgICB0aGUgbmFtZSBvZiB0aGUgbW91bnRwb2ludCB0byB3aGljaCB0aGV5IHBvaW50LiBUaGUgInJlYWRsaW5rIiBwcm9ncmFtCi0gICAgICB3aWxsIGFsc28gd29yay4KK1RoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IgdG8gYXR0ZW1wdCB0byB1bm1vdW50IHRoZSB3aG9sZSBBRlMgdHJlZQorbW91bnRlZCBvbiAvYWZzIGluIG9uZSBnbyBieSBkb2luZzoKIAotICAoKikgVGhleSBjYW4gYmUgbW91bnRlZCBvbiAod2hpY2ggc3ltYm9saWMgbGlua3MgY2FuJ3QpLgorCXVtb3VudCAvYWZzCiAKIAorPT09PT09PT09PT09PT09CiBQUk9DIEZJTEVTWVNURU0KID09PT09PT09PT09PT09PQogCi1UaGUgcnhycGMgbW9kdWxlIGNyZWF0ZXMgYSBudW1iZXIgb2YgZmlsZXMgaW4gdmFyaW91cyBwbGFjZXMgaW4gdGhlIC9wcm9jCi1maWxlc3lzdGVtOgotCi0gICgqKSBGaXJzdGx5LCBzb21lIGluZm9ybWF0aW9uIGZpbGVzIGFyZSBtYWRlIGF2YWlsYWJsZSBpbiBhIGRpcmVjdG9yeSBjYWxsZWQKLSAgICAgICIvcHJvYy9uZXQvcnhycGMvIi4gVGhlc2UgbGlzdCB0aGUgZXh0YW50IHRyYW5zcG9ydCBlbmRwb2ludCwgcGVlciwKLSAgICAgIGNvbm5lY3Rpb24gYW5kIGNhbGwgcmVjb3Jkcy4KLQotICAoKikgU2Vjb25kbHksIHNvbWUgY29udHJvbCBmaWxlcyBhcmUgbWFkZSBhdmFpbGFibGUgaW4gYSBkaXJlY3RvcnkgY2FsbGVkCi0gICAgICAiL3Byb2Mvc3lzL3J4cnBjLyIuIEN1cnJlbnRseSwgYWxsIHRoZXNlIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBpcyB0bwotICAgICAgdHVybiBvbiB2YXJpb3VzIGxldmVscyBvZiB0cmFjaW5nLgotCiBUaGUgQUZTIG1vZHVsZXMgY3JlYXRlcyBhICIvcHJvYy9mcy9hZnMvIiBkaXJlY3RvcnkgYW5kIHBvcHVsYXRlcyBpdDoKIAotICAoKikgQSAiY2VsbHMiIGZpbGUgdGhhdCBsaXN0cyBjZWxscyBjdXJyZW50bHkga25vd24gdG8gdGhlIGFmcyBtb2R1bGUuCisgICgqKSBBICJjZWxscyIgZmlsZSB0aGF0IGxpc3RzIGNlbGxzIGN1cnJlbnRseSBrbm93biB0byB0aGUgYWZzIG1vZHVsZSBhbmQKKyAgICAgIHRoZWlyIHVzYWdlIGNvdW50czoKKworCVtyb290QGFuZHJvbWVkYSB+XSMgY2F0IC9wcm9jL2ZzL2Fmcy9jZWxscworCVVTRSBOQU1FCisJICAzIGNhbWJyaWRnZS5yZWRoYXQuY29tCiAKICAgKCopIEEgZGlyZWN0b3J5IHBlciBjZWxsIHRoYXQgY29udGFpbnMgZmlsZXMgdGhhdCBsaXN0IHZvbHVtZSBsb2NhdGlvbgogICAgICAgc2VydmVycywgdm9sdW1lcywgYW5kIGFjdGl2ZSBzZXJ2ZXJzIGtub3duIHdpdGhpbiB0aGF0IGNlbGwuCiAKKwlbcm9vdEBhbmRyb21lZGEgfl0jIGNhdCAvcHJvYy9mcy9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20vc2VydmVycworCVVTRSBBRERSICAgICAgICAgICAgU1RBVEUKKwkgIDQgMTcyLjE2LjE4LjkxICAgICAgICAwCisJW3Jvb3RAYW5kcm9tZWRhIH5dIyBjYXQgL3Byb2MvZnMvYWZzL2NhbWJyaWRnZS5yZWRoYXQuY29tL3Zsc2VydmVycworCUFERFJFU1MKKwkxNzIuMTYuMTguOTEKKwlbcm9vdEBhbmRyb21lZGEgfl0jIGNhdCAvcHJvYy9mcy9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20vdm9sdW1lcworCVVTRSBTVFQgVkxJRFswXSAgVkxJRFsxXSAgVkxJRFsyXSAgTkFNRQorCSAgMSBWYWwgMjAwMDAwMDAgMjAwMDAwMDEgMjAwMDAwMDIgcm9vdC5hZnMKIAorCis9PT09PT09PT09PT09PT09PQogVEhFIENFTEwgREFUQUJBU0UKID09PT09PT09PT09PT09PT09CiAKLVRoZSBmaWxlc3lzdGVtIG1haW50YWlucyBhbiBpbnRlcm5hbCBkYXRhYmFzZSBvZiBhbGwgdGhlIGNlbGxzIGl0IGtub3dzIGFuZAotdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgdm9sdW1lIGxvY2F0aW9uIHNlcnZlcnMgZm9yIHRob3NlIGNlbGxzLiBUaGUgY2VsbCB0bwotd2hpY2ggdGhlIGNvbXB1dGVyIGJlbG9uZ3MgaXMgYWRkZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gaW5zbW9kIGlzIHBlcmZvcm1lZAotYnkgdGhlICJyb290Y2VsbD0iIGFyZ3VtZW50LgorVGhlIGZpbGVzeXN0ZW0gbWFpbnRhaW5zIGFuIGludGVybmFsIGRhdGFiYXNlIG9mIGFsbCB0aGUgY2VsbHMgaXQga25vd3MgYW5kIHRoZQorSVAgYWRkcmVzc2VzIG9mIHRoZSB2b2x1bWUgbG9jYXRpb24gc2VydmVycyBmb3IgdGhvc2UgY2VsbHMuICBUaGUgY2VsbCB0byB3aGljaAordGhlIHN5c3RlbSBiZWxvbmdzIGlzIGFkZGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGluc21vZCBpcyBwZXJmb3JtZWQgYnkgdGhlCisicm9vdGNlbGw9IiBhcmd1bWVudCBvciwgaWYgY29tcGlsZWQgaW4sIHVzaW5nIGEgImthZnMucm9vdGNlbGw9IiBhcmd1bWVudCBvbgordGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCiAKIEZ1cnRoZXIgY2VsbHMgY2FuIGJlIGFkZGVkIGJ5IGNvbW1hbmRzIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKIApAQCAtMTE4LDIwICsxNzUsNjUgQEAKIE5vIG90aGVyIGNlbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIGF0IHRoaXMgdGltZS4KIAogCis9PT09PT09PQorU0VDVVJJVFkKKz09PT09PT09CisKK1NlY3VyZSBvcGVyYXRpb25zIGFyZSBpbml0aWF0ZWQgYnkgYWNxdWlyaW5nIGEga2V5IHVzaW5nIHRoZSBrbG9nIHByb2dyYW0uICBBCit2ZXJ5IHByaW1pdGl2ZSBrbG9nIHByb2dyYW0gaXMgYXZhaWxhYmxlIGF0OgorCisJaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35kaG93ZWxscy9yeHJwYy9rbG9nLmMKKworVGhpcyBzaG91bGQgYmUgY29tcGlsZWQgYnk6CisKKwltYWtlIGtsb2cgTERMSUJTPSItbGNyeXB0byAtbGNyeXB0IC1sa3JiNCAtbGtleXV0aWxzIgorCitBbmQgdGhlbiBydW4gYXM6CisKKwkuL2tsb2cKKworQXNzdW1pbmcgaXQncyBzdWNjZXNzZnVsLCB0aGlzIGFkZHMgYSBrZXkgb2YgdHlwZSBSeFJQQywgbmFtZWQgZm9yIHRoZSBzZXJ2aWNlCithbmQgY2VsbCwgZWc6ICJhZnNAPGNlbGxuYW1lPiIuICBUaGlzIGNhbiBiZSB2aWV3ZWQgd2l0aCB0aGUga2V5Y3RsIHByb2dyYW0gb3IKK2J5IGNhdCdpbmcgL3Byb2Mva2V5czoKKworCVtyb290QGFuZHJvbWVkYSB+XSMga2V5Y3RsIHNob3cKKwlTZXNzaW9uIEtleXJpbmcKKwkgICAgICAgLTMgLS1hbHN3cnYgICAgICAwICAgICAwICBrZXlyaW5nOiBfc2VzLjMyNjgKKwkJMiAtLWFsc3dydiAgICAgIDAgICAgIDAgICBcXyBrZXlyaW5nOiBfdWlkLjAKKwkxMTE0MTY1NTMgLS1hbHMtLXYgICAgICAwICAgICAwICAgXF8gcnhycGM6IGFmc0BDQU1CUklER0UuUkVESEFULkNPTQorCitDdXJyZW50bHkgdGhlIHVzZXJuYW1lLCByZWFsbSwgcGFzc3dvcmQgYW5kIHByb3Bvc2VkIHRpY2tldCBsaWZldGltZSBhcmUKK2NvbXBpbGVkIGluIHRvIHRoZSBwcm9ncmFtLgorCitJdCBpcyBub3QgcmVxdWlyZWQgdG8gYWNxdWlyZSBhIGtleSBiZWZvcmUgdXNpbmcgQUZTIGZhY2lsaXRpZXMsIGJ1dCBpZiBvbmUgaXMKK25vdCBhY3F1aXJlZCB0aGVuIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGFub255bW91cyB1c2VyIHBhcnRzCitvZiB0aGUgQUNMcy4KKworSWYgYSBrZXkgaXMgYWNxdWlyZWQsIHRoZW4gYWxsIEFGUyBvcGVyYXRpb25zLCBpbmNsdWRpbmcgbW91bnRzIGFuZCBhdXRvbW91bnRzLAorbWFkZSBieSBhIHBvc3Nlc3NvciBvZiB0aGF0IGtleSB3aWxsIGJlIHNlY3VyZWQgd2l0aCB0aGF0IGtleS4KKworSWYgYSBmaWxlIGlzIG9wZW5lZCB3aXRoIGEgcGFydGljdWxhciBrZXkgYW5kIHRoZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBpcworcGFzc2VkIHRvIGEgcHJvY2VzcyB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGF0IGtleSAocGVyaGFwcyBvdmVyIGFuIEFGX1VOSVgKK3NvY2tldCksIHRoZW4gdGhlIG9wZXJhdGlvbnMgb24gdGhlIGZpbGUgd2lsbCBiZSBtYWRlIHdpdGgga2V5IHRoYXQgd2FzIHVzZWQgdG8KK29wZW4gdGhlIGZpbGUuCisKKworPT09PT09PT0KIEVYQU1QTEVTCiA9PT09PT09PQogCi1IZXJlJ3Mgd2hhdCBJIHVzZSB0byB0ZXN0IHRoaXMuIFNvbWUgb2YgdGhlIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGxvY2FsCi10byBteSBpbnRlcm5hbCBETlMuIE15ICJyb290LmFmcyIgcGFydGl0aW9uIGhhcyBhIG1vdW50IHBvaW50IHdpdGhpbiBpdCBmb3IKK0hlcmUncyB3aGF0IEkgdXNlIHRvIHRlc3QgdGhpcy4gIFNvbWUgb2YgdGhlIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGxvY2FsCit0byBteSBpbnRlcm5hbCBETlMuICBNeSAicm9vdC5hZnMiIHBhcnRpdGlvbiBoYXMgYSBtb3VudCBwb2ludCB3aXRoaW4gaXQgZm9yCiBzb21lIHB1YmxpYyB2b2x1bWVzIHZvbHVtZXMuCiAKLWluc21vZCAtUyAvdG1wL3J4cnBjLm8gCi1pbnNtb2QgLVMgL3RtcC9rYWZzLm8gcm9vdGNlbGw9Y2FtYnJpZGdlLnJlZGhhdC5jb206MTcyLjE2LjE4LjczOjE3Mi4xNi4xOC45MQoraW5zbW9kIC90bXAvcnhycGMubworaW5zbW9kIC90bXAvcnhrYWQubworaW5zbW9kIC90bXAva2Fmcy5vIHJvb3RjZWxsPWNhbWJyaWRnZS5yZWRoYXQuY29tOjE3Mi4xNi4xOC45MQogCiBtb3VudCAtdCBhZnMgXCVyb290LmFmcy4gL2FmcwogbW91bnQgLXQgYWZzIFwlY2FtYnJpZGdlLnJlZGhhdC5jb206cm9vdC5jZWxsLiAvYWZzL2NhbWJyaWRnZS5yZWRoYXQuY29tLwogCi1lY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPiAvcHJvYy9mcy9hZnMvY2VsbHMgCitlY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPiAvcHJvYy9mcy9hZnMvY2VsbHMKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QuY2VsbC4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvCiBtb3VudCAtdCBhZnMgIiNncmFuZC5jZW50cmFsLm9yZzpyb290LmFyY2hpdmUuIiAvYWZzL2dyYW5kLmNlbnRyYWwub3JnL2FyY2hpdmUKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QuY29udHJpYi4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvY29udHJpYgpAQCAtMTQxLDE1ICsyNDMsNyBAQAogbW91bnQgLXQgYWZzICIjZ3JhbmQuY2VudHJhbC5vcmc6cm9vdC5zb2Z0d2FyZS4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvc29mdHdhcmUKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QudXNlci4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvdXNlcgogCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy91c2VyCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9zb2Z0d2FyZQotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvc2VydmljZQotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvcHJvamVjdAotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvZG9jCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9jb250cmliCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9hcmNoaXZlCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZwotdW1vdW50IC9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20KIHVtb3VudCAvYWZzCiBybW1vZCBrYWZzCitybW1vZCByeGthZAogcm1tb2QgcnhycGMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDU0ODRhYjUuLjdhYWYwOWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTQyMSw2ICsxNDIxLDE1IEBACiBiZSBkcm9wcGVkLiAgVGhlICBkZWZhdWx0ICBzZXR0aW5ncyAgbGltaXQgIHdhcm5pbmcgbWVzc2FnZXMgdG8gb25lIGV2ZXJ5IGZpdmUKIHNlY29uZHMuCiAKK3dhcm5pbmdzCistLS0tLS0tLQorCitUaGlzIGNvbnRyb2xzIGNvbnNvbGUgbWVzc2FnZXMgZnJvbSB0aGUgbmV0d29ya2luZyBzdGFjayB0aGF0IGNhbiBvY2N1ciBiZWNhdXNlCitvZiBwcm9ibGVtcyBvbiB0aGUgbmV0d29yayBsaWtlIGR1cGxpY2F0ZSBhZGRyZXNzIG9yIGJhZCBjaGVja3N1bXMuIE5vcm1hbGx5LAordGhpcyBzaG91bGQgYmUgZW5hYmxlZCwgYnV0IGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzIHRoZSBtZXNzYWdlcyBjYW4gYmUKK2Rpc2FibGVkLgorCisKIG5ldGRldl9tYXhfYmFja2xvZwogLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2tleXMudHh0CmluZGV4IDYwYzY2NWQuLjgxZDlhYTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dApAQCAtODU5LDYgKzg1OSwxOCBAQAogCXZvaWQgdW5yZWdpc3Rlcl9rZXlfdHlwZShzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUpOwogCiAKK1VuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcywgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBkZXNpcmFibGUgdG8gZGVhbCB3aXRoIGEKK2J1bmRsZSBvZiBrZXlzLiAgVGhlIGZhY2lsaXR5IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUga2V5cmluZyB0eXBlIGZvciBtYW5hZ2luZworc3VjaCBhIGJ1bmRsZToKKworCXN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9rZXlyaW5nOworCitUaGlzIGNhbiBiZSB1c2VkIHdpdGggYSBmdW5jdGlvbiBzdWNoIGFzIHJlcXVlc3Rfa2V5KCkgdG8gZmluZCBhIHNwZWNpZmljCitrZXlyaW5nIGluIGEgcHJvY2VzcydzIGtleXJpbmdzLiAgQSBrZXlyaW5nIHRodXMgZm91bmQgY2FuIHRoZW4gYmUgc2VhcmNoZWQKK3dpdGgga2V5cmluZ19zZWFyY2goKS4gIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHJlcXVlc3Rfa2V5KCkgdG8KK3NlYXJjaCBhIHNwZWNpZmljIGtleXJpbmcsIHNvIHVzaW5nIGtleXJpbmdzIGluIHRoaXMgd2F5IGlzIG9mIGxpbWl0ZWQgdXRpbGl0eS4KKworCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogTk9URVMgT04gQUNDRVNTSU5HIFBBWUxPQUQgQ09OVEVOVFMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKaW5kZXggZGU4MDllNS4uMWRhNTY2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dApAQCAtOTIwLDQwICs5MjAsOSBAQAogZG9jdW1lbnRlZCBhYm92ZS4KIAogCVRvIGNyZWF0ZSBtdWx0aXBsZSBib25kaW5nIGRldmljZXMgd2l0aCBkaWZmZXJpbmcgb3B0aW9ucywgaXQKLWlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBib25kaW5nIGRyaXZlciBtdWx0aXBsZSB0aW1lcy4gIE5vdGUgdGhhdAotY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgc3lzY29uZmlnIG5ldHdvcmsgaW5pdGlhbGl6YXRpb24gc2NyaXB0cwotaGFuZGxlIHRoaXMgYXV0b21hdGljYWxseTsgaWYgeW91ciBkaXN0cm8gdXNlcyB0aGVzZSBzY3JpcHRzLCBubwotc3BlY2lhbCBhY3Rpb24gaXMgbmVlZGVkLiAgU2VlIHRoZSBzZWN0aW9uIENvbmZpZ3VyaW5nIEJvbmRpbmcKLURldmljZXMsIGFib3ZlLCBpZiB5b3UncmUgbm90IHN1cmUgYWJvdXQgeW91ciBuZXR3b3JrIGluaXRpYWxpemF0aW9uCi1zY3JpcHRzLgoraXMgbmVjZXNzYXJ5IHRvIHVzZSBib25kaW5nIHBhcmFtZXRlcnMgZXhwb3J0ZWQgYnkgc3lzZnMsIGRvY3VtZW50ZWQKK2luIHRoZSBzZWN0aW9uIGJlbG93LgogCi0JVG8gbG9hZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIG1vZHVsZSwgaXQgaXMgbmVjZXNzYXJ5IHRvCi1zcGVjaWZ5IGEgZGlmZmVyZW50IG5hbWUgZm9yIGVhY2ggaW5zdGFuY2UgKHRoZSBtb2R1bGUgbG9hZGluZyBzeXN0ZW0KLXJlcXVpcmVzIHRoYXQgZXZlcnkgbG9hZGVkIG1vZHVsZSwgZXZlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUKLW1vZHVsZSwgaGF2ZSBhIHVuaXF1ZSBuYW1lKS4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cHBseWluZwotbXVsdGlwbGUgc2V0cyBvZiBib25kaW5nIG9wdGlvbnMgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mLCBmb3IgZXhhbXBsZToKLQkKLWFsaWFzIGJvbmQwIGJvbmRpbmcKLW9wdGlvbnMgYm9uZDAgLW8gYm9uZDAgbW9kZT1iYWxhbmNlLXJyIG1paW1vbj0xMDAKLQotYWxpYXMgYm9uZDEgYm9uZGluZwotb3B0aW9ucyBib25kMSAtbyBib25kMSBtb2RlPWJhbGFuY2UtYWxiIG1paW1vbj01MAotCi0Jd2lsbCBsb2FkIHRoZSBib25kaW5nIG1vZHVsZSB0d28gdGltZXMuICBUaGUgZmlyc3QgaW5zdGFuY2UgaXMKLW5hbWVkICJib25kMCIgYW5kIGNyZWF0ZXMgdGhlIGJvbmQwIGRldmljZSBpbiBiYWxhbmNlLXJyIG1vZGUgd2l0aCBhbgotbWlpbW9uIG9mIDEwMC4gIFRoZSBzZWNvbmQgaW5zdGFuY2UgaXMgbmFtZWQgImJvbmQxIiBhbmQgY3JlYXRlcyB0aGUKLWJvbmQxIGRldmljZSBpbiBiYWxhbmNlLWFsYiBtb2RlIHdpdGggYW4gbWlpbW9uIG9mIDUwLgotCi0JSW4gc29tZSBjaXJjdW1zdGFuY2VzICh0eXBpY2FsbHkgd2l0aCBvbGRlciBkaXN0cmlidXRpb25zKSwKLXRoZSBhYm92ZSBkb2VzIG5vdCB3b3JrLCBhbmQgdGhlIHNlY29uZCBib25kaW5nIGluc3RhbmNlIG5ldmVyIHNlZXMKLWl0cyBvcHRpb25zLiAgSW4gdGhhdCBjYXNlLCB0aGUgc2Vjb25kIG9wdGlvbnMgbGluZSBjYW4gYmUgc3Vic3RpdHV0ZWQKLWFzIGZvbGxvd3M6Ci0KLWluc3RhbGwgYm9uZDEgL3NiaW4vbW9kcHJvYmUgLS1pZ25vcmUtaW5zdGFsbCBib25kaW5nIC1vIGJvbmQxIFwKLQltb2RlPWJhbGFuY2UtYWxiIG1paW1vbj01MAotCi0JVGhpcyBtYXkgYmUgcmVwZWF0ZWQgYW55IG51bWJlciBvZiB0aW1lcywgc3BlY2lmeWluZyBhIG5ldyBhbmQKLXVuaXF1ZSBuYW1lIGluIHBsYWNlIG9mIGJvbmQxIGZvciBlYWNoIHN1YnNlcXVlbnQgaW5zdGFuY2UuCiAKIDMuNCBDb25maWd1cmluZyBCb25kaW5nIE1hbnVhbGx5IHZpYSBTeXNmcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQKaW5kZXggMzg3NDgyZS4uNDUwNGNjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kY2NwLnR4dApAQCAtNTcsNiArNTcsMTYgQEAKIAljb3ZlcmFnZSB2YWx1ZSBhcmUgYWxzbyBhY2NlcHRhYmxlLiBUaGUgaGlnaGVyIHRoZSBudW1iZXIsIHRoZSBtb3JlCiAJcmVzdHJpY3RpdmUgdGhpcyBzZXR0aW5nIChzZWUgW1JGQyA0MzQwLCBzZWMuIDkuMi4xXSkuCiAKK1RoZSBmb2xsb3dpbmcgdHdvIG9wdGlvbnMgYXBwbHkgdG8gQ0NJRCAzIGV4Y2x1c2l2ZWx5IGFuZCBhcmUgZ2V0c29ja29wdCgpLW9ubHkuCitJbiBlaXRoZXIgY2FzZSwgYSBURlJDIGluZm8gc3RydWN0IChkZWZpbmVkIGluIDxsaW51eC90ZnJjLmg+KSBpcyByZXR1cm5lZC4KK0RDQ1BfU09DS09QVF9DQ0lEX1JYX0lORk8KKwlSZXR1cm5zIGEgYHN0cnVjdCB0ZnJjX3J4X2luZm8nIGluIG9wdHZhbDsgdGhlIGJ1ZmZlciBmb3Igb3B0dmFsIGFuZAorCW9wdGxlbiBtdXN0IGJlIHNldCB0byBhdCBsZWFzdCBzaXplb2Yoc3RydWN0IHRmcmNfcnhfaW5mbykuCitEQ0NQX1NPQ0tPUFRfQ0NJRF9UWF9JTkZPCisJUmV0dXJucyBhIGBzdHJ1Y3QgdGZyY190eF9pbmZvJyBpbiBvcHR2YWw7IHRoZSBidWZmZXIgZm9yIG9wdHZhbCBhbmQKKwlvcHRsZW4gbXVzdCBiZSBzZXQgdG8gYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCB0ZnJjX3R4X2luZm8pLgorCisKIFN5c2N0bCB2YXJpYWJsZXMKID09PT09PT09PT09PT09PT0KIFNldmVyYWwgRENDUCBkZWZhdWx0IHBhcmFtZXRlcnMgY2FuIGJlIG1hbmFnZWQgYnkgdGhlIGZvbGxvd2luZyBzeXNjdGxzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IDcwMmQxZDguLmFmNmE2M2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC0xNzksMTEgKzE3OSwzMSBAQAogCWJlY2F1c2UgdGhleSBlYXQgbWF4aW11bSAxLjVLIG9mIG1lbW9yeSwgYnV0IHRoZXkgdGVuZAogCXRvIGxpdmUgbG9uZ2VyLglDZi4gdGNwX21heF9vcnBoYW5zLgogCi10Y3BfZnJ0byAtIEJPT0xFQU4KK3RjcF9mcnRvIC0gSU5URUdFUgogCUVuYWJsZXMgRi1SVE8sIGFuIGVuaGFuY2VkIHJlY292ZXJ5IGFsZ29yaXRobSBmb3IgVENQIHJldHJhbnNtaXNzaW9uCiAJdGltZW91dHMuICBJdCBpcyBwYXJ0aWN1bGFybHkgYmVuZWZpY2lhbCBpbiB3aXJlbGVzcyBlbnZpcm9ubWVudHMKIAl3aGVyZSBwYWNrZXQgbG9zcyBpcyB0eXBpY2FsbHkgZHVlIHRvIHJhbmRvbSByYWRpbyBpbnRlcmZlcmVuY2UKLQlyYXRoZXIgdGhhbiBpbnRlcm1lZGlhdGUgcm91dGVyIGNvbmdlc3Rpb24uCisJcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlIHJvdXRlciBjb25nZXN0aW9uLiBJZiBzZXQgdG8gMSwgYmFzaWMKKwl2ZXJzaW9uIGlzIGVuYWJsZWQuIDIgZW5hYmxlcyBTQUNLIGVuaGFuY2VkIEYtUlRPLCB3aGljaCBpcworCUVYUEVSSU1FTlRBTC4gVGhlIGJhc2ljIHZlcnNpb24gY2FuIGJlIHVzZWQgYWxzbyB3aGVuIFNBQ0sgaXMKKwllbmFibGVkIGZvciBhIGZsb3cgdGhyb3VnaCB0Y3Bfc2FjayBzeXNjdGwuCisKK3RjcF9mcnRvX3Jlc3BvbnNlIC0gSU5URUdFUgorCVdoZW4gRi1SVE8gaGFzIGRldGVjdGVkIHRoYXQgYSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCB3YXMKKwlzcHVyaW91cyAoaS5lLCB0aGUgdGltZW91dCB3b3VsZCBoYXZlIGJlZW4gYXZvaWRlZCBoYWQgVENQIHNldCBhCisJbG9uZ2VyIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQpLCBUQ1AgaGFzIHNldmVyYWwgb3B0aW9ucyB3aGF0IHRvIGRvCisJbmV4dC4gUG9zc2libGUgdmFsdWVzIGFyZToKKwkJMCBSYXRlIGhhbHZpbmcgYmFzZWQ7IGEgc21vb3RoIGFuZCBjb25zZXJ2YXRpdmUgcmVzcG9uc2UsCisJCSAgcmVzdWx0cyBpbiBoYWx2ZWQgY3duZCBhbmQgc3N0aHJlc2ggYWZ0ZXIgb25lIFJUVAorCQkxIFZlcnkgY29uc2VydmF0aXZlIHJlc3BvbnNlOyBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBldmVuCisJCSAgdGhvdWdoIGJlaW5nIHZhbGlkLCBpdCBpbnRlcmFjdHMgcG9vcmx5IHdpdGggdGhlIHJlc3Qgb2YKKwkJICBMaW51eCBUQ1AsIGhhbHZlcyBjd25kIGFuZCBzc3RocmVzaCBpbW1lZGlhdGVseQorCQkyIEFnZ3Jlc3NpdmUgcmVzcG9uc2U7IHVuZG9lcyBjb25nZXN0aW9uIGNvbnRyb2wgbWVhc3VyZXMKKwkJICB0aGF0IGFyZSBub3cga25vd24gdG8gYmUgdW5uZWNlc3NhcnkgKGlnbm9yaW5nIHRoZQorCQkgIHBvc3NpYmlsaXR5IG9mIGEgbG9zdCByZXRyYW5zbWlzc2lvbiB0aGF0IHdvdWxkIHJlcXVpcmUKKwkJICBUQ1AgdG8gYmUgbW9yZSBjYXV0aW91cyksIGN3bmQgYW5kIHNzdGhyZXNoIGFyZSByZXN0b3JlZAorCQkgIHRvIHRoZSB2YWx1ZXMgcHJpb3IgdGltZW91dAorCURlZmF1bHQ6IDAgKHJhdGUgaGFsdmluZyBiYXNlZCkKIAogdGNwX2tlZXBhbGl2ZV90aW1lIC0gSU5URUdFUgogCUhvdyBvZnRlbiBUQ1Agc2VuZHMgb3V0IGtlZXBhbGl2ZSBtZXNzYWdlcyB3aGVuIGtlZXBhbGl2ZSBpcyBlbmFibGVkLgpAQCAtOTk1LDcgKzEwMTUsMTIgQEAKIAlEZWZhdWx0OiAxCiAKIGJyaWRnZS1uZi1maWx0ZXItdmxhbi10YWdnZWQgLSBCT09MRUFOCi0JMSA6IHBhc3MgYnJpZGdlZCB2bGFuLXRhZ2dlZCBBUlAvSVAgdHJhZmZpYyB0byBhcnB0YWJsZXMvaXB0YWJsZXMuCisJMSA6IHBhc3MgYnJpZGdlZCB2bGFuLXRhZ2dlZCBBUlAvSVAvSVB2NiB0cmFmZmljIHRvIHthcnAsaXAsaXA2fXRhYmxlcy4KKwkwIDogZGlzYWJsZSB0aGlzLgorCURlZmF1bHQ6IDEKKworYnJpZGdlLW5mLWZpbHRlci1wcHBvZS10YWdnZWQgLSBCT09MRUFOCisJMSA6IHBhc3MgYnJpZGdlZCBwcHBvZS10YWdnZWQgSVAvSVB2NiB0cmFmZmljIHRvIHtpcCxpcDZ9dGFibGVzLgogCTAgOiBkaXNhYmxlIHRoaXMuCiAJRGVmYXVsdDogMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUyMzFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dApAQCAtMCwwICsxLDg1OSBAQAorCQkJICAgID09PT09PT09PT09PT09PT09PT09PT0KKwkJCSAgICBSeFJQQyBORVRXT1JLIFBST1RPQ09MCisJCQkgICAgPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgUnhSUEMgcHJvdG9jb2wgZHJpdmVyIHByb3ZpZGVzIGEgcmVsaWFibGUgdHdvLXBoYXNlIHRyYW5zcG9ydCBvbiB0b3Agb2YgVURQCit0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gUnhSUEMgcmVtb3RlIG9wZXJhdGlvbnMuICBUaGlzIGlzIGRvbmUgb3ZlciBzb2NrZXRzCitvZiBBRl9SWFJQQyBmYW1pbHksIHVzaW5nIHNlbmRtc2coKSBhbmQgcmVjdm1zZygpIHdpdGggY29udHJvbCBkYXRhIHRvIHNlbmQgYW5kCityZWNlaXZlIGRhdGEsIGFib3J0cyBhbmQgZXJyb3JzLgorCitDb250ZW50cyBvZiB0aGlzIGRvY3VtZW50OgorCisgKCopIE92ZXJ2aWV3LgorCisgKCopIFJ4UlBDIHByb3RvY29sIHN1bW1hcnkuCisKKyAoKikgQUZfUlhSUEMgZHJpdmVyIG1vZGVsLgorCisgKCopIENvbnRyb2wgbWVzc2FnZXMuCisKKyAoKikgU29ja2V0IG9wdGlvbnMuCisKKyAoKikgU2VjdXJpdHkuCisKKyAoKikgRXhhbXBsZSBjbGllbnQgdXNhZ2UuCisKKyAoKikgRXhhbXBsZSBzZXJ2ZXIgdXNhZ2UuCisKKyAoKikgQUZfUlhSUEMga2VybmVsIGludGVyZmFjZS4KKworCis9PT09PT09PQorT1ZFUlZJRVcKKz09PT09PT09CisKK1J4UlBDIGlzIGEgdHdvLWxheWVyIHByb3RvY29sLiAgVGhlcmUgaXMgYSBzZXNzaW9uIGxheWVyIHdoaWNoIHByb3ZpZGVzCityZWxpYWJsZSB2aXJ0dWFsIGNvbm5lY3Rpb25zIHVzaW5nIFVEUCBvdmVyIElQdjQgKG9yIElQdjYpIGFzIHRoZSB0cmFuc3BvcnQKK2xheWVyLCBidXQgaW1wbGVtZW50cyBhIHJlYWwgbmV0d29yayBwcm90b2NvbDsgYW5kIHRoZXJlJ3MgdGhlIHByZXNlbnRhdGlvbgorbGF5ZXIgd2hpY2ggcmVuZGVycyBzdHJ1Y3R1cmVkIGRhdGEgdG8gYmluYXJ5IGJsb2JzIGFuZCBiYWNrIGFnYWluIHVzaW5nIFhEUgorKGFzIGRvZXMgU3VuUlBDKToKKworCQkrLS0tLS0tLS0tLS0tLSsKKwkJfCBBcHBsaWNhdGlvbiB8CisJCSstLS0tLS0tLS0tLS0tKworCQl8ICAgICBYRFIgICAgIHwJCVByZXNlbnRhdGlvbgorCQkrLS0tLS0tLS0tLS0tLSsKKwkJfCAgICBSeFJQQyAgICB8CQlTZXNzaW9uCisJCSstLS0tLS0tLS0tLS0tKworCQl8ICAgICBVRFAgICAgIHwJCVRyYW5zcG9ydAorCQkrLS0tLS0tLS0tLS0tLSsKKworCitBRl9SWFJQQyBwcm92aWRlczoKKworICgxKSBQYXJ0IG9mIGFuIFJ4UlBDIGZhY2lsaXR5IGZvciBib3RoIGtlcm5lbCBhbmQgdXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBieQorICAgICBtYWtpbmcgdGhlIHNlc3Npb24gcGFydCBvZiBpdCBhIExpbnV4IG5ldHdvcmsgcHJvdG9jb2wgKEFGX1JYUlBDKS4KKworICgyKSBBIHR3by1waGFzZSBwcm90b2NvbC4gIFRoZSBjbGllbnQgdHJhbnNtaXRzIGEgYmxvYiAodGhlIHJlcXVlc3QpIGFuZCB0aGVuCisgICAgIHJlY2VpdmVzIGEgYmxvYiAodGhlIHJlcGx5KSwgYW5kIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgdGhlIHJlcXVlc3QgYW5kIHRoZW4KKyAgICAgdHJhbnNtaXRzIHRoZSByZXBseS4KKworICgzKSBSZXRlbnRpb24gb2YgdGhlIHJldXNhYmxlIGJpdHMgb2YgdGhlIHRyYW5zcG9ydCBzeXN0ZW0gc2V0IHVwIGZvciBvbmUgY2FsbAorICAgICB0byBzcGVlZCB1cCBzdWJzZXF1ZW50IGNhbGxzLgorCisgKDQpIEEgc2VjdXJlIHByb3RvY29sLCB1c2luZyB0aGUgTGludXgga2VybmVsJ3Mga2V5IHJldGVudGlvbiBmYWNpbGl0eSB0bworICAgICBtYW5hZ2Ugc2VjdXJpdHkgb24gdGhlIGNsaWVudCBlbmQuICBUaGUgc2VydmVyIGVuZCBtdXN0IG9mIG5lY2Vzc2l0eSBiZQorICAgICBtb3JlIGFjdGl2ZSBpbiBzZWN1cml0eSBuZWdvdGlhdGlvbnMuCisKK0FGX1JYUlBDIGRvZXMgbm90IHByb3ZpZGUgWERSIG1hcnNoYWxsaW5nL3ByZXNlbnRhdGlvbiBmYWNpbGl0aWVzLiAgVGhhdCBpcworbGVmdCB0byB0aGUgYXBwbGljYXRpb24uICBBRl9SWFJQQyBvbmx5IGRlYWxzIGluIGJsb2JzLiAgRXZlbiB0aGUgb3BlcmF0aW9uIElECitpcyBqdXN0IHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGJsb2IsIGFuZCBhcyBzdWNoIGlzIGJleW9uZCB0aGUKK2tlcm5lbCdzIGludGVyZXN0LgorCisKK1NvY2tldHMgb2YgQUZfUlhSUEMgZmFtaWx5IGFyZToKKworICgxKSBjcmVhdGVkIGFzIHR5cGUgU09DS19ER1JBTTsKKworICgyKSBwcm92aWRlZCB3aXRoIGEgcHJvdG9jb2wgb2YgdGhlIHR5cGUgb2YgdW5kZXJseWluZyB0cmFuc3BvcnQgdGhleSdyZSBnb2luZworICAgICB0byB1c2UgLSBjdXJyZW50bHkgb25seSBQRl9JTkVUIGlzIHN1cHBvcnRlZC4KKworCitUaGUgQW5kcmV3IEZpbGUgU3lzdGVtIChBRlMpIGlzIGFuIGV4YW1wbGUgb2YgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgYW5kCit0aGF0IGhhcyBib3RoIGtlcm5lbCAoZmlsZXN5c3RlbSkgYW5kIHVzZXJzcGFjZSAodXRpbGl0eSkgY29tcG9uZW50cy4KKworCis9PT09PT09PT09PT09PT09PT09PT09CitSWFJQQyBQUk9UT0NPTCBTVU1NQVJZCis9PT09PT09PT09PT09PT09PT09PT09CisKK0FuIG92ZXJ2aWV3IG9mIHRoZSBSeFJQQyBwcm90b2NvbDoKKworICgqKSBSeFJQQyBzaXRzIG9uIHRvcCBvZiBhbm90aGVyIG5ldHdvcmtpbmcgcHJvdG9jb2wgKFVEUCBpcyB0aGUgb25seSBvcHRpb24KKyAgICAgY3VycmVudGx5KSwgYW5kIHVzZXMgdGhpcyB0byBwcm92aWRlIG5ldHdvcmsgdHJhbnNwb3J0LiAgVURQIHBvcnRzLCBmb3IKKyAgICAgZXhhbXBsZSwgcHJvdmlkZSB0cmFuc3BvcnQgZW5kcG9pbnRzLgorCisgKCopIFJ4UlBDIHN1cHBvcnRzIG11bHRpcGxlIHZpcnR1YWwgImNvbm5lY3Rpb25zIiBmcm9tIGFueSBnaXZlbiB0cmFuc3BvcnQKKyAgICAgZW5kcG9pbnQsIHRodXMgYWxsb3dpbmcgdGhlIGVuZHBvaW50cyB0byBiZSBzaGFyZWQsIGV2ZW4gdG8gdGhlIHNhbWUKKyAgICAgcmVtb3RlIGVuZHBvaW50LgorCisgKCopIEVhY2ggY29ubmVjdGlvbiBnb2VzIHRvIGEgcGFydGljdWxhciAic2VydmljZSIuICBBIGNvbm5lY3Rpb24gbWF5IG5vdCBnbworICAgICB0byBtdWx0aXBsZSBzZXJ2aWNlcy4gIEEgc2VydmljZSBtYXkgYmUgY29uc2lkZXJlZCB0aGUgUnhSUEMgZXF1aXZhbGVudCBvZgorICAgICBhIHBvcnQgbnVtYmVyLiAgQUZfUlhSUEMgcGVybWl0cyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBzaGFyZSBhbiBlbmRwb2ludC4KKworICgqKSBDbGllbnQtb3JpZ2luYXRpbmcgcGFja2V0cyBhcmUgbWFya2VkLCB0aHVzIGEgdHJhbnNwb3J0IGVuZHBvaW50IGNhbiBiZQorICAgICBzaGFyZWQgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBjb25uZWN0aW9ucyAoY29ubmVjdGlvbnMgaGF2ZSBhCisgICAgIGRpcmVjdGlvbikuCisKKyAoKikgVXAgdG8gYSBiaWxsaW9uIGNvbm5lY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgY29uY3VycmVudGx5IGJldHdlZW4gb25lCisgICAgIGxvY2FsIHRyYW5zcG9ydCBlbmRwb2ludCBhbmQgb25lIHNlcnZpY2Ugb24gb25lIHJlbW90ZSBlbmRwb2ludC4gIEFuIFJ4UlBDCisgICAgIGNvbm5lY3Rpb24gaXMgZGVzY3JpYmVkIGJ5IHNldmVuIG51bWJlcnM6CisKKwlMb2NhbCBhZGRyZXNzCX0KKwlMb2NhbCBwb3J0CX0gVHJhbnNwb3J0IChVRFApIGFkZHJlc3MKKwlSZW1vdGUgYWRkcmVzcwl9CisJUmVtb3RlIHBvcnQJfQorCURpcmVjdGlvbgorCUNvbm5lY3Rpb24gSUQKKwlTZXJ2aWNlIElECisKKyAoKikgRWFjaCBSeFJQQyBvcGVyYXRpb24gaXMgYSAiY2FsbCIuICBBIGNvbm5lY3Rpb24gbWF5IG1ha2UgdXAgdG8gZm91cgorICAgICBiaWxsaW9uIGNhbGxzLCBidXQgb25seSB1cCB0byBmb3VyIGNhbGxzIG1heSBiZSBpbiBwcm9ncmVzcyBvbiBhCisgICAgIGNvbm5lY3Rpb24gYXQgYW55IG9uZSB0aW1lLgorCisgKCopIENhbGxzIGFyZSB0d28tcGhhc2UgYW5kIGFzeW1tZXRyaWM6IHRoZSBjbGllbnQgc2VuZHMgaXRzIHJlcXVlc3QgZGF0YSwKKyAgICAgd2hpY2ggdGhlIHNlcnZpY2UgcmVjZWl2ZXM7IHRoZW4gdGhlIHNlcnZpY2UgdHJhbnNtaXRzIHRoZSByZXBseSBkYXRhCisgICAgIHdoaWNoIHRoZSBjbGllbnQgcmVjZWl2ZXMuCisKKyAoKikgVGhlIGRhdGEgYmxvYnMgYXJlIG9mIGluZGVmaW5pdGUgc2l6ZSwgdGhlIGVuZCBvZiBhIHBoYXNlIGlzIG1hcmtlZCB3aXRoIGEKKyAgICAgZmxhZyBpbiB0aGUgcGFja2V0LiAgVGhlIG51bWJlciBvZiBwYWNrZXRzIG9mIGRhdGEgbWFraW5nIHVwIG9uZSBibG9iIG1heQorICAgICBub3QgZXhjZWVkIDQgYmlsbGlvbiwgaG93ZXZlciwgYXMgdGhpcyB3b3VsZCBjYXVzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvCisgICAgIHdyYXAuCisKKyAoKikgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIHJlcXVlc3QgZGF0YSBhcmUgdGhlIHNlcnZpY2Ugb3BlcmF0aW9uIElELgorCisgKCopIFNlY3VyaXR5IGlzIG5lZ290aWF0ZWQgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4gIFRoZSBjb25uZWN0aW9uIGlzCisgICAgIGluaXRpYXRlZCBieSB0aGUgZmlyc3QgZGF0YSBwYWNrZXQgb24gaXQgYXJyaXZpbmcuICBJZiBzZWN1cml0eSBpcworICAgICByZXF1ZXN0ZWQsIHRoZSBzZXJ2ZXIgdGhlbiBpc3N1ZXMgYSAiY2hhbGxlbmdlIiBhbmQgdGhlbiB0aGUgY2xpZW50CisgICAgIHJlcGxpZXMgd2l0aCBhICJyZXNwb25zZSIuICBJZiB0aGUgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgdGhlIHNlY3VyaXR5IGlzCisgICAgIHNldCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoYXQgY29ubmVjdGlvbiwgYW5kIGFsbCBzdWJzZXF1ZW50IGNhbGxzIG1hZGUKKyAgICAgdXBvbiBpdCB1c2UgdGhhdCBzYW1lIHNlY3VyaXR5LiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIHNlcnZlciBsZXRzIGEKKyAgICAgY29ubmVjdGlvbiBsYXBzZSBiZWZvcmUgdGhlIGNsaWVudCwgdGhlIHNlY3VyaXR5IHdpbGwgYmUgcmVuZWdvdGlhdGVkIGlmCisgICAgIHRoZSBjbGllbnQgdXNlcyB0aGUgY29ubmVjdGlvbiBhZ2Fpbi4KKworICgqKSBDYWxscyB1c2UgQUNLIHBhY2tldHMgdG8gaGFuZGxlIHJlbGlhYmlsaXR5LiAgRGF0YSBwYWNrZXRzIGFyZSBhbHNvCisgICAgIGV4cGxpY2l0bHkgc2VxdWVuY2VkIHBlciBjYWxsLgorCisgKCopIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50OiBoYXJkLUFDS3MgYW5kIHNvZnQtQUNLcy4KKyAgICAgQSBoYXJkLUFDSyBpbmRpY2F0ZXMgdG8gdGhlIGZhciBzaWRlIHRoYXQgYWxsIHRoZSBkYXRhIHJlY2VpdmVkIHRvIGEgcG9pbnQKKyAgICAgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZDsgYSBzb2Z0LUFDSyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBoYXMKKyAgICAgYmVlbiByZWNlaXZlZCBidXQgbWF5IHlldCBiZSBkaXNjYXJkZWQgYW5kIHJlLXJlcXVlc3RlZC4gIFRoZSBzZW5kZXIgbWF5CisgICAgIG5vdCBkaXNjYXJkIGFueSB0cmFuc21pdHRhYmxlIHBhY2tldHMgdW50aWwgdGhleSd2ZSBiZWVuIGhhcmQtQUNLJ2QuCisKKyAoKikgUmVjZXB0aW9uIG9mIGEgcmVwbHkgZGF0YSBwYWNrZXQgaW1wbGljaXRseSBoYXJkLUFDSydzIGFsbCB0aGUgZGF0YQorICAgICBwYWNrZXRzIHRoYXQgbWFrZSB1cCB0aGUgcmVxdWVzdC4KKworICgqKSBBbiBjYWxsIGlzIGNvbXBsZXRlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudCwgdGhlIHJlcGx5IGhhcyBiZWVuCisgICAgIHJlY2VpdmVkIGFuZCB0aGUgZmluYWwgaGFyZC1BQ0sgb24gdGhlIGxhc3QgcGFja2V0IG9mIHRoZSByZXBseSBoYXMKKyAgICAgcmVhY2hlZCB0aGUgc2VydmVyLgorCisgKCopIEFuIGNhbGwgbWF5IGJlIGFib3J0ZWQgYnkgZWl0aGVyIGVuZCBhdCBhbnkgdGltZSB1cCB0byBpdHMgY29tcGxldGlvbi4KKworCis9PT09PT09PT09PT09PT09PT09PT0KK0FGX1JYUlBDIERSSVZFUiBNT0RFTAorPT09PT09PT09PT09PT09PT09PT09CisKK0Fib3V0IHRoZSBBRl9SWFJQQyBkcml2ZXI6CisKKyAoKikgVGhlIEFGX1JYUlBDIHByb3RvY29sIHRyYW5zcGFyZW50bHkgdXNlcyBpbnRlcm5hbCBzb2NrZXRzIG9mIHRoZSB0cmFuc3BvcnQKKyAgICAgcHJvdG9jb2wgdG8gcmVwcmVzZW50IHRyYW5zcG9ydCBlbmRwb2ludHMuCisKKyAoKikgQUZfUlhSUEMgc29ja2V0cyBtYXAgb250byBSeFJQQyBjb25uZWN0aW9uIGJ1bmRsZXMuICBBY3R1YWwgUnhSUEMKKyAgICAgY29ubmVjdGlvbnMgYXJlIGhhbmRsZWQgdHJhbnNwYXJlbnRseS4gIE9uZSBjbGllbnQgc29ja2V0IG1heSBiZSB1c2VkIHRvCisgICAgIG1ha2UgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGNhbGxzIHRvIHRoZSBzYW1lIHNlcnZpY2UuICBPbmUgc2VydmVyIHNvY2tldAorICAgICBtYXkgaGFuZGxlIGNhbGxzIGZyb20gbWFueSBjbGllbnRzLgorCisgKCopIEFkZGl0aW9uYWwgcGFyYWxsZWwgY2xpZW50IGNvbm5lY3Rpb25zIHdpbGwgYmUgaW5pdGlhdGVkIHRvIHN1cHBvcnQgZXh0cmEKKyAgICAgY29uY3VycmVudCBjYWxscywgdXAgdG8gYSB0dW5hYmxlIGxpbWl0LgorCisgKCopIEVhY2ggY29ubmVjdGlvbiBpcyByZXRhaW5lZCBmb3IgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIFt0dW5hYmxlXSBhZnRlcgorICAgICB0aGUgbGFzdCBjYWxsIGN1cnJlbnRseSB1c2luZyBpdCBoYXMgY29tcGxldGVkIGluIGNhc2UgYSBuZXcgY2FsbCBpcyBtYWRlCisgICAgIHRoYXQgY291bGQgcmV1c2UgaXQuCisKKyAoKikgRWFjaCBpbnRlcm5hbCBVRFAgc29ja2V0IGlzIHJldGFpbmVkIFt0dW5hYmxlXSBmb3IgYSBjZXJ0YWluIGFtb3VudCBvZgorICAgICB0aW1lIFt0dW5hYmxlXSBhZnRlciB0aGUgbGFzdCBjb25uZWN0aW9uIHVzaW5nIGl0IGRpc2NhcmRlZCwgaW4gY2FzZSBhIG5ldworICAgICBjb25uZWN0aW9uIGlzIG1hZGUgdGhhdCBjb3VsZCB1c2UgaXQuCisKKyAoKikgQSBjbGllbnQtc2lkZSBjb25uZWN0aW9uIGlzIG9ubHkgc2hhcmVkIGJldHdlZW4gY2FsbHMgaWYgdGhleSBoYXZlIGhhdmUKKyAgICAgdGhlIHNhbWUga2V5IHN0cnVjdCBkZXNjcmliaW5nIHRoZWlyIHNlY3VyaXR5IChhbmQgYXNzdW1pbmcgdGhlIGNhbGxzCisgICAgIHdvdWxkIG90aGVyd2lzZSBzaGFyZSB0aGUgY29ubmVjdGlvbikuICBOb24tc2VjdXJlZCBjYWxscyB3b3VsZCBhbHNvIGJlCisgICAgIGFibGUgdG8gc2hhcmUgY29ubmVjdGlvbnMgd2l0aCBlYWNoIG90aGVyLgorCisgKCopIEEgc2VydmVyLXNpZGUgY29ubmVjdGlvbiBpcyBzaGFyZWQgaWYgdGhlIGNsaWVudCBzYXlzIGl0IGlzLgorCisgKCopIEFDSydpbmcgaXMgaGFuZGxlZCBieSB0aGUgcHJvdG9jb2wgZHJpdmVyIGF1dG9tYXRpY2FsbHksIGluY2x1ZGluZyBwaW5nCisgICAgIHJlcGx5aW5nLgorCisgKCopIFNPX0tFRVBBTElWRSBhdXRvbWF0aWNhbGx5IHBpbmdzIHRoZSBvdGhlciBzaWRlIHRvIGtlZXAgdGhlIGNvbm5lY3Rpb24KKyAgICAgYWxpdmUgW1RPRE9dLgorCisgKCopIElmIGFuIElDTVAgZXJyb3IgaXMgcmVjZWl2ZWQsIGFsbCBjYWxscyBhZmZlY3RlZCBieSB0aGF0IGVycm9yIHdpbGwgYmUKKyAgICAgYWJvcnRlZCB3aXRoIGFuIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgcGFzc2VkIHRocm91Z2ggcmVjdm1zZygpLgorCisKK0ludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIgb2YgdGhlIFJ4UlBDIHNvY2tldDoKKworICgqKSBBIHNvY2tldCBpcyBtYWRlIGludG8gYSBzZXJ2ZXIgc29ja2V0IGJ5IGJpbmRpbmcgYW4gYWRkcmVzcyB3aXRoIGEKKyAgICAgbm9uLXplcm8gc2VydmljZSBJRC4KKworICgqKSBJbiB0aGUgY2xpZW50LCBzZW5kaW5nIGEgcmVxdWVzdCBpcyBhY2hpZXZlZCB3aXRoIG9uZSBvciBtb3JlIHNlbmRtc2dzLAorICAgICBmb2xsb3dlZCBieSB0aGUgcmVwbHkgYmVpbmcgcmVjZWl2ZWQgd2l0aCBvbmUgb3IgbW9yZSByZWN2bXNncy4KKworICgqKSBUaGUgZmlyc3Qgc2VuZG1zZyBmb3IgYSByZXF1ZXN0IHRvIGJlIHNlbnQgZnJvbSBhIGNsaWVudCBjb250YWlucyBhIHRhZyB0bworICAgICBiZSB1c2VkIGluIGFsbCBvdGhlciBzZW5kbXNncyBvciByZWN2bXNncyBhc3NvY2lhdGVkIHdpdGggdGhhdCBjYWxsLiAgVGhlCisgICAgIHRhZyBpcyBjYXJyaWVkIGluIHRoZSBjb250cm9sIGRhdGEuCisKKyAoKikgY29ubmVjdCgpIGlzIHVzZWQgdG8gc3VwcGx5IGEgZGVmYXVsdCBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBhIGNsaWVudAorICAgICBzb2NrZXQuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHN1cHBseWluZyBhbiBhbHRlcm5hdGUgYWRkcmVzcyB0byB0aGUKKyAgICAgZmlyc3Qgc2VuZG1zZygpIG9mIGEgY2FsbCAoc3RydWN0IG1zZ2hkcjo6bXNnX25hbWUpLgorCisgKCopIElmIGNvbm5lY3QoKSBpcyBjYWxsZWQgb24gYW4gdW5ib3VuZCBjbGllbnQsIGEgcmFuZG9tIGxvY2FsIHBvcnQgd2lsbAorICAgICBib3VuZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4KKworICgqKSBBIHNlcnZlciBzb2NrZXQgbWF5IGFsc28gYmUgdXNlZCB0byBtYWtlIGNsaWVudCBjYWxscy4gIFRvIGRvIHRoaXMsIHRoZQorICAgICBmaXJzdCBzZW5kbXNnKCkgb2YgdGhlIGNhbGwgbXVzdCBzcGVjaWZ5IHRoZSB0YXJnZXQgYWRkcmVzcy4gIFRoZSBzZXJ2ZXIncworICAgICB0cmFuc3BvcnQgZW5kcG9pbnQgaXMgdXNlZCB0byBzZW5kIHRoZSBwYWNrZXRzLgorCisgKCopIE9uY2UgdGhlIGFwcGxpY2F0aW9uIGhhcyByZWNlaXZlZCB0aGUgbGFzdCBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBhIGNhbGwsCisgICAgIHRoZSB0YWcgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgc2VlbiBhZ2FpbiwgYW5kIHNvIGl0IGNhbiBiZSB1c2VkIHRvIHBpbgorICAgICBjbGllbnQgcmVzb3VyY2VzLiAgQSBuZXcgY2FsbCBjYW4gdGhlbiBiZSBpbml0aWF0ZWQgd2l0aCB0aGUgc2FtZSB0YWcKKyAgICAgd2l0aG91dCBmZWFyIG9mIGludGVyZmVyZW5jZS4KKworICgqKSBJbiB0aGUgc2VydmVyLCBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQgd2l0aCBvbmUgb3IgbW9yZSByZWN2bXNncywgdGhlbiB0aGUKKyAgICAgdGhlIHJlcGx5IGlzIHRyYW5zbWl0dGVkIHdpdGggb25lIG9yIG1vcmUgc2VuZG1zZ3MsIGFuZCB0aGVuIHRoZSBmaW5hbCBBQ0sKKyAgICAgaXMgcmVjZWl2ZWQgd2l0aCBhIGxhc3QgcmVjdm1zZy4KKworICgqKSBXaGVuIHNlbmRpbmcgZGF0YSBmb3IgYSBjYWxsLCBzZW5kbXNnIGlzIGdpdmVuIE1TR19NT1JFIGlmIHRoZXJlJ3MgbW9yZQorICAgICBkYXRhIHRvIGNvbWUgb24gdGhhdCBjYWxsLgorCisgKCopIFdoZW4gcmVjZWl2aW5nIGRhdGEgZm9yIGEgY2FsbCwgcmVjdm1zZyBmbGFncyBNU0dfTU9SRSBpZiB0aGVyZSdzIG1vcmUKKyAgICAgZGF0YSB0byBjb21lIGZvciB0aGF0IGNhbGwuCisKKyAoKikgV2hlbiByZWNlaXZpbmcgZGF0YSBvciBtZXNzYWdlcyBmb3IgYSBjYWxsLCBNU0dfRU9SIGlzIGZsYWdnZWQgYnkgcmVjdm1zZworICAgICB0byBpbmRpY2F0ZSB0aGUgdGVybWluYWwgbWVzc2FnZSBmb3IgdGhhdCBjYWxsLgorCisgKCopIEEgY2FsbCBtYXkgYmUgYWJvcnRlZCBieSBhZGRpbmcgYW4gYWJvcnQgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBjb250cm9sCisgICAgIGRhdGEuICBJc3N1aW5nIGFuIGFib3J0IHRlcm1pbmF0ZXMgdGhlIGtlcm5lbCdzIHVzZSBvZiB0aGF0IGNhbGwncyB0YWcuCisgICAgIEFueSBtZXNzYWdlcyB3YWl0aW5nIGluIHRoZSByZWNlaXZlIHF1ZXVlIGZvciB0aGF0IGNhbGwgd2lsbCBiZSBkaXNjYXJkZWQuCisKKyAoKikgQWJvcnRzLCBidXN5IG5vdGlmaWNhdGlvbnMgYW5kIGNoYWxsZW5nZSBwYWNrZXRzIGFyZSBkZWxpdmVyZWQgYnkgcmVjdm1zZywKKyAgICAgYW5kIGNvbnRyb2wgZGF0YSBtZXNzYWdlcyB3aWxsIGJlIHNldCB0byBpbmRpY2F0ZSB0aGUgY29udGV4dC4gIFJlY2VpdmluZworICAgICBhbiBhYm9ydCBvciBhIGJ1c3kgbWVzc2FnZSB0ZXJtaW5hdGVzIHRoZSBrZXJuZWwncyB1c2Ugb2YgdGhhdCBjYWxsJ3MgdGFnLgorCisgKCopIFRoZSBjb250cm9sIGRhdGEgcGFydCBvZiB0aGUgbXNnaGRyIHN0cnVjdCBpcyB1c2VkIGZvciBhIG51bWJlciBvZiB0aGluZ3M6CisKKyAgICAgKCopIFRoZSB0YWcgb2YgdGhlIGludGVuZGVkIG9yIGFmZmVjdGVkIGNhbGwuCisKKyAgICAgKCopIFNlbmRpbmcgb3IgcmVjZWl2aW5nIGVycm9ycywgYWJvcnRzIGFuZCBidXN5IG5vdGlmaWNhdGlvbnMuCisKKyAgICAgKCopIE5vdGlmaWNhdGlvbnMgb2YgaW5jb21pbmcgY2FsbHMuCisKKyAgICAgKCopIFNlbmRpbmcgZGVidWcgcmVxdWVzdHMgYW5kIHJlY2VpdmluZyBkZWJ1ZyByZXBsaWVzIFtUT0RPXS4KKworICgqKSBXaGVuIHRoZSBrZXJuZWwgaGFzIHJlY2VpdmVkIGFuZCBzZXQgdXAgYW4gaW5jb21pbmcgY2FsbCwgaXQgc2VuZHMgYQorICAgICBtZXNzYWdlIHRvIHNlcnZlciBhcHBsaWNhdGlvbiB0byBsZXQgaXQga25vdyB0aGVyZSdzIGEgbmV3IGNhbGwgYXdhaXRpbmcKKyAgICAgaXRzIGFjY2VwdGFuY2UgW3JlY3Ztc2cgcmVwb3J0cyBhIHNwZWNpYWwgY29udHJvbCBtZXNzYWdlXS4gIFRoZSBzZXJ2ZXIKKyAgICAgYXBwbGljYXRpb24gdGhlbiB1c2VzIHNlbmRtc2cgdG8gYXNzaWduIGEgdGFnIHRvIHRoZSBuZXcgY2FsbC4gIE9uY2UgdGhhdAorICAgICBpcyBkb25lLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcmVxdWVzdCBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHJlY3Ztc2cuCisKKyAoKikgVGhlIHNlcnZlciBhcHBsaWNhdGlvbiBoYXMgdG8gcHJvdmlkZSB0aGUgc2VydmVyIHNvY2tldCB3aXRoIGEga2V5cmluZyBvZgorICAgICBzZWNyZXQga2V5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN1cml0eSB0eXBlcyBpdCBwZXJtaXRzLiAgV2hlbiBhIHNlY3VyZQorICAgICBjb25uZWN0aW9uIGlzIGJlaW5nIHNldCB1cCwgdGhlIGtlcm5lbCBsb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgc2VjcmV0IGtleQorICAgICBpbiB0aGUga2V5cmluZyBhbmQgdGhlbiBzZW5kcyBhIGNoYWxsZW5nZSBwYWNrZXQgdG8gdGhlIGNsaWVudCBhbmQKKyAgICAgcmVjZWl2ZXMgYSByZXNwb25zZSBwYWNrZXQuICBUaGUga2VybmVsIHRoZW4gY2hlY2tzIHRoZSBhdXRob3Jpc2F0aW9uIG9mCisgICAgIHRoZSBwYWNrZXQgYW5kIGVpdGhlciBhYm9ydHMgdGhlIGNvbm5lY3Rpb24gb3Igc2V0cyB1cCB0aGUgc2VjdXJpdHkuCisKKyAoKikgVGhlIG5hbWUgb2YgdGhlIGtleSBhIGNsaWVudCB3aWxsIHVzZSB0byBzZWN1cmUgaXRzIGNvbW11bmljYXRpb25zIGlzCisgICAgIG5vbWluYXRlZCBieSBhIHNvY2tldCBvcHRpb24uCisKKworTm90ZXMgb24gcmVjdm1zZzoKKworICgqKSBJZiB0aGVyZSdzIGEgc2VxdWVuY2Ugb2YgZGF0YSBtZXNzYWdlcyBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyIGNhbGwgb24KKyAgICAgdGhlIHJlY2VpdmUgcXVldWUsIHRoZW4gcmVjdm1zZyB3aWxsIGtlZXAgd29ya2luZyB0aHJvdWdoIHRoZW0gdW50aWw6CisKKyAgICAgKGEpIGl0IG1lZXRzIHRoZSBlbmQgb2YgdGhhdCBjYWxsJ3MgcmVjZWl2ZWQgZGF0YSwKKworICAgICAoYikgaXQgbWVldHMgYSBub24tZGF0YSBtZXNzYWdlLAorCisgICAgIChjKSBpdCBtZWV0cyBhIG1lc3NhZ2UgYmVsb25naW5nIHRvIGEgZGlmZmVyZW50IGNhbGwsIG9yCisKKyAgICAgKGQpIGl0IGZpbGxzIHRoZSB1c2VyIGJ1ZmZlci4KKworICAgICBJZiByZWN2bXNnIGlzIGNhbGxlZCBpbiBibG9ja2luZyBtb2RlLCBpdCB3aWxsIGtlZXAgc2xlZXBpbmcsIGF3YWl0aW5nIHRoZQorICAgICByZWNlcHRpb24gb2YgZnVydGhlciBkYXRhLCB1bnRpbCBvbmUgb2YgdGhlIGFib3ZlIGZvdXIgY29uZGl0aW9ucyBpcyBtZXQuCisKKyAoMikgTVNHX1BFRUsgb3BlcmF0ZXMgc2ltaWxhcmx5LCBidXQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgaXQgaGFzIHB1dCBhbnkKKyAgICAgZGF0YSBpbiB0aGUgYnVmZmVyIHJhdGhlciB0aGFuIHNsZWVwaW5nIHVudGlsIGl0IGNhbiBmaWxsIHRoZSBidWZmZXIuCisKKyAoMykgSWYgYSBkYXRhIG1lc3NhZ2UgaXMgb25seSBwYXJ0aWFsbHkgY29uc3VtZWQgaW4gZmlsbGluZyBhIHVzZXIgYnVmZmVyLAorICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhhdCBtZXNzYWdlIHdpbGwgYmUgbGVmdCBvbiB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlCisgICAgIGZvciB0aGUgbmV4dCB0YWtlci4gIE1TR19UUlVOQyB3aWxsIG5ldmVyIGJlIGZsYWdnZWQuCisKKyAoNCkgSWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGJlIGhhZCBvbiBhIGNhbGwgKGl0IGhhc24ndCBjb3BpZWQgdGhlIGxhc3QgYnl0ZQorICAgICBvZiB0aGUgbGFzdCBkYXRhIG1lc3NhZ2UgaW4gdGhhdCBwaGFzZSB5ZXQpLCB0aGVuIE1TR19NT1JFIHdpbGwgYmUKKyAgICAgZmxhZ2dlZC4KKworCis9PT09PT09PT09PT09PT09CitDT05UUk9MIE1FU1NBR0VTCis9PT09PT09PT09PT09PT09CisKK0FGX1JYUlBDIG1ha2VzIHVzZSBvZiBjb250cm9sIG1lc3NhZ2VzIGluIHNlbmRtc2coKSBhbmQgcmVjdm1zZygpIHRvIG11bHRpcGxleAorY2FsbHMsIHRvIGludm9rZSBjZXJ0YWluIGFjdGlvbnMgYW5kIHRvIHJlcG9ydCBjZXJ0YWluIGNvbmRpdGlvbnMuICBUaGVzZSBhcmU6CisKKwlNRVNTQUdFIElECQlTUlQgREFUQQlNRUFOSU5HCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09ID09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSWFJQQ19VU0VSX0NBTExfSUQJc3ItIFVzZXIgSUQJQXBwJ3MgY2FsbCBzcGVjaWZpZXIKKwlSWFJQQ19BQk9SVAkJc3J0IEFib3J0IGNvZGUJQWJvcnQgY29kZSB0byBpc3N1ZS9yZWNlaXZlZAorCVJYUlBDX0FDSwkJLXJ0IG4vYQkJRmluYWwgQUNLIHJlY2VpdmVkCisJUlhSUENfTkVUX0VSUk9SCQktcnQgZXJyb3IgbnVtCU5ldHdvcmsgZXJyb3Igb24gY2FsbAorCVJYUlBDX0JVU1kJCS1ydCBuL2EJCUNhbGwgcmVqZWN0ZWQgKHNlcnZlciBidXN5KQorCVJYUlBDX0xPQ0FMX0VSUk9SCS1ydCBlcnJvciBudW0JTG9jYWwgZXJyb3IgZW5jb3VudGVyZWQKKwlSWFJQQ19ORVdfQ0FMTAkJLXItIG4vYQkJTmV3IGNhbGwgcmVjZWl2ZWQKKwlSWFJQQ19BQ0NFUFQJCXMtLSBuL2EJCUFjY2VwdCBuZXcgY2FsbAorCisJKFNSVCA9IHVzYWJsZSBpbiBTZW5kbXNnIC8gZGVsaXZlcmVkIGJ5IFJlY3Ztc2cgLyBUZXJtaW5hbCBtZXNzYWdlKQorCisgKCopIFJYUlBDX1VTRVJfQ0FMTF9JRAorCisgICAgIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24ncyBjYWxsIElELiAgSXQncyBhbiB1bnNpZ25lZCBsb25nCisgICAgIHRoYXQgdGhlIGFwcCBzcGVjaWZpZXMgaW4gdGhlIGNsaWVudCBieSBhdHRhY2hpbmcgaXQgdG8gdGhlIGZpcnN0IGRhdGEKKyAgICAgbWVzc2FnZSBvciBpbiB0aGUgc2VydmVyIGJ5IHBhc3NpbmcgaXQgaW4gYXNzb2NpYXRpb24gd2l0aCBhbiBSWFJQQ19BQ0NFUFQKKyAgICAgbWVzc2FnZS4gIHJlY3Ztc2coKSBwYXNzZXMgaXQgaW4gY29uanVuY3Rpb24gd2l0aCBhbGwgbWVzc2FnZXMgZXhjZXB0CisgICAgIHRob3NlIG9mIHRoZSBSWFJQQ19ORVdfQ0FMTCBtZXNzYWdlLgorCisgKCopIFJYUlBDX0FCT1JUCisKKyAgICAgVGhpcyBpcyBjYW4gYmUgdXNlZCBieSBhbiBhcHBsaWNhdGlvbiB0byBhYm9ydCBhIGNhbGwgYnkgcGFzc2luZyBpdCB0bworICAgICBzZW5kbXNnLCBvciBpdCBjYW4gYmUgZGVsaXZlcmVkIGJ5IHJlY3Ztc2cgdG8gaW5kaWNhdGUgYSByZW1vdGUgYWJvcnQgd2FzCisgICAgIHJlY2VpdmVkLiAgRWl0aGVyIHdheSwgaXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYW4gUlhSUENfVVNFUl9DQUxMX0lEIHRvCisgICAgIHNwZWNpZnkgdGhlIGNhbGwgYWZmZWN0ZWQuICBJZiBhbiBhYm9ydCBpcyBiZWluZyBzZW50LCB0aGVuIGVycm9yIEVCQURTTFQKKyAgICAgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBjYWxsIHdpdGggdGhhdCB1c2VyIElELgorCisgKCopIFJYUlBDX0FDSworCisgICAgIFRoaXMgaXMgZGVsaXZlcmVkIHRvIGEgc2VydmVyIGFwcGxpY2F0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpbmFsIEFDSworICAgICBvZiBhIGNhbGwgd2FzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gIEl0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGFuCisgICAgIFJYUlBDX1VTRVJfQ0FMTF9JRCB0byBpbmRpY2F0ZSB0aGUgY2FsbCB0aGF0J3Mgbm93IGNvbXBsZXRlLgorCisgKCopIFJYUlBDX05FVF9FUlJPUgorCisgICAgIFRoaXMgaXMgZGVsaXZlcmVkIHRvIGFuIGFwcGxpY2F0aW9uIHRvIGluZGljYXRlIHRoYXQgYW4gSUNNUCBlcnJvciBtZXNzYWdlCisgICAgIHdhcyBlbmNvdW50ZXJlZCBpbiB0aGUgcHJvY2VzcyBvZiB0cnlpbmcgdG8gdGFsayB0byB0aGUgcGVlci4gIEFuCisgICAgIGVycm5vLWNsYXNzIGludGVnZXIgdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY29udHJvbCBtZXNzYWdlIGRhdGEKKyAgICAgaW5kaWNhdGluZyB0aGUgcHJvYmxlbSwgYW5kIGFuIFJYUlBDX1VTRVJfQ0FMTF9JRCB3aWxsIGluZGljYXRlIHRoZSBjYWxsCisgICAgIGFmZmVjdGVkLgorCisgKCopIFJYUlBDX0JVU1kKKworICAgICBUaGlzIGlzIGRlbGl2ZXJlZCB0byBhIGNsaWVudCBhcHBsaWNhdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGEgY2FsbCB3YXMKKyAgICAgcmVqZWN0ZWQgYnkgdGhlIHNlcnZlciBkdWUgdG8gdGhlIHNlcnZlciBiZWluZyBidXN5LiAgSXQgd2lsbCBiZQorICAgICBhc3NvY2lhdGVkIHdpdGggYW4gUlhSUENfVVNFUl9DQUxMX0lEIHRvIGluZGljYXRlIHRoZSByZWplY3RlZCBjYWxsLgorCisgKCopIFJYUlBDX0xPQ0FMX0VSUk9SCisKKyAgICAgVGhpcyBpcyBkZWxpdmVyZWQgdG8gYW4gYXBwbGljYXRpb24gdG8gaW5kaWNhdGUgdGhhdCBhIGxvY2FsIGVycm9yIHdhcworICAgICBlbmNvdW50ZXJlZCBhbmQgdGhhdCBhIGNhbGwgaGFzIGJlZW4gYWJvcnRlZCBiZWNhdXNlIG9mIGl0LiAgQW4KKyAgICAgZXJybm8tY2xhc3MgaW50ZWdlciB2YWx1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBjb250cm9sIG1lc3NhZ2UgZGF0YQorICAgICBpbmRpY2F0aW5nIHRoZSBwcm9ibGVtLCBhbmQgYW4gUlhSUENfVVNFUl9DQUxMX0lEIHdpbGwgaW5kaWNhdGUgdGhlIGNhbGwKKyAgICAgYWZmZWN0ZWQuCisKKyAoKikgUlhSUENfTkVXX0NBTEwKKworICAgICBUaGlzIGlzIGRlbGl2ZXJlZCB0byBpbmRpY2F0ZSB0byBhIHNlcnZlciBhcHBsaWNhdGlvbiB0aGF0IGEgbmV3IGNhbGwgaGFzCisgICAgIGFycml2ZWQgYW5kIGlzIGF3YWl0aW5nIGFjY2VwdGFuY2UuICBObyB1c2VyIElEIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLAorICAgICBhcyBhIHVzZXIgSUQgbXVzdCBzdWJzZXF1ZW50bHkgYmUgYXNzaWduZWQgYnkgZG9pbmcgYW4gUlhSUENfQUNDRVBULgorCisgKCopIFJYUlBDX0FDQ0VQVAorCisgICAgIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciBhcHBsaWNhdGlvbiB0byBhdHRlbXB0IHRvIGFjY2VwdCBhIGNhbGwgYW5kCisgICAgIGFzc2lnbiBpdCBhIHVzZXIgSUQuICBJdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIFJYUlBDX1VTRVJfQ0FMTF9JRAorICAgICB0byBpbmRpY2F0ZSB0aGUgdXNlciBJRCB0byBiZSBhc3NpZ25lZC4gIElmIHRoZXJlIGlzIG5vIGNhbGwgdG8gYmUKKyAgICAgYWNjZXB0ZWQgKGl0IG1heSBoYXZlIHRpbWVkIG91dCwgYmVlbiBhYm9ydGVkLCBldGMuKSwgdGhlbiBzZW5kbXNnIHdpbGwKKyAgICAgcmV0dXJuIGVycm9yIEVOT0RBVEEuICBJZiB0aGUgdXNlciBJRCBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGNhbGwsCisgICAgIHRoZW4gZXJyb3IgRUJBRFNMVCB3aWxsIGJlIHJldHVybmVkLgorCisKKz09PT09PT09PT09PT09CitTT0NLRVQgT1BUSU9OUworPT09PT09PT09PT09PT0KKworQUZfUlhSUEMgc29ja2V0cyBzdXBwb3J0IGEgZmV3IHNvY2tldCBvcHRpb25zIGF0IHRoZSBTT0xfUlhSUEMgbGV2ZWw6CisKKyAoKikgUlhSUENfU0VDVVJJVFlfS0VZCisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXkgdG8gYmUgdXNlZC4gIFRoZSBrZXkgaXMKKyAgICAgZXh0cmFjdGVkIGZyb20gdGhlIGNhbGxpbmcgcHJvY2VzcydzIGtleXJpbmdzIHdpdGggcmVxdWVzdF9rZXkoKSBhbmQKKyAgICAgc2hvdWxkIGJlIG9mICJyeHJwYyIgdHlwZS4KKworICAgICBUaGUgb3B0dmFsIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcsIGFuZCBvcHRsZW4gaW5kaWNhdGVzCisgICAgIGhvdyBsb25nIHRoZSBzdHJpbmcgaXMsIHdpdGhvdXQgdGhlIE5VTCB0ZXJtaW5hdG9yLgorCisgKCopIFJYUlBDX1NFQ1VSSVRZX0tFWVJJTkcKKworICAgICBTaW1pbGFyIHRvIGFib3ZlIGJ1dCBzcGVjaWZpZXMgYSBrZXlyaW5nIG9mIHNlcnZlciBzZWNyZXQga2V5cyB0byB1c2UgKGtleQorICAgICB0eXBlICJrZXlyaW5nIikuICBTZWUgdGhlICJTZWN1cml0eSIgc2VjdGlvbi4KKworICgqKSBSWFJQQ19FWENMVVNJVkVfQ09OTkVDVElPTgorCisgICAgIFRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgbmV3IGNvbm5lY3Rpb25zIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGNhbGwKKyAgICAgbWFkZSBzdWJzZXF1ZW50bHkgb24gdGhpcyBzb2NrZXQuICBvcHR2YWwgc2hvdWxkIGJlIE5VTEwgYW5kIG9wdGxlbiAwLgorCisgKCopIFJYUlBDX01JTl9TRUNVUklUWV9MRVZFTAorCisgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtaW5pbXVtIHNlY3VyaXR5IGxldmVsIHJlcXVpcmVkIGZvciBjYWxscyBvbgorICAgICB0aGlzIHNvY2tldC4gIG9wdHZhbCBtdXN0IHBvaW50IHRvIGFuIGludCBjb250YWluaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgICAgIHZhbHVlczoKKworICAgICAoYSkgUlhSUENfU0VDVVJJVFlfUExBSU4KKworCSBFbmNyeXB0ZWQgY2hlY2tzdW0gb25seS4KKworICAgICAoYikgUlhSUENfU0VDVVJJVFlfQVVUSAorCisJIEVuY3J5cHRlZCBjaGVja3N1bSBwbHVzIHBhY2tldCBwYWRkZWQgYW5kIGZpcnN0IGVpZ2h0IGJ5dGVzIG9mIHBhY2tldAorCSBlbmNyeXB0ZWQgLSB3aGljaCBpbmNsdWRlcyB0aGUgYWN0dWFsIHBhY2tldCBsZW5ndGguCisKKyAgICAgKGMpIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFRFRAorCisJIEVuY3J5cHRlZCBjaGVja3N1bSBwbHVzIGVudGlyZSBwYWNrZXQgcGFkZGVkIGFuZCBlbmNyeXB0ZWQsIGluY2x1ZGluZworCSBhY3R1YWwgcGFja2V0IGxlbmd0aC4KKworCis9PT09PT09PQorU0VDVVJJVFkKKz09PT09PT09CisKK0N1cnJlbnRseSwgb25seSB0aGUga2VyYmVyb3MgNCBlcXVpdmFsZW50IHByb3RvY29sIGhhcyBiZWVuIGltcGxlbWVudGVkCisoc2VjdXJpdHkgaW5kZXggMiAtIHJ4a2FkKS4gIFRoaXMgcmVxdWlyZXMgdGhlIHJ4a2FkIG1vZHVsZSB0byBiZSBsb2FkZWQgYW5kLAorb24gdGhlIGNsaWVudCwgdGlja2V0cyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSB0byBiZSBvYnRhaW5lZCBmcm9tIHRoZSBBRlMKK2thc2VydmVyIG9yIHRoZSBrZXJiZXJvcyBzZXJ2ZXIgYW5kIGluc3RhbGxlZCBhcyAicnhycGMiIHR5cGUga2V5cy4gIFRoaXMgaXMKK25vcm1hbGx5IGRvbmUgdXNpbmcgdGhlIGtsb2cgcHJvZ3JhbS4gIEFuIGV4YW1wbGUgc2ltcGxlIGtsb2cgcHJvZ3JhbSBjYW4gYmUKK2ZvdW5kIGF0OgorCisJaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35kaG93ZWxscy9yeHJwYy9rbG9nLmMKKworVGhlIHBheWxvYWQgcHJvdmlkZWQgdG8gYWRkX2tleSgpIG9uIHRoZSBjbGllbnQgc2hvdWxkIGJlIG9mIHRoZSBmb2xsb3dpbmcKK2Zvcm06CisKKwlzdHJ1Y3QgcnhycGNfa2V5X3NlYzJfdjEgeworCQl1aW50MTZfdAlzZWN1cml0eV9pbmRleDsJLyogMiAqLworCQl1aW50MTZfdAl0aWNrZXRfbGVuZ3RoOwkvKiBsZW5ndGggb2YgdGlja2V0W10gKi8KKwkJdWludDMyX3QJZXhwaXJ5OwkJLyogdGltZSBhdCB3aGljaCBleHBpcmVzICovCisJCXVpbnQ4X3QJCWt2bm87CQkvKiBrZXkgdmVyc2lvbiBudW1iZXIgKi8KKwkJdWludDhfdAkJX19wYWRbM107CisJCXVpbnQ4X3QJCXNlc3Npb25fa2V5WzhdOwkvKiBERVMgc2Vzc2lvbiBrZXkgKi8KKwkJdWludDhfdAkJdGlja2V0WzBdOwkvKiB0aGUgZW5jcnlwdGVkIHRpY2tldCAqLworCX07CisKK1doZXJlIHRoZSB0aWNrZXQgYmxvYiBpcyBqdXN0IGFwcGVuZGVkIHRvIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCisKKworRm9yIHRoZSBzZXJ2ZXIsIGtleXMgb2YgdHlwZSAicnhycGNfcyIgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgc2VydmVyLgorVGhleSBoYXZlIGEgZGVzY3JpcHRpb24gb2YgIjxzZXJ2aWNlSUQ+OjxzZWN1cml0eUluZGV4PiIgKGVnOiAiNTI6MiIgZm9yIGFuCityeGthZCBrZXkgZm9yIHRoZSBBRlMgVkwgc2VydmljZSkuICBXaGVuIHN1Y2ggYSBrZXkgaXMgY3JlYXRlZCwgaXQgc2hvdWxkIGJlCitnaXZlbiB0aGUgc2VydmVyJ3Mgc2VjcmV0IGtleSBhcyB0aGUgaW5zdGFudGlhdGlvbiBkYXRhIChzZWUgdGhlIGV4YW1wbGUKK2JlbG93KS4KKworCWFkZF9rZXkoInJ4cnBjX3MiLCAiNTI6MiIsIHNlY3JldF9rZXksIDgsIGtleXJpbmcpOworCitBIGtleXJpbmcgaXMgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgc29ja2V0IGJ5IG5hbWluZyBpdCBpbiBhIHNvY2tvcHQuICBUaGUgc2VydmVyCitzb2NrZXQgdGhlbiBsb29rcyB0aGUgc2VydmVyIHNlY3JldCBrZXlzIHVwIGluIHRoaXMga2V5cmluZyB3aGVuIHNlY3VyZQoraW5jb21pbmcgY29ubmVjdGlvbnMgYXJlIG1hZGUuICBUaGlzIGNhbiBiZSBzZWVuIGluIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IGNhbgorYmUgZm91bmQgYXQ6CisKKwlodHRwOi8vcGVvcGxlLnJlZGhhdC5jb20vfmRob3dlbGxzL3J4cnBjL2xpc3Rlbi5jCisKKworPT09PT09PT09PT09PT09PT09PT0KK0VYQU1QTEUgQ0xJRU5UIFVTQUdFCis9PT09PT09PT09PT09PT09PT09PQorCitBIGNsaWVudCB3b3VsZCBpc3N1ZSBhbiBvcGVyYXRpb24gYnk6CisKKyAoMSkgQW4gUnhSUEMgc29ja2V0IGlzIHNldCB1cCBieToKKworCWNsaWVudCA9IHNvY2tldChBRl9SWFJQQywgU09DS19ER1JBTSwgUEZfSU5FVCk7CisKKyAgICAgV2hlcmUgdGhlIHRoaXJkIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHByb3RvY29sIGZhbWlseSBvZiB0aGUgdHJhbnNwb3J0CisgICAgIHNvY2tldCB1c2VkIC0gdXN1YWxseSBJUHY0IGJ1dCBpdCBjYW4gYWxzbyBiZSBJUHY2IFtUT0RPXS4KKworICgyKSBBIGxvY2FsIGFkZHJlc3MgY2FuIG9wdGlvbmFsbHkgYmUgYm91bmQ6CisKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4ID0geworCQkuc3J4X2ZhbWlseQk9IEFGX1JYUlBDLAorCQkuc3J4X3NlcnZpY2UJPSAwLCAgLyogd2UncmUgYSBjbGllbnQgKi8KKwkJLnRyYW5zcG9ydF90eXBlCT0gU09DS19ER1JBTSwJLyogdHlwZSBvZiB0cmFuc3BvcnQgc29ja2V0ICovCisJCS50cmFuc3BvcnQuc2luX2ZhbWlseQk9IEFGX0lORVQsCisJCS50cmFuc3BvcnQuc2luX3BvcnQJPSBodG9ucyg3MDAwKSwgLyogQUZTIGNhbGxiYWNrICovCisJCS50cmFuc3BvcnQuc2luX2FkZHJlc3MJPSAwLCAgLyogYWxsIGxvY2FsIGludGVyZmFjZXMgKi8KKwl9OworCWJpbmQoY2xpZW50LCAmc3J4LCBzaXplb2Yoc3J4KSk7CisKKyAgICAgVGhpcyBzcGVjaWZpZXMgdGhlIGxvY2FsIFVEUCBwb3J0IHRvIGJlIHVzZWQuICBJZiBub3QgZ2l2ZW4sIGEgcmFuZG9tCisgICAgIG5vbi1wcml2aWxlZ2VkIHBvcnQgd2lsbCBiZSB1c2VkLiAgQSBVRFAgcG9ydCBtYXkgYmUgc2hhcmVkIGJldHdlZW4KKyAgICAgc2V2ZXJhbCB1bnJlbGF0ZWQgUnhSUEMgc29ja2V0cy4gIFNlY3VyaXR5IGlzIGhhbmRsZWQgb24gYSBiYXNpcyBvZgorICAgICBwZXItUnhSUEMgdmlydHVhbCBjb25uZWN0aW9uLgorCisgKDMpIFRoZSBzZWN1cml0eSBpcyBzZXQ6CisKKwljb25zdCBjaGFyICprZXkgPSAiQUZTOmNhbWJyaWRnZS5yZWRoYXQuY29tIjsKKwlzZXRzb2Nrb3B0KGNsaWVudCwgU09MX1JYUlBDLCBSWFJQQ19TRUNVUklUWV9LRVksIGtleSwgc3RybGVuKGtleSkpOworCisgICAgIFRoaXMgaXNzdWVzIGEgcmVxdWVzdF9rZXkoKSB0byBnZXQgdGhlIGtleSByZXByZXNlbnRpbmcgdGhlIHNlY3VyaXR5CisgICAgIGNvbnRleHQuICBUaGUgbWluaW11bSBzZWN1cml0eSBsZXZlbCBjYW4gYmUgc2V0OgorCisJdW5zaWduZWQgaW50IHNlYyA9IFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFRFRDsKKwlzZXRzb2Nrb3B0KGNsaWVudCwgU09MX1JYUlBDLCBSWFJQQ19NSU5fU0VDVVJJVFlfTEVWRUwsCisJCSAgICZzZWMsIHNpemVvZihzZWMpKTsKKworICg0KSBUaGUgc2VydmVyIHRvIGJlIGNvbnRhY3RlZCBjYW4gdGhlbiBiZSBzcGVjaWZpZWQgKGFsdGVybmF0aXZlbHkgdGhpcyBjYW4KKyAgICAgYmUgZG9uZSB0aHJvdWdoIHNlbmRtc2cpOgorCisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeCA9IHsKKwkJLnNyeF9mYW1pbHkJPSBBRl9SWFJQQywKKwkJLnNyeF9zZXJ2aWNlCT0gVkxfU0VSVklDRV9JRCwKKwkJLnRyYW5zcG9ydF90eXBlCT0gU09DS19ER1JBTSwJLyogdHlwZSBvZiB0cmFuc3BvcnQgc29ja2V0ICovCisJCS50cmFuc3BvcnQuc2luX2ZhbWlseQk9IEFGX0lORVQsCisJCS50cmFuc3BvcnQuc2luX3BvcnQJPSBodG9ucyg3MDA1KSwgLyogQUZTIHZvbHVtZSBtYW5hZ2VyICovCisJCS50cmFuc3BvcnQuc2luX2FkZHJlc3MJPSAuLi4sCisJfTsKKwljb25uZWN0KGNsaWVudCwgJnNyeCwgc2l6ZW9mKHNyeCkpOworCisgKDUpIFRoZSByZXF1ZXN0IGRhdGEgc2hvdWxkIHRoZW4gYmUgcG9zdGVkIHRvIHRoZSBzZXJ2ZXIgc29ja2V0IHVzaW5nIGEgc2VyaWVzCisgICAgIG9mIHNlbmRtc2coKSBjYWxscywgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgY29udHJvbCBtZXNzYWdlIGF0dGFjaGVkOgorCisJUlhSUENfVVNFUl9DQUxMX0lECS0gc3BlY2lmaWVzIHRoZSB1c2VyIElEIGZvciB0aGlzIGNhbGwKKworICAgICBNU0dfTU9SRSBzaG91bGQgYmUgc2V0IGluIG1zZ2hkcjo6bXNnX2ZsYWdzIG9uIGFsbCBidXQgdGhlIGxhc3QgcGFydCBvZgorICAgICB0aGUgcmVxdWVzdC4gIE11bHRpcGxlIHJlcXVlc3RzIG1heSBiZSBtYWRlIHNpbXVsdGFuZW91c2x5LgorCisgICAgIElmIGEgY2FsbCBpcyBpbnRlbmRlZCB0byBnbyB0byBhIGRlc3RpbmF0aW9uIG90aGVyIHRoZW4gdGhlIGRlZmF1bHQKKyAgICAgc3BlY2lmaWVkIHRocm91Z2ggY29ubmVjdCgpLCB0aGVuIG1zZ2hkcjo6bXNnX25hbWUgc2hvdWxkIGJlIHNldCBvbiB0aGUKKyAgICAgZmlyc3QgcmVxdWVzdCBtZXNzYWdlIG9mIHRoYXQgY2FsbC4KKworICg2KSBUaGUgcmVwbHkgZGF0YSB3aWxsIHRoZW4gYmUgcG9zdGVkIHRvIHRoZSBzZXJ2ZXIgc29ja2V0IGZvciByZWN2bXNnKCkgdG8KKyAgICAgcGljayB1cC4gIE1TR19NT1JFIHdpbGwgYmUgZmxhZ2dlZCBieSByZWN2bXNnKCkgaWYgdGhlcmUncyBtb3JlIHJlcGx5IGRhdGEKKyAgICAgZm9yIGEgcGFydGljdWxhciBjYWxsIHRvIGJlIHJlYWQuICBNU0dfRU9SIHdpbGwgYmUgc2V0IG9uIHRoZSB0ZXJtaW5hbAorICAgICByZWFkIGZvciBhIGNhbGwuCisKKyAgICAgQWxsIGRhdGEgd2lsbCBiZSBkZWxpdmVyZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbWVzc2FnZSBhdHRhY2hlZDoKKworCVJYUlBDX1VTRVJfQ0FMTF9JRAktIHNwZWNpZmllcyB0aGUgdXNlciBJRCBmb3IgdGhpcyBjYWxsCisKKyAgICAgSWYgYW4gYWJvcnQgb3IgZXJyb3Igb2NjdXJyZWQsIHRoaXMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgY29udHJvbCBkYXRhCisgICAgIGJ1ZmZlciBpbnN0ZWFkLCBhbmQgTVNHX0VPUiB3aWxsIGJlIGZsYWdnZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGF0CisgICAgIGNhbGwuCisKKworPT09PT09PT09PT09PT09PT09PT0KK0VYQU1QTEUgU0VSVkVSIFVTQUdFCis9PT09PT09PT09PT09PT09PT09PQorCitBIHNlcnZlciB3b3VsZCBiZSBzZXQgdXAgdG8gYWNjZXB0IG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisKKyAoMSkgQW4gUnhSUEMgc29ja2V0IGlzIGNyZWF0ZWQgYnk6CisKKwlzZXJ2ZXIgPSBzb2NrZXQoQUZfUlhSUEMsIFNPQ0tfREdSQU0sIFBGX0lORVQpOworCisgICAgIFdoZXJlIHRoZSB0aGlyZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBhZGRyZXNzIHR5cGUgb2YgdGhlIHRyYW5zcG9ydAorICAgICBzb2NrZXQgdXNlZCAtIHVzdWFsbHkgSVB2NC4KKworICgyKSBTZWN1cml0eSBpcyBzZXQgdXAgaWYgZGVzaXJlZCBieSBnaXZpbmcgdGhlIHNvY2tldCBhIGtleXJpbmcgd2l0aCBzZXJ2ZXIKKyAgICAgc2VjcmV0IGtleXMgaW4gaXQ6CisKKwlrZXlyaW5nID0gYWRkX2tleSgia2V5cmluZyIsICJBRlNrZXlzIiwgTlVMTCwgMCwKKwkJCSAgS0VZX1NQRUNfUFJPQ0VTU19LRVlSSU5HKTsKKworCWNvbnN0IGNoYXIgc2VjcmV0X2tleVs4XSA9IHsKKwkJMHhhNywgMHg4MywgMHg4YSwgMHhjYiwgMHhjNywgMHg4MywgMHhlYywgMHg5NCB9OworCWFkZF9rZXkoInJ4cnBjX3MiLCAiNTI6MiIsIHNlY3JldF9rZXksIDgsIGtleXJpbmcpOworCisJc2V0c29ja29wdChzZXJ2ZXIsIFNPTF9SWFJQQywgUlhSUENfU0VDVVJJVFlfS0VZUklORywgIkFGU2tleXMiLCA3KTsKKworICAgICBUaGUga2V5cmluZyBjYW4gYmUgbWFuaXB1bGF0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gZ2l2ZW4gdG8gdGhlIHNvY2tldC4gVGhpcworICAgICBwZXJtaXRzIHRoZSBzZXJ2ZXIgdG8gYWRkIG1vcmUga2V5cywgcmVwbGFjZSBrZXlzLCBldGMuIHdoaWxzdCBpdCBpcyBsaXZlLgorCisgKDIpIEEgbG9jYWwgYWRkcmVzcyBtdXN0IHRoZW4gYmUgYm91bmQ6CisKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4ID0geworCQkuc3J4X2ZhbWlseQk9IEFGX1JYUlBDLAorCQkuc3J4X3NlcnZpY2UJPSBWTF9TRVJWSUNFX0lELCAvKiBSeFJQQyBzZXJ2aWNlIElEICovCisJCS50cmFuc3BvcnRfdHlwZQk9IFNPQ0tfREdSQU0sCS8qIHR5cGUgb2YgdHJhbnNwb3J0IHNvY2tldCAqLworCQkudHJhbnNwb3J0LnNpbl9mYW1pbHkJPSBBRl9JTkVULAorCQkudHJhbnNwb3J0LnNpbl9wb3J0CT0gaHRvbnMoNzAwMCksIC8qIEFGUyBjYWxsYmFjayAqLworCQkudHJhbnNwb3J0LnNpbl9hZGRyZXNzCT0gMCwgIC8qIGFsbCBsb2NhbCBpbnRlcmZhY2VzICovCisJfTsKKwliaW5kKHNlcnZlciwgJnNyeCwgc2l6ZW9mKHNyeCkpOworCisgKDMpIFRoZSBzZXJ2ZXIgaXMgdGhlbiBzZXQgdG8gbGlzdGVuIG91dCBmb3IgaW5jb21pbmcgY2FsbHM6CisKKwlsaXN0ZW4oc2VydmVyLCAxMDApOworCisgKDQpIFRoZSBrZXJuZWwgbm90aWZpZXMgdGhlIHNlcnZlciBvZiBwZW5kaW5nIGluY29taW5nIGNvbm5lY3Rpb25zIGJ5IHNlbmRpbmcKKyAgICAgaXQgYSBtZXNzYWdlIGZvciBlYWNoLiAgVGhpcyBpcyByZWNlaXZlZCB3aXRoIHJlY3Ztc2coKSBvbiB0aGUgc2VydmVyCisgICAgIHNvY2tldC4gIEl0IGhhcyBubyBkYXRhLCBhbmQgaGFzIGEgc2luZ2xlIGRhdGFsZXNzIGNvbnRyb2wgbWVzc2FnZQorICAgICBhdHRhY2hlZDoKKworCVJYUlBDX05FV19DQUxMCisKKyAgICAgVGhlIGFkZHJlc3MgdGhhdCBjYW4gYmUgcGFzc2VkIGJhY2sgYnkgcmVjdm1zZygpIGF0IHRoaXMgcG9pbnQgc2hvdWxkIGJlCisgICAgIGlnbm9yZWQgc2luY2UgdGhlIGNhbGwgZm9yIHdoaWNoIHRoZSBtZXNzYWdlIHdhcyBwb3N0ZWQgbWF5IGhhdmUgZ29uZSBieQorICAgICB0aGUgdGltZSBpdCBpcyBhY2NlcHRlZCAtIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGNhbGwgc3RpbGwgb24gdGhlIHF1ZXVlCisgICAgIHdpbGwgYmUgYWNjZXB0ZWQuCisKKyAoNSkgVGhlIHNlcnZlciB0aGVuIGFjY2VwdHMgdGhlIG5ldyBjYWxsIGJ5IGlzc3VpbmcgYSBzZW5kbXNnKCkgd2l0aCB0d28KKyAgICAgcGllY2VzIG9mIGNvbnRyb2wgZGF0YSBhbmQgbm8gYWN0dWFsIGRhdGE6CisKKwlSWFJQQ19BQ0NFUFQJCS0gaW5kaWNhdGUgY29ubmVjdGlvbiBhY2NlcHRhbmNlCisJUlhSUENfVVNFUl9DQUxMX0lECS0gc3BlY2lmeSB1c2VyIElEIGZvciB0aGlzIGNhbGwKKworICg2KSBUaGUgZmlyc3QgcmVxdWVzdCBkYXRhIHBhY2tldCB3aWxsIHRoZW4gYmUgcG9zdGVkIHRvIHRoZSBzZXJ2ZXIgc29ja2V0IGZvcgorICAgICByZWN2bXNnKCkgdG8gcGljayB1cC4gIEF0IHRoYXQgcG9pbnQsIHRoZSBSeFJQQyBhZGRyZXNzIGZvciB0aGUgY2FsbCBjYW4KKyAgICAgYmUgcmVhZCBmcm9tIHRoZSBhZGRyZXNzIGZpZWxkcyBpbiB0aGUgbXNnaGRyIHN0cnVjdC4KKworICAgICBTdWJzZXF1ZW50IHJlcXVlc3QgZGF0YSB3aWxsIGJlIHBvc3RlZCB0byB0aGUgc2VydmVyIHNvY2tldCBmb3IgcmVjdm1zZygpCisgICAgIHRvIGNvbGxlY3QgYXMgaXQgYXJyaXZlcy4gIEFsbCBidXQgdGhlIGxhc3QgcGllY2Ugb2YgdGhlIHJlcXVlc3QgZGF0YSB3aWxsCisgICAgIGJlIGRlbGl2ZXJlZCB3aXRoIE1TR19NT1JFIGZsYWdnZWQuCisKKyAgICAgQWxsIGRhdGEgd2lsbCBiZSBkZWxpdmVyZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbWVzc2FnZSBhdHRhY2hlZDoKKworCVJYUlBDX1VTRVJfQ0FMTF9JRAktIHNwZWNpZmllcyB0aGUgdXNlciBJRCBmb3IgdGhpcyBjYWxsCisKKyAoOCkgVGhlIHJlcGx5IGRhdGEgc2hvdWxkIHRoZW4gYmUgcG9zdGVkIHRvIHRoZSBzZXJ2ZXIgc29ja2V0IHVzaW5nIGEgc2VyaWVzCisgICAgIG9mIHNlbmRtc2coKSBjYWxscywgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgY29udHJvbCBtZXNzYWdlcyBhdHRhY2hlZDoKKworCVJYUlBDX1VTRVJfQ0FMTF9JRAktIHNwZWNpZmllcyB0aGUgdXNlciBJRCBmb3IgdGhpcyBjYWxsCisKKyAgICAgTVNHX01PUkUgc2hvdWxkIGJlIHNldCBpbiBtc2doZHI6Om1zZ19mbGFncyBvbiBhbGwgYnV0IHRoZSBsYXN0IG1lc3NhZ2UKKyAgICAgZm9yIGEgcGFydGljdWxhciBjYWxsLgorCisgKDkpIFRoZSBmaW5hbCBBQ0sgZnJvbSB0aGUgY2xpZW50IHdpbGwgYmUgcG9zdGVkIGZvciByZXRyaWV2YWwgYnkgcmVjdm1zZygpCisgICAgIHdoZW4gaXQgaXMgcmVjZWl2ZWQuICBJdCB3aWxsIHRha2UgdGhlIGZvcm0gb2YgYSBkYXRhbGVzcyBtZXNzYWdlIHdpdGggdHdvCisgICAgIGNvbnRyb2wgbWVzc2FnZXMgYXR0YWNoZWQ6CisKKwlSWFJQQ19VU0VSX0NBTExfSUQJLSBzcGVjaWZpZXMgdGhlIHVzZXIgSUQgZm9yIHRoaXMgY2FsbAorCVJYUlBDX0FDSwkJLSBpbmRpY2F0ZXMgZmluYWwgQUNLIChubyBkYXRhKQorCisgICAgIE1TR19FT1Igd2lsbCBiZSBmbGFnZ2VkIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyB0aGUgZmluYWwgbWVzc2FnZSBmb3IKKyAgICAgdGhpcyBjYWxsLgorCisoMTApIFVwIHRvIHRoZSBwb2ludCB0aGUgZmluYWwgcGFja2V0IG9mIHJlcGx5IGRhdGEgaXMgc2VudCwgdGhlIGNhbGwgY2FuIGJlCisgICAgIGFib3J0ZWQgYnkgY2FsbGluZyBzZW5kbXNnKCkgd2l0aCBhIGRhdGFsZXNzIG1lc3NhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nCisgICAgIGNvbnRyb2wgbWVzc2FnZXMgYXR0YWNoZWQ6CisKKwlSWFJQQ19VU0VSX0NBTExfSUQJLSBzcGVjaWZpZXMgdGhlIHVzZXIgSUQgZm9yIHRoaXMgY2FsbAorCVJYUlBDX0FCT1JUCQktIGluZGljYXRlcyBhYm9ydCBjb2RlICg0IGJ5dGUgZGF0YSkKKworICAgICBBbnkgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBzb2NrZXQncyByZWNlaXZlIHF1ZXVlIHdpbGwgYmUgZGlzY2FyZGVkIGlmCisgICAgIHRoaXMgaXMgaXNzdWVkLgorCitOb3RlIHRoYXQgYWxsIHRoZSBjb21tdW5pY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgdGFrZSBwbGFjZSB0aHJvdWdoCit0aGUgb25lIHNlcnZlciBzb2NrZXQsIHVzaW5nIGNvbnRyb2wgbWVzc2FnZXMgb24gc2VuZG1zZygpIGFuZCByZWN2bXNnKCkgdG8KK2RldGVybWluZSB0aGUgY2FsbCBhZmZlY3RlZC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09CitBRl9SWFJQQyBLRVJORUwgSU5URVJGQUNFCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBRl9SWFJQQyBtb2R1bGUgYWxzbyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIHVzZSBieSBpbi1rZXJuZWwgdXRpbGl0aWVzCitzdWNoIGFzIHRoZSBBRlMgZmlsZXN5c3RlbS4gIFRoaXMgcGVybWl0cyBzdWNoIGEgdXRpbGl0eSB0bzoKKworICgxKSBVc2UgZGlmZmVyZW50IGtleXMgZGlyZWN0bHkgb24gaW5kaXZpZHVhbCBjbGllbnQgY2FsbHMgb24gb25lIHNvY2tldAorICAgICByYXRoZXIgdGhhbiBoYXZpbmcgdG8gb3BlbiBhIHdob2xlIHNsZXcgb2Ygc29ja2V0cywgb25lIGZvciBlYWNoIGtleSBpdAorICAgICBtaWdodCB3YW50IHRvIHVzZS4KKworICgyKSBBdm9pZCBoYXZpbmcgUnhSUEMgY2FsbCByZXF1ZXN0X2tleSgpIGF0IHRoZSBwb2ludCBvZiBpc3N1ZSBvZiBhIGNhbGwgb3IKKyAgICAgb3BlbmluZyBvZiBhIHNvY2tldC4gIEluc3RlYWQgdGhlIHV0aWxpdHkgaXMgcmVzcG9uc2libGUgZm9yIHJlcXVlc3RpbmcgYQorICAgICBrZXkgYXQgdGhlIGFwcHJvcHJpYXRlIHBvaW50LiAgQUZTLCBmb3IgaW5zdGFuY2UsIHdvdWxkIGRvIHRoaXMgZHVyaW5nIFZGUworICAgICBvcGVyYXRpb25zIHN1Y2ggYXMgb3BlbigpIG9yIHVubGluaygpLiAgVGhlIGtleSBpcyB0aGVuIGhhbmRlZCB0aHJvdWdoCisgICAgIHdoZW4gdGhlIGNhbGwgaXMgaW5pdGlhdGVkLgorCisgKDMpIFJlcXVlc3QgdGhlIHVzZSBvZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBHRlBfS0VSTkVMIHRvIGFsbG9jYXRlIG1lbW9yeS4KKworICg0KSBBdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgdGhlIHJlY3Ztc2coKSBjYWxsLiAgUnhSUEMgbWVzc2FnZXMgY2FuIGJlCisgICAgIGludGVyY2VwdGVkIGJlZm9yZSB0aGV5IGdldCBwdXQgaW50byB0aGUgc29ja2V0IFJ4IHF1ZXVlIGFuZCB0aGUgc29ja2V0CisgICAgIGJ1ZmZlcnMgbWFuaXB1bGF0ZWQgZGlyZWN0bHkuCisKK1RvIHVzZSB0aGUgUnhSUEMgZmFjaWxpdHksIGEga2VybmVsIHV0aWxpdHkgbXVzdCBzdGlsbCBvcGVuIGFuIEFGX1JYUlBDIHNvY2tldCwKK2JpbmQgYW4gYWRkZXNzIGFzIGFwcHJvcHJpYXRlIGFuZCBsaXN0ZW4gaWYgaXQncyB0byBiZSBhIHNlcnZlciBzb2NrZXQsIGJ1dAordGhlbiBpdCBwYXNzZXMgdGhpcyB0byB0aGUga2VybmVsIGludGVyZmFjZSBmdW5jdGlvbnMuCisKK1RoZSBrZXJuZWwgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgYXMgZm9sbG93czoKKworICgqKSBCZWdpbiBhIG5ldyBjbGllbnQgY2FsbC4KKworCXN0cnVjdCByeHJwY19jYWxsICoKKwlyeHJwY19rZXJuZWxfYmVnaW5fY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAorCQkJCXN0cnVjdCBrZXkgKmtleSwKKwkJCQl1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwKKwkJCQlnZnBfdCBnZnApOworCisgICAgIFRoaXMgYWxsb2NhdGVzIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBtYWtlIGEgbmV3IFJ4UlBDIGNhbGwgYW5kIGFzc2lnbnMKKyAgICAgY2FsbCBhbmQgY29ubmVjdGlvbiBudW1iZXJzLiAgVGhlIGNhbGwgd2lsbCBiZSBtYWRlIG9uIHRoZSBVRFAgcG9ydCB0aGF0CisgICAgIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8uICBUaGUgY2FsbCB3aWxsIGdvIHRvIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIGEKKyAgICAgY29ubmVjdGVkIGNsaWVudCBzb2NrZXQgdW5sZXNzIGFuIGFsdGVybmF0aXZlIGlzIHN1cHBsaWVkIChzcnggaXMKKyAgICAgbm9uLU5VTEwpLgorCisgICAgIElmIGEga2V5IGlzIHN1cHBsaWVkIHRoZW4gdGhpcyB3aWxsIGJlIHVzZWQgdG8gc2VjdXJlIHRoZSBjYWxsIGluc3RlYWQgb2YKKyAgICAgdGhlIGtleSBib3VuZCB0byB0aGUgc29ja2V0IHdpdGggdGhlIFJYUlBDX1NFQ1VSSVRZX0tFWSBzb2Nrb3B0LiAgQ2FsbHMKKyAgICAgc2VjdXJlZCBpbiB0aGlzIHdheSB3aWxsIHN0aWxsIHNoYXJlIGNvbm5lY3Rpb25zIGlmIGF0IGFsbCBwb3NzaWJsZS4KKworICAgICBUaGUgdXNlcl9jYWxsX0lEIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBzdXBwbGllZCB0byBzZW5kbXNnKCkgaW4gdGhlCisgICAgIGNvbnRyb2wgZGF0YSBidWZmZXIuICBJdCBpcyBlbnRpcmVseSBmZWFzaWJsZSB0byB1c2UgdGhpcyB0byBwb2ludCB0byBhCisgICAgIGtlcm5lbCBkYXRhIHN0cnVjdHVyZS4KKworICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwsIGFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gdGhlIFJ4UlBDIGNhbGwgaXMKKyAgICAgcmV0dXJuZWQuICBUaGUgY2FsbGVyIG5vdyBob2xkcyBhIHJlZmVyZW5jZSBvbiB0aGlzIGFuZCBpdCBtdXN0IGJlCisgICAgIHByb3Blcmx5IGVuZGVkLgorCisgKCopIEVuZCBhIGNsaWVudCBjYWxsLgorCisJdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBlbmQgYSBwcmV2aW91c2x5IGJlZ3VuIGNhbGwuICBUaGUgdXNlcl9jYWxsX0lEIGlzIGV4cHVuZ2VkCisgICAgIGZyb20gQUZfUlhSUEMncyBrbm93bGVkZ2UgYW5kIHdpbGwgbm90IGJlIHNlZW4gYWdhaW4gaW4gYXNzb2NpYXRpb24gd2l0aAorICAgICB0aGUgc3BlY2lmaWVkIGNhbGwuCisKKyAoKikgU2VuZCBkYXRhIHRocm91Z2ggYSBjYWxsLgorCisJaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQkgICBzaXplX3QgbGVuKTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gc3VwcGx5IGVpdGhlciB0aGUgcmVxdWVzdCBwYXJ0IG9mIGEgY2xpZW50IGNhbGwgb3IgdGhlCisgICAgIHJlcGx5IHBhcnQgb2YgYSBzZXJ2ZXIgY2FsbC4gIG1zZy5tc2dfaW92bGVuIGFuZCBtc2cubXNnX2lvdiBzcGVjaWZ5IHRoZQorICAgICBkYXRhIGJ1ZmZlcnMgdG8gYmUgdXNlZC4gIG1zZ19pb3YgbWF5IG5vdCBiZSBOVUxMIGFuZCBtdXN0IHBvaW50CisgICAgIGV4Y2x1c2l2ZWx5IHRvIGluLWtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Nlcy4gIG1zZy5tc2dfZmxhZ3MgbWF5IGJlIGdpdmVuCisgICAgIE1TR19NT1JFIGlmIHRoZXJlIHdpbGwgYmUgc3Vic2VxdWVudCBkYXRhIHNlbmRzIGZvciB0aGlzIGNhbGwuCisKKyAgICAgVGhlIG1zZyBtdXN0IG5vdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24gYWRkcmVzcywgY29udHJvbCBkYXRhIG9yIGFueSBmbGFncworICAgICBvdGhlciB0aGFuIE1TR19NT1JFLiAgbGVuIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSB0byB0cmFuc21pdC4KKworICgqKSBBYm9ydCBhIGNhbGwuCisKKwl2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSk7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGFib3J0IGEgY2FsbCBpZiBpdCdzIHN0aWxsIGluIGFuIGFib3J0YWJsZSBzdGF0ZS4gIFRoZQorICAgICBhYm9ydCBjb2RlIHNwZWNpZmllZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgQUJPUlQgbWVzc2FnZSBzZW50LgorCisgKCopIEludGVyY2VwdCByZWNlaXZlZCBSeFJQQyBtZXNzYWdlcy4KKworCXR5cGVkZWYgdm9pZCAoKnJ4cnBjX2ludGVyY2VwdG9yX3QpKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwl2b2lkCisJcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkgICByeHJwY19pbnRlcmNlcHRvcl90IGludGVyY2VwdG9yKTsKKworICAgICBUaGlzIGluc3RhbGxzIGFuIGludGVyY2VwdG9yIGZ1bmN0aW9uIG9uIHRoZSBzcGVjaWZpZWQgQUZfUlhSUEMgc29ja2V0LgorICAgICBBbGwgbWVzc2FnZXMgdGhhdCB3b3VsZCBvdGhlcndpc2Ugd2luZCB1cCBpbiB0aGUgc29ja2V0J3MgUnggcXVldWUgYXJlCisgICAgIHRoZW4gZGl2ZXJ0ZWQgdG8gdGhpcyBmdW5jdGlvbi4gIE5vdGUgdGhhdCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gcHJvY2VzcworICAgICB0aGUgbWVzc2FnZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIG1haW50YWluIERBVEEgbWVzc2FnZSBzZXF1ZW50aWFsaXR5LgorCisgICAgIFRoZSBpbnRlcmNlcHRvciBmdW5jdGlvbiBpdHNlbGYgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgc29ja2V0CisgICAgIGFuZCBoYW5kbGluZyB0aGUgaW5jb21pbmcgbWVzc2FnZSwgdGhlIElEIGFzc2lnbmVkIGJ5IHRoZSBrZXJuZWwgdXRpbGl0eQorICAgICB0byB0aGUgY2FsbCBhbmQgdGhlIHNvY2tldCBidWZmZXIgY29udGFpbmluZyB0aGUgbWVzc2FnZS4KKworICAgICBUaGUgc2tiLT5tYXJrIGZpZWxkIGluZGljYXRlcyB0aGUgdHlwZSBvZiBtZXNzYWdlOgorCisJTUFSSwkJCQlNRUFOSU5HCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSWFJQQ19TS0JfTUFSS19EQVRBCQlEYXRhIG1lc3NhZ2UKKwlSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0sJRmluYWwgQUNLIHJlY2VpdmVkIGZvciBhbiBpbmNvbWluZyBjYWxsCisJUlhSUENfU0tCX01BUktfQlVTWQkJQ2xpZW50IGNhbGwgcmVqZWN0ZWQgYXMgc2VydmVyIGJ1c3kKKwlSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQJQ2FsbCBhYm9ydGVkIGJ5IHBlZXIKKwlSWFJQQ19TS0JfTUFSS19ORVRfRVJST1IJTmV0d29yayBlcnJvciBkZXRlY3RlZAorCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SCUxvY2FsIGVycm9yIGVuY291bnRlcmVkCisJUlhSUENfU0tCX01BUktfTkVXX0NBTEwJCU5ldyBpbmNvbWluZyBjYWxsIGF3YWl0aW5nIGFjY2VwdGFuY2UKKworICAgICBUaGUgcmVtb3RlIGFib3J0IG1lc3NhZ2UgY2FuIGJlIHByb2JlZCB3aXRoIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZSgpLgorICAgICBUaGUgdHdvIGVycm9yIG1lc3NhZ2VzIGNhbiBiZSBwcm9iZWQgd2l0aCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcigpLgorICAgICBBIG5ldyBjYWxsIGNhbiBiZSBhY2NlcHRlZCB3aXRoIHJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbCgpLgorCisgICAgIERhdGEgbWVzc2FnZXMgY2FuIGhhdmUgdGhlaXIgY29udGVudHMgZXh0cmFjdGVkIHdpdGggdGhlIHVzdWFsIGJ1bmNoIG9mCisgICAgIHNvY2tldCBidWZmZXIgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4gIEEgZGF0YSBtZXNzYWdlIGNhbiBiZSBkZXRlcm1pbmVkIHRvCisgICAgIGJlIHRoZSBsYXN0IG9uZSBpbiBhIHNlcXVlbmNlIHdpdGggcnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdCgpLiAgV2hlbiBhCisgICAgIGRhdGEgbWVzc2FnZSBoYXMgYmVlbiB1c2VkIHVwLCByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoKSBzaG91bGQgYmUKKyAgICAgY2FsbGVkIG9uIGl0Li4KKworICAgICBOb24tZGF0YSBtZXNzYWdlcyBzaG91bGQgYmUgaGFuZGxlZCB0byByeHJwY19rZXJuZWxfZnJlZV9za2IoKSB0byBkaXNwb3NlCisgICAgIG9mLiAgSXQgaXMgcG9zc2libGUgdG8gZ2V0IGV4dHJhIHJlZnMgb24gYWxsIHR5cGVzIG9mIG1lc3NhZ2UgZm9yIGxhdGVyCisgICAgIGZyZWVpbmcsIGJ1dCB0aGlzIG1heSBwaW4gdGhlIHN0YXRlIG9mIGEgY2FsbCB1bnRpbCB0aGUgbWVzc2FnZSBpcyBmaW5hbGx5CisgICAgIGZyZWVkLgorCisgKCopIEFjY2VwdCBhbiBpbmNvbWluZyBjYWxsLgorCisJc3RydWN0IHJ4cnBjX2NhbGwgKgorCXJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCk7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsIGFuZCB0byBhc3NpZ24gaXQgYSBjYWxsIElELiAgVGhpcworICAgICBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHJ4cnBjX2tlcm5lbF9iZWdpbl9jYWxsKCkgYW5kIGNhbGxzIGFjY2VwdGVkIG11c3QKKyAgICAgYmUgZW5kZWQgaW4gdGhlIHNhbWUgd2F5LgorCisgICAgIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgYW4gb3BhcXVlIHJlZmVyZW5jZSB0byB0aGUgUnhSUEMgY2FsbCBpcworICAgICByZXR1cm5lZC4gIFRoZSBjYWxsZXIgbm93IGhvbGRzIGEgcmVmZXJlbmNlIG9uIHRoaXMgYW5kIGl0IG11c3QgYmUKKyAgICAgcHJvcGVybHkgZW5kZWQuCisKKyAoKikgUmVqZWN0IGFuIGluY29taW5nIGNhbGwuCisKKwlpbnQgcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2spOworCisgICAgIFRoaXMgaXMgdXNlZCB0byByZWplY3QgdGhlIGZpcnN0IGluY29taW5nIGNhbGwgb24gdGhlIHNvY2tldCdzIHF1ZXVlIHdpdGgKKyAgICAgYSBCVVNZIG1lc3NhZ2UuICAtRU5PREFUQSBpcyByZXR1cm5lZCBpZiB0aGVyZSB3ZXJlIG5vIGluY29taW5nIGNhbGxzLgorICAgICBPdGhlciBlcnJvcnMgbWF5IGJlIHJldHVybmVkIGlmIHRoZSBjYWxsIGhhZCBiZWVuIGFib3J0ZWQgKC1FQ09OTkFCT1JURUQpCisgICAgIG9yIGhhZCB0aW1lZCBvdXQgKC1FVElNRSkuCisKKyAoKikgUmVjb3JkIHRoZSBkZWxpdmVyeSBvZiBhIGRhdGEgbWVzc2FnZSBhbmQgZnJlZSBpdC4KKworCXZvaWQgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byByZWNvcmQgYSBkYXRhIG1lc3NhZ2UgYXMgaGF2aW5nIGJlZW4gZGVsaXZlcmVkIGFuZCB0bworICAgICB1cGRhdGUgdGhlIEFDSyBzdGF0ZSBmb3IgdGhlIGNhbGwuICBUaGUgc29ja2V0IGJ1ZmZlciB3aWxsIGJlIGZyZWVkLgorCisgKCopIEZyZWUgYSBtZXNzYWdlLgorCisJdm9pZCByeHJwY19rZXJuZWxfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGZyZWUgYSBub24tREFUQSBzb2NrZXQgYnVmZmVyIGludGVyY2VwdGVkIGZyb20gYW4gQUZfUlhSUEMKKyAgICAgc29ja2V0LgorCisgKCopIERldGVybWluZSBpZiBhIGRhdGEgbWVzc2FnZSBpcyB0aGUgbGFzdCBvbmUgb24gYSBjYWxsLgorCisJYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBzb2NrZXQgYnVmZmVyIGhvbGRzIHRoZSBsYXN0IGRhdGEgbWVzc2FnZQorICAgICB0byBiZSByZWNlaXZlZCBmb3IgYSBjYWxsICh0cnVlIHdpbGwgYmUgcmV0dXJuZWQgaWYgaXQgZG9lcywgZmFsc2UKKyAgICAgaWYgbm90KS4KKworICAgICBUaGUgZGF0YSBtZXNzYWdlIHdpbGwgYmUgcGFydCBvZiB0aGUgcmVwbHkgb24gYSBjbGllbnQgY2FsbCBhbmQgdGhlCisgICAgIHJlcXVlc3Qgb24gYW4gaW5jb21pbmcgY2FsbC4gIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGVyZSB3aWxsIGJlIG1vcmUKKyAgICAgbWVzc2FnZXMsIGJ1dCBpbiB0aGUgZm9ybWVyIGNhc2UgdGhlcmUgd2lsbCBub3QuCisKKyAoKikgR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gYWJvcnQgbWVzc2FnZS4KKworCXUzMiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGFib3J0IGNvZGUgZnJvbSBhIHJlbW90ZSBhYm9ydCBtZXNzYWdlLgorCisgKCopIEdldCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYSBsb2NhbCBvciBuZXR3b3JrIGVycm9yIG1lc3NhZ2UuCisKKwlpbnQgcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGVycm9yIG51bWJlciBmcm9tIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGVpdGhlcgorICAgICBhIGxvY2FsIGVycm9yIG9jY3VycmVkIG9yIGEgbmV0d29yayBlcnJvciBvY2N1cnJlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dAppbmRleCA2NTM5NzhkLi4wN2RkNmQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CkBAIC0yNTAsNyArMjUwLDYgQEAKIAlzZGxhZHJ2LmgJU0RMQSBzdXBwb3J0IG1vZHVsZSBBUEkgZGVmaW5pdGlvbnMKIAlzZGxhc2ZtLmgJU0RMQSBmaXJtd2FyZSBtb2R1bGUgZGVmaW5pdGlvbnMKIAlpZl93YW5waXBlLmgJV0FOUElQRSBTb2NrZXQgZGVmaW5pdGlvbnMKLQlpZl93YW5waXBlX2NvbW1vbi5oCVdBTlBJUEUgU29ja2V0L0RyaXZlciBjb21tb24gZGVmaW5pdGlvbnMuCiAJc2RsYXBjaS5oCVdBTlBJUEUgUENJIGRlZmluaXRpb25zCiAJCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9jcnlwdG8vY3J5cHRvLUFQSS50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY3J5cHRvL2NyeXB0by1BUEkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWFlNmNhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9jcnlwdG8vY3J5cHRvLUFQSS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1jcnlwdG8tQVBJIHN1cHBvcnQgZm9yIHo5OTAgTWVzc2FnZSBTZWN1cml0eSBBc3Npc3QgKE1TQSkgaW5zdHJ1Y3Rpb25zCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUFVVEhPUjoJVGhvbWFzIFNwYXR6aWVyICh0c3BhdEBkZS5pYm0uY29tKQotCi0KLTEuIEludHJvZHVjdGlvbiBjcnlwdG8tQVBJCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotU2VlIERvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQgZm9yIGFuIGludHJvZHVjdGlvbi9kZXNjcmlwdGlvbiBvZiB0aGUKLWtlcm5lbCBjcnlwdG8gQVBJLgotQWNjb3JkaW5nIHRvIGFwaS1pbnRyby50eHQgc3VwcG9ydCBmb3Igejk5MCBjcnlwdG8gaW5zdHJ1Y3Rpb25zIGhhcyBiZWVuIGFkZGVkCi1pbiB0aGUgYWxnb3JpdGhtIGFwaSBsYXllciBvZiB0aGUgY3J5cHRvIEFQSS4gU2V2ZXJhbCBmaWxlcyBjb250YWluaW5nIHo5OTAKLW9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgY3J5cHRvIGFsZ29yaXRobXMgYXJlIHBsYWNlZCBpbiB0aGUKLWFyY2gvczM5MC9jcnlwdG8gZGlyZWN0b3J5LgotCi0KLTIuIFByb2JpbmcgZm9yIGF2YWlsYWJpbGl0eSBvZiBNU0EKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgS2VybmVscyB3aXRoIHRoZSB6OTkwIGNyeXB0byBpbXBsZW1lbnRhdGlvbnMgYm90aAotb24gbWFjaGluZXMgd2l0aCBNU0EgYXZhaWxhYmxlIGFuZCBvbiB0aG9zZSB3aXRob3V0IE1TQSAocHJlIHo5OTAgb3Igejk5MAotd2l0aG91dCBNU0EpLiBUaGVyZWZvcmUgYSBzaW1wbGUgcHJvYmluZyBtZWNoYW5pc20gaGFzIGJlZW4gaW1wbGVtZW50ZWQ6Ci1JbiB0aGUgaW5pdCBmdW5jdGlvbiBvZiBlYWNoIGNyeXB0byBtb2R1bGUgdGhlIGF2YWlsYWJpbGl0eSBvZiBNU0EgYW5kIG9mIHRoZQotcmVzcGVjdGl2ZSBjcnlwdG8gYWxnb3JpdGhtIGluIHBhcnRpY3VsYXIgd2lsbCBiZSB0ZXN0ZWQuIElmIHRoZSBhbGdvcml0aG0gaXMKLWF2YWlsYWJsZSB0aGUgbW9kdWxlIHdpbGwgbG9hZCBhbmQgcmVnaXN0ZXIgaXRzIGFsZ29yaXRobSB3aXRoIHRoZSBjcnlwdG8gQVBJLgotCi1JZiB0aGUgcmVzcGVjdGl2ZSBjcnlwdG8gYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBpbml0IGZ1bmN0aW9uIHdpbGwKLXJldHVybiAtRU5PU1lTLiBJbiB0aGF0IGNhc2UgYSBmYWxsYmFjayB0byB0aGUgc3RhbmRhcmQgc29mdHdhcmUgaW1wbGVtZW50YXRpb24KLW9mIHRoZSBjcnlwdG8gYWxnb3JpdGhtIG11c3QgYmUgdGFrZW4gKCAtPiB0aGUgc3RhbmRhcmQgY3J5cHRvIG1vZHVsZXMgYXJlCi1hbHNvIGJ1aWx0IHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwpLgotCi0KLTMuIEVuc3VyaW5nIHo5OTAgY3J5cHRvIG1vZHVsZSBwcmVmZXJlbmNlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotSWYgejk5MCBjcnlwdG8gaW5zdHJ1Y3Rpb25zIGFyZSBhdmFpbGFibGUgdGhlIG9wdGltaXplZCBtb2R1bGVzIHNob3VsZCBiZQotcHJlZmVycmVkIGluc3RlYWQgb2Ygc3RhbmRhcmQgbW9kdWxlcy4KLQotMy4xLiBjb21waWxlZC1pbiBtb2R1bGVzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUZvciBjb21waWxlZC1pbiBtb2R1bGVzIGl0IGhhcyB0byBiZSBlbnN1cmVkIHRoYXQgdGhlIHo5OTAgbW9kdWxlcyBhcmUgbGlua2VkCi1iZWZvcmUgdGhlIHN0YW5kYXJkIGNyeXB0byBtb2R1bGVzLiBUaGVuLCBvbiBzeXN0ZW0gc3RhcnR1cCB0aGUgaW5pdCBmdW5jdGlvbnMKLW9mIHo5OTAgY3J5cHRvIG1vZHVsZXMgd2lsbCBiZSBjYWxsZWQgZmlyc3QgYW5kIHF1ZXJ5IGZvciBhdmFpbGFiaWxpdHkgb2Ygejk5MAotY3J5cHRvIGluc3RydWN0aW9ucy4gSWYgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlLCB0aGUgejk5MCBtb2R1bGUgd2lsbCByZWdpc3RlcgotaXRzIGNyeXB0byBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gLT4gdGhlIGxvYWQgb2YgdGhlIHN0YW5kYXJkIG1vZHVsZSB3aWxsIGZhaWwKLXNpbmNlIHRoZSBhbGdvcml0aG0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotSWYgejk5MCBjcnlwdG8gaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSB0aGUgbG9hZCBvZiB0aGUgejk5MCBtb2R1bGUgd2lsbAotZmFpbCAtPiB0aGUgc3RhbmRhcmQgbW9kdWxlIHdpbGwgbG9hZCBhbmQgcmVnaXN0ZXIgaXRzIGFsZ29yaXRobS4KLQotMy4yLiBkeW5hbWljIG1vZHVsZXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1BIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGhhcyB0byB0YWtlIGNhcmUgb2YgZ2l2aW5nIHByZWZlcmVuY2UgdG8gejk5MCBjcnlwdG8KLW1vZHVsZXMuIElmIE1TQSBpcyBhdmFpbGFibGUgYXBwcm9wcmlhdGUgbGluZXMgaGF2ZSB0byBiZSBhZGRlZCB0bwotL2V0Yy9tb2Rwcm9iZS5jb25mLgotCi1FeGFtcGxlOgl6OTkwIGNyeXB0byBpbnN0cnVjdGlvbiBmb3IgU0hBMSBhbGdvcml0aG0gaXMgYXZhaWxhYmxlCi0KLQkJYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byAvZXRjL21vZHByb2JlLmNvbmYgKGFzc3VtaW5nIHRoZQotCQl6OTkwIGNyeXB0byBtb2R1bGVzIGZvciBTSEExIGlzIGNhbGxlZCBzaGExX3o5OTApOgotCi0JCWFsaWFzIHNoYTEgc2hhMV96OTkwCi0KLQkJLT4gd2hlbiB0aGUgc2hhMSBhbGdvcml0aG0gaXMgcmVxdWVzdGVkIHRocm91Z2ggdGhlIGNyeXB0byBBUEkKLQkJKHdoaWNoIGhhcyBhIG1vZHVsZSBhdXRvbG9hZGVyKSB0aGUgejk5MCBtb2R1bGUgd2lsbCBiZSBsb2FkZWQuCi0KLVRCRDoJYSB1c2Vyc3BhY2UgbW9kdWxlIHByb2JpbmcgbWVjaGFuaXNtCi0Jc29tZXRoaW5nIGxpa2UgJ3Byb2JlIHNoYTEgc2hhMV96OTkwIHNoYTEnIGluIG1vZHByb2JlLmNvbmYKLQktPiB0cnkgbW9kdWxlIHNoYTFfejk5MCwgaWYgaXQgZmFpbHMgdG8gbG9hZCBzdGFuZGFyZCBtb2R1bGUgc2hhMQotCXRoZSAncHJvYmUnIHN0YXRlbWVudCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBpbiBtb2Rwcm9iZS5jb25mCi0KLQotNC4gQ3VycmVudGx5IGltcGxlbWVudGVkIHo5OTAgY3J5cHRvIGFsZ29yaXRobXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1UaGUgZm9sbG93aW5nIGNyeXB0byBhbGdvcml0aG1zIHdpdGggejk5MCBNU0Egc3VwcG9ydCBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLgotVGhlIG5hbWUgb2YgZWFjaCBhbGdvcml0aG0gdW5kZXIgd2hpY2ggaXQgaXMgcmVnaXN0ZXJlZCBpbiBjcnlwdG8gQVBJIGFuZCB0aGUKLW5hbWUgb2YgdGhlIHJlc3BlY3RpdmUgbW9kdWxlIGlzIGdpdmVuIGluIHNxdWFyZSBicmFja2V0cy4KLQotLSBTSEExIERpZ2VzdCBBbGdvcml0aG0gW3NoYTEgLT4gc2hhMV96OTkwXQotLSBERVMgRW5jcnlwdC9EZWNyeXB0IEFsZ29yaXRobSAoNjRiaXQga2V5KSBbZGVzIC0+IGRlc196OTkwXQotLSBUcmlwbGUgREVTIEVuY3J5cHQvRGVjcnlwdCBBbGdvcml0aG0gKDEyOGJpdCBrZXkpIFtkZXMzX2VkZTEyOCAtPiBkZXNfejk5MF0KLS0gVHJpcGxlIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICgxOTJiaXQga2V5KSBbZGVzM19lZGUgLT4gZGVzX3o5OTBdCi0KLUluIG9yZGVyIHRvIGxvYWQsIGZvciBleGFtcGxlLCB0aGUgc2hhMV96OTkwIG1vZHVsZSB3aGVuIHRoZSBzaGExIGFsZ29yaXRobSBpcwotcmVxdWVzdGVkIChzZWUgMy4yLikgYWRkICdhbGlhcyBzaGExIHNoYTFfejk5MCcgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mLgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvemZjcGR1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3pmY3BkdW1wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ1ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL3pmY3BkdW1wLnR4dApAQCAtMCwwICsxLDg3IEBACitzMzkwIFNDU0kgZHVtcCB0b29sICh6ZmNwZHVtcCkKKworU3lzdGVtIHogbWFjaGluZXMgKHo5MDAgb3IgaGlnaGVyKSBwcm92aWRlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHN5c3RlbQorZHVtcHMgb24gU0NTSSBkaXNrcy4gVGhlIGR1bXAgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgYm9vdGluZyBhIGR1bXAgdG9vbCwgd2hpY2gKK2hhcyB0byBjcmVhdGUgYSBkdW1wIG9mIHRoZSBjdXJyZW50IChwcm9iYWJseSBjcmFzaGVkKSBMaW51eCBpbWFnZS4gSW4gb3JkZXIgdG8KK25vdCBvdmVyd3JpdGUgbWVtb3J5IG9mIHRoZSBjcmFzaGVkIExpbnV4IHdpdGggZGF0YSBvZiB0aGUgZHVtcCB0b29sLCB0aGUKK2hhcmR3YXJlIHNhdmVzIHNvbWUgbWVtb3J5IHBsdXMgdGhlIHJlZ2lzdGVyIHNldHMgb2YgdGhlIGJvb3QgY3B1IGJlZm9yZSB0aGUKK2R1bXAgdG9vbCBpcyBsb2FkZWQuIFRoZXJlIGV4aXN0cyBhbiBTQ0xQIGhhcmR3YXJlIGludGVyZmFjZSB0byBvYnRhaW4gdGhlIHNhdmVkCittZW1vcnkgYWZ0ZXJ3YXJkcy4gQ3VycmVudGx5IDMyIE1CIGFyZSBzYXZlZC4KKworVGhpcyB6ZmNwZHVtcCBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIExpbnV4IGR1bXAga2VybmVsIHRvZ2V0aGVyIHdpdGgKK2EgdXNlcnNwYWNlIGR1bXAgdG9vbCwgd2hpY2ggYXJlIGxvYWRlZCB0b2dldGhlciBpbnRvIHRoZSBzYXZlZCBtZW1vcnkgcmVnaW9uCitiZWxvdyAzMiBNQi4gemZjcGR1bXAgaXMgaW5zdGFsbGVkIG9uIGEgU0NTSSBkaXNrIHVzaW5nIHppcGwgKGFzIGNvbnRhaW5lZCBpbgordGhlIHMzOTAtdG9vbHMgcGFja2FnZSkgdG8gbWFrZSB0aGUgZGV2aWNlIGJvb3RhYmxlLiBUaGUgb3BlcmF0b3Igb2YgYSBMaW51eAorc3lzdGVtIGNhbiB0aGVuIHRyaWdnZXIgYSBTQ1NJIGR1bXAgYnkgYm9vdGluZyB0aGUgU0NTSSBkaXNrLCB3aGVyZSB6ZmNwZHVtcAorcmVzaWRlcyBvbi4KKworVGhlIGtlcm5lbCBwYXJ0IG9mIHpmY3BkdW1wIGlzIGltcGxlbWVudGVkIGFzIGEgZGVidWdmcyBmaWxlIHVuZGVyICJ6Y29yZS9tZW0iLAord2hpY2ggZXhwb3J0cyBtZW1vcnkgYW5kIHJlZ2lzdGVycyBvZiB0aGUgY3Jhc2hlZCBMaW51eCBpbiBhbiBzMzkwCitzdGFuZGFsb25lIGR1bXAgZm9ybWF0LiBJdCBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkgYXMgZS5nLiAvZGV2L21lbS4gVGhlCitkdW1wIGZvcm1hdCBkZWZpbmVzIGEgNEsgaGVhZGVyIGZvbGxvd2VkIGJ5IHBsYWluIHVuY29tcHJlc3NlZCBtZW1vcnkuIFRoZQorcmVnaXN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluIHRoZSBwcmVmaXggcGFnZXMgb2YgdGhlIHJlc3BlY3RpdmUgY3B1cy4gVG8gYnVpbGQgYQorZHVtcCBlbmFibGVkIGtlcm5lbCB3aXRoIHRoZSB6Y29yZSBkcml2ZXIsIHRoZSBrZXJuZWwgY29uZmlnIG9wdGlvbgorQ09ORklHX1pGQ1BEVU1QIGhhcyB0byBiZSBzZXQuIFdoZW4gcmVhZGluZyBmcm9tICJ6Y29yZS9tZW0iLCB0aGUgcGFydCBvZgorbWVtb3J5LCB3aGljaCBoYXMgYmVlbiBzYXZlZCBieSBoYXJkd2FyZSBpcyByZWFkIGJ5IHRoZSBkcml2ZXIgdmlhIHRoZSBTQ0xQCitoYXJkd2FyZSBpbnRlcmZhY2UuIFRoZSBzZWNvbmQgcGFydCBpcyBqdXN0IGNvcGllZCBmcm9tIHRoZSBub24gb3ZlcndyaXR0ZW4gcmVhbAorbWVtb3J5LgorCitUaGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIG9mIHpmY3BkdW1wIGNhbiByZXNpZGUgZS5nLiBpbiBhbiBpbnRpdHJhbWZzIG9yIGFuCitpbml0cmQuIEl0IHJlYWRzIGZyb20gemNvcmUvbWVtIGFuZCB3cml0ZXMgdGhlIHN5c3RlbSBkdW1wIHRvIGEgZmlsZSBvbiBhCitTQ1NJIGRpc2suCisKK1RvIGJ1aWxkIGEgemZjcGR1bXAga2VybmVsIHVzZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzIGluIHlvdXIga2VybmVsCitjb25maWd1cmF0aW9uOgorICogQ09ORklHX1pGQ1BEVU1QPXkKKyAqIEVuYWJsZSBaRkNQIGRyaXZlcgorICogRW5hYmxlIFNDU0kgZHJpdmVyCisgKiBFbmFibGUgZXh0MiBhbmQgZXh0MyBmaWxlc3lzdGVtcworICogRGlzYWJsZSBhcyBtYW55IGZlYXR1cmVzIGFzIHBvc3NpYmxlIHRvIGtlZXAgdGhlIGtlcm5lbCBzbWFsbC4KKyAgIEUuZy4gbmV0d29yayBzdXBwb3J0IGlzIG5vdCBuZWVkZWQgYXQgYWxsLgorCitUbyB1c2UgdGhlIHpmY3BkdW1wIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBpbiBhbiBpbml0cmFtZnMgeW91IGhhdmUgdG8gZG8gdGhlCitmb2xsb3dpbmc6CisKKyAqIENvcHkgdGhlIHpmY3BkdW1wIGV4ZWN1dGFibGUgc29tZXdoZXJlIGludG8geW91ciBMaW51eCB0cmVlLgorICAgRS5nLiB0byAiYXJjaC9zMzkwL2Jvb3QvemZjcGR1bXAuIElmIHlvdSBkbyBub3Qgd2FudCB0byBpbmNsdWRlCisgICBzaGFyZWQgbGlicmFyaWVzLCBjb21waWxlIHRoZSB0b29sIHdpdGggdGhlICItc3RhdGljIiBnY2Mgb3B0aW9uLgorICogSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBlMmZzY2ssIGFkZCBpdCB0byB5b3VyIHNvdXJjZSB0cmVlLCB0b28uIFRoZSB6ZmNwZHVtcAorICAgYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gc3RhcnQgL3NiaW4vZTJmc2NrIGZyb20gdGhlIHJhbWRpc2suCisgKiBVc2UgYW4gaW5pdHJhbWZzIGNvbmZpZyBmaWxlIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICAgZGlyIC9kZXYgNzU1IDAgMAorICAgbm9kIC9kZXYvY29uc29sZSA2NDQgMCAwIGMgNSAxCisgICBub2QgL2Rldi9udWxsIDY0NCAwIDAgYyAxIDMKKyAgIG5vZCAvZGV2L3NkYTEgNjQ0IDAgMCBiIDggMQorICAgbm9kIC9kZXYvc2RhMiA2NDQgMCAwIGIgOCAyCisgICBub2QgL2Rldi9zZGEzIDY0NCAwIDAgYiA4IDMKKyAgIG5vZCAvZGV2L3NkYTQgNjQ0IDAgMCBiIDggNAorICAgbm9kIC9kZXYvc2RhNSA2NDQgMCAwIGIgOCA1CisgICBub2QgL2Rldi9zZGE2IDY0NCAwIDAgYiA4IDYKKyAgIG5vZCAvZGV2L3NkYTcgNjQ0IDAgMCBiIDggNworICAgbm9kIC9kZXYvc2RhOCA2NDQgMCAwIGIgOCA4CisgICBub2QgL2Rldi9zZGE5IDY0NCAwIDAgYiA4IDkKKyAgIG5vZCAvZGV2L3NkYTEwIDY0NCAwIDAgYiA4IDEwCisgICBub2QgL2Rldi9zZGExMSA2NDQgMCAwIGIgOCAxMQorICAgbm9kIC9kZXYvc2RhMTIgNjQ0IDAgMCBiIDggMTIKKyAgIG5vZCAvZGV2L3NkYTEzIDY0NCAwIDAgYiA4IDEzCisgICBub2QgL2Rldi9zZGExNCA2NDQgMCAwIGIgOCAxNAorICAgbm9kIC9kZXYvc2RhMTUgNjQ0IDAgMCBiIDggMTUKKyAgIGZpbGUgL2luaXQgYXJjaC9zMzkwL2Jvb3QvemZjcGR1bXAgNzU1IDAgMAorICAgZmlsZSAvc2Jpbi9lMmZzY2sgYXJjaC9zMzkwL2Jvb3QvZTJmc2NrIDc1NSAwIDAKKyAgIGRpciAvcHJvYyA3NTUgMCAwCisgICBkaXIgL3N5cyA3NTUgMCAwCisgICBkaXIgL21udCA3NTUgMCAwCisgICBkaXIgL3NiaW4gNzU1IDAgMAorCisgKiBJc3N1ZSAibWFrZSBpbWFnZSIgdG8gYnVpbGQgdGhlIHpmY3BkdW1wIGltYWdlIHdpdGggaW5pdHJhbWZzLgorCitJbiBhIExpbnV4IGRpc3RyaWJ1dGlvbiB0aGUgemZjcGR1bXAgZW5hYmxlZCBrZXJuZWwgaW1hZ2UgbXVzdCBiZSBjb3BpZWQgdG8KKy91c3Ivc2hhcmUvemZjcGR1bXAvemZjcGR1bXAuaW1hZ2UsIHdoZXJlIHRoZSBzMzkwIHppcGwgdG9vbCBpcyBsb29raW5nIGZvciB0aGUKK2R1bXAga2VybmVsIHdoZW4gcHJlcGFyaW5nIGEgU0NTSSBkdW1wIGRpc2suCisKK0lmIHlvdSB1c2UgYSByYW1kaXNrIGNvcHkgaXQgdG8gIi91c3Ivc2hhcmUvemZjcGR1bXAvemZjcGR1bXAucmQiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHpmY3BkdW1wIHJlZmVyIHRvIHRoZSBzMzkwICdVc2luZyB0aGUgRHVtcAorVG9vbHMgYm9vaycsIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tCitodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGludXgvbGludXgzOTAuCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDI3Nzg3N2EuLmY1NmM3ZTEgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0zODQsNyArMzg0LDcgQEAKIAogQVBQTEVUQUxLIE5FVFdPUksgTEFZRVIKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAogUzoJTWFpbnRhaW5lZAogCiBBUkMgRlJBTUVCVUZGRVIgRFJJVkVSCkBAIC02NTYsNiArNjU2LDcgQEAKIEFUTUVMIFdJUkVMRVNTIERSSVZFUgogUDoJU2ltb24gS2VsbGV5CiBNOglzaW1vbkB0aGVrZWxsZXlzLm9yZy51aworTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LnRoZWtlbGxleXMub3JnLnVrL2F0bWVsCiBXOglodHRwOi8vYXRtZWx3bGFuZHJpdmVyLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKQEAgLTcxMSw2ICs3MTIsNyBAQAogTToJTGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldAogUDoJU3RlZmFubyBCcml2aW8KIE06CXN0M0ByaXNldXAubmV0CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9iY200M3h4LmJlcmxpb3MuZGUvCiBTOglNYWludGFpbmVkCiAKQEAgLTg5Miw2ICs4OTQsMTIgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorQ0ZHODAyMTEgYW5kIE5MODAyMTEKK1A6CUpvaGFubmVzIEJlcmcKK006CWpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBDT01NT04gSU5URVJORVQgRklMRSBTWVNURU0gKENJRlMpCiBQOglTdGV2ZSBGcmVuY2gKIE06CXNmcmVuY2hAc2FtYmEub3JnCkBAIC0xMDM0LDkgKzEwNDIsOCBAQAogCiBDWUNMQURFUyAyWCBTWU5DIENBUkQgRFJJVkVSCiBQOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KLU06CWFjbWVAY29uZWN0aXZhLmNvbS5icgotVzoJaHR0cDovL2Fkdm9nYXRvLm9yZy9wZXJzb24vYWNtZQotTDoJY3ljc3luLWRldmVsQGJhemFyLmNvbmVjdGl2YS5jb20uYnIKK006CWFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CitXOglodHRwOi8vb29wcy5naG9zdHByb3RvY29scy5uZXQ6ODEvYmxvZwogUzoJTWFpbnRhaW5lZAogCiBDWUNMQURFUyBBU1lOQyBNVVggRFJJVkVSCkBAIC0xMDc3LDcgKzEwODQsNyBAQAogCiBEQ0NQIFBST1RPQ09MCiBQOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KLU06CWFjbWVAbWFuZHJpdmEuY29tCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAogTDoJZGNjcEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9saW51eC1uZXQub3NkbC5vcmcvaW5kZXgucGhwL0RDQ1AKIFM6CU1haW50YWluZWQKQEAgLTE1NTgsNiArMTU2NSw3IEBACiBIT1NUIEFQIERSSVZFUgogUDoJSm91bmkgTWFsaW5lbgogTToJamttYWxpbmVAY2MuaHV0LmZpCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWhvc3RhcEBzaG1vby5jb20KIFc6CWh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8KIFM6CU1haW50YWluZWQKQEAgLTE4MzAsNiArMTgzOCw3IEBACiBNOgl5aS56aHVAaW50ZWwuY29tCiBQOglKYW1lcyBLZXRyZW5vcwogTToJamtldHJlbm9AbGludXguaW50ZWwuY29tCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWlwdzIxMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBMOglodHRwOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L21haWxtYW4vbGlzdGluZm8vaXB3MjEwMC1kZXZlbAogVzoJaHR0cDovL2lwdzIxMDAuc291cmNlZm9yZ2UubmV0CkBAIC0xODQwLDYgKzE4NDksNyBAQAogTToJeWkuemh1QGludGVsLmNvbQogUDoJSmFtZXMgS2V0cmVub3MKIE06CWprZXRyZW5vQGxpbnV4LmludGVsLmNvbQorTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBMOglpcHcyMTAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogTDoJaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9tYWlsbWFuL2xpc3RpbmZvL2lwdzIxMDAtZGV2ZWwKIFc6CWh0dHA6Ly9pcHcyMjAwLnNvdXJjZWZvcmdlLm5ldApAQCAtMTg3MSw3ICsxODgxLDcgQEAKIAogSVBYIE5FVFdPUksgTEFZRVIKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC0yMTA4LDcgKzIxMTgsNyBAQAogCiBMTEMgKDgwMi4yKQogUDoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCi1NOglhY21lQGNvbmVjdGl2YS5jb20uYnIKK006CWFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CiBTOglNYWludGFpbmVkCiAKIExJTlVYIEZPUiA2NEJJVCBQT1dFUlBDCkBAIC0yNTMyLDYgKzI1NDIsNyBAQAogTToJcHJvc2tpQGdudS5vcmcKIFA6CURhdmlkIEdpYnNvbgogTToJaGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdQorTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBMOglvcmlub2NvLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogTDoJb3Jpbm9jby1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly93d3cubm9uZ251Lm9yZy9vcmlub2NvLwpAQCAtMjcxMSw3ICsyNzIyLDcgQEAKIFBSSVNNNTQgV0lSRUxFU1MgRFJJVkVSCiBQOglQcmlzbTU0IERldmVsb3BtZW50IFRlYW0KIE06CWRldmVsb3BlcnNAaXNsc20ub3JnCi1MOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9wcmlzbTU0Lm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC0yNzgyLDcgKzI3OTMsNyBAQAogUkFZTElOSy9XRUJHRUFSIDgwMi4xMSBXSVJFTEVTUyBMQU4gRFJJVkVSCiBQOglDb3JleSBUaG9tYXMKIE06CWNvcmV5QHdvcmxkLnN0ZC5jb20KLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBSQU5ET00gTlVNQkVSIERSSVZFUgpAQCAtMzA0NSw3ICszMDU2LDcgQEAKIFA6CURhbmllbCBEcmFrZQogTToJZHNkQGdlbnRvby5vcmcKIFc6CWh0dHA6Ly9zb2Z0bWFjLnNpcHNvbHV0aW9ucy5uZXQvCi1MOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAogU09GVFdBUkUgUkFJRCAoTXVsdGlwbGUgRGlza3MpIFNVUFBPUlQKQEAgLTM3NTAsNiArMzc2MSw3IEBACiBXQVZFTEFOIE5FVFdPUksgRFJJVkVSICYgV0lSRUxFU1MgRVhURU5TSU9OUwogUDoJSmVhbiBUb3VycmlsaGVzCiBNOglqdEBocGwuaHAuY29tCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvCiBTOglNYWludGFpbmVkCiAKQEAgLTM3NjYsOCArMzc3OCw5IEBACiAKIFdMMzUwMSBXSVJFTEVTUyBQQ01DSUEgQ0FSRCBEUklWRVIKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCi1XOglodHRwOi8vYWR2b2dhdG8ub3JnL3BlcnNvbi9hY21lCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAorTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vb29wcy5naG9zdHByb3RvY29scy5uZXQ6ODEvYmxvZwogUzoJTWFpbnRhaW5lZAogCiBYLjI1IE5FVFdPUksgTEFZRVIKQEAgLTM4MzAsNiArMzg0Myw3IEBACiBQOglVbHJpY2ggS3VuaXR6CiBNOglrdW5lQGRlaW5lLXRhbGVyLmRlCiBXOglodHRwOi8vemQxMjExLmF0aC5jeC93aWtpL0RyaXZlclJld3JpdGUKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogTDoJemQxMjExLWRldnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL0tjb25maWcgYi9hcmNoL2F2cjMyL0tjb25maWcKaW5kZXggY2U0MDEzYS4uM2VjNzY1OCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9LY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvS2NvbmZpZwpAQCAtNTcsOSArNTcsNiBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAotY29uZmlnIEdFTkVSSUNfQlVTVF9TUElOTE9DSwotCWJvb2wKLQogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTY4LDYgKzY1LDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19CVUcKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCVUcKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlN5c3RlbSBUeXBlIGFuZCBmZWF0dXJlcyIKQEAgLTEwNiw2ICsxMDgsOSBAQAogY29uZmlnIEJPQVJEX0FUU1RLMTAwMAogCWJvb2wgIkFUU1RLMTAwMCBldmFsdWF0aW9uIGJvYXJkIgogCXNlbGVjdCBCT0FSRF9BVFNUSzEwMDIgaWYgQ1BVX0FUMzJBUDcwMDAKKworY29uZmlnIEJPQVJEX0FUTkdXMTAwCisJYm9vbCAiQVROR1cxMDAgTmV0d29yayBHYXRld2F5IgogZW5kY2hvaWNlCiAKIGNob2ljZQpAQCAtMTE2LDYgKzEyMSw4IEBACiAJYm9vbCAiVS1Cb290IChvciBzaW1pbGFyKSBib290bG9hZGVyIgogZW5kY2hvaWNlCiAKK3NvdXJjZSAiYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9LY29uZmlnIgorCiBjb25maWcgTE9BRF9BRERSRVNTCiAJaGV4CiAJZGVmYXVsdCAweDEwMDAwMDAwIGlmIExPQURFUl9VX0JPT1Q9eSAmJiBDUFVfQVQzMkFQNzAwMD15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQppbmRleCA3Yjg0MmU5Li42MTE1ZmMxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIGhlYWQteQkJCQkJKz0gYXJjaC9hdnIzMi9rZXJuZWwvaGVhZC5vCiBjb3JlLSQoQ09ORklHX1BMQVRGT1JNX0FUMzJBUCkJCSs9IGFyY2gvYXZyMzIvbWFjaC1hdDMyYXAvCiBjb3JlLSQoQ09ORklHX0JPQVJEX0FUU1RLMTAwMCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC8KK2NvcmUtJChDT05GSUdfQk9BUkRfQVROR1cxMDApCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC8KIGNvcmUtJChDT05GSUdfTE9BREVSX1VfQk9PVCkJCSs9IGFyY2gvYXZyMzIvYm9vdC91LWJvb3QvCiBjb3JlLXkJCQkJCSs9IGFyY2gvYXZyMzIva2VybmVsLwogY29yZS15CQkJCQkrPSBhcmNoL2F2cjMyL21tLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQwYWExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9mbGFzaC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWIzMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvZmxhc2guYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQVROR1cxMDAgYm9hcmQtc3BlY2lmaWMgZmxhc2ggaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NtYy5oPgorCitzdGF0aWMgc3RydWN0IHNtY19jb25maWcgZmxhc2hfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSA0MCwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDEwLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDgwLAorCS5ucmRfcHVsc2UJCT0gNDAsCisJLm5jc193cml0ZV9wdWxzZQk9IDY1LAorCS5ud2VfcHVsc2UJCT0gNTUsCisKKwkucmVhZF9jeWNsZQkJPSAxMjAsCisJLndyaXRlX2N5Y2xlCQk9IDEyMCwKKworCS5idXNfd2lkdGgJCT0gMiwKKwkubnJkX2NvbnRyb2xsZWQJCT0gMSwKKwkubndlX2NvbnRyb2xsZWQJCT0gMSwKKwkuYnl0ZV93cml0ZQkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGZsYXNoX3BhcnRzW10gPSB7CisJeworCQkubmFtZSAgICAgICAgICAgPSAidS1ib290IiwKKwkJLm9mZnNldCAgICAgICAgID0gMHgwMDAwMDAwMCwKKwkJLnNpemUgICAgICAgICAgID0gMHgwMDAyMDAwMCwgICAgICAgICAgIC8qIDEyOCBLaUIgKi8KKwkJLm1hc2tfZmxhZ3MgICAgID0gTVREX1dSSVRFQUJMRSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgICAgID0gInJvb3QiLAorCQkub2Zmc2V0ICAgICAgICAgPSAweDAwMDIwMDAwLAorCQkuc2l6ZSAgICAgICAgICAgPSAweDAwN2QwMDAwLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAiZW52IiwKKwkJLm9mZnNldCAgICAgICAgID0gMHgwMDdmMDAwMCwKKwkJLnNpemUgICAgICAgICAgID0gMHgwMDAxMDAwMCwKKwkJLm1hc2tfZmxhZ3MgICAgID0gTVREX1dSSVRFQUJMRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gMiwKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGZsYXNoX3BhcnRzKSwKKwkucGFydHMJCT0gZmxhc2hfcGFydHMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSAweDAwMDAwMDAwLAorCS5lbmQJCT0gMHgwMDdmZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5yZXNvdXJjZQk9ICZmbGFzaF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmZsYXNoX2RhdGEsCisJfSwKK307CisKKy8qIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBTTUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0bmd3MTAwX2ZsYXNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc21jX3NldF9jb25maWd1cmF0aW9uKDAsICZmbGFzaF9jb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRuZ3cxMDA6IGZhaWxlZCB0byBzZXQgTk9SIGZsYXNoIHRpbWluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZmbGFzaF9kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoYXRuZ3cxMDBfZmxhc2hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMzN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIEJvYXJkLXNwZWNpZmljIHNldHVwIGNvZGUgZm9yIHRoZSBBVE5HVzEwMCBOZXR3b3JrIEdhdGV3YXkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2F0MzJhcDcwMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2luaXQuaD4KKworLyogSW5pdGlhbGl6ZWQgYnkgYm9vdGxvYWRlci1zcGVjaWZpYyBzdGFydHVwIGNvZGUuICovCitzdHJ1Y3QgdGFnICpib290bG9hZGVyX3RhZ3MgX19pbml0ZGF0YTsKKworc3RydWN0IGV0aF9hZGRyIHsKKwl1OCBhZGRyWzZdOworfTsKK3N0YXRpYyBzdHJ1Y3QgZXRoX2FkZHIgX19pbml0ZGF0YSBod19hZGRyWzJdOworc3RhdGljIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIGV0aF9kYXRhWzJdOworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaTBfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5tYXhfc3BlZWRfaHoJPSAxMDAwMDAwMCwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwl9LAorfTsKKworLyoKKyAqIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYXMgdGhlIGJvb3QgbG9hZGVyIGlzCisgKiBzdXBwb3NlZCB0byBpbml0aWFsaXplIHRoZSBtYWNiIGFkZHJlc3MgcmVnaXN0ZXJzIHdpdGggYSB2YWxpZAorICogZXRoZXJuZXQgYWRkcmVzcy4gQnV0IHdlIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQgZm9yIGEgd2hpbGUgdW50aWwKKyAqIHdlIGNhbiBiZSByZWFzb25hYmx5IHN1cmUgdGhlIGJvb3QgbG9hZGVyIGRvZXMgdGhpcy4KKyAqCisgKiBUaGUgcGh5X2lkIGlzIGlnbm9yZWQgYXMgdGhlIGRyaXZlciB3aWxsIHByb2JlIGZvciBpdC4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2V0aGVybmV0KHN0cnVjdCB0YWcgKnRhZykKK3sKKwlpbnQgaTsKKworCWkgPSB0YWctPnUuZXRoZXJuZXQubWFjX2luZGV4OworCWlmIChpIDwgQVJSQVlfU0laRShod19hZGRyKSkKKwkJbWVtY3B5KGh3X2FkZHJbaV0uYWRkciwgdGFnLT51LmV0aGVybmV0Lmh3X2FkZHJlc3MsCisJCSAgICAgICBzaXplb2YoaHdfYWRkcltpXS5hZGRyKSk7CisKKwlyZXR1cm4gMDsKK30KK19fdGFndGFibGUoQVRBR19FVEhFUk5FVCwgcGFyc2VfdGFnX2V0aGVybmV0KTsKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9od19hZGRyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWNvbnN0IHU4ICphZGRyOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCisJaWYgKCFyZXMpCisJCXJldHVybjsKKwlpZiAocGRldi0+aWQgPj0gQVJSQVlfU0laRShod19hZGRyKSkKKwkJcmV0dXJuOworCisJYWRkciA9IGh3X2FkZHJbcGRldi0+aWRdLmFkZHI7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNpbmNlIHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMgY29kZSwgd2UnbGwgY2hlYXQgYW5kIHVzZSB0aGUKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIGRpcmVjdGx5IGFzIHdlIGhhcHBlbiB0byBrbm93IHRoYXQgaXQncworCSAqIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJcmVncyA9ICh2b2lkIF9faW9tZW0gX19mb3JjZSAqKXJlcy0+c3RhcnQ7CisJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKKwlpZiAoIXBjbGspCisJCXJldHVybjsKKworCWNsa19lbmFibGUocGNsayk7CisJX19yYXdfd3JpdGVsKChhZGRyWzNdIDw8IDI0KSB8IChhZGRyWzJdIDw8IDE2KQorCQkgICAgIHwgKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdLCByZWdzICsgMHg5OCk7CisJX19yYXdfd3JpdGVsKChhZGRyWzVdIDw8IDgpIHwgYWRkcls0XSwgcmVncyArIDB4OWMpOworCWNsa19kaXNhYmxlKHBjbGspOworCWNsa19wdXQocGNsayk7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0MzJfdXNhcnRfbWFwWzFdOwordW5zaWduZWQgaW50IGF0MzJfbnJfdXNhcnRzID0gMTsKKwordm9pZCBfX2luaXQgc2V0dXBfYm9hcmQodm9pZCkKK3sKKwlhdDMyX21hcF91c2FydCgxLCAwKTsJLyogVVNBUlQgMTogL2Rldi90dHlTMCwgREI5ICovCisJYXQzMl9zZXR1cF9zZXJpYWxfY29uc29sZSgwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXRuZ3cxMDBfaW5pdCh2b2lkKQoreworCS8qCisJICogQVROR1cxMDAgdXNlcyAxNi1iaXQgU0RSQU0gaW50ZXJmYWNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisJICogcmVzZXJ2ZSBhbnkgcGlucyBmb3IgaXQuCisJICovCisKKwlhdDMyX2FkZF9zeXN0ZW1fZGV2aWNlcygpOworCisJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDApOworCisJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKKwlzZXRfaHdfYWRkcihhdDMyX2FkZF9kZXZpY2VfZXRoKDEsICZldGhfZGF0YVsxXSkpOworCisJYXQzMl9hZGRfZGV2aWNlX3NwaSgwLCBzcGkwX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMF9ib2FyZF9pbmZvKSk7CisKKwlyZXR1cm4gMDsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKGF0bmd3MTAwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDU5NzQ3NjguLmFiZTZjYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTMzLDcgKzMzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZXRoX2FkZHIgX19pbml0ZGF0YSBod19hZGRyWzJdOwogCiBzdGF0aWMgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgZXRoX2RhdGFbMl07Ci1leHRlcm4gc3RydWN0IGxjZGNfcGxhdGZvcm1fZGF0YSBhdHN0azEwMDBfZmIwX2RhdGE7CitzdGF0aWMgc3RydWN0IGxjZGNfcGxhdGZvcm1fZGF0YSBhdHN0azEwMDBfZmIwX2RhdGE7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpMF9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKIAl7CkBAIC0xNDgsNiArMTQ4LDggQEAKIAlzZXRfaHdfYWRkcihhdDMyX2FkZF9kZXZpY2VfZXRoKDAsICZldGhfZGF0YVswXSkpOwogCiAJYXQzMl9hZGRfZGV2aWNlX3NwaSgwLCBzcGkwX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMF9ib2FyZF9pbmZvKSk7CisJYXRzdGsxMDAwX2ZiMF9kYXRhLmZibWVtX3N0YXJ0ID0gZmJtZW1fc3RhcnQ7CisJYXRzdGsxMDAwX2ZiMF9kYXRhLmZibWVtX3NpemUgPSBmYm1lbV9zaXplOwogCWF0MzJfYWRkX2RldmljZV9sY2RjKDAsICZhdHN0azEwMDBfZmIwX2RhdGEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCmluZGV4IDI3MmMwMTEuLjJiYzRiODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCkBAIC0xOCwzMyArMTgsMyBAQAogCiAvKiBJbml0aWFsaXplZCBieSBib290bG9hZGVyLXNwZWNpZmljIHN0YXJ0dXAgY29kZS4gKi8KIHN0cnVjdCB0YWcgKmJvb3Rsb2FkZXJfdGFncyBfX2luaXRkYXRhOwotCi1zdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgYXRzdGsxMDAwX2ZiMF9kYXRhOwotCi12b2lkIF9faW5pdCBib2FyZF9zZXR1cF9mYm1lbSh1bnNpZ25lZCBsb25nIGZibWVtX3N0YXJ0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBmYm1lbV9zaXplKQotewotCWlmICghZmJtZW1fc2l6ZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFmYm1lbV9zdGFydCkgewotCQl2b2lkICpmYm1lbTsKLQotCQlmYm1lbSA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKGZibWVtX3NpemUpOwotCQlmYm1lbV9zdGFydCA9IF9fcGEoZmJtZW0pOwotCX0gZWxzZSB7Ci0JCXBnX2RhdGFfdCAqcGdkYXQ7Ci0KLQkJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7Ci0JCQlpZiAoZmJtZW1fc3RhcnQgPj0gcGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQKLQkJCSAgICAmJiBmYm1lbV9zdGFydCA8PSBwZ2RhdC0+YmRhdGEtPm5vZGVfbG93X3BmbikKLQkJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgZmJtZW1fc3RhcnQsCi0JCQkJCQkgICAgIGZibWVtX3NpemUpOwotCQl9Ci0JfQotCi0JcHJpbnRrKCIlbHVLaUIgZnJhbWVidWZmZXIgbWVtb3J5IGF0IGFkZHJlc3MgMHglMDhseFxuIiwKLQkgICAgICAgZmJtZW1fc2l6ZSA+PiAxMCwgZmJtZW1fc3RhcnQpOwotCWF0c3RrMTAwMF9mYjBfZGF0YS5mYm1lbV9zdGFydCA9IGZibWVtX3N0YXJ0OwotCWF0c3RrMTAwMF9mYjBfZGF0YS5mYm1lbV9zaXplID0gZmJtZW1fc2l6ZTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA4NSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNgorIyBUaHUgQXByIDEyIDE2OjM1OjA3IDIwMDcKKyMKK0NPTkZJR19BVlIzMj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfU0xBQj15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0xCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKKworIworIyBTeXN0ZW0gVHlwZSBhbmQgZmVhdHVyZXMKKyMKK0NPTkZJR19TVUJBUkNIX0FWUjMyQj15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QRVJGT1JNQU5DRV9DT1VOVEVSUz15CitDT05GSUdfUExBVEZPUk1fQVQzMkFQPXkKK0NPTkZJR19DUFVfQVQzMkFQNzAwMD15CisjIENPTkZJR19CT0FSRF9BVFNUSzEwMDAgaXMgbm90IHNldAorQ09ORklHX0JPQVJEX0FUTkdXMTAwPXkKK0NPTkZJR19MT0FERVJfVV9CT09UPXkKKworIworIyBBdG1lbCBBVlIzMiBBUCBvcHRpb25zCisjCisjIENPTkZJR19BUDcwMDBfMzJfQklUX1NNQyBpcyBub3Qgc2V0CitDT05GSUdfQVA3MDAwXzE2X0JJVF9TTUM9eQorIyBDT05GSUdfQVA3MDAwXzhfQklUX1NNQyBpcyBub3Qgc2V0CitDT05GSUdfTE9BRF9BRERSRVNTPTB4MTAwMDAwMDAKK0NPTkZJR19FTlRSWV9BRERSRVNTPTB4OTAwMDAwMDAKK0NPTkZJR19QSFlTX09GRlNFVD0weDEwMDAwMDAwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BUkNIX0JPT1RNRU1fTk9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBVkVfTUVNT1JZX1BSRVNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTkVFRF9OT0RFX01FTU1BUF9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKKyMgQ09ORklHX09XTkVSU0hJUF9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfQ01ETElORT0iIgorCisjCisjIEJ1cyBvcHRpb25zCisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj15CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPXkKKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorIyBDT05GSUdfSVBfUElNU01fVjIgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9eQorQ09ORklHX0lORVRfRVNQPXkKK0NPTkZJR19JTkVUX0lQQ09NUD15CitDT05GSUdfSU5FVF9YRlJNX1RVTk5FTD15CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorCisjCisjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfQUg9eQorQ09ORklHX0lORVQ2X0VTUD15CitDT05GSUdfSU5FVDZfSVBDT01QPXkKKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUw9eQorQ09ORklHX0lORVQ2X1RVTk5FTD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD15CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9DT05OVFJBQ0tfRU5BQkxFRD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1NVUFBPUlQ9eQorIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX05GX0NPTk5UUkFDSz1tCitDT05GSUdfTkZfQ1RfQUNDVD15CitDT05GSUdfTkZfQ09OTlRSQUNLX01BUks9eQorIyBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUyBpcyBub3Qgc2V0CitDT05GSUdfTkZfQ1RfUFJPVE9fR1JFPW0KKyMgQ09ORklHX05GX0NUX1BST1RPX1NDVFAgaXMgbm90IHNldAorQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQorQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BQVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19TQU5FPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCitDT05GSUdfTkVURklMVEVSX1hUQUJMRVM9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1AgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1AgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfSVBSQU5HRT1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQorQ09ORklHX0lQX05GX01BVENIX0VDTj1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQorQ09ORklHX0lQX05GX01BVENIX1RUTD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfT1dORVI9bQorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0cgaXMgbm90IHNldAorQ09ORklHX05GX05BVD1tCitDT05GSUdfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUU9bQorQ09ORklHX05GX05BVF9TTk1QX0JBU0lDPW0KK0NPTkZJR19ORl9OQVRfUFJPVE9fR1JFPW0KK0NPTkZJR19ORl9OQVRfRlRQPW0KK0NPTkZJR19ORl9OQVRfSVJDPW0KK0NPTkZJR19ORl9OQVRfVEZUUD1tCitDT05GSUdfTkZfTkFUX0FNQU5EQT1tCitDT05GSUdfTkZfTkFUX1BQVFA9bQorQ09ORklHX05GX05BVF9IMzIzPW0KK0NPTkZJR19ORl9OQVRfU0lQPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQorQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorCisjCisjIElQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCitDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQorQ09ORklHX0lQNl9ORl9RVUVVRT1tCitDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfUlQ9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz1tCitDT05GSUdfSVA2X05GX01BVENIX0hMPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfT1dORVI9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9NSD1tCitDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KK0NPTkZJR19JUDZfTkZfRklMVEVSPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQNl9ORl9NQU5HTEU9bQorQ09ORklHX0lQNl9ORl9UQVJHRVRfSEw9bQorQ09ORklHX0lQNl9ORl9SQVc9bQorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CitDT05GSUdfVkxBTl84MDIxUT1tCisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1JPVVRFPXkKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ODAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfREFUQUZMQVNIPXkKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTkJEPW0KK0NPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19NQUNCPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0ZJTFRFUj15CitDT05GSUdfUFBQX0FTWU5DPW0KKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0RFRkxBVEU9bQorQ09ORklHX1BQUF9CU0RDT01QPW0KK0NPTkZJR19QUFBfTVBQRT1tCitDT05GSUdfUFBQT0U9bQorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CitDT05GSUdfU0xIQz1tCisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0FUTUVMPXkKK0NPTkZJR19TRVJJQUxfQVRNRUxfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQVRNRUxfVFRZQVQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCitDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX01BU1RFUj15CisKKyMKKyMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19TUElfQVRNRUw9eQorIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorCisjCisjIFNQSSBQcm90b2NvbCBNYXN0ZXJzCisjCisjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCisjIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKKyMKKworIworIyBWaXJ0dWFsaXphdGlvbgorIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorQ09ORklHX0ZVU0VfRlM9bQorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODUwCitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfQ0lGUz1tCisjIENPTkZJR19DSUZTX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PXkKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0ZPUkNFRF9JTkxJTklORyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX0hNQUM9eQorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX1NIQTE9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCitDT05GSUdfQ1JZUFRPX0NCQz15CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FSQzQ9bQorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVGTEFURT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfVEVYVFNFQVJDSD15CitDT05GSUdfVEVYVFNFQVJDSF9LTVA9bQorQ09ORklHX1RFWFRTRUFSQ0hfQk09bQorQ09ORklHX1RFWFRTRUFSQ0hfRlNNPW0KK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKaW5kZXggMmU3MmZkMi4uMjcxNGNmNiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKQEAgLTIwOSwxNiArMjA5LDE3IEBACiB2b2lkIF9faW5pdCBzZXR1cF9wcm9jZXNzb3Iodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZzAsIGNvbmZpZzE7CisJdW5zaWduZWQgbG9uZyBmZWF0dXJlczsKIAl1bnNpZ25lZCBjcHVfaWQsIGNwdV9yZXYsIGFyY2hfaWQsIGFyY2hfcmV2LCBtbXVfdHlwZTsKIAl1bnNpZ25lZCB0bXA7CiAKLQljb25maWcwID0gc3lzcmVnX3JlYWQoQ09ORklHMCk7IC8qIDB4MDAwMDAxM2U7ICovCi0JY29uZmlnMSA9IHN5c3JlZ19yZWFkKENPTkZJRzEpOyAvKiAweDAxZjY4OWEyOyAqLwotCWNwdV9pZCA9IGNvbmZpZzAgPj4gMjQ7Ci0JY3B1X3JldiA9IChjb25maWcwID4+IDE2KSAmIDB4ZmY7Ci0JYXJjaF9pZCA9IChjb25maWcwID4+IDEzKSAmIDB4MDc7Ci0JYXJjaF9yZXYgPSAoY29uZmlnMCA+PiAxMCkgJiAweDA3OwotCW1tdV90eXBlID0gKGNvbmZpZzAgPj4gNykgJiAweDAzOworCWNvbmZpZzAgPSBzeXNyZWdfcmVhZChDT05GSUcwKTsKKwljb25maWcxID0gc3lzcmVnX3JlYWQoQ09ORklHMSk7CisJY3B1X2lkID0gU1lTUkVHX0JGRVhUKFBST0NFU1NPUklELCBjb25maWcwKTsKKwljcHVfcmV2ID0gU1lTUkVHX0JGRVhUKFBST0NFU1NPUlJFVklTSU9OLCBjb25maWcwKTsKKwlhcmNoX2lkID0gU1lTUkVHX0JGRVhUKEFULCBjb25maWcwKTsKKwlhcmNoX3JldiA9IFNZU1JFR19CRkVYVChBUiwgY29uZmlnMCk7CisJbW11X3R5cGUgPSBTWVNSRUdfQkZFWFQoTU1VVCwgY29uZmlnMCk7CiAKIAlib290X2NwdV9kYXRhLmFyY2hfdHlwZSA9IGFyY2hfaWQ7CiAJYm9vdF9jcHVfZGF0YS5jcHVfdHlwZSA9IGNwdV9pZDsKQEAgLTIyNiwxNiArMjI3LDE2IEBACiAJYm9vdF9jcHVfZGF0YS5jcHVfcmV2aXNpb24gPSBjcHVfcmV2OwogCWJvb3RfY3B1X2RhdGEudGxiX2NvbmZpZyA9IG1tdV90eXBlOwogCi0JdG1wID0gKGNvbmZpZzEgPj4gMTMpICYgMHgwNzsKKwl0bXAgPSBTWVNSRUdfQkZFWFQoSUxTWiwgY29uZmlnMSk7CiAJaWYgKHRtcCkgewotCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gMSA8PCAoKGNvbmZpZzEgPj4gMTApICYgMHgwNyk7Ci0JCWJvb3RfY3B1X2RhdGEuaWNhY2hlLnNldHMgPSAxIDw8ICgoY29uZmlnMSA+PiAxNikgJiAweDBmKTsKKwkJYm9vdF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDEgPDwgU1lTUkVHX0JGRVhUKElBU1MsIGNvbmZpZzEpOworCQlib290X2NwdV9kYXRhLmljYWNoZS5zZXRzID0gMSA8PCBTWVNSRUdfQkZFWFQoSVNFVCwgY29uZmlnMSk7CiAJCWJvb3RfY3B1X2RhdGEuaWNhY2hlLmxpbmVzeiA9IDEgPDwgKHRtcCArIDEpOwogCX0KLQl0bXAgPSAoY29uZmlnMSA+PiAzKSAmIDB4MDc7CisJdG1wID0gU1lTUkVHX0JGRVhUKERMU1osIGNvbmZpZzEpOwogCWlmICh0bXApIHsKLQkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDEgPDwgKGNvbmZpZzEgJiAweDA3KTsKLQkJYm9vdF9jcHVfZGF0YS5kY2FjaGUuc2V0cyA9IDEgPDwgKChjb25maWcxID4+IDYpICYgMHgwZik7CisJCWJvb3RfY3B1X2RhdGEuZGNhY2hlLndheXMgPSAxIDw8IFNZU1JFR19CRkVYVChEQVNTLCBjb25maWcxKTsKKwkJYm9vdF9jcHVfZGF0YS5kY2FjaGUuc2V0cyA9IDEgPDwgU1lTUkVHX0JGRVhUKERTRVQsIGNvbmZpZzEpOwogCQlib290X2NwdV9kYXRhLmRjYWNoZS5saW5lc3ogPSAxIDw8ICh0bXAgKyAxKTsKIAl9CiAKQEAgLTI1MCwxNiArMjUxLDM5IEBACiAJCWNwdV9uYW1lc1tjcHVfaWRdLCBjcHVfaWQsIGNwdV9yZXYsCiAJCWFyY2hfbmFtZXNbYXJjaF9pZF0sIGFyY2hfcmV2KTsKIAlwcmludGsgKCJDUFU6IE1NVSBjb25maWd1cmF0aW9uOiAlc1xuIiwgbW11X3R5cGVzW21tdV90eXBlXSk7CisKIAlwcmludGsgKCJDUFU6IGZlYXR1cmVzOiIpOwotCWlmIChjb25maWcwICYgKDEgPDwgNikpCi0JCXByaW50aygiIGZwdSIpOwotCWlmIChjb25maWcwICYgKDEgPDwgNSkpCi0JCXByaW50aygiIGphdmEiKTsKLQlpZiAoY29uZmlnMCAmICgxIDw8IDQpKQotCQlwcmludGsoIiBwZXJmY3RyIik7Ci0JaWYgKGNvbmZpZzAgJiAoMSA8PCAzKSkKKwlmZWF0dXJlcyA9IDA7CisJaWYgKGNvbmZpZzAgJiBTWVNSRUdfQklUKENPTkZJRzBfUikpIHsKKwkJZmVhdHVyZXMgfD0gQVZSMzJfRkVBVFVSRV9STVc7CisJCXByaW50aygiIHJtdyIpOworCX0KKwlpZiAoY29uZmlnMCAmIFNZU1JFR19CSVQoQ09ORklHMF9EKSkgeworCQlmZWF0dXJlcyB8PSBBVlIzMl9GRUFUVVJFX0RTUDsKKwkJcHJpbnRrKCIgZHNwIik7CisJfQorCWlmIChjb25maWcwICYgU1lTUkVHX0JJVChDT05GSUcwX1MpKSB7CisJCWZlYXR1cmVzIHw9IEFWUjMyX0ZFQVRVUkVfU0lNRDsKKwkJcHJpbnRrKCIgc2ltZCIpOworCX0KKwlpZiAoY29uZmlnMCAmIFNZU1JFR19CSVQoQ09ORklHMF9PKSkgeworCQlmZWF0dXJlcyB8PSBBVlIzMl9GRUFUVVJFX09DRDsKIAkJcHJpbnRrKCIgb2NkIik7CisJfQorCWlmIChjb25maWcwICYgU1lTUkVHX0JJVChDT05GSUcwX1ApKSB7CisJCWZlYXR1cmVzIHw9IEFWUjMyX0ZFQVRVUkVfUENUUjsKKwkJcHJpbnRrKCIgcGVyZmN0ciIpOworCX0KKwlpZiAoY29uZmlnMCAmIFNZU1JFR19CSVQoQ09ORklHMF9KKSkgeworCQlmZWF0dXJlcyB8PSBBVlIzMl9GRUFUVVJFX0pBVkE7CisJCXByaW50aygiIGphdmEiKTsKKwl9CisJaWYgKGNvbmZpZzAgJiBTWVNSRUdfQklUKENPTkZJRzBfRikpIHsKKwkJZmVhdHVyZXMgfD0gQVZSMzJfRkVBVFVSRV9GUFU7CisJCXByaW50aygiIGZwdSIpOworCX0KIAlwcmludGsoIlxuIik7CisJYm9vdF9jcHVfZGF0YS5mZWF0dXJlcyA9IGZlYXR1cmVzOwogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2VudHJ5LWF2cjMyYi5TIGIvYXJjaC9hdnIzMi9rZXJuZWwvZW50cnktYXZyMzJiLlMKaW5kZXggZWViNjY3OS4uNDI2NTdmMSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvZW50cnktYXZyMzJiLlMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvZW50cnktYXZyMzJiLlMKQEAgLTEwMCw1NSArMTAwLDQ5IEBACiAKIAkuZ2xvYmFsCXRsYl9taXNzX2NvbW1vbgogdGxiX21pc3NfY29tbW9uOgotCW1mc3IJcjAsIFNZU1JFR19QVEJSCi0JbWZzcglyMSwgU1lTUkVHX1RMQkVBUgorCW1mc3IJcjAsIFNZU1JFR19UTEJFQVIKKwltZnNyCXIxLCBTWVNSRUdfUFRCUgogCiAJLyogSXMgaXQgdGhlIHZtYWxsb2Mgc3BhY2U/ICovCi0JYmxkCXIxLCAzMQorCWJsZAlyMCwgMzEKIAlicmNzCWhhbmRsZV92bWFsbG9jX21pc3MKIAogCS8qIEZpcnN0IGxldmVsIGxvb2t1cCAqLwogcGd0YmxfbG9va3VwOgotCWxzcglyMiwgcjEsIFBHRElSX1NISUZUCi0JbGQudwlyMCwgcjBbcjIgPDwgMl0KLQlibGQJcjAsIF9QQUdFX0JJVF9QUkVTRU5UCisJbHNyCXIyLCByMCwgUEdESVJfU0hJRlQKKwlsZC53CXIzLCByMVtyMiA8PCAyXQorCWJmZXh0dQlyMSwgcjAsIFBBR0VfU0hJRlQsIFBHRElSX1NISUZUIC0gUEFHRV9TSElGVAorCWJsZAlyMywgX1BBR0VfQklUX1BSRVNFTlQKIAlicmNjCXBhZ2VfdGFibGVfbm90X3ByZXNlbnQKIAotCS8qIFRPRE86IENoZWNrIGFjY2VzcyByaWdodHMgb24gcGFnZSB0YWJsZSBpZiBuZWNlc3NhcnkgKi8KLQogCS8qIFRyYW5zbGF0ZSB0byB2aXJ0dWFsIGFkZHJlc3MgaW4gUDEuICovCi0JYW5kbAlyMCwgMHhmMDAwCi0Jc2JyCXIwLCAzMQorCWFuZGwJcjMsIDB4ZjAwMAorCXNicglyMywgMzEKIAogCS8qIFNlY29uZCBsZXZlbCBsb29rdXAgKi8KLQlsc2wJcjEsICgzMiAtIFBHRElSX1NISUZUKQotCWxzcglyMSwgKDMyIC0gUEdESVJfU0hJRlQpICsgUEFHRV9TSElGVAotCWFkZAlyMiwgcjAsIHIxIDw8IDIKLQlsZC53CXIxLCByMlswXQotCWJsZAlyMSwgX1BBR0VfQklUX1BSRVNFTlQKKwlsZC53CXIyLCByM1tyMSA8PCAyXQorCW1mc3IJcjAsIFNZU1JFR19UTEJBUkxPCisJYmxkCXIyLCBfUEFHRV9CSVRfUFJFU0VOVAogCWJyY2MJcGFnZV9ub3RfcHJlc2VudAogCiAJLyogTWFyayB0aGUgcGFnZSBhcyBhY2Nlc3NlZCAqLwotCXNicglyMSwgX1BBR0VfQklUX0FDQ0VTU0VECi0Jc3QudwlyMlswXSwgcjEKKwlzYnIJcjIsIF9QQUdFX0JJVF9BQ0NFU1NFRAorCXN0LncJcjNbcjEgPDwgMl0sIHIyCiAKIAkvKiBEcm9wIHNvZnR3YXJlIGZsYWdzICovCi0JYW5kbAlyMSwgX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSyAmIDB4ZmZmZgotCW10c3IJU1lTUkVHX1RMQkVMTywgcjEKKwlhbmRsCXIyLCBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLICYgMHhmZmZmCisJbXRzcglTWVNSRUdfVExCRUxPLCByMgogCiAJLyogRmlndXJlIG91dCB3aGljaCBlbnRyeSB3ZSB3YW50IHRvIHJlcGxhY2UgKi8KLQltZnNyCXIwLCBTWVNSRUdfVExCQVJMTworCW1mc3IJcjEsIFNZU1JFR19NTVVDUgogCWNseglyMiwgcjAKIAlicmNjCTFmCi0JbW92CXIxLCAtMQkJCS8qIEFsbCBlbnRyaWVzIGhhdmUgYmVlbiBhY2Nlc3NlZCwgKi8KLQltdHNyCVNZU1JFR19UTEJBUkxPLCByMQkvKiBzbyByZXNldCBUTEJBUiAqLwotCW1vdglyMiwgMAkJCS8qIGFuZCBzdGFydCBhdCAwICovCi0xOgltZnNyCXIxLCBTWVNSRUdfTU1VQ1IKLQlsc2wJcjIsIDE0Ci0JYW5kbAlyMSwgMHgzZmZmLCBDT0gKLQlvcglyMSwgcjIKLQltdHNyCVNZU1JFR19NTVVDUiwgcjEKKwltb3YJcjMsIC0xCQkJLyogQWxsIGVudHJpZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkLCAqLworCW1vdglyMiwgMAkJCS8qIHNvIHN0YXJ0IGF0IDAgKi8KKwltdHNyCVNZU1JFR19UTEJBUkxPLCByMwkvKiBhbmQgcmVzZXQgVExCQVIgKi8KIAorMToJYmZpbnMJcjEsIHIyLCBTWVNSRUdfRFJQX09GRlNFVCwgU1lTUkVHX0RSUF9TSVpFCisJbXRzcglTWVNSRUdfTU1VQ1IsIHIxCiAJdGxidwogCiAJdGxibWlzc19yZXN0b3JlCkBAIC0xNTYsOCArMTUwLDggQEAKIAogaGFuZGxlX3ZtYWxsb2NfbWlzczoKIAkvKiBTaW1wbHkgZG8gdGhlIGxvb2t1cCBpbiBpbml0J3MgcGFnZSB0YWJsZSAqLwotCW1vdglyMCwgbG8oc3dhcHBlcl9wZ19kaXIpCi0Jb3JoCXIwLCBoaShzd2FwcGVyX3BnX2RpcikKKwltb3YJcjEsIGxvKHN3YXBwZXJfcGdfZGlyKQorCW9yaAlyMSwgaGkoc3dhcHBlcl9wZ19kaXIpCiAJcmptcAlwZ3RibF9sb29rdXAKIAogCkBAIC0zNDAsMTIgKzMzNCwzNCBAQAogZG9fbm1pX2xsOgogCXN1YglzcCwgNAogCXN0bXRzCS0tc3AsIHIwLWxyCi0JLyogRklYTUU6IE1ha2Ugc3VyZSBSQVJfTk1JIGFuZCBSU1JfTk1JIGFyZSBwdXNoZWQgaW5zdGVhZCBvZiAqX0VYICovCi0JcmNhbGwJc2F2ZV9mdWxsX2NvbnRleHRfZXgKKwltZnNyCXI5LCBTWVNSRUdfUlNSX05NSQorCW1mc3IJcjgsIFNZU1JFR19SQVJfTk1JCisJYmZleHR1CXIwLCByOSwgTU9ERV9TSElGVCwgMworCWJybmUJMmYKKworMToJcHVzaG0JcjgsIHI5CS8qIFBDIGFuZCBTUiAqLwogCW1mc3IJcjEyLCBTWVNSRUdfRUNSCiAJbW92CXIxMSwgc3AKIAlyY2FsbAlkb19ubWkKLQlyam1wCWJhZF9yZXR1cm4KKwlwb3BtCXI4LXI5CisJbXRzcglTWVNSRUdfUkFSX05NSSwgcjgKKwl0c3QJcjAsIHIwCisJbXRzcglTWVNSRUdfUlNSX05NSSwgcjkKKwlicm5lCTNmCisKKwlsZG10cwlzcCsrLCByMC1scgorCXN1YglzcCwgLTQJCS8qIHNraXAgcjEyX29yaWcgKi8KKwlyZXRlCisKKzI6CXN1YglyMTAsIHNwLCAtKEZSQU1FX1NJWkVfRlVMTCAtIFJFR19MUikKKwlzdGRzcAlzcFs0XSwgcjEwCS8qIHJlcGxhY2Ugc2F2ZWQgU1AgKi8KKwlyam1wCTFiCisKKzM6CXBvcG0JbHIKKwlzdWIJc3AsIC00CQkvKiBza2lwIHNwICovCisJcG9wbQlyMC1yMTIKKwlzdWIJc3AsIC00CQkvKiBza2lwIHIxMl9vcmlnICovCisJcmV0ZQogCiBoYW5kbGVfYWRkcmVzc19mYXVsdDoKIAlzdWIJc3AsIDQKQEAgLTYzMCw5ICs2NDYsMTIgQEAKIAlyY2FsbAlkb19JUlEKIAogCWxkZHNwCXI0LCBzcFtSRUdfU1JdCi0JYW5kaAlyNCwgKE1PREVfTUFTSyA+PiAxNiksIENPSAorCWJmZXh0dQlyNCwgcjQsIFNZU1JFR19NMF9PRkZTRVQsIDMKKwljcC53CXI0LCBNT0RFX1NVUEVSVklTT1IgPj4gU1lTUkVHX00wX09GRlNFVAorCWJyZXEJMmYKKwljcC53CXI0LCBNT0RFX1VTRVIgPj4gU1lTUkVHX00wX09GRlNFVAogI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JYnJuZQkyZgorCWJybmUJM2YKICNlbHNlCiAJYnJuZQkxZgogI2VuZGlmCkBAIC02NDksOSArNjY4LDE4IEBACiAJc3ViCXNwLCAtNAkJLyogaWdub3JlIHIxMl9vcmlnICovCiAJcmV0ZQogCisyOglnZXRfdGhyZWFkX2luZm8JcjAKKwlsZC53CXIxLCByMFtUSV9mbGFnc10KKwlibGQJcjEsIFRJRl9DUFVfR09JTkdfVE9fU0xFRVAKICNpZmRlZiBDT05GSUdfUFJFRU1QVAotMjoKLQlnZXRfdGhyZWFkX2luZm8JcjAKKwlicmNjCTNmCisjZWxzZQorCWJyY2MJMWIKKyNlbmRpZgorCXN1YglyMSwgcGMsIC4gLSBjcHVfaWRsZV9za2lwX3NsZWVwCisJc3Rkc3AJc3BbUkVHX1BDXSwgcjEKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorMzoJZ2V0X3RocmVhZF9pbmZvIHIwCiAJbGQudwlyMiwgcjBbVElfcHJlZW1wdF9jb3VudF0KIAljcC53CXIyLCAwCiAJYnJuZQkxYgpAQCAtNjYyLDEyICs2OTAsMzIgQEAKIAlibGQJcjQsIFNZU1JFR19HTV9PRkZTRVQKIAlicmNzCTFiCiAJcmNhbGwJcHJlZW1wdF9zY2hlZHVsZV9pcnEKLQlyam1wCTFiCiAjZW5kaWYKKwlyam1wCTFiCiAJLmVuZG0KIAogCS5zZWN0aW9uIC5pcnEudGV4dCwiYXgiLEBwcm9nYml0cwogCisuZ2xvYmFsIGNwdV9pZGxlX3NsZWVwCitjcHVfaWRsZV9zbGVlcDoKKwltYXNrX2ludGVycnVwdHMKKwlnZXRfdGhyZWFkX2luZm8gcjgKKwlsZC53CXI5LCByOFtUSV9mbGFnc10KKwlibGQJcjksIFRJRl9ORUVEX1JFU0NIRUQKKwlicmNzCWNwdV9pZGxlX2VuYWJsZV9pbnRfYW5kX2V4aXQKKwlzYnIJcjksIFRJRl9DUFVfR09JTkdfVE9fU0xFRVAKKwlzdC53CXI4W1RJX2ZsYWdzXSwgcjkKKwl1bm1hc2tfaW50ZXJydXB0cworCXNsZWVwIDAKK2NwdV9pZGxlX3NraXBfc2xlZXA6CisJbWFza19pbnRlcnJ1cHRzCisJbGQudwlyOSwgcjhbVElfZmxhZ3NdCisJY2JyCXI5LCBUSUZfQ1BVX0dPSU5HX1RPX1NMRUVQCisJc3QudwlyOFtUSV9mbGFnc10sIHI5CitjcHVfaWRsZV9lbmFibGVfaW50X2FuZF9leGl0OgorCXVubWFza19pbnRlcnJ1cHRzCisJcmV0YWwJcjEyCisKIAkuZ2xvYmFsCWlycV9sZXZlbDAKIAkuZ2xvYmFsCWlycV9sZXZlbDEKIAkuZ2xvYmFsCWlycV9sZXZlbDIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYjU5OWVhZS4uMTE2N2ZlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jCkBAIC0xMiwxMCArMTIsMTEgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCkBAIC0zMTUsMTAgKzMxNiwxMCBAQAogCXZmcmVlKG1vZHVsZS0+YXJjaC5zeW1pbmZvKTsKIAltb2R1bGUtPmFyY2guc3ltaW5mbyA9IE5VTEw7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1vZHVsZSk7CiB9CiAKIHZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCiB7Ci0KKwltb2R1bGVfYnVnX2NsZWFudXAobW9kdWxlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwYjQzMjU5Li40ZTQxODFlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CkBAIC0xOSw2ICsyMCw4IEBACiB2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKSA9IE5VTEw7CiBFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CiAKK2V4dGVybiB2b2lkIGNwdV9pZGxlX3NsZWVwKHZvaWQpOworCiAvKgogICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCiAgKi8KQEAgLTI3LDkgKzMwLDggQEAKIHsKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwogCXdoaWxlICgxKSB7Ci0JCS8qIFRPRE86IEVudGVyIHNsZWVwIG1vZGUgKi8KIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCWNwdV9yZWxheCgpOworCQkJY3B1X2lkbGVfc2xlZXAoKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTExNCwzOSArMTE2LDE3OCBAQAogCS8qIGRvIG5vdGhpbmcgKi8KIH0KIAorc3RhdGljIHZvaWQgZHVtcF9tZW0oY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpsb2dfbHZsLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYm90dG9tLCB1bnNpZ25lZCBsb25nIHRvcCkKK3sKKwl1bnNpZ25lZCBsb25nIHA7CisJaW50IGk7CisKKwlwcmludGsoIiVzJXMoMHglMDhseCB0byAweCUwOGx4KVxuIiwgbG9nX2x2bCwgc3RyLCBib3R0b20sIHRvcCk7CisKKwlmb3IgKHAgPSBib3R0b20gJiB+MzE7IHAgPCB0b3A7ICkgeworCQlwcmludGsoIiVzJTA0bHg6ICIsIGxvZ19sdmwsIHAgJiAweGZmZmYpOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHAgKz0gNCkgeworCQkJdW5zaWduZWQgaW50IHZhbDsKKworCQkJaWYgKHAgPCBib3R0b20gfHwgcCA+PSB0b3ApCisJCQkJcHJpbnRrKCIgICAgICAgICAiKTsKKwkJCWVsc2UgeworCQkJCWlmIChfX2dldF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilwKSkgeworCQkJCQlwcmludGsoIlxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlwcmludGsoIiUwOHggIiwgdmFsKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdW5zaWduZWQgbG9uZyBwKQoreworCXJldHVybiAocCA+ICh1bnNpZ25lZCBsb25nKXRpbmZvKQorCQkmJiAocCA8ICh1bnNpZ25lZCBsb25nKXRpbmZvICsgVEhSRUFEX1NJWkUgLSAzKTsKK30KKworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCitzdGF0aWMgdm9pZCBzaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpsb2dfbHZsKQoreworCXVuc2lnbmVkIGxvbmcgbHIsIGZwOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm87CisKKwlpZiAocmVncykKKwkJZnAgPSByZWdzLT5yNzsKKwllbHNlIGlmICh0c2sgPT0gY3VycmVudCkKKwkJYXNtKCJtb3YgJTAsIHI3IiA6ICI9ciIoZnApKTsKKwllbHNlCisJCWZwID0gdHNrLT50aHJlYWQuY3B1X2NvbnRleHQucjc7CisKKwkvKgorCSAqIFdhbGsgdGhlIHN0YWNrIGFzIGxvbmcgYXMgdGhlIGZyYW1lIHBvaW50ZXIgKGEpIGlzIHdpdGhpbgorCSAqIHRoZSBrZXJuZWwgc3RhY2sgb2YgdGhlIHRhc2ssIGFuZCAoYikgaXQgZG9lc24ndCBtb3ZlCisJICogZG93bndhcmRzLgorCSAqLworCXRpbmZvID0gdGFza190aHJlYWRfaW5mbyh0c2spOworCXByaW50aygiJXNDYWxsIHRyYWNlOlxuIiwgbG9nX2x2bCk7CisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgZnApKSB7CisJCXVuc2lnbmVkIGxvbmcgbmV3X2ZwOworCisJCWxyID0gKih1bnNpZ25lZCBsb25nICopZnA7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJCXByaW50aygiJXMgWzwlMDhseD5dICIsIGxvZ19sdmwsIGxyKTsKKyNlbHNlCisJCXByaW50aygiIFs8JTA4bHg+XSAiLCBscik7CisjZW5kaWYKKwkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgbHIpOworCisJCW5ld19mcCA9ICoodW5zaWduZWQgbG9uZyAqKShmcCArIDQpOworCQlpZiAobmV3X2ZwIDw9IGZwKQorCQkJYnJlYWs7CisJCWZwID0gbmV3X2ZwOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgY2hhciAqbG9nX2x2bCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlwcmludGsoIiVzQ2FsbCB0cmFjZTpcbiIsIGxvZ19sdmwpOworCisJd2hpbGUgKCFrc3RhY2tfZW5kKHNwKSkgeworCQlhZGRyID0gKnNwKys7CisJCWlmIChrZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJCQlwcmludGsoIiVzIFs8JTA4bHg+XSAiLCBsb2dfbHZsLCBhZGRyKTsKKyNlbHNlCisJCQlwcmludGsoIiBbPCUwOGx4Pl0gIiwgYWRkcik7CisjZW5kaWYKKwkJCXByaW50X3N5bWJvbCgiJXNcbiIsIGFkZHIpOworCQl9CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCit2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBzcCwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpsb2dfbHZsKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm87CisKKwlpZiAoc3AgPT0gMCkgeworCQlpZiAodHNrKQorCQkJc3AgPSB0c2stPnRocmVhZC5jcHVfY29udGV4dC5rc3A7CisJCWVsc2UKKwkJCXNwID0gKHVuc2lnbmVkIGxvbmcpJnRpbmZvOworCX0KKwlpZiAoIXRzaykKKwkJdHNrID0gY3VycmVudDsKKworCXRpbmZvID0gdGFza190aHJlYWRfaW5mbyh0c2spOworCisJaWYgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgc3ApKSB7CisJCWR1bXBfbWVtKCJTdGFjazogIiwgbG9nX2x2bCwgc3AsCisJCQkgVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZyl0aW5mbyk7CisJCXNob3dfdHJhY2VfbG9nX2x2bCh0c2ssICh1bnNpZ25lZCBsb25nICopc3AsIHJlZ3MsIGxvZ19sdmwpOworCX0KK30KKwordm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKK3sKKwlzaG93X3N0YWNrX2xvZ19sdmwodHNrLCAodW5zaWduZWQgbG9uZylzdGFjaywgTlVMTCwgIiIpOworfQorCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc2hvd190cmFjZV9sb2dfbHZsKGN1cnJlbnQsICZzdGFjaywgTlVMTCwgIiIpOworfQorRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9tb2Rlc1tdID0gewogCSJBcHBsaWNhdGlvbiIsICJTdXBlcnZpc29yIiwgIkludGVycnVwdCBsZXZlbCAwIiwgIkludGVycnVwdCBsZXZlbCAxIiwKIAkiSW50ZXJydXB0IGxldmVsIDIiLCAiSW50ZXJydXB0IGxldmVsIDMiLCAiRXhjZXB0aW9uIiwgIk5NSSIKIH07CiAKLXZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBzaG93X3JlZ3NfbG9nX2x2bChzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgY2hhciAqbG9nX2x2bCkKIHsKIAl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+c3A7CiAJdW5zaWduZWQgbG9uZyBsciA9IHJlZ3MtPmxyOwogCXVuc2lnbmVkIGxvbmcgbW9kZSA9IChyZWdzLT5zciAmIE1PREVfTUFTSykgPj4gTU9ERV9TSElGVDsKIAotCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CiAJCXNwID0gKHVuc2lnbmVkIGxvbmcpcmVncyArIEZSQU1FX1NJWkVfRlVMTDsKIAotCXByaW50X3N5bWJvbCgiUEMgaXMgYXQgJXNcbiIsIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykpOwotCXByaW50X3N5bWJvbCgiTFIgaXMgYXQgJXNcbiIsIGxyKTsKLQlwcmludGsoInBjIDogWzwlMDhseD5dICAgIGxyIDogWzwlMDhseD5dICAgICVzXG4iCi0JICAgICAgICJzcCA6ICUwOGx4ICByMTI6ICUwOGx4ICByMTE6ICUwOGx4XG4iLAotCSAgICAgICBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLAotCSAgICAgICBsciwgcHJpbnRfdGFpbnRlZCgpLCBzcCwgcmVncy0+cjEyLCByZWdzLT5yMTEpOwotCXByaW50aygicjEwOiAlMDhseCAgcjkgOiAlMDhseCAgcjggOiAlMDhseFxuIiwKLQkgICAgICAgcmVncy0+cjEwLCByZWdzLT5yOSwgcmVncy0+cjgpOwotCXByaW50aygicjcgOiAlMDhseCAgcjYgOiAlMDhseCAgcjUgOiAlMDhseCAgcjQgOiAlMDhseFxuIiwKLQkgICAgICAgcmVncy0+cjcsIHJlZ3MtPnI2LCByZWdzLT5yNSwgcmVncy0+cjQpOwotCXByaW50aygicjMgOiAlMDhseCAgcjIgOiAlMDhseCAgcjEgOiAlMDhseCAgcjAgOiAlMDhseFxuIiwKLQkgICAgICAgcmVncy0+cjMsIHJlZ3MtPnIyLCByZWdzLT5yMSwgcmVncy0+cjApOwotCXByaW50aygiRmxhZ3M6ICVjJWMlYyVjJWNcbiIsCisJCXByaW50aygiJXMiLCBsb2dfbHZsKTsKKwkJcHJpbnRfc3ltYm9sKCJQQyBpcyBhdCAlc1xuIiwgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7CisJCXByaW50aygiJXMiLCBsb2dfbHZsKTsKKwkJcHJpbnRfc3ltYm9sKCJMUiBpcyBhdCAlc1xuIiwgbHIpOworCX0KKworCXByaW50aygiJXNwYyA6IFs8JTA4bHg+XSAgICBsciA6IFs8JTA4bHg+XSAgICAlc1xuIgorCSAgICAgICAiJXNzcCA6ICUwOGx4ICByMTI6ICUwOGx4ICByMTE6ICUwOGx4XG4iLAorCSAgICAgICBsb2dfbHZsLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLCBsciwgcHJpbnRfdGFpbnRlZCgpLAorCSAgICAgICBsb2dfbHZsLCBzcCwgcmVncy0+cjEyLCByZWdzLT5yMTEpOworCXByaW50aygiJXNyMTA6ICUwOGx4ICByOSA6ICUwOGx4ICByOCA6ICUwOGx4XG4iLAorCSAgICAgICBsb2dfbHZsLCByZWdzLT5yMTAsIHJlZ3MtPnI5LCByZWdzLT5yOCk7CisJcHJpbnRrKCIlc3I3IDogJTA4bHggIHI2IDogJTA4bHggIHI1IDogJTA4bHggIHI0IDogJTA4bHhcbiIsCisJICAgICAgIGxvZ19sdmwsIHJlZ3MtPnI3LCByZWdzLT5yNiwgcmVncy0+cjUsIHJlZ3MtPnI0KTsKKwlwcmludGsoIiVzcjMgOiAlMDhseCAgcjIgOiAlMDhseCAgcjEgOiAlMDhseCAgcjAgOiAlMDhseFxuIiwKKwkgICAgICAgbG9nX2x2bCwgcmVncy0+cjMsIHJlZ3MtPnIyLCByZWdzLT5yMSwgcmVncy0+cjApOworCXByaW50aygiJXNGbGFnczogJWMlYyVjJWMlY1xuIiwgbG9nX2x2bCwKIAkgICAgICAgcmVncy0+c3IgJiBTUl9RID8gJ1EnIDogJ3EnLAogCSAgICAgICByZWdzLT5zciAmIFNSX1YgPyAnVicgOiAndicsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfTiA/ICdOJyA6ICduJywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9aID8gJ1onIDogJ3onLAogCSAgICAgICByZWdzLT5zciAmIFNSX0MgPyAnQycgOiAnYycpOwotCXByaW50aygiTW9kZSBiaXRzOiAlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCisJcHJpbnRrKCIlc01vZGUgYml0czogJWMlYyVjJWMlYyVjJWMlYyVjXG4iLCBsb2dfbHZsLAogCSAgICAgICByZWdzLT5zciAmIFNSX0ggPyAnSCcgOiAnaCcsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfUiA/ICdSJyA6ICdyJywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9KID8gJ0onIDogJ2onLApAQCAtMTU2LDkgKzI5NywyMSBAQAogCSAgICAgICByZWdzLT5zciAmIFNSX0kxTSA/ICcxJyA6ICcuJywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9JME0gPyAnMCcgOiAnLicsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfR00gPyAnRycgOiAnZycpOwotCXByaW50aygiQ1BVIE1vZGU6ICVzXG4iLCBjcHVfbW9kZXNbbW9kZV0pOworCXByaW50aygiJXNDUFUgTW9kZTogJXNcbiIsIGxvZ19sdmwsIGNwdV9tb2Rlc1ttb2RlXSk7CisJcHJpbnRrKCIlc1Byb2Nlc3M6ICVzIFslZF0gKHRhc2s6ICVwIHRocmVhZDogJXApXG4iLAorCSAgICAgICBsb2dfbHZsLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnQsCisJICAgICAgIHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkpOworfQogCi0Jc2hvd190cmFjZShOVUxMLCAodW5zaWduZWQgbG9uZyAqKXNwLCByZWdzKTsKK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgc3AgPSByZWdzLT5zcDsKKworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlzcCA9ICh1bnNpZ25lZCBsb25nKXJlZ3MgKyBGUkFNRV9TSVpFX0ZVTEw7CisKKwlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCAiIik7CisJc2hvd190cmFjZV9sb2dfbHZsKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopc3AsIHJlZ3MsICIiKTsKIH0KIEVYUE9SVF9TWU1CT0woc2hvd19yZWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKaW5kZXggYTFhN2MzYy4uYjI3OWQ2NiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCkBAIC04LDEyICs4LDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTMwLDEzICszMiw2IEBACiBleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIAogLyoKLSAqIEJvb3Rsb2FkZXItcHJvdmlkZWQgaW5mb3JtYXRpb24gYWJvdXQgcGh5c2ljYWwgbWVtb3J5Ci0gKi8KLXN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcGh5czsKLXN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcmVzZXJ2ZWQ7Ci1zdHJ1Y3QgdGFnX21lbV9yYW5nZSAqbWVtX3JhbWRpc2s7Ci0KLS8qCiAgKiBJbml0aWFsaXplIGxvb3BzX3Blcl9qaWZmeSBhcyA1MDAwMDAwICg1MDBNSVBTKS4KICAqIEJldHRlciBtYWtlIGl0IHRvbyBsYXJnZSB0aGFuIHRvbyBzbWFsbC4uLgogICovCkBAIC00OCw0OCArNDMsMTkzIEBACiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKIC8qCi0gKiBTaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCwgYnV0IGlmIHlvdSBoYXZlIGEgX3JlYWxseV8gY29tcGxleAotICogc2V0dXAsIHlvdSBtaWdodCBuZWVkIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoaXMuLi4KLSAqLwotc3RhdGljIHN0cnVjdCB0YWdfbWVtX3JhbmdlIF9faW5pdGRhdGEgbWVtX3JhbmdlX2NhY2hlWzMyXTsKLXN0YXRpYyB1bnNpZ25lZCBtZW1fcmFuZ2VfbmV4dF9mcmVlOwotCi0vKgogICogU3RhbmRhcmQgbWVtb3J5IHJlc291cmNlcwogICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG1lbV9yZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gIktlcm5lbCBjb2RlIiwKLQkJLnN0YXJ0CT0gMCwKLQkJLmVuZAk9IDAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi0JfSwKLQl7Ci0JCS5uYW1lCT0gIktlcm5lbCBkYXRhIiwKLQkJLnN0YXJ0CT0gMCwKLQkJLmVuZAk9IDAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9faW5pdGRhdGEga2VybmVsX2RhdGEgPSB7CisJLm5hbWUJPSAiS2VybmVsIGRhdGEiLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9Oworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2luaXRkYXRhIGtlcm5lbF9jb2RlID0geworCS5uYW1lCT0gIktlcm5lbCBjb2RlIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCS5zaWJsaW5nID0gJmtlcm5lbF9kYXRhLAogfTsKIAotI2RlZmluZSBrZXJuZWxfY29kZQltZW1fcmVzWzBdCi0jZGVmaW5lIGtlcm5lbF9kYXRhCW1lbV9yZXNbMV0KKy8qCisgKiBBdmFpbGFibGUgc3lzdGVtIFJBTSBhbmQgcmVzZXJ2ZWQgcmVnaW9ucyBhcyBzaW5nbHkgbGlua2VkCisgKiBsaXN0cy4gVGhlc2UgbGlzdHMgYXJlIHRyYXZlcnNlZCB1c2luZyB0aGUgc2libGluZyBwb2ludGVyIGluCisgKiBzdHJ1Y3QgcmVzb3VyY2UgYW5kIGFyZSBrZXB0IHNvcnRlZCBhdCBhbGwgdGltZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9faW5pdGRhdGEgc3lzdGVtX3JhbTsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9faW5pdGRhdGEgcmVzZXJ2ZWQgPSAma2VybmVsX2NvZGU7CisKKy8qCisgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIHRoZXNlIGJlZm9yZSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgaXMgdXAgYW5kCisgKiBydW5uaW5nLCBzbyB3ZSBuZWVkIHRoaXMgImNhY2hlIi4gMzIgZW50cmllcyBhcmUgcHJvYmFibHkgZW5vdWdoCisgKiBmb3IgYWxsIGJ1dCB0aGUgbW9zdCBpbnNhbmVseSBjb21wbGV4IHN5c3RlbXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19pbml0ZGF0YSByZXNfY2FjaGVbMzJdOworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIHJlc19jYWNoZV9uZXh0X2ZyZWU7CisKK3N0YXRpYyB2b2lkIF9faW5pdCByZXNvdXJjZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHJlc291cmNlICptZW0sICpyZXM7CisJc3RydWN0IHJlc291cmNlICpuZXc7CisKKwlrZXJuZWxfY29kZS5zdGFydCA9IF9fcGEoaW5pdF9tbS5zdGFydF9jb2RlKTsKKworCWZvciAobWVtID0gc3lzdGVtX3JhbTsgbWVtOyBtZW0gPSBtZW0tPnNpYmxpbmcpIHsKKwkJbmV3ID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQltZW1jcHkobmV3LCBtZW0sIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKworCQluZXctPnNpYmxpbmcgPSBOVUxMOworCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIG5ldykpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCYWQgUkFNIHJlc291cmNlICUwOHgtJTA4eFxuIiwKKwkJCSAgICAgICBtZW0tPnN0YXJ0LCBtZW0tPmVuZCk7CisJfQorCisJZm9yIChyZXMgPSByZXNlcnZlZDsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpIHsKKwkJbmV3ID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQltZW1jcHkobmV3LCByZXMsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKworCQluZXctPnNpYmxpbmcgPSBOVUxMOworCQlpZiAoaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgbmV3KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQmFkIHJlc2VydmVkIHJlc291cmNlICVzICglMDh4LSUwOHgpXG4iLAorCQkJICAgICAgIHJlcy0+bmFtZSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0CithZGRfcGh5c2ljYWxfbWVtb3J5KHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IGVuZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm5ldywgKm5leHQsICoqcHByZXY7CisKKwlmb3IgKHBwcmV2ID0gJnN5c3RlbV9yYW0sIG5leHQgPSBzeXN0ZW1fcmFtOyBuZXh0OworCSAgICAgcHByZXYgPSAmbmV4dC0+c2libGluZywgbmV4dCA9IG5leHQtPnNpYmxpbmcpIHsKKwkJaWYgKGVuZCA8IG5leHQtPnN0YXJ0KQorCQkJYnJlYWs7CisJCWlmIChzdGFydCA8PSBuZXh0LT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiV2FybmluZzogUGh5c2ljYWwgbWVtb3J5IG1hcCBpcyBicm9rZW5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJXYXJuaW5nOiAlMDh4LSUwOHggb3ZlcmxhcHMgJTA4eC0lMDh4XG4iLAorCQkJICAgICAgIHN0YXJ0LCBlbmQsIG5leHQtPnN0YXJ0LCBuZXh0LT5lbmQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHJlc19jYWNoZV9uZXh0X2ZyZWUgPj0gQVJSQVlfU0laRShyZXNfY2FjaGUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJXYXJuaW5nOiBGYWlsZWQgdG8gYWRkIHBoeXNpY2FsIG1lbW9yeSAlMDh4LSUwOHhcbiIsCisJCSAgICAgICBzdGFydCwgZW5kKTsKKwkJcmV0dXJuOworCX0KKworCW5ldyA9ICZyZXNfY2FjaGVbcmVzX2NhY2hlX25leHRfZnJlZSsrXTsKKwluZXctPnN0YXJ0ID0gc3RhcnQ7CisJbmV3LT5lbmQgPSBlbmQ7CisJbmV3LT5uYW1lID0gIlN5c3RlbSBSQU0iOworCW5ldy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCSpwcHJldiA9IG5ldzsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FkZF9yZXNlcnZlZF9yZWdpb24ocmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3QgZW5kLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm5ldywgKm5leHQsICoqcHByZXY7CisKKwlpZiAoZW5kIDwgc3RhcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlc19jYWNoZV9uZXh0X2ZyZWUgPj0gQVJSQVlfU0laRShyZXNfY2FjaGUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAocHByZXYgPSAmcmVzZXJ2ZWQsIG5leHQgPSByZXNlcnZlZDsgbmV4dDsKKwkgICAgIHBwcmV2ID0gJm5leHQtPnNpYmxpbmcsIG5leHQgPSBuZXh0LT5zaWJsaW5nKSB7CisJCWlmIChlbmQgPCBuZXh0LT5zdGFydCkKKwkJCWJyZWFrOworCQlpZiAoc3RhcnQgPD0gbmV4dC0+ZW5kKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwluZXcgPSAmcmVzX2NhY2hlW3Jlc19jYWNoZV9uZXh0X2ZyZWUrK107CisJbmV3LT5zdGFydCA9IHN0YXJ0OworCW5ldy0+ZW5kID0gZW5kOworCW5ldy0+bmFtZSA9IG5hbWU7CisJbmV3LT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJKnBwcmV2ID0gbmV3OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAorZmluZF9mcmVlX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCisJCSByZXNvdXJjZV9zaXplX3QgYWxpZ24pCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgbG9uZyB0YXJnZXQ7CisKKwl0YXJnZXQgPSBBTElHTihtZW0tPnN0YXJ0LCBhbGlnbik7CisJZm9yIChyZXMgPSByZXNlcnZlZDsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpIHsKKwkJaWYgKCh0YXJnZXQgKyBzaXplKSA8PSByZXMtPnN0YXJ0KQorCQkJYnJlYWs7CisJCWlmICh0YXJnZXQgPD0gcmVzLT5lbmQpCisJCQl0YXJnZXQgPSBBTElHTihyZXMtPmVuZCArIDEsIGFsaWduKTsKKwl9CisKKwlpZiAoKHRhcmdldCArIHNpemUpID4gKG1lbS0+ZW5kICsgMSkpCisJCXJldHVybiBtZW0tPmVuZCArIDE7CisKKwlyZXR1cm4gdGFyZ2V0OworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWxsb2NfcmVzZXJ2ZWRfcmVnaW9uKHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCBzaXplLAorCQkgICAgICByZXNvdXJjZV9zaXplX3QgYWxpZ24sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJlc291cmNlICptZW07CisJcmVzb3VyY2Vfc2l6ZV90IHRhcmdldDsKKwlpbnQgcmV0OworCisJZm9yIChtZW0gPSBzeXN0ZW1fcmFtOyBtZW07IG1lbSA9IG1lbS0+c2libGluZykgeworCQl0YXJnZXQgPSBmaW5kX2ZyZWVfcmVnaW9uKG1lbSwgc2l6ZSwgYWxpZ24pOworCQlpZiAodGFyZ2V0IDw9IG1lbS0+ZW5kKSB7CisJCQlyZXQgPSBhZGRfcmVzZXJ2ZWRfcmVnaW9uKHRhcmdldCwgdGFyZ2V0ICsgc2l6ZSAtIDEsCisJCQkJCQkgIG5hbWUpOworCQkJaWYgKCFyZXQpCisJCQkJKnN0YXJ0ID0gdGFyZ2V0OworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAtRU5PTUVNOworfQogCiAvKgogICogRWFybHkgZnJhbWVidWZmZXIgYWxsb2NhdGlvbi4gV29ya3MgYXMgZm9sbG93czoKICAqICAgLSBJZiBmYm1lbV9zaXplIGlzIHplcm8sIG5vdGhpbmcgd2lsbCBiZSBhbGxvY2F0ZWQgb3IgcmVzZXJ2ZWQuCiAgKiAgIC0gSWYgZmJtZW1fc3RhcnQgaXMgemVybyB3aGVuIHNldHVwX2Jvb3RtZW0oKSBpcyBjYWxsZWQsCi0gKiAgICAgZmJtZW1fc2l6ZSBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIHRoZSBib290bWVtIGFsbG9jYXRvci4KKyAqICAgICBhIGJsb2NrIG9mIGZibWVtX3NpemUgYnl0ZXMgd2lsbCBiZSByZXNlcnZlZCBiZWZvcmUgYm9vdG1lbQorICogICAgIGluaXRpYWxpemF0aW9uLiBJdCB3aWxsIGJlIGFsaWduZWQgdG8gdGhlIGxhcmdlc3QgcGFnZSBzaXplCisgKiAgICAgdGhhdCBmYm1lbV9zaXplIGlzIGEgbXVsdGlwbGUgb2YuCiAgKiAgIC0gSWYgZmJtZW1fc3RhcnQgaXMgbm9uemVybywgYW4gYXJlYSBvZiBzaXplIGZibWVtX3NpemUgd2lsbCBiZQotICogICAgIHJlc2VydmVkIGF0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZibWVtX3N0YXJ0IGlmIG5lY2Vzc2FyeS4gSWYKLSAqICAgICB0aGUgYXJlYSBpc24ndCBpbiBhIG1lbW9yeSByZWdpb24ga25vd24gdG8gdGhlIGtlcm5lbCwgaXQgd2lsbAotICogICAgIGJlIGxlZnQgYWxvbmUuCisgKiAgICAgcmVzZXJ2ZWQgYXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZmJtZW1fc3RhcnQgaWYgcG9zc2libGUuIElmCisgKiAgICAgaXQgY29sbGlkZXMgd2l0aCBvdGhlciByZXNlcnZlZCBtZW1vcnksIGEgZGlmZmVyZW50IGJsb2NrIG9mCisgKiAgICAgc2FtZSBzaXplIHdpbGwgYmUgYWxsb2NhdGVkLCBqdXN0IGFzIGlmIGZibWVtX3N0YXJ0IHdhcyB6ZXJvLgogICoKICAqIEJvYXJkLXNwZWNpZmljIGNvZGUgbWF5IHVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gc2V0IHVwIHBsYXRmb3JtIGRhdGEKICAqIGZvciB0aGUgZnJhbWVidWZmZXIgZHJpdmVyIGlmIGZibWVtX3NpemUgaXMgbm9uemVyby4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBmYm1lbV9zdGFydDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgZmJtZW1fc2l6ZTsKK3Jlc291cmNlX3NpemVfdCBfX2luaXRkYXRhIGZibWVtX3N0YXJ0OworcmVzb3VyY2Vfc2l6ZV90IF9faW5pdGRhdGEgZmJtZW1fc2l6ZTsKIAogLyoKICAqICJmYm1lbT14eHhba0ttTV0iIGFsbG9jYXRlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBib290IG1lbW9yeSBmb3IKQEAgLTEwMyw0OSArMjQzLDQzIEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX2ZibWVtKGNoYXIgKnApCiB7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGFsaWduOworCiAJZmJtZW1fc2l6ZSA9IG1lbXBhcnNlKHAsICZwKTsKLQlpZiAoKnAgPT0gJ0AnKQorCWlmICgqcCA9PSAnQCcpIHsKIAkJZmJtZW1fc3RhcnQgPSBtZW1wYXJzZShwLCAmcCk7CisJCXJldCA9IGFkZF9yZXNlcnZlZF9yZWdpb24oZmJtZW1fc3RhcnQsCisJCQkJCSAgZmJtZW1fc3RhcnQgKyBmYm1lbV9zaXplIC0gMSwKKwkJCQkJICAiRnJhbWVidWZmZXIiKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJZmJtZW1fc3RhcnQgPSAwOworCQl9CisJfQorCisJaWYgKCFmYm1lbV9zdGFydCkgeworCQlpZiAoKGZibWVtX3NpemUgJiAweDAwMGZmZmZmVUwpID09IDApCisJCQlhbGlnbiA9IDB4MTAwMDAwOwkvKiAxIE1pQiAqLworCQllbHNlIGlmICgoZmJtZW1fc2l6ZSAmIDB4MDAwMGZmZmZVTCkgPT0gMCkKKwkJCWFsaWduID0gMHgxMDAwMDsJLyogNjQgS2lCICovCisJCWVsc2UKKwkJCWFsaWduID0gMHgxMDAwOwkJLyogNCBLaUIgKi8KKworCQlyZXQgPSBhbGxvY19yZXNlcnZlZF9yZWdpb24oJmZibWVtX3N0YXJ0LCBmYm1lbV9zaXplLAorCQkJCQkgICAgYWxpZ24sICJGcmFtZWJ1ZmZlciIpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJZmJtZW1fc2l6ZSA9IDA7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJmYm1lbSIsIGVhcmx5X3BhcnNlX2ZibWVtKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCByZXNvdXJjZV9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHRhZ19tZW1fcmFuZ2UgKnJlZ2lvbjsKLQotCWtlcm5lbF9jb2RlLnN0YXJ0ID0gX19wYShpbml0X21tLnN0YXJ0X2NvZGUpOwotCWtlcm5lbF9jb2RlLmVuZCA9IF9fcGEoaW5pdF9tbS5lbmRfY29kZSAtIDEpOwotCWtlcm5lbF9kYXRhLnN0YXJ0ID0gX19wYShpbml0X21tLmVuZF9jb2RlKTsKLQlrZXJuZWxfZGF0YS5lbmQgPSBfX3BhKGluaXRfbW0uYnJrIC0gMSk7Ci0KLQlmb3IgKHJlZ2lvbiA9IG1lbV9waHlzOyByZWdpb247IHJlZ2lvbiA9IHJlZ2lvbi0+bmV4dCkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQkJdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0LCBwaHlzX2VuZDsKLQotCQlpZiAocmVnaW9uLT5zaXplID09IDApCi0JCQljb250aW51ZTsKLQotCQlwaHlzX3N0YXJ0ID0gcmVnaW9uLT5hZGRyOwotCQlwaHlzX2VuZCA9IHBoeXNfc3RhcnQgKyByZWdpb24tPnNpemUgLSAxOwotCi0JCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZigqcmVzKSk7Ci0JCXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsKLQkJcmVzLT5zdGFydCA9IHBoeXNfc3RhcnQ7Ci0JCXJlcy0+ZW5kID0gcGh5c19lbmQ7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKLQotCQlyZXF1ZXN0X3Jlc291cmNlICgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7Ci0KLQkJaWYgKGtlcm5lbF9jb2RlLnN0YXJ0ID49IHJlcy0+c3RhcnQgJiYKLQkJICAgIGtlcm5lbF9jb2RlLmVuZCA8PSByZXMtPmVuZCkKLQkJCXJlcXVlc3RfcmVzb3VyY2UgKHJlcywgJmtlcm5lbF9jb2RlKTsKLQkJaWYgKGtlcm5lbF9kYXRhLnN0YXJ0ID49IHJlcy0+c3RhcnQgJiYKLQkJICAgIGtlcm5lbF9kYXRhLmVuZCA8PSByZXMtPmVuZCkKLQkJCXJlcXVlc3RfcmVzb3VyY2UgKHJlcywgJmtlcm5lbF9kYXRhKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jb3JlKHN0cnVjdCB0YWcgKnRhZykKIHsKIAlpZiAodGFnLT5oZHIuc2l6ZSA+IDIpIHsKQEAgLTE1NywxMSArMjkxLDkgQEAKIH0KIF9fdGFndGFibGUoQVRBR19DT1JFLCBwYXJzZV90YWdfY29yZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW1fcmFuZ2Uoc3RydWN0IHRhZyAqdGFnLAotCQkJCSAgICAgIHN0cnVjdCB0YWdfbWVtX3JhbmdlICoqcm9vdCkKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW0oc3RydWN0IHRhZyAqdGFnKQogewotCXN0cnVjdCB0YWdfbWVtX3JhbmdlICpjdXIsICoqcHByZXY7Ci0Jc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm5ldzsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAKIAkvKgogCSAqIElnbm9yZSB6ZXJvLXNpemVkIGVudHJpZXMuIElmIHdlJ3JlIHJ1bm5pbmcgc3RhbmRhbG9uZSwgdGhlCkBAIC0xNzEsMzQgKzMwMyw1MyBAQAogCWlmICh0YWctPnUubWVtX3JhbmdlLnNpemUgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIENvcHkgdGhlIGRhdGEgc28gdGhlIGJvb3RtZW0gaW5pdCBjb2RlIGRvZXNuJ3QgbmVlZCB0byBjYXJlCi0JICogYWJvdXQgaXQuCi0JICovCi0JaWYgKG1lbV9yYW5nZV9uZXh0X2ZyZWUgPj0gQVJSQVlfU0laRShtZW1fcmFuZ2VfY2FjaGUpKQotCQlwYW5pYygiUGh5c2ljYWwgbWVtb3J5IG1hcCB0b28gY29tcGxleCFcbiIpOworCXN0YXJ0ID0gdGFnLT51Lm1lbV9yYW5nZS5hZGRyOworCWVuZCA9IHRhZy0+dS5tZW1fcmFuZ2UuYWRkciArIHRhZy0+dS5tZW1fcmFuZ2Uuc2l6ZSAtIDE7CiAKLQluZXcgPSAmbWVtX3JhbmdlX2NhY2hlW21lbV9yYW5nZV9uZXh0X2ZyZWUrK107Ci0JKm5ldyA9IHRhZy0+dS5tZW1fcmFuZ2U7CisJYWRkX3BoeXNpY2FsX21lbW9yeShzdGFydCwgZW5kKTsKKwlyZXR1cm4gMDsKK30KK19fdGFndGFibGUoQVRBR19NRU0sIHBhcnNlX3RhZ19tZW0pOwogCi0JcHByZXYgPSByb290OwotCWN1ciA9ICpyb290OwotCXdoaWxlIChjdXIpIHsKLQkJcHByZXYgPSAmY3VyLT5uZXh0OwotCQljdXIgPSBjdXItPm5leHQ7CitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfcmRpbWcoc3RydWN0IHRhZyAqdGFnKQoreworI2lmZGVmIENPTkZJR19JTklUUkQKKwlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqbWVtID0gJnRhZy0+dS5tZW1fcmFuZ2U7CisJaW50IHJldDsKKworCWlmIChpbml0cmRfc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhcm5pbmc6IE9ubHkgdGhlIGZpcnN0IGluaXRyZCBpbWFnZSB3aWxsIGJlIHVzZWRcbiIpOworCQlyZXR1cm4gMDsKIAl9CiAKLQkqcHByZXYgPSBuZXc7Ci0JbmV3LT5uZXh0ID0gTlVMTDsKKwlyZXQgPSBhZGRfcmVzZXJ2ZWRfcmVnaW9uKG1lbS0+c3RhcnQsIG1lbS0+c3RhcnQgKyBtZW0tPnNpemUgLSAxLAorCQkJCSAgImluaXRyZCIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhcm5pbmc6IEZhaWxlZCB0byByZXNlcnZlIGluaXRyZCBtZW1vcnlcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEobWVtLT5hZGRyKTsKKwlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgbWVtLT5zaXplOworI2Vsc2UKKwlwcmludGsoS0VSTl9XQVJOSU5HICJSQU0gZGlzayBpbWFnZSBwcmVzZW50LCBidXQgIgorCSAgICAgICAibm8gaW5pdHJkIHN1cHBvcnQgaW4ga2VybmVsLCBpZ25vcmluZ1xuIik7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQorX190YWd0YWJsZShBVEFHX1JESU1HLCBwYXJzZV90YWdfcmRpbWcpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfbWVtKHN0cnVjdCB0YWcgKnRhZykKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yc3ZkX21lbShzdHJ1Y3QgdGFnICp0YWcpCiB7Ci0JcmV0dXJuIHBhcnNlX3RhZ19tZW1fcmFuZ2UodGFnLCAmbWVtX3BoeXMpOworCXN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW0gPSAmdGFnLT51Lm1lbV9yYW5nZTsKKworCXJldHVybiBhZGRfcmVzZXJ2ZWRfcmVnaW9uKG1lbS0+YWRkciwgbWVtLT5hZGRyICsgbWVtLT5zaXplIC0gMSwKKwkJCQkgICAiUmVzZXJ2ZWQiKTsKIH0KLV9fdGFndGFibGUoQVRBR19NRU0sIHBhcnNlX3RhZ19tZW0pOworX190YWd0YWJsZShBVEFHX1JTVkRfTUVNLCBwYXJzZV90YWdfcnN2ZF9tZW0pOwogCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfY21kbGluZShzdHJ1Y3QgdGFnICp0YWcpCiB7CkBAIC0yMDcsMTIgKzM1OCw2IEBACiB9CiBfX3RhZ3RhYmxlKEFUQUdfQ01ETElORSwgcGFyc2VfdGFnX2NtZGxpbmUpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfcmRpbWcoc3RydWN0IHRhZyAqdGFnKQotewotCXJldHVybiBwYXJzZV90YWdfbWVtX3JhbmdlKHRhZywgJm1lbV9yYW1kaXNrKTsKLX0KLV9fdGFndGFibGUoQVRBR19SRElNRywgcGFyc2VfdGFnX3JkaW1nKTsKLQogc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2Nsb2NrKHN0cnVjdCB0YWcgKnRhZykKIHsKIAkvKgpAQCAtMjIzLDEyICszNjgsNiBAQAogfQogX190YWd0YWJsZShBVEFHX0NMT0NLLCBwYXJzZV90YWdfY2xvY2spOwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfcnN2ZF9tZW0oc3RydWN0IHRhZyAqdGFnKQotewotCXJldHVybiBwYXJzZV90YWdfbWVtX3JhbmdlKHRhZywgJm1lbV9yZXNlcnZlZCk7Ci19Ci1fX3RhZ3RhYmxlKEFUQUdfUlNWRF9NRU0sIHBhcnNlX3RhZ19yc3ZkX21lbSk7Ci0KIC8qCiAgKiBTY2FuIHRoZSB0YWcgdGFibGUgZm9yIHRoaXMgdGFnLCBhbmQgY2FsbCBpdHMgcGFyc2UgZnVuY3Rpb24uIFRoZQogICogdGFnIHRhYmxlIGlzIGJ1aWx0IGJ5IHRoZSBsaW5rZXIgZnJvbSBhbGwgdGhlIF9fdGFndGFibGUKQEAgLTI2MCwxMCArMzk5LDEzNyBAQAogCQkJICAgICAgIHQtPmhkci50YWcpOwogfQogCisvKgorICogRmluZCBhIGZyZWUgbWVtb3J5IHJlZ2lvbiBsYXJnZSBlbm91Z2ggZm9yIHN0b3JpbmcgdGhlCisgKiBib290bWVtIGJpdG1hcC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0CitmaW5kX2Jvb3RtYXBfcGZuKGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqbWVtKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9sZW47CisJdW5zaWduZWQgbG9uZyBub2RlX3BhZ2VzID0gUEZOX1VQKG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDEpOworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zdGFydDsKKworCWJvb3RtYXBfcGFnZXMgPSBib290bWVtX2Jvb3RtYXBfcGFnZXMobm9kZV9wYWdlcyk7CisJYm9vdG1hcF9sZW4gPSBib290bWFwX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisKKwkvKgorCSAqIEZpbmQgYSBsYXJnZSBlbm91Z2ggcmVnaW9uIHdpdGhvdXQgcmVzZXJ2ZWQgcGFnZXMgZm9yCisJICogc3RvcmluZyB0aGUgYm9vdG1lbSBiaXRtYXAuIFdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUKKwkgKiBmYWN0IHRoYXQgYWxsIGxpc3RzIGhhdmUgYmVlbiBzb3J0ZWQuCisJICoKKwkgKiBXZSBoYXZlIHRvIGNoZWNrIHRoYXQgd2UgZG9uJ3QgY29sbGlkZSB3aXRoIGFueSByZXNlcnZlZAorCSAqIHJlZ2lvbnMsIHdoaWNoIGluY2x1ZGVzIHRoZSBrZXJuZWwgaW1hZ2UgYW5kIGFueSBSQU1ESVNLCisJICogaW1hZ2VzLgorCSAqLworCWJvb3RtYXBfc3RhcnQgPSBmaW5kX2ZyZWVfcmVnaW9uKG1lbSwgYm9vdG1hcF9sZW4sIFBBR0VfU0laRSk7CisKKwlyZXR1cm4gYm9vdG1hcF9zdGFydCA+PiBQQUdFX1NISUZUOworfQorCisjZGVmaW5lIE1BWF9MT1dNRU0JSElHSE1FTV9TVEFSVAorI2RlZmluZSBNQVhfTE9XTUVNX1BGTglQRk5fRE9XTihNQVhfTE9XTUVNKQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbSh2b2lkKQoreworCXVuc2lnbmVkIGJvb3RtYXBfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3BmbiwgYm9vdG1hcF9wZm4sIHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgbWF4X3BmbiwgbWF4X2xvd19wZm47CisJdW5zaWduZWQgbm9kZSA9IDA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlwcmludGsoS0VSTl9JTkZPICJQaHlzaWNhbCBtZW1vcnk6XG4iKTsKKwlmb3IgKHJlcyA9IHN5c3RlbV9yYW07IHJlczsgcmVzID0gcmVzLT5zaWJsaW5nKQorCQlwcmludGsoIiAgJTA4eC0lMDh4XG4iLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2ZWQgbWVtb3J5OlxuIik7CisJZm9yIChyZXMgPSByZXNlcnZlZDsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpCisJCXByaW50aygiICAlMDh4LSUwOHg6ICVzXG4iLAorCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsIHJlcy0+bmFtZSk7CisKKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCisJaWYgKHN5c3RlbV9yYW0tPnNpYmxpbmcpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9ubHkgdXNpbmcgZmlyc3QgbWVtb3J5IGJhbmtcbiIpOworCisJZm9yIChyZXMgPSBzeXN0ZW1fcmFtOyByZXM7IHJlcyA9IE5VTEwpIHsKKwkJZmlyc3RfcGZuID0gUEZOX1VQKHJlcy0+c3RhcnQpOworCQltYXhfbG93X3BmbiA9IG1heF9wZm4gPSBQRk5fRE9XTihyZXMtPmVuZCArIDEpOworCQlib290bWFwX3BmbiA9IGZpbmRfYm9vdG1hcF9wZm4ocmVzKTsKKwkJaWYgKGJvb3RtYXBfcGZuID4gbWF4X3BmbikKKwkJCXBhbmljKCJObyBzcGFjZSBmb3IgYm9vdG1lbSBiaXRtYXAhXG4iKTsKKworCQlpZiAobWF4X2xvd19wZm4gPiBNQVhfTE9XTUVNX1BGTikgeworCQkJbWF4X2xvd19wZm4gPSBNQVhfTE9XTUVNX1BGTjsKKyNpZm5kZWYgQ09ORklHX0hJR0hNRU0KKwkJCS8qCisJCQkgKiBMb3dtZW0gaXMgbWVtb3J5IHRoYXQgY2FuIGJlIGFkZHJlc3NlZAorCQkJICogZGlyZWN0bHkgdGhyb3VnaCBQMS9QMgorCQkJICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIk5vZGUgJXU6IE9ubHkgJWxkIE1pQiBvZiBtZW1vcnkgd2lsbCBiZSB1c2VkLlxuIiwKKwkJCSAgICAgICBub2RlLCBNQVhfTE9XTUVNID4+IDIwKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIEhJR0hNRU0gZW5hYmxlZCBrZXJuZWwuXG4iKTsKKyNlbHNlCisjZXJyb3IgSElHSE1FTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFWUjMyIHlldAorI2VuZGlmCisJCX0KKworCQkvKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yIHdpdGggbG93IG1lbW9yeSBvbmx5LiAqLworCQlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIGJvb3RtYXBfcGZuLAorCQkJCQkJIGZpcnN0X3BmbiwgbWF4X2xvd19wZm4pOworCisJCS8qCisJCSAqIFJlZ2lzdGVyIGZ1bGx5IGF2YWlsYWJsZSBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbQorCQkgKiBhbGxvY2F0b3IuCisJCSAqLworCQlwYWdlcyA9IG1heF9sb3dfcGZuIC0gZmlyc3RfcGZuOworCQlmcmVlX2Jvb3RtZW1fbm9kZSAoTk9ERV9EQVRBKG5vZGUpLCBQRk5fUEhZUyhmaXJzdF9wZm4pLAorCQkJCSAgIFBGTl9QSFlTKHBhZ2VzKSk7CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGJvb3RtZW0gYml0bWFwLi4uICovCisJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKKwkJCQkgICAgIFBGTl9QSFlTKGJvb3RtYXBfcGZuKSwKKwkJCQkgICAgIGJvb3RtYXBfc2l6ZSk7CisKKwkJLyogLi4uYW5kIGFueSBvdGhlciByZXNlcnZlZCByZWdpb25zLiAqLworCQlmb3IgKHJlcyA9IHJlc2VydmVkOyByZXM7IHJlcyA9IHJlcy0+c2libGluZykgeworCQkJaWYgKHJlcy0+c3RhcnQgPiBQRk5fUEhZUyhtYXhfcGZuKSkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIHJlc291cmNlX2luaXQgd2lsbCBjb21wbGFpbiBhYm91dCBwYXJ0aWFsCisJCQkgKiBvdmVybGFwcywgc28gd2UnbGwganVzdCBpZ25vcmUgc3VjaAorCQkJICogcmVzb3VyY2VzIGZvciBub3cuCisJCQkgKi8KKwkJCWlmIChyZXMtPnN0YXJ0ID49IFBGTl9QSFlTKGZpcnN0X3BmbikKKwkJCSAgICAmJiByZXMtPmVuZCA8IFBGTl9QSFlTKG1heF9wZm4pKQorCQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKAorCQkJCQlOT0RFX0RBVEEobm9kZSksIHJlcy0+c3RhcnQsCisJCQkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCQl9CisKKwkJbm9kZV9zZXRfb25saW5lKG5vZGUpOworCX0KK30KKwogdm9pZCBfX2luaXQgc2V0dXBfYXJjaCAoY2hhciAqKmNtZGxpbmVfcCkKIHsKIAlzdHJ1Y3QgY2xrICpjcHVfY2xrOwogCisJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpX3RleHQ7CisJaW5pdF9tbS5lbmRfY29kZSA9ICh1bnNpZ25lZCBsb25nKV9ldGV4dDsKKwlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpX2VkYXRhOworCWluaXRfbW0uYnJrID0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKKworCS8qCisJICogSW5jbHVkZSAuaW5pdCBzZWN0aW9uIHRvIG1ha2UgYWxsb2NhdGlvbnMgZWFzaWVyLiBJdCB3aWxsCisJICogYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIHJlc291cmNlIGlzIGFjdHVhbGx5IHJlcXVlc3RlZC4KKwkgKi8KKwlrZXJuZWxfY29kZS5zdGFydCA9IF9fcGEoX19pbml0X2JlZ2luKTsKKwlrZXJuZWxfY29kZS5lbmQgPSBfX3BhKGluaXRfbW0uZW5kX2NvZGUgLSAxKTsKKwlrZXJuZWxfZGF0YS5zdGFydCA9IF9fcGEoaW5pdF9tbS5lbmRfY29kZSk7CisJa2VybmVsX2RhdGEuZW5kID0gX19wYShpbml0X21tLmJyayAtIDEpOworCiAJcGFyc2VfdGFncyhib290bG9hZGVyX3RhZ3MpOwogCiAJc2V0dXBfcHJvY2Vzc29yKCk7CkBAIC0yODksMjQgKzU1NSwxNiBAQAogCQkgICAgICAgKChjcHVfaHogKyA1MDApIC8gMTAwMCkgJSAxMDAwKTsKIAl9CiAKLQlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl90ZXh0OwotCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKLQlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7Ci0JaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZykgJl9lbmQ7Ci0KIAlzdHJsY3B5KGNvbW1hbmRfbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKIAkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKIAlzZXR1cF9ib290bWVtKCk7CiAKLQlib2FyZF9zZXR1cF9mYm1lbShmYm1lbV9zdGFydCwgZmJtZW1fc2l6ZSk7Ci0KICNpZmRlZiBDT05GSUdfVlQKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgogCiAJcGFnaW5nX2luaXQoKTsKLQogCXJlc291cmNlX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYwppbmRleCBjMTA4MzNmLi43MDE0YTM1IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEF0bWVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgogICoKICAqIEJhc2VkIG9uIE1JUFMgaW1wbGVtZW50YXRpb24gYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKICAqICAgQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCkBAIC0yMCwxOCArMjAsMjUgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCi1zdGF0aWMgY3ljbGVfdCByZWFkX2N5Y2xlX2NvdW50KHZvaWQpCisvKiBob3cgbWFueSBjb3VudGVyIGN5Y2xlcyBpbiBhIGppZmZ5PyAqLworc3RhdGljIHUzMiBjeWNsZXNfcGVyX2ppZmZ5OworCisvKiB0aGUgY291bnQgdmFsdWUgZm9yIHRoZSBuZXh0IHRpbWVyIGludGVycnVwdCAqLworc3RhdGljIHUzMiBleHBpcmVsbzsKKworY3ljbGVfdCBfX3dlYWsgcmVhZF9jeWNsZV9jb3VudCh2b2lkKQogewogCXJldHVybiAoY3ljbGVfdClzeXNyZWdfcmVhZChDT1VOVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfYXZyMzIgPSB7CitzdHJ1Y3QgY2xvY2tzb3VyY2UgX193ZWFrIGNsb2Nrc291cmNlX2F2cjMyID0gewogCS5uYW1lCQk9ICJhdnIzMiIsCiAJLnJhdGluZwkJPSAzNTAsCiAJLnJlYWQJCT0gcmVhZF9jeWNsZV9jb3VudCwKQEAgLTQwLDEyICs0NywyMCBAQAogCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKK2lycXJldHVybl90IF9fd2VhayB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworc3RydWN0IGlycWFjdGlvbiB0aW1lcl9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIJPSB0aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCisJLm5hbWUJCT0gInRpbWVyIiwKK307CisKIC8qCiAgKiBCeSBkZWZhdWx0IHdlIHByb3ZpZGUgdGhlIG51bGwgUlRDIG9wcwogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBudWxsX3J0Y19nZXRfdGltZSh2b2lkKQogewotCXJldHVybiBta3RpbWUoMjAwNCwgMSwgMSwgMCwgMCwgMCk7CisJcmV0dXJuIG1rdGltZSgyMDA3LCAxLCAxLCAwLCAwLCAwKTsKIH0KIAogc3RhdGljIGludCBudWxsX3J0Y19zZXRfdGltZSh1bnNpZ25lZCBsb25nIHNlYykKQEAgLTU2LDIzICs3MSwxNCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKCpydGNfZ2V0X3RpbWUpKHZvaWQpID0gbnVsbF9ydGNfZ2V0X3RpbWU7CiBzdGF0aWMgaW50ICgqcnRjX3NldF90aW1lKSh1bnNpZ25lZCBsb25nKSA9IG51bGxfcnRjX3NldF90aW1lOwogCi0vKiBob3cgbWFueSBjb3VudGVyIGN5Y2xlcyBpbiBhIGppZmZ5PyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3ljbGVzX3Blcl9qaWZmeTsKLQotLyogY3ljbGUgY291bnRlciB2YWx1ZSBhdCB0aGUgcHJldmlvdXMgdGltZXIgaW50ZXJydXB0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRpbWVyaGksIHRpbWVybG87Ci0KLS8qIHRoZSBjb3VudCB2YWx1ZSBmb3IgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGV4cGlyZWxvOwotCiBzdGF0aWMgdm9pZCBhdnIzMl90aW1lcl9hY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY291bnQ7CisJdTMyIGNvdW50OwogCiAJLyogQWNrIHRoaXMgdGltZXIgaW50ZXJydXB0IGFuZCBzZXQgdGhlIG5leHQgb25lICovCiAJZXhwaXJlbG8gKz0gY3ljbGVzX3Blcl9qaWZmeTsKKwkvKiBzZXR0aW5nIENPTVBBUkUgdG8gMCBzdG9wcyB0aGUgQ09VTlQtQ09NUEFSRSAqLwogCWlmIChleHBpcmVsbyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJleHBpcmVsbyA9PSAwXG4iKTsKIAkJc3lzcmVnX3dyaXRlKENPTVBBUkUsIGV4cGlyZWxvICsgMSk7CiAJfSBlbHNlIHsKIAkJc3lzcmVnX3dyaXRlKENPTVBBUkUsIGV4cGlyZWxvKTsKQEAgLTg2LDI3ICs5Miw1NiBAQAogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBhdnIzMl9ocHRfcmVhZCh2b2lkKQoraW50IF9fd2VhayBhdnIzMl9ocHRfaW5pdCh2b2lkKQogewotCXJldHVybiBzeXNyZWdfcmVhZChDT1VOVCk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG11bHQsIHNoaWZ0LCBjb3VudF9oejsKKworCWNvdW50X2h6ID0gY2xrX2dldF9yYXRlKGJvb3RfY3B1X2RhdGEuY2xrKTsKKwlzaGlmdCA9IGNsb2Nrc291cmNlX2F2cjMyLnNoaWZ0OworCW11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KGNvdW50X2h6LCBzaGlmdCk7CisJY2xvY2tzb3VyY2VfYXZyMzIubXVsdCA9IG11bHQ7CisKKwl7CisJCXU2NCB0bXA7CisKKwkJdG1wID0gVElDS19OU0VDOworCQl0bXAgPDw9IHNoaWZ0OworCQl0bXAgKz0gbXVsdCAvIDI7CisJCWRvX2Rpdih0bXAsIG11bHQpOworCisJCWN5Y2xlc19wZXJfamlmZnkgPSB0bXA7CisJfQorCisJcmV0ID0gc2V0dXBfaXJxKDAsICZ0aW1lcl9pcnFhY3Rpb24pOworCWlmIChyZXQpIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgcmVxdWVzdCBJUlEgMDogJWRcbiIsIHJldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInRpbWVyOiBBVDMyQVAgQ09VTlQtQ09NUEFSRSBhdCBpcnEgMCwgIgorCQkJIiVsdS4lMDNsdSBNSHpcbiIsCisJCQkoKGNvdW50X2h6ICsgNTAwKSAvIDEwMDApIC8gMTAwMCwKKwkJCSgoY291bnRfaHogKyA1MDApIC8gMTAwMCkgJSAxMDAwKTsKKworCXJldHVybiAwOwogfQogCiAvKgogICogVGFrZW4gZnJvbSBNSVBTIGMwX2hwdF90aW1lcl9pbml0KCkuCiAgKgotICogV2h5IGlzIGl0IHNvIGNvbXBsaWNhdGVkLCBhbmQgd2hhdCBpcyAiY291bnQiPyAgTXkgYXNzdW1wdGlvbiBpcwotICogdGhhdCBgY291bnQnIHNwZWNpZmllcyB0aGUgInJlZmVyZW5jZSBjeWNsZSIsIGkuZS4gdGhlIGN5Y2xlIHNpbmNlCi0gKiByZXNldCB0aGF0IHNob3VsZCBtZWFuICJ6ZXJvIi4gVGhlIHJlYXNvbiBDT1VOVCBpcyB3cml0dGVuIHR3aWNlIGlzCi0gKiBwcm9iYWJseSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSB0aW1lciBpbnRlcnJ1cHRzIHdoaWxlIHdlCi0gKiBhcmUgbWVzc2luZyB3aXRoIHRoZSBjb3VudGVyLgorICogVGhlIHJlYXNvbiBDT1VOVCBpcyB3cml0dGVuIHR3aWNlIGlzIHByb2JhYmx5IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55CisgKiB0aW1lciBpbnRlcnJ1cHRzIHdoaWxlIHdlIGFyZSBtZXNzaW5nIHdpdGggdGhlIGNvdW50ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGF2cjMyX2hwdF9pbml0KHVuc2lnbmVkIGludCBjb3VudCkKK2ludCBfX3dlYWsgYXZyMzJfaHB0X3N0YXJ0KHZvaWQpCiB7Ci0JY291bnQgPSBzeXNyZWdfcmVhZChDT1VOVCkgLSBjb3VudDsKKwl1MzIgY291bnQgPSBzeXNyZWdfcmVhZChDT1VOVCk7CiAJZXhwaXJlbG8gPSAoY291bnQgLyBjeWNsZXNfcGVyX2ppZmZ5ICsgMSkgKiBjeWNsZXNfcGVyX2ppZmZ5OwogCXN5c3JlZ193cml0ZShDT1VOVCwgZXhwaXJlbG8gLSBjeWNsZXNfcGVyX2ppZmZ5KTsKIAlzeXNyZWdfd3JpdGUoQ09NUEFSRSwgZXhwaXJlbG8pOwogCXN5c3JlZ193cml0ZShDT1VOVCwgY291bnQpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMTUsMjYgKzE1MCwxOCBAQAogICoKICAqIEluIFVQIG1vZGUsIGl0IGlzIGludm9rZWQgZnJvbSB0aGUgKGdsb2JhbCkgdGltZXJfaW50ZXJydXB0LgogICovCi1zdGF0aWMgdm9pZCBsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCBsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCWlmIChjdXJyZW50LT5waWQpCiAJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90Ci10aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoraXJxcmV0dXJuX3QgX193ZWFrIHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCiAJLyogYWNrIHRpbWVyIGludGVycnVwdCBhbmQgdHJ5IHRvIHNldCBuZXh0IGludGVycnVwdCAqLwotCWNvdW50ID0gYXZyMzJfaHB0X3JlYWQoKTsKIAlhdnIzMl90aW1lcl9hY2soKTsKIAotCS8qIFVwZGF0ZSB0aW1lcmhpL3RpbWVybG8gZm9yIGludHJhLWppZmZ5IGNhbGlicmF0aW9uICovCi0JdGltZXJoaSArPSBjb3VudCA8IHRpbWVybG87CS8qIFdyYXAgYXJvdW5kICovCi0JdGltZXJsbyA9IGNvdW50OwotCiAJLyoKIAkgKiBDYWxsIHRoZSBnZW5lcmljIHRpbWVyIGludGVycnVwdCBoYW5kbGVyCiAJICovCkBAIC0xNTMsNjAgKzE4MCwzNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXJfaXJxYWN0aW9uID0gewotCS5oYW5kbGVyCT0gdGltZXJfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVELAotCS5uYW1lCQk9ICJ0aW1lciIsCi19OwotCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG11bHQsIHNoaWZ0LCBjb3VudF9oejsKIAlpbnQgcmV0OwogCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBDT01QQVJFIGludGVycnVwdHMgYmVmb3JlIHdlIGNhbgorCSAqIGhhbmRsZSB0aGVtLgorCSAqLworCXN5c3JlZ193cml0ZShDT01QQVJFLCAwKTsKKwogCXh0aW1lLnR2X3NlYyA9IHJ0Y19nZXRfdGltZSgpOwogCXh0aW1lLnR2X25zZWMgPSAwOwogCiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogCQkJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKIAotCXByaW50aygiQmVmb3JlIHRpbWVfaW5pdDogY291bnQ9JTA4bHgsIGNvbXBhcmU9JTA4bHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXN5c3JlZ19yZWFkKENPVU5UKSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpc3lzcmVnX3JlYWQoQ09NUEFSRSkpOwotCi0JY291bnRfaHogPSBjbGtfZ2V0X3JhdGUoYm9vdF9jcHVfZGF0YS5jbGspOwotCXNoaWZ0ID0gY2xvY2tzb3VyY2VfYXZyMzIuc2hpZnQ7Ci0JbXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoY291bnRfaHosIHNoaWZ0KTsKLQljbG9ja3NvdXJjZV9hdnIzMi5tdWx0ID0gbXVsdDsKLQotCXByaW50aygiQ3ljbGUgY291bnRlcjogbXVsdD0lbHUsIHNoaWZ0PSVsdVxuIiwgbXVsdCwgc2hpZnQpOwotCi0JewotCQl1NjQgdG1wOwotCi0JCXRtcCA9IFRJQ0tfTlNFQzsKLQkJdG1wIDw8PSBzaGlmdDsKLQkJdG1wICs9IG11bHQgLyAyOwotCQlkb19kaXYodG1wLCBtdWx0KTsKLQotCQljeWNsZXNfcGVyX2ppZmZ5ID0gdG1wOworCXJldCA9IGF2cjMyX2hwdF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1ZygidGltZXI6IGZhaWxlZCBzZXR1cDogJWRcbiIsIHJldCk7CisJCXJldHVybjsKIAl9CiAKLQkvKiBUaGlzIHNldHMgdXAgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIGZvciB0aGUgZmlyc3QgaW50ZXJydXB0LiAqLwotCWF2cjMyX2hwdF9pbml0KGF2cjMyX2hwdF9yZWFkKCkpOwotCi0JcHJpbnRrKCJBZnRlciB0aW1lX2luaXQ6IGNvdW50PSUwOGx4LCBjb21wYXJlPSUwOGx4XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylzeXNyZWdfcmVhZChDT1VOVCksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXN5c3JlZ19yZWFkKENPTVBBUkUpKTsKLQogCXJldCA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9hdnIzMik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAidGltZXI6IGNvdWxkIG5vdCByZWdpc3RlciBjbG9ja3NvdXJjZTogJWRcbiIsIHJldCk7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IHJlZ2lzdGVyIGNsb2Nrc291cmNlOiAlZFxuIiwgcmV0KTsKIAotCXJldCA9IHNldHVwX2lycSgwLCAmdGltZXJfaXJxYWN0aW9uKTsKLQlpZiAocmV0KQotCQlwcmludGsoInRpbWVyOiBjb3VsZCBub3QgcmVxdWVzdCBJUlEgMDogJWRcbiIsIHJldCk7CisJcmV0ID0gYXZyMzJfaHB0X3N0YXJ0KCk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1ZygidGltZXI6IGZhaWxlZCBzdGFydGluZzogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX2NsYXNzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggYWRjMDFhMS4uNGYwMzgyZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC01LDE1OCArNSwyNSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jdW5kZWYgREVCVUcKLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL29jZC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyB2b2lkIGR1bXBfbWVtKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBib3R0b20sIHVuc2lnbmVkIGxvbmcgdG9wKQotewotCXVuc2lnbmVkIGxvbmcgcDsKLQlpbnQgaTsKLQotCXByaW50aygiJXMoMHglMDhseCB0byAweCUwOGx4KVxuIiwgc3RyLCBib3R0b20sIHRvcCk7Ci0KLQlmb3IgKHAgPSBib3R0b20gJiB+MzE7IHAgPCB0b3A7ICkgewotCQlwcmludGsoIiUwNGx4OiAiLCBwICYgMHhmZmZmKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwICs9IDQpIHsKLQkJCXVuc2lnbmVkIGludCB2YWw7Ci0KLQkJCWlmIChwIDwgYm90dG9tIHx8IHAgPj0gdG9wKQotCQkJCXByaW50aygiICAgICAgICAgIik7Ci0JCQllbHNlIHsKLQkJCQlpZiAoX19nZXRfdXNlcih2YWwsICh1bnNpZ25lZCBpbnQgX191c2VyICopcCkpIHsKLQkJCQkJcHJpbnRrKCJcbiIpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQkJcHJpbnRrKCIlMDh4ICIsIHZhbCk7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRrKCJcbiIpOwotCX0KLQotb3V0OgotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3RhY2tfcHRyKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sIHVuc2lnbmVkIGxvbmcgcCkKLXsKLQlyZXR1cm4gKHAgPiAodW5zaWduZWQgbG9uZyl0aW5mbykKLQkJJiYgKHAgPCAodW5zaWduZWQgbG9uZyl0aW5mbyArIFRIUkVBRF9TSVpFIC0gMyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotc3RhdGljIGlubGluZSB2b2lkIF9fc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3AsCi0JCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBsciwgZnA7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKLQotCXRpbmZvID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkoKHVuc2lnbmVkIGxvbmcpc3AgJiB+KFRIUkVBRF9TSVpFIC0gMSkpOwotCi0JaWYgKHJlZ3MpCi0JCWZwID0gcmVncy0+cjc7Ci0JZWxzZSBpZiAodHNrID09IGN1cnJlbnQpCi0JCWFzbSgibW92ICUwLCByNyIgOiAiPXIiKGZwKSk7Ci0JZWxzZQotCQlmcCA9IHRzay0+dGhyZWFkLmNwdV9jb250ZXh0LnI3OwotCi0JLyoKLQkgKiBXYWxrIHRoZSBzdGFjayBhcyBsb25nIGFzIHRoZSBmcmFtZSBwb2ludGVyIChhKSBpcyB3aXRoaW4KLQkgKiB0aGUga2VybmVsIHN0YWNrIG9mIHRoZSB0YXNrLCBhbmQgKGIpIGl0IGRvZXNuJ3QgbW92ZQotCSAqIGRvd253YXJkcy4KLQkgKi8KLQl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCBmcCkpIHsKLQkJdW5zaWduZWQgbG9uZyBuZXdfZnA7Ci0KLQkJbHIgPSAqKHVuc2lnbmVkIGxvbmcgKilmcDsKLQkJcHJpbnRrKCIgWzwlMDhseD5dICIsIGxyKTsKLQkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgbHIpOwotCi0JCW5ld19mcCA9ICoodW5zaWduZWQgbG9uZyAqKShmcCArIDQpOwotCQlpZiAobmV3X2ZwIDw9IGZwKQotCQkJYnJlYWs7Ci0JCWZwID0gbmV3X2ZwOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIF9fc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3AsCi0JCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0Jd2hpbGUgKCFrc3RhY2tfZW5kKHNwKSkgewotCQlhZGRyID0gKnNwKys7Ci0JCWlmIChrZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlwcmludGsoIiBbPCUwOGx4Pl0gIiwgYWRkcik7Ci0JCQlwcmludF9zeW1ib2woIiVzXG4iLCBhZGRyKTsKLQkJfQotCX0KLX0KLSNlbmRpZgotCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwLAotCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaWYgKHJlZ3MgJiYKLQkgICAgKCgocmVncy0+c3IgJiBNT0RFX01BU0spID09IE1PREVfRVhDRVBUSU9OKSB8fAotCSAgICAgKChyZWdzLT5zciAmIE1PREVfTUFTSykgPT0gTU9ERV9VU0VSKSkpCi0JCXJldHVybjsKLQotCXByaW50ayAoIkNhbGwgdHJhY2U6Iik7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0KLQlfX3Nob3dfdHJhY2UodHNrLCBzcCwgcmVncyk7Ci0JcHJpbnRrKCJcbiIpOwotfQotCi12b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwKQotewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0KLQlpZiAoIXRzaykKLQkJdHNrID0gY3VycmVudDsKLQlpZiAoc3AgPT0gMCkgewotCQlpZiAodHNrID09IGN1cnJlbnQpIHsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnJlYWxfc3AgX19hc21fXygic3AiKTsKLQkJCXNwID0gcmVhbF9zcDsKLQkJfSBlbHNlIHsKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKil0c2stPnRocmVhZC5jcHVfY29udGV4dC5rc3A7Ci0JCX0KLQl9Ci0KLQlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXNwOwotCWR1bXBfbWVtKCJTdGFjazogIiwgc3RhY2ssCi0JCSBUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8pOwotCXNob3dfdHJhY2UodHNrLCBzcCwgTlVMTCk7Ci19Ci0KLXZvaWQgZHVtcF9zdGFjayh2b2lkKQotewotCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworI2luY2x1ZGUgPGFzbS9vY2QuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKIEFUT01JQ19OT1RJRklFUl9IRUFEKGF2cjMyX2RpZV9jaGFpbik7CiAKIGludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKLQlwcl9kZWJ1ZygicmVnaXN0ZXJfZGllX25vdGlmaWVyOiAlcFxuIiwgbmIpOwotCiAJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmYXZyMzJfZGllX2NoYWluLCBuYik7CiB9CiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2RpZV9ub3RpZmllcik7CkBAIC0xNjksOTMgKzM2LDEwMyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKIAotdm9pZCBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVyciwKLQkgICBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jLCB1bnNpZ25lZCBsb25nIGxpbmUpCit2b2lkIE5PUkVUX1RZUEUgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdGF0aWMgaW50IGRpZV9jb3VudGVyOwogCiAJY29uc29sZV92ZXJib3NlKCk7CiAJc3Bpbl9sb2NrX2lycSgmZGllX2xvY2spOwogCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCi0JcHJpbnRrKEtFUk5fQUxFUlQgIiVzIiwgc3RyKTsKLQlpZiAoZmlsZSAmJiBmdW5jKQotCQlwcmludGsoIiBpbiAlczolcywgbGluZSAlbGQiLCBmaWxlLCBmdW5jLCBsaW5lKTsKLQlwcmludGsoIlsjJWRdOlxuIiwgKytkaWVfY291bnRlcik7Ci0JcHJpbnRfbW9kdWxlcygpOwotCXNob3dfcmVncyhyZWdzKTsKLQlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gMHglcClcbiIsCi0JICAgICAgIHRzay0+Y29tbSwgdHNrLT5waWQsIHRzay0+dGhyZWFkX2luZm8gKyAxKTsKLQotCWlmICghdXNlcl9tb2RlKHJlZ3MpIHx8IGluX2ludGVycnVwdCgpKSB7Ci0JCWR1bXBfbWVtKCJTdGFjazogIiwgcmVncy0+c3AsCi0JCQkgVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiT29wczogJXMsIHNpZzogJWxkIFsjJWRdXG4iIEtFUk5fRU1FUkcsCisJICAgICAgIHN0ciwgZXJyLCArK2RpZV9jb3VudGVyKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXByaW50aygiUFJFRU1QVCAiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJcHJpbnRrKCJGUkFNRV9QT0lOVEVSICIpOworI2VuZGlmCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZmVhdHVyZXMgJiBBVlIzMl9GRUFUVVJFX09DRCkgeworCQl1bnNpZ25lZCBsb25nIGRpZCA9IF9fbWZkcihEQkdSRUdfRElEKTsKKwkJcHJpbnRrKCJjaGlwOiAweCUwM2x4OjB4JTA0bHggcmV2ICVsdVxuIiwKKwkJICAgICAgIChkaWQgPj4gMSkgJiAweDdmZiwKKwkJICAgICAgIChkaWQgPj4gMTIpICYgMHg3ZmZmLAorCQkgICAgICAgKGRpZCA+PiAyOCkgJiAweGYpOworCX0gZWxzZSB7CisJCXByaW50aygiY3B1OiBhcmNoICV1IHIldSAvIGNvcmUgJXUgciV1XG4iLAorCQkgICAgICAgY3VycmVudF9jcHVfZGF0YS5hcmNoX3R5cGUsCisJCSAgICAgICBjdXJyZW50X2NwdV9kYXRhLmFyY2hfcmV2aXNpb24sCisJCSAgICAgICBjdXJyZW50X2NwdV9kYXRhLmNwdV90eXBlLAorCQkgICAgICAgY3VycmVudF9jcHVfZGF0YS5jcHVfcmV2aXNpb24pOwogCX0KIAorCXByaW50X21vZHVsZXMoKTsKKwlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCBLRVJOX0VNRVJHKTsKKwlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncy0+c3AsIHJlZ3MsIEtFUk5fRU1FUkcpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwotCWRvX2V4aXQoU0lHU0VHVik7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CisKKwlpZiAocGFuaWNfb25fb29wcykKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOworCisJZG9fZXhpdChlcnIpOwogfQogCi12b2lkIF9fZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVyciwKLQkJICAgICBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jLCB1bnNpZ25lZCBsb25nIGxpbmUpCit2b2lkIF9leGNlcHRpb24obG9uZyBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjb2RlLAorCQl1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJc2lnaW5mb190IGluZm87CisKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJX19kaWUoc3RyLCByZWdzLCBlcnIsIGZpbGUsIGZ1bmMsIGxpbmUpOworCQlkaWUoIlVuaGFuZGxlZCBleGNlcHRpb24gaW4ga2VybmVsIG1vZGUiLCByZWdzLCBzaWducik7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJaW5mby5zaV9zaWdubyA9IHNpZ25yOworCWluZm8uc2lfY29kZSA9IGNvZGU7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcjsKKwlmb3JjZV9zaWdfaW5mbyhzaWduciwgJmluZm8sIGN1cnJlbnQpOworCisJLyoKKwkgKiBJbml0IGdldHMgbm8gc2lnbmFscyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yLgorCSAqIFRoYXQncyBhbGwgdmVyeSB3ZWxsLCBidXQgaWYgaXQgaGFzIGNhdXNlZCBhIHN5bmNocm9ub3VzCisJICogZXhjZXB0aW9uIGFuZCB3ZSBpZ25vcmUgdGhlIHJlc3VsdGluZyBzaWduYWwsIGl0IHdpbGwganVzdAorCSAqIGdlbmVyYXRlIHRoZSBzYW1lIGV4Y2VwdGlvbiBvdmVyIGFuZCBvdmVyIGFnYWluIGFuZCB3ZSBnZXQKKwkgKiBub3doZXJlLiAgQmV0dGVyIHRvIGtpbGwgaXQgYW5kIGxldCB0aGUga2VybmVsIHBhbmljLgorCSAqLworCWlmIChpc19pbml0KGN1cnJlbnQpKSB7CisJCV9fc2lnaGFuZGxlcl90IGhhbmRsZXI7CisKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCWhhbmRsZXIgPSBjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnbnItMV0uc2Euc2FfaGFuZGxlcjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJaWYgKGhhbmRsZXIgPT0gU0lHX0RGTCkgeworCQkJLyogaW5pdCBoYXMgZ2VuZXJhdGVkIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uCisJCQkgICBhbmQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IgdGhlIHNpZ25hbCAqLworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5pdCBoYXMgZ2VuZXJhdGVkIHNpZ25hbCAlbGQgIgorCQkJICAgICAgICJidXQgaGFzIG5vIGhhbmRsZXIgZm9yIGl0XG4iLCBzaWducik7CisJCQlkb19leGl0KHNpZ25yKTsKKwkJfQorCX0KIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX25taSh1bnNpZ25lZCBsb25nIGVjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWZkZWYgQ09ORklHX1NVQkFSQ0hfQVZSMzJCCi0JLyoKLQkgKiBUaGUgZXhjZXB0aW9uIGVudHJ5IGFsd2F5cyBzYXZlcyBSU1JfRVguIEZvciBOTUksIHRoaXMgaXMKLQkgKiB3cm9uZzsgaXQgc2hvdWxkIGJlIFJTUl9OTUkKLQkgKi8KLQlyZWdzLT5zciA9IHN5c3JlZ19yZWFkKFJTUl9OTUkpOwotI2VuZGlmCi0KLQlwcmludGsoIk5NSSB0YWtlbiEhISFcbiIpOwotCWRpZSgiTk1JIiwgcmVncywgZWNyKTsKLQlCVUcoKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiR290IE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHQsIGR1bXBpbmcgcmVnc1xuIik7CisJc2hvd19yZWdzX2xvZ19sdmwocmVncywgS0VSTl9BTEVSVCk7CisJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MtPnNwLCByZWdzLCBLRVJOX0FMRVJUKTsKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX2NyaXRpY2FsX2V4Y2VwdGlvbih1bnNpZ25lZCBsb25nIGVjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JcHJpbnRrKCJVbmFibGUgdG8gaGFuZGxlIGNyaXRpY2FsIGV4Y2VwdGlvbiAlbHUgYXQgcGMgPSAlMDhseCFcbiIsCi0JICAgICAgIGVjciwgcmVncy0+cGMpOwotCWRpZSgiT29wcyIsIHJlZ3MsIGVjcik7Ci0JQlVHKCk7CisJZGllKCJDcml0aWNhbCBleGNlcHRpb24iLCByZWdzLCBTSUdLSUxMKTsKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX2FkZHJlc3NfZXhjZXB0aW9uKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzaWdpbmZvX3QgaW5mbzsKLQotCWRpZV9pZl9rZXJuZWwoIk9vcHM6IEFkZHJlc3MgZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlIiwgcmVncywgZWNyKTsKLQotI2lmZGVmIERFQlVHCi0JaWYgKGVjciA9PSBFQ1JfQUREUl9BTElHTl9YKQotCQlwcl9kZWJ1ZygiSW5zdHJ1Y3Rpb24gQWRkcmVzcyBFeGNlcHRpb24gYXQgcGMgPSAlMDhseFxuIiwKLQkJCSByZWdzLT5wYyk7Ci0JZWxzZSBpZiAoZWNyID09IEVDUl9BRERSX0FMSUdOX1IpCi0JCXByX2RlYnVnKCJEYXRhIEFkZHJlc3MgRXhjZXB0aW9uIChSZWFkKSBhdCBwYyA9ICUwOGx4XG4iLAotCQkJIHJlZ3MtPnBjKTsKLQllbHNlIGlmIChlY3IgPT0gRUNSX0FERFJfQUxJR05fVykKLQkJcHJfZGVidWcoIkRhdGEgQWRkcmVzcyBFeGNlcHRpb24gKFdyaXRlKSBhdCBwYyA9ICUwOGx4XG4iLAotCQkJIHJlZ3MtPnBjKTsKLQllbHNlCi0JCUJVRygpOwotCi0Jc2hvd19yZWdzKHJlZ3MpOwotI2VuZGlmCi0KLQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOwotCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfY29kZSA9IEJVU19BRFJBTE47Ci0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopcmVncy0+cGM7Ci0KLQlmb3JjZV9zaWdfaW5mbyhTSUdCVVMsICZpbmZvLCBjdXJyZW50KTsKKwlfZXhjZXB0aW9uKFNJR0JVUywgcmVncywgQlVTX0FEUkFMTiwgcmVncy0+cGMpOwogfQogCiAvKiBUaGlzIHdheSBvZiBoYW5kbGluZyB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zIGlzIHN0b2xlbiBmcm9tIEFSTSAqLwpAQCAtMjgwLDcgKzE1Nyw4IEBACiB7CiAJaW50IGNvcF9ucjsKIAl1MzIgY3B1Y3I7Ci0JaWYgKCAoaW5zbiAmIDB4ZmRmMDAwMDApID09IDB4ZjE5MDAwMDAgKQorCisJaWYgKChpbnNuICYgMHhmZGYwMDAwMCkgPT0gMHhmMTkwMDAwMCkKIAkJLyogTERDMCAqLwogCQljb3BfbnIgPSAwOwogCWVsc2UKQEAgLTI5MiwxMzYgKzE3MCw5MSBAQAogCXN5c3JlZ193cml0ZShDUFVDUiwgY3B1Y3IpOwogCiAJY3B1Y3IgPSBzeXNyZWdfcmVhZChDUFVDUik7Ci0JaWYgKCAhKGNwdWNyICYgKDEgPDwgKDI0ICsgY29wX25yKSkpICl7Ci0JCXByaW50aygiQ29wcm9jZXNzb3IgIyVpIG5vdCBmb3VuZCFcbiIsIGNvcF9ucik7Ci0JCXJldHVybiAtMTsKLQl9CisJaWYgKCEoY3B1Y3IgJiAoMSA8PCAoMjQgKyBjb3BfbnIpKSkpCisJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQlVHCi0jaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19idWdfdmVyYm9zZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTMyIGluc24pCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIHBjKQogewotCWNoYXIgKmZpbGU7Ci0JdTE2IGxpbmU7Ci0JY2hhciBjOworCXVuc2lnbmVkIHNob3J0IG9wY29kZTsKIAotCWlmIChfX2dldF91c2VyKGxpbmUsICh1MTYgX191c2VyICopKHJlZ3MtPnBjICsgMikpKQotCQlyZXR1cm47Ci0JaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiBfX3VzZXIgKikocmVncy0+cGMgKyA0KSkKLQkgICAgfHwgKHVuc2lnbmVkIGxvbmcpZmlsZSA8IFBBR0VfT0ZGU0VUCi0JICAgIHx8IF9fZ2V0X3VzZXIoYywgZmlsZSkpCi0JCWZpbGUgPSAiPGJhZCBmaWxlbmFtZT4iOworCWlmIChwYyA8IFBBR0VfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKwlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHUxNiAqKXBjLCBvcGNvZGUpKQorCQlyZXR1cm4gMDsKIAotCXByaW50ayhLRVJOX0FMRVJUICJrZXJuZWwgQlVHIGF0ICVzOiVkIVxuIiwgZmlsZSwgbGluZSk7CisJcmV0dXJuIG9wY29kZSA9PSBBVlIzMl9CVUdfT1BDT0RFOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19idWdfdmVyYm9zZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTMyIGluc24pCi17Ci0KLX0KLSNlbmRpZgotI2VuZGlmCiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19pbGxlZ2FsX29wY29kZSh1bnNpZ25lZCBsb25nIGVjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGluc247CiAJc3RydWN0IHVuZGVmX2hvb2sgKmhvb2s7Ci0Jc2lnaW5mb190IGluZm87CiAJdm9pZCBfX3VzZXIgKnBjOworCWxvbmcgY29kZTsKIAotCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlnb3RvIGtlcm5lbF90cmFwOworCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmIChlY3IgPT0gRUNSX0lMTEVHQUxfT1BDT0RFKSkgeworCQllbnVtIGJ1Z190cmFwX3R5cGUgdHlwZTsKKworCQl0eXBlID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEJVR19UUkFQX1RZUEVfTk9ORToKKwkJCWJyZWFrOworCQljYXNlIEJVR19UUkFQX1RZUEVfV0FSTjoKKwkJCXJlZ3MtPnBjICs9IDI7CisJCQlyZXR1cm47CisJCWNhc2UgQlVHX1RSQVBfVFlQRV9CVUc6CisJCQlkaWUoIktlcm5lbCBCVUciLCByZWdzLCBTSUdLSUxMKTsKKwkJfQorCX0KIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCXBjID0gKHZvaWQgX191c2VyICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKLQlpZiAoX19nZXRfdXNlcihpbnNuLCAodTMyIF9fdXNlciAqKXBjKSkKLQkJZ290byBpbnZhbGlkX2FyZWE7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQlwYyA9ICh2b2lkIF9fdXNlciAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJCWlmIChnZXRfdXNlcihpbnNuLCAodTMyIF9fdXNlciAqKXBjKSkKKwkJCWdvdG8gaW52YWxpZF9hcmVhOwogCi0gICAgICAgIGlmIChlY3IgPT0gRUNSX0NPUFJPQ19BQlNFTlQpIHsKLQkJaWYgKGRvX2NvcF9hYnNlbnQoaW5zbikgPT0gMCkKKwkJaWYgKGVjciA9PSBFQ1JfQ09QUk9DX0FCU0VOVCAmJiAhZG9fY29wX2Fic2VudChpbnNuKSkKIAkJCXJldHVybjsKLSAgICAgICAgfQogCi0Jc3Bpbl9sb2NrX2lycSgmdW5kZWZfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShob29rLCAmdW5kZWZfaG9vaywgbm9kZSkgewotCQlpZiAoKGluc24gJiBob29rLT5pbnNuX21hc2spID09IGhvb2stPmluc25fdmFsKSB7Ci0JCQlpZiAoaG9vay0+Zm4ocmVncywgaW5zbikgPT0gMCkgewotCQkJCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7Ci0JCQkJcmV0dXJuOworCQlzcGluX2xvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShob29rLCAmdW5kZWZfaG9vaywgbm9kZSkgeworCQkJaWYgKChpbnNuICYgaG9vay0+aW5zbl9tYXNrKSA9PSBob29rLT5pbnNuX3ZhbCkgeworCQkJCWlmIChob29rLT5mbihyZWdzLCBpbnNuKSA9PSAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJCQkJCXJldHVybjsKKwkJCQl9CiAJCQl9CiAJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKIAotaW52YWxpZF9hcmVhOgotCi0jaWZkZWYgREVCVUcKLQlwcmludGsoIklsbGVnYWwgaW5zdHJ1Y3Rpb24gYXQgcGMgPSAlMDhseFxuIiwgcmVncy0+cGMpOwotCWlmIChyZWdzLT5wYyA8IFRBU0tfU0laRSkgewotCQl1bnNpZ25lZCBsb25nIHB0YnIsIHBnZCwgcHRlLCAqcDsKLQotCQlwdGJyID0gc3lzcmVnX3JlYWQoUFRCUik7Ci0JCXAgPSAodW5zaWduZWQgbG9uZyAqKXB0YnI7Ci0JCXBnZCA9IHBbcmVncy0+cGMgPj4gMjJdOwotCQlwID0gKHVuc2lnbmVkIGxvbmcgKikoKHBnZCAmIDB4MWZmZmYwMDApIHwgMHg4MDAwMDAwMCk7Ci0JCXB0ZSA9IHBbKHJlZ3MtPnBjID4+IDEyKSAmIDB4M2ZmXTsKLQkJcHJpbnRrKCJwYWdlIHRhYmxlOiAweCUwOGx4IC0+IDB4JTA4bHggLT4gMHglMDhseFxuIiwgcHRiciwgcGdkLCBwdGUpOwotCX0KLSNlbmRpZgotCi0JaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKIAlzd2l0Y2ggKGVjcikgewotCWNhc2UgRUNSX0lMTEVHQUxfT1BDT0RFOgotCWNhc2UgRUNSX1VOSU1QTF9JTlNUUlVDVElPTjoKLQkJaW5mby5zaV9jb2RlID0gSUxMX0lMTE9QQzsKLQkJYnJlYWs7CiAJY2FzZSBFQ1JfUFJJVklMRUdFX1ZJT0xBVElPTjoKLQkJaW5mby5zaV9jb2RlID0gSUxMX1BSVk9QQzsKKwkJY29kZSA9IElMTF9QUlZPUEM7CiAJCWJyZWFrOwogCWNhc2UgRUNSX0NPUFJPQ19BQlNFTlQ6Ci0JCWluZm8uc2lfY29kZSA9IElMTF9DT1BST0M7CisJCWNvZGUgPSBJTExfQ09QUk9DOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlCVUcoKTsKKwkJY29kZSA9IElMTF9JTExPUEM7CisJCWJyZWFrOwogCX0KIAotCWZvcmNlX3NpZ19pbmZvKFNJR0lMTCwgJmluZm8sIGN1cnJlbnQpOworCV9leGNlcHRpb24oU0lHSUxMLCByZWdzLCBjb2RlLCByZWdzLT5wYyk7CiAJcmV0dXJuOwogCi1rZXJuZWxfdHJhcDoKLSNpZmRlZiBDT05GSUdfQlVHCi0JaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKSkgewotCQlpbnNuID0gKih1MTYgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwotCQlpZiAoaW5zbiA9PSBBVlIzMl9CVUdfT1BDT0RFKSB7Ci0JCQlkb19idWdfdmVyYm9zZShyZWdzLCBpbnNuKTsKLQkJCWRpZSgiS2VybmVsIEJVRyIsIHJlZ3MsIDApOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlkaWUoIk9vcHM6IElsbGVnYWwgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzLCBlY3IpOworaW52YWxpZF9hcmVhOgorCV9leGNlcHRpb24oU0lHU0VHViwgcmVncywgU0VHVl9NQVBFUlIsIHJlZ3MtPnBjKTsKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX2ZwZSh1bnNpZ25lZCBsb25nIGVjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc2lnaW5mb190IGluZm87Ci0KLQlwcmludGsoIkZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBhdCBwYyA9ICUwOGx4XG4iLCByZWdzLT5wYyk7Ci0KLQkvKiBXZSBoYXZlIG5vIEZQVS4uLiAqLwotCWluZm8uc2lfc2lnbm8gPSBTSUdJTEw7Ci0JaW5mby5zaV9lcnJubyA9IDA7Ci0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopcmVncy0+cGM7Ci0JaW5mby5zaV9jb2RlID0gSUxMX0NPUFJPQzsKLQotCWZvcmNlX3NpZ19pbmZvKFNJR0lMTCwgJmluZm8sIGN1cnJlbnQpOworCS8qIFdlIGhhdmUgbm8gRlBVIHlldCAqLworCV9leGNlcHRpb24oU0lHSUxMLCByZWdzLCBJTExfQ09QUk9DLCByZWdzLT5wYyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3ZtbGludXgubGRzLmMKaW5kZXggZWYxM2I3YzcuLjdhZDIwY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3ZtbGludXgubGRzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYwpAQCAtMjYsNiArMjYsMTIgQEAKIAkJCV9zaW5pdHRleHQgPSAuOwogCQkJKigudGV4dC5yZXNldCkKIAkJCSooLmluaXQudGV4dCkKKwkJCS8qCisJCQkgKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmRlZCBhdCBydW50aW1lLCBub3QKKwkJCSAqIGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoIHJlZmVyZW5jZXMgZnJvbQorCQkJICogX19idWdfdGFibGUKKwkJCSAqLworCQkJKiguZXhpdC50ZXh0KQogCQkJX2Vpbml0dGV4dCA9IC47CiAJCS4gPSBBTElHTig0KTsKIAkJX190YWd0YWJsZV9iZWdpbiA9IC47CkBAIC04Niw2ICs5Miw4IEBACiAJCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKIAl9CiAKKwlCVUdfVEFCTEUKKwogCVJPREFUQQogCiAJLiA9IEFMSUdOKDgxOTIpOwpAQCAtMTI2LDcgKzEzNCw2IEBACiAJICogdGhyb3duIGF3YXksIGFzIGNsZWFudXAgY29kZSBpcyBuZXZlciBjYWxsZWQgdW5sZXNzIGl0J3MgYSBtb2R1bGUuCiAJICovCiAJL0RJU0NBUkQvICAgICAgIAk6IHsKLQkJKiguZXhpdC50ZXh0KQogCQkqKC5leGl0LmRhdGEpCiAJCSooLmV4aXRjYWxsLmV4aXQpCiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9LY29uZmlnIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzA3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAoraWYgUExBVEZPUk1fQVQzMkFQCisKK21lbnUgIkF0bWVsIEFWUjMyIEFQIG9wdGlvbnMiCisKK2Nob2ljZQorCXByb21wdCAiQVQzMkFQNzAwMCBzdGF0aWMgbWVtb3J5IGJ1cyB3aWR0aCIKKwlkZXBlbmRzIG9uIENQVV9BVDMyQVA3MDAwCisJZGVmYXVsdCBBUDcwMDBfMTZfQklUX1NNQworCWhlbHAKKwkgIERlZmluZSB0aGUgd2lkdGggb2YgdGhlIEFQNzAwMCBleHRlcm5hbCBzdGF0aWMgbWVtb3J5IGludGVyZmFjZS4KKwkgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRvIG1hbmdsZSB0aGUgYWRkcmVzcyBhbmQvb3IgZGF0YQorCSAgd2hlbiBkb2luZyBsaXR0bGUtZW5kaWFuIHBvcnQgYWNjZXNzLgorCisJICBUaGUgY3VycmVudCBjb2RlIGNhbiBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgZXh0ZXJuYWwgbWVtb3J5IGJ1cworCSAgd2lkdGggZm9yIGFsbCBjaGlwIHNlbGVjdHMsIGV4Y2x1ZGluZyB0aGUgZmxhc2ggKHdoaWNoIGlzIHVzaW5nCisJICByYXcgYWNjZXNzIGFuZCBpcyB0aHVzIG5vdCBhZmZlY3RlZCBieSBhbnkgb2YgdGhpcy4pCisKK2NvbmZpZyBBUDcwMDBfMzJfQklUX1NNQworCWJvb2wgIjMyIGJpdCIKKworY29uZmlnIEFQNzAwMF8xNl9CSVRfU01DCisJYm9vbCAiMTYgYml0IgorCitjb25maWcgQVA3MDAwXzhfQklUX1NNQworCWJvb2wgIjggYml0IgorCitlbmRjaG9pY2UKKworZW5kbWVudQorCitlbmRpZiAjIFBMQVRGT1JNX0FUMzJBUApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUKaW5kZXggYjIxYmVhOS4uZjFkMzk1NyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL01ha2VmaWxlCkBAIC0xLDIgKzEsMyBAQAogb2JqLXkJCQkJKz0gYXQzMmFwLm8gY2xvY2subyBpbnRjLm8gZXh0aW50Lm8gcGlvLm8gaHNtYy5vCiBvYmotJChDT05GSUdfQ1BVX0FUMzJBUDcwMDApCSs9IGF0MzJhcDcwMDAubworb2JqLSQoQ09ORklHX0NQVV9BVDMyQVA3MDAwKQkrPSB0aW1lLXRjLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAwMC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKaW5kZXggNDcyNzAzZi4uNTZkYjQ1YiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9zbS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJobWF0cml4LmgiCiAjaW5jbHVkZSAicGlvLmgiCiAjaW5jbHVkZSAic20uaCIKIApAQCAtNDE2LDcgKzQxNywxNSBAQAogCS5yZXNvdXJjZQk9IHNtX3Jlc291cmNlLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbV9yZXNvdXJjZSksCiB9OwotREVWX0NMSyhwY2xrLCBhdDMyX3NtLCBwYmIsIDApOworc3RhdGljIHN0cnVjdCBjbGsgYXQzMl9zbV9wY2xrID0geworCS5uYW1lCQk9ICJwY2xrIiwKKwkuZGV2CQk9ICZhdDMyX3NtX2RldmljZS5kZXYsCisJLnBhcmVudAkJPSAmcGJiX2NsaywKKwkubW9kZQkJPSBwYmJfY2xrX21vZGUsCisJLmdldF9yYXRlCT0gcGJiX2Nsa19nZXRfcmF0ZSwKKwkudXNlcnMJCT0gMSwKKwkuaW5kZXgJCT0gMCwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW50YzBfcmVzb3VyY2VbXSA9IHsKIAlQQk1FTSgweGZmZjAwNDAwKSwKQEAgLTQ0Miw2ICs0NTEsNyBAQAogCS5tb2RlCQk9IGhzYl9jbGtfbW9kZSwKIAkuZ2V0X3JhdGUJPSBoc2JfY2xrX2dldF9yYXRlLAogCS51c2VycwkJPSAxLAorCS5pbmRleAkJPSAzLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWMwX3Jlc291cmNlW10gPSB7CkBAIC00NjcsNiArNDc3LDU3IEBACiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSE1BVFJJWAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBjbGsgaG1hdHJpeF9jbGsgPSB7CisJLm5hbWUJCT0gImhtYXRyaXhfY2xrIiwKKwkucGFyZW50CQk9ICZwYmJfY2xrLAorCS5tb2RlCQk9IHBiYl9jbGtfbW9kZSwKKwkuZ2V0X3JhdGUJPSBwYmJfY2xrX2dldF9yYXRlLAorCS5pbmRleAkJPSAyLAorCS51c2VycwkJPSAxLAorfTsKKyNkZWZpbmUgSE1BVFJJWF9CQVNFCSgodm9pZCBfX2lvbWVtICopMHhmZmYwMDgwMCkKKworI2RlZmluZSBobWF0cml4X3JlYWRsKHJlZykJCQkJCVwKKwlfX3Jhd19yZWFkbCgoSE1BVFJJWF9CQVNFKSArIEhNQVRSSVhfIyNyZWcpCisjZGVmaW5lIGhtYXRyaXhfd3JpdGVsKHJlZyx2YWx1ZSkJCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAoSE1BVFJJWF9CQVNFKSArIEhNQVRSSVhfIyNyZWcpCisKKy8qCisgKiBTZXQgYml0cyBpbiB0aGUgSE1BVFJJWCBTcGVjaWFsIEZ1bmN0aW9uIFJlZ2lzdGVyIChTRlIpIHVzZWQgYnkgdGhlCisgKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIChFQkkpLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzcGVjaWFsCisgKiBmZWF0dXJlcyBsaWtlIENvbXBhY3RGbGFzaCBzdXBwb3J0LCBOQU5EIEZsYXNoIHN1cHBvcnQsIGV0Yy4gb24KKyAqIGNlcnRhaW4gY2hpcHNlbGVjdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZWJpX3Nmcl9iaXRzKHUzMiBtYXNrKQoreworCXUzMiBzZnI7CisKKwljbGtfZW5hYmxlKCZobWF0cml4X2Nsayk7CisJc2ZyID0gaG1hdHJpeF9yZWFkbChTRlI0KTsKKwlzZnIgfD0gbWFzazsKKwlobWF0cml4X3dyaXRlbChTRlI0LCBzZnIpOworCWNsa19kaXNhYmxlKCZobWF0cml4X2Nsayk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU3lzdGVtIFRpbWVyL0NvdW50ZXIgKFRDKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXQzMl9zeXN0YzBfcmVzb3VyY2VbXSA9IHsKKwlQQk1FTSgweGZmZjAwYzAwKSwKKwlJUlEoMjIpLAorfTsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQzMl9zeXN0YzBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzeXN0YyIsCisJLmlkCQk9IDAsCisJLnJlc291cmNlCT0gYXQzMl9zeXN0YzBfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0MzJfc3lzdGMwX3Jlc291cmNlKSwKK307CitERVZfQ0xLKHBjbGssIGF0MzJfc3lzdGMwLCBwYmIsIDMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFBJTwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNTE0LDYgKzU3NSw4IEBACiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWMwX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwZGNfZGV2aWNlKTsKIAorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQzMl9zeXN0YzBfZGV2aWNlKTsKKwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGlvMF9kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGlvMV9kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGlvMl9kZXZpY2UpOwpAQCAtOTUwLDYgKzEwMTMsNyBAQAogCSZwYmJfY2xrLAogCSZhdDMyX3NtX3BjbGssCiAJJmF0MzJfaW50YzBfcGNsaywKKwkmaG1hdHJpeF9jbGssCiAJJmViaV9jbGssCiAJJmhyYW1jX2NsaywKIAkmc21jMF9wY2xrLApAQCAtOTYyLDYgKzEwMjYsNyBAQAogCSZwaW8yX21jaywKIAkmcGlvM19tY2ssCiAJJnBpbzRfbWNrLAorCSZhdDMyX3N5c3RjMF9wY2xrLAogCSZhdG1lbF91c2FydDBfdXNhcnQsCiAJJmF0bWVsX3VzYXJ0MV91c2FydCwKIAkmYXRtZWxfdXNhcnQyX3VzYXJ0LApAQCAtMTAyNCw2ICsxMDg5LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdDMyX2Nsb2NrX2xpc3QpOyBpKyspIHsKIAkJc3RydWN0IGNsayAqY2xrID0gYXQzMl9jbG9ja19saXN0W2ldOwogCisJCWlmIChjbGstPnVzZXJzID09IDApCisJCQljb250aW51ZTsKKwogCQlpZiAoY2xrLT5tb2RlID09ICZjcHVfY2xrX21vZGUpCiAJCQljcHVfbWFzayB8PSAxIDw8IGNsay0+aW5kZXg7CiAJCWVsc2UgaWYgKGNsay0+bW9kZSA9PSAmaHNiX2Nsa19tb2RlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9obWF0cml4LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2htYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBiZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9obWF0cml4LmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgSGlnaC1TcGVlZCBCdXMgTWF0cml4CisgKi8KKyNpZm5kZWYgX19ITUFUUklYX0gKKyNkZWZpbmUgX19ITUFUUklYX0gKKworLyogSE1BVFJJWCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEhNQVRSSVhfTUNGRzAJCQkJMHgwMDAwCisjZGVmaW5lIEhNQVRSSVhfTUNGRzEJCQkJMHgwMDA0CisjZGVmaW5lIEhNQVRSSVhfTUNGRzIJCQkJMHgwMDA4CisjZGVmaW5lIEhNQVRSSVhfTUNGRzMJCQkJMHgwMDBjCisjZGVmaW5lIEhNQVRSSVhfTUNGRzQJCQkJMHgwMDEwCisjZGVmaW5lIEhNQVRSSVhfTUNGRzUJCQkJMHgwMDE0CisjZGVmaW5lIEhNQVRSSVhfTUNGRzYJCQkJMHgwMDE4CisjZGVmaW5lIEhNQVRSSVhfTUNGRzcJCQkJMHgwMDFjCisjZGVmaW5lIEhNQVRSSVhfTUNGRzgJCQkJMHgwMDIwCisjZGVmaW5lIEhNQVRSSVhfTUNGRzkJCQkJMHgwMDI0CisjZGVmaW5lIEhNQVRSSVhfTUNGRzEwCQkJCTB4MDAyOAorI2RlZmluZSBITUFUUklYX01DRkcxMQkJCQkweDAwMmMKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMTIJCQkJMHgwMDMwCisjZGVmaW5lIEhNQVRSSVhfTUNGRzEzCQkJCTB4MDAzNAorI2RlZmluZSBITUFUUklYX01DRkcxNAkJCQkweDAwMzgKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMTUJCQkJMHgwMDNjCisjZGVmaW5lIEhNQVRSSVhfU0NGRzAJCQkJMHgwMDQwCisjZGVmaW5lIEhNQVRSSVhfU0NGRzEJCQkJMHgwMDQ0CisjZGVmaW5lIEhNQVRSSVhfU0NGRzIJCQkJMHgwMDQ4CisjZGVmaW5lIEhNQVRSSVhfU0NGRzMJCQkJMHgwMDRjCisjZGVmaW5lIEhNQVRSSVhfU0NGRzQJCQkJMHgwMDUwCisjZGVmaW5lIEhNQVRSSVhfU0NGRzUJCQkJMHgwMDU0CisjZGVmaW5lIEhNQVRSSVhfU0NGRzYJCQkJMHgwMDU4CisjZGVmaW5lIEhNQVRSSVhfU0NGRzcJCQkJMHgwMDVjCisjZGVmaW5lIEhNQVRSSVhfU0NGRzgJCQkJMHgwMDYwCisjZGVmaW5lIEhNQVRSSVhfU0NGRzkJCQkJMHgwMDY0CisjZGVmaW5lIEhNQVRSSVhfU0NGRzEwCQkJCTB4MDA2OAorI2RlZmluZSBITUFUUklYX1NDRkcxMQkJCQkweDAwNmMKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMTIJCQkJMHgwMDcwCisjZGVmaW5lIEhNQVRSSVhfU0NGRzEzCQkJCTB4MDA3NAorI2RlZmluZSBITUFUUklYX1NDRkcxNAkJCQkweDAwNzgKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMTUJCQkJMHgwMDdjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzAJCQkJMHgwMDgwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzAJCQkJMHgwMDg0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzEJCQkJMHgwMDg4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzEJCQkJMHgwMDhjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzIJCQkJMHgwMDkwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzIJCQkJMHgwMDk0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzMJCQkJMHgwMDk4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzMJCQkJMHgwMDljCisjZGVmaW5lIEhNQVRSSVhfUFJBUzQJCQkJMHgwMGEwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzQJCQkJMHgwMGE0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzUJCQkJMHgwMGE4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzUJCQkJMHgwMGFjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzYJCQkJMHgwMGIwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzYJCQkJMHgwMGI0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzcJCQkJMHgwMGI4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzcJCQkJMHgwMGJjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzgJCQkJMHgwMGMwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzgJCQkJMHgwMGM0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzkJCQkJMHgwMGM4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzkJCQkJMHgwMGNjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzEwCQkJCTB4MDBkMAorI2RlZmluZSBITUFUUklYX1BSQlMxMAkJCQkweDAwZDQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMTEJCQkJMHgwMGQ4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzExCQkJCTB4MDBkYworI2RlZmluZSBITUFUUklYX1BSQVMxMgkJCQkweDAwZTAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMTIJCQkJMHgwMGU0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzEzCQkJCTB4MDBlOAorI2RlZmluZSBITUFUUklYX1BSQlMxMwkJCQkweDAwZWMKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMTQJCQkJMHgwMGYwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzE0CQkJCTB4MDBmNAorI2RlZmluZSBITUFUUklYX1BSQVMxNQkJCQkweDAwZjgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMTUJCQkJMHgwMGZjCisjZGVmaW5lIEhNQVRSSVhfTVJDUgkJCQkweDAxMDAKKyNkZWZpbmUgSE1BVFJJWF9TRlIwCQkJCTB4MDExMAorI2RlZmluZSBITUFUUklYX1NGUjEJCQkJMHgwMTE0CisjZGVmaW5lIEhNQVRSSVhfU0ZSMgkJCQkweDAxMTgKKyNkZWZpbmUgSE1BVFJJWF9TRlIzCQkJCTB4MDExYworI2RlZmluZSBITUFUUklYX1NGUjQJCQkJMHgwMTIwCisjZGVmaW5lIEhNQVRSSVhfU0ZSNQkJCQkweDAxMjQKKyNkZWZpbmUgSE1BVFJJWF9TRlI2CQkJCTB4MDEyOAorI2RlZmluZSBITUFUUklYX1NGUjcJCQkJMHgwMTJjCisjZGVmaW5lIEhNQVRSSVhfU0ZSOAkJCQkweDAxMzAKKyNkZWZpbmUgSE1BVFJJWF9TRlI5CQkJCTB4MDEzNAorI2RlZmluZSBITUFUUklYX1NGUjEwCQkJCTB4MDEzOAorI2RlZmluZSBITUFUUklYX1NGUjExCQkJCTB4MDEzYworI2RlZmluZSBITUFUUklYX1NGUjEyCQkJCTB4MDE0MAorI2RlZmluZSBITUFUUklYX1NGUjEzCQkJCTB4MDE0NAorI2RlZmluZSBITUFUUklYX1NGUjE0CQkJCTB4MDE0OAorI2RlZmluZSBITUFUUklYX1NGUjE1CQkJCTB4MDE0YworCisvKiBCaXRmaWVsZHMgaW4gTUNGR3ggKi8KKyNkZWZpbmUgSE1BVFJJWF9VTEJUX09GRlNFVAkJCTAKKyNkZWZpbmUgSE1BVFJJWF9VTEJUX1NJWkUJCQkzCisKKy8qIEJpdGZpZWxkcyBpbiBTQ0ZHeCAqLworI2RlZmluZSBITUFUUklYX1NMT1RfQ1lDTEVfT0ZGU0VUCQkwCisjZGVmaW5lIEhNQVRSSVhfU0xPVF9DWUNMRV9TSVpFCQkJOAorI2RlZmluZSBITUFUUklYX0RFRk1TVFJfVFlQRV9PRkZTRVQJCTE2CisjZGVmaW5lIEhNQVRSSVhfREVGTVNUUl9UWVBFX1NJWkUJCTIKKyNkZWZpbmUgSE1BVFJJWF9GSVhFRF9ERUZNU1RSX09GRlNFVAkJMTgKKyNkZWZpbmUgSE1BVFJJWF9GSVhFRF9ERUZNU1RSX1NJWkUJCTQKKyNkZWZpbmUgSE1BVFJJWF9BUkJUX09GRlNFVAkJCTI0CisjZGVmaW5lIEhNQVRSSVhfQVJCVF9TSVpFCQkJMgorCisvKiBCaXRmaWVsZHMgaW4gUFJBU3ggKi8KKyNkZWZpbmUgSE1BVFJJWF9NMFBSX09GRlNFVAkJCTAKKyNkZWZpbmUgSE1BVFJJWF9NMFBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTFQUl9PRkZTRVQJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTFQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX00yUFJfT0ZGU0VUCQkJOAorI2RlZmluZSBITUFUUklYX00yUFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NM1BSX09GRlNFVAkJCTEyCisjZGVmaW5lIEhNQVRSSVhfTTNQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX000UFJfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgSE1BVFJJWF9NNFBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTVQUl9PRkZTRVQJCQkyMAorI2RlZmluZSBITUFUUklYX001UFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NNlBSX09GRlNFVAkJCTI0CisjZGVmaW5lIEhNQVRSSVhfTTZQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX003UFJfT0ZGU0VUCQkJMjgKKyNkZWZpbmUgSE1BVFJJWF9NN1BSX1NJWkUJCQk0CisKKy8qIEJpdGZpZWxkcyBpbiBQUkJTeCAqLworI2RlZmluZSBITUFUUklYX004UFJfT0ZGU0VUCQkJMAorI2RlZmluZSBITUFUUklYX004UFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NOVBSX09GRlNFVAkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NOVBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTEwUFJfT0ZGU0VUCQkJOAorI2RlZmluZSBITUFUUklYX00xMFBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTExUFJfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgSE1BVFJJWF9NMTFQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX00xMlBSX09GRlNFVAkJCTE2CisjZGVmaW5lIEhNQVRSSVhfTTEyUFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMTNQUl9PRkZTRVQJCQkyMAorI2RlZmluZSBITUFUUklYX00xM1BSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTE0UFJfT0ZGU0VUCQkJMjQKKyNkZWZpbmUgSE1BVFJJWF9NMTRQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX00xNVBSX09GRlNFVAkJCTI4CisjZGVmaW5lIEhNQVRSSVhfTTE1UFJfU0laRQkJCTQKKworLyogQml0ZmllbGRzIGluIFNGUjQgKi8KKyNkZWZpbmUgSE1BVFJJWF9DUzFBX09GRlNFVAkJCTEKKyNkZWZpbmUgSE1BVFJJWF9DUzFBX1NJWkUJCQkxCisjZGVmaW5lIEhNQVRSSVhfQ1MzQV9PRkZTRVQJCQkzCisjZGVmaW5lIEhNQVRSSVhfQ1MzQV9TSVpFCQkJMQorI2RlZmluZSBITUFUUklYX0NTNEFfT0ZGU0VUCQkJNAorI2RlZmluZSBITUFUUklYX0NTNEFfU0laRQkJCTEKKyNkZWZpbmUgSE1BVFJJWF9DUzVBX09GRlNFVAkJCTUKKyNkZWZpbmUgSE1BVFJJWF9DUzVBX1NJWkUJCQkxCisjZGVmaW5lIEhNQVRSSVhfREJQVUNfT0ZGU0VUCQkJOAorI2RlZmluZSBITUFUUklYX0RCUFVDX1NJWkUJCQkxCisKKy8qIENvbnN0YW50cyBmb3IgVUxCVCAqLworI2RlZmluZSBITUFUUklYX1VMQlRfSU5GSU5JVEUJCQkwCisjZGVmaW5lIEhNQVRSSVhfVUxCVF9TSU5HTEUJCQkxCisjZGVmaW5lIEhNQVRSSVhfVUxCVF9GT1VSX0JFQVQJCQkyCisjZGVmaW5lIEhNQVRSSVhfVUxCVF9FSUdIVF9CRUFUCQkJMworI2RlZmluZSBITUFUUklYX1VMQlRfU0lYVEVFTl9CRUFUCQk0CisKKy8qIENvbnN0YW50cyBmb3IgREVGTVNUUl9UWVBFICovCisjZGVmaW5lIEhNQVRSSVhfREVGTVNUUl9UWVBFX05PX0RFRkFVTFQJCTAKKyNkZWZpbmUgSE1BVFJJWF9ERUZNU1RSX1RZUEVfTEFTVF9ERUZBVUxUCTEKKyNkZWZpbmUgSE1BVFJJWF9ERUZNU1RSX1RZUEVfRklYRURfREVGQVVMVAkyCisKKy8qIENvbnN0YW50cyBmb3IgQVJCVCAqLworI2RlZmluZSBITUFUUklYX0FSQlRfUk9VTkRfUk9CSU4JCTAKKyNkZWZpbmUgSE1BVFJJWF9BUkJUX0ZJWEVEX1BSSU9SSVRZCQkxCisKKy8qIEJpdCBtYW5pcHVsYXRpb24gbWFjcm9zICovCisjZGVmaW5lIEhNQVRSSVhfQklUKG5hbWUpCQkJCQlcCisJKDEgPDwgSE1BVFJJWF8jI25hbWUjI19PRkZTRVQpCisjZGVmaW5lIEhNQVRSSVhfQkYobmFtZSx2YWx1ZSkJCQkJCVwKKwkoKCh2YWx1ZSkgJiAoKDEgPDwgSE1BVFJJWF8jI25hbWUjI19TSVpFKSAtIDEpKQkJXAorCSA8PCBITUFUUklYXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgSE1BVFJJWF9CRkVYVChuYW1lLHZhbHVlKQkJCQlcCisJKCgodmFsdWUpID4+IEhNQVRSSVhfIyNuYW1lIyNfT0ZGU0VUKQkJCVwKKwkgJiAoKDEgPDwgSE1BVFJJWF8jI25hbWUjI19TSVpFKSAtIDEpKQorI2RlZmluZSBITUFUUklYX0JGSU5TKG5hbWUsdmFsdWUsb2xkKQkJCQlcCisJKCgob2xkKSAmIH4oKCgxIDw8IEhNQVRSSVhfIyNuYW1lIyNfU0laRSkgLSAxKQkJXAorCQkgICAgPDwgSE1BVFJJWF8jI25hbWUjI19PRkZTRVQpKQkJXAorCSB8IEhNQVRSSVhfQkYobmFtZSx2YWx1ZSkpCisKKyNlbmRpZiAvKiBfX0hNQVRSSVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2hzbWMuYwppbmRleCA3NjkxNzIxLi41ZTIyYTc1IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2hzbWMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2hzbWMuYwpAQCAtNzUsMTIgKzc1LDM1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXN3aXRjaCAoY29uZmlnLT5ud2FpdF9tb2RlKSB7CisJY2FzZSAwOgorCQltb2RlIHw9IEhTTUNfQkYoRVhOV19NT0RFLCBIU01DX0VYTldfTU9ERV9ESVNBQkxFRCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbW9kZSB8PSBIU01DX0JGKEVYTldfTU9ERSwgSFNNQ19FWE5XX01PREVfUkVTRVJWRUQpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1vZGUgfD0gSFNNQ19CRihFWE5XX01PREUsIEhTTUNfRVhOV19NT0RFX0ZST1pFTik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbW9kZSB8PSBIU01DX0JGKEVYTldfTU9ERSwgSFNNQ19FWE5XX01PREVfUkVBRFkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29uZmlnLT50ZGZfY3ljbGVzKSB7CisJCW1vZGUgfD0gSFNNQ19CRihUREZfQ1lDTEVTLCBjb25maWctPnRkZl9jeWNsZXMpOworCX0KKwogCWlmIChjb25maWctPm5yZF9jb250cm9sbGVkKQogCQltb2RlIHw9IEhTTUNfQklUKFJFQURfTU9ERSk7CiAJaWYgKGNvbmZpZy0+bndlX2NvbnRyb2xsZWQpCiAJCW1vZGUgfD0gSFNNQ19CSVQoV1JJVEVfTU9ERSk7CiAJaWYgKGNvbmZpZy0+Ynl0ZV93cml0ZSkKIAkJbW9kZSB8PSBIU01DX0JJVChCQVQpOworCWlmIChjb25maWctPnRkZl9tb2RlKQorCQltb2RlIHw9IEhTTUNfQklUKFRERl9NT0RFKTsKIAogCXByX2RlYnVnKCJzbWMgY3MlZDogc2V0dXAvJTA4eCBwdWxzZS8lMDh4IGN5Y2xlLyUwOHggbW9kZS8lMDh4XG4iLAogCQkgY3MsIHNldHVwLCBwdWxzZSwgY3ljbGUsIG1vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC90aW1lLXRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3RpbWUtdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA3MGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC90aW1lLXRjLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIEJhc2VkIG9uIE1JUFMgaW1wbGVtZW50YXRpb24gYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKKyAqICAgQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC90aW1lLmg+CisKKy8qIGhvdyBtYW55IGNvdW50ZXIgY3ljbGVzIGluIGEgamlmZnk/ICovCitzdGF0aWMgdTMyIGN5Y2xlc19wZXJfamlmZnk7CisKKy8qIHRoZSBjb3VudCB2YWx1ZSBmb3IgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0ICovCitzdGF0aWMgdTMyIGV4cGlyZWxvOworCisvKiB0aGUgSS9PIHJlZ2lzdGVycyBvZiB0aGUgVEMgbW9kdWxlICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICppb3JlZ3M7CisKK2N5Y2xlX3QgcmVhZF9jeWNsZV9jb3VudCh2b2lkKQoreworCXJldHVybiAoY3ljbGVfdCl0aW1lcl9yZWFkKGlvcmVncywgMCwgQ1YpOworfQorCitzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfYXZyMzIgPSB7CisJLm5hbWUJCT0gImF2cjMyIiwKKwkucmF0aW5nCQk9IDM0MiwKKwkucmVhZAkJPSByZWFkX2N5Y2xlX2NvdW50LAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMTYpLAorCS5zaGlmdAkJPSAxNiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCit9OworCitzdGF0aWMgdm9pZCBhdnIzMl90aW1lcl9hY2sodm9pZCkKK3sKKwl1MTYgY291bnQgPSBleHBpcmVsbzsKKworCS8qIEFjayB0aGlzIHRpbWVyIGludGVycnVwdCBhbmQgc2V0IHRoZSBuZXh0IG9uZSwgdXNlIGEgdTE2CisJICogdmFyaWFibGUgc28gaXQgd2lsbCB3cmFwIGFyb3VuZCBjb3JyZWN0bHkgKi8KKwljb3VudCArPSBjeWNsZXNfcGVyX2ppZmZ5OworCWV4cGlyZWxvID0gY291bnQ7CisJdGltZXJfd3JpdGUoaW9yZWdzLCAwLCBSQywgZXhwaXJlbG8pOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgbWlzc2VkIGFueSB0aW1lciBpbnRlcnJ1cHRzICovCisJY291bnQgPSB0aW1lcl9yZWFkKGlvcmVncywgMCwgQ1YpOworCWlmICgoY291bnQgLSBleHBpcmVsbykgPCAweDdmZmYpIHsKKwkJZXhwaXJlbG8gPSBjb3VudCArIGN5Y2xlc19wZXJfamlmZnk7CisJCXRpbWVyX3dyaXRlKGlvcmVncywgMCwgUkMsIGV4cGlyZWxvKTsKKwl9Cit9CisKK3UzMiBhdnIzMl9ocHRfcmVhZCh2b2lkKQoreworCXJldHVybiB0aW1lcl9yZWFkKGlvcmVncywgMCwgQ1YpOworfQorCitzdGF0aWMgaW50IGF2cjMyX3RpbWVyX2NhbGNfZGl2X2FuZF9zZXRfamlmZmllcyhzdHJ1Y3QgY2xrICpwY2xrKQoreworCXVuc2lnbmVkIGludCBjeWNsZXNfbWF4ID0gKGNsb2Nrc291cmNlX2F2cjMyLm1hc2sgKyAxKSAvIDI7CisJdW5zaWduZWQgaW50IGRpdnNbXSA9IHsgNCwgOCwgMTYsIDMyIH07CisJaW50IGRpdnNfc2l6ZSA9IHNpemVvZihkaXZzKSAvIHNpemVvZigqZGl2cyk7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgY291bnRfaHo7CisJdW5zaWduZWQgbG9uZyBzaGlmdDsKKwl1bnNpZ25lZCBsb25nIG11bHQ7CisJaW50IGNsb2NrX2RpdiA9IC0xOworCXU2NCB0bXA7CisKKwlzaGlmdCA9IGNsb2Nrc291cmNlX2F2cjMyLnNoaWZ0OworCisJZG8geworCQljb3VudF9oeiA9IGNsa19nZXRfcmF0ZShwY2xrKSAvIGRpdnNbaV07CisJCW11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KGNvdW50X2h6LCBzaGlmdCk7CisJCWNsb2Nrc291cmNlX2F2cjMyLm11bHQgPSBtdWx0OworCisJCXRtcCA9IFRJQ0tfTlNFQzsKKwkJdG1wIDw8PSBzaGlmdDsKKwkJdG1wICs9IG11bHQgLyAyOworCQlkb19kaXYodG1wLCBtdWx0KTsKKworCQljeWNsZXNfcGVyX2ppZmZ5ID0gdG1wOworCX0gd2hpbGUgKGN5Y2xlc19wZXJfamlmZnkgPiBjeWNsZXNfbWF4ICYmICsraSA8IGRpdnNfc2l6ZSk7CisKKwljbG9ja19kaXYgPSBpICsgMTsKKworCWlmIChjbG9ja19kaXYgPiBkaXZzX3NpemUpIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgY2FsY3VsYXRlIGNsb2NrIGRpdmlkZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBTZXQgdGhlIGNsb2NrIGRpdmlkZXIgKi8KKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsIENNUiwgVElNRVJfQkYoQ01SX1RDQ0xLUywgY2xvY2tfZGl2KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF2cjMyX2hwdF9pbml0KHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJc3RydWN0IGNsayAqcGNsazsKKwlpbnQgaXJxID0gLTE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSAtRU5YSU87CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKCZhdDMyX3N5c3RjMF9kZXZpY2UsIDApOworCWlmIChpcnEgPCAwKSB7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IGdldCBpcnFcbiIpOworCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwlwY2xrID0gY2xrX2dldCgmYXQzMl9zeXN0YzBfZGV2aWNlLmRldiwgInBjbGsiKTsKKwlpZiAoSVNfRVJSKHBjbGspKSB7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IGdldCBjbGs6ICVsZFxuIiwgUFRSX0VSUihwY2xrKSk7CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwljbGtfZW5hYmxlKHBjbGspOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSgmYXQzMl9zeXN0YzBfZGV2aWNlLCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IGdldCByZXNvdXJjZVxuIik7CisJCWdvdG8gb3V0X2Vycm9yX2NsazsKKwl9CisKKwlpb3JlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghaW9yZWdzKSB7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IGdldCBpb3JlZ3NcbiIpOworCQlnb3RvIG91dF9lcnJvcl9jbGs7CisJfQorCisJcmV0ID0gYXZyMzJfdGltZXJfY2FsY19kaXZfYW5kX3NldF9qaWZmaWVzKHBjbGspOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2Vycm9yX2lvOworCisJcmV0ID0gc2V0dXBfaXJxKGlycSwgJnRpbWVyX2lycWFjdGlvbik7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1ZygidGltZXI6IGNvdWxkIG5vdCByZXF1ZXN0IGlycSAlZDogJWRcbiIsCisJCQkJaXJxLCByZXQpOworCQlnb3RvIG91dF9lcnJvcl9pbzsKKwl9CisKKwlleHBpcmVsbyA9ICh0aW1lcl9yZWFkKGlvcmVncywgMCwgQ1YpIC8gY3ljbGVzX3Blcl9qaWZmeSArIDEpCisJCSogY3ljbGVzX3Blcl9qaWZmeTsKKworCS8qIEVuYWJsZSBjbG9jayBhbmQgaW50ZXJydXB0cyBvbiBSQyBjb21wYXJlICovCisJdGltZXJfd3JpdGUoaW9yZWdzLCAwLCBDQ1IsIFRJTUVSX0JJVChDQ1JfQ0xLRU4pKTsKKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsIElFUiwgVElNRVJfQklUKElFUl9DUENTKSk7CisJLyogU2V0IGN5Y2xlcyB0byBmaXJzdCBpbnRlcnJ1cHQgKi8KKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsICBSQywgZXhwaXJlbG8pOworCisJcHJpbnRrKEtFUk5fSU5GTyAidGltZXI6IEFUMzJBUCBzeXN0ZW0gdGltZXIvY291bnRlciBhdCAweCVwIGlycSAlZFxuIiwKKwkJCWlvcmVncywgaXJxKTsKKworCXJldHVybiAwOworCitvdXRfZXJyb3JfaW86CisJaW91bm1hcChpb3JlZ3MpOworb3V0X2Vycm9yX2NsazoKKwljbGtfcHV0KHBjbGspOworb3V0X2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhdnIzMl9ocHRfc3RhcnQodm9pZCkKK3sKKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsIENDUiwgVElNRVJfQklUKENDUl9TV1RSRykpOworCXJldHVybiAwOworfQorCitpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGludCBzciA9IHRpbWVyX3JlYWQoaW9yZWdzLCAwLCBTUik7CisKKwlpZiAoc3IgJiBUSU1FUl9CSVQoU1JfQ1BDUykpIHsKKwkJLyogYWNrIHRpbWVyIGludGVycnVwdCBhbmQgdHJ5IHRvIHNldCBuZXh0IGludGVycnVwdCAqLworCQlhdnIzMl90aW1lcl9hY2soKTsKKworCQkvKgorCQkgKiBDYWxsIHRoZSBnZW5lcmljIHRpbWVyIGludGVycnVwdCBoYW5kbGVyCisJCSAqLworCQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkJZG9fdGltZXIoMSk7CisJCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwkJLyoKKwkJICogSW4gVVAgbW9kZSwgd2UgY2FsbCBsb2NhbF90aW1lcl9pbnRlcnJ1cHQoKSB0byBkbyBwcm9maWxpbmcKKwkJICogYW5kIHByb2Nlc3MgYWNjb3VudGluZy4KKwkJICoKKwkJICogU01QIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorCQkgKi8KKwkJbG9jYWxfdGltZXJfaW50ZXJydXB0KGlycSwgZGV2X2lkKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9mYXVsdC5jIGIvYXJjaC9hdnIzMi9tbS9mYXVsdC5jCmluZGV4IDY3ODU1NzIuLjE0NmViZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vZmF1bHQuYworKysgYi9hcmNoL2F2cjMyL21tL2ZhdWx0LmMKQEAgLTE2LDI2ICsxNiw4IEBACiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBkdW1wX2NvZGUodW5zaWduZWQgbG9uZyBwYykKLXsKLQljaGFyICpwID0gKGNoYXIgKilwYzsKLQljaGFyIHZhbDsKLQlpbnQgaTsKLQotCi0JcHJpbnRrKEtFUk5fREVCVUcgIkNvZGU6Iik7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaWYgKF9fZ2V0X3VzZXIodmFsLCBwICsgaSkpCi0JCQlicmVhazsKLQkJcHJpbnRrKCIgJTAyeCIsIHZhbCk7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpZmRlZiBDT05GSUdfS1BST0JFUwogQVRPTUlDX05PVElGSUVSX0hFQUQobm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4pOwpAQCAtNjgsMTcgKzUwLDE5IEBACiB9CiAjZW5kaWYKIAoraW50IGV4Y2VwdGlvbl90cmFjZSA9IDE7CisKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBwYWdlIGZhdWx0cy4gSXQgZGV0ZXJtaW5lcyB0aGUgYWRkcmVzcyBhbmQgdGhlCiAgKiBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUgcm91dGluZXMuCiAgKgogICogZWNyIGlzIHRoZSBFeGNlcHRpb24gQ2F1c2UgUmVnaXN0ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gKiAgIDU6ICBQYWdlIG5vdCBmb3VuZCAoaW5zdHJ1Y3Rpb24gYWNjZXNzKQogICogICA2OiAgUHJvdGVjdGlvbiBmYXVsdCAoaW5zdHJ1Y3Rpb24gYWNjZXNzKQotICogICAxMjogUGFnZSBub3QgZm91bmQgKHJlYWQgYWNjZXNzKQotICogICAxMzogUGFnZSBub3QgZm91bmQgKHdyaXRlIGFjY2VzcykKLSAqICAgMTQ6IFByb3RlY3Rpb24gZmF1bHQgKHJlYWQgYWNjZXNzKQotICogICAxNTogUHJvdGVjdGlvbiBmYXVsdCAod3JpdGUgYWNjZXNzKQorICogICAxNTogUHJvdGVjdGlvbiBmYXVsdCAocmVhZCBhY2Nlc3MpCisgKiAgIDE2OiBQcm90ZWN0aW9uIGZhdWx0ICh3cml0ZSBhY2Nlc3MpCisgKiAgIDIwOiBQYWdlIG5vdCBmb3VuZCAoaW5zdHJ1Y3Rpb24gYWNjZXNzKQorICogICAyNDogUGFnZSBub3QgZm91bmQgKHJlYWQgYWNjZXNzKQorICogICAyODogUGFnZSBub3QgZm91bmQgKHdyaXRlIGFjY2VzcykKICAqLwogYXNtbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQodW5zaWduZWQgbG9uZyBlY3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtODgsNyArNzIsOSBAQAogCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0JaW50IHdyaXRlYWNjZXNzID0gMDsKKwlpbnQgd3JpdGVhY2Nlc3M7CisJbG9uZyBzaWducjsKKwlpbnQgY29kZTsKIAogCWlmIChub3RpZnlfcGFnZV9mYXVsdChESUVfUEFHRV9GQVVMVCwgcmVncywKIAkJCSAgICAgIGVjciwgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCkBAIC05OSw2ICs4NSw5IEBACiAJdHNrID0gY3VycmVudDsKIAltbSA9IHRzay0+bW07CiAKKwlzaWduciA9IFNJR1NFR1Y7CisJY29kZSA9IFNFR1ZfTUFQRVJSOworCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyIGNvbnRleHQsIHdlIG11c3QKIAkgKiBub3QgdGFrZSB0aGUgZmF1bHQuLi4KQEAgLTEyNSw3ICsxMTQsOSBAQAogCSAqIGNhbiBoYW5kbGUgaXQuLi4KIAkgKi8KIGdvb2RfYXJlYToKLQkvL3ByX2RlYnVnKCJnb29kIGFyZWE6IHZtX2ZsYWdzID0gMHglbHhcbiIsIHZtYS0+dm1fZmxhZ3MpOworCWNvZGUgPSBTRUdWX0FDQ0VSUjsKKwl3cml0ZWFjY2VzcyA9IDA7CisKIAlzd2l0Y2ggKGVjcikgewogCWNhc2UgRUNSX1BST1RFQ1RJT05fWDoKIAljYXNlIEVDUl9UTEJfTUlTU19YOgpAQCAtMTc2LDQ2ICsxNjcsMjQgQEAKIAkgKiBtYXAuIEZpeCBpdCwgYnV0IGNoZWNrIGlmIGl0J3Mga2VybmVsIG9yIHVzZXIgZmlyc3QuLi4KIAkgKi8KIGJhZF9hcmVhOgotCXByX2RlYnVnKCJCYWQgYXJlYSBbJXM6JXVdOiBhZGRyICUwOGx4LCBlY3IgJWx1XG4iLAotCQkgdHNrLT5jb21tLCB0c2stPnBpZCwgYWRkcmVzcywgZWNyKTsKLQogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCS8qIEhtbS4uLndlIGhhdmUgdG8gcGFzcyBhZGRyZXNzIGFuZCBlY3Igc29tZWhvdy4uLiAqLwotCQkvKiB0c2stPnRocmVhZC5hZGRyZXNzID0gYWRkcmVzczsKLQkJICAgdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVjcjsgKi8KLSNpZmRlZiBERUJVRwotCQlzaG93X3JlZ3MocmVncyk7Ci0JCWR1bXBfY29kZShyZWdzLT5wYyk7Ci0KLQkJcGFnZSA9IHN5c3JlZ19yZWFkKFBUQlIpOwotCQlwcmludGsoInB0YnIgPSAlMDhseCIsIHBhZ2UpOwotCQlpZiAocGFnZSkgewotCQkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKXBhZ2UpW2FkZHJlc3MgPj4gMjJdOwotCQkJcHJpbnRrKCIgcGdkID0gJTA4bHgiLCBwYWdlKTsKLQkJCWlmIChwYWdlICYgX1BBR0VfUFJFU0VOVCkgewotCQkJCXBhZ2UgJj0gUEFHRV9NQVNLOwotCQkJCWFkZHJlc3MgJj0gMHgwMDNmZjAwMDsKLQkJCQlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopX192YShwYWdlKSlbYWRkcmVzcyA+PiBQQUdFX1NISUZUXTsKLQkJCQlwcmludGsoIiBwdGUgPSAlMDhseFxuIiwgcGFnZSk7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlwcl9kZWJ1ZygiU2VuZGluZyBTSUdTRUdWIHRvIFBJRCAlZC4uLlxuIiwKLQkJCXRzay0+cGlkKTsKLQkJZm9yY2Vfc2lnKFNJR1NFR1YsIHRzayk7CisJCWlmIChleGNlcHRpb25fdHJhY2UpCisJCQlwcmludGsoIiVzJXNbJWRdOiBzZWdmYXVsdCBhdCAlMDhseCBwYyAlMDhseCAiCisJCQkgICAgICAgInNwICUwOGx4IGVjciAlbHVcbiIsCisJCQkgICAgICAgaXNfaW5pdCh0c2spID8gS0VSTl9FTUVSRyA6IEtFUk5fSU5GTywKKwkJCSAgICAgICB0c2stPmNvbW0sIHRzay0+cGlkLCBhZGRyZXNzLCByZWdzLT5wYywKKwkJCSAgICAgICByZWdzLT5zcCwgZWNyKTsKKwkJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBjb2RlLCBhZGRyZXNzKTsKIAkJcmV0dXJuOwogCX0KIAogbm9fY29udGV4dDoKLQlwcl9kZWJ1ZygiTm8gY29udGV4dFxuIik7Ci0KIAkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAqLwogCWZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cGMpOwogCWlmIChmaXh1cCkgewogCQlyZWdzLT5wYyA9IGZpeHVwLT5maXh1cDsKLQkJcHJfZGVidWcoIkZvdW5kIGZpeHVwIGF0ICUwOGx4XG4iLCBmaXh1cC0+Zml4dXApOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzAsNyArMTk5LDYgQEAKIAkJcHJpbnRrKEtFUk5fQUxFUlQKIAkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOwogCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKIAogCXBhZ2UgPSBzeXNyZWdfcmVhZChQVEJSKTsKIAlwcmludGsoS0VSTl9BTEVSVCAicHRiciA9ICUwOGx4IiwgcGFnZSk7CkBAIC0yNDEsMjAgKzIwOSwyMCBAQAogCQkJcGFnZSAmPSBQQUdFX01BU0s7CiAJCQlhZGRyZXNzICY9IDB4MDAzZmYwMDA7CiAJCQlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopX192YShwYWdlKSlbYWRkcmVzcyA+PiBQQUdFX1NISUZUXTsKLQkJCXByaW50aygiIHB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkJCXByaW50aygiIHB0ZSA9ICUwOGx4IiwgcGFnZSk7CiAJCX0KIAl9Ci0JZGllKCJcbk9vcHMiLCByZWdzLCBlY3IpOwotCWRvX2V4aXQoU0lHS0lMTCk7CisJcHJpbnRrKCJcbiIpOworCWRpZSgiS2VybmVsIGFjY2VzcyBvZiBiYWQgYXJlYSIsIHJlZ3MsIHNpZ25yKTsKKwlyZXR1cm47CiAKIAkvKgogCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzCiAJICogdGhhdCBtYWRlIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KIAkgKi8KIG91dF9vZl9tZW1vcnk6Ci0JcHJpbnRrKCJPdXQgb2YgbWVtb3J5XG4iKTsKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWlmIChjdXJyZW50LT5waWQgPT0gMSkgeworCWlmIChpc19pbml0KGN1cnJlbnQpKSB7CiAJCXlpZWxkKCk7CiAJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAkJZ290byBzdXJ2aXZlOwpAQCAtMjY3LDIxICsyMzUsMjAgQEAKIGRvX3NpZ2J1czoKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCi0JLyoKLQkgKiBTZW5kIGEgc2lnYnVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2Ugd2VyZSBpbiBrZXJuZWwgb3IKLQkgKiB1c2VyIG1vZGUuCi0JICovCi0JLyogYWRkcmVzcywgZXJyb3JfY29kZSwgdHJhcF9ubywgLi4uICovCi0jaWZkZWYgREVCVUcKLQlzaG93X3JlZ3MocmVncyk7Ci0JZHVtcF9jb2RlKHJlZ3MtPnBjKTsKLSNlbmRpZgotCXByX2RlYnVnKCJTZW5kaW5nIFNJR0JVUyB0byBQSUQgJWQuLi5cbiIsIHRzay0+cGlkKTsKLQlmb3JjZV9zaWcoU0lHQlVTLCB0c2spOwotCiAJLyogS2VybmVsIG1vZGU/IEhhbmRsZSBleGNlcHRpb25zIG9yIGRpZSAqLworCXNpZ25yID0gU0lHQlVTOworCWNvZGUgPSBCVVNfQURSRVJSOwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlnb3RvIG5vX2NvbnRleHQ7CisKKwlpZiAoZXhjZXB0aW9uX3RyYWNlKQorCQlwcmludGsoIiVzJXNbJWRdOiBidXMgZXJyb3IgYXQgJTA4bHggcGMgJTA4bHggIgorCQkgICAgICAgInNwICUwOGx4IGVjciAlbHVcbiIsCisJCSAgICAgICBpc19pbml0KHRzaykgPyBLRVJOX0VNRVJHIDogS0VSTl9JTkZPLAorCQkgICAgICAgdHNrLT5jb21tLCB0c2stPnBpZCwgYWRkcmVzcywgcmVncy0+cGMsCisJCSAgICAgICByZWdzLT5zcCwgZWNyKTsKKworCV9leGNlcHRpb24oU0lHQlVTLCByZWdzLCBCVVNfQURSRVJSLCBhZGRyZXNzKTsKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX2J1c19lcnJvcih1bnNpZ25lZCBsb25nIGFkZHIsIGludCB3cml0ZV9hY2Nlc3MsCkBAIC0yOTIsOCArMjU5LDcgQEAKIAkgICAgICAgYWRkciwgd3JpdGVfYWNjZXNzID8gIndyaXRlIiA6ICJyZWFkIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiRFRMQiBkdW1wOlxuIik7CiAJZHVtcF9kdGxiKCk7Ci0JZGllKCJCdXMgRXJyb3IiLCByZWdzLCB3cml0ZV9hY2Nlc3MpOwotCWRvX2V4aXQoU0lHS0lMTCk7CisJZGllKCJCdXMgRXJyb3IiLCByZWdzLCBTSUdLSUxMKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKaW5kZXggNzBkYTY4OS4uODJjZjcwOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9pbml0LmMKKysrIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKQEAgLTEwLDExICsxMCw5IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC03OCwyNDIgKzc2LDYgQEAKIAlwcmludGsgKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHByaW50X21lbW9yeV9tYXAoY29uc3QgY2hhciAqd2hhdCwKLQkJCQkgICAgc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbSkKLXsKLQlwcmludGsgKCIlczpcbiIsIHdoYXQpOwotCWZvciAoOyBtZW07IG1lbSA9IG1lbS0+bmV4dCkgewotCQlwcmludGsgKCIgICUwOGx4IC0gJTA4bHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZyltZW0tPmFkZHIsCi0JCQkodW5zaWduZWQgbG9uZykobWVtLT5hZGRyICsgbWVtLT5zaXplKSk7Ci0JfQotfQotCi0jZGVmaW5lIE1BWF9MT1dNRU0JSElHSE1FTV9TVEFSVAotI2RlZmluZSBNQVhfTE9XTUVNX1BGTglQRk5fRE9XTihNQVhfTE9XTUVNKQotCi0vKgotICogU29ydCBhIGxpc3Qgb2YgbWVtb3J5IHJlZ2lvbnMgaW4tcGxhY2UgYnkgYXNjZW5kaW5nIGFkZHJlc3MuCi0gKgotICogV2UncmUgdXNpbmcgYnViYmxlIHNvcnQgYmVjYXVzZSB3ZSBvbmx5IGhhdmUgc2luZ2x5IGxpbmtlZCBsaXN0cwotICogd2l0aCBmZXcgZWxlbWVudHMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzb3J0X21lbV9saXN0KHN0cnVjdCB0YWdfbWVtX3JhbmdlICoqcG1lbSkKLXsKLQlpbnQgZG9uZTsKLQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqKmEsICoqYjsKLQotCWlmICghKnBtZW0pCi0JCXJldHVybjsKLQotCWRvIHsKLQkJZG9uZSA9IDE7Ci0JCWEgPSBwbWVtLCBiID0gJigqcG1lbSktPm5leHQ7Ci0JCXdoaWxlICgqYikgewotCQkJaWYgKCgqYSktPmFkZHIgPiAoKmIpLT5hZGRyKSB7Ci0JCQkJc3RydWN0IHRhZ19tZW1fcmFuZ2UgKnRtcDsKLQkJCQl0bXAgPSAoKmIpLT5uZXh0OwotCQkJCSgqYiktPm5leHQgPSAqYTsKLQkJCQkqYSA9ICpiOwotCQkJCSpiID0gdG1wOwotCQkJCWRvbmUgPSAwOwotCQkJfQotCQkJYSA9ICYoKmEpLT5uZXh0OwotCQkJYiA9ICYoKmEpLT5uZXh0OwotCQl9Ci0JfSB3aGlsZSAoIWRvbmUpOwotfQotCi0vKgotICogRmluZCBhIGZyZWUgbWVtb3J5IHJlZ2lvbiBsYXJnZSBlbm91Z2ggZm9yIHN0b3JpbmcgdGhlCi0gKiBib290bWVtIGJpdG1hcC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0Ci1maW5kX2Jvb3RtYXBfcGZuKGNvbnN0IHN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW0pCi17Ci0JdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzLCBib290bWFwX2xlbjsKLQl1bnNpZ25lZCBsb25nIG5vZGVfcGFnZXMgPSBQRk5fVVAobWVtLT5zaXplKTsKLQl1bnNpZ25lZCBsb25nIGJvb3RtYXBfYWRkciA9IG1lbS0+YWRkcjsKLQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqcmVzZXJ2ZWQgPSBtZW1fcmVzZXJ2ZWQ7Ci0Jc3RydWN0IHRhZ19tZW1fcmFuZ2UgKnJhbWRpc2sgPSBtZW1fcmFtZGlzazsKLQl1bnNpZ25lZCBsb25nIGtlcm5fc3RhcnQgPSB2aXJ0X3RvX3BoeXMoX3N0ZXh0KTsKLQl1bnNpZ25lZCBsb25nIGtlcm5fZW5kID0gdmlydF90b19waHlzKF9lbmQpOwotCi0JYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhub2RlX3BhZ2VzKTsKLQlib290bWFwX2xlbiA9IGJvb3RtYXBfcGFnZXMgPDwgUEFHRV9TSElGVDsKLQotCS8qCi0JICogRmluZCBhIGxhcmdlIGVub3VnaCByZWdpb24gd2l0aG91dCByZXNlcnZlZCBwYWdlcyBmb3IKLQkgKiBzdG9yaW5nIHRoZSBib290bWVtIGJpdG1hcC4gV2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZQotCSAqIGZhY3QgdGhhdCBhbGwgbGlzdHMgaGF2ZSBiZWVuIHNvcnRlZC4KLQkgKgotCSAqIFdlIGhhdmUgdG8gY2hlY2sgZXhwbGljaXRseSByZXNlcnZlZCByZWdpb25zIGFzIHdlbGwgYXMgdGhlCi0JICoga2VybmVsIGltYWdlIGFuZCBhbnkgUkFNRElTSyBpbWFnZXMuLi4KLQkgKgotCSAqIE9oLCBhbmQgd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSB0YWdsaXN0Ci0JICogc2luY2Ugd2UncmUgZ29pbmcgdG8gdXNlIGl0IHVudGlsIHRoZSBib290bWVtIGFsbG9jYXRvciBpcwotCSAqIGZ1bGx5IHVwIGFuZCBydW5uaW5nLgotCSAqLwotCXdoaWxlICgxKSB7Ci0JCWlmICgoYm9vdG1hcF9hZGRyIDwga2Vybl9lbmQpICYmCi0JCSAgICAoKGJvb3RtYXBfYWRkciArIGJvb3RtYXBfbGVuKSA+IGtlcm5fc3RhcnQpKQotCQkJYm9vdG1hcF9hZGRyID0ga2Vybl9lbmQ7Ci0KLQkJd2hpbGUgKHJlc2VydmVkICYmCi0JCSAgICAgICAoYm9vdG1hcF9hZGRyID49IChyZXNlcnZlZC0+YWRkciArIHJlc2VydmVkLT5zaXplKSkpCi0JCQlyZXNlcnZlZCA9IHJlc2VydmVkLT5uZXh0OwotCi0JCWlmIChyZXNlcnZlZCAmJgotCQkgICAgKChib290bWFwX2FkZHIgKyBib290bWFwX2xlbikgPj0gcmVzZXJ2ZWQtPmFkZHIpKSB7Ci0JCQlib290bWFwX2FkZHIgPSByZXNlcnZlZC0+YWRkciArIHJlc2VydmVkLT5zaXplOwotCQkJY29udGludWU7Ci0JCX0KLQotCQl3aGlsZSAocmFtZGlzayAmJgotCQkgICAgICAgKGJvb3RtYXBfYWRkciA+PSAocmFtZGlzay0+YWRkciArIHJhbWRpc2stPnNpemUpKSkKLQkJCXJhbWRpc2sgPSByYW1kaXNrLT5uZXh0OwotCi0JCWlmICghcmFtZGlzayB8fAotCQkgICAgKChib290bWFwX2FkZHIgKyBib290bWFwX2xlbikgPCByYW1kaXNrLT5hZGRyKSkKLQkJCWJyZWFrOwotCi0JCWJvb3RtYXBfYWRkciA9IHJhbWRpc2stPmFkZHIgKyByYW1kaXNrLT5zaXplOwotCX0KLQotCWlmICgoUEZOX1VQKGJvb3RtYXBfYWRkcikgKyBib290bWFwX2xlbikgPj0gKG1lbS0+YWRkciArIG1lbS0+c2l6ZSkpCi0JCXJldHVybiB+MFVMOwotCi0JcmV0dXJuIFBGTl9VUChib290bWFwX2FkZHIpOwotfQotCi12b2lkIF9faW5pdCBzZXR1cF9ib290bWVtKHZvaWQpCi17Ci0JdW5zaWduZWQgYm9vdG1hcF9zaXplOwotCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGZuLCBib290bWFwX3BmbiwgcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBtYXhfcGZuLCBtYXhfbG93X3BmbjsKLQl1bnNpZ25lZCBsb25nIGtlcm5fc3RhcnQgPSB2aXJ0X3RvX3BoeXMoX3N0ZXh0KTsKLQl1bnNpZ25lZCBsb25nIGtlcm5fZW5kID0gdmlydF90b19waHlzKF9lbmQpOwotCXVuc2lnbmVkIG5vZGUgPSAwOwotCXN0cnVjdCB0YWdfbWVtX3JhbmdlICpiYW5rLCAqcmVzOwotCi0Jc29ydF9tZW1fbGlzdCgmbWVtX3BoeXMpOwotCXNvcnRfbWVtX2xpc3QoJm1lbV9yZXNlcnZlZCk7Ci0KLQlwcmludF9tZW1vcnlfbWFwKCJQaHlzaWNhbCBtZW1vcnkiLCBtZW1fcGh5cyk7Ci0JcHJpbnRfbWVtb3J5X21hcCgiUmVzZXJ2ZWQgbWVtb3J5IiwgbWVtX3Jlc2VydmVkKTsKLQotCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7Ci0KLQlpZiAobWVtX3JhbWRpc2spIHsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShtZW1fcmFtZGlzay0+YWRkcik7Ci0JCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBtZW1fcmFtZGlzay0+c2l6ZTsKLQotCQlwcmludF9tZW1vcnlfbWFwKCJSQU1ESVNLIGltYWdlcyIsIG1lbV9yYW1kaXNrKTsKLQkJaWYgKG1lbV9yYW1kaXNrLT5uZXh0KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJXYXJuaW5nOiBPbmx5IHRoZSBmaXJzdCBSQU1ESVNLIGltYWdlICIKLQkJCSAgICAgICAid2lsbCBiZSB1c2VkXG4iKTsKLQkJc29ydF9tZW1fbGlzdCgmbWVtX3JhbWRpc2spOwotI2Vsc2UKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkFNIGRpc2sgaW1hZ2UgcHJlc2VudCwgYnV0ICIKLQkJICAgICAgICJubyBpbml0cmQgc3VwcG9ydCBpbiBrZXJuZWwhXG4iKTsKLSNlbmRpZgotCX0KLQotCWlmIChtZW1fcGh5cy0+bmV4dCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiT25seSB1c2luZyBmaXJzdCBtZW1vcnkgYmFua1xuIik7Ci0KLQlmb3IgKGJhbmsgPSBtZW1fcGh5czsgYmFuazsgYmFuayA9IE5VTEwpIHsKLQkJZmlyc3RfcGZuID0gUEZOX1VQKGJhbmstPmFkZHIpOwotCQltYXhfbG93X3BmbiA9IG1heF9wZm4gPSBQRk5fRE9XTihiYW5rLT5hZGRyICsgYmFuay0+c2l6ZSk7Ci0JCWJvb3RtYXBfcGZuID0gZmluZF9ib290bWFwX3BmbihiYW5rKTsKLQkJaWYgKGJvb3RtYXBfcGZuID4gbWF4X3BmbikKLQkJCXBhbmljKCJObyBzcGFjZSBmb3IgYm9vdG1lbSBiaXRtYXAhXG4iKTsKLQotCQlpZiAobWF4X2xvd19wZm4gPiBNQVhfTE9XTUVNX1BGTikgewotCQkJbWF4X2xvd19wZm4gPSBNQVhfTE9XTUVNX1BGTjsKLSNpZm5kZWYgQ09ORklHX0hJR0hNRU0KLQkJCS8qCi0JCQkgKiBMb3dtZW0gaXMgbWVtb3J5IHRoYXQgY2FuIGJlIGFkZHJlc3NlZAotCQkJICogZGlyZWN0bHkgdGhyb3VnaCBQMS9QMgotCQkJICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIk5vZGUgJXU6IE9ubHkgJWxkIE1pQiBvZiBtZW1vcnkgd2lsbCBiZSB1c2VkLlxuIiwKLQkJCSAgICAgICBub2RlLCBNQVhfTE9XTUVNID4+IDIwKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIEhJR0hNRU0gZW5hYmxlZCBrZXJuZWwuXG4iKTsKLSNlbHNlCi0jZXJyb3IgSElHSE1FTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFWUjMyIHlldAotI2VuZGlmCi0JCX0KLQotCQkvKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yIHdpdGggbG93IG1lbW9yeSBvbmx5LiAqLwotCQlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIGJvb3RtYXBfcGZuLAotCQkJCQkJIGZpcnN0X3BmbiwgbWF4X2xvd19wZm4pOwotCi0JCXByaW50aygiTm9kZSAldTogYmRhdGEgPSAlcCwgYmRhdGEtPm5vZGVfYm9vdG1lbV9tYXAgPSAlcFxuIiwKLQkJICAgICAgIG5vZGUsIE5PREVfREFUQShub2RlKS0+YmRhdGEsCi0JCSAgICAgICBOT0RFX0RBVEEobm9kZSktPmJkYXRhLT5ub2RlX2Jvb3RtZW1fbWFwKTsKLQotCQkvKgotCQkgKiBSZWdpc3RlciBmdWxseSBhdmFpbGFibGUgUkFNIHBhZ2VzIHdpdGggdGhlIGJvb3RtZW0KLQkJICogYWxsb2NhdG9yLgotCQkgKi8KLQkJcGFnZXMgPSBtYXhfbG93X3BmbiAtIGZpcnN0X3BmbjsKLQkJZnJlZV9ib290bWVtX25vZGUgKE5PREVfREFUQShub2RlKSwgUEZOX1BIWVMoZmlyc3RfcGZuKSwKLQkJCQkgICBQRk5fUEhZUyhwYWdlcykpOwotCi0JCS8qCi0JCSAqIFJlc2VydmUgc3BhY2UgZm9yIHRoZSBrZXJuZWwgaW1hZ2UgKGlmIHByZXNlbnQgaW4KLQkJICogdGhpcyBub2RlKS4uLgotCQkgKi8KLQkJaWYgKChrZXJuX3N0YXJ0ID49IFBGTl9QSFlTKGZpcnN0X3BmbikpICYmCi0JCSAgICAoa2Vybl9zdGFydCA8IFBGTl9QSFlTKG1heF9wZm4pKSkgewotCQkJcHJpbnRrKCJOb2RlICV1OiBLZXJuZWwgaW1hZ2UgJTA4bHggLSAlMDhseFxuIiwKLQkJCSAgICAgICBub2RlLCBrZXJuX3N0YXJ0LCBrZXJuX2VuZCk7Ci0JCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIGtlcm5fc3RhcnQsCi0JCQkJCSAgICAga2Vybl9lbmQgLSBrZXJuX3N0YXJ0KTsKLQkJfQotCi0JCS8qIC4uLnRoZSBib290bWVtIGJpdG1hcC4uLiAqLwotCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCi0JCQkJICAgICBQRk5fUEhZUyhib290bWFwX3BmbiksCi0JCQkJICAgICBib290bWFwX3NpemUpOwotCi0JCS8qIC4uLmFueSBSQU1ESVNLIGltYWdlcy4uLiAqLwotCQlmb3IgKHJlcyA9IG1lbV9yYW1kaXNrOyByZXM7IHJlcyA9IHJlcy0+bmV4dCkgewotCQkJaWYgKHJlcy0+YWRkciA+IFBGTl9QSFlTKG1heF9wZm4pKQotCQkJCWJyZWFrOwotCi0JCQlpZiAocmVzLT5hZGRyID49IFBGTl9QSFlTKGZpcnN0X3BmbikpIHsKLQkJCQlwcmludGsoIk5vZGUgJXU6IFJBTURJU0sgJTA4bHggLSAlMDhseFxuIiwKLQkJCQkgICAgICAgbm9kZSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVzLT5hZGRyLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykocmVzLT5hZGRyICsgcmVzLT5zaXplKSk7Ci0JCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAotCQkJCQkJICAgICByZXMtPmFkZHIsIHJlcy0+c2l6ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAuLi5hbmQgYW55IG90aGVyIHJlc2VydmVkIHJlZ2lvbnMuICovCi0JCWZvciAocmVzID0gbWVtX3Jlc2VydmVkOyByZXM7IHJlcyA9IHJlcy0+bmV4dCkgewotCQkJaWYgKHJlcy0+YWRkciA+IFBGTl9QSFlTKG1heF9wZm4pKQotCQkJCWJyZWFrOwotCi0JCQlpZiAocmVzLT5hZGRyID49IFBGTl9QSFlTKGZpcnN0X3BmbikpIHsKLQkJCQlwcmludGsoIk5vZGUgJXU6IFJlc2VydmVkICUwOGx4IC0gJTA4bHhcbiIsCi0JCQkJICAgICAgIG5vZGUsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcy0+YWRkciwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKHJlcy0+YWRkciArIHJlcy0+c2l6ZSkpOwotCQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKLQkJCQkJCSAgICAgcmVzLT5hZGRyLCByZXMtPnNpemUpOwotCQkJfQotCQl9Ci0KLQkJbm9kZV9zZXRfb25saW5lKG5vZGUpOwotCX0KLX0KLQogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMKICAqCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1ldGguYwppbmRleCA0MjRlOTI1Li5mMjYwNzdhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMKQEAgLTQyNyw3ICs0MjcsNiBAQAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBtZW1vcnkgc3F1ZWV6ZS4gZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW5za2ItPmRldiA9IGRldjsKIAogCXNrYl9yZXNlcnZlKG5za2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIApAQCAtNDc0LDcgKzQ3Myw3IEBACiAJCSAqIFhYWCBGaXggbWUKIAkJICogU2hvdWxkIHJlYWxseSBkbyBhIGNzdW0rY29weSBoZXJlCiAJCSAqLwotCQltZW1jcHkoc2tiLT5kYXRhLCBmcmFtZSwgbGVuKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBmcmFtZSwgbGVuKTsKICNlbmRpZgogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMKaW5kZXggYzgxNzNkYi4uNTQxOWFjYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cG5ldC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkiJWx1KVxuIiwgc2tiLT5kYXRhLCAmbXNnLT5kYXRhLAogCQkJKHNpemVfdCkgbXNnLT5lbWJlZGRlZF9ieXRlcyk7CiAKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgJm1zZy0+ZGF0YSwgKHNpemVfdCkgbXNnLT5lbWJlZGRlZF9ieXRlcyk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgJm1zZy0+ZGF0YSwgKHNpemVfdCltc2ctPmVtYmVkZGVkX2J5dGVzKTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKHhwbmV0LCAidHJhbnNmZXJyaW5nIGJ1ZmZlciB0byB0aGUgc2tiLT5kYXRhIGFyZWE7XG5cdCIKIAkJCSJidGVfY29weSgweCVwLCAweCVwLCAlaHUpXG4iLCAodm9pZCAqKW1zZy0+YnVmX3BhLApAQCAtMjY0LDE3ICsyNjQsMTYgQEAKIAogCWRldl9kYmcoeHBuZXQsICI8c2tiLT5oZWFkPTB4JXAgc2tiLT5kYXRhPTB4JXAgc2tiLT50YWlsPTB4JXAgIgogCQkic2tiLT5lbmQ9MHglcCBza2ItPmxlbj0lZFxuIiwgKHZvaWQgKikgc2tiLT5oZWFkLAotCQkodm9pZCAqKSBza2ItPmRhdGEsICh2b2lkICopIHNrYi0+dGFpbCwgKHZvaWQgKikgc2tiLT5lbmQsCisJCSh2b2lkICopc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAogCQlza2ItPmxlbik7CiAKLQlza2ItPmRldiA9IHhwbmV0X2RldmljZTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB4cG5ldF9kZXZpY2UpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKIAlkZXZfZGJnKHhwbmV0LCAicGFzc2luZyBza2IgdG8gbmV0d29yayBsYXllcjsgXG5cdHNrYi0+aGVhZD0weCVwICIKIAkJInNrYi0+ZGF0YT0weCVwIHNrYi0+dGFpbD0weCVwIHNrYi0+ZW5kPTB4JXAgc2tiLT5sZW49JWRcbiIsCi0JCSh2b2lkICopIHNrYi0+aGVhZCwgKHZvaWQgKikgc2tiLT5kYXRhLCAodm9pZCAqKSBza2ItPnRhaWwsCi0JCSh2b2lkICopIHNrYi0+ZW5kLCBza2ItPmxlbik7CisJCSh2b2lkICopc2tiLT5oZWFkLCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQlza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwogCiAKIAl4cG5ldF9kZXZpY2UtPmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtNDc2LDcgKzQ3NSw3IEBACiAKIAlkZXZfZGJnKHhwbmV0LCAiPnNrYi0+aGVhZD0weCVwIHNrYi0+ZGF0YT0weCVwIHNrYi0+dGFpbD0weCVwICIKIAkJInNrYi0+ZW5kPTB4JXAgc2tiLT5sZW49JWRcbiIsICh2b2lkICopIHNrYi0+aGVhZCwKLQkJKHZvaWQgKikgc2tiLT5kYXRhLCAodm9pZCAqKSBza2ItPnRhaWwsICh2b2lkICopIHNrYi0+ZW5kLAorCQkodm9pZCAqKXNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwKIAkJc2tiLT5sZW4pOwogCiAKQEAgLTQ5OCw3ICs0OTcsNyBAQAogCiAJLyogZ2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGNhY2hlbGluZSBhbmQgZW5kIG9mIGxhc3QgKi8KIAlzdGFydF9hZGRyID0gKCh1NjQpIHNrYi0+ZGF0YSAmIH4oTDFfQ0FDSEVfQllURVMgLSAxKSk7Ci0JZW5kX2FkZHIgPSBMMV9DQUNIRV9BTElHTigodTY0KSBza2ItPnRhaWwpOworCWVuZF9hZGRyID0gTDFfQ0FDSEVfQUxJR04oKHU2NClza2JfdGFpbF9wb2ludGVyKHNrYikpOwogCiAJLyogY2FsY3VsYXRlIGhvdyBtYW55IGJ5dGVzIHRvIGVtYmVkIGluIHRoZSBYUEMgbWVzc2FnZSAqLwogCWVtYmVkZGVkX2J5dGVzID0gMDsKQEAgLTU2NywxNCArNTY2LDE1IEBACiAJCQltc2ctPnZlcnNpb24gPSBYUE5FVF9WRVJTSU9OX0VNQkVEOwogCQkJZGV2X2RiZyh4cG5ldCwgImNhbGxpbmcgbWVtY3B5KDB4JXAsIDB4JXAsIDB4JWx4KVxuIiwKIAkJCQkmbXNnLT5kYXRhLCBza2ItPmRhdGEsIChzaXplX3QpIGVtYmVkZGVkX2J5dGVzKTsKLQkJCW1lbWNweSgmbXNnLT5kYXRhLCBza2ItPmRhdGEsIChzaXplX3QpIGVtYmVkZGVkX2J5dGVzKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmbXNnLT5kYXRhLAorCQkJCQkJICAoc2l6ZV90KWVtYmVkZGVkX2J5dGVzKTsKIAkJfSBlbHNlIHsKIAkJCW1zZy0+dmVyc2lvbiA9IFhQTkVUX1ZFUlNJT047CiAJCX0KIAkJbXNnLT5tYWdpYyA9IFhQTkVUX01BR0lDOwogCQltc2ctPnNpemUgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHI7CiAJCW1zZy0+bGVhZGluX2lnbm9yZSA9ICh1NjQpIHNrYi0+ZGF0YSAtIHN0YXJ0X2FkZHI7Ci0JCW1zZy0+dGFpbG91dF9pZ25vcmUgPSBlbmRfYWRkciAtICh1NjQpIHNrYi0+dGFpbDsKKwkJbXNnLT50YWlsb3V0X2lnbm9yZSA9IGVuZF9hZGRyIC0gKHU2NClza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJCW1zZy0+YnVmX3BhID0gX19wYShzdGFydF9hZGRyKTsKIAogCQlkZXZfZGJnKHhwbmV0LCAic2VuZGluZyBYUEMgbWVzc2FnZSB0byAlZDolZFxubXNnLT5idWZfcGE9IgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBjNzhiMTQzLi4xMzBkODI1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCiBjb25maWcgWk9ORV9ETUEKIAlib29sCi0JZGVmYXVsdCB5CiAKIGNob2ljZQogCXByb21wdCAiU3lzdGVtIHR5cGUiCkBAIC0xNjUsNyArMTY0LDcgQEAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJUlFfQ1BVCi0Jc2VsZWN0IE1JUFNfR1Q2NDExMQorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IFNZU19IQVNfQ1BVX05FVkFEQQogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCkBAIC0yMDcsNyArMjA2LDcgQEAKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBNSVBTX0dUNjQxMjAKKwlzZWxlY3QgUENJX0dUNjRYWFhfUENJMAogCXNlbGVjdCBTWVNfSEFTX0NQVV9SNTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKQEAgLTI0NSw3ICsyNDQsNyBAQAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBNSVBTX0dUNjQxMjAKKwlzZWxlY3QgUENJX0dUNjRYWFhfUENJMAogCXNlbGVjdCBNSVBTX05JTEU0CiAJc2VsZWN0IFI1MDAwX0NQVV9TQ0FDSEUKIAlzZWxlY3QgU1lTX0hBU19DUFVfUjUwMDAKQEAgLTI2Myw3ICsyNjIsNyBAQAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IE1JUFNfQk9BUkRTX0dFTgogCXNlbGVjdCBNSVBTX0JPTklUTzY0Ci0Jc2VsZWN0IE1JUFNfR1Q2NDEyMAorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IE1JUFNfTVNDCiAJc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKQEAgLTI5Niw3ICsyOTUsNyBAQAogCXNlbGVjdCBNSVBTX0JPQVJEU19HRU4KIAlzZWxlY3QgTUlQU19CT05JVE82NAogCXNlbGVjdCBNSVBTX0NQVV9TQ0FDSEUKLQlzZWxlY3QgTUlQU19HVDY0MTIwCisJc2VsZWN0IFBDSV9HVDY0WFhYX1BDSTAKIAlzZWxlY3QgTUlQU19NU0MKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKQEAgLTM0MCw3ICszMzksNyBAQAogCXNlbGVjdCBCT09UX0VMRjMyCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IE1JUFNfR1Q2NDEyMAorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMgpAQCAtMzk4LDcgKzM5Nyw3IEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBJUlFfQ1BVX1JNN0sKLQlzZWxlY3QgTUlQU19HVDY0MTIwCisJc2VsZWN0IFBDSV9HVDY0WFhYX1BDSTAKIAlzZWxlY3QgUk03MDAwX0NQVV9TQ0FDSEUKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9STTcwMDAKQEAgLTUwMSwxMCArNTAwLDggQEAKIAkgIGV0aGVyIHBvcnQgVVNCLCBBQzk3LCBQQ0ksIGV0Yy4KIAogY29uZmlnIE1BQ0hfVlI0MVhYCi0JYm9vbCAiTkVDIFZSNDFYWC1iYXNlZCBtYWNoaW5lcyIKKwlib29sICJORUMgVlI0MTAwIHNlcmllcyBiYXNlZCBtYWNoaW5lcyIKIAlzZWxlY3QgU1lTX0hBU19DUFVfVlI0MVhYCi0Jc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAKIGNvbmZpZyBQTUNfWU9TRU1JVEUKQEAgLTc3OSw2ICs3NzYsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBUT1NISUJBX0JPQVJEUworCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAogY29uZmlnIFRPU0hJQkFfUkJUWDQ5MjcKIAlib29sICJUb3NoaWJhIFRCVFg0OVsyM103IGJvYXJkIgpAQCAtOTIyLDYgKzkyMCw3IEBACiAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCisJc2VsZWN0IFpPTkVfRE1BCiAKIGNvbmZpZyBJODI1OQogCWJvb2wKQEAgLTk0NSw2ICs5NDQsNyBAQAogCiBjb25maWcgR0VORVJJQ19JU0FfRE1BX1NVUFBPUlRfQlJPS0VOCiAJYm9vbAorCXNlbGVjdCBaT05FX0RNQQogCiAjCiAjIEVuZGlhbmVzcyBzZWxlY3Rpb24uICBTdWZmaWNpZW50bHkgb2JzY3VyZSBzbyBtYW55IHVzZXJzIGRvbid0IGtub3cgd2hhdCB0bwpAQCAtOTk5LDEwICs5OTksNyBAQAogY29uZmlnIE1JUFNfQk9BUkRTX0dFTgogCWJvb2wKIAotY29uZmlnIE1JUFNfR1Q2NDExMQotCWJvb2wKLQotY29uZmlnIE1JUFNfR1Q2NDEyMAorY29uZmlnIFBDSV9HVDY0WFhYX1BDSTAKIAlib29sCiAKIGNvbmZpZyBNSVBTX1RYMzkyNwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDkyYmNhNmEuLmYyZjc0MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTUzMCwyNSArNTMwLDI5IEBACiBsb2FkLSQoQ09ORklHX1NHSV9JUDMyKQkJKz0gMHhmZmZmZmZmZjgwMDA0MDAwCiAKICMKLSMgU2lieXRlIFNCMTI1MCBTT0MKKyMgU2lieXRlIFNCMTI1MC9CQ00xNDgwIFNPQwogIwogIyBUaGlzIGlzIGEgTElCIHNvIHRoYXQgaXQgbGlua3MgYXQgdGhlIGVuZCwgYW5kIGluaXRjYWxscyBhcmUgbGF0ZXIKICMgdGhlIHNlcXVlbmNlOyBidXQgaXQgaXMgYnVpbHQgYXMgYW4gb2JqZWN0IHNvIHRoYXQgbW9kdWxlcyBkb24ndCBnZXQKICMgcmVtb3ZlZCAoYXMgaGFwcGVucywgZXZlbiBpZiB0aGV5IGhhdmUgX19pbml0Y2FsbC9tb2R1bGVfaW5pdCkKICMKIGNvcmUtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwLworY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMTEyWCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCiBjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCiAKIGNvcmUtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvCitjb3JlLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwogY2ZsYWdzLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCiAKIGNvcmUtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC8KK2NvcmUtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwogY2ZsYWdzLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1zaWJ5dGUgXAogCQkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTQ4MF9BTEwKIAogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwLworY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCiBjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xNDgwX0FMTAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS9leGNpdGVfc2V0dXAuYyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCmluZGV4IDQyZjBlZGEuLjJmMGU0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCkBAIC02Myw3ICs2Myw3IEBACiB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKiBjb25zdCB0aXRhbl9iYXNlID0gKHZvaWQgKikgKEVYQ0lURV9BRERSX1RJVEFOKTsKIAogLyogUHJvdGVjdCBhY2Nlc3MgdG8gc2hhcmVkIEdQSSByZWdpc3RlcnMgKi8KLXNwaW5sb2NrX3QgdGl0YW5fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK0RFRklORV9TUElOTE9DSyh0aXRhbl9sb2NrKTsKIGludCB0aXRhbl9pcnFmbGFnczsKIAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlIGIvYXJjaC9taXBzL2NvYmFsdC9NYWtlZmlsZQppbmRleCBiMzZkZDhmLi5kZTAxN2MxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvTWFrZWZpbGUKQEAgLTQsNSArNCw2IEBACiAKIG9iai15CSA6PSBpcnEubyByZXNldC5vIHNldHVwLm8KIAorb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBjb25zb2xlLm8KIG9iai0kKENPTkZJR19NVERfUEhZU01BUCkJKz0gbXRkLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvY29uc29sZS5jIGIvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKaW5kZXggY2E1NmI0MS4uMDQ4NWQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKQEAgLTEsMTMgKzEsMTEgQEAKIC8qCiAgKiAoQykgUC4gSG9ydG9uIDIwMDYKICAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtY29iYWx0L2NvYmFsdC5oPgorCisjaW5jbHVkZSA8Y29iYWx0Lmg+CiAKIHZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMgYi9hcmNoL21pcHMvY29iYWx0L2lycS5jCmluZGV4IGZlOTNiODQuLjk1MGFkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9pcnEuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaD4KKyNpbmNsdWRlIDxjb2JhbHQuaD4KIAogLyoKICAqIFdlIGhhdmUgdHdvIHR5cGVzIG9mIGludGVycnVwdHMgdGhhdCB3ZSBoYW5kbGUsIG9uZXMgdGhhdCBjb21lIGluIHRocm91Z2gKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvcGNpLmMgYi9hcmNoL21pcHMvY29iYWx0L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTAyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29iYWx0L3BjaS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBSZWdpc3RlciBQQ0kgY29udHJvbGxlci4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDQsIDA1IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBieSBMaWFtIERhdmllcyAobGRhdmllc0BhZ2lsZS50dikKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgorCitleHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q2NHh4eF9wY2kwX29wczsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfbWVtX3Jlc291cmNlID0geworCS5zdGFydAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSwKKwkuZW5kCT0gR1RfREVGX1BDSTBfTUVNMF9CQVNFICsgR1RfREVGX1BDSTBfTUVNMF9TSVpFIC0gMSwKKwkubmFtZQk9ICJQQ0kgbWVtb3J5IiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29iYWx0X2lvX3Jlc291cmNlID0geworCS5zdGFydAk9IDB4MTAwMCwKKwkuZW5kCT0gR1RfREVGX1BDSTBfSU9fU0laRSAtIDEsCisJLm5hbWUJPSAiUENJIEkvTyIsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgY29iYWx0X3BjaV9jb250cm9sbGVyID0geworCS5wY2lfb3BzCT0gJmd0NjR4eHhfcGNpMF9vcHMsCisJLm1lbV9yZXNvdXJjZQk9ICZjb2JhbHRfbWVtX3Jlc291cmNlLAorCS5pb19yZXNvdXJjZQk9ICZjb2JhbHRfaW9fcmVzb3VyY2UsCisJLmlvX29mZnNldAk9IDAgLSBHVF9ERUZfUENJMF9JT19CQVNFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29iYWx0X3BjaV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJmNvYmFsdF9wY2lfY29udHJvbGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChjb2JhbHRfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvYmFsdC9yZXNldC5jIGIvYXJjaC9taXBzL2NvYmFsdC9yZXNldC5jCmluZGV4IDc1M2RmY2MuLjQzY2NhMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvcmVzZXQuYworKysgYi9hcmNoL21pcHMvY29iYWx0L3Jlc2V0LmMKQEAgLTgsMTUgKzgsMTIgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMjAwMSBieSBMaWFtIERhdmllcyAobGRhdmllc0BhZ2lsZS50dikKICAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKwogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaD4KKworI2luY2x1ZGUgPGNvYmFsdC5oPgogCiB2b2lkIGNvYmFsdF9tYWNoaW5lX2hhbHQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYyBiL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYwppbmRleCA4OGQzNGYxLi5kMGRkODE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9zZXR1cC5jCkBAIC0xOSwxMiArMTksMTAgQEAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1jb2JhbHQvY29iYWx0Lmg+CisjaW5jbHVkZSA8Y29iYWx0Lmg+CiAKIGV4dGVybiB2b2lkIGNvYmFsdF9tYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCk7CiBleHRlcm4gdm9pZCBjb2JhbHRfbWFjaGluZV9oYWx0KHZvaWQpOwpAQCAtNjMsMjIgKzYxLDYgQEAKIAlHVF9XUklURShHVF9JTlRSTUFTS19PRlMsIEdUX0lOVFJfVDBFWFBfTVNLIHwgR1RfUkVBRChHVF9JTlRSTUFTS19PRlMpKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMTFfcGNpX29wczsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfbWVtX3Jlc291cmNlID0gewotCS5zdGFydAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSwKLQkuZW5kCT0gR1RfREVGX1BDSTBfTUVNMF9CQVNFICsgR1RfREVGX1BDSTBfTUVNMF9TSVpFIC0gMSwKLQkubmFtZQk9ICJQQ0kgbWVtb3J5IiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfaW9fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gMHgxMDAwLAotCS5lbmQJPSAweGZmZmYsCi0JLm5hbWUJPSAiUENJIEkvTyIsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQogLyoKICAqIENvYmFsdCBkb2Vzbid0IGhhdmUgUFMvMiBrZXlib2FyZC9tb3VzZSBpbnRlcmZhY2VzLAogICoga2V5Ym9hcmQgY29ubnRyb2xsZXIgaXMgbmV2ZXIgdXNlZC4KQEAgLTExMSwxNCArOTMsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGNvYmFsdF9wY2lfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9ICZndDY0MTExX3BjaV9vcHMsCi0JLm1lbV9yZXNvdXJjZQk9ICZjb2JhbHRfbWVtX3Jlc291cmNlLAotCS5tZW1fb2Zmc2V0CT0gMCwKLQkuaW9fcmVzb3VyY2UJPSAmY29iYWx0X2lvX3Jlc291cmNlLAotCS5pb19vZmZzZXQJPSAwIC0gR1RfREVGX1BDSTBfSU9fQkFTRSwKLX07Ci0KIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCiB7CiAJc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgdWFydDsKQEAgLTE0NiwxMCArMTIwLDYgQEAKIAogCXByaW50aygiQ29iYWx0IGJvYXJkIElEOiAlZFxuIiwgY29iYWx0X2JvYXJkX2lkKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmY29iYWx0X3BjaV9jb250cm9sbGVyKTsKLSNlbmRpZgotCiAJaWYgKGNvYmFsdF9ib2FyZF9pZCA+IENPQkFMVF9CUkRfSURfUkFRMSkgewogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MAogCQl1YXJ0LmxpbmUJPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCAyMWEwOTQ3Li4wNjhlNDhlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMAotIyBUdWUgRmViIDIwIDIxOjQ3OjM0IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzMKKyMgVGh1IE1hciAxNSAwMDo0MDo0MCAyMDA3CiAjCiBDT05GSUdfTUlQUz15CiAKQEAgLTcwLDcgKzcwLDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0JJR19FTkRJQU49eQpAQCAtMTM4LDEyICsxMzgsMTIgQEAKICMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMjggaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQogIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8xMDAwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0xMDAwCitDT05GSUdfSFo9MjUwCiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMTc1LDE0ICsxNzUsMTUgQEAKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19SRUxBWT15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKQEAgLTIxNywxMSArMjE4LDExIEBACiBDT05GSUdfSU9TQ0hFRF9BUz15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CiBDT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgogCiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKQEAgLTIzMywxMiArMjM0LDEwIEBACiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNTAsMTAgKzI0OSw3IEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JraW5nCkBAIC0yNjcsMTIgKzI2Myw3IEBACiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19YRlJNX1VTRVI9eQotIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNX01JR1JBVEU9eQotQ09ORklHX05FVF9LRVk9eQotQ09ORklHX05FVF9LRVlfTUlHUkFURT15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldApAQCAtMjkwLDE5ICsyODEsMTggQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX1RDUF9NRDVTSUc9eQorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19TRUNNQVJLPXkKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCiAjCkBAIC0zNDMsMTMgKzMzMyw3IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFODAyMTE9eQotIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFODAyMTFfQ1JZUFRfV0VQPXkKLUNPTkZJR19JRUVFODAyMTFfQ1JZUFRfQ0NNUD15Ci1DT05GSUdfSUVFRTgwMjExX1NPRlRNQUM9eQotIyBDT05GSUdfSUVFRTgwMjExX1NPRlRNQUNfREVCVUcgaXMgbm90IHNldAotQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNjAsMTQgKzM0NCwxMiBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfUFJPQ19FVkVOVFM9eQorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCkBAIC0zOTYsMTYgKzM3OCwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0NEUk9NX1BLVENEVkQ9eQotQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBX09WRVJfRVRIPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLUNPTkZJR19TR0lfSU9DND15CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogCiAjCkBAIC00MTYsNyArMzk1LDcgQEAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX1JBSURfQVRUUlM9eQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CiAKQEAgLTQ2MiwyNiArNDQxLDEzIEBACiAjCiAjIFBIWSBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX1BIWUxJQj15Ci0KLSMKLSMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycwotIwotQ09ORklHX01BUlZFTExfUEhZPXkKLUNPTkZJR19EQVZJQ09NX1BIWT15Ci1DT05GSUdfUVNFTUlfUEhZPXkKLUNPTkZJR19MWFRfUEhZPXkKLUNPTkZJR19DSUNBREFfUEhZPXkKLUNPTkZJR19WSVRFU1NFX1BIWT15Ci1DT05GSUdfU01TQ19QSFk9eQotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQogIwogQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAorQ09ORklHX01JST15CiAjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldApAQCAtNDkzLDcgKzQ1OSwyNyBAQAogIwogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorQ09ORklHX1RDMzU4MTU9eQorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCkBAIC01MDksMjAgKzQ5NSwyMSBAQAogIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLUNPTkZJR19RTEEzWFhYPXkKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCiAjCiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLUNPTkZJR19DSEVMU0lPX1QzPXkKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRYRU5fTklDPXkKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogCiAjCiAjIFRva2VuIFJpbmcgZGV2aWNlcwpAQCAtNTY2LDEwICs1NTMsNyBAQAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCiAjCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldApAQCAtNTg3LDIxICs1NzEsMTMgQEAKICMKICMgSGFyZHdhcmUgSS9PIHBvcnRzCiAjCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX0xJQlBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fUkFXPXkKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorIyBDT05GSUdfVlQgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15CiAjIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAogIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0CkBAIC02MDksNyArNTg1LDcgQEAKICMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKICMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAogIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKLUNPTkZJR19NT1hBX1NNQVJUSU9fTkVXPXkKKyMgQ09ORklHX01PWEFfU01BUlRJT19ORVcgaXMgbm90IHNldAogIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldApAQCAtNjI5LDExICs2MDUsMTIgQEAKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfVFhYOT15CiBDT05GSUdfSEFTX1RYWDlfU0VSSUFMPXkKIENPTkZJR19TRVJJQUxfVFhYOV9OUl9VQVJUUz02Ci0jIENPTkZJR19TRVJJQUxfVFhYOV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9UWFg5X1NURFNFUklBTCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX1RYWDlfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1RYWDlfU1REU0VSSUFMPXkKICMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAogQ09ORklHX0xFR0FDWV9QVFlTPXkKQEAgLTY4NSw2ICs2NjIsMTEgQEAKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAKICMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC02OTcsNTEgKzY3OSw4IEBACiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAotQ09ORklHX0ZCPXkKLSMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NNSVZHWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTg2NCw3ICs4MDMsNyBAQAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotQ09ORklHX0ZVU0VfRlM9eQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwpAQCAtODg5LDE0ICs4MjgsMTMgQEAKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUNSWVBUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldApAQCAtOTQ0LDEwICs4ODIsNyBAQAogIwogIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKICMKLUNPTkZJR19ETE09eQotQ09ORklHX0RMTV9UQ1A9eQotIyBDT05GSUdfRExNX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfRExNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CiAKICMKICMgUHJvZmlsaW5nIHN1cHBvcnQKQEAgLTk3Miw2NSArOTA3LDIyIEBACiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKICMKLUNPTkZJR19LRVlTPXkKLUNPTkZJR19LRVlTX0RFQlVHX1BST0NfS0VZUz15CisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKICMKLUNPTkZJR19DUllQVE89eQotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci1DT05GSUdfQ1JZUFRPX0hNQUM9eQotQ09ORklHX0NSWVBUT19YQ0JDPXkKLUNPTkZJR19DUllQVE9fTlVMTD15Ci1DT05GSUdfQ1JZUFRPX01END15Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci1DT05GSUdfQ1JZUFRPX1NIQTE9eQotQ09ORklHX0NSWVBUT19TSEEyNTY9eQotQ09ORklHX0NSWVBUT19TSEE1MTI9eQotQ09ORklHX0NSWVBUT19XUDUxMj15Ci1DT05GSUdfQ1JZUFRPX1RHUjE5Mj15Ci1DT05GSUdfQ1JZUFRPX0dGMTI4TVVMPXkKLUNPTkZJR19DUllQVE9fRUNCPXkKLUNPTkZJR19DUllQVE9fQ0JDPXkKLUNPTkZJR19DUllQVE9fUENCQz15Ci1DT05GSUdfQ1JZUFRPX0xSVz15Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci1DT05GSUdfQ1JZUFRPX0ZDUllQVD15Ci1DT05GSUdfQ1JZUFRPX0JMT1dGSVNIPXkKLUNPTkZJR19DUllQVE9fVFdPRklTSD15Ci1DT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPXkKLUNPTkZJR19DUllQVE9fU0VSUEVOVD15Ci1DT05GSUdfQ1JZUFRPX0FFUz15Ci1DT05GSUdfQ1JZUFRPX0NBU1Q1PXkKLUNPTkZJR19DUllQVE9fQ0FTVDY9eQotQ09ORklHX0NSWVBUT19URUE9eQotQ09ORklHX0NSWVBUT19BUkM0PXkKLUNPTkZJR19DUllQVE9fS0hBWkFEPXkKLUNPTkZJR19DUllQVE9fQU5VQklTPXkKLUNPTkZJR19DUllQVE9fREVGTEFURT15Ci1DT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPXkKLUNPTkZJR19DUllQVE9fQ1JDMzJDPXkKLUNPTkZJR19DUllQVE9fQ0FNRUxMSUE9eQotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMTY9eQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKLUNPTkZJR19MSUJDUkMzMkM9eQotQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfUExJU1Q9eQogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZjMmQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MCArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjAKLSMgVHVlIEZlYiAyMCAyMTo0NzozOSAyMDA3Ci0jCi1DT05GSUdfTUlQUz15Ci0KLSMKLSMgTWFjaGluZSBzZWxlY3Rpb24KLSMKLUNPTkZJR19aT05FX0RNQT15Ci0jIENPTkZJR19NSVBTX01UWDEgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19CT1NQT1JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX01JUkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVNMRVJfRVhDSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBU0FUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQVRMQVMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19NQUxUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAotIyBDT05GSUdfV1JfUFBNQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFggaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1QgaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVF9DIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0cgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BOWDg1NTBfSkJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BOWDg1NTBfU1RCODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0REQjU0NzcgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfUE1DX1lPU0VNSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FFTVUgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VJTlMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjIgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjcgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1NFTlRPU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DQVJNRUwgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1BUU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldAotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKLUNPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQotIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAotQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfTElUVExFX0VORElBTj15Ci1DT05GSUdfUE5YODU1MD15Ci1DT05GSUdfU09DX1BOWDg1NTA9eQotQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQotCi0jCi0jIENQVSBzZWxlY3Rpb24KLSMKLUNPTkZJR19DUFVfTUlQUzMyX1IxPXkKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAotQ09ORklHX1NZU19IQVNfQ1BVX01JUFMzMl9SMT15Ci1DT05GSUdfQ1BVX01JUFMzMj15Ci1DT05GSUdfQ1BVX01JUFNSMT15Ci1DT05GSUdfU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci1DT05GSUdfQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci0KLSMKLSMgS2VybmVsIHR5cGUKLSMKLUNPTkZJR18zMkJJVD15Ci0jIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRV9TSVpFXzRLQj15Ci0jIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKLUNPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKLSMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1ZQRV9MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfNjRCSVRfUEhZU19BRERSIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfU1lOQz15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci1DT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0NQVV9TVVBQT1JUU19ISUdITUVNPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi0jIENPTkZJR19IWl80OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTI4IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8yNTA9eQotIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0yNTAKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLSMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBCbG9jayBsYXllcgotIwotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKLSMKLUNPTkZJR19IV19IQVNfUENJPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX01NVT15Ci0KLSMKLSMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAotIwotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0jIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLUNPTkZJR19UUkFEX1NJR05BTFM9eQotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci1DT05GSUdfWEZSTV9NSUdSQVRFPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1RVTk5FTD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQotQ09ORklHX0lORVRfRElBRz15Ci1DT05GSUdfSU5FVF9UQ1BfRElBRz15Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX1RDUF9NRDVTSUc9eQotCi0jCi0jIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNj1tCi0jIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAotQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQotQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15Ci0jIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KLSMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNl9TSVQ9bQotIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0VOQUJMRUQ9bQotQ09ORklHX05GX0NPTk5UUkFDS19TVVBQT1JUPXkKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORl9DT05OVFJBQ0s9bQotQ09ORklHX05GX0NUX0FDQ1Q9eQotQ09ORklHX05GX0NPTk5UUkFDS19NQVJLPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19HUkU9bQotQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQotQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KLSMgQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TIGlzIG5vdCBzZXQKLUNPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9bQotQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQotQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRBQkxFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKLSMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi0jIENPTkZJR19JUDZfTkZfUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfQ0xTX1JPVVRFPXkKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotQ09ORklHX1NHSV9JT0M0PW0KLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotQ09ORklHX0lERT15Ci1DT05GSUdfSURFX01BWF9IV0lGUz00Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLUNPTkZJR19JREVESVNLX01VTFRJX01PREU9eQotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLUNPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKLSMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9eQotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9KTUlDUk9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JVDgyMTM9bQotIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfVEM4NkMwMDE9bQotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX0FVVE89eQotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfU0NTSV9UR1Q9bQotQ09ORklHX1NDU0lfTkVUTElOSz15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwotQ09ORklHX0JMS19ERVZfU0Q9eQotIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLSMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKLQotIwotIyBTQ1NJIFRyYW5zcG9ydHMKLSMKLUNPTkZJR19TQ1NJX1NQSV9BVFRSUz1tCi1DT05GSUdfU0NTSV9GQ19BVFRSUz15Ci1DT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCi0jIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKLSMKLUNPTkZJR19JU0NTSV9UQ1A9bQotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0FJQzdYWFg9bQotQ09ORklHX0FJQzdYWFhfQ01EU19QRVJfREVWSUNFPTMyCi1DT05GSUdfQUlDN1hYWF9SRVNFVF9ERUxBWV9NUz0xNTAwMAotIyBDT05GSUdfQUlDN1hYWF9ERUJVR19FTkFCTEUgaXMgbm90IHNldAotQ09ORklHX0FJQzdYWFhfREVCVUdfTUFTSz0wCi0jIENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKLSMKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci1DT05GSUdfVFVOPW0KLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0Ci1DT05GSUdfTkFUU0VNST15Ci0jIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotQ09ORklHXzgxMzlUT089eQotIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPT184MTI5IGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLWTIgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAotIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JOWDIgaXMgbm90IHNldAotIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotQ09ORklHX0NIRUxTSU9fVDM9bQotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRYRU5fTklDPW0KLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9bQotIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfQVNZTkM9bQotQ09ORklHX1BQUF9TWU5DX1RUWT1tCi1DT05GSUdfUFBQX0RFRkxBVEU9bQotIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAotQ09ORklHX1BQUF9NUFBFPW0KLSMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotQ09ORklHX1NMSEM9bQotIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX0VWREVWPW0KLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19JODA0Mj15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD15Ci0jIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX0xJQlBTMj15Ci0jIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotIyBDT05GSUdfVlRfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15Ci0jIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAotIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DWUNMQURFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESUdJRVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX0lOVEVMTElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfU01BUlRJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTU9YQV9TTUFSVElPX05FVz1tCi0jIENPTkZJR19JU0kgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5DTElOS19HVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OX0hETEMgaXMgbm90IHNldAotIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAotIyBDT05GSUdfU1ggaXMgbm90IHNldAotIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9QTlg4WFhYPXkKLUNPTkZJR19TRVJJQUxfUE5YOFhYWF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9bQotQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPW0KLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBU0VNSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GSVJNV0FSRV9FRElEPXkKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GQl9EREMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU01JVkdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIEhJRCBEZXZpY2VzCi0jCi1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQotQ09ORklHX1VTQj15Ci0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAotCi0jCi0jIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwotIwotCi0jCi0jIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLUNPTkZJR19VU0JfU1RPUkFHRT15Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotQ09ORklHX1VTQl9ISURERVY9eQotIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR1RDTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEltYWdpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotCi0jCi0jIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQotCi0jCi0jIFVTQiBwb3J0IGRyaXZlcnMKLSMKLQotIwotIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotCi0jCi0jIEluZmluaUJhbmQgc3VwcG9ydAotIwotIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCi0jCi0KLSMKLSMgUmVhbCBUaW1lIENsb2NrCi0jCi0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKLSMKLQotIwotIyBWaXJ0dWFsaXphdGlvbgotIwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfWEZTX0ZTPW0KLSMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19BVVRPRlNfRlM9eQotQ09ORklHX0FVVE9GUzRfRlM9eQotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci1DT05GSUdfQ09ORklHRlNfRlM9bQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz15Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD1tCi0jIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19FWFBPUlRGUz1tCi1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKLSMKLUNPTkZJR19ETE09bQotQ09ORklHX0RMTV9UQ1A9eQotIyBDT05GSUdfRExNX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfRExNX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfQ1JPU1NDT01QSUxFPXkKLUNPTkZJR19DTURMSU5FPSIiCi1DT05GSUdfU1lTX1NVUFBPUlRTX0tHREI9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCi1DT05GSUdfQ1JZUFRPX0hBU0g9bQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KLSMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fWENCQz1tCi0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLUNPTkZJR19DUllQVE9fU0hBMT1tCi0jIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCi1DT05GSUdfQ1JZUFRPX0VDQj1tCi1DT05GSUdfQ1JZUFRPX0NCQz1tCi1DT05GSUdfQ1JZUFRPX1BDQkM9bQotQ09ORklHX0NSWVBUT19MUlc9bQotIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0ZDUllQVD1tCi0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19BUkM0PW0KLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19DUkMzMkM9bQotQ09ORklHX0NSWVBUT19DQU1FTExJQT1tCi0jIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci1DT05GSUdfQ1JDX0NDSVRUPW0KLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci1DT05GSUdfTElCQ1JDMzJDPW0KLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1pMSUJfREVGTEFURT1tCi1DT05GSUdfVEVYVFNFQVJDSD15Ci1DT05GSUdfVEVYVFNFQVJDSF9LTVA9bQotQ09ORklHX1RFWFRTRUFSQ0hfQk09bQotQ09ORklHX1RFWFRTRUFSQ0hfRlNNPW0KLUNPTkZJR19QTElTVD15Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfSU9QT1JUPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYwppbmRleCAyZmJlOTM0Li4wZDUyODliIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL3BjaS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KIAotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMjBfcGNpX29wczsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBndDY0eHh4X3BjaTBfb3BzOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaTBfaW9fcmVzb3VyY2UgPSB7CiAJLm5hbWUgID0gInBjaV8wIGlvIiwKQEAgLTMwLDcgKzMwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZV8wID0gewotCS5wY2lfb3BzCT0gJmd0NjQxMjBfcGNpX29wcywKKwkucGNpX29wcwk9ICZndDY0eHh4X3BjaTBfb3BzLAogCS5pb19yZXNvdXJjZQk9ICZwY2kwX2lvX3Jlc291cmNlLAogCS5tZW1fcmVzb3VyY2UJPSAmcGNpMF9tZW1fcmVzb3VyY2UsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3Byb20uYyBiL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wcm9tLmMKaW5kZXggYWE0ODFiNy4uNTM5ODgxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvam1yMzkyNy9jb21tb24vcHJvbS5jCkBAIC00MSwxNiArNDEsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAKLWV4dGVybiBpbnQgcHJvbV9hcmdjOwotZXh0ZXJuIGNoYXIgKipwcm9tX2FyZ3YsICoqcHJvbV9lbnZwOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNoYXIgKm5hbWU7Ci0vKiAgICBjaGFyICp2YWw7ICovCi19dF9lbnZfdmFyOwotCi0KIGNoYXIgKiBfX2luaXQgcHJvbV9nZXRjbWRsaW5lKHZvaWQpCiB7CiAJcmV0dXJuICYoYXJjc19jbWRsaW5lWzBdKTsKQEAgLTYwLDYgKzUwLDggQEAKIHsKIAljaGFyICpjcDsKIAlpbnQgYWN0cjsKKwlpbnQgcHJvbV9hcmdjID0gZndfYXJnMDsKKwljaGFyICoqcHJvbV9hcmd2ID0gKGNoYXIgKiopIGZ3X2FyZzE7CiAKIAlhY3RyID0gMTsgLyogQWx3YXlzIGlnbm9yZSBhcmd2WzBdICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wdXRzLmMgYi9hcmNoL21pcHMvam1yMzkyNy9jb21tb24vcHV0cy5jCmluZGV4IDFjMWNhZDkuLmM2MTFhYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wdXRzLmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3B1dHMuYwpAQCAtMzIsMTM3ICszMiwyOSBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4eDkyNy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4MzkyNy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2RlZmluZSBUSU1FT1VUICAgICAgIDB4ZmZmZmZmCi0jZGVmaW5lIFNMT1dfRE9XTgotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi0jaWZkZWYgU0xPV19ET1dOCi0jZGVmaW5lIHNsb3dfZG93bigpIHsgaW50IGs7IGZvciAoaz0wOyBrPDEwMDAwOyBrKyspOyB9Ci0jZWxzZQotI2RlZmluZSBzbG93X2Rvd24oKQotI2VuZGlmCiAKIHZvaWQKLXB1dGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykKK3Byb21fcHV0Y2hhcihjaGFyIGMpCiB7CiAgICAgICAgIGludCBpID0gMDsKIAogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzbG93X2Rvd24oKTsKICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGlmIChpPlRJTUVPVVQpIHsKKyAgICAgICAgICAgIGlmIChpPlRJTUVPVVQpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKIAl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9IGM7CiAJcmV0dXJuOwogfQogCi11bnNpZ25lZCBjaGFyIGdldGNoKHZvaWQpCi17Ci0gICAgICAgIGludCBpID0gMDsKLQlpbnQgZGljcjsKLQljaGFyIGM7Ci0KLQkvKiBkaWFibGUgUlggaW50LiAqLwotCWRpY3IgPSB0eDM5Mjdfc2lvcHRyKDEpLT5kaWNyOwotCXR4MzkyN19zaW9wdHIoMSktPmRpY3IgPSAwOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNsb3dfZG93bigpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKGk+VElNRU9VVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICh0eDM5Mjdfc2lvcHRyKDEpLT5kaXNyICYgVFh4OTI3X1NJRElTUl9VVkFMSUQpCi0JCTsKLQljID0gdHgzOTI3X3Npb3B0cigxKS0+cmZpZm87Ci0KLQkvKiBjbGVhciBSWCBpbnQuIHN0YXR1cyAqLwotCXR4MzkyN19zaW9wdHIoMSktPmRpc3IgJj0gflRYeDkyN19TSURJU1JfUkRJUzsKLQkvKiBlbmFibGUgUlggaW50LiAqLwotCXR4MzkyN19zaW9wdHIoMSktPmRpY3IgPSBkaWNyOwotCi0JcmV0dXJuIGM7Ci19CiB2b2lkCi1kb19qbXIzOTI3X2xlZF9zZXQoY2hhciBuKQorcHV0cyhjb25zdCBjaGFyICpjcCkKIHsKLSAgICAvKiBhbmQgd2l0aCBjdXJyZW50IGxlZHMgKi8KLSAgICBqbXIzOTI3X2xlZF9hbmRfc2V0KG4pOwotfQotCi12b2lkCi1wdXRzKHVuc2lnbmVkIGNoYXIgKmNwKQotewotICAgIGludCBpID0gMDsKLQotICAgIHdoaWxlICgqY3ApIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgc2xvd19kb3duKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaT5USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKLQl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9ICpjcCsrOwotICAgIH0KLSAgICBwdXRjaCgnXHInKTsKLSAgICBwdXRjaCgnXG4nKTsKLX0KLQotdm9pZAotZnB1dHModW5zaWduZWQgY2hhciAqY3ApCi17Ci0gICAgaW50IGkgPSAwOwotCi0gICAgd2hpbGUgKCpjcCkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgc2xvd19kb3duKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaT5USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKLQl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9ICpjcCsrOwotICAgIH0KLX0KLQotCi12b2lkCi1wdXQ2NCh1aW50NjRfdCB1bCkKLXsKLSAgICBpbnQgY250OwotICAgIHVuc2lnbmVkIGNoOwotCi0gICAgY250ID0gMTY7ICAgICAgICAgICAgLyogMTYgbmliYmxlcyBpbiBhIDY0IGJpdCBsb25nICovCi0gICAgcHV0Y2goJzAnKTsKLSAgICBwdXRjaCgneCcpOwotICAgIGRvIHsKLSAgICAgICAgY250LS07Ci0gICAgICAgIGNoID0gKHVuc2lnbmVkIGNoYXIpKHVsID4+IGNudCAqIDQpICYgMHgwRjsKLSAgICAgICAgICAgICAgICBwdXRjaChkaWdpdHNbY2hdKTsKLSAgICB9IHdoaWxlIChjbnQgPiAwKTsKLX0KLQotdm9pZAotcHV0MzIodW5zaWduZWQgdSkKLXsKLSAgICBpbnQgY250OwotICAgIHVuc2lnbmVkIGNoOwotCi0gICAgY250ID0gODsgICAgICAgICAgICAvKiA4IG5pYmJsZXMgaW4gYSAzMiBiaXQgbG9uZyAqLwotICAgIHB1dGNoKCcwJyk7Ci0gICAgcHV0Y2goJ3gnKTsKLSAgICBkbyB7Ci0gICAgICAgIGNudC0tOwotICAgICAgICBjaCA9ICh1bnNpZ25lZCBjaGFyKSh1ID4+IGNudCAqIDQpICYgMHgwRjsKLSAgICAgICAgICAgICAgICBwdXRjaChkaWdpdHNbY2hdKTsKLSAgICB9IHdoaWxlIChjbnQgPiAwKTsKKyAgICB3aGlsZSAoKmNwKQorCXByb21fcHV0Y2hhcigqY3ArKyk7CisgICAgcHJvbV9wdXRjaGFyKCdccicpOworICAgIHByb21fcHV0Y2hhcignXG4nKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9NYWtlZmlsZQppbmRleCAxOGZlOWE4Li44ZDAwYmE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL01ha2VmaWxlCkBAIC0zLDUgKzMsNCBAQAogIwogCiBvYmoteQkgCQkJKz0gaW5pdC5vIGlycS5vIHNldHVwLm8KLW9iai0kKENPTkZJR19SVU5USU1FX0RFQlVHKSAJKz0gZGVidWcubwogb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiX2lvLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pbml0LmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaW5pdC5jCmluZGV4IGE1NWNiNDUuLjkxNjlmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pbml0LmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2luaXQuYwpAQCAtMjgsMjAgKzI4LDEwIEBACiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vam1yMzkyNy9qbXIzOTI3Lmg+CiAKLWludCBwcm9tX2FyZ2M7Ci1jaGFyICoqcHJvbV9hcmd2LCAqKnByb21fZW52cDsKIGV4dGVybiB2b2lkICBfX2luaXQgcHJvbV9pbml0X2NtZGxpbmUodm9pZCk7Ci1leHRlcm4gY2hhciAqcHJvbV9nZXRlbnYoY2hhciAqZW52bmFtZSk7Ci11bnNpZ25lZCBsb25nIG1pcHNfbm9mcHUgPSAwOwogCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKIHsKQEAgLTUyLDcgKzQyLDcgQEAKIAk7CiB9CiAKLWV4dGVybiB2b2lkIHB1dHModW5zaWduZWQgY2hhciAqY3ApOworZXh0ZXJuIHZvaWQgcHV0cyhjb25zdCBjaGFyICpjcCk7CiAKIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQogewpAQCAtNjEsMTAgKzUxLDYgQEAKIAlpZiAoKHR4MzkyN19jY2ZncHRyLT5jY2ZnICYgVFgzOTI3X0NDRkdfVExCT0ZGKSA9PSAwKQogCQlwdXRzKCJXYXJuaW5nOiBUWDM5MjcgVExCIG9mZlxuIik7CiAjZW5kaWYKLQlwcm9tX2FyZ2MgPSBmd19hcmcwOwotCXByb21fYXJndiA9IChjaGFyICoqKSBmd19hcmcxOwotCXByb21fZW52cCA9IChjaGFyICoqKSBmd19hcmcyOwotCiAJbWlwc19tYWNoZ3JvdXAgPSBNQUNIX0dST1VQX1RPU0hJQkE7CiAKICNpZmRlZiBDT05GSUdfVE9TSElCQV9KTVIzOTI3CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMKaW5kZXggN2QyYzIwMy4uMTE4N2I0NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYwpAQCAtMzAsNTMgKzMwLDIxIEBACiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2lycS5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2lmIEpNUjM5MjdfSVJRX0VORCA+IE5SX0lSUVMKICNlcnJvciBKTVIzOTI3X0lSUV9FTkQgPiBOUl9JUlFTCiAjZW5kaWYKIAotc3RydWN0IHRiX2lycV9zcGFjZSogdGJfaXJxX3NwYWNlczsKLQotc3RhdGljIGludCBqbXIzOTI3X2lycV9iYXNlID0gLTE7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IGptcjM5MjdfZ2VuX2lhY2sodm9pZCkKLXsKLQkvKiBnZW5lcmF0ZSBBQ0sgY3ljbGUgKi8KLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKHR4MzkyN19wY2ljcHRyLT5paWFkcCA+PiAyNCkgJiAweGZmOwotI2Vsc2UKLQlyZXR1cm4gdHgzOTI3X3BjaWNwdHItPmlpYWRwICYgMHhmZjsKLSNlbmRpZgotfQotI2VuZGlmCi0KICNkZWZpbmUgaXJjX2RsZXZlbAkwCiAjZGVmaW5lIGlyY19lbGV2ZWwJMQogCkBAIC04Nyw4OSArNTUsMjQgQEAKIAk2LCA2LCA2CQkJLyogVE1SICovCiB9OwogCi1zdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpOwotc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpOwotCi1zdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID09IEpNUjM5MjdfSVJRX0lSQ19UTVIwKQotCQlqbXIzOTI3X3RtcnB0ci0+dGlzciA9IDA7ICAgICAgIC8qIGFjayBpbnRlcnJ1cHQgKi8KLQotCWptcjM5MjdfaXJxX2Rpc2FibGUoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJam1yMzkyN19pcnFfZW5hYmxlKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQlzdHJ1Y3QgdGJfaXJxX3NwYWNlKiBzcDsKLQotCWZvciAoc3AgPSB0Yl9pcnFfc3BhY2VzOyBzcDsgc3AgPSBzcC0+bmV4dCkgewotCQlpZiAoc3AtPnN0YXJ0X2lycW5vIDw9IGlycV9uciAmJgotCQkgICAgaXJxX25yIDwgc3AtPnN0YXJ0X2lycW5vICsgc3AtPm5yX2lycXMpIHsKLQkJCWlmIChzcC0+bWFza19mdW5jKQotCQkJCXNwLT5tYXNrX2Z1bmMoaXJxX25yIC0gc3AtPnN0YXJ0X2lycW5vLAotCQkJCQkgICAgICBzcC0+c3BhY2VfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXN0cnVjdCB0Yl9pcnFfc3BhY2UqIHNwOwotCi0JZm9yIChzcCA9IHRiX2lycV9zcGFjZXM7IHNwOyBzcCA9IHNwLT5uZXh0KSB7Ci0JCWlmIChzcC0+c3RhcnRfaXJxbm8gPD0gaXJxX25yICYmCi0JCSAgICBpcnFfbnIgPCBzcC0+c3RhcnRfaXJxbm8gKyBzcC0+bnJfaXJxcykgewotCQkJaWYgKHNwLT51bm1hc2tfZnVuYykKLQkJCQlzcC0+dW5tYXNrX2Z1bmMoaXJxX25yIC0gc3AtPnN0YXJ0X2lycW5vLAotCQkJCQkJc3AtPnNwYWNlX2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCiAvKgogICogQ1AwX1NUQVRVUyBpcyBhIHRocmVhZCdzIHJlc291cmNlIChzYXZlZC9yZXN0b3JlZCBvbiBjb250ZXh0IHN3aXRjaCkuCi0gKiBTbyBkaXNhYmxlX2lycS9lbmFibGVfaXJxIE1VU1QgaGFuZGxlIElPQy9JU0FDL0lSQyByZWdpc3RlcnMuCisgKiBTbyBkaXNhYmxlX2lycS9lbmFibGVfaXJxIE1VU1QgaGFuZGxlIElPQy9JUkMgcmVnaXN0ZXJzLgogICovCi1zdGF0aWMgdm9pZCBtYXNrX2lycV9pc2FjKGludCBpcnFfbnIsIGludCBzcGFjZV9pZCkKK3N0YXRpYyB2b2lkIG1hc2tfaXJxX2lvYyh1bnNpZ25lZCBpbnQgaXJxKQogewogCS8qIDA6IG1hc2sgKi8KLQl1bnNpZ25lZCBjaGFyIGltYXNrID0KLQkJam1yMzkyN19pc2FjX3JlZ19pbihKTVIzOTI3X0lTQUNfSU5UTV9BRERSKTsKLQl1bnNpZ25lZCBpbnQgYml0ICA9IDEgPDwgaXJxX25yOwotCWptcjM5MjdfaXNhY19yZWdfb3V0KGltYXNrICYgfmJpdCwgSk1SMzkyN19JU0FDX0lOVE1fQUREUik7Ci0JLyogZmx1c2ggd3JpdGUgYnVmZmVyICovCi0JKHZvaWQpam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX1JFVl9BRERSKTsKLX0KLXN0YXRpYyB2b2lkIHVubWFza19pcnFfaXNhYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCi17Ci0JLyogMDogbWFzayAqLwotCXVuc2lnbmVkIGNoYXIgaW1hc2sgPSBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19JTlRNX0FERFIpOwotCXVuc2lnbmVkIGludCBiaXQgID0gMSA8PCBpcnFfbnI7Ci0Jam1yMzkyN19pc2FjX3JlZ19vdXQoaW1hc2sgfCBiaXQsIEpNUjM5MjdfSVNBQ19JTlRNX0FERFIpOwotCS8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLwotCSh2b2lkKWptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfaXJxX2lvYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCi17Ci0JLyogMDogbWFzayAqLworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBKTVIzOTI3X0lSUV9JT0M7CiAJdW5zaWduZWQgY2hhciBpbWFzayA9IGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19JTlRNX0FERFIpOwogCXVuc2lnbmVkIGludCBiaXQgPSAxIDw8IGlycV9ucjsKIAlqbXIzOTI3X2lvY19yZWdfb3V0KGltYXNrICYgfmJpdCwgSk1SMzkyN19JT0NfSU5UTV9BRERSKTsKIAkvKiBmbHVzaCB3cml0ZSBidWZmZXIgKi8KIAkodm9pZClqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfUkVWX0FERFIpOwogfQotc3RhdGljIHZvaWQgdW5tYXNrX2lycV9pb2MoaW50IGlycV9uciwgaW50IHNwYWNlX2lkKQorc3RhdGljIHZvaWQgdW5tYXNrX2lycV9pb2ModW5zaWduZWQgaW50IGlycSkKIHsKIAkvKiAwOiBtYXNrICovCisJdW5zaWduZWQgaW50IGlycV9uciA9IGlycSAtIEpNUjM5MjdfSVJRX0lPQzsKIAl1bnNpZ25lZCBjaGFyIGltYXNrID0gam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX0lOVE1fQUREUik7CiAJdW5zaWduZWQgaW50IGJpdCA9IDEgPDwgaXJxX25yOwogCWptcjM5MjdfaW9jX3JlZ19vdXQoaW1hc2sgfCBiaXQsIEpNUjM5MjdfSU9DX0lOVE1fQUREUik7CkBAIC0xNzcsOCArODAsOSBAQAogCSh2b2lkKWptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUik7CiB9CiAKLXN0YXRpYyB2b2lkIG1hc2tfaXJxX2lyYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCitzdGF0aWMgdm9pZCBtYXNrX2lycV9pcmModW5zaWduZWQgaW50IGlycSkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxX25yID0gaXJxIC0gSk1SMzkyN19JUlFfSVJDOwogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmlscnAgPSAmdHgzOTI3X2lyY3B0ci0+aWxyW2lycV9uciAvIDJdOwogCWlmIChpcnFfbnIgJiAxKQogCQkqaWxycCA9ICgqaWxycCAmIDB4MDBmZikgfCAoaXJjX2RsZXZlbCA8PCA4KTsKQEAgLTE5MSw4ICs5NSw5IEBACiAJKHZvaWQpdHgzOTI3X2lyY3B0ci0+c3NyOwogfQogCi1zdGF0aWMgdm9pZCB1bm1hc2tfaXJxX2lyYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCitzdGF0aWMgdm9pZCB1bm1hc2tfaXJxX2lyYyh1bnNpZ25lZCBpbnQgaXJxKQogeworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBKTVIzOTI3X0lSUV9JUkM7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaWxycCA9ICZ0eDM5MjdfaXJjcHRyLT5pbHJbaXJxX25yIC8gMl07CiAJaWYgKGlycV9uciAmIDEpCiAJCSppbHJwID0gKCppbHJwICYgMHgwMGZmKSB8IChpcmNfbGV2ZWxbaXJxX25yXSA8PCA4KTsKQEAgLTIwMyw5OCArMTA4LDE0IEBACiAJdHgzOTI3X2lyY3B0ci0+aW1yID0gaXJjX2VsZXZlbDsKIH0KIAotc3RydWN0IHRiX2lycV9zcGFjZSBqbXIzOTI3X2lzYWNfaXJxc3BhY2UgPSB7Ci0JLm5leHQgPSBOVUxMLAotCS5zdGFydF9pcnFubyA9IEpNUjM5MjdfSVJRX0lTQUMsCi0JbnJfaXJxcyA6IEpNUjM5MjdfTlJfSVJRX0lTQUMsCi0JLm1hc2tfZnVuYyA9IG1hc2tfaXJxX2lzYWMsCi0JLnVubWFza19mdW5jID0gdW5tYXNrX2lycV9pc2FjLAotCS5uYW1lID0gIklTQUMiLAotCS5zcGFjZV9pZCA9IDAsCi0JY2FuX3NoYXJlIDogMAotfTsKLXN0cnVjdCB0Yl9pcnFfc3BhY2Ugam1yMzkyN19pb2NfaXJxc3BhY2UgPSB7Ci0JLm5leHQgPSBOVUxMLAotCS5zdGFydF9pcnFubyA9IEpNUjM5MjdfSVJRX0lPQywKLQlucl9pcnFzIDogSk1SMzkyN19OUl9JUlFfSU9DLAotCS5tYXNrX2Z1bmMgPSBtYXNrX2lycV9pb2MsCi0JLnVubWFza19mdW5jID0gdW5tYXNrX2lycV9pb2MsCi0JLm5hbWUgPSAiSU9DIiwKLQkuc3BhY2VfaWQgPSAwLAotCWNhbl9zaGFyZSA6IDEKLX07Ci0KLXN0cnVjdCB0Yl9pcnFfc3BhY2Ugam1yMzkyN19pcmNfaXJxc3BhY2UgPSB7Ci0JLm5leHQJCT0gTlVMTCwKLQkuc3RhcnRfaXJxbm8JPSBKTVIzOTI3X0lSUV9JUkMsCi0JLm5yX2lycXMJPSBKTVIzOTI3X05SX0lSUV9JUkMsCi0JLm1hc2tfZnVuYwk9IG1hc2tfaXJxX2lyYywKLQkudW5tYXNrX2Z1bmMJPSB1bm1hc2tfaXJxX2lyYywKLQkubmFtZQkJPSAib24tY2hpcCIsCi0JLnNwYWNlX2lkCT0gMCwKLQkuY2FuX3NoYXJlCT0gMAotfTsKLQotCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLXN0YXRpYyBpbnQgdHhfYnJhbmNoX2xpa2VseV9idWdfY291bnQgPSAwOwotc3RhdGljIGludCBoYXZlX3R4X2JyYW5jaF9saWtlbHlfYnVnID0gMDsKLQotc3RhdGljIHZvaWQgdHhfYnJhbmNoX2xpa2VseV9idWdfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwotCi0JLyogVFgzOS80OS1CVUc6IFVuZGVyIHRoaXMgY29uZGl0aW9uLCB0aGUgaW5zbiBpbiBkZWxheSBzbG90Ci0gICAgICAgICAgIG9mIHRoZSBicmFuY2ggbGlrZWx5IGluc24gaXMgZXhlY3V0ZWQgKG5vdCBudWxsaWZpZWQpIGV2ZW4KLSAgICAgICAgICAgdGhlIGJyYW5jaCBjb25kaXRpb24gaXMgZmFsc2UuICovCi0JaWYgKCFoYXZlX3R4X2JyYW5jaF9saWtlbHlfYnVnKQotCQlyZXR1cm47Ci0JaWYgKChyZWdzLT5jcDBfZXBjICYgMHhmZmYpID09IDB4ZmZjICYmCi0JICAgIEtTRUdYKHJlZ3MtPmNwMF9lcGMpICE9IEtTRUcwICYmCi0JICAgIEtTRUdYKHJlZ3MtPmNwMF9lcGMpICE9IEtTRUcxKSB7Ci0JCXVuc2lnbmVkIGludCBpbnNuID0gKih1bnNpZ25lZCBpbnQqKShyZWdzLT5jcDBfZXBjIC0gNCk7Ci0JCS8qIGJlcWwsYm5lbCxibGV6bCxiZ3R6bCAqLwotCQkvKiBibHR6bCxiZ2V6bCxibGV6YWxsLGJnZXphbGwgKi8KLQkJLyogYmN6ZmwsIGJjenRsICovCi0JCWlmICgoaW5zbiAmIDB4ZjAwMDAwMDApID09IDB4NTAwMDAwMDAgfHwKLQkJICAgIChpbnNuICYgMHhmYzBlMDAwMCkgPT0gMHgwNDAyMDAwMCB8fAotCQkgICAgKGluc24gJiAweGYzZmUwMDAwKSA9PSAweDQxMDIwMDAwKSB7Ci0JCQlyZWdzLT5jcDBfZXBjIC09IDQ7Ci0JCQl0eF9icmFuY2hfbGlrZWx5X2J1Z19jb3VudCsrOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJmaXggYnJhbmNoLWxpa2VyeSBidWcgaW4gJXMgKGluc24gJTA4eClcbiIsCi0JCQkgICAgICAgY3VycmVudC0+Y29tbSwgaW5zbik7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgam1yMzkyN19zcHVyaW91cyh2b2lkKQotewotCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IGdldF9pcnFfcmVncygpOwotCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLQl0eF9icmFuY2hfbGlrZWx5X2J1Z19maXh1cCgpOwotI2VuZGlmCi0JcHJpbnRrKEtFUk5fV0FSTklORyAic3B1cmlvdXMgaW50ZXJydXB0IChjYXVzZSAweCVseCwgcGMgMHglbHgsIHJhIDB4JWx4KS5cbiIsCi0JICAgICAgIHJlZ3MtPmNwMF9jYXVzZSwgcmVncy0+Y3AwX2VwYywgcmVncy0+cmVnc1szMV0pOwotfQotCiBhc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwl1bnNpZ25lZCBsb25nIGNwMF9jYXVzZSA9IHJlYWRfYzBfY2F1c2UoKTsKIAlpbnQgaXJxOwogCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLQl0eF9icmFuY2hfbGlrZWx5X2J1Z19maXh1cCgpOwotI2VuZGlmCi0JaWYgKChyZWdzLT5jcDBfY2F1c2UgJiBDQVVTRUZfSVA3KSA9PSAwKSB7Ci0jaWYgMAotCQlqbXIzOTI3X3NwdXJpb3VzKCk7Ci0jZW5kaWYKKwlpZiAoKGNwMF9jYXVzZSAmIENBVVNFRl9JUDcpID09IDApCiAJCXJldHVybjsKLQl9Ci0JaXJxID0gKHJlZ3MtPmNwMF9jYXVzZSA+PiBDQVVTRUJfSVAyKSAmIDB4MGY7CisJaXJxID0gKGNwMF9jYXVzZSA+PiBDQVVTRUJfSVAyKSAmIDB4MGY7CiAKIAlkb19JUlEoaXJxICsgSk1SMzkyN19JUlFfSVJDKTsKIH0KQEAgLTMxNywzNSArMTM4LDYgQEAKIAlqbXIzOTI3X2lvY19pbnRlcnJ1cHQsIDAsIENQVV9NQVNLX05PTkUsICJJT0MiLCBOVUxMLCBOVUxMLAogfTsKIAotc3RhdGljIGlycXJldHVybl90IGptcjM5MjdfaXNhY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGNoYXIgaXN0YXQgPSBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19JTlRTMl9BRERSKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBKTVIzOTI3X05SX0lSUV9JU0FDOyBpKyspIHsKLQkJaWYgKGlzdGF0ICYgKDEgPDwgaSkpIHsKLQkJCWlycSA9IEpNUjM5MjdfSVJRX0lTQUMgKyBpOwotCQkJZG9fSVJRKGlycSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpc2FjX2FjdGlvbiA9IHsKLQlqbXIzOTI3X2lzYWNfaW50ZXJydXB0LCAwLCBDUFVfTUFTS19OT05FLCAiSVNBQyIsIE5VTEwsIE5VTEwsCi19OwotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBqbXIzOTI3X2lzYWVycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgIklTQSBlcnJvciBpbnRlcnJ1cHQgKGlycSAweCV4KS5cbiIsIGlycSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpc2FlcnJfYWN0aW9uID0gewotCWptcjM5MjdfaXNhZXJyX2ludGVycnVwdCwgMCwgQ1BVX01BU0tfTk9ORSwgIklTQSBlcnJvciIsIE5VTEwsIE5VTEwsCi19OwotCiBzdGF0aWMgaXJxcmV0dXJuX3Qgam1yMzkyN19wY2llcnJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0kgZXJyb3IgaW50ZXJydXB0IChpcnEgMHgleCkuXG4iLCBpcnEpOwpAQCAtMzU4LDU0ICsxNTAsMTkgQEAKIAlqbXIzOTI3X3BjaWVycl9pbnRlcnJ1cHQsIDAsIENQVV9NQVNLX05PTkUsICJQQ0kgZXJyb3IiLCBOVUxMLCBOVUxMLAogfTsKIAotaW50IGptcjM5MjdfZXRoZXIxX2lycSA9IDA7Ci0KLXZvaWQgam1yMzkyN19pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpOworc3RhdGljIHZvaWQgX19pbml0IGptcjM5MjdfaXJxX2luaXQodm9pZCk7CiAKIHZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKIHsKLQkvKiBsb29rIGZvciBpbyBib2FyZCdzIHByZXNlbmNlICovCi0JaW50IGhhdmVfaXNhYyA9IGptcjM5MjdfaGF2ZV9pc2FjKCk7Ci0KIAkvKiBOb3csIGludGVycnVwdCBjb250cm9sIGRpc2FibGVkLCAqLwogCS8qIGFsbCBJUkMgaW50ZXJydXB0cyBhcmUgbWFza2VkLCAqLwogCS8qIGFsbCBJUkMgaW50ZXJydXB0IG1vZGUgYXJlIExvdyBBY3RpdmUuICovCiAKLQlpZiAoaGF2ZV9pc2FjKSB7Ci0KLQkJLyogRVRIRVIxIChORTIwMDAgY29tcGF0aWJsZSAxME0tRXRoZXIpIHBhcmFtZXRlciBzZXR1cCAqLwotCQkvKiB0ZW1wb3JhcnkgZW5hYmxlIGludGVycnVwdCBjb250cm9sICovCi0JCXR4MzkyN19pcmNwdHItPmNlciA9IDE7Ci0JCS8qIEVUSEVSMSBJbnQuIElzIEhpZ2gtQWN0aXZlLiAqLwotCQlpZiAodHgzOTI3X2lyY3B0ci0+c3NyICYgKDEgPDwgMCkpCi0JCQlqbXIzOTI3X2V0aGVyMV9pcnEgPSBKTVIzOTI3X0lSUV9JUkNfSU5UMDsKLSNpZiAwCS8qIElOVDMgbWF5IGJlIGFzc2VydGVkIGJ5IGV0aGVyMCAoZXZlbiBhZnRlciByZWJvb3QuLi4pICovCi0JCWVsc2UgaWYgKHR4MzkyN19pcmNwdHItPnNzciAmICgxIDw8IDMpKQotCQkJam1yMzkyN19ldGhlcjFfaXJxID0gSk1SMzkyN19JUlFfSVJDX0lOVDM7Ci0jZW5kaWYKLQkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29udHJvbCAqLwotCQl0eDM5MjdfaXJjcHRyLT5jZXIgPSAwOwotCi0JCS8qIEV0aGVyMTogSGlnaCBBY3RpdmUgKi8KLQkJaWYgKGptcjM5MjdfZXRoZXIxX2lycSkgewotCQkJaW50IGV0aGVyMV9pcmMgPSBqbXIzOTI3X2V0aGVyMV9pcnEgLSBKTVIzOTI3X0lSUV9JUkM7Ci0JCQl0eDM5MjdfaXJjcHRyLT5jcltldGhlcjFfaXJjIC8gOF0gfD0KLQkJCQlUWDM5MjdfSVJDUl9ISUdIIDw8ICgoZXRoZXIxX2lyYyAlIDgpICogMik7Ci0JCX0KLQl9Ci0KIAkvKiBtYXNrIGFsbCBJT0MgaW50ZXJydXB0cyAqLwogCWptcjM5MjdfaW9jX3JlZ19vdXQoMCwgSk1SMzkyN19JT0NfSU5UTV9BRERSKTsKIAkvKiBzZXR1cCBJT0MgaW50ZXJydXB0IG1vZGUgKFNPRlQ6SGlnaCBBY3RpdmUsIE90aGVyczpMb3cgQWN0aXZlKSAqLwogCWptcjM5MjdfaW9jX3JlZ19vdXQoSk1SMzkyN19JT0NfSU5URl9TT0ZULCBKTVIzOTI3X0lPQ19JTlRQX0FERFIpOwogCi0JaWYgKGhhdmVfaXNhYykgewotCQkvKiBtYXNrIGFsbCBJU0FDIGludGVycnVwdHMgKi8KLQkJam1yMzkyN19pc2FjX3JlZ19vdXQoMCwgSk1SMzkyN19JU0FDX0lOVE1fQUREUik7Ci0JCS8qIHNldHVwIElTQUMgaW50ZXJydXB0IG1vZGUgKElTQUlSUTMsSVNBSVJRNTpMb3cgQWN0aXZlID8/PykgKi8KLQkJam1yMzkyN19pc2FjX3JlZ19vdXQoSk1SMzkyN19JU0FDX0lOVEZfSVJRM3xKTVIzOTI3X0lTQUNfSU5URl9JUlE1LCBKTVIzOTI3X0lTQUNfSU5UUF9BRERSKTsKLQl9Ci0KIAkvKiBjbGVhciBQQ0kgU29mdCBpbnRlcnJ1cHRzICovCiAJam1yMzkyN19pb2NfcmVnX291dCgwLCBKTVIzOTI3X0lPQ19JTlRTMV9BRERSKTsKIAkvKiBjbGVhciBQQ0kgUmVzZXQgaW50ZXJydXB0cyAqLwpAQCAtNDE1LDIxICsxNzIsMTEgQEAKIAl0eDM5MjdfaXJjcHRyLT5jZXIgPSBUWDM5MjdfSVJDRVJfSUNFOwogCXR4MzkyN19pcmNwdHItPmltciA9IGlyY19lbGV2ZWw7CiAKLQlqbXIzOTI3X2lycV9pbml0KE5SX0lTQV9JUlFTKTsKLQotCS8qIHNldHVwIGlycSBzcGFjZSAqLwotCWFkZF90Yl9pcnFfc3BhY2UoJmptcjM5MjdfaXNhY19pcnFzcGFjZSk7Ci0JYWRkX3RiX2lycV9zcGFjZSgmam1yMzkyN19pb2NfaXJxc3BhY2UpOwotCWFkZF90Yl9pcnFfc3BhY2UoJmptcjM5MjdfaXJjX2lycXNwYWNlKTsKKwlqbXIzOTI3X2lycV9pbml0KCk7CiAKIAkvKiBzZXR1cCBJT0MgaW50ZXJydXB0IDEgKFBDSSwgTU9ERU0pICovCiAJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lPQ0lOVCwgJmlvY19hY3Rpb24pOwogCi0JaWYgKGhhdmVfaXNhYykgewotCQlzZXR1cF9pcnEoSk1SMzkyN19JUlFfSVNBQ0lOVCwgJmlzYWNfYWN0aW9uKTsKLQkJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lTQUNfSVNBRVIsICZpc2FlcnJfYWN0aW9uKTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfUENJCiAJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lSQ19QQ0ksICZwY2llcnJfYWN0aW9uKTsKICNlbmRpZgpAQCAtNDM4LDIxICsxODUsMjggQEAKIAlzZXRfYzBfc3RhdHVzKFNUMF9JTSk7CS8qIElFIGJpdCBpcyBzdGlsbCAwLiAqLwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGptcjM5MjdfaXJxX2NvbnRyb2xsZXIgPSB7Ci0JLm5hbWUgPSAiam1yMzkyN19pcnEiLAotCS5hY2sgPSBqbXIzOTI3X2lycV9hY2ssCi0JLm1hc2sgPSBqbXIzOTI3X2lycV9kaXNhYmxlLAotCS5tYXNrX2FjayA9IGptcjM5MjdfaXJxX2FjaywKLQkudW5tYXNrID0gam1yMzkyN19pcnFfZW5hYmxlLAotCS5lbmQgPSBqbXIzOTI3X2lycV9lbmQsCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGptcjM5MjdfaXJxX2lvYyA9IHsKKwkubmFtZSA9ICJqbXIzOTI3X2lvYyIsCisJLmFjayA9IG1hc2tfaXJxX2lvYywKKwkubWFzayA9IG1hc2tfaXJxX2lvYywKKwkubWFza19hY2sgPSBtYXNrX2lycV9pb2MsCisJLnVubWFzayA9IHVubWFza19pcnFfaW9jLAogfTsKIAotdm9pZCBqbXIzOTI3X2lycV9pbml0KHUzMiBpcnFfYmFzZSkKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgam1yMzkyN19pcnFfaXJjID0geworCS5uYW1lID0gImptcjM5MjdfaXJjIiwKKwkuYWNrID0gbWFza19pcnFfaXJjLAorCS5tYXNrID0gbWFza19pcnFfaXJjLAorCS5tYXNrX2FjayA9IG1hc2tfaXJxX2lyYywKKwkudW5tYXNrID0gdW5tYXNrX2lycV9pcmMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19pcnFfaW5pdCh2b2lkKQogewogCXUzMiBpOwogCi0JZm9yIChpPSBpcnFfYmFzZTsgaTwgaXJxX2Jhc2UgKyBKTVIzOTI3X05SX0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JT0M7IGkrKykKLQkJc2V0X2lycV9jaGlwKGksICZqbXIzOTI3X2lycV9jb250cm9sbGVyKTsKLQotCWptcjM5MjdfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKKwlmb3IgKGkgPSBKTVIzOTI3X0lSUV9JUkM7IGkgPCBKTVIzOTI3X0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JUkM7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZqbXIzOTI3X2lycV9pcmMsIGhhbmRsZV9sZXZlbF9pcnEpOworCWZvciAoaSA9IEpNUjM5MjdfSVJRX0lPQzsgaSA8IEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfTlJfSVJRX0lPQzsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmptcjM5MjdfaXJxX2lvYywgaGFuZGxlX2xldmVsX2lycSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAva2dkYl9pby5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2tnZGJfaW8uYwppbmRleCAyNjlhNDJkLi4yNjA0ZjJjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAva2dkYl9pby5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9rZ2RiX2lvLmMKQEAgLTMxLDIzICszMSwxMiBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4eDkyNy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4MzkyNy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2RlZmluZSBUSU1FT1VUICAgICAgIDB4ZmZmZmZmCi0jZGVmaW5lIFNMT1dfRE9XTgotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi0jaWZkZWYgU0xPV19ET1dOCi0jZGVmaW5lIHNsb3dfZG93bigpIHsgaW50IGs7IGZvciAoaz0wOyBrPDEwMDAwOyBrKyspOyB9Ci0jZWxzZQotI2RlZmluZSBzbG93X2Rvd24oKQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgcmVtb3RlRGVidWdJbml0aWFsaXplZCA9IDA7CitzdGF0aWMgdm9pZCBkZWJ1Z0luaXQoaW50IGJhdWQpCiAKIGludCBwdXREZWJ1Z0NoYXIodW5zaWduZWQgY2hhciBjKQogewpAQCAtMTAzLDIwICs5Miw4IEBACiAJcmV0dXJuIGM7CiB9CiAKLXZvaWQgZGVidWdJbml0KGludCBiYXVkKQorc3RhdGljIHZvaWQgZGVidWdJbml0KGludCBiYXVkKQogewotCS8qCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsY3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkaWNyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGlzcjsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNpc3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBmY3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBmbGNyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYmdyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGZpZm87Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZmlmbzsKLQkqLwotCiAJdHgzOTI3X3Npb3B0cigwKS0+bGNyID0gMHgwMjA7CiAJdHgzOTI3X3Npb3B0cigwKS0+ZGljciA9IDA7CiAJdHgzOTI3X3Npb3B0cigwKS0+ZGlzciA9IDB4NDEwMDsKQEAgLTEyNSwzMSArMTAyLDQgQEAKIAl0eDM5Mjdfc2lvcHRyKDApLT5mbGNyID0gMHgwMjsKIAl0eDM5Mjdfc2lvcHRyKDApLT5iZ3IgPSAoKEpNUjM5MjdfQkFTRV9CQVVEICsgYmF1ZCAvIDIpIC8gYmF1ZCkgfAogCQlUWHg5MjdfU0lCR1JfQkNMS19UMDsKLSNpZiAwCi0JLyoKLQkgKiBSZXNldCB0aGUgVUFSVC4KLQkgKi8KLQl0eDM5Mjdfc2lvcHRyKDApLT5mY3IgPSBUWHg5MjdfU0lGQ1JfU1dSU1Q7Ci0Jd2hpbGUgKHR4MzkyN19zaW9wdHIoMCktPmZjciAmIFRYeDkyN19TSUZDUl9TV1JTVCkKLQkJOwotCi0JLyoKLQkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKLQkgKiAoY3VycmVudGx5IGhhcmR3aXJlZCB0byA5NjAwIDhOMQotCSAqLwotCi0JdHgzOTI3X3Npb3B0cigwKS0+bGNyID0gVFh4OTI3X1NJTENSX1VNT0RFXzhCSVQgfAotCQlUWHg5MjdfU0lMQ1JfVVNCTF8xQklUIHwKLQkJVFh4OTI3X1NJTENSX1NDU19JTUNMS19CRzsKLQl0eDM5Mjdfc2lvcHRyKDApLT5iZ3IgPQotCQkoKEpNUjM5MjdfQkFTRV9CQVVEICsgYmF1ZCAvIDIpIC8gYmF1ZCkgfAotCQlUWHg5MjdfU0lCR1JfQkNMS19UMDsKLQotCS8qIEhXIFJUUy9DVFMgY29udHJvbCAqLwotCWlmIChzZXItPmZsYWdzICYgQVNZTkNfSEFWRV9DVFNfTElORSkKLQkJdHgzOTI3X3Npb3B0cigwKS0+ZmxjciA9IFRYeDkyN19TSUZMQ1JfUkNTIHwgVFh4OTI3X1NJRkxDUl9URVMgfAotCQkJVFh4OTI3X1NJRkxDUl9SVFNUTF9NQVggLyogMTUgKi87Ci0JLyogRW5hYmxlIFJYL1RYICovCi0JdHgzOTI3X3Npb3B0cigwKS0+ZmxjciAmPSB+KFRYeDkyN19TSUZMQ1JfUlNERSB8IFRYeDkyN19TSUZMQ1JfVFNERSk7Ci0jZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKaW5kZXggZmM1MjNiZC4uZDFlZjI4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCkBAIC01NCw4NyArNTQsMTggQEAKIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9iY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAotZXh0ZXJuIHZvaWQgcHV0cyh1bnNpZ25lZCBjaGFyICpjcCk7CitleHRlcm4gdm9pZCBwdXRzKGNvbnN0IGNoYXIgKmNwKTsKIAogLyogVGljayBUaW1lciBkaXZpZGVyICovCiAjZGVmaW5lIEpNUjM5MjdfVElNRVJfQ0NECTAJLyogMS8yICovCiAjZGVmaW5lIEpNUjM5MjdfVElNRVJfQ0xLCShKTVIzOTI3X0lNQ0xLIC8gKDIgPDwgSk1SMzkyN19USU1FUl9DQ0QpKQogCi11bnNpZ25lZCBjaGFyIGxlZF9zdGF0ZSA9IDB4ZjsKLQotc3RydWN0IHsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcmFtMDsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcmFtMTsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcGNpbWVtOwotICAgIHN0cnVjdCByZXNvdXJjZSBpb2I7Ci0gICAgc3RydWN0IHJlc291cmNlIGlvYzsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcGNpaW87Ci0gICAgc3RydWN0IHJlc291cmNlIGpteTEzOTQ7Ci0gICAgc3RydWN0IHJlc291cmNlIHJvbTE7Ci0gICAgc3RydWN0IHJlc291cmNlIHJvbTA7Ci0gICAgc3RydWN0IHJlc291cmNlIHNpbzA7Ci0gICAgc3RydWN0IHJlc291cmNlIHNpbzE7Ci19IGptcjM5MjdfcmVzb3VyY2VzID0gewotCXsKLQkJLnN0YXJ0CT0gMCwKLQkJLmVuZAk9IDB4MDFGRkZGRkYsCi0JCS5uYW1lCT0gIlJBTTAiLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgwMjAwMDAwMCwKLQkJLmVuZAk9IDB4MDNGRkZGRkYsCi0JCS5uYW1lCT0gIlJBTTEiLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgwODAwMDAwMCwKLQkJLmVuZAk9IDB4MDdGRkZGRkYsCi0JCS5uYW1lCT0gIlBDSU1FTSIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCi0JfSwgewotCQkuc3RhcnQJPSAweDEwMDAwMDAwLAotCQkuZW5kCT0gMHgxM0ZGRkZGRiwKLQkJLm5hbWUJPSAiSU9CIgotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxNDAwMDAwMCwKLQkJLmVuZAk9IDB4MTRGRkZGRkYsCi0JCS5uYW1lCT0gIklPQyIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTUwMDAwMDAsCi0JCS5lbmQJPSAweDE1RkZGRkZGLAotCQkubmFtZQk9ICJQQ0lJTyIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MUQwMDAwMDAsCi0JCS5lbmQJPSAweDFEM0ZGRkZGLAotCQkubmFtZQk9ICJKTVkxMzk0IgotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxRTAwMDAwMCwKLQkJLmVuZAk9IDB4MUUzRkZGRkYsCi0JCS5uYW1lCT0gIlJPTTEiCi0JfSwgewotCQkuc3RhcnQJPSAweDFGQzAwMDAwLAotCQkuZW5kCT0gMHgxRkZGRkZGRiwKLQkJLm5hbWUJPSAiUk9NMCIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4RkZGRUYzMDAsCi0JCS5lbmQJPSAweEZGRkVGM0ZGLAotCQkubmFtZQk9ICJTSU8wIgotCX0sIHsKLQkJLnN0YXJ0CT0gMHhGRkZFRjQwMCwKLQkJLmVuZAk9IDB4RkZGRUY0RkYsCi0JCS5uYW1lCT0gIlNJTzEiCi0JfSwKLX07Ci0KIC8qIGRvbid0IGVuYWJsZSAtIHNlZSBlcnJhdGEgKi8KLWludCBqbXIzOTI3X2NjZmdfdG9lb24gPSAwOworc3RhdGljIGludCBqbXIzOTI3X2NjZmdfdG9lb247CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19yZXNldCh2b2lkKQogewpAQCAtMTczLDkgKzEwNCwxNSBAQAogCXJldHVybiBqaWZmaWVzICogKEpNUjM5MjdfVElNRVJfQ0xLIC8gSFopICsgam1yMzkyN190bXJwdHItPnRycjsKIH0KIAorc3RhdGljIHZvaWQgam1yMzkyN190aW1lcl9hY2sodm9pZCkKK3sKKwlqbXIzOTI3X3RtcnB0ci0+dGlzciA9IDA7ICAgICAgIC8qIGFjayBpbnRlcnJ1cHQgKi8KK30KKwogc3RhdGljIHZvaWQgX19pbml0IGptcjM5MjdfdGltZV9pbml0KHZvaWQpCiB7CiAJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gam1yMzkyN19ocHRfcmVhZDsKKwltaXBzX3RpbWVyX2FjayA9IGptcjM5MjdfdGltZXJfYWNrOwogCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IEpNUjM5MjdfVElNRVJfQ0xLOwogfQogCkBAIC0xOTAsOSArMTI3LDYgQEAKIAlzZXR1cF9pcnEoSk1SMzkyN19JUlFfVElDSywgaXJxKTsKIH0KIAotI2RlZmluZSBVU0VDU19QRVJfSklGRlkgKDEwMDAwMDAvSFopCi0KLS8vI3VuZGVmIERPX1dSSVRFX1RIUk9VR0gKICNkZWZpbmUgRE9fV1JJVEVfVEhST1VHSAogI2RlZmluZSBET19FTkFCTEVfQ0FDSEUKIApAQCAtMjI0LDEyICsxNTgsNiBAQAogCS8qIFJlYm9vdCBvbiBwYW5pYyAqLwogCXBhbmljX3RpbWVvdXQgPSAxODA7CiAKLQl7Ci0JCXVuc2lnbmVkIGludCBjb25mOwotCQljb25mID0gcmVhZF9jMF9jb25mKCk7Ci0JfQotCi0jaWYgMQogCS8qIGNhY2hlIHNldHVwICovCiAJewogCQl1bnNpZ25lZCBpbnQgY29uZjsKQEAgLTI1NiwxNiArMTg0LDE0IEBACiAJCXdyaXRlX2MwX2NvbmYoY29uZik7CiAJCXdyaXRlX2MwX2NhY2hlKDApOwogCX0KLSNlbmRpZgogCiAJLyogaW5pdGlhbGl6ZSBib2FyZCAqLwogCWptcjM5MjdfYm9hcmRfaW5pdCgpOwogCiAJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CiAKLQlpZiAoKGFyZ3B0ciA9IHN0cnN0cihhcmdwdHIsICJ0b2VvbiIpKSAhPSBOVUxMKSB7Ci0JCQlqbXIzOTI3X2NjZmdfdG9lb24gPSAxOwotCX0KKwlpZiAoKGFyZ3B0ciA9IHN0cnN0cihhcmdwdHIsICJ0b2VvbiIpKSAhPSBOVUxMKQorCQlqbXIzOTI3X2NjZmdfdG9lb24gPSAxOwogCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwogCWlmICgoYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgImlwPSIpKSA9PSBOVUxMKSB7CiAJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwpAQCAtMjgxLDcgKzIwNyw3IEBACiAJCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwogCQkJcmVxLmxpbmUgPSBpOwogCQkJcmVxLmlvdHlwZSA9IFVQSU9fTUVNOwotCQkJcmVxLm1lbWJhc2UgPSAoY2hhciAqKVRYMzkyN19TSU9fUkVHKGkpOworCQkJcmVxLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciBfX2lvbWVtICopVFgzOTI3X1NJT19SRUcoaSk7CiAJCQlyZXEubWFwYmFzZSA9IFRYMzkyN19TSU9fUkVHKGkpOwogCQkJcmVxLmlycSA9IGkgPT0gMCA/CiAJCQkJSk1SMzkyN19JUlFfSVJDX1NJTzAgOiBKTVIzOTI3X0lSUV9JUkNfU0lPMTsKQEAgLTMwMyw2NSArMjI5LDMzIEBACiAKIHN0YXRpYyB2b2lkIHR4MzkyN19zZXR1cCh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fYmFzZTsKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fc2l6ZTsKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfbWVtX2Jhc2U7Ci11bnNpZ25lZCBsb25nIG1pcHNfcGNpX21lbV9zaXplOwotLyogZm9yIGxlZ2FjeSBJL08sIFBDSSBJL08gUENJIEJ1cyBhZGRyZXNzIG11c3QgYmUgMCAqLwotdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19wY2lhZGRyID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19ib2FyZF9pbml0KHZvaWQpCiB7Ci0JY2hhciAqYXJncHRyOwotCi0jaWZkZWYgQ09ORklHX1BDSQotCW1pcHNfcGNpX2lvX2Jhc2UgPSBKTVIzOTI3X1BDSUlPOwotCW1pcHNfcGNpX2lvX3NpemUgPSBKTVIzOTI3X1BDSUlPX1NJWkU7Ci0JbWlwc19wY2lfbWVtX2Jhc2UgPSBKTVIzOTI3X1BDSU1FTTsKLQltaXBzX3BjaV9tZW1fc2l6ZSA9IEpNUjM5MjdfUENJTUVNX1NJWkU7Ci0jZW5kaWYKLQogCXR4MzkyN19zZXR1cCgpOwogCi0JaWYgKGptcjM5MjdfaGF2ZV9pc2FjKCkpIHsKLQotI2lmZGVmIENPTkZJR19GQl9FMTM1NQotCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKLQkJaWYgKChhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAidmlkZW89IikpID09IE5VTEwpIHsKLQkJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotCQkJc3RyY2F0KGFyZ3B0ciwgIiB2aWRlbz1lMTM1NWZiOmNydDE2aCIpOwotCQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERQotCQkvKiBvdmVycmlkZXMgUENJLUlERSAqLwotI2VuZGlmCi0JfQotCiAJLyogU0lPMCBEVFIgb24gKi8KIAlqbXIzOTI3X2lvY19yZWdfb3V0KDAsIEpNUjM5MjdfSU9DX0RUUl9BRERSKTsKIAogCWptcjM5MjdfbGVkX3NldCgwKTsKIAotCi0JaWYgKGptcjM5MjdfaGF2ZV9pc2FjKCkpCi0JCWptcjM5MjdfaW9fbGVkX3NldCgwKTsKIAlwcmludGsoIkpNUi1UWDM5MjcgKFJldiAlZCkgLS0tIElPQyhSZXYgJWQpIERJUFNXOiVkLCVkLCVkLCVkXG4iLAogCSAgICAgICBqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfQlJFVl9BRERSKSAmIEpNUjM5MjdfUkVWX01BU0ssCiAJICAgICAgIGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUikgJiBKTVIzOTI3X1JFVl9NQVNLLAogCSAgICAgICBqbXIzOTI3X2RpcHN3MSgpLCBqbXIzOTI3X2RpcHN3MigpLAogCSAgICAgICBqbXIzOTI3X2RpcHN3MygpLCBqbXIzOTI3X2RpcHN3NCgpKTsKLQlpZiAoam1yMzkyN19oYXZlX2lzYWMoKSkKLQkJcHJpbnRrKCJKTUktMzkyN0lPMiAtLS0gSVNBQyhSZXYgJWQpIERJUFNXOiUwMXhcbiIsCi0JCSAgICAgICBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19SRVZfQUREUikgJiBKTVIzOTI3X1JFVl9NQVNLLAotCQkgICAgICAgam1yMzkyN19pb19kaXBzdygpKTsKIH0KIAotdm9pZCBfX2luaXQgdHgzOTI3X3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgdHgzOTI3X3NldHVwKHZvaWQpCiB7CiAJaW50IGk7CisjaWZkZWYgQ09ORklHX1BDSQorCXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fYmFzZSA9IEpNUjM5MjdfUENJSU87CisJdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19zaXplID0gSk1SMzkyN19QQ0lJT19TSVpFOworCXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfbWVtX2Jhc2UgPSBKTVIzOTI3X1BDSU1FTTsKKwl1bnNpZ25lZCBsb25nIG1pcHNfcGNpX21lbV9zaXplID0gSk1SMzkyN19QQ0lNRU1fU0laRTsKKwkvKiBmb3IgbGVnYWN5IEkvTywgUENJIEkvTyBQQ0kgQnVzIGFkZHJlc3MgbXVzdCBiZSAwICovCisJdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19wY2lhZGRyID0gMDsKKyNlbmRpZgogCiAJLyogU0RSQU1DIGFyZSBjb25maWd1cmVkIGJ5IFBST00gKi8KIApAQCAtNDc1LDEwICszNjksOCBAQAogCQl0eDM5MjdfcGNpY3B0ci0+bWJhcyA9IH4obWlwc19wY2lfbWVtX3NpemUgLSAxKTsKIAkJdHgzOTI3X3BjaWNwdHItPm1iYSA9IDA7CiAJCXR4MzkyN19wY2ljcHRyLT50bGJtbWEgPSAwOwotI2lmbmRlZiBKTVIzOTI3X0lOSVRfSU5ESVJFQ1RfUENJCiAJCS8qIEVuYWJsZSBEaXJlY3QgbWFwcGluZyBBZGRyZXNzIFNwYWNlIERlY29kZXIgKi8KIAkJdHgzOTI3X3BjaWNwdHItPmxiYyB8PSBUWDM5MjdfUENJQ19MQkNfSUxNREUgfCBUWDM5MjdfUENJQ19MQkNfSUxJREU7Ci0jZW5kaWYKIAogCQkvKiBDbGVhciBBbGwgTG9jYWwgQnVzIFN0YXR1cyAqLwogCQl0eDM5MjdfcGNpY3B0ci0+bGJzdGF0ID0gVFgzOTI3X1BDSUNfTEJJTV9BTEw7CkBAIC00OTEsMjIgKzM4MywxNSBAQAogCiAJCS8qIFBDSUMgSW50ID0+IElSQyBJUlExMCAqLwogCQl0eDM5MjdfcGNpY3B0ci0+aWwgPSBUWDM5MjdfSVJfUENJOwotI2lmIDEKIAkJLyogVGFyZ2V0IENvbnRyb2wgKHBlciBlcnJhdGEpICovCiAJCXR4MzkyN19wY2ljcHRyLT50YyA9IFRYMzkyN19QQ0lDX1RDX09GOEUgfCBUWDM5MjdfUENJQ19UQ19JRjhFOwotI2VuZGlmCiAKIAkJLyogRW5hYmxlIEJ1cyBBcmJpdGVyICovCi0jaWYgMAotCQl0eDM5MjdfcGNpY3B0ci0+cmVxX3RyYWNlID0gMHg3MzczNzM3MzsKLSNlbmRpZgogCQl0eDM5MjdfcGNpY3B0ci0+cGJhcG1jID0gVFgzOTI3X1BDSUNfUEJBUE1DX1BCQUVOOwogCiAJCXR4MzkyN19wY2ljcHRyLT5wY2ljbWQgPSBQQ0lfQ09NTUFORF9NQVNURVIgfAogCQkJUENJX0NPTU1BTkRfTUVNT1JZIHwKLSNpZiAxCiAJCQlQQ0lfQ09NTUFORF9JTyB8Ci0jZW5kaWYKIAkJCVBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlI7CiAJfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KQEAgLTU1NSw4ICs0NDAsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKLQlpZiAoIWptcjM5MjdfaGF2ZV9udnJhbSgpKQotCQlyZXR1cm4gLUVOT0RFVjsKIAlkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkczE3NDIiLCAtMSwgJnJlcywgMSk7CiAJcmV0dXJuIElTX0VSUihkZXYpID8gUFRSX0VSUihkZXYpIDogMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAyMjJkZTQ2Li43NjFhNzc5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMDIsNyArMTAyLDYgQEAKIAlvZmZzZXQoIiNkZWZpbmUgVElfQUREUl9MSU1JVCAgICAgICIsIHN0cnVjdCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CiAJb2Zmc2V0KCIjZGVmaW5lIFRJX1JFU1RBUlRfQkxPQ0sgICAiLCBzdHJ1Y3QgdGhyZWFkX2luZm8sIHJlc3RhcnRfYmxvY2spOwogCW9mZnNldCgiI2RlZmluZSBUSV9SRUdTICAgICAgICAgICAgIiwgc3RydWN0IHRocmVhZF9pbmZvLCByZWdzKTsKLQljb25zdGFudCgiI2RlZmluZSBfVEhSRUFEX1NJWkVfT1JERVIgIiwgVEhSRUFEX1NJWkVfT1JERVIpOwogCWNvbnN0YW50KCIjZGVmaW5lIF9USFJFQURfU0laRSAgICAgICAiLCBUSFJFQURfU0laRSk7CiAJY29uc3RhbnQoIiNkZWZpbmUgX1RIUkVBRF9NQVNLICAgICAgICIsIFRIUkVBRF9NQVNLKTsKIAlsaW5lZmVlZDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwppbmRleCA5Yzc5NzAzLi4yMzQ1MTYwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCkBAIC0zMjgsOCArMzI4LDggQEAKIHsKIAlpbnQgaTsKIAotCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBpYzFfaW9fcmVzb3VyY2UpOwotCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBpYzJfaW9fcmVzb3VyY2UpOworCWluc2VydF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGljMV9pb19yZXNvdXJjZSk7CisJaW5zZXJ0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwaWMyX2lvX3Jlc291cmNlKTsKIAogCWluaXRfODI1OUEoMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jIGIvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKaW5kZXggMjllYWRkNC4uYzY1ODAwMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC0xOTgsNyArMTk5LDYgQEAKIAlpbnQgY21kOwogCiAJY2hhciAqdmN3ZDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwogCWludCBzaXplOwogCiAJcmV0LnJldHZhbCA9IC0xOwpAQCAtMjQxLDggKzI0MSw2IEBACiAgCQlpZiAoKHJldC5yZXR2YWwgPSBzcF9zeXNjYWxsKF9fTlJfZ2V0dGltZW9mZGF5LCAoaW50KSZ0diwKICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkmdHosIDAsMCkpID09IDApCiAJCXJldC5yZXR2YWwgPSB0di50dl9zZWM7Ci0KLQkJcmV0LmVycm5vID0gZXJybm87CiAJCWJyZWFrOwogCiAgCWNhc2UgTVRTUF9TWVNDQUxMX0VYSVQ6CkBAIC0yNzksNyArMjc3LDYgQEAKIAkJaWYgKGNtZCA+PSAwKSB7CiAJCQlyZXQucmV0dmFsID0gc3Bfc3lzY2FsbChjbWQsIGdlbmVyaWMuYXJnMCwgZ2VuZXJpYy5hcmcxLAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy5hcmcyLCBnZW5lcmljLmFyZzMpOwotCQkJcmV0LmVycm5vID0gZXJybm87CiAJCX0gZWxzZQogIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiS1NQRDogVW5rbm93biBTUCBzeXNjYWxsIG51bWJlciAlZFxuIiwgc2MuY21kKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKaW5kZXggZTZlMzA0Ny4uYmZjOGNhMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKQEAgLTI4OSw3ICsyODksNyBAQAogCXJldHVybiB3cml0ZV9zcGFjZWZyZWUoY2hhbi0+cnRfcmVhZCwgY2hhbi0+cnRfd3JpdGUsIGNoYW4tPmJ1ZmZlcl9zaXplKTsKIH0KIAotc3NpemVfdCBydGx4X3JlYWQoaW50IGluZGV4LCB2b2lkIF9fdXNlciAqYnVmZiwgc2l6ZV90IGNvdW50LCBpbnQgdXNlcikKK3NzaXplX3QgcnRseF9yZWFkKGludCBpbmRleCwgdm9pZCBfX3VzZXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzaXplX3QgbHhfd3JpdGUsIGZsID0gMEw7CiAJc3RydWN0IHJ0bHhfY2hhbm5lbCAqbHg7CkBAIC0zMzEsOSArMzMxLDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zc2l6ZV90IHJ0bHhfd3JpdGUoaW50IGluZGV4LCBjb25zdCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludCB1c2VyKQorc3NpemVfdCBydGx4X3dyaXRlKGludCBpbmRleCwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBydGx4X2NoYW5uZWwgKnJ0OworCXVuc2lnbmVkIGxvbmcgZmFpbGVkOwogCXNpemVfdCBydF9yZWFkOwogCXNpemVfdCBmbDsKIApAQCAtMzYzLDcgKzM2NCw3IEBACiAJfQogCiBvdXQ6Ci0JY291bnQgLT0gY2FpbGVkOworCWNvdW50IC09IGZhaWxlZDsKIAogCXNtcF93bWIoKTsKIAlydC0+cnRfd3JpdGUgPSAocnQtPnJ0X3dyaXRlICsgY291bnQpICUgcnQtPmJ1ZmZlcl9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvZGlzcGxheS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvZGlzcGxheS5jCmluZGV4IGY2NTM5NDYuLjU0OGRiZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL2Rpc3BsYXkuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9kaXNwbGF5LmMKQEAgLTI0LDE2ICsyNCwxNiBAQAogCiB2b2lkIG1pcHNfZGlzcGxheV9tZXNzYWdlKGNvbnN0IGNoYXIgKnN0cikKIHsKLQlzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpkaXNwbGF5ID0gTlVMTDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IF9faW9tZW0gKmRpc3BsYXkgPSBOVUxMOwogCWludCBpOwogCiAJaWYgKHVubGlrZWx5KGRpc3BsYXkgPT0gTlVMTCkpCi0JCWRpc3BsYXkgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopaW9yZW1hcChBU0NJSV9ESVNQTEFZX1BPU19CQVNFLCAxNipzaXplb2YoaW50KSk7CisJCWRpc3BsYXkgPSBpb3JlbWFwKEFTQ0lJX0RJU1BMQVlfUE9TX0JBU0UsIDE2KnNpemVvZihpbnQpKTsKIAogCWZvciAoaSA9IDA7IGkgPD0gMTQ7IGk9aSsyKSB7CiAJICAgICAgICAgaWYgKCpzdHIpCi0JCSAgICAgICAgIGRpc3BsYXlbaV0gPSAqc3RyKys7CisJCSAgICAgICAgIHdyaXRlbCgqc3RyKyssIGRpc3BsYXkgKyBpKTsKIAkJIGVsc2UKLQkJICAgICAgICAgZGlzcGxheVtpXSA9ICcgJzsKKwkJICAgICAgICAgd3JpdGVsKCcgJywgZGlzcGxheSArIGkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3BjaS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKaW5kZXggMzE5MmExNC4uZjk4ZDYwZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKQEAgLTY1LDcgKzY1LDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX29wcyBib25pdG82NF9wY2lfb3BzOwotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMjBfcGNpX29wczsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBndDY0eHh4X3BjaTBfb3BzOwogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIG1zY19wY2lfb3BzOwogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGJvbml0bzY0X2NvbnRyb2xsZXIgPSB7CkBAIC03Niw3ICs3Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGd0NjQxMjBfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9ICZndDY0MTIwX3BjaV9vcHMsCisJLnBjaV9vcHMJPSAmZ3Q2NHh4eF9wY2kwX29wcywKIAkuaW9fcmVzb3VyY2UJPSAmZ3Q2NDEyMF9pb19yZXNvdXJjZSwKIAkubWVtX3Jlc291cmNlCT0gJmd0NjQxMjBfbWVtX3Jlc291cmNlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3Jlc2V0LmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9yZXNldC5jCmluZGV4IDA5OTZiYTMuLjdhMWJiNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3Jlc2V0LmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcmVzZXQuYwpAQCAtMzksMjQgKzM5LDI0IEBACiAKIHN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqc29mdHJlc19yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcCAoU09GVFJFU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwl1bnNpZ25lZCBpbnQgX19pb21lbSAqc29mdHJlc19yZWcgPSBpb3JlbWFwKFNPRlRSRVNfUkVHLCBzaXplb2YodW5zaWduZWQgaW50KSk7CiAKLQkqc29mdHJlc19yZWcgPSBHT1JFU0VUOworCXdyaXRldyhHT1JFU0VULCBzb2Z0cmVzX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9oYWx0KHZvaWQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqc29mdHJlc19yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcCAoU09GVFJFU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IF9faW9tZW0gKnNvZnRyZXNfcmVnID0gaW9yZW1hcChTT0ZUUkVTX1JFRywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogCi0JKnNvZnRyZXNfcmVnID0gR09SRVNFVDsKKwl3cml0ZXcoR09SRVNFVCwgc29mdHJlc19yZWcpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTUlQU19BVExBUykKIHN0YXRpYyB2b2lkIGF0bGFzX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqcHN1c3RieV9yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcChBVExBU19QU1VTVEJZX1JFRywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCXVuc2lnbmVkIGludCBfX2lvbWVtICpwc3VzdGJ5X3JlZyA9IGlvcmVtYXAoQVRMQVNfUFNVU1RCWV9SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKIAotCSpwc3VzdGJ5X3JlZyA9IEFUTEFTX0dPU1RCWTsKKwl3cml0ZXcoQVRMQVNfR09TVEJZLCBwc3VzdGJ5X3JlZyk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jCmluZGV4IDNjMjA2YmIuLjgzZDc2MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfaW50LmMKQEAgLTQyLDggKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbXNjMDFfcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21zYzAxX2ljLmg+CiAKLWV4dGVybiB2b2lkIG1pcHNfdGltZXJfaW50ZXJydXB0KHZvaWQpOwotCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pcHNfaXJxX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIGludCBtaXBzX3BjaWJpb3NfaWFjayh2b2lkKQpAQCAtODUsNyArODMsNyBAQAogCQlkdW1teSA9IEJPTklUT19QQ0lNQVBfQ0ZHOwogCQlpb2IoKTsgICAgLyogc3luYyAqLwogCi0JCWlycSA9ICoodm9sYXRpbGUgdTMyICopKF9wY2ljdHJsX2Jvbml0b19wY2ljZmcpOworCQlpcnEgPSByZWFkbCgodTMyICopX3BjaWN0cmxfYm9uaXRvX3BjaWNmZyk7CiAJCWlvYigpOyAgICAvKiBzeW5jICovCiAJCWlycSAmPSAweGZmOwogCQlCT05JVE9fUENJTUFQX0NGRyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfc2V0dXAuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCmluZGV4IDU2ZWE3NjYuLjc4NzM5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCkBAIC0xNDUsNyArMTQ1LDggQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREUKIAkvKiBDaGVjayBQQ0kgY2xvY2sgKi8KIAl7Ci0JCWludCBqbXByID0gKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWlvcmVtYXAoTUFMVEFfSk1QUlNfUkVHLCBzaXplb2YodW5zaWduZWQgaW50KSkpID4+IDIpICYgMHgwNzsKKwkJdW5zaWduZWQgaW50IF9faW9tZW0gKmptcHJfcCA9ICh1bnNpZ25lZCBpbnQgKikgaW9yZW1hcChNQUxUQV9KTVBSU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwkJaW50IGptcHIgPSAocmVhZHcoam1wcl9wKSA+PiAyKSAmIDB4MDc7CiAJCXN0YXRpYyBjb25zdCBpbnQgcGNpY2xvY2tzW10gX19pbml0ZGF0YSA9IHsKIAkJCTMzLCAyMCwgMjUsIDMwLCAxMiwgMTYsIDM3LCAxMAogCQl9OwpAQCAtMTc5LDcgKzE4MCw2IEBACiAJfTsKICNlbmRpZgogI2VuZGlmCi0KIAltaXBzX3JlYm9vdF9zZXR1cCgpOwogCiAJYm9hcmRfdGltZV9pbml0ID0gbWlwc190aW1lX2luaXQ7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vY2FjaGUuYyBiL2FyY2gvbWlwcy9tbS9jYWNoZS5jCmluZGV4IDRlOGYxYjYuLmFiZjk5YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jCisrKyBiL2FyY2gvbWlwcy9tbS9jYWNoZS5jCkBAIC05Niw3ICs5Niw3IEBACiAKIAkJa2FkZHIgPSBrbWFwX2NvaGVyZW50KHBhZ2UsIHZtYWRkcik7CiAJCWZsdXNoX2RhdGFfY2FjaGVfcGFnZSgodW5zaWduZWQgbG9uZylrYWRkcik7Ci0JCWt1bm1hcF9jb2hlcmVudChrYWRkcik7CisJCWt1bm1hcF9jb2hlcmVudCgpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggZTk5NTFjMGUuLjJkMWMyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pbml0LmMKKysrIGIvYXJjaC9taXBzL21tL2luaXQuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKICNkZWZpbmUgVU5JUVVFX0VOVFJZSEkoaWR4KSAoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKQogCi12b2lkIGt1bm1hcF9jb2hlcmVudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3ZvaWQga3VubWFwX2NvaGVyZW50KHZvaWQpCiB7CiAjaWZuZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIAl1bnNpZ25lZCBpbnQgd2lyZWQ7CkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpZiAoY3B1X2hhc19kY19hbGlhc2VzKSB7CiAJCXZmcm9tID0ga21hcF9jb2hlcmVudChmcm9tLCB2YWRkcik7CiAJCWNvcHlfcGFnZSh2dG8sIHZmcm9tKTsKLQkJa3VubWFwX2NvaGVyZW50KGZyb20pOworCQlrdW5tYXBfY29oZXJlbnQoKTsKIAl9IGVsc2UgewogCQl2ZnJvbSA9IGttYXBfYXRvbWljKGZyb20sIEtNX1VTRVIwKTsKIAkJY29weV9wYWdlKHZ0bywgdmZyb20pOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykgewogCQl2b2lkICp2dG8gPSBrbWFwX2NvaGVyZW50KHBhZ2UsIHZhZGRyKSArICh2YWRkciAmIH5QQUdFX01BU0spOwogCQltZW1jcHkodnRvLCBzcmMsIGxlbik7Ci0JCWt1bm1hcF9jb2hlcmVudChwYWdlKTsKKwkJa3VubWFwX2NvaGVyZW50KCk7CiAJfSBlbHNlCiAJCW1lbWNweShkc3QsIHNyYywgbGVuKTsKIAlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSAmJiAhY3B1X2hhc19pY19maWxsc19mX2RjKQpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCXZvaWQgKnZmcm9tID0KIAkJCWttYXBfY29oZXJlbnQocGFnZSwgdmFkZHIpICsgKHZhZGRyICYgflBBR0VfTUFTSyk7CiAJCW1lbWNweShkc3QsIHZmcm9tLCBsZW4pOwotCQlrdW5tYXBfY29oZXJlbnQocGFnZSk7CisJCWt1bm1hcF9jb2hlcmVudCgpOwogCX0gZWxzZQogCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiB9CkBAIC0zNTEsMTggKzM1MSwxNSBAQAogI2VuZGlmCiAJa21hcF9jb2hlcmVudF9pbml0KCk7CiAKLSNpZmRlZiBDT05GSUdfSVNBCi0JaWYgKG1heF9sb3dfcGZuID49IE1BWF9ETUFfUEZOKQotCQlpZiAobWluX2xvd19wZm4gPj0gTUFYX0RNQV9QRk4pIHsKLQkJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gMDsKLQkJCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm4gLSBtaW5fbG93X3BmbjsKLQkJfSBlbHNlIHsKLQkJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gTUFYX0RNQV9QRk4gLSBtaW5fbG93X3BmbjsKLQkJCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm4gLSBNQVhfRE1BX1BGTjsKLQkJfQorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCWlmIChtaW5fbG93X3BmbiA8IE1BWF9ETUFfUEZOICYmIE1BWF9ETUFfUEZOIDw9IG1heF9sb3dfcGZuKSB7CisJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gTUFYX0RNQV9QRk4gLSBtaW5fbG93X3BmbjsKKwkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbiAtIE1BWF9ETUFfUEZOOworCX0gZWxzZSBpZiAobWF4X2xvd19wZm4gPCBNQVhfRE1BX1BGTikKKwkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfbG93X3BmbiAtIG1pbl9sb3dfcGZuOwogCWVsc2UKICNlbmRpZgotCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2xvd19wZm4gLSBtaW5fbG93X3BmbjsKKwl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuIC0gbWluX2xvd19wZm47CiAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuIC0gaGlnaHN0YXJ0X3BmbjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IGJmODU5OTUuLmRmNDg3YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtOCw4ICs4LDcgQEAKICMgUENJIGJ1cyBob3N0IGJyaWRnZSBzcGVjaWZpYyBjb2RlCiAjCiBvYmotJChDT05GSUdfTUlQU19CT05JVE82NCkJKz0gb3BzLWJvbml0bzY0Lm8KLW9iai0kKENPTkZJR19NSVBTX0dUNjQxMTEpCSs9IG9wcy1ndDY0MTExLm8KLW9iai0kKENPTkZJR19NSVBTX0dUNjQxMjApCSs9IG9wcy1ndDY0MTIwLm8KK29iai0kKENPTkZJR19QQ0lfR1Q2NFhYWF9QQ0kwKQkrPSBvcHMtZ3Q2NHh4eF9wY2kwLm8KIG9iai0kKENPTkZJR19QQ0lfTUFSVkVMTCkJKz0gb3BzLW1hcnZlbGwubwogb2JqLSQoQ09ORklHX01JUFNfTVNDKQkJKz0gb3BzLW1zYy5vCiBvYmotJChDT05GSUdfTUlQU19OSUxFNCkJKz0gb3BzLW5pbGU0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtam1yMzkyNy5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1qbXIzOTI3LmMKaW5kZXggNmU3MmQyMS4uNzNkMTg1MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1qbXIzOTI3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1qbXIzOTI3LmMKQEAgLTI5LDcgKzI5LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2ptcjM5Mjcvam1yMzkyNy5oPgpAQCAtODEsMTQgKzgwLDggQEAKIAogCS8qIENoZWNrIE9uQm9hcmQgRXRoZXJuZXQgKElEU0VMPUEyNCwgRGV2TnU9MTMpICovCiAJaWYgKGRldi0+YnVzLT5wYXJlbnQgPT0gTlVMTCAmJgotCSAgICBzbG90ID09IFRYMzkyN19QQ0lDX0lEU0VMX0FEX1RPX1NMT1QoMjQpKSB7Ci0JCWV4dGVybiBpbnQgam1yMzkyN19ldGhlcjFfaXJxOwotCQkvKiBjaGVjayB0aGlzIGlycSBsaW5lIHdhcyByZXNlcnZlZCBmb3IgZXRoZXIxICovCi0JCWlmIChqbXIzOTI3X2V0aGVyMV9pcnEgIT0gSk1SMzkyN19JUlFfRVRIRVIwKQotCQkJaXJxID0gSk1SMzkyN19JUlFfRVRIRVIwOwotCQllbHNlCi0JCQlpcnEgPSAwOwkvKiBkaXNhYmxlICovCi0JfQorCSAgICBzbG90ID09IFRYMzkyN19QQ0lDX0lEU0VMX0FEX1RPX1NMT1QoMjQpKQorCQlpcnEgPSBKTVIzOTI3X0lSUV9FVEhFUjA7CiAJcmV0dXJuIGlycTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NDExMS5jIGIvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NDExMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QzOTkxLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMTEuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAyMDAyIGJ5IFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIGJ5IExpYW0gRGF2aWVzIChsZGF2aWVzQGFnaWxlLnR2KQotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaD4KLQotLyoKLSAqIERldmljZSAzMSBvbiB0aGUgR1Q2NDExMSBpcyB1c2VkIHRvIGdlbmVyYXRlIFBDSSBzcGVjaWFsCi0gKiBjeWNsZXMsIHNvIHdlIHNob3VsZG4ndCBleHBlY3RlZCB0byBmaW5kIGEgZGV2aWNlIHRoZXJlIC4uLgotICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfcmFuZ2VfY2soc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuKQotewotCWlmIChidXMtPm51bWJlciA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA8IDMxKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBndDY0MTExX3BjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICogdmFsKQotewotCWlmIChwY2lfcmFuZ2VfY2soYnVzLCBkZXZmbikpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDQ6Ci0JCVBDSV9DRkdfU0VUKGRldmZuLCB3aGVyZSk7Ci0JCSp2YWwgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotCi0JY2FzZSAyOgotCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQkqdmFsID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKQotCQkgICAgPj4gKCh3aGVyZSAmIDMpICogOCk7Ci0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0KLQljYXNlIDE6Ci0JCVBDSV9DRkdfU0VUKGRldmZuLCAod2hlcmUgJiB+MHgzKSk7Ci0JCSp2YWwgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpCi0JCSAgICA+PiAoKHdoZXJlICYgMykgKiA4KTsKLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl9Ci0KLQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwotfQotCi1zdGF0aWMgaW50IGd0NjQxMTFfcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKLXsKLQl1MzIgdG1wOwotCi0JaWYgKHBjaV9yYW5nZV9jayhidXMsIGRldmZuKSkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCXN3aXRjaCAoc2l6ZSkgewotCWNhc2UgNDoKLQkJUENJX0NGR19TRVQoZGV2Zm4sIHdoZXJlKTsKLQkJR1RfV1JJVEUoR1RfUENJMF9DRkdEQVRBX09GUywgdmFsKTsKLQotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotCi0JY2FzZSAyOgotCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQl0bXAgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwotCQl0bXAgJj0gfigweGZmZmYgPDwgKCh3aGVyZSAmIDB4MykgKiA4KSk7Ci0JCXRtcCB8PSAodmFsIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwotCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCB0bXApOwotCi0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0KLQljYXNlIDE6Ci0JCVBDSV9DRkdfU0VUKGRldmZuLCAod2hlcmUgJiB+MHgzKSk7Ci0JCXRtcCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUyk7Ci0JCXRtcCAmPSB+KDB4ZmYgPDwgKCh3aGVyZSAmIDB4MykgKiA4KSk7Ci0JCXRtcCB8PSAodmFsIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwotCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCB0bXApOwotCi0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLX0KLQotc3RydWN0IHBjaV9vcHMgZ3Q2NDExMV9wY2lfb3BzID0gewotCS5yZWFkID0gZ3Q2NDExMV9wY2lfcmVhZF9jb25maWcsCi0JLndyaXRlID0gZ3Q2NDExMV9wY2lfd3JpdGVfY29uZmlnLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMjAuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjR4eHhfcGNpMC5jCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMjAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NHh4eF9wY2kwLmMKaW5kZXggNjMzNTg0NGQuLjNkODk2YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMjAuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1ndDY0eHh4X3BjaTAuYwpAQCAtMzksOCArMzksOCBAQAogI2RlZmluZSBQQ0lfQ0ZHX1RZUEUxX0RFVl9TSEYgICAgICAgICAgIDExCiAjZGVmaW5lIFBDSV9DRkdfVFlQRTFfQlVTX1NIRiAgICAgICAgICAgMTYKIAotc3RhdGljIGludCBndDY0MTIwX3BjaWJpb3NfY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLAotCXN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKiBkYXRhKQorc3RhdGljIGludCBndDY0eHh4X3BjaTBfcGNpYmlvc19jb25maWdfYWNjZXNzKHVuc2lnbmVkIGNoYXIgYWNjZXNzX3R5cGUsCisJCXN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKiBkYXRhKQogewogCXVuc2lnbmVkIGNoYXIgYnVzbnVtID0gYnVzLT5udW1iZXI7CiAJdTMyIGludHI7CkBAIC0xMDAsMTMgKzEwMCwxMyBAQAogICogV2UgY2FuJ3QgYWRkcmVzcyA4IGFuZCAxNiBiaXQgd29yZHMgZGlyZWN0bHkuICBJbnN0ZWFkIHdlIGhhdmUgdG8KICAqIHJlYWQvd3JpdGUgYSAzMmJpdCB3b3JkIGFuZCBtYXNrL21vZGlmeSB0aGUgZGF0YSB3ZSBhY3R1YWxseSB3YW50LgogICovCi1zdGF0aWMgaW50IGd0NjQxMjBfcGNpYmlvc19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICogdmFsKQorc3RhdGljIGludCBndDY0eHh4X3BjaTBfcGNpYmlvc19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICogdmFsKQogewogCXUzMiBkYXRhID0gMDsKIAotCWlmIChndDY0MTIwX3BjaWJpb3NfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLAotCQkJCSAgICAgICAgICAmZGF0YSkpCisJaWYgKGd0NjR4eHhfcGNpMF9wY2liaW9zX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAmZGF0YSkpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlpZiAoc2l6ZSA9PSAxKQpAQCAtMTE5LDE2ICsxMTksMTYgQEAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgaW50IGd0NjQxMjBfcGNpYmlvc193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQorc3RhdGljIGludCBndDY0eHh4X3BjaTBfcGNpYmlvc193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCiB7CiAJdTMyIGRhdGEgPSAwOwogCiAJaWYgKHNpemUgPT0gNCkKIAkJZGF0YSA9IHZhbDsKIAllbHNlIHsKLQkJaWYgKGd0NjQxMjBfcGNpYmlvc19jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAmZGF0YSkpCisJCWlmIChndDY0eHh4X3BjaTBfcGNpYmlvc19jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZmbiwgd2hlcmUsICZkYXRhKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAkJaWYgKHNpemUgPT0gMSkKQEAgLTEzOSwxNCArMTM5LDE0IEBACiAJCQkJKHZhbCA8PCAoKHdoZXJlICYgMykgPDwgMykpOwogCX0KIAotCWlmIChndDY0MTIwX3BjaWJpb3NfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwKLQkJCQkgICAgICAgJmRhdGEpKQorCWlmIChndDY0eHh4X3BjaTBfcGNpYmlvc19jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsICZkYXRhKSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAogCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXN0cnVjdCBwY2lfb3BzIGd0NjQxMjBfcGNpX29wcyA9IHsKLQkucmVhZCA9IGd0NjQxMjBfcGNpYmlvc19yZWFkLAotCS53cml0ZSA9IGd0NjQxMjBfcGNpYmlvc193cml0ZQorc3RydWN0IHBjaV9vcHMgZ3Q2NHh4eF9wY2kwX29wcyA9IHsKKwkucmVhZAk9IGd0NjR4eHhfcGNpMF9wY2liaW9zX3JlYWQsCisJLndyaXRlCT0gZ3Q2NHh4eF9wY2kwX3BjaWJpb3Nfd3JpdGUKIH07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy10eDM5MjcuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLXR4MzkyNy5jCmluZGV4IDQyNTMwYTAuLmFhNjk4YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLXR4MzkyNy5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLXR4MzkyNy5jCkBAIC00MCw3ICs0MCw2IEBACiAKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2ptcjM5Mjcvam1yMzkyNy5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogCiBzdGF0aWMgaW5saW5lIGludCBta2FkZHIodW5zaWduZWQgY2hhciBidXMsIHVuc2lnbmVkIGNoYXIgZGV2X2ZuLAogCXVuc2lnbmVkIGNoYXIgd2hlcmUpCkBAIC0xMzAsMjM0ICsxMjksMyBAQAogCWptcjM5MjdfcGNpX3JlYWRfY29uZmlnLAogCWptcjM5MjdfcGNpX3dyaXRlX2NvbmZpZywKIH07Ci0KLQotI2lmbmRlZiBKTVIzOTI3X0lOSVRfSU5ESVJFQ1RfUENJCi0KLWlubGluZSB1bnNpZ25lZCBsb25nIHRjX3JlYWRsKHZvbGF0aWxlIF9fdTMyICogYWRkcikKLXsKLQlyZXR1cm4gcmVhZGwoYWRkcik7Ci19Ci0KLWlubGluZSB2b2lkIHRjX3dyaXRlbCh1bnNpZ25lZCBsb25nIGRhdGEsIHZvbGF0aWxlIF9fdTMyICogYWRkcikKLXsKLQl3cml0ZWwoZGF0YSwgYWRkcik7Ci19Ci0jZWxzZQotCi11bnNpZ25lZCBsb25nIHRjX3JlYWRsKHZvbGF0aWxlIF9fdTMyICogYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBDUEhZU0FERFIoYWRkcik7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfTUVNUkVBRCA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwKLQkgICAgUENJX0lQQ0lCRV9JQkVfTE9ORzsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQl2YWwgPQotCSAgICBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+Ci0JCQlpcGNpZGF0YSk7Ci0JLyogY2xlYXIgYnkgc2V0dGluZyAqLwotCXR4MzkyN19wY2ljcHRyLT5pc3RhdCB8PSBQQ0lfSVNUQVRfSURJQ0M7Ci0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCB0Y193cml0ZWwodW5zaWduZWQgbG9uZyBkYXRhLCB2b2xhdGlsZSBfX3UzMiAqIGFkZHIpCi17Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lkYXRhID0KLQkgICAgY3B1X3RvX2xlMzIoZGF0YSk7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lhZGRyID0KLQkgICAgKHVuc2lnbmVkIGxvbmcpIENQSFlTQUREUihhZGRyKTsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWJlID0KLQkgICAgKFBDSV9JUENJQkVfSUNNRF9NRU1XUklURSA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwKLQkgICAgUENJX0lQQ0lCRV9JQkVfTE9ORzsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLX0KLQotdW5zaWduZWQgY2hhciB0eF9pb2luYih1bnNpZ25lZCBjaGFyICphZGRyKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCV9fdTMyIGlvYWRkcjsKLQlpbnQgb2Zmc2V0OwotCWludCBieXRlOwotCi0JaW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0Jb2Zmc2V0ID0gaW9hZGRyICYgMHgzOwotCWJ5dGUgPSAweGYgJiB+KDggPj4gb2Zmc2V0KTsKLQotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfSU9SRUFEIDw8IFBDSV9JUENJQkVfSUNNRF9TSElGVCkgfCBieXRlOwotCXdoaWxlICghKHR4MzkyN19wY2ljcHRyLT5pc3RhdCAmIFBDSV9JU1RBVF9JRElDQykpOwotCXZhbCA9Ci0JICAgIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT4KLQkJCWlwY2lkYXRhKTsKLQl2YWwgPSB2YWwgJiAweGZmOwotCS8qIGNsZWFyIGJ5IHNldHRpbmcgKi8KLQl0eDM5MjdfcGNpY3B0ci0+aXN0YXQgfD0gUENJX0lTVEFUX0lESUNDOwotCXJldHVybiB2YWw7Ci19Ci0KLXZvaWQgdHhfaW9vdXRiKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgY2hhciAqYWRkcikKLXsKLQlfX3UzMiBpb2FkZHI7Ci0JaW50IG9mZnNldDsKLQlpbnQgYnl0ZTsKLQotCWRhdGEgPSBkYXRhIHwgKGRhdGEgPDwgOCkgfCAoZGF0YSA8PCAxNikgfCAoZGF0YSA8PCAyNCk7Ci0JaW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0Jb2Zmc2V0ID0gaW9hZGRyICYgMHgzOwotCWJ5dGUgPSAweGYgJiB+KDggPj4gb2Zmc2V0KTsKLQotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpZGF0YSA9IGRhdGE7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lhZGRyID0KLQkgICAgKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWJlID0KLQkgICAgKFBDSV9JUENJQkVfSUNNRF9JT1dSSVRFIDw8IFBDSV9JUENJQkVfSUNNRF9TSElGVCkgfCBieXRlOwotCXdoaWxlICghKHR4MzkyN19wY2ljcHRyLT5pc3RhdCAmIFBDSV9JU1RBVF9JRElDQykpOwotCS8qIGNsZWFyIGJ5IHNldHRpbmcgKi8KLQl0eDM5MjdfcGNpY3B0ci0+aXN0YXQgfD0gUENJX0lTVEFUX0lESUNDOwotfQotCi11bnNpZ25lZCBzaG9ydCB0eF9pb2ludyh1bnNpZ25lZCBzaG9ydCAqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlfX3UzMiBpb2FkZHI7Ci0JaW50IG9mZnNldDsKLQlpbnQgYnl0ZTsKLQotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCW9mZnNldCA9IGlvYWRkciAmIDB4MjsKLQlieXRlID0gMyA8PCBvZmZzZXQ7Ci0KLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWFkZHIgPQotCSAgICAodW5zaWduZWQgbG9uZykgaW9hZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYmUgPQotCSAgICAoUENJX0lQQ0lCRV9JQ01EX0lPUkVBRCA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwgYnl0ZTsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQl2YWwgPQotCSAgICBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+Ci0JCQlpcGNpZGF0YSk7Ci0JdmFsID0gdmFsICYgMHhmZmZmOwotCS8qIGNsZWFyIGJ5IHNldHRpbmcgKi8KLQl0eDM5MjdfcGNpY3B0ci0+aXN0YXQgfD0gUENJX0lTVEFUX0lESUNDOwotCXJldHVybiB2YWw7Ci0KLX0KLQotdm9pZCB0eF9pb291dHcodW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBzaG9ydCAqYWRkcikKLXsKLQlfX3UzMiBpb2FkZHI7Ci0JaW50IG9mZnNldDsKLQlpbnQgYnl0ZTsKLQotCWRhdGEgPSBkYXRhIHwgKGRhdGEgPDwgMTYpOwotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCW9mZnNldCA9IGlvYWRkciAmIDB4MjsKLQlieXRlID0gMyA8PCBvZmZzZXQ7Ci0KLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWRhdGEgPSBkYXRhOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfSU9XUklURSA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwgYnl0ZTsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLX0KLQotdW5zaWduZWQgbG9uZyB0eF9pb2lubCh1bnNpZ25lZCBpbnQgKmFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JX191MzIgaW9hZGRyOwotCi0JaW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lhZGRyID0KLQkgICAgKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWJlID0KLQkgICAgKFBDSV9JUENJQkVfSUNNRF9JT1JFQUQgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8Ci0JICAgIFBDSV9JUENJQkVfSUJFX0xPTkc7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JdmFsID0KLQkgICAgbGUzMl90b19jcHUoKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPgotCQkJaXBjaWRhdGEpOwotCS8qIGNsZWFyIGJ5IHNldHRpbmcgKi8KLQl0eDM5MjdfcGNpY3B0ci0+aXN0YXQgfD0gUENJX0lTVEFUX0lESUNDOwotCXJldHVybiB2YWw7Ci19Ci0KLXZvaWQgdHhfaW9vdXRsKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgaW50ICphZGRyKQotewotCV9fdTMyIGlvYWRkcjsKLQotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpZGF0YSA9Ci0JICAgIGNwdV90b19sZTMyKGRhdGEpOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfSU9XUklURSA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwKLQkgICAgUENJX0lQQ0lCRV9JQkVfTE9ORzsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLX0KLQotdm9pZCB0eF9pbnNieXRlKHVuc2lnbmVkIGNoYXIgKmFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotCXdoaWxlIChjb3VudC0tKSB7Ci0JCSpwdHIrKyA9IHR4X2lvaW5iKGFkZHIpOwotCX0KLX0KLQotdm9pZCB0eF9pbnN3b3JkKHVuc2lnbmVkIHNob3J0ICphZGRyLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBzaG9ydCAqcHRyID0gKHVuc2lnbmVkIHNob3J0ICopIGJ1ZmZlcjsKLQotCXdoaWxlIChjb3VudC0tKSB7Ci0JCSpwdHIrKyA9IHR4X2lvaW53KGFkZHIpOwotCX0KLX0KLQotdm9pZCB0eF9pbnNsb25nKHVuc2lnbmVkIGludCAqYWRkciwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyAqcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmZmVyOwotCi0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJKnB0cisrID0gdHhfaW9pbmwoYWRkcik7Ci0JfQotfQotCi12b2lkIHR4X291dHNieXRlKHVuc2lnbmVkIGNoYXIgKmFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotCXdoaWxlIChjb3VudC0tKSB7Ci0JCXR4X2lvb3V0YigqcHRyKyssIGFkZHIpOwotCX0KLX0KLQotdm9pZCB0eF9vdXRzd29yZCh1bnNpZ25lZCBzaG9ydCAqYWRkciwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgc2hvcnQgKnB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQl0eF9pb291dHcoKnB0cisrLCBhZGRyKTsKLQl9Ci19Ci0KLXZvaWQgdHhfb3V0c2xvbmcodW5zaWduZWQgaW50ICphZGRyLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nICpwdHIgPSAodW5zaWduZWQgbG9uZyAqKSBidWZmZXI7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQl0eF9pb291dGwoKnB0cisrLCBhZGRyKTsKLQl9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWxhc2F0LmMgYi9hcmNoL21pcHMvcGNpL3BjaS1sYXNhdC5jCmluZGV4IDg4ZmIxOTEuLjk4NTc4NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWxhc2F0LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktbGFzYXQuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogCiBleHRlcm4gc3RydWN0IHBjaV9vcHMgbmlsZTRfcGNpX29wczsKLWV4dGVybiBzdHJ1Y3QgcGNpX29wcyBndDY0MTIwX3BjaV9vcHM7CitleHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q2NHh4eF9wY2kwX29wczsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbGFzYXRfcGNpX21lbV9yZXNvdXJjZSA9IHsKIAkubmFtZQk9ICJMQVNBVCBQQ0kgTUVNIiwKIAkuc3RhcnQJPSAweDE4MDAwMDAwLApAQCAtMzgsNyArMzgsNyBAQAogCiAJc3dpdGNoIChtaXBzX21hY2h0eXBlKSB7CiAJY2FzZSBNQUNIX0xBU0FUXzEwMDoKLSAgICAgICAgICAgICAgICBsYXNhdF9wY2lfY29udHJvbGxlci5wY2lfb3BzID0gJmd0NjQxMjBfcGNpX29wczsKKyAgICAgICAgICAgICAgICBsYXNhdF9wY2lfY29udHJvbGxlci5wY2lfb3BzID0gJmd0NjR4eHhfcGNpMF9vcHM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSBNQUNIX0xBU0FUXzIwMDoKICAgICAgICAgICAgICAgICBsYXNhdF9wY2lfY29udHJvbGxlci5wY2lfb3BzID0gJm5pbGU0X3BjaV9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1vY2Vsb3QuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLW9jZWxvdC5jCmluZGV4IDJiOTQ5NWQuLjdmOTRmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLW9jZWxvdC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLW9jZWxvdC5jCkBAIC04MSw3ICs4MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIG9jZWxvdF9wY2lfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9IGd0NjQxMjBfcGNpX29wczsKKwkucGNpX29wcwk9IGd0NjR4eHhfcGNpMF9vcHM7CiAJLm1lbV9yZXNvdXJjZQk9ICZvY2Vsb3RfbWVtX3Jlc291cmNlOwogCS5pb19yZXNvdXJjZQk9ICZvY2Vsb3RfaW9fcmVzb3VyY2U7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2kuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKaW5kZXggZGU3Y2ZjNS4uODEwODIzMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2kuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS5jCkBAIC03Nyw2ICs3NywxMyBAQAogCiB2b2lkIF9faW5pdCByZWdpc3Rlcl9wY2lfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CisJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCBob3NlLT5tZW1fcmVzb3VyY2UpIDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgaG9zZS0+aW9fcmVzb3VyY2UpIDwgMCkgeworCQlyZWxlYXNlX3Jlc291cmNlKGhvc2UtPm1lbV9yZXNvdXJjZSk7CisJCWdvdG8gb3V0OworCX0KKwogCSpob3NlX3RhaWwgPSBob3NlOwogCWhvc2VfdGFpbCA9ICZob3NlLT5uZXh0OwogCkBAIC04Nyw2ICs5NCwxMSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAicmVnaXN0ZXJpbmcgUENJIGNvbnRyb2xsZXIgd2l0aCBpb19tYXBfYmFzZSB1bnNldFxuIik7CiAJfQorCXJldHVybjsKKworb3V0OgorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIlNraXBwaW5nIFBDSSBidXMgc2NhbiBkdWUgdG8gcmVzb3VyY2UgY29uZmxpY3RcbiIpOwogfQogCiAvKiBNb3N0IE1JUFMgc3lzdGVtcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KQEAgLTEyMSwxMSArMTMzLDYgQEAKIAkvKiBTY2FuIGFsbCBvZiB0aGUgcmVjb3JkZWQgUENJIGNvbnRyb2xsZXJzLiAgKi8KIAlmb3IgKG5leHRfYnVzbm8gPSAwLCBob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgewogCi0JCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgaG9zZS0+bWVtX3Jlc291cmNlKSA8IDApCi0JCQlnb3RvIG91dDsKLQkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgaG9zZS0+aW9fcmVzb3VyY2UpIDwgMCkKLQkJCWdvdG8gb3V0X2ZyZWVfbWVtX3Jlc291cmNlOwotCiAJCWlmICghaG9zZS0+aW9tbXUpCiAJCQlQQ0lfRE1BX0JVU19JU19QSFlTID0gMTsKIApAQCAtMTQ0LDE0ICsxNTEsNiBAQAogCQkJCW5lZWRfZG9tYWluX2luZm8gPSAxOwogCQkJfQogCQl9Ci0JCWNvbnRpbnVlOwotCi1vdXRfZnJlZV9tZW1fcmVzb3VyY2U6Ci0JCXJlbGVhc2VfcmVzb3VyY2UoaG9zZS0+bWVtX3Jlc291cmNlKTsKLQotb3V0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiU2tpcHBpbmcgUENJIGJ1cyBzY2FuIGR1ZSB0byByZXNvdXJjZSBjb25mbGljdFxuIik7CiAJfQogCiAJaWYgKCFwY2lfcHJvYmVfb25seSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLW52cmFtLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1udnJhbS5jCmluZGV4IGZkMjlmZDQuLmUxOWQ2MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLW52cmFtLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItbnZyYW0uYwpAQCAtNTIsOCArNTIsNyBAQAogICogbmF0aW9uYWwgc2VtaWNvbmR1Y3RvciBudiByYW0gY2hpcCB0aGUgb3AgY29kZSBpcyAzIGJpdHMgYW5kCiAgKiB0aGUgYWRkcmVzcyBpcyA2LzggYml0cy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV9jbWQodm9sYXRpbGUgdW5zaWduZWQgaW50ICpjdHJsLCB1bnNpZ25lZCBjbWQsCi0JCQkgICAgICB1bnNpZ25lZCByZWcpCitzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NtZCh1bnNpZ25lZCBpbnQgKmN0cmwsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgcmVnKQogewogCXVuc2lnbmVkIHNob3J0IHNlcl9jbWQ7CiAJaW50IGk7CkBAIC02MSwzMyArNjAsMzQgQEAKIAlzZXJfY21kID0gY21kIHwgKHJlZyA8PCAoMTYgLSBCSVRTX0lOX0NPTU1BTkQpKTsKIAlmb3IgKGkgPSAwOyBpIDwgQklUU19JTl9DT01NQU5EOyBpKyspIHsKIAkJaWYgKHNlcl9jbWQgJiAoMTw8MTUpKQkvKiBpZiBoaWdoIG9yZGVyIGJpdCBzZXQgKi8KLQkJCSpjdHJsIHw9IEVFUFJPTV9EQVRPOworCQkJd3JpdGVsKHJlYWRsKGN0cmwpIHwgRUVQUk9NX0RBVE8sIGN0cmwpOwogCQllbHNlCi0JCQkqY3RybCAmPSB+RUVQUk9NX0RBVE87Ci0JCSpjdHJsICY9IH5FRVBST01fRUNMSzsKLQkJKmN0cmwgfD0gRUVQUk9NX0VDTEs7CisJCQl3cml0ZWwocmVhZGwoY3RybCkgJiB+RUVQUk9NX0RBVE8sIGN0cmwpOworCQl3cml0ZWwocmVhZGwoY3RybCkgJiB+RUVQUk9NX0VDTEssIGN0cmwpOworCQl3cml0ZWwocmVhZGwoY3RybCkgfCBFRVBST01fRUNMSywgY3RybCk7CiAJCXNlcl9jbWQgPDw9IDE7CiAJfQotCSpjdHJsICY9IH5FRVBST01fREFUTzsJLyogc2VlIGRhdGEgc2hlZXQgdGltaW5nIGRpYWdyYW0gKi8KKwkvKiBzZWUgZGF0YSBzaGVldCB0aW1pbmcgZGlhZ3JhbSAqLworCXdyaXRlbChyZWFkbChjdHJsKSAmIH5FRVBST01fREFUTywgY3RybCk7CiB9CiAKLXVuc2lnbmVkIHNob3J0IGlwMjJfZWVwcm9tX3JlYWQodm9sYXRpbGUgdW5zaWduZWQgaW50ICpjdHJsLCBpbnQgcmVnKQordW5zaWduZWQgc2hvcnQgaXAyMl9lZXByb21fcmVhZCh1bnNpZ25lZCBpbnQgKmN0cmwsIGludCByZWcpCiB7CiAJdW5zaWduZWQgc2hvcnQgcmVzID0gMDsKIAlpbnQgaTsKIAotCSpjdHJsICY9IH5FRVBST01fRVBST1Q7CisJd3JpdGVsKHJlYWRsKGN0cmwpICYgfkVFUFJPTV9FUFJPVCwgY3RybCk7CiAJZWVwcm9tX2NzX29uKGN0cmwpOwogCWVlcHJvbV9jbWQoY3RybCwgRUVQUk9NX1JFQUQsIHJlZyk7CiAKIAkvKiBjbG9jayB0aGUgZGF0YSBvdWYgb2Ygc2VyaWFsIG1lbSAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCSpjdHJsICY9IH5FRVBST01fRUNMSzsKKwkJd3JpdGVsKHJlYWRsKGN0cmwpICYgfkVFUFJPTV9FQ0xLLCBjdHJsKTsKIAkJZGVsYXkoKTsKLQkJKmN0cmwgfD0gRUVQUk9NX0VDTEs7CisJCXdyaXRlbChyZWFkbChjdHJsKSB8IEVFUFJPTV9FQ0xLLCBjdHJsKTsKIAkJZGVsYXkoKTsKIAkJcmVzIDw8PSAxOwotCQlpZiAoKmN0cmwgJiBFRVBST01fREFUSSkKKwkJaWYgKHJlYWRsKGN0cmwpICYgRUVQUk9NX0RBVEkpCiAJCQlyZXMgfD0gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYwppbmRleCAyMDU1NTQ3Li44ZTg4YTQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCkBAIC05NCw3ICs5NCw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkb3NhbXBsZSh2b2lkKQogewogCXUzMiBjdDAsIGN0MTsKLQl2b2xhdGlsZSB1OCBtc2IsIGxzYjsKKwl1OCBtc2IsIGxzYjsKIAogCS8qIFN0YXJ0IHRoZSBjb3VudGVyLiAqLwogCXNnaW50LT50Y3dvcmQgPSAoU0dJTlRfVENXT1JEX0NOVDIgfCBTR0lOVF9UQ1dPUkRfQ0FMTCB8CkBAIC0xMDcsMjEgKzEwNywyMSBAQAogCiAJLyogTGF0Y2ggYW5kIHNwaW4gdW50aWwgdG9wIGJ5dGUgb2YgY291bnRlcjIgaXMgemVybyAqLwogCWRvIHsKLQkJc2dpbnQtPnRjd29yZCA9IFNHSU5UX1RDV09SRF9DTlQyIHwgU0dJTlRfVENXT1JEX0NMQVQ7Ci0JCWxzYiA9IHNnaW50LT50Y250MjsKLQkJbXNiID0gc2dpbnQtPnRjbnQyOworCQl3cml0ZWIoU0dJTlRfVENXT1JEX0NOVDIgfCBTR0lOVF9UQ1dPUkRfQ0xBVCwgJnNnaW50LT50Y3dvcmQpOworCQlsc2IgPSByZWFkYigmc2dpbnQtPnRjbnQyKTsKKwkJbXNiID0gcmVhZGIoJnNnaW50LT50Y250Mik7CiAJCWN0MSA9IHJlYWRfYzBfY291bnQoKTsKIAl9IHdoaWxlIChtc2IpOwogCiAJLyogU3RvcCB0aGUgY291bnRlci4gKi8KLQlzZ2ludC0+dGN3b3JkID0gKFNHSU5UX1RDV09SRF9DTlQyIHwgU0dJTlRfVENXT1JEX0NBTEwgfAotCQkJIFNHSU5UX1RDV09SRF9NU1dTVCk7CisJd3JpdGViKHNnaW50LT50Y3dvcmQsIChTR0lOVF9UQ1dPUkRfQ05UMiB8IFNHSU5UX1RDV09SRF9DQUxMIHwKKwkJCSAgICAgICBTR0lOVF9UQ1dPUkRfTVNXU1QpKTsKIAkvKgogCSAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSwgdGhpcyBpcyBob3cgZmFyIHRoZSByNGsgY291bnRlciBpbmNyZW1lbnRzCiAJICogZm9yIGV2ZXJ5IDEvSFogc2Vjb25kcy4gV2Ugcm91bmQgb2ZmIHRoZSBuZWFyZXN0IDEgTUh6IG9mIG1hc3RlcgogCSAqIGNsb2NrICg9IDEwMDAwMDAgLyBIWiAvIDIpLgogCSAqLwotCS8qcmV0dXJuIChjdDEgLSBjdDAgKyAoNTAwMDAwL0haLzIpKSAvICg1MDAwMDAvSFopICogKDUwMDAwMC9IWik7Ki8KKwogCXJldHVybiAoY3QxIC0gY3QwKSAvICg1MDAwMDAvSFopICogKDUwMDAwMC9IWik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvS2NvbmZpZyBiL2FyY2gvbWlwcy9zaWJ5dGUvS2NvbmZpZwppbmRleCBiZGYyNGE3Li5lNmIwMDNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL0tjb25maWcKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCWJvb2wKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTSUJZVEVfRU5BQkxFX0xEVF9JRl9QQ0kKKwlzZWxlY3QgU0lCWVRFX0hBU19aQlVTX1BST0ZJTElORwogCXNlbGVjdCBTSUJZVEVfU0IxeHh4X1NPQwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCiAKQEAgLTM0LDYgKzM1LDcgQEAKIGNvbmZpZyBTSUJZVEVfQkNNMXg4MAogCWJvb2wKIAlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBTSUJZVEVfSEFTX1pCVVNfUFJPRklMSU5HCiAJc2VsZWN0IFNJQllURV9TQjF4eHhfU09DCiAJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vTWFrZWZpbGUgYi9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA2YTRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmoteSA6PQorCitvYmotJChDT05GSUdfU0lCWVRFX1RCUFJPRikJCSs9IHNiX3RicHJvZi5vCisKK0VYVFJBX0FGTEFHUyA6PSAkKENGTEFHUykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2JjbTEyNTBfdGJwcm9mLmMgYi9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYwpzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jCnJlbmFtZSB0byBhcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYwppbmRleCBlYTBjYTEzLi40ZmNkYWE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL3NiX3RicHJvZi5jCkBAIC0zMSwxNCArMzEsMjkgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKyNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYmNtMTQ4MF9zY2QuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfaW50Lmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CisjZWxzZQorI2Vycm9yIGludmFsaWQgU2lCeXRlIFVBUlQgY29uZmlndWF0aW9uCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKyN1bmRlZiBLX0lOVF9UUkFDRV9GUkVFWkUKKyNkZWZpbmUgS19JTlRfVFJBQ0VfRlJFRVpFIEtfQkNNMTQ4MF9JTlRfVFJBQ0VfRlJFRVpFCisjdW5kZWYgS19JTlRfUEVSRl9DTlQKKyNkZWZpbmUgS19JTlRfUEVSRl9DTlQgS19CQ00xNDgwX0lOVF9QRVJGX0NOVAorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMTE4LDcgKzEzMyw3IEBACiAJCQk6IC8qIGlucHV0cyAqLyBcCiAJCQk6IC8qIG1vZGlmaWVzICovICIkOCIgKQogCi0jZGVmaW5lIERFVk5BTUUgImJjbTEyNTBfdGJwcm9mIgorI2RlZmluZSBERVZOQU1FICJzYl90YnByb2YiCiAKICNkZWZpbmUgVEJfRlVMTCAoc2JwLm5leHRfdGJfc2FtcGxlID09IE1BWF9UQl9TQU1QTEVTKQogCkBAIC0xMzIsNiArMTQ3LDcgQEAKICAqIG92ZXJmbG93LgogICoKICAqIFdlIG1hcCB0aGUgaW50ZXJydXB0IGZvciB0cmFjZV9idWZmZXJfZnJlZXplIHRvIGhhbmRsZSBpdCBvbiBDUFUgMC4KKyAqCiAgKi8KIAogc3RhdGljIHU2NCB0Yl9wZXJpb2Q7CkBAIC0xNDMsMjUgKzE1OSwzNiBAQAogCXU2NCB0Yl9vcHRpb25zID0gTV9TQ0RfVFJBQ0VfQ0ZHX0ZSRUVaRV9GVUxMOwogCiAJLyoKLQkgKiBHZW5lcmF0ZSBhbiBTQ0RfUEVSRkNOVCBpbnRlcnJ1cHQgaW4gVEJfUEVSSU9EIFpjbGtzIHRvIHRyaWdnZXIKLQkgKnN0YXJ0IG9mIHRyYWNlLiAgWFhYIHZhcnkgc2FtcGxpbmcgcGVyaW9kCisJICogR2VuZXJhdGUgYW4gU0NEX1BFUkZDTlQgaW50ZXJydXB0IGluIFRCX1BFUklPRCBaY2xrcyB0bworCSAqIHRyaWdnZXIgc3RhcnQgb2YgdHJhY2UuICBYWFggdmFyeSBzYW1wbGluZyBwZXJpb2QKIAkgKi8KIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfU0NEX1BFUkZfQ05UXzEpKTsKIAlzY2RwZXJmY250ID0gX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1BFUkZfQ05UX0NGRykpOwogCiAJLyoKLQkgKiBVbmZvcnR1bmF0ZWx5LCBpbiBQYXNzIDIgd2UgbXVzdCBjbGVhciBhbGwgY291bnRlcnMgdG8ga25vY2sgZG93biBhCi0JICogcHJldmlvdXMgaW50ZXJydXB0IHJlcXVlc3QuICBUaGlzIG1lYW5zIHRoYXQgYnVzIHByb2ZpbGluZyByZXF1aXJlcwotCSAqIEFMTCBvZiB0aGUgU0NEIHBlcmYgY291bnRlcnMuCisJICogVW5mb3J0dW5hdGVseSwgaW4gUGFzcyAyIHdlIG11c3QgY2xlYXIgYWxsIGNvdW50ZXJzIHRvIGtub2NrIGRvd24KKwkgKiBhIHByZXZpb3VzIGludGVycnVwdCByZXF1ZXN0LiAgVGhpcyBtZWFucyB0aGF0IGJ1cyBwcm9maWxpbmcKKwkgKiByZXF1aXJlcyBBTEwgb2YgdGhlIFNDRCBwZXJmIGNvdW50ZXJzLgogCSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKwlfX3Jhd193cml0ZXEoKHNjZHBlcmZjbnQgJiB+TV9TUENfQ0ZHX1NSQzEpIHwKKwkJCQkJCS8qIGtlZXAgY291bnRlcnMgMCwyLDMsNCw1LDYsNyBhcyBpcyAqLworCQkgICAgIFZfU1BDX0NGR19TUkMxKDEpLAkJLyogY291bnRlciAxIGNvdW50cyBjeWNsZXMgKi8KKwkJICAgICBJT0FERFIoQV9CQ00xNDgwX1NDRF9QRVJGX0NOVF9DRkcwKSk7CisJX19yYXdfd3JpdGVxKAorCQkgICAgIE1fU1BDX0NGR19FTkFCTEUgfAkJLyogZW5hYmxlIGNvdW50aW5nICovCisJCSAgICAgTV9TUENfQ0ZHX0NMRUFSIHwJCS8qIGNsZWFyIGFsbCBjb3VudGVycyAqLworCQkgICAgIFZfU1BDX0NGR19TUkMxKDEpLAkJLyogY291bnRlciAxIGNvdW50cyBjeWNsZXMgKi8KKwkJICAgICBJT0FERFIoQV9CQ00xNDgwX1NDRF9QRVJGX0NOVF9DRkcxKSk7CisjZWxzZQogCV9fcmF3X3dyaXRlcSgoc2NkcGVyZmNudCAmIH5NX1NQQ19DRkdfU1JDMSkgfAogCQkJCQkJLyoga2VlcCBjb3VudGVycyAwLDIsMyBhcyBpcyAqLwogCQkgICAgIE1fU1BDX0NGR19FTkFCTEUgfAkJLyogZW5hYmxlIGNvdW50aW5nICovCiAJCSAgICAgTV9TUENfQ0ZHX0NMRUFSIHwJCS8qIGNsZWFyIGFsbCBjb3VudGVycyAqLwogCQkgICAgIFZfU1BDX0NGR19TUkMxKDEpLAkJLyogY291bnRlciAxIGNvdW50cyBjeWNsZXMgKi8KIAkJICAgICBJT0FERFIoQV9TQ0RfUEVSRl9DTlRfQ0ZHKSk7CisjZW5kaWYKIAlfX3Jhd193cml0ZXEobmV4dCwgSU9BRERSKEFfU0NEX1BFUkZfQ05UXzEpKTsKLQogCS8qIFJlc2V0IHRoZSB0cmFjZSBidWZmZXIgKi8KIAlfX3Jhd193cml0ZXEoTV9TQ0RfVFJBQ0VfQ0ZHX1JFU0VULCBJT0FERFIoQV9TQ0RfVFJBQ0VfQ0ZHKSk7CiAjaWYgMCAmJiBkZWZpbmVkKE1fU0NEX1RSQUNFX0NGR19GT1JDRUNOVCkKQEAgLTE5MCwzOCArMjE3LDM3IEBACiAJCQkvKiBTdWJzY3JpcHRzIGRlY3JlYXNlIHRvIHB1dCBidW5kbGUgaW4gdGhlIG9yZGVyICovCiAJCQkvKiAgIHQwIGxvLCB0MCBoaSwgdDEgbG8sIHQxIGhpLCB0MiBsbywgdDIgaGkgKi8KIAkJCXBbaSAtIDFdID0gX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1RSQUNFX1JFQUQpKTsKLQkJCQkJCQkJLyogcmVhZCB0MiBoaSAqLworCQkJLyogcmVhZCB0MiBoaSAqLwogCQkJcFtpIC0gMl0gPSBfX3Jhd19yZWFkcShJT0FERFIoQV9TQ0RfVFJBQ0VfUkVBRCkpOwotCQkJCQkJCQkvKiByZWFkIHQyIGxvICovCisJCQkvKiByZWFkIHQyIGxvICovCiAJCQlwW2kgLSAzXSA9IF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9UUkFDRV9SRUFEKSk7Ci0JCQkJCQkJCS8qIHJlYWQgdDEgaGkgKi8KKwkJCS8qIHJlYWQgdDEgaGkgKi8KIAkJCXBbaSAtIDRdID0gX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1RSQUNFX1JFQUQpKTsKLQkJCQkJCQkJLyogcmVhZCB0MSBsbyAqLworCQkJLyogcmVhZCB0MSBsbyAqLwogCQkJcFtpIC0gNV0gPSBfX3Jhd19yZWFkcShJT0FERFIoQV9TQ0RfVFJBQ0VfUkVBRCkpOwotCQkJCQkJCQkvKiByZWFkIHQwIGhpICovCisJCQkvKiByZWFkIHQwIGhpICovCiAJCQlwW2kgLSA2XSA9IF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9UUkFDRV9SRUFEKSk7Ci0JCQkJCQkJCS8qIHJlYWQgdDAgbG8gKi8KKwkJCS8qIHJlYWQgdDAgbG8gKi8KIAkJfQogCQlpZiAoIXNicC50Yl9lbmFibGUpIHsKIAkJCXByX2RlYnVnKERFVk5BTUUgIjogdGJfaW50ciBzaHV0ZG93blxuIik7CiAJCQlfX3Jhd193cml0ZXEoTV9TQ0RfVFJBQ0VfQ0ZHX1JFU0VULAogCQkJCSAgICAgSU9BRERSKEFfU0NEX1RSQUNFX0NGRykpOwogCQkJc2JwLnRiX2FybWVkID0gMDsKLQkJCXdha2VfdXAoJnNicC50Yl9zeW5jKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2JwLnRiX3N5bmMpOwogCQl9IGVsc2UgewotCQkJYXJtX3RiKCk7CS8qIGtub2NrIGRvd24gY3VycmVudCBpbnRlcnJ1cHQgYW5kIGdldCBhbm90aGVyIG9uZSBsYXRlciAqLworCQkJLyoga25vY2sgZG93biBjdXJyZW50IGludGVycnVwdCBhbmQgZ2V0IGFub3RoZXIgb25lIGxhdGVyICovCisJCQlhcm1fdGIoKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIE5vIG1vcmUgdHJhY2UgYnVmZmVyIHNhbXBsZXMgKi8KIAkJcHJfZGVidWcoREVWTkFNRSAiOiB0Yl9pbnRyIGZ1bGxcbiIpOwogCQlfX3Jhd193cml0ZXEoTV9TQ0RfVFJBQ0VfQ0ZHX1JFU0VULCBJT0FERFIoQV9TQ0RfVFJBQ0VfQ0ZHKSk7CiAJCXNicC50Yl9hcm1lZCA9IDA7Ci0JCWlmICghc2JwLnRiX2VuYWJsZSkgewotCQkJd2FrZV91cCgmc2JwLnRiX3N5bmMpOwotCQl9Ci0JCXdha2VfdXAoJnNicC50Yl9yZWFkKTsKKwkJaWYgKCFzYnAudGJfZW5hYmxlKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzYnAudGJfc3luYyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2JwLnRiX3JlYWQpOwogCX0KLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMjUwLDggKzI3Niw4IEBACiAJc2JwLm5leHRfdGJfc2FtcGxlID0gMDsKIAlmaWxwLT5mX3BvcyA9IDA7CiAKLQllcnIgPSByZXF1ZXN0X2lycShLX0lOVF9UUkFDRV9GUkVFWkUsIHNicHJvZl90Yl9pbnRyLCAwLAotCSAgICAgICAgICAgICAgICBERVZOQU1FICIgdHJhY2UgZnJlZXplIiwgJnNicCk7CisJZXJyID0gcmVxdWVzdF9pcnEgKEtfSU5UX1RSQUNFX0ZSRUVaRSwgc2Jwcm9mX3RiX2ludHIsIDAsCisJCQkgICBERVZOQU1FICIgdHJhY2UgZnJlZXplIiwgJnNicCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIC1FQlVTWTsKIApAQCAtMjYzLDIzICsyODksMjkgQEAKIAkJICAgICBJT0FERFIoQV9TQ0RfUEVSRl9DTlRfQ0ZHKSk7CiAKIAkvKgotCSAqIFdlIGdyYWIgdGhpcyBpbnRlcnJ1cHQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSB0cnlpbmcgdG8gdXNlIGl0LCBldmVuCi0JICogdGhvdWdoIHdlIGRvbid0IHdhbnQgdG8gc2VydmljZSB0aGUgaW50ZXJydXB0cyAodGhleSBvbmx5IGZlZWQgaW50bwotCSAqIHRoZSB0cmFjZS1vbi1pbnRlcnJ1cHQgbWVjaGFuaXNtKQorCSAqIFdlIGdyYWIgdGhpcyBpbnRlcnJ1cHQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSB0cnlpbmcgdG8gdXNlCisgICAgICAgICAqIGl0LCBldmVuIHRob3VnaCB3ZSBkb24ndCB3YW50IHRvIHNlcnZpY2UgdGhlIGludGVycnVwdHMKKyAgICAgICAgICogKHRoZXkgb25seSBmZWVkIGludG8gdGhlIHRyYWNlLW9uLWludGVycnVwdCBtZWNoYW5pc20pCiAJICovCi0JZXJyID0gcmVxdWVzdF9pcnEoS19JTlRfUEVSRl9DTlQsIHNicHJvZl9wY19pbnRyLCAwLAotCSAgICAgICAgICAgICAgICBERVZOQU1FICIgc2NkIHBlcmZjbnQiLCAmc2JwKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlX2lycTsKKwlpZiAocmVxdWVzdF9pcnEoS19JTlRfUEVSRl9DTlQsIHNicHJvZl9wY19pbnRyLCAwLCBERVZOQU1FICIgc2NkIHBlcmZjbnQiLCAmc2JwKSkgeworCQlmcmVlX2lycShLX0lOVF9UUkFDRV9GUkVFWkUsICZzYnApOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCS8qCi0JICogSSBuZWVkIHRoZSBjb3JlIHRvIG1hc2sgdGhlc2UsIGJ1dCB0aGUgaW50ZXJydXB0IG1hcHBlciB0byBwYXNzIHRoZW0KLQkgKiB0aHJvdWdoLiAgSSBhbSBleHBsb2l0aW5nIG15IGtub3dsZWRnZSB0aGF0IGNwMF9zdGF0dXMgbWFza3Mgb3V0Ci0JICogSVBbNV0uIGtydworCSAqIEkgbmVlZCB0aGUgY29yZSB0byBtYXNrIHRoZXNlLCBidXQgdGhlIGludGVycnVwdCBtYXBwZXIgdG8KKwkgKiAgcGFzcyB0aGVtIHRocm91Z2guICBJIGFtIGV4cGxvaXRpbmcgbXkga25vd2xlZGdlIHRoYXQKKwkgKiAgY3AwX3N0YXR1cyBtYXNrcyBvdXQgSVBbNV0uIGtydwogCSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKwlfX3Jhd193cml0ZXEoS19CQ00xNDgwX0lOVF9NQVBfSTMsCisJCSAgICAgSU9BRERSKEFfQkNNMTQ4MF9JTVJfUkVHSVNURVIoMCwgUl9CQ00xNDgwX0lNUl9JTlRFUlJVUFRfTUFQX0JBU0VfTCkgKworCQkJICAgICgoS19CQ00xNDgwX0lOVF9QRVJGX0NOVCAmIDB4M2YpIDw8IDMpKSk7CisjZWxzZQogCV9fcmF3X3dyaXRlcShLX0lOVF9NQVBfSTMsCiAJCSAgICAgSU9BRERSKEFfSU1SX1JFR0lTVEVSKDAsIFJfSU1SX0lOVEVSUlVQVF9NQVBfQkFTRSkgKwogCQkJICAgIChLX0lOVF9QRVJGX0NOVCA8PCAzKSkpOworI2VuZGlmCiAKIAkvKiBJbml0aWFsaXplIGFkZHJlc3MgdHJhcHMgKi8KIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfQUREUl9UUkFQX1VQXzApKTsKQEAgLTI5OCw3ICszMzAsNyBAQAogCV9fcmF3X3dyaXRlcSgwLCBJT0FERFIoQV9BRERSX1RSQVBfQ0ZHXzMpKTsKIAogCS8qIEluaXRpYWxpemUgVHJhY2UgRXZlbnQgMC03ICovCi0JLyoJCQkJd2hlbiBpbnRlcnJ1cHQgKi8KKwkvKgkJCQl3aGVuIGludGVycnVwdCAgKi8KIAlfX3Jhd193cml0ZXEoTV9TQ0RfVFJFVlRfSU5URVJSVVBULCBJT0FERFIoQV9TQ0RfVFJBQ0VfRVZFTlRfMCkpOwogCV9fcmF3X3dyaXRlcSgwLCBJT0FERFIoQV9TQ0RfVFJBQ0VfRVZFTlRfMSkpOwogCV9fcmF3X3dyaXRlcSgwLCBJT0FERFIoQV9TQ0RfVFJBQ0VfRVZFTlRfMikpOwpAQCAtMzI0LDI0ICszNTYsMjMgQEAKIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfU0NEX1RSQUNFX1NFUVVFTkNFXzcpKTsKIAogCS8qIE5vdyBpbmRpY2F0ZSB0aGUgUEVSRl9DTlQgaW50ZXJydXB0IGFzIGEgdHJhY2UtcmVsZXZhbnQgaW50ZXJydXB0ICovCisjaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4NTUpIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDgwKQorCV9fcmF3X3dyaXRlcSgxVUxMIDw8IChLX0JDTTE0ODBfSU5UX1BFUkZfQ05UICYgMHgzZiksCisJCSAgICAgSU9BRERSKEFfQkNNMTQ4MF9JTVJfUkVHSVNURVIoMCwgUl9CQ00xNDgwX0lNUl9JTlRFUlJVUFRfVFJBQ0VfTCkpKTsKKyNlbHNlCiAJX19yYXdfd3JpdGVxKDFVTEwgPDwgS19JTlRfUEVSRl9DTlQsCiAJCSAgICAgSU9BRERSKEFfSU1SX1JFR0lTVEVSKDAsIFJfSU1SX0lOVEVSUlVQVF9UUkFDRSkpKTsKLQorI2VuZGlmCiAJYXJtX3RiKCk7CiAKIAlwcl9kZWJ1ZyhERVZOQU1FICI6IGRvbmUgc3RhcnRpbmdcbiIpOwogCiAJcmV0dXJuIDA7Ci0KLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShLX0lOVF9UUkFDRV9GUkVFWkUsICZzYnApOwotCi0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzYnByb2ZfemJwcm9mX3N0b3Aodm9pZCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJcHJfZGVidWcoREVWTkFNRSAiOiBzdG9wcGluZ1xuIik7CiAKQEAgLTM2NSw3ICszOTYsNyBAQAogCiAJcHJfZGVidWcoREVWTkFNRSAiOiBkb25lIHN0b3BwaW5nXG4iKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2Jwcm9mX3RiX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0zODAsMTEgKzQxMSw5IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAltZW1zZXQoJnNicCwgMCwgc2l6ZW9mKHN0cnVjdCBzYnByb2ZfdGIpKTsKLQogCXNicC5zYnByb2ZfdGJidWYgPSB2bWFsbG9jKE1BWF9UQlNBTVBMRV9CWVRFUyk7CiAJaWYgKCFzYnAuc2Jwcm9mX3RiYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQogCW1lbXNldChzYnAuc2Jwcm9mX3RiYnVmLCAwLCBNQVhfVEJTQU1QTEVfQllURVMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNicC50Yl9zeW5jKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYnAudGJfcmVhZCk7CkBAIC0zOTcsOCArNDI2LDkgQEAKIAogc3RhdGljIGludCBzYnByb2ZfdGJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBtaW5vcjsKIAorCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlpZiAobWlub3IgIT0gMCB8fCAhc2JwLm9wZW4pCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC00MTksMTAgKzQ0OSwxMCBAQAogCQkJICAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmcCkKIHsKIAlpbnQgY3VyX3NhbXBsZSwgc2FtcGxlX29mZiwgY3VyX2NvdW50LCBzYW1wbGVfbGVmdDsKLQlsb25nICBjdXJfb2ZmID0gKm9mZnA7Ci0JY2hhciAqZGVzdCAgICA9CSBidWY7Ci0JaW50ICAgY291bnQgICA9CSAwOwogCWNoYXIgKnNyYzsKKwlpbnQgICBjb3VudCAgID0JIDA7CisJY2hhciAqZGVzdCAgICA9CSBidWY7CisJbG9uZyAgY3VyX29mZiA9ICpvZmZwOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIHNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ0NSw3ICs0NzUsNiBAQAogCQkJbXV0ZXhfdW5sb2NrKCZzYnAubG9jayk7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0KIAkJcHJfZGVidWcoREVWTkFNRSAiOiByZWFkIGZyb20gc2FtcGxlICVkLCAlZCBieXRlc1xuIiwKIAkJICAgICAgICAgY3VyX3NhbXBsZSwgY3VyX2NvdW50KTsKIAkJc2l6ZSAtPSBjdXJfY291bnQ7CkBAIC00NjEsNDUgKzQ5MCw0NiBAQAogCQlkZXN0ICs9IGN1cl9jb3VudDsKIAkJY291bnQgKz0gY3VyX2NvdW50OwogCX0KLQogCSpvZmZwID0gY3VyX29mZjsKIAltdXRleF91bmxvY2soJnNicC5sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGxvbmcgc2Jwcm9mX3RiX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKLQl1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIHNicHJvZl90Yl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlpbnQgZXJyb3IgPSAwOworCWludCBlcnIgPSAwOwogCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBTQlBST0ZfWkJTVEFSVDoKIAkJbXV0ZXhfbG9jaygmc2JwLmxvY2spOwotCQllcnJvciA9IHNicHJvZl96YnByb2Zfc3RhcnQoZmlscCk7CisJCWVyciA9IHNicHJvZl96YnByb2Zfc3RhcnQoZmlscCk7CiAJCW11dGV4X3VubG9jaygmc2JwLmxvY2spOwogCQlicmVhazsKIAogCWNhc2UgU0JQUk9GX1pCU1RPUDoKIAkJbXV0ZXhfbG9jaygmc2JwLmxvY2spOwotCQllcnJvciA9IHNicHJvZl96YnByb2Zfc3RvcCgpOworCQllcnIgPSBzYnByb2ZfemJwcm9mX3N0b3AoKTsKIAkJbXV0ZXhfdW5sb2NrKCZzYnAubG9jayk7CiAJCWJyZWFrOwogCi0JY2FzZSBTQlBST0ZfWkJXQUlURlVMTDoKLQkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2JwLnRiX3JlYWQsIFRCX0ZVTEwpOwotCQlpZiAoZXJyb3IpCisJY2FzZSBTQlBST0ZfWkJXQUlURlVMTDogeworCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2JwLnRiX3JlYWQsIFRCX0ZVTEwpOworCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAKLQkJZXJyb3IgPSBwdXRfdXNlcihUQl9GVUxMLCAoaW50ICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyb3IgPSAtRUlOVkFMOworCQllcnIgPSBwdXRfdXNlcihUQl9GVUxMLCAoaW50ICopIGFyZyk7CiAJCWJyZWFrOwogCX0KIAotCXJldHVybiBlcnJvcjsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYnByb2ZfdGJfZm9wcyA9IHsKQEAgLTU0NCw4ICs1NzQsOCBAQAogCiAJc2JwLm9wZW4gPSAwOwogCXRiX3BlcmlvZCA9IHpiYnVzX21oeiAqIDEwMDAwTEw7Ci0JcHJfaW5mbyhERVZOQU1FICI6IGluaXRpYWxpemVkIC0gdGJfcGVyaW9kID0gJWxsZFxuIiwgdGJfcGVyaW9kKTsKLQorCXByX2luZm8oREVWTkFNRSAiOiBpbml0aWFsaXplZCAtIHRiX3BlcmlvZCA9ICVsbGRcbiIsCisJCShsb25nIGxvbmcpIHRiX3BlcmlvZCk7CiAJcmV0dXJuIDA7CiAKIG91dF9jbGFzczoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL01ha2VmaWxlIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKaW5kZXggMDRjMGYxYS4uZGY2NjJjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACiBvYmoteSA6PSBzZXR1cC5vIGlycS5vIHRpbWUubwogCiBvYmotJChDT05GSUdfU01QKQkJCSs9IHNtcC5vCi1vYmotJChDT05GSUdfU0lCWVRFX1RCUFJPRikJCSs9IGJjbTEyNTBfdGJwcm9mLm8KIG9iai0kKENPTkZJR19TSUJZVEVfU1RBTkRBTE9ORSkJCSs9IHByb20ubwogb2JqLSQoQ09ORklHX1NJQllURV9CVVNfV0FUQ0hFUikJKz0gYnVzX3dhdGNoZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NuaS9wY2ltdC5jIGIvYXJjaC9taXBzL3NuaS9wY2ltdC5jCmluZGV4IDhlODU5M2IuLjllZTIwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zbmkvcGNpbXQuYworKysgYi9hcmNoL21pcHMvc25pL3BjaW10LmMKQEAgLTkxLDcgKzkxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc25pX2lvX3Jlc291cmNlID0gewotCS5zdGFydAk9IDB4MDAwMDEwMDBVTCwKKwkuc3RhcnQJPSAweDAwMDAwMDAwVUwsCiAJLmVuZAk9IDB4MDNiZmZmZmZVTCwKIAkubmFtZQk9ICJQQ0lNVCBJTyBNRU0iLAogCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCkBAIC0xMzIsMTA3ICsxMzIsMTkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc25pX21lbV9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJPSAweDEwMDAwMDAwVUwsCi0JLmVuZAk9IDB4ZmZmZmZmZmZVTCwKKwkuc3RhcnQJPSAweDE4MDAwMDAwVUwsCisJLmVuZAk9IDB4MWZiZmZmZmZVTCwKIAkubmFtZQk9ICJQQ0lNVCBQQ0kgTUVNIiwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQogfTsKIAotLyoKLSAqIFRoZSBSTTIwMC9STTMwMCBoYXMgYSBmZXcgaG9sZXMgaW4gaXQncyBQQ0kvRUlTQSBtZW1vcnkgYWRkcmVzcyBzcGFjZSB1c2VkCi0gKiBmb3Igb3RoZXIgcHVycG9zZXMuICBCZSBwYXJhbm9pZCBhbmQgYWxsb2NhdGUgYWxsIG9mIHRoZSBiZWZvcmUgdGhlIFBDSQotICogY29kZSBnZXRzIGEgY2hhbmNlIHRvIHRvIG1hcCBhbnl0aGluZyBlbHNlIHRoZXJlIC4uLgotICoKLSAqIFRoaXMgbGVhdmVzIHRoZSBmb2xsb3dpbmcgYXJlYXMgYXZhaWxhYmxlOgotICoKLSAqIDB4MTAwMDAwMDAgLSAweDEwMDlmZmZmICg2NDBrQikgUENJL0VJU0EvSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MTAxMDAwMDAgLSAweDEzZmZmZmZmICggMTVNQikgUENJL0VJU0EvSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MTgwMDAwMDAgLSAweDFmYmZmZmZmICgxMjRNQikgUENJL0VJU0EgQnVzIE1lbW9yeQotICogMHgxZmYwODAwMCAtIDB4MWZmZWZmZmYgKDgxNmtCKSBQQ0kvRUlTQSBCdXMgTWVtb3J5Ci0gKiAweGEwMDAwMDAwIC0gMHhmZmZmZmZmZiAoMS41R0IpIFBDSS9FSVNBIEJ1cyBNZW1vcnkKLSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2ltdF9tZW1fcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJPSAweDEwMGEwMDAwLAotCQkuZW5kCT0gMHgxMDBiZmZmZiwKLQkJLm5hbWUJPSAiVmlkZW8gUkFNIGFyZWEiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTAwYzAwMDAsCi0JCS5lbmQJPSAweDEwMGZmZmZmLAotCQkubmFtZQk9ICJJU0EgUmVzZXJ2ZWQiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTQwMDAwMDAsCi0JCS5lbmQJPSAweDE3YmZmZmZmLAotCQkubmFtZQk9ICJQQ0kgSU8iLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTdjMDAwMDAsCi0JCS5lbmQJPSAweDE3ZmZmZmZmLAotCQkubmFtZQk9ICJDYWNoZSBSZXBsYWNlbWVudCBBcmVhIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFhMDAwMDAwLAotCQkuZW5kCT0gMHgxYTAwMDAwMywKLQkJLm5hbWUJPSAiUENJIElOVCBBY2tub3dsZWRnZSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmMwMDAwMCwKLQkJLmVuZAk9IDB4MWZjN2ZmZmYsCi0JCS5uYW1lCT0gIkJvb3QgUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmM4MDAwMCwKLQkJLmVuZAk9IDB4MWZjZmZmZmYsCi0JCS5uYW1lCT0gIkRpYWcgUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmQwMDAwMCwKLQkJLmVuZAk9IDB4MWZkZmZmZmYsCi0JCS5uYW1lCT0gIlgtQnVzIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZTAwMDAwLAotCQkuZW5kCT0gMHgxZmVmZmZmZiwKLQkJLm5hbWUJPSAiQklPUyBtYXAiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZmMDAwMDAsCi0JCS5lbmQJPSAweDFmZjdmZmZmLAotCQkubmFtZQk9ICJOVlJBTSAvIEVFUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmZmMDAwMCwKLQkJLmVuZAk9IDB4MWZmZmVmZmYsCi0JCS5uYW1lCT0gIkFTSUMgUENJIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZmZmMDAwLAotCQkuZW5kCT0gMHgxZmZmZmZmZiwKLQkJLm5hbWUJPSAiTVAgQWdlbnQiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MjAwMDAwMDAsCi0JCS5lbmQJPSAweDlmZmZmZmZmLAotCQkubmFtZQk9ICJNYWluIE1lbW9yeSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0KLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBzbmlfcGNpbXRfcmVzb3VyY2VfaW5pdCh2b2lkKQogewogCWludCBpOwogCiAJLyogcmVxdWVzdCBJL08gc3BhY2UgZm9yIGRldmljZXMgdXNlZCBvbiBhbGwgaVszNDVdODYgUENzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpbXRfaW9fcmVzb3VyY2VzKTsgaSsrKQotCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIHBjaW10X2lvX3Jlc291cmNlcyArIGkpOwotCi0JLyogcmVxdWVzdCBtZW0gc3BhY2UgZm9yIHBjaW10LXNwZWNpZmljIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2ltdF9tZW1fcmVzb3VyY2VzKTsgaSsrKQotCQlyZXF1ZXN0X3Jlc291cmNlKCZzbmlfbWVtX3Jlc291cmNlLCBwY2ltdF9tZW1fcmVzb3VyY2VzICsgaSk7Ci0KLQlpb3BvcnRfcmVzb3VyY2UuZW5kID0gc25pX2lvX3Jlc291cmNlLmVuZDsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmc25pX2lvX3Jlc291cmNlLCBwY2ltdF9pb19yZXNvdXJjZXMgKyBpKTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNuaV9wY2ltdF9vcHM7CkBAIC0yNDAsOSArMTUyLDEwIEBACiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHNuaV9jb250cm9sbGVyID0gewogCS5wY2lfb3BzCT0gJnNuaV9wY2ltdF9vcHMsCiAJLm1lbV9yZXNvdXJjZQk9ICZzbmlfbWVtX3Jlc291cmNlLAotCS5tZW1fb2Zmc2V0CT0gMHgxMDAwMDAwMFVMLAorCS5tZW1fb2Zmc2V0CT0gMHgwMDAwMDAwMFVMLAogCS5pb19yZXNvdXJjZQk9ICZzbmlfaW9fcmVzb3VyY2UsCi0JLmlvX29mZnNldAk9IDB4MDAwMDAwMDBVTAorCS5pb19vZmZzZXQJPSAweDAwMDAwMDAwVUwsCisJLmlvX21hcF9iYXNlICAgID0gU05JX1BPUlRfQkFTRQogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX3BjaW10X2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMzYzLDE1ICsyNzYsMTcgQEAKIAogdm9pZCBzbmlfcGNpbXRfaW5pdCh2b2lkKQogewotCXNuaV9wY2ltdF9yZXNvdXJjZV9pbml0KCk7CiAJc25pX3BjaW10X2RldGVjdCgpOwogCXNuaV9wY2ltdF9zY19pbml0KCk7CiAJcnRjX21pcHNfZ2V0X3RpbWUgPSBtYzE0NjgxOF9nZXRfY21vc190aW1lOwogCXJ0Y19taXBzX3NldF90aW1lID0gbWMxNDY4MThfc2V0X3J0Y19tbXNzOwogCWJvYXJkX3RpbWVfaW5pdCA9IHNuaV9jcHVfdGltZV9pbml0OworCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSBzbmlfaW9fcmVzb3VyY2UuZW5kOwogI2lmZGVmIENPTkZJR19QQ0kKKwlQQ0lCSU9TX01JTl9JTyA9IDB4OTAwMDsKIAlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmc25pX2NvbnRyb2xsZXIpOwogI2VuZGlmCisJc25pX3BjaW10X3Jlc291cmNlX2luaXQoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc25pcm1fcGNpbXRfc2V0dXBfZGV2aW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NuaS9wY2l0LmMgYi9hcmNoL21pcHMvc25pL3BjaXQuYwppbmRleCAxZGZjM2YwLi4wMGQxNTFmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc25pL3BjaXQuYworKysgYi9hcmNoL21pcHMvc25pL3BjaXQuYwpAQCAtNDMsNyArNDMsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBwY2l0X2NwbHVzX2RhdGFbXSA9IHsKLQlQT1JUKDB4M2Y4LCA0KSwKKwlQT1JUKDB4M2Y4LCAwKSwKIAlQT1JUKDB4MmY4LCAzKSwKIAlQT1JUKDB4M2U4LCA0KSwKIAlQT1JUKDB4MmU4LCAzKSwKQEAgLTU5LDkgKzU5LDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc25pX2lvX3Jlc291cmNlID0gewotCS5zdGFydAk9IDB4MDAwMDEwMDBVTCwKKwkuc3RhcnQJPSAweDAwMDAwMDAwVUwsCiAJLmVuZAk9IDB4MDNiZmZmZmZVTCwKLQkubmFtZQk9ICJQQ0lUIElPIE1FTSIsCisJLm5hbWUJPSAiUENJVCBJTyIsCiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKIH07CiAKQEAgLTkyLDYgKzkyLDExIEBACiAJCS5uYW1lCT0gImRtYTIiLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKIAl9LCB7CisJCS5zdGFydAk9ICAweGNmOCwKKwkJLmVuZAk9IDB4Y2ZiLAorCQkubmFtZQk9ICJQQ0kgY29uZmlnIGFkZHIiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKKwl9LCB7CiAJCS5zdGFydAk9ICAweGNmYywKIAkJLmVuZAk9IDB4Y2ZmLAogCQkubmFtZQk9ICJQQ0kgY29uZmlnIGRhdGEiLApAQCAtMTAwLDEwNyArMTA1LDE5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNuaV9tZW1fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gMHgxMDAwMDAwMFVMLAotCS5lbmQJPSAweGZmZmZmZmZmVUwsCisJLnN0YXJ0CT0gMHgxODAwMDAwMFVMLAorCS5lbmQJPSAweDFmYmZmZmZmVUwsCiAJLm5hbWUJPSAiUENJVCBQQ0kgTUVNIiwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQogfTsKIAotLyoKLSAqIFRoZSBSTTIwMC9STTMwMCBoYXMgYSBmZXcgaG9sZXMgaW4gaXQncyBQQ0kvRUlTQSBtZW1vcnkgYWRkcmVzcyBzcGFjZSB1c2VkCi0gKiBmb3Igb3RoZXIgcHVycG9zZXMuICBCZSBwYXJhbm9pZCBhbmQgYWxsb2NhdGUgYWxsIG9mIHRoZSBiZWZvcmUgdGhlIFBDSQotICogY29kZSBnZXRzIGEgY2hhbmNlIHRvIHRvIG1hcCBhbnl0aGluZyBlbHNlIHRoZXJlIC4uLgotICoKLSAqIFRoaXMgbGVhdmVzIHRoZSBmb2xsb3dpbmcgYXJlYXMgYXZhaWxhYmxlOgotICoKLSAqIDB4MTAwMDAwMDAgLSAweDEwMDlmZmZmICg2NDBrQikgUENJL0VJU0EvSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MTAxMDAwMDAgLSAweDEzZmZmZmZmICggMTVNQikgUENJL0VJU0EvSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MTgwMDAwMDAgLSAweDFmYmZmZmZmICgxMjRNQikgUENJL0VJU0EgQnVzIE1lbW9yeQotICogMHgxZmYwODAwMCAtIDB4MWZmZWZmZmYgKDgxNmtCKSBQQ0kvRUlTQSBCdXMgTWVtb3J5Ci0gKiAweGEwMDAwMDAwIC0gMHhmZmZmZmZmZiAoMS41R0IpIFBDSS9FSVNBIEJ1cyBNZW1vcnkKLSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2l0X21lbV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IDB4MTQwMDAwMDAsCi0JCS5lbmQJPSAweDE3YmZmZmZmLAotCQkubmFtZQk9ICJQQ0kgSU8iLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTdjMDAwMDAsCi0JCS5lbmQJPSAweDE3ZmZmZmZmLAotCQkubmFtZQk9ICJDYWNoZSBSZXBsYWNlbWVudCBBcmVhIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE4MGEwMDAwLAotCQkuZW5kCT0gMHgxODBiZmZmZiwKLQkJLm5hbWUJPSAiVmlkZW8gUkFNIGFyZWEiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTgwYzAwMDAsCi0JCS5lbmQJPSAweDE4MGZmZmZmLAotCQkubmFtZQk9ICJJU0EgUmVzZXJ2ZWQiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTkwMDAwMDAsCi0JCS5lbmQJPSAweDFmYmZmZmZmLAotCQkubmFtZQk9ICJQQ0kgTUVNIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmYzAwMDAwLAotCQkuZW5kCT0gMHgxZmM3ZmZmZiwKLQkJLm5hbWUJPSAiQm9vdCBQUk9NIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmYzgwMDAwLAotCQkuZW5kCT0gMHgxZmNmZmZmZiwKLQkJLm5hbWUJPSAiRGlhZyBQUk9NIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZDAwMDAwLAotCQkuZW5kCT0gMHgxZmRmZmZmZiwKLQkJLm5hbWUJPSAiWC1CdXMiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZlMDAwMDAsCi0JCS5lbmQJPSAweDFmZWZmZmZmLAotCQkubmFtZQk9ICJCSU9TIG1hcCIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmYwMDAwMCwKLQkJLmVuZAk9IDB4MWZmN2ZmZmYsCi0JCS5uYW1lCT0gIk5WUkFNIC8gRUVQUk9NIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZmYwMDAwLAotCQkuZW5kCT0gMHgxZmZmZWZmZiwKLQkJLm5hbWUJPSAiTUFVSSBBU0lDIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZmZmMDAwLAotCQkuZW5kCT0gMHgxZmZmZmZmZiwKLQkJLm5hbWUJPSAiTVAgQWdlbnQiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MjAwMDAwMDAsCi0JCS5lbmQJPSAweDlmZmZmZmZmLAotCQkubmFtZQk9ICJNYWluIE1lbW9yeSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0KLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBzbmlfcGNpdF9yZXNvdXJjZV9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKIAkvKiByZXF1ZXN0IEkvTyBzcGFjZSBmb3IgZGV2aWNlcyB1c2VkIG9uIGFsbCBpWzM0NV04NiBQQ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2l0X2lvX3Jlc291cmNlcyk7IGkrKykKLQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCBwY2l0X2lvX3Jlc291cmNlcyArIGkpOwotCi0JLyogcmVxdWVzdCBtZW0gc3BhY2UgZm9yIHBjaW10LXNwZWNpZmljIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2l0X21lbV9yZXNvdXJjZXMpOyBpKyspCi0JCXJlcXVlc3RfcmVzb3VyY2UoJnNuaV9tZW1fcmVzb3VyY2UsIHBjaXRfbWVtX3Jlc291cmNlcyArIGkpOwotCi0JaW9wb3J0X3Jlc291cmNlLmVuZCA9IHNuaV9pb19yZXNvdXJjZS5lbmQ7CisJCXJlcXVlc3RfcmVzb3VyY2UoJnNuaV9pb19yZXNvdXJjZSwgcGNpdF9pb19yZXNvdXJjZXMgKyBpKTsKIH0KIAogCkBAIC0yMDksOSArMTI2LDEwIEBACiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHNuaV9wY2l0X2NvbnRyb2xsZXIgPSB7CiAJLnBjaV9vcHMJPSAmc25pX3BjaXRfb3BzLAogCS5tZW1fcmVzb3VyY2UJPSAmc25pX21lbV9yZXNvdXJjZSwKLQkubWVtX29mZnNldAk9IDB4MTAwMDAwMDBVTCwKKwkubWVtX29mZnNldAk9IDB4MDAwMDAwMDBVTCwKIAkuaW9fcmVzb3VyY2UJPSAmc25pX2lvX3Jlc291cmNlLAotCS5pb19vZmZzZXQJPSAweDAwMDAwMDAwVUwKKwkuaW9fb2Zmc2V0CT0gMHgwMDAwMDAwMFVMLAorCS5pb19tYXBfYmFzZSAgICA9IFNOSV9QT1JUX0JBU0UKIH07CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9wY2l0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMjYyLDcgKzE4MCw3IEBACiAJaW50IGlycTsKIAogCWNsZWFyX2MwX3N0YXR1cyhJRV9JUlEwKTsKLQlpcnEgPSBmZnMoKHBlbmRpbmcgPj4gMTYpICYgMHg3Zik7CisJaXJxID0gZmZzKChwZW5kaW5nID4+IDE2KSAmIDB4M2YpOwogCiAJaWYgKGxpa2VseShpcnEgPiAwKSkKIAkJZG9fSVJRIChpcnEgKyBTTklfUENJVF9JTlRfU1RBUlQgLSAxKTsKQEAgLTI4OSw2ICsyMDcsOCBAQAogCiAJaWYgKHBlbmRpbmcgJiBDX0lSUTApCiAJCXBjaXRfaHdpbnQwKCk7CisJZWxzZSBpZiAocGVuZGluZyAmIENfSVJRMSkKKwkJZG9fSVJRIChNSVBTX0NQVV9JUlFfQkFTRSArIDMpOwogCWVsc2UgaWYgKHBlbmRpbmcgJiBDX0lSUTIpCiAJCWRvX0lSUSAoTUlQU19DUFVfSVJRX0JBU0UgKyA0KTsKIAllbHNlIGlmIChwZW5kaW5nICYgQ19JUlEzKQpAQCAtMzE3LDIxICsyMzcsMjMgQEAKIAltaXBzX2NwdV9pcnFfaW5pdCgpOwogCWZvciAoaSA9IFNOSV9QQ0lUX0lOVF9TVEFSVDsgaSA8PSBTTklfUENJVF9JTlRfRU5EOyBpKyspCiAJCXNldF9pcnFfY2hpcChpLCAmcGNpdF9pcnFfdHlwZSk7Ci0JKih2b2xhdGlsZSB1MzIgKilTTklfUENJVF9JTlRfUkVHID0gMDsKKwkqKHZvbGF0aWxlIHUzMiAqKVNOSV9QQ0lUX0lOVF9SRUcgPSAweDQwMDAwMDAwOwogCXNuaV9od2ludCA9IHNuaV9wY2l0X2h3aW50X2NwbHVzOwogCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0lNLCBJRV9JUlEwKTsKLQlzZXR1cF9pcnEgKFNOSV9QQ0lUX0lOVF9TVEFSVCArIDYsICZzbmlfaXNhX2lycSk7CisJc2V0dXBfaXJxIChNSVBTX0NQVV9JUlFfQkFTRSArIDMsICZzbmlfaXNhX2lycSk7CiB9CiAKIHZvaWQgc25pX3BjaXRfaW5pdCh2b2lkKQogewotCXNuaV9wY2l0X3Jlc291cmNlX2luaXQoKTsKIAlydGNfbWlwc19nZXRfdGltZSA9IG1jMTQ2ODE4X2dldF9jbW9zX3RpbWU7CiAJcnRjX21pcHNfc2V0X3RpbWUgPSBtYzE0NjgxOF9zZXRfcnRjX21tc3M7CiAJYm9hcmRfdGltZV9pbml0ID0gc25pX2NwdV90aW1lX2luaXQ7CisJaW9wb3J0X3Jlc291cmNlLmVuZCA9IHNuaV9pb19yZXNvdXJjZS5lbmQ7CiAjaWZkZWYgQ09ORklHX1BDSQorCVBDSUJJT1NfTUlOX0lPID0gMHg5MDAwOwogCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZzbmlfcGNpdF9jb250cm9sbGVyKTsKICNlbmRpZgorCXNuaV9wY2l0X3Jlc291cmNlX2luaXQoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc25pcm1fcGNpdF9zZXR1cF9kZXZpbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L0tjb25maWcgYi9hcmNoL21pcHMvdnI0MXh4L0tjb25maWcKaW5kZXggOTJmNDFmNi4uOGY0ZDNlNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvS2NvbmZpZwpAQCAtMSw2ICsxLDEwIEBACi1jb25maWcgQ0FTSU9fRTU1Ci0JYm9vbCAiU3VwcG9ydCBmb3IgQ0FTSU8gQ0FTU0lPUEVJQSBFLTEwLzE1LzU1LzY1IgorY2hvaWNlCisJcHJvbXB0ICJNYWNoaW5lIHR5cGUiCiAJZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWAorCWRlZmF1bHQgVEFOQkFDX1RCMDIyWAorCitjb25maWcgQ0FTSU9fRTU1CisJYm9vbCAiQ0FTSU8gQ0FTU0lPUEVJQSBFLTEwLzE1LzU1LzY1IgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBJU0EKQEAgLTgsOCArMTIsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCiBjb25maWcgSUJNX1dPUktQQUQKLQlib29sICJTdXBwb3J0IGZvciBJQk0gV29ya1BhZCB6NTAiCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWAorCWJvb2wgIklCTSBXb3JrUGFkIHo1MCIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSVNBCkBAIC0xNywyNiArMjAsMTggQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAogY29uZmlnIE5FQ19DTUJWUjQxMzMKLQlib29sICJTdXBwb3J0IGZvciBORUMgQ01CLVZSNDEzMyIKLQlkZXBlbmRzIG9uIE1BQ0hfVlI0MVhYCisJYm9vbCAiTkVDIENNQi1WUjQxMzMiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCi1jb25maWcgUk9DS0hPUFBFUgotCWJvb2wgIlN1cHBvcnQgZm9yIFJvY2tob3BwZXIgYmFzZWJvYXJkIgotCWRlcGVuZHMgb24gTkVDX0NNQlZSNDEzMwotCXNlbGVjdCBJODI1OQotCXNlbGVjdCBIQVZFX1NURF9QQ19TRVJJQUxfUE9SVAotCiBjb25maWcgVEFOQkFDX1RCMDIyWAotCWJvb2wgIlN1cHBvcnQgZm9yIFRBTkJBQyBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZSBhbmQgVEFOQkFDIFZSNDEzMURJTU0iCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWAorCWJvb2wgIlRBTkJBQyBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZSBhbmQgVEFOQkFDIFZSNDEzMURJTU0iCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJaGVscApAQCAtNDYsNDAgKzQxLDY1IEBACiAJICBQbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly93d3cudGFuYmFjLmNvLmpwLz4KIAkgIGFib3V0IFZSNDEzMSBtdWx0aWNoaXAgbW9kdWxlIGFuZCBWUjQxMzFESU1NLgogCi1jb25maWcgVEFOQkFDX1RCMDIyNgotCWJvb2wgIlN1cHBvcnQgZm9yIFRBTkJBQyBNYmFzZShUQjAyMjYpIgorY29uZmlnIFZJQ1RPUl9NUEMzMFgKKwlib29sICJWaWN0b3IgTVAtQzMwMy8zMDQiCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgUENJX1ZSNDFYWAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBaQU9fQ0FQQ0VMTEEKKwlib29sICJaQU8gTmV0d29ya3MgQ2FwY2VsbGEiCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgUENJX1ZSNDFYWAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2VuZGNob2ljZQorCitjb25maWcgUk9DS0hPUFBFUgorCWJvb2wgIlN1cHBvcnQgZm9yIFJvY2tob3BwZXIgYmFzZSBib2FyZCIKKwlkZXBlbmRzIG9uIE5FQ19DTUJWUjQxMzMKKwlzZWxlY3QgUENJX1ZSNDFYWAorCXNlbGVjdCBJODI1OQorCXNlbGVjdCBIQVZFX1NURF9QQ19TRVJJQUxfUE9SVAorCitjaG9pY2UKKwlwcm9tcHQgIkJhc2UgYm9hcmQgdHlwZSIKIAlkZXBlbmRzIG9uIFRBTkJBQ19UQjAyMlgKKwlkZWZhdWx0IFRBTkJBQ19UQjAyODcKKworY29uZmlnIFRBTkJBQ19UQjAyMTkKKwlib29sICJUQU5CQUMgRElNTSBFdmFsdWF0aW9uIEtpdChUQjAyMTkpIgogCXNlbGVjdCBHUElPX1ZSNDFYWAorCXNlbGVjdCBQQ0lfVlI0MVhYCisJaGVscAorCSAgVGhlIFRBTkJBQyBESU1NIEV2YWx1YXRpb24gS2l0KFRCMDIxOSkgaXMgYSBNSVBTLWJhc2VkIHBsYXRmb3JtCisJICBtYW51ZmFjdHVyZWQgYnkgVEFOQkFDLgorCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+IGFib3V0IERJTU0gRXZhbHVhdGlvbiBLaXQuCisKK2NvbmZpZyBUQU5CQUNfVEIwMjI2CisJYm9vbCAiVEFOQkFDIE1iYXNlKFRCMDIyNikiCisJc2VsZWN0IEdQSU9fVlI0MVhYCisJc2VsZWN0IFBDSV9WUjQxWFgKIAloZWxwCiAJICBUaGUgVEFOQkFDIE1iYXNlKFRCMDIyNikgaXMgYSBNSVBTLWJhc2VkIHBsYXRmb3JtCiAJICBtYW51ZmFjdHVyZWQgYnkgVEFOQkFDLgogCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+IGFib3V0IE1iYXNlLgogCiBjb25maWcgVEFOQkFDX1RCMDI4NwotCWJvb2wgIlN1cHBvcnQgZm9yIFRBTkJBQyBNaW5pLUlUWCBESU1NIGJhc2UoVEIwMjg3KSIKLQlkZXBlbmRzIG9uIFRBTkJBQ19UQjAyMlgKKwlib29sICJUQU5CQUMgTWluaS1JVFggRElNTSBiYXNlKFRCMDI4NykiCisJc2VsZWN0IFBDSV9WUjQxWFgKIAloZWxwCiAJICBUaGUgVEFOQkFDIE1pbmktSVRYIERJTU0gYmFzZShUQjAyODcpIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybQogCSAgbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KIAkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPiBhYm91dCBNaW5pLUlUWCBESU1NIGJhc2UuCiAKLWNvbmZpZyBWSUNUT1JfTVBDMzBYCi0JYm9vbCAiU3VwcG9ydCBmb3IgVmljdG9yIE1QLUMzMDMvMzA0IgotCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBaQU9fQ0FQQ0VMTEEKLQlib29sICJTdXBwb3J0IGZvciBaQU8gTmV0d29ya3MgQ2FwY2VsbGEiCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBJUlFfQ1BVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KK2VuZGNob2ljZQogCiBjb25maWcgUENJX1ZSNDFYWAogCWJvb2wgIkFkZCBQQ0kgY29udHJvbCB1bml0IHN1cHBvcnQgb2YgTkVDIFZSNDEwMCBzZXJpZXMiCmRpZmYgLS1naXQgYS9hcmNoL3BwYy84MjYwX2lvL2VuZXQuYyBiL2FyY2gvcHBjLzgyNjBfaW8vZW5ldC5jCmluZGV4IGE2MDU2YzIuLjQ4Y2U4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzgyNjBfaW8vZW5ldC5jCisrKyBiL2FyY2gvcHBjLzgyNjBfaW8vZW5ldC5jCkBAIC00NzcsNyArNDc3LDYgQEAKIAkJCWNlcC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQl9CiAJCWVsc2UgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcHV0KHNrYixwa3RfbGVuLTQpOwkvKiBNYWtlIHJvb20gKi8KIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAogCQkJCSh1bnNpZ25lZCBjaGFyICopX192YShiZHAtPmNiZF9idWZhZGRyKSwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzgyNjBfaW8vZmNjX2VuZXQuYyBiL2FyY2gvcHBjLzgyNjBfaW8vZmNjX2VuZXQuYwppbmRleCAwNmI4NGMzLi45ZGI4MjVmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy84MjYwX2lvL2ZjY19lbmV0LmMKKysrIGIvYXJjaC9wcGMvODI2MF9pby9mY2NfZW5ldC5jCkBAIC03MzQsNyArNzM0LDYgQEAKIAkJCWNlcC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQl9CiAJCWVsc2UgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKIAkJCQkodW5zaWduZWQgY2hhciAqKV9fdmEoYmRwLT5jYmRfYnVmYWRkciksCmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jIGIvYXJjaC9wcGMvOHh4X2lvL2VuZXQuYwppbmRleCBiMjNjNDViLi5iZmEzZjUyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMKQEAgLTUwNiw3ICs1MDYsNiBAQAogCQkJY2VwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0KIAkJZWxzZSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9wdXQoc2tiLHBrdF9sZW4tNCk7CS8qIE1ha2Ugcm9vbSAqLwogCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCiAJCQkJY2VwLT5yeF92YWRkcltiZHAgLSBjZXAtPnJ4X2JkX2Jhc2VdLApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jIGIvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jCmluZGV4IGU2YzI4ZmIuLjU3YTlhNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9mZWMuYworKysgYi9hcmNoL3BwYy84eHhfaW8vZmVjLmMKQEAgLTcyNCw3ICs3MjQsNiBAQAogCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKIAkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJfSBlbHNlIHsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9wdXQoc2tiLHBrdF9sZW4tNCk7CS8qIE1ha2Ugcm9vbSAqLwogCQlldGhfY29weV9hbmRfc3VtKHNrYiwgZGF0YSwgcGt0X2xlbi00LCAwKTsKIAkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggMGYyOTNhYS4uZTZlYzQxOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTQxLDYgKzQxLDExIEBACiBjb25maWcgR0VORVJJQ19USU1FCiAJZGVmX2Jvb2wgeQogCitjb25maWcgR0VORVJJQ19CVUcKKwlib29sCisJZGVwZW5kcyBvbiBCVUcKKwlkZWZhdWx0IHkKKwogY29uZmlnIE5PX0lPTUVNCiAJZGVmX2Jvb2wgeQogCkBAIC01MTQsNiArNTE5LDE0IEBACiAJICBjdXJyZW50IGtlcm5lbCwgYW5kIHRvIHN0YXJ0IGFub3RoZXIga2VybmVsLiAgSXQgaXMgbGlrZSBhIHJlYm9vdAogCSAgYnV0IGlzIGluZGVwZW5kZW50IG9mIGhhcmR3YXJlL21pY3JvY29kZSBzdXBwb3J0LgogCitjb25maWcgWkZDUERVTVAKKwl0cmlzdGF0ZSAiemZjcGR1bXAgc3VwcG9ydCIKKwlzZWxlY3QgU01QCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGFuIHpmY3BkdW1wIGVuYWJsZWQga2VybmVsLgorCSAgUmVmZXIgdG8gIkRvY3VtZW50YXRpb24vczM5MC96ZmNwZHVtcC50eHQiIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcy4KKwogZW5kbWVudQogCiBzb3VyY2UgIm5ldC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IGIxZTU1ODQuLjY4NDQxZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvTWFrZWZpbGUKQEAgLTY3LDggKzY3LDEwIEBACiAKIGlmZXEgKCQoY2FsbCBjYy1vcHRpb24teW4sLW1zdGFjay1zaXplPTgxOTIgLW1zdGFjay1ndWFyZD0xMjgpLHkpCiBjZmxhZ3MtJChDT05GSUdfQ0hFQ0tfU1RBQ0spICs9IC1tc3RhY2stc2l6ZT0kKFNUQUNLX1NJWkUpCitpZm5lcSAoJChjYWxsIGNjLW9wdGlvbi15biwtbXN0YWNrLXNpemU9ODE5MikseSkKIGNmbGFncy0kKENPTkZJR19DSEVDS19TVEFDSykgKz0gLW1zdGFjay1ndWFyZD0kKENPTkZJR19TVEFDS19HVUFSRCkKIGVuZGlmCitlbmRpZgogCiBpZmVxICgkKGNhbGwgY2Mtb3B0aW9uLXluLC1td2Fybi1keW5hbWljc3RhY2spLHkpCiBjZmxhZ3MtJChDT05GSUdfV0FSTl9TVEFDSykgKz0gLW13YXJuLWR5bmFtaWNzdGFjawpAQCAtMTAzLDYgKzEwNSw5IEBACiBpbWFnZTogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCit6ZmNwZHVtcDoKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKKwogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKaW5kZXggMGMzY2Y0Yi4uZWU4OWIzMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYworKysgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCkBAIC02NjgsNDUgKzY2OCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChhcHBsZGF0YV91bnJlZ2lzdGVyX29wcyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcHBsZGF0YV9kaWFnKTsKIAotI2lmZGVmIE1PRFVMRQotLyoKLSAqIEtlcm5lbCBzeW1ib2xzIG5lZWRlZCBieSBhcHBsZGF0YV9tZW0gYW5kIGFwcGxkYXRhX29zIG1vZHVsZXMuCi0gKiBIb3dldmVyLCBpZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUgKGZvciB0ZXN0aW5nIG9ubHkpLCB0aGVzZQotICogc3ltYm9scyBhcmUgbm90IGV4cG9ydGVkLiBJbiB0aGlzIGNhc2UsIHdlIGRlZmluZSB0aGVtIGxvY2FsbHkgYW5kIGV4cG9ydAotICogdGhvc2UuCi0gKi8KLXZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbCkKLXsKLQl2YWwtPmZyZWVzd2FwID0gLTF1bDsKLQl2YWwtPnRvdGFsc3dhcCA9IC0xdWw7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgYXZlbnJ1blszXSA9IHstMSAtIEZJWEVEXzEvMjAwLCAtMSAtIEZJWEVEXzEvMjAwLAotCQkJCS0xIC0gRklYRURfMS8yMDB9OwotaW50IG5yX3RocmVhZHMgPSAtMTsKLQotdm9pZCBnZXRfZnVsbF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlX3N0YXRlICpwcykKLXsKLQltZW1zZXQocHMsIC0xLCBzaXplb2Yoc3RydWN0IHBhZ2Vfc3RhdGUpKTsKLX0KLQotdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nKHZvaWQpCi17Ci0JcmV0dXJuIC0xOwotfQotCi11bnNpZ25lZCBsb25nIG5yX2lvd2FpdCh2b2lkKQotewotCXJldHVybiAtMTsKLX0KLQotLyp1bnNpZ25lZCBsb25nIG5yX2NvbnRleHRfc3dpdGNoZXModm9pZCkKLXsKLQlyZXR1cm4gLTE7Ci19Ki8KLSNlbmRpZiAvKiBNT0RVTEUgKi8KIEVYUE9SVF9TWU1CT0xfR1BMKHNpX3N3YXBpbmZvKTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3RocmVhZHMpOwogRVhQT1JUX1NZTUJPTF9HUEwobnJfcnVubmluZyk7CiBFWFBPUlRfU1lNQk9MX0dQTChucl9pb3dhaXQpOwotLy9FWFBPUlRfU1lNQk9MX0dQTChucl9jb250ZXh0X3N3aXRjaGVzKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9uZXRfc3VtLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfbmV0X3N1bS5jCmluZGV4IGY2NGI4YzguLjUxNmIzYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9uZXRfc3VtLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX25ldF9zdW0uYwpAQCAtMTA4LDEwICsxMDgsMTAgQEAKIAljb2xsaXNpb25zID0gMDsKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKLQkJaWYgKGRldi0+Z2V0X3N0YXRzID09IE5VTEwpIHsKKwkJc3RhdHMgPSBkZXYtPmdldF9zdGF0cyhkZXYpOworCQlpZiAoc3RhdHMgPT0gTlVMTCkgewogCQkJY29udGludWU7CiAJCX0KLQkJc3RhdHMgPSBkZXYtPmdldF9zdGF0cyhkZXYpOwogCQlyeF9wYWNrZXRzICs9IHN0YXRzLT5yeF9wYWNrZXRzOwogCQl0eF9wYWNrZXRzICs9IHN0YXRzLT50eF9wYWNrZXRzOwogCQlyeF9ieXRlcyAgICs9IHN0YXRzLT5yeF9ieXRlczsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCmluZGV4IDk2OTYzOWYuLmFmNDQ2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYwpAQCAtMjUsOTkgKzI1LDEwMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCiAjaW5jbHVkZSAiY3J5cHRfczM5MC5oIgogCiAjZGVmaW5lIFNIQTFfRElHRVNUX1NJWkUJMjAKICNkZWZpbmUgU0hBMV9CTE9DS19TSVpFCQk2NAogCi1zdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCB7Ci0JdTY0IGNvdW50Oworc3RydWN0IHMzOTBfc2hhMV9jdHggeworCXU2NCBjb3VudDsJCS8qIG1lc3NhZ2UgbGVuZ3RoICovCiAJdTMyIHN0YXRlWzVdOwotCXUzMiBidWZfbGVuOwotCXU4IGJ1ZmZlclsyICogU0hBMV9CTE9DS19TSVpFXTsKKwl1OCBidWZbMiAqIFNIQTFfQkxPQ0tfU0laRV07CiB9OwogCiBzdGF0aWMgdm9pZCBzaGExX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgczM5MF9zaGExX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQljdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKLQljdHgtPnN0YXRlWzFdID0JMHhFRkNEQUI4OTsKLQljdHgtPnN0YXRlWzJdID0JMHg5OEJBRENGRTsKLQljdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKLQljdHgtPnN0YXRlWzRdID0JMHhDM0QyRTFGMDsKLQotCWN0eC0+Y291bnQgPSAwOwotCWN0eC0+YnVmX2xlbiA9IDA7CisJc2N0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworCXNjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKwlzY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisJc2N0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworCXNjdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKwlzY3R4LT5jb3VudCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNoYTFfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLAogCQkJdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCAqc2N0eDsKLQlsb25nIGltZF9sZW47CisJc3RydWN0IHMzOTBfc2hhMV9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OwogCi0Jc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0Jc2N0eC0+Y291bnQgKz0gbGVuICogODsgLyogbWVzc2FnZSBiaXQgbGVuZ3RoICovCisJLyogaG93IG11Y2ggaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVyPyAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwogCi0JLyogYW55dGhpbmcgaW4gYnVmZmVyIHlldD8gLT4gbXVzdCBiZSBjb21wbGV0ZWQgKi8KLQlpZiAoc2N0eC0+YnVmX2xlbiAmJiAoc2N0eC0+YnVmX2xlbiArIGxlbikgPj0gU0hBMV9CTE9DS19TSVpFKSB7Ci0JCS8qIGNvbXBsZXRlIGZ1bGwgYmxvY2sgYW5kIGhhc2ggKi8KLQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHNjdHgtPmJ1Zl9sZW4sIGRhdGEsCi0JCSAgICAgICBTSEExX0JMT0NLX1NJWkUgLSBzY3R4LT5idWZfbGVuKTsKLQkJY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsCi0JCQkJU0hBMV9CTE9DS19TSVpFKTsKLQkJZGF0YSArPSBTSEExX0JMT0NLX1NJWkUgLSBzY3R4LT5idWZfbGVuOwotCQlsZW4gLT0gU0hBMV9CTE9DS19TSVpFIC0gc2N0eC0+YnVmX2xlbjsKLQkJc2N0eC0+YnVmX2xlbiA9IDA7CisJc2N0eC0+Y291bnQgKz0gbGVuOworCisJaWYgKGluZGV4ICsgbGVuIDwgU0hBMV9CTE9DS19TSVpFKQorCQlnb3RvIHN0b3JlOworCisJLyogcHJvY2VzcyBvbmUgc3RvcmVkIGJsb2NrICovCisJaWYgKGluZGV4KSB7CisJCW1lbWNweShzY3R4LT5idWYgKyBpbmRleCwgZGF0YSwgU0hBMV9CTE9DS19TSVpFIC0gaW5kZXgpOworCQlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMSwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwKKwkJCQkgICAgICBTSEExX0JMT0NLX1NJWkUpOworCQlCVUdfT04ocmV0ICE9IFNIQTFfQkxPQ0tfU0laRSk7CisJCWRhdGEgKz0gU0hBMV9CTE9DS19TSVpFIC0gaW5kZXg7CisJCWxlbiAtPSBTSEExX0JMT0NLX1NJWkUgLSBpbmRleDsKIAl9CiAKLQkvKiByZXN0IG9mIGRhdGEgY29udGFpbnMgZnVsbCBibG9ja3M/ICovCi0JaW1kX2xlbiA9IGxlbiAmIH4weDNmdWw7Ci0JaWYgKGltZF9sZW4pIHsKLQkJY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBkYXRhLCBpbWRfbGVuKTsKLQkJZGF0YSArPSBpbWRfbGVuOwotCQlsZW4gLT0gaW1kX2xlbjsKKwkvKiBwcm9jZXNzIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlICovCisJaWYgKGxlbiA+PSBTSEExX0JMT0NLX1NJWkUpIHsKKwkJcmV0ID0gY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBkYXRhLAorCQkJCSAgICAgIGxlbiAmIH4oU0hBMV9CTE9DS19TSVpFIC0gMSkpOworCQlCVUdfT04ocmV0ICE9IChsZW4gJiB+KFNIQTFfQkxPQ0tfU0laRSAtIDEpKSk7CisJCWRhdGEgKz0gcmV0OworCQlsZW4gLT0gcmV0OwogCX0KLQkvKiBhbnl0aGluZyBsZWZ0PyBzdG9yZSBpbiBidWZmZXIgKi8KLQlpZiAobGVuKSB7Ci0JCW1lbWNweShzY3R4LT5idWZmZXIgKyBzY3R4LT5idWZfbGVuICwgZGF0YSwgbGVuKTsKLQkJc2N0eC0+YnVmX2xlbiArPSBsZW47Ci0JfQotfQogCi0KLXN0YXRpYyB2b2lkIHBhZF9tZXNzYWdlKHN0cnVjdCBjcnlwdF9zMzkwX3NoYTFfY3R4KiBzY3R4KQotewotCWludCBpbmRleDsKLQotCWluZGV4ID0gc2N0eC0+YnVmX2xlbjsKLQlzY3R4LT5idWZfbGVuID0gKHNjdHgtPmJ1Zl9sZW4gPCA1NikgPwotCQkJIFNIQTFfQkxPQ0tfU0laRToyICogU0hBMV9CTE9DS19TSVpFOwotCS8qIHN0YXJ0IHBhZCB3aXRoIDEgKi8KLQlzY3R4LT5idWZmZXJbaW5kZXhdID0gMHg4MDsKLQkvKiBwYWQgd2l0aCB6ZXJvcyAqLwotCWluZGV4Kys7Ci0JbWVtc2V0KHNjdHgtPmJ1ZmZlciArIGluZGV4LCAweDAwLCBzY3R4LT5idWZfbGVuIC0gaW5kZXgpOwotCS8qIGFwcGVuZCBsZW5ndGggKi8KLQltZW1jcHkoc2N0eC0+YnVmZmVyICsgc2N0eC0+YnVmX2xlbiAtIDgsICZzY3R4LT5jb3VudCwKLQkgICAgICAgc2l6ZW9mIHNjdHgtPmNvdW50KTsKK3N0b3JlOgorCS8qIGFueXRoaW5nIGxlZnQ/ICovCisJaWYgKGxlbikKKwkJbWVtY3B5KHNjdHgtPmJ1ZiArIGluZGV4ICwgZGF0YSwgbGVuKTsKIH0KIAogLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuICovCiBzdGF0aWMgdm9pZCBzaGExX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfc2hhMV9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0cnVjdCBzMzkwX3NoYTFfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwl1NjQgYml0czsKKwl1bnNpZ25lZCBpbnQgaW5kZXgsIGVuZDsKKwlpbnQgcmV0OwogCiAJLyogbXVzdCBwZXJmb3JtIG1hbnVhbCBwYWRkaW5nICovCi0JcGFkX21lc3NhZ2Uoc2N0eCk7Ci0JY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsIHNjdHgtPmJ1Zl9sZW4pOworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWVuZCA9ICAoaW5kZXggPCA1NikgPyBTSEExX0JMT0NLX1NJWkUgOiAoMiAqIFNIQTFfQkxPQ0tfU0laRSk7CisKKwkvKiBzdGFydCBwYWQgd2l0aCAxICovCisJc2N0eC0+YnVmW2luZGV4XSA9IDB4ODA7CisKKwkvKiBwYWQgd2l0aCB6ZXJvcyAqLworCWluZGV4Kys7CisJbWVtc2V0KHNjdHgtPmJ1ZiArIGluZGV4LCAweDAwLCBlbmQgLSBpbmRleCAtIDgpOworCisJLyogYXBwZW5kIG1lc3NhZ2UgbGVuZ3RoICovCisJYml0cyA9IHNjdHgtPmNvdW50ICogODsKKwltZW1jcHkoc2N0eC0+YnVmICsgZW5kIC0gOCwgJmJpdHMsIHNpemVvZihiaXRzKSk7CisKKwlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMSwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwgZW5kKTsKKwlCVUdfT04ocmV0ICE9IGVuZCk7CisKIAkvKiBjb3B5IGRpZ2VzdCB0byBvdXQgKi8KIAltZW1jcHkob3V0LCBzY3R4LT5zdGF0ZSwgU0hBMV9ESUdFU1RfU0laRSk7CisKIAkvKiB3aXBlIGNvbnRleHQgKi8KIAltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mICpzY3R4KTsKIH0KQEAgLTEyOCw3ICsxMjksNyBAQAogCS5jcmFfcHJpb3JpdHkJPQlDUllQVF9TMzkwX1BSSU9SSVRZLAogCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfRElHRVNULAogCS5jcmFfYmxvY2tzaXplCT0JU0hBMV9CTE9DS19TSVpFLAotCS5jcmFfY3R4c2l6ZQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCksCisJLmNyYV9jdHhzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzMzkwX3NoYTFfY3R4KSwKIAkuY3JhX21vZHVsZQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAk9CUxJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCiAJLmNyYV91CQk9CXsgLmRpZ2VzdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYwppbmRleCA3ODQzNmM2Li4yY2VkMzMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIFNIQTI1Nl9CTE9DS19TSVpFCTY0CiAKIHN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggewotCXU2NCBjb3VudDsKKwl1NjQgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCAqLwogCXUzMiBzdGF0ZVs4XTsKIAl1OCBidWZbMiAqIFNIQTI1Nl9CTE9DS19TSVpFXTsKIH07CkBAIC01NCwxMCArNTQsOSBAQAogCWludCByZXQ7CiAKIAkvKiBob3cgbXVjaCBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXI/ICovCi0JaW5kZXggPSBzY3R4LT5jb3VudCAvIDggJiAweDNmOworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwogCi0JLyogdXBkYXRlIG1lc3NhZ2UgYml0IGxlbmd0aCAqLwotCXNjdHgtPmNvdW50ICs9IGxlbiAqIDg7CisJc2N0eC0+Y291bnQgKz0gbGVuOwogCiAJaWYgKChpbmRleCArIGxlbikgPCBTSEEyNTZfQkxPQ0tfU0laRSkKIAkJZ290byBzdG9yZTsKQEAgLTg3LDEyICs4NiwxNyBAQAogCQltZW1jcHkoc2N0eC0+YnVmICsgaW5kZXggLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBwYWRfbWVzc2FnZShzdHJ1Y3QgczM5MF9zaGEyNTZfY3R4KiBzY3R4KQorLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QgKi8KK3N0YXRpYyB2b2lkIHNoYTI1Nl9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCWludCBpbmRleCwgZW5kOworCXN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXU2NCBiaXRzOworCXVuc2lnbmVkIGludCBpbmRleCwgZW5kOworCWludCByZXQ7CiAKLQlpbmRleCA9IHNjdHgtPmNvdW50IC8gOCAmIDB4M2Y7Ci0JZW5kID0gaW5kZXggPCA1NiA/IFNIQTI1Nl9CTE9DS19TSVpFIDogMiAqIFNIQTI1Nl9CTE9DS19TSVpFOworCS8qIG11c3QgcGVyZm9ybSBtYW51YWwgcGFkZGluZyAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWVuZCA9IChpbmRleCA8IDU2KSA/IFNIQTI1Nl9CTE9DS19TSVpFIDogKDIgKiBTSEEyNTZfQkxPQ0tfU0laRSk7CiAKIAkvKiBzdGFydCBwYWQgd2l0aCAxICovCiAJc2N0eC0+YnVmW2luZGV4XSA9IDB4ODA7CkBAIC0xMDIsMjEgKzEwNiwxMSBAQAogCW1lbXNldChzY3R4LT5idWYgKyBpbmRleCwgMHgwMCwgZW5kIC0gaW5kZXggLSA4KTsKIAogCS8qIGFwcGVuZCBtZXNzYWdlIGxlbmd0aCAqLwotCW1lbWNweShzY3R4LT5idWYgKyBlbmQgLSA4LCAmc2N0eC0+Y291bnQsIHNpemVvZiBzY3R4LT5jb3VudCk7CisJYml0cyA9IHNjdHgtPmNvdW50ICogODsKKwltZW1jcHkoc2N0eC0+YnVmICsgZW5kIC0gOCwgJmJpdHMsIHNpemVvZihiaXRzKSk7CiAKLQlzY3R4LT5jb3VudCA9IGVuZCAqIDg7Ci19Ci0KLS8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0ICovCi1zdGF0aWMgdm9pZCBzaGEyNTZfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLXsKLQlzdHJ1Y3QgczM5MF9zaGEyNTZfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQotCS8qIG11c3QgcGVyZm9ybSBtYW51YWwgcGFkZGluZyAqLwotCXBhZF9tZXNzYWdlKHNjdHgpOwotCi0JY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwKLQkJCXNjdHgtPmNvdW50IC8gOCk7CisJcmV0ID0gY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwgZW5kKTsKKwlCVUdfT04ocmV0ICE9IGVuZCk7CiAKIAkvKiBjb3B5IGRpZ2VzdCB0byBvdXQgKi8KIAltZW1jcHkob3V0LCBzY3R4LT5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9kZWZjb25maWcgYi9hcmNoL3MzOTAvZGVmY29uZmlnCmluZGV4IDc0MWQyYmJiLi4wZTRkYThhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTEyLDYgKzEyLDcgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19OT19JT01FTT15CiBDT05GSUdfUzM5MD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpAQCAtMTY2LDYgKzE2Nyw3IEBACiBDT05GSUdfTk9fSURMRV9IWl9JTklUPXkKIENPTkZJR19TMzkwX0hZUEZTX0ZTPXkKIENPTkZJR19LRVhFQz15CisjIENPTkZJR19aRkNQRFVNUCBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29ya2luZwpAQCAtNzA1LDYgKzcwNyw3IEBACiBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVA9eQogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQogIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDU0OTJkMjUuLjMxOTVkMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAogb2JqLXkJOj0gIGJpdG1hcC5vIHRyYXBzLm8gdGltZS5vIHByb2Nlc3MubyBiYXNlLm8gZWFybHkubyBcCiAgICAgICAgICAgICBzZXR1cC5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBcCi0JICAgIHNlbWFwaG9yZS5vIHMzOTBfZXh0Lm8gZGVidWcubyBpcnEubyBpcGwubworCSAgICBzZW1hcGhvcmUubyBzMzkwX2V4dC5vIGRlYnVnLm8gaXJxLm8gaXBsLm8gZGlzLm8KIAogb2JqLXkJKz0gJChpZiAkKENPTkZJR182NEJJVCksZW50cnk2NC5vLGVudHJ5Lm8pCiBvYmoteQkrPSAkKGlmICQoQ09ORklHXzY0QklUKSxyZWlwbDY0Lm8scmVpcGwubykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDY2NGM2NjkuLjUyMzZmZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNDk1LDI5ICs0OTUsMzQgQEAKICAqIHN5czMyX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0gYWZ0ZXIgdGhlIGFzbSBzdHViIGhhcyBzZXQKICAqIHRoaW5ncyB1cCBmb3IgdXMuICBUaGlzIHNob3VsZCBiYXNpY2FsbHkgZG8gd2hhdCBJIHdhbnQgaXQgdG8uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzMzJfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzMzJfZXhlY3ZlKHZvaWQpCiB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgY2hhciAqIGZpbGVuYW1lOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCWNoYXIgKmZpbGVuYW1lOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCWludCByYzsKIAotICAgICAgICBmaWxlbmFtZSA9IGdldG5hbWUoY29tcGF0X3B0cihyZWdzLm9yaWdfZ3ByMikpOwotICAgICAgICBlcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwotICAgICAgICBpZiAoSVNfRVJSKGZpbGVuYW1lKSkKKwlmaWxlbmFtZSA9IGdldG5hbWUoY29tcGF0X3B0cihyZWdzLT5vcmlnX2dwcjIpKTsKKwlpZiAoSVNfRVJSKGZpbGVuYW1lKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgZXJyb3IgPSBjb21wYXRfZG9fZXhlY3ZlKGZpbGVuYW1lLCBjb21wYXRfcHRyKHJlZ3MuZ3Byc1szXSksCi0JCQkJIGNvbXBhdF9wdHIocmVncy5ncHJzWzRdKSwgJnJlZ3MpOwotCWlmIChlcnJvciA9PSAwKQotCXsKLQkJdGFza19sb2NrKGN1cnJlbnQpOwotCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKLQkJdGFza191bmxvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYz0wOwotCQlhc20gdm9sYXRpbGUoInNmcGMgJTAsMCIgOiA6ICJkIiAoMCkpOwogCX0KKwlyYyA9IGNvbXBhdF9kb19leGVjdmUoZmlsZW5hbWUsIGNvbXBhdF9wdHIocmVncy0+Z3Byc1szXSksCisJCQkgICAgICBjb21wYXRfcHRyKHJlZ3MtPmdwcnNbNF0pLCByZWdzKTsKKwlpZiAocmMpIHsKKwkJcmVzdWx0ID0gcmM7CisJCWdvdG8gb3V0X3B1dG5hbWU7CisJfQorCXRhc2tfbG9jayhjdXJyZW50KTsKKwljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGM9MDsKKwlhc20gdm9sYXRpbGUoInNmcGMgJTAsMCIgOiA6ICJkIiAoMCkpOworCXJlc3VsdCA9IHJlZ3MtPmdwcnNbMl07CitvdXRfcHV0bmFtZToKICAgICAgICAgcHV0bmFtZShmaWxlbmFtZSk7CiBvdXQ6Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTkxOCwxOSArOTIzLDIwIEBACiAJcmV0dXJuIHN5c193cml0ZShmZCwgYnVmLCBjb3VudCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9jbG9uZShzdHJ1Y3QgcHRfcmVncyByZWdzKQorYXNtbGlua2FnZSBsb25nIHN5czMyX2Nsb25lKHZvaWQpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIG5ld3NwOwogCWludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsICpjaGlsZF90aWRwdHI7CiAKLSAgICAgICAgY2xvbmVfZmxhZ3MgPSByZWdzLmdwcnNbM10gJiAweGZmZmZmZmZmVUw7Ci0gICAgICAgIG5ld3NwID0gcmVncy5vcmlnX2dwcjIgJiAweDdmZmZmZmZmVUw7Ci0JcGFyZW50X3RpZHB0ciA9IGNvbXBhdF9wdHIocmVncy5ncHJzWzRdKTsKLQljaGlsZF90aWRwdHIgPSBjb21wYXRfcHRyKHJlZ3MuZ3Byc1s1XSk7Ci0gICAgICAgIGlmICghbmV3c3ApCi0gICAgICAgICAgICAgICAgbmV3c3AgPSByZWdzLmdwcnNbMTVdOwotICAgICAgICByZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLAorCWNsb25lX2ZsYWdzID0gcmVncy0+Z3Byc1szXSAmIDB4ZmZmZmZmZmZVTDsKKwluZXdzcCA9IHJlZ3MtPm9yaWdfZ3ByMiAmIDB4N2ZmZmZmZmZVTDsKKwlwYXJlbnRfdGlkcHRyID0gY29tcGF0X3B0cihyZWdzLT5ncHJzWzRdKTsKKwljaGlsZF90aWRwdHIgPSBjb21wYXRfcHRyKHJlZ3MtPmdwcnNbNV0pOworCWlmICghbmV3c3ApCisJCW5ld3NwID0gcmVncy0+Z3Byc1sxNV07CisJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLAogCQkgICAgICAgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCA4ODdhOTg4Li44MGE1NGEwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMjU1LDkgKzI1NSw5IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZwotc3lzMzJfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdDMyIF9fdXNlciAqdXNzLCBzdGFja190MzIgX191c2VyICp1b3NzLAotCQkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3lzMzJfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdDMyIF9fdXNlciAqdXNzLCBzdGFja190MzIgX191c2VyICp1b3NzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXN0YWNrX3Qga3NzLCBrb3NzOwogCXVuc2lnbmVkIGxvbmcgc3Nfc3A7CiAJaW50IHJldCwgZXJyID0gMDsKQEAgLTM0NCw4ICszNDQsOSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBsb25nIHN5czMyX3NpZ3JldHVybih2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXNpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZTMyIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOwogCXNpZ3NldF90IHNldDsKIApAQCAtMzcwLDggKzM3MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzMzJfcnRfc2lncmV0dXJuKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcnRfc2lnZnJhbWUzMiBfX3VzZXIgKmZyYW1lID0gKHJ0X3NpZ2ZyYW1lMzIgX191c2VyICopcmVncy0+Z3Byc1sxNV07CiAJc2lnc2V0X3Qgc2V0OwogCXN0YWNrX3Qgc3Q7CkBAIC00MDcsOCArNDA5LDggQEAKIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKIAogYmFkZnJhbWU6Ci0gICAgICAgIGZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKLSAgICAgICAgcmV0dXJuIDA7CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOwogfQkKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZGlzLmMgYi9hcmNoL3MzOTAva2VybmVsL2Rpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmFmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2Rpcy5jCkBAIC0wLDAgKzEsMTI3OCBAQAorLyoKKyAqIGFyY2gvczM5MC9rZXJuZWwvZGlzLmMKKyAqCisgKiBEaXNhc3NlbWJsZSBzMzkwIGluc3RydWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9tYXRoZW11Lmg+CisjaW5jbHVkZSA8YXNtL2NwY21kLmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vZGVidWcuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKKyNpZm5kZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIE9ORUxPTkcgIiUwOGx4OiAiCisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KKyNkZWZpbmUgT05FTE9ORyAiJTAxNmx4OiAiCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCisKKyNkZWZpbmUgT1BFUkFORF9HUFIJMHgxCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyAlcnggKi8KKyNkZWZpbmUgT1BFUkFORF9GUFIJMHgyCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyAlZnggKi8KKyNkZWZpbmUgT1BFUkFORF9BUgkweDQJLyogT3BlcmFuZCBwcmludGVkIGFzICVheCAqLworI2RlZmluZSBPUEVSQU5EX0NSCTB4OAkvKiBPcGVyYW5kIHByaW50ZWQgYXMgJWN4ICovCisjZGVmaW5lIE9QRVJBTkRfRElTUAkweDEwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgT1BFUkFORF9CQVNFCTB4MjAJLyogT3BlcmFuZCBwcmludGVkIGFzIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9JTkRFWAkweDQwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBpbmRleCByZWdpc3RlciAqLworI2RlZmluZSBPUEVSQU5EX1BDUkVMCTB4ODAJLyogT3BlcmFuZCBwcmludGVkIGFzIHBjLXJlbGF0aXZlIHN5bWJvbCAqLworI2RlZmluZSBPUEVSQU5EX1NJR05FRAkweDEwMAkvKiBPcGVyYW5kIHByaW50ZWQgYXMgc2lnbmVkIHZhbHVlICovCisjZGVmaW5lIE9QRVJBTkRfTEVOR1RICTB4MjAwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBsZW5ndGggKCsxKSAqLworCitlbnVtIHsKKwlVTlVTRUQsCS8qIEluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kIGxpc3QgKi8KKwlSXzgsCS8qIEdQUiBzdGFydGluZyBhdCBwb3NpdGlvbiA4ICovCisJUl8xMiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJUl8xNiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDE2ICovCisJUl8yMCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDIwICovCisJUl8yNCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI0ICovCisJUl8yOCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI4ICovCisJUl8zMiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDMyICovCisJRl84LAkvKiBGUFIgc3RhcnRpbmcgYXQgcG9zaXRpb24gOCAqLworCUZfMTIsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxMiAqLworCUZfMTYsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxNiAqLworCUZfMjAsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxNiAqLworCUZfMjQsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAyNCAqLworCUZfMjgsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAyOCAqLworCUZfMzIsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAzMiAqLworCUFfOCwJLyogQWNjZXNzIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gOCAqLworCUFfMTIsCS8qIEFjY2VzcyByZWcuIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJQV8yNCwJLyogQWNjZXNzIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gMjQgKi8KKwlBXzI4LAkvKiBBY2Nlc3MgcmVnLiBzdGFydGluZyBhdCBwb3NpdGlvbiAyOCAqLworCUNfOCwJLyogQ29udHJvbCByZWcuIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlDXzEyLAkvKiBDb250cm9sIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gMTIgKi8KKwlCXzE2LAkvKiBCYXNlIHJlZ2lzdGVyIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDE2ICovCisJQl8zMiwJLyogQmFzZSByZWdpc3RlciBzdGFydGluZyBhdCBwb3NpdGlvbiAzMiAqLworCVhfMTIsCS8qIEluZGV4IHJlZ2lzdGVyIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJRF8yMCwJLyogRGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDIwICovCisJRF8zNiwJLyogRGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDM2ICovCisJRDIwXzIwLAkvKiAyMCBiaXQgZGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IDIwICovCisJTDRfOCwJLyogNCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlMNF8xMiwJLyogNCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJTDhfOCwJLyogOCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlVNF84LAkvKiA0IGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCA4ICovCisJVTRfMTIsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDEyICovCisJVTRfMTYsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDE2ICovCisJVTRfMjAsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDIwICovCisJVThfOCwJLyogOCBiaXQgdW5zaWduZWQgdmFsdWUgc3RhcnRpbmcgYXQgOCAqLworCVU4XzE2LAkvKiA4IGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCUkxNl8xNiwJLyogMTYgYml0IHNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCVUxNl8xNiwJLyogMTYgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDE2ICovCisJSjE2XzE2LAkvKiBQQyByZWxhdGl2ZSBqdW1wIG9mZnNldCBhdCAxNiAqLworCUozMl8xNiwJLyogUEMgcmVsYXRpdmUgbG9uZyBvZmZzZXQgYXQgMTYgKi8KKwlJMzJfMTYsCS8qIDMyIGJpdCBzaWduZWQgdmFsdWUgc3RhcnRpbmcgYXQgMTYgKi8KKwlVMzJfMTYsCS8qIDMyIGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCU1fMTYsCS8qIDQgYml0IG9wdGlvbmFsIG1hc2sgc3RhcnRpbmcgYXQgMTYgKi8KKwlST18yOCwJLyogb3B0aW9uYWwgR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI4ICovCit9OworCisvKgorICogRW51bWVyYXRpb24gb2YgdGhlIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXRzLgorICogRm9yIGRldGFpbHMgY29uc3VsdCB0aGUgcHJpbmNpcGxlcyBvZiBvcGVyYXRpb24uCisgKi8KK2VudW0geworCUlOU1RSX0lOVkFMSUQsCisJSU5TVFJfRSwgSU5TVFJfUklFX1JSUCwgSU5TVFJfUklMX1JJLCBJTlNUUl9SSUxfUlAsIElOU1RSX1JJTF9SVSwKKwlJTlNUUl9SSUxfVVAsIElOU1RSX1JJX1JJLCBJTlNUUl9SSV9SUCwgSU5TVFJfUklfUlUsIElOU1RSX1JJX1VQLAorCUlOU1RSX1JSRV8wMCwgSU5TVFJfUlJFXzBSLCBJTlNUUl9SUkVfQUEsIElOU1RSX1JSRV9BUiwgSU5TVFJfUlJFX0YwLAorCUlOU1RSX1JSRV9GRiwgSU5TVFJfUlJFX1IwLCBJTlNUUl9SUkVfUkEsIElOU1RSX1JSRV9SRiwgSU5TVFJfUlJFX1JSLAorCUlOU1RSX1JSRV9SUl9PUFQsIElOU1RSX1JSRl9GMEZGLCBJTlNUUl9SUkZfRlVGRiwgSU5TVFJfUlJGX00wUlIsCisJSU5TVFJfUlJGX1IwUlIsIElOU1RSX1JSRl9SVVJSLCBJTlNUUl9SUkZfVTBGRiwgSU5TVFJfUlJGX1UwUkYsCisJSU5TVFJfUlJfRkYsIElOU1RSX1JSX1IwLCBJTlNUUl9SUl9SUiwgSU5TVFJfUlJfVTAsIElOU1RSX1JSX1VSLAorCUlOU1RSX1JTRV9DQ1JELCBJTlNUUl9SU0VfUlJSRCwgSU5TVFJfUlNFX1JVUkQsIElOU1RSX1JTSV9SUlAsCisJSU5TVFJfUlNMX1IwUkQsIElOU1RSX1JTWV9BQVJELCBJTlNUUl9SU1lfQ0NSRCwgSU5TVFJfUlNZX1JSUkQsCisJSU5TVFJfUlNZX1JVUkQsIElOU1RSX1JTX0FBUkQsIElOU1RSX1JTX0NDUkQsIElOU1RSX1JTX1IwUkQsCisJSU5TVFJfUlNfUlJSRCwgSU5TVFJfUlNfUlVSRCwgSU5TVFJfUlhFX0ZSUkQsIElOU1RSX1JYRV9SUlJELAorCUlOU1RSX1JYRl9GUlJERiwgSU5TVFJfUlhZX0ZSUkQsIElOU1RSX1JYWV9SUlJELCBJTlNUUl9SWF9GUlJELAorCUlOU1RSX1JYX1JSUkQsIElOU1RSX1JYX1VSUkQsIElOU1RSX1NJWV9VUkQsIElOU1RSX1NJX1VSRCwKKwlJTlNUUl9TU0VfUkRSRCwgSU5TVFJfU1NGX1JSRFJELCBJTlNUUl9TU19MMFJEUkQsIElOU1RSX1NTX0xJUkRSRCwKKwlJTlNUUl9TU19MTFJEUkQsIElOU1RSX1NTX1JSUkRSRCwgSU5TVFJfU1NfUlJSRFJEMiwgSU5TVFJfU1NfUlJSRFJEMywKKwlJTlNUUl9TXzAwLCBJTlNUUl9TX1JELAorfTsKKworc3RydWN0IG9wZXJhbmQgeworCWludCBiaXRzOwkJLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAqLworCWludCBzaGlmdDsJCS8qIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdC4gKi8KKwlpbnQgZmxhZ3M7CQkvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gKi8KK307CisKK3N0cnVjdCBpbnNuIHsKKwljb25zdCBjaGFyIG5hbWVbNV07CisJdW5zaWduZWQgY2hhciBvcGZyYWc7CisJdW5zaWduZWQgY2hhciBmb3JtYXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wZXJhbmQgb3BlcmFuZHNbXSA9Cit7CisJW1VOVVNFRF0gID0geyAwLCAwLCAwIH0sCisJW1JfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfR1BSIH0sCisJW1JfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0dQUiB9LAorCVtSXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9HUFIgfSwKKwlbUl8yMF0JID0geyAgNCwgMjAsIE9QRVJBTkRfR1BSIH0sCisJW1JfMjRdCSA9IHsgIDQsIDI0LCBPUEVSQU5EX0dQUiB9LAorCVtSXzI4XQkgPSB7ICA0LCAyOCwgT1BFUkFORF9HUFIgfSwKKwlbUl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfR1BSIH0sCisJW0ZfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfRlBSIH0sCisJW0ZfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0ZQUiB9LAorCVtGXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9GUFIgfSwKKwlbRl8yMF0JID0geyAgNCwgMTYsIE9QRVJBTkRfRlBSIH0sCisJW0ZfMjRdCSA9IHsgIDQsIDI0LCBPUEVSQU5EX0ZQUiB9LAorCVtGXzI4XQkgPSB7ICA0LCAyOCwgT1BFUkFORF9GUFIgfSwKKwlbRl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfRlBSIH0sCisJW0FfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfQVIgfSwKKwlbQV8xMl0JID0geyAgNCwgMTIsIE9QRVJBTkRfQVIgfSwKKwlbQV8yNF0JID0geyAgNCwgMjQsIE9QRVJBTkRfQVIgfSwKKwlbQV8yOF0JID0geyAgNCwgMjgsIE9QRVJBTkRfQVIgfSwKKwlbQ184XQkgPSB7ICA0LCAgOCwgT1BFUkFORF9DUiB9LAorCVtDXzEyXQkgPSB7ICA0LCAxMiwgT1BFUkFORF9DUiB9LAorCVtCXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9CQVNFIHwgT1BFUkFORF9HUFIgfSwKKwlbQl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfQkFTRSB8IE9QRVJBTkRfR1BSIH0sCisJW1hfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0lOREVYIHwgT1BFUkFORF9HUFIgfSwKKwlbRF8yMF0JID0geyAxMiwgMjAsIE9QRVJBTkRfRElTUCB9LAorCVtEXzM2XQkgPSB7IDEyLCAzNiwgT1BFUkFORF9ESVNQIH0sCisJW0QyMF8yMF0gPSB7IDIwLCAyMCwgT1BFUkFORF9ESVNQIHwgT1BFUkFORF9TSUdORUQgfSwKKwlbTDRfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfTEVOR1RIIH0sCisJW0w0XzEyXSAgPSB7ICA0LCAxMiwgT1BFUkFORF9MRU5HVEggfSwKKwlbTDhfOF0JID0geyAgOCwgIDgsIE9QRVJBTkRfTEVOR1RIIH0sCisJW1U0XzhdCSA9IHsgIDQsICA4LCAwIH0sCisJW1U0XzEyXSAgPSB7ICA0LCAxMiwgMCB9LAorCVtVNF8xNl0gID0geyAgNCwgMTYsIDAgfSwKKwlbVTRfMjBdICA9IHsgIDQsIDIwLCAwIH0sCisJW1U4XzhdCSA9IHsgIDgsICA4LCAwIH0sCisJW1U4XzE2XSAgPSB7ICA4LCAxNiwgMCB9LAorCVtJMTZfMTZdID0geyAxNiwgMTYsIE9QRVJBTkRfU0lHTkVEIH0sCisJW1UxNl8xNl0gPSB7IDE2LCAxNiwgMCB9LAorCVtKMTZfMTZdID0geyAxNiwgMTYsIE9QRVJBTkRfUENSRUwgfSwKKwlbSjMyXzE2XSA9IHsgMzIsIDE2LCBPUEVSQU5EX1BDUkVMIH0sCisJW0kzMl8xNl0gPSB7IDMyLCAxNiwgT1BFUkFORF9TSUdORUQgfSwKKwlbVTMyXzE2XSA9IHsgMzIsIDE2LCAwIH0sCisJW01fMTZdCSA9IHsgIDQsIDE2LCAwIH0sCisJW1JPXzI4XSAgPSB7ICA0LCAyOCwgT1BFUkFORF9HUFIgfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZm9ybWF0c1tdWzddID0geworCVtJTlNUUl9FXQkgID0geyAweGZmLCAwLDAsMCwwLDAsMCB9LAkgICAgICAgLyogZS5nLiBwciAgICAqLworCVtJTlNUUl9SSUVfUlJQXQkgID0geyAweGZmLCBSXzgsUl8xMixKMTZfMTYsMCwwLDAgfSwgICAvKiBlLmcuIGJyeGhnICovCisJW0lOU1RSX1JJTF9SUF0JICA9IHsgMHgwZiwgUl84LEozMl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBicmFzbCAqLworCVtJTlNUUl9SSUxfVVBdCSAgPSB7IDB4MGYsIFU0XzgsSjMyXzE2LDAsMCwwLDAgfSwgICAgIC8qIGUuZy4gYnJjbCAgKi8KKwlbSU5TVFJfUklMX1JJXQkgID0geyAweDBmLCBSXzgsSTMyXzE2LDAsMCwwLDAgfSwgICAgICAvKiBlLmcuIGFmaSAgICovCisJW0lOU1RSX1JJTF9SVV0JICA9IHsgMHgwZiwgUl84LFUzMl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBhbGZpICAqLworCVtJTlNUUl9SSV9SSV0JICA9IHsgMHgwZiwgUl84LEkxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBhaGkgICAqLworCVtJTlNUUl9SSV9SUF0JICA9IHsgMHgwZiwgUl84LEoxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBicmN0ICAqLworCVtJTlNUUl9SSV9SVV0JICA9IHsgMHgwZiwgUl84LFUxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiB0bWwgICAqLworCVtJTlNUUl9SSV9VUF0JICA9IHsgMHgwZiwgVTRfOCxKMTZfMTYsMCwwLDAsMCB9LCAgICAgLyogZS5nLiBicmMgICAqLworCVtJTlNUUl9SUkVfMDBdCSAgPSB7IDB4ZmYsIDAsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIHBhbGIgICovCisJW0lOU1RSX1JSRV8wUl0JICA9IHsgMHhmZiwgUl8yOCwwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gdGIgICAgKi8KKwlbSU5TVFJfUlJFX0FBXQkgID0geyAweGZmLCBBXzI0LEFfMjgsMCwwLDAsMCB9LCAgICAgICAvKiBlLmcuIGNweWEgICovCisJW0lOU1RSX1JSRV9BUl0JICA9IHsgMHhmZiwgQV8yNCxSXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBzYXIgICAqLworCVtJTlNUUl9SUkVfRjBdCSAgPSB7IDB4ZmYsIEZfMjQsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIHNxZXIgICovCisJW0lOU1RSX1JSRV9GRl0JICA9IHsgMHhmZiwgRl8yNCxGXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBkZWJyICAqLworCVtJTlNUUl9SUkVfUjBdCSAgPSB7IDB4ZmYsIFJfMjQsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIGlwbSAgICovCisJW0lOU1RSX1JSRV9SQV0JICA9IHsgMHhmZiwgUl8yNCxBXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBlYXIgICAqLworCVtJTlNUUl9SUkVfUkZdCSAgPSB7IDB4ZmYsIFJfMjQsRl8yOCwwLDAsMCwwIH0sICAgICAgIC8qIGUuZy4gY2VmYnIgKi8KKwlbSU5TVFJfUlJFX1JSXQkgID0geyAweGZmLCBSXzI0LFJfMjgsMCwwLDAsMCB9LCAgICAgICAvKiBlLmcuIGx1cmEgICovCisJW0lOU1RSX1JSRV9SUl9PUFRdPSB7IDB4ZmYsIFJfMjQsUk9fMjgsMCwwLDAsMCB9LCAgICAgIC8qIGVmcGMsIHNmcGMgKi8KKwlbSU5TVFJfUlJGX0YwRkZdICA9IHsgMHhmZiwgRl8xNixGXzI0LEZfMjgsMCwwLDAgfSwgICAgLyogZS5nLiBtYWRiciAqLworCVtJTlNUUl9SUkZfRlVGRl0gID0geyAweGZmLCBGXzI0LEZfMTYsRl8yOCxVNF8yMCwwLDAgfSwvKiBlLmcuIGRpZGJyICovCisJW0lOU1RSX1JSRl9SVVJSXSAgPSB7IDB4ZmYsIFJfMjQsUl8yOCxSXzE2LFU0XzIwLDAsMCB9LC8qIGUuZy4gLmluc24gKi8KKwlbSU5TVFJfUlJGX1IwUlJdICA9IHsgMHhmZiwgUl8yNCxSXzI4LFJfMTYsMCwwLDAgfSwgICAgLyogZS5nLiBpZHRlICAqLworCVtJTlNUUl9SUkZfVTBGRl0gID0geyAweGZmLCBGXzI0LFU0XzE2LEZfMjgsMCwwLDAgfSwgICAvKiBlLmcuIGZpeHIgICovCisJW0lOU1RSX1JSRl9VMFJGXSAgPSB7IDB4ZmYsIFJfMjQsVTRfMTYsRl8yOCwwLDAsMCB9LCAgIC8qIGUuZy4gY2ZlYnIgKi8KKwlbSU5TVFJfUlJGX00wUlJdICA9IHsgMHhmZiwgUl8yNCxSXzI4LE1fMTYsMCwwLDAgfSwgICAgLyogZS5nLiBzc2tlICAqLworCVtJTlNUUl9SUl9GRl0JICA9IHsgMHhmZiwgRl84LEZfMTIsMCwwLDAsMCB9LCAgICAgICAgLyogZS5nLiBhZHIgICAqLworCVtJTlNUUl9SUl9SMF0JICA9IHsgMHhmZiwgUl84LCAwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gc3BtICAgKi8KKwlbSU5TVFJfUlJfUlJdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLDAsMCwwLDAgfSwgICAgICAgIC8qIGUuZy4gbHIgICAgKi8KKwlbSU5TVFJfUlJfVTBdCSAgPSB7IDB4ZmYsIFU4XzgsIDAsMCwwLDAsMCB9LAkgICAgICAgLyogZS5nLiBzdmMgICAqLworCVtJTlNUUl9SUl9VUl0JICA9IHsgMHhmZiwgVTRfOCxSXzEyLDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBiY3IgICAqLworCVtJTlNUUl9SU0VfUlJSRF0gID0geyAweGZmLCBSXzgsUl8xMixEXzIwLEJfMTYsMCwwIH0sICAvKiBlLmcuIGxtaCAgICovCisJW0lOU1RSX1JTRV9DQ1JEXSAgPSB7IDB4ZmYsIENfOCxDXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbG1oICAgKi8KKwlbSU5TVFJfUlNFX1JVUkRdICA9IHsgMHhmZiwgUl84LFU0XzEyLERfMjAsQl8xNiwwLDAgfSwgLyogZS5nLiBpY21oICAqLworCVtJTlNUUl9SU0xfUjBSRF0gID0geyAweGZmLCBSXzgsRF8yMCxCXzE2LDAsMCwwIH0sICAgICAvKiBlLmcuIHRwICAgICovCisJW0lOU1RSX1JTSV9SUlBdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLEoxNl8xNiwwLDAsMCB9LCAgIC8qIGUuZy4gYnJ4aCAgKi8KKwlbSU5TVFJfUlNZX1JSUkRdICA9IHsgMHhmZiwgUl84LFJfMTIsRDIwXzIwLEJfMTYsMCwwIH0sLyogZS5nLiBzdG15ICAqLworCVtJTlNUUl9SU1lfUlVSRF0gID0geyAweGZmLCBSXzgsVTRfMTIsRDIwXzIwLEJfMTYsMCwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gaWNtaCAgKi8KKwlbSU5TVFJfUlNZX0FBUkRdICA9IHsgMHhmZiwgQV84LEFfMTIsRDIwXzIwLEJfMTYsMCwwIH0sLyogZS5nLiBsYW15ICAqLworCVtJTlNUUl9SU1lfQ0NSRF0gID0geyAweGZmLCBDXzgsQ18xMixEMjBfMjAsQl8xNiwwLDAgfSwvKiBlLmcuIGxhbXkgICovCisJW0lOU1RSX1JTX0FBUkRdCSAgPSB7IDB4ZmYsIEFfOCxBXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbGFtICAgKi8KKwlbSU5TVFJfUlNfQ0NSRF0JICA9IHsgMHhmZiwgQ184LENfMTIsRF8yMCxCXzE2LDAsMCB9LCAgLyogZS5nLiBsY3RsICAqLworCVtJTlNUUl9SU19SMFJEXQkgID0geyAweGZmLCBSXzgsRF8yMCxCXzE2LDAsMCwwIH0sICAgICAvKiBlLmcuIHNsbCAgICovCisJW0lOU1RSX1JTX1JSUkRdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gY3MgICAgKi8KKwlbSU5TVFJfUlNfUlVSRF0JICA9IHsgMHhmZiwgUl84LFU0XzEyLERfMjAsQl8xNiwwLDAgfSwgLyogZS5nLiBpY20gICAqLworCVtJTlNUUl9SWEVfRlJSRF0gID0geyAweGZmLCBGXzgsRF8yMCxYXzEyLEJfMTYsMCwwIH0sICAvKiBlLmcuIGF4YnIgICovCisJW0lOU1RSX1JYRV9SUlJEXSAgPSB7IDB4ZmYsIFJfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbGcgICAgKi8KKwlbSU5TVFJfUlhGX0ZSUkRGXSA9IHsgMHhmZiwgRl8zMixGXzgsRF8yMCxYXzEyLEJfMTYsMCB9LAorCQkJCQkJCSAgICAgICAvKiBlLmcuIG1hZGIgICovCisJW0lOU1RSX1JYWV9SUlJEXSAgPSB7IDB4ZmYsIFJfOCxEMjBfMjAsWF8xMixCXzE2LDAsMCB9LC8qIGUuZy4gbHkgICAgKi8KKwlbSU5TVFJfUlhZX0ZSUkRdICA9IHsgMHhmZiwgRl84LEQyMF8yMCxYXzEyLEJfMTYsMCwwIH0sLyogZS5nLiBsZXkgICAqLworCVtJTlNUUl9SWF9GUlJEXQkgID0geyAweGZmLCBGXzgsRF8yMCxYXzEyLEJfMTYsMCwwIH0sICAvKiBlLmcuIGFlICAgICovCisJW0lOU1RSX1JYX1JSUkRdCSAgPSB7IDB4ZmYsIFJfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbCAgICAgKi8KKwlbSU5TVFJfUlhfVVJSRF0JICA9IHsgMHgwMCwgVTRfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgLyogZS5nLiBiYyAgICAqLworCVtJTlNUUl9TSV9VUkRdCSAgPSB7IDB4MDAsIERfMjAsQl8xNixVOF84LDAsMCwwIH0sICAgIC8qIGUuZy4gY2xpICAgKi8KKwlbSU5TVFJfU0lZX1VSRF0JICA9IHsgMHhmZiwgRDIwXzIwLEJfMTYsVThfOCwwLDAsMCB9LCAgLyogZS5nLiB0bXkgICAqLworCVtJTlNUUl9TU0VfUkRSRF0gID0geyAweGZmLCBEXzIwLEJfMTYsRF8zNixCXzMyLDAsMCB9LCAvKiBlLmcuIG12c2RrICovCisJW0lOU1RSX1NTX0wwUkRSRF0gPSB7IDB4ZmYsIERfMjAsTDhfOCxCXzE2LERfMzYsQl8zMiwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbXZjICAgKi8KKwlbSU5TVFJfU1NfTElSRFJEXSA9IHsgMHhmZiwgRF8yMCxMNF84LEJfMTYsRF8zNixCXzMyLFU0XzEyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gc3JwICAgKi8KKwlbSU5TVFJfU1NfTExSRFJEXSA9IHsgMHhmZiwgRF8yMCxMNF84LEJfMTYsRF8zNixMNF8xMixCXzMyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gcGFjayAgKi8KKwlbSU5TVFJfU1NfUlJSRFJEXSA9IHsgMHhmZiwgRF8yMCxSXzgsQl8xNixEXzM2LEJfMzIsUl8xMiB9LAorCQkJCQkJCSAgICAgICAvKiBlLmcuIG12Y2sgICovCisJW0lOU1RSX1NTX1JSUkRSRDJdPSB7IDB4ZmYsIFJfOCxEXzIwLEJfMTYsUl8xMixEXzM2LEJfMzIgfSwKKwkJCQkJCQkgICAgICAgLyogZS5nLiBwbG8gICAqLworCVtJTlNUUl9TU19SUlJEUkQzXT0geyAweGZmLCBSXzgsUl8xMixEXzIwLEJfMTYsRF8zNixCXzMyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbG1kICAgKi8KKwlbSU5TVFJfU18wMF0JICA9IHsgMHhmZiwgMCwwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gaHNjaCAgKi8KKwlbSU5TVFJfU19SRF0JICA9IHsgMHhmZiwgRF8yMCxCXzE2LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBscHN3ICAqLworCVtJTlNUUl9TU0ZfUlJEUkRdID0geyAweDAwLCBEXzIwLEJfMTYsRF8zNixCXzMyLFJfOCwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbXZjb3MgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJsbWQiLCAweGVmLCBJTlNUUl9TU19SUlJEUkQzIH0sCisjZW5kaWYKKwl7ICJzcG0iLCAweDA0LCBJTlNUUl9SUl9SMCB9LAorCXsgImJhbHIiLCAweDA1LCBJTlNUUl9SUl9SUiB9LAorCXsgImJjdHIiLCAweDA2LCBJTlNUUl9SUl9SUiB9LAorCXsgImJjciIsIDB4MDcsIElOU1RSX1JSX1VSIH0sCisJeyAic3ZjIiwgMHgwYSwgSU5TVFJfUlJfVTAgfSwKKwl7ICJic20iLCAweDBiLCBJTlNUUl9SUl9SUiB9LAorCXsgImJhc3NtIiwgMHgwYywgSU5TVFJfUlJfUlIgfSwKKwl7ICJiYXNyIiwgMHgwZCwgSU5TVFJfUlJfUlIgfSwKKwl7ICJtdmNsIiwgMHgwZSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJjbGNsIiwgMHgwZiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJscHIiLCAweDEwLCBJTlNUUl9SUl9SUiB9LAorCXsgImxuciIsIDB4MTEsIElOU1RSX1JSX1JSIH0sCisJeyAibHRyIiwgMHgxMiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJsY3IiLCAweDEzLCBJTlNUUl9SUl9SUiB9LAorCXsgIm5yIiwgMHgxNCwgSU5TVFJfUlJfUlIgfSwKKwl7ICJjbHIiLCAweDE1LCBJTlNUUl9SUl9SUiB9LAorCXsgIm9yIiwgMHgxNiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJ4ciIsIDB4MTcsIElOU1RSX1JSX1JSIH0sCisJeyAibHIiLCAweDE4LCBJTlNUUl9SUl9SUiB9LAorCXsgImNyIiwgMHgxOSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJhciIsIDB4MWEsIElOU1RSX1JSX1JSIH0sCisJeyAic3IiLCAweDFiLCBJTlNUUl9SUl9SUiB9LAorCXsgIm1yIiwgMHgxYywgSU5TVFJfUlJfUlIgfSwKKwl7ICJkciIsIDB4MWQsIElOU1RSX1JSX1JSIH0sCisJeyAiYWxyIiwgMHgxZSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJzbHIiLCAweDFmLCBJTlNUUl9SUl9SUiB9LAorCXsgImxwZHIiLCAweDIwLCBJTlNUUl9SUl9GRiB9LAorCXsgImxuZHIiLCAweDIxLCBJTlNUUl9SUl9GRiB9LAorCXsgImx0ZHIiLCAweDIyLCBJTlNUUl9SUl9GRiB9LAorCXsgImxjZHIiLCAweDIzLCBJTlNUUl9SUl9GRiB9LAorCXsgImhkciIsIDB4MjQsIElOU1RSX1JSX0ZGIH0sCisJeyAibGR4ciIsIDB4MjUsIElOU1RSX1JSX0ZGIH0sCisJeyAibHJkciIsIDB4MjUsIElOU1RSX1JSX0ZGIH0sCisJeyAibXhyIiwgMHgyNiwgSU5TVFJfUlJfRkYgfSwKKwl7ICJteGRyIiwgMHgyNywgSU5TVFJfUlJfRkYgfSwKKwl7ICJsZHIiLCAweDI4LCBJTlNUUl9SUl9GRiB9LAorCXsgImNkciIsIDB4MjksIElOU1RSX1JSX0ZGIH0sCisJeyAiYWRyIiwgMHgyYSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJzZHIiLCAweDJiLCBJTlNUUl9SUl9GRiB9LAorCXsgIm1kciIsIDB4MmMsIElOU1RSX1JSX0ZGIH0sCisJeyAiZGRyIiwgMHgyZCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJhd3IiLCAweDJlLCBJTlNUUl9SUl9GRiB9LAorCXsgInN3ciIsIDB4MmYsIElOU1RSX1JSX0ZGIH0sCisJeyAibHBlciIsIDB4MzAsIElOU1RSX1JSX0ZGIH0sCisJeyAibG5lciIsIDB4MzEsIElOU1RSX1JSX0ZGIH0sCisJeyAibHRlciIsIDB4MzIsIElOU1RSX1JSX0ZGIH0sCisJeyAibGNlciIsIDB4MzMsIElOU1RSX1JSX0ZGIH0sCisJeyAiaGVyIiwgMHgzNCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJsZWRyIiwgMHgzNSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJscmVyIiwgMHgzNSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJheHIiLCAweDM2LCBJTlNUUl9SUl9GRiB9LAorCXsgInN4ciIsIDB4MzcsIElOU1RSX1JSX0ZGIH0sCisJeyAibGVyIiwgMHgzOCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJjZXIiLCAweDM5LCBJTlNUUl9SUl9GRiB9LAorCXsgImFlciIsIDB4M2EsIElOU1RSX1JSX0ZGIH0sCisJeyAic2VyIiwgMHgzYiwgSU5TVFJfUlJfRkYgfSwKKwl7ICJtZGVyIiwgMHgzYywgSU5TVFJfUlJfRkYgfSwKKwl7ICJtZXIiLCAweDNjLCBJTlNUUl9SUl9GRiB9LAorCXsgImRlciIsIDB4M2QsIElOU1RSX1JSX0ZGIH0sCisJeyAiYXVyIiwgMHgzZSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJzdXIiLCAweDNmLCBJTlNUUl9SUl9GRiB9LAorCXsgInN0aCIsIDB4NDAsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJsYSIsIDB4NDEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdGMiLCAweDQyLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiaWMiLCAweDQzLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiZXgiLCAweDQ0LCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiYmFsIiwgMHg0NSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImJjdCIsIDB4NDYsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJiYyIsIDB4NDcsIElOU1RSX1JYX1VSUkQgfSwKKwl7ICJsaCIsIDB4NDgsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjaCIsIDB4NDksIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJhaCIsIDB4NGEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzaCIsIDB4NGIsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJtaCIsIDB4NGMsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJiYXMiLCAweDRkLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiY3ZkIiwgMHg0ZSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImN2YiIsIDB4NGYsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdCIsIDB4NTAsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJsYWUiLCAweDUxLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibiIsIDB4NTQsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjbCIsIDB4NTUsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJvIiwgMHg1NiwgSU5TVFJfUlhfUlJSRCB9LAorCXsgIngiLCAweDU3LCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibCIsIDB4NTgsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjIiwgMHg1OSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImEiLCAweDVhLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAicyIsIDB4NWIsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJtIiwgMHg1YywgSU5TVFJfUlhfUlJSRCB9LAorCXsgImQiLCAweDVkLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiYWwiLCAweDVlLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAic2wiLCAweDVmLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAic3RkIiwgMHg2MCwgSU5TVFJfUlhfRlJSRCB9LAorCXsgIm14ZCIsIDB4NjcsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJsZCIsIDB4NjgsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJjZCIsIDB4NjksIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJhZCIsIDB4NmEsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzZCIsIDB4NmIsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJtZCIsIDB4NmMsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJkZCIsIDB4NmQsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJhdyIsIDB4NmUsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzdyIsIDB4NmYsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzdGUiLCAweDcwLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAibXMiLCAweDcxLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibGUiLCAweDc4LCBJTlNUUl9SWF9GUlJEIH0sCisJeyAiY2UiLCAweDc5LCBJTlNUUl9SWF9GUlJEIH0sCisJeyAiYWUiLCAweDdhLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAic2UiLCAweDdiLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAibWRlIiwgMHg3YywgSU5TVFJfUlhfRlJSRCB9LAorCXsgIm1lIiwgMHg3YywgSU5TVFJfUlhfRlJSRCB9LAorCXsgImRlIiwgMHg3ZCwgSU5TVFJfUlhfRlJSRCB9LAorCXsgImF1IiwgMHg3ZSwgSU5TVFJfUlhfRlJSRCB9LAorCXsgInN1IiwgMHg3ZiwgSU5TVFJfUlhfRlJSRCB9LAorCXsgInNzbSIsIDB4ODAsIElOU1RSX1NfUkQgfSwKKwl7ICJscHN3IiwgMHg4MiwgSU5TVFJfU19SRCB9LAorCXsgImRpYWciLCAweDgzLCBJTlNUUl9SU19SUlJEIH0sCisJeyAiYnJ4aCIsIDB4ODQsIElOU1RSX1JTSV9SUlAgfSwKKwl7ICJicnhsZSIsIDB4ODUsIElOU1RSX1JTSV9SUlAgfSwKKwl7ICJieGgiLCAweDg2LCBJTlNUUl9SU19SUlJEIH0sCisJeyAiYnhsZSIsIDB4ODcsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJzcmwiLCAweDg4LCBJTlNUUl9SU19SMFJEIH0sCisJeyAic2xsIiwgMHg4OSwgSU5TVFJfUlNfUjBSRCB9LAorCXsgInNyYSIsIDB4OGEsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzbGEiLCAweDhiLCBJTlNUUl9SU19SMFJEIH0sCisJeyAic3JkbCIsIDB4OGMsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzbGRsIiwgMHg4ZCwgSU5TVFJfUlNfUjBSRCB9LAorCXsgInNyZGEiLCAweDhlLCBJTlNUUl9SU19SMFJEIH0sCisJeyAic2xkYSIsIDB4OGYsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzdG0iLCAweDkwLCBJTlNUUl9SU19SUlJEIH0sCisJeyAidG0iLCAweDkxLCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJtdmkiLCAweDkyLCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJ0cyIsIDB4OTMsIElOU1RSX1NfUkQgfSwKKwl7ICJuaSIsIDB4OTQsIElOU1RSX1NJX1VSRCB9LAorCXsgImNsaSIsIDB4OTUsIElOU1RSX1NJX1VSRCB9LAorCXsgIm9pIiwgMHg5NiwgSU5TVFJfU0lfVVJEIH0sCisJeyAieGkiLCAweDk3LCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJsbSIsIDB4OTgsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJ0cmFjZSIsIDB4OTksIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJsYW0iLCAweDlhLCBJTlNUUl9SU19BQVJEIH0sCisJeyAic3RhbSIsIDB4OWIsIElOU1RSX1JTX0FBUkQgfSwKKwl7ICJtdmNsZSIsIDB4YTgsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJjbGNsZSIsIDB4YTksIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJzdG5zbSIsIDB4YWMsIElOU1RSX1NJX1VSRCB9LAorCXsgInN0b3NtIiwgMHhhZCwgSU5TVFJfU0lfVVJEIH0sCisJeyAic2lncCIsIDB4YWUsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJtYyIsIDB4YWYsIElOU1RSX1NJX1VSRCB9LAorCXsgImxyYSIsIDB4YjEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdGN0bCIsIDB4YjYsIElOU1RSX1JTX0NDUkQgfSwKKwl7ICJsY3RsIiwgMHhiNywgSU5TVFJfUlNfQ0NSRCB9LAorCXsgImNzIiwgMHhiYSwgSU5TVFJfUlNfUlJSRCB9LAorCXsgImNkcyIsIDB4YmIsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJjbG0iLCAweGJkLCBJTlNUUl9SU19SVVJEIH0sCisJeyAic3RjbSIsIDB4YmUsIElOU1RSX1JTX1JVUkQgfSwKKwl7ICJpY20iLCAweGJmLCBJTlNUUl9SU19SVVJEIH0sCisJeyAibXZuIiwgMHhkMSwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZjIiwgMHhkMiwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZ6IiwgMHhkMywgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibmMiLCAweGQ0LCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJjbGMiLCAweGQ1LCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJvYyIsIDB4ZDYsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgInhjIiwgMHhkNywgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZjayIsIDB4ZDksIElOU1RSX1NTX1JSUkRSRCB9LAorCXsgIm12Y3AiLCAweGRhLCBJTlNUUl9TU19SUlJEUkQgfSwKKwl7ICJtdmNzIiwgMHhkYiwgSU5TVFJfU1NfUlJSRFJEIH0sCisJeyAidHIiLCAweGRjLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJ0cnQiLCAweGRkLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJlZCIsIDB4ZGUsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgImVkbWsiLCAweGRmLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJwa3UiLCAweGUxLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJ1bnBrdSIsIDB4ZTIsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgIm12Y2luIiwgMHhlOCwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAicGthIiwgMHhlOSwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAidW5wa2EiLCAweGVhLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJwbG8iLCAweGVlLCBJTlNUUl9TU19SUlJEUkQyIH0sCisJeyAic3JwIiwgMHhmMCwgSU5TVFJfU1NfTElSRFJEIH0sCisJeyAibXZvIiwgMHhmMSwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAicGFjayIsIDB4ZjIsIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgInVucGsiLCAweGYzLCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJ6YXAiLCAweGY4LCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJjcCIsIDB4ZjksIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgImFwIiwgMHhmYSwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAic3AiLCAweGZiLCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJtcCIsIDB4ZmMsIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgImRwIiwgMHhmZCwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlXzAxW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAic2FtNjQiLCAweDBlLCBJTlNUUl9FIH0sCisjZW5kaWYKKwl7ICJwciIsIDB4MDEsIElOU1RSX0UgfSwKKwl7ICJ1cHQiLCAweDAyLCBJTlNUUl9FIH0sCisJeyAic2NrcGYiLCAweDA3LCBJTlNUUl9FIH0sCisJeyAidGFtIiwgMHgwYiwgSU5TVFJfRSB9LAorCXsgInNhbTI0IiwgMHgwYywgSU5TVFJfRSB9LAorCXsgInNhbTMxIiwgMHgwZCwgSU5TVFJfRSB9LAorCXsgInRyYXAyIiwgMHhmZiwgSU5TVFJfRSB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9hNVtdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgImlpaGgiLCAweDAwLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpaGwiLCAweDAxLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpbGgiLCAweDAyLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpbGwiLCAweDAzLCBJTlNUUl9SSV9SVSB9LAorCXsgIm5paGgiLCAweDA0LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5paGwiLCAweDA1LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5pbGgiLCAweDA2LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5pbGwiLCAweDA3LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9paGgiLCAweDA4LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9paGwiLCAweDA5LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9pbGgiLCAweDBhLCBJTlNUUl9SSV9SVSB9LAorCXsgIm9pbGwiLCAweDBiLCBJTlNUUl9SSV9SVSB9LAorCXsgImxsaWhoIiwgMHgwYywgSU5TVFJfUklfUlUgfSwKKwl7ICJsbGlobCIsIDB4MGQsIElOU1RSX1JJX1JVIH0sCisJeyAibGxpbGgiLCAweDBlLCBJTlNUUl9SSV9SVSB9LAorCXsgImxsaWxsIiwgMHgwZiwgSU5TVFJfUklfUlUgfSwKKyNlbmRpZgorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9hN1tdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgInRtaGgiLCAweDAyLCBJTlNUUl9SSV9SVSB9LAorCXsgInRtaGwiLCAweDAzLCBJTlNUUl9SSV9SVSB9LAorCXsgImJyY3RnIiwgMHgwNywgSU5TVFJfUklfUlAgfSwKKwl7ICJsZ2hpIiwgMHgwOSwgSU5TVFJfUklfUkkgfSwKKwl7ICJhZ2hpIiwgMHgwYiwgSU5TVFJfUklfUkkgfSwKKwl7ICJtZ2hpIiwgMHgwZCwgSU5TVFJfUklfUkkgfSwKKwl7ICJjZ2hpIiwgMHgwZiwgSU5TVFJfUklfUkkgfSwKKyNlbmRpZgorCXsgInRtbGgiLCAweDAwLCBJTlNUUl9SSV9SVSB9LAorCXsgInRtbGwiLCAweDAxLCBJTlNUUl9SSV9SVSB9LAorCXsgImJyYyIsIDB4MDQsIElOU1RSX1JJX1VQIH0sCisJeyAiYnJhcyIsIDB4MDUsIElOU1RSX1JJX1JQIH0sCisJeyAiYnJjdCIsIDB4MDYsIElOU1RSX1JJX1JQIH0sCisJeyAibGhpIiwgMHgwOCwgSU5TVFJfUklfUkkgfSwKKwl7ICJhaGkiLCAweDBhLCBJTlNUUl9SSV9SSSB9LAorCXsgIm1oaSIsIDB4MGMsIElOU1RSX1JJX1JJIH0sCisJeyAiY2hpIiwgMHgwZSwgSU5TVFJfUklfUkkgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYjJbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJzc2tlIiwgMHgyYiwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJzdGNrZiIsIDB4N2MsIElOU1RSX1NfUkQgfSwKKwl7ICJjdTIxIiwgMHhhNiwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJjdXV0ZiIsIDB4YTYsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3UxMiIsIDB4YTcsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3V0ZnUiLCAweGE3LCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgInN0ZmxlIiwgMHhiMCwgSU5TVFJfU19SRCB9LAorCXsgImxwc3dlIiwgMHhiMiwgSU5TVFJfU19SRCB9LAorI2VuZGlmCisJeyAic3RpZHAiLCAweDAyLCBJTlNUUl9TX1JEIH0sCisJeyAic2NrIiwgMHgwNCwgSU5TVFJfU19SRCB9LAorCXsgInN0Y2siLCAweDA1LCBJTlNUUl9TX1JEIH0sCisJeyAic2NrYyIsIDB4MDYsIElOU1RSX1NfUkQgfSwKKwl7ICJzdGNrYyIsIDB4MDcsIElOU1RSX1NfUkQgfSwKKwl7ICJzcHQiLCAweDA4LCBJTlNUUl9TX1JEIH0sCisJeyAic3RwdCIsIDB4MDksIElOU1RSX1NfUkQgfSwKKwl7ICJzcGthIiwgMHgwYSwgSU5TVFJfU19SRCB9LAorCXsgImlwayIsIDB4MGIsIElOU1RSX1NfMDAgfSwKKwl7ICJwdGxiIiwgMHgwZCwgSU5TVFJfU18wMCB9LAorCXsgInNweCIsIDB4MTAsIElOU1RSX1NfUkQgfSwKKwl7ICJzdHB4IiwgMHgxMSwgSU5TVFJfU19SRCB9LAorCXsgInN0YXAiLCAweDEyLCBJTlNUUl9TX1JEIH0sCisJeyAic2llIiwgMHgxNCwgSU5TVFJfU19SRCB9LAorCXsgInBjIiwgMHgxOCwgSU5TVFJfU19SRCB9LAorCXsgInNhYyIsIDB4MTksIElOU1RSX1NfUkQgfSwKKwl7ICJjZmMiLCAweDFhLCBJTlNUUl9TX1JEIH0sCisJeyAiaXB0ZSIsIDB4MjEsIElOU1RSX1JSRV9SUiB9LAorCXsgImlwbSIsIDB4MjIsIElOU1RSX1JSRV9SMCB9LAorCXsgIml2c2siLCAweDIzLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJpYWMiLCAweDI0LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJzc2FyIiwgMHgyNSwgSU5TVFJfUlJFX1IwIH0sCisJeyAiZXBhciIsIDB4MjYsIElOU1RSX1JSRV9SMCB9LAorCXsgImVzYXIiLCAweDI3LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJwdCIsIDB4MjgsIElOU1RSX1JSRV9SUiB9LAorCXsgImlza2UiLCAweDI5LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJycmJlIiwgMHgyYSwgSU5TVFJfUlJFX1JSIH0sCisJeyAic3NrZSIsIDB4MmIsIElOU1RSX1JSRV9SUiB9LAorCXsgInRiIiwgMHgyYywgSU5TVFJfUlJFXzBSIH0sCisJeyAiZHhyIiwgMHgyZCwgSU5TVFJfUlJFX0YwIH0sCisJeyAicGdpbiIsIDB4MmUsIElOU1RSX1JSRV9SUiB9LAorCXsgInBnb3V0IiwgMHgyZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3NjaCIsIDB4MzAsIElOU1RSX1NfMDAgfSwKKwl7ICJoc2NoIiwgMHgzMSwgSU5TVFJfU18wMCB9LAorCXsgIm1zY2giLCAweDMyLCBJTlNUUl9TX1JEIH0sCisJeyAic3NjaCIsIDB4MzMsIElOU1RSX1NfUkQgfSwKKwl7ICJzdHNjaCIsIDB4MzQsIElOU1RSX1NfUkQgfSwKKwl7ICJ0c2NoIiwgMHgzNSwgSU5TVFJfU19SRCB9LAorCXsgInRwaSIsIDB4MzYsIElOU1RSX1NfUkQgfSwKKwl7ICJzYWwiLCAweDM3LCBJTlNUUl9TXzAwIH0sCisJeyAicnNjaCIsIDB4MzgsIElOU1RSX1NfMDAgfSwKKwl7ICJzdGNydyIsIDB4MzksIElOU1RSX1NfUkQgfSwKKwl7ICJzdGNwcyIsIDB4M2EsIElOU1RSX1NfUkQgfSwKKwl7ICJyY2hwIiwgMHgzYiwgSU5TVFJfU18wMCB9LAorCXsgInNjaG0iLCAweDNjLCBJTlNUUl9TXzAwIH0sCisJeyAiYmFrciIsIDB4NDAsIElOU1RSX1JSRV9SUiB9LAorCXsgImNrc20iLCAweDQxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzcWRyIiwgMHg0NCwgSU5TVFJfUlJFX0YwIH0sCisJeyAic3FlciIsIDB4NDUsIElOU1RSX1JSRV9GMCB9LAorCXsgInN0dXJhIiwgMHg0NiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXN0YSIsIDB4NDcsIElOU1RSX1JSRV9SMCB9LAorCXsgInBhbGIiLCAweDQ4LCBJTlNUUl9SUkVfMDAgfSwKKwl7ICJlcmVnIiwgMHg0OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiZXN0YSIsIDB4NGEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx1cmEiLCAweDRiLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0YXIiLCAweDRjLCBJTlNUUl9SUkVfQVIgfSwKKwl7ICJjcHlhIiwgSU5TVFJfUlJFX0FBIH0sCisJeyAic2FyIiwgMHg0ZSwgSU5TVFJfUlJFX0FSIH0sCisJeyAiZWFyIiwgMHg0ZiwgSU5TVFJfUlJFX1JBIH0sCisJeyAiY3NwIiwgMHg1MCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXNyIiwgMHg1MiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXZwZyIsIDB4NTQsIElOU1RSX1JSRV9SUiB9LAorCXsgIm12c3QiLCAweDU1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjdXNlIiwgMHg1NywgSU5TVFJfUlJFX1JSIH0sCisJeyAiYnNnIiwgMHg1OCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiYnNhIiwgMHg1YSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2xzdCIsIDB4NWQsIElOU1RSX1JSRV9SUiB9LAorCXsgInNyc3QiLCAweDVlLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjbXBzYyIsIDB4NjMsIElOU1RSX1JSRV9SUiB9LAorCXsgImNtcHNjIiwgMHg2MywgSU5TVFJfUlJFX1JSIH0sCisJeyAic2lnYSIsIDB4NzQsIElOU1RSX1NfUkQgfSwKKwl7ICJ4c2NoIiwgMHg3NiwgSU5TVFJfU18wMCB9LAorCXsgInJwIiwgMHg3NywgSU5TVFJfU19SRCB9LAorCXsgInN0Y2tlIiwgMHg3OCwgSU5TVFJfU19SRCB9LAorCXsgInNhY2YiLCAweDc5LCBJTlNUUl9TX1JEIH0sCisJeyAic3RzaSIsIDB4N2QsIElOU1RSX1NfUkQgfSwKKwl7ICJzcm5tIiwgMHg5OSwgSU5TVFJfU19SRCB9LAorCXsgInN0ZnBjIiwgMHg5YywgSU5TVFJfU19SRCB9LAorCXsgImxmcGMiLCAweDlkLCBJTlNUUl9TX1JEIH0sCisJeyAidHJlIiwgMHhhNSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3V1dGYiLCAweGE2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjdXRmdSIsIDB4YTcsIElOU1RSX1JSRV9SUiB9LAorCXsgInN0ZmwiLCAweGIxLCBJTlNUUl9TX1JEIH0sCisJeyAidHJhcDQiLCAweGZmLCBJTlNUUl9TX1JEIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2IzW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibWF5bHIiLCAweDM4LCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15bHIiLCAweDM5LCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm1heXIiLCAweDNhLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15ciIsIDB4M2IsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibWF5aHIiLCAweDNjLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15aHIiLCAweDNkLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImNlZ2JyIiwgMHhhNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2RnYnIiLCAweGE1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjeGdiciIsIDB4YTYsIElOU1RSX1JSRV9SUiB9LAorCXsgImNnZWJyIiwgMHhhOCwgSU5TVFJfUlJGX1UwUkYgfSwKKwl7ICJjZ2RiciIsIDB4YTksIElOU1RSX1JSRl9VMFJGIH0sCisJeyAiY2d4YnIiLCAweGFhLCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmZXIiLCAweGI4LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmZHIiLCAweGI5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmeHIiLCAweGJhLCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNlZ3IiLCAweGM0LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZGdyIiwgMHhjNSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3hnciIsIDB4YzYsIElOU1RSX1JSRV9SUiB9LAorCXsgImNnZXIiLCAweGM4LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNnZHIiLCAweGM5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNneHIiLCAweGNhLCBJTlNUUl9SUkZfVTBSRiB9LAorI2VuZGlmCisJeyAibHBlYnIiLCAweDAwLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsbmViciIsIDB4MDEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0ZWJyIiwgMHgwMiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGNlYnIiLCAweDAzLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsZGViciIsIDB4MDQsIElOU1RSX1JSRV9GRiB9LAorCXsgImx4ZGJyIiwgMHgwNSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhlYnIiLCAweDA2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJteGRiciIsIDB4MDcsIElOU1RSX1JSRV9GRiB9LAorCXsgImtlYnIiLCAweDA4LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJjZWJyIiwgMHgwOSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAiYWViciIsIDB4MGEsIElOU1RSX1JSRV9GRiB9LAorCXsgInNlYnIiLCAweDBiLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtZGViciIsIDB4MGMsIElOU1RSX1JSRV9GRiB9LAorCXsgImRlYnIiLCAweDBkLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtYWViciIsIDB4MGUsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNlYnIiLCAweDBmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImxwZGJyIiwgMHgxMCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibG5kYnIiLCAweDExLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsdGRiciIsIDB4MTIsIElOU1RSX1JSRV9GRiB9LAorCXsgImxjZGJyIiwgMHgxMywgSU5TVFJfUlJFX0ZGIH0sCisJeyAic3FlYnIiLCAweDE0LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJzcWRiciIsIDB4MTUsIElOU1RSX1JSRV9GRiB9LAorCXsgInNxeGJyIiwgMHgxNiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWVlYnIiLCAweDE3LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJrZGJyIiwgMHgxOCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAiY2RiciIsIDB4MTksIElOU1RSX1JSRV9GRiB9LAorCXsgImFkYnIiLCAweDFhLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJzZGJyIiwgMHgxYiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWRiciIsIDB4MWMsIElOU1RSX1JSRV9GRiB9LAorCXsgImRkYnIiLCAweDFkLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtYWRiciIsIDB4MWUsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNkYnIiLCAweDFmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImxkZXIiLCAweDI0LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJseGRyIiwgMHgyNSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhlciIsIDB4MjYsIElOU1RSX1JSRV9GRiB9LAorCXsgIm1hZXIiLCAweDJlLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm1zZXIiLCAweDJmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgInNxeHIiLCAweDM2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtZWVyIiwgMHgzNywgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWFkciIsIDB4M2UsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNkciIsIDB4M2YsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibHB4YnIiLCAweDQwLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsbnhiciIsIDB4NDEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0eGJyIiwgMHg0MiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGN4YnIiLCAweDQzLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsZWRiciIsIDB4NDQsIElOU1RSX1JSRV9GRiB9LAorCXsgImxkeGJyIiwgMHg0NSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGV4YnIiLCAweDQ2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJmaXhiciIsIDB4NDcsIElOU1RSX1JSRl9VMEZGIH0sCisJeyAia3hiciIsIDB4NDgsIElOU1RSX1JSRV9GRiB9LAorCXsgImN4YnIiLCAweDQ5LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJheGJyIiwgMHg0YSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAic3hiciIsIDB4NGIsIElOU1RSX1JSRV9GRiB9LAorCXsgIm14YnIiLCAweDRjLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJkeGJyIiwgMHg0ZCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAidGJlZHIiLCAweDUwLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgInRiZHIiLCAweDUxLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImRpZWJyIiwgMHg1MywgSU5TVFJfUlJGX0ZVRkYgfSwKKwl7ICJmaWViciIsIDB4NTcsIElOU1RSX1JSRl9VMEZGIH0sCisJeyAidGhkZXIiLCAweDU4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0aGRyIiwgMHg1OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiZGlkYnIiLCAweDViLCBJTlNUUl9SUkZfRlVGRiB9LAorCXsgImZpZGJyIiwgMHg1ZiwgSU5TVFJfUlJGX1UwRkYgfSwKKwl7ICJscHhyIiwgMHg2MCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibG54ciIsIDB4NjEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0eHIiLCAweDYyLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsY3hyIiwgMHg2MywgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhyIiwgMHg2NSwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGV4ciIsIDB4NjYsIElOU1RSX1JSRV9GRiB9LAorCXsgImZpeHIiLCAweDY3LCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImN4ciIsIDB4NjksIElOU1RSX1JSRV9GRiB9LAorCXsgImx6ZXIiLCAweDc0LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJsemRyIiwgMHg3NSwgSU5TVFJfUlJFX1IwIH0sCisJeyAibHp4ciIsIDB4NzYsIElOU1RSX1JSRV9SMCB9LAorCXsgImZpZXIiLCAweDc3LCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImZpZHIiLCAweDdmLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgInNmcGMiLCAweDg0LCBJTlNUUl9SUkVfUlJfT1BUIH0sCisJeyAiZWZwYyIsIDB4OGMsIElOU1RSX1JSRV9SUl9PUFQgfSwKKwl7ICJjZWZiciIsIDB4OTQsIElOU1RSX1JSRV9SRiB9LAorCXsgImNkZmJyIiwgMHg5NSwgSU5TVFJfUlJFX1JGIH0sCisJeyAiY3hmYnIiLCAweDk2LCBJTlNUUl9SUkVfUkYgfSwKKwl7ICJjZmViciIsIDB4OTgsIElOU1RSX1JSRl9VMFJGIH0sCisJeyAiY2ZkYnIiLCAweDk5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmeGJyIiwgMHg5YSwgSU5TVFJfUlJGX1UwUkYgfSwKKwl7ICJjZWZyIiwgMHhiNCwgSU5TVFJfUlJFX1JGIH0sCisJeyAiY2RmciIsIDB4YjUsIElOU1RSX1JSRV9SRiB9LAorCXsgImN4ZnIiLCAweGI2LCBJTlNUUl9SUkVfUkYgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYjlbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJscGdyIiwgMHgwMCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibG5nciIsIDB4MDEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx0Z3IiLCAweDAyLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsY2dyIiwgMHgwMywgSU5TVFJfUlJFX1JSIH0sCisJeyAibGdyIiwgMHgwNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHVyYWciLCAweDA1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsZ2JyIiwgMHgwNiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGdociIsIDB4MDcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFnciIsIDB4MDgsIElOU1RSX1JSRV9SUiB9LAorCXsgInNnciIsIDB4MDksIElOU1RSX1JSRV9SUiB9LAorCXsgImFsZ3IiLCAweDBhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGdyIiwgMHgwYiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXNnciIsIDB4MGMsIElOU1RSX1JSRV9SUiB9LAorCXsgImRzZ3IiLCAweDBkLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJlcmVnZyIsIDB4MGUsIElOU1RSX1JSRV9SUiB9LAorCXsgImxydmdyIiwgMHgwZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHBnZnIiLCAweDEwLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbmdmciIsIDB4MTEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx0Z2ZyIiwgMHgxMiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGNnZnIiLCAweDEzLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsZ2ZyIiwgMHgxNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxnZnIiLCAweDE2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbGd0ciIsIDB4MTcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFnZnIiLCAweDE4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzZ2ZyIiwgMHgxOSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiYWxnZnIiLCAweDFhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGdmciIsIDB4MWIsIElOU1RSX1JSRV9SUiB9LAorCXsgIm1zZ2ZyIiwgMHgxYywgSU5TVFJfUlJFX1JSIH0sCisJeyAiZHNnZnIiLCAweDFkLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZ3IiLCAweDIwLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjbGdyIiwgMHgyMSwgSU5TVFJfUlJFX1JSIH0sCisJeyAic3R1cmciLCAweDI1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsYnIiLCAweDI2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsaHIiLCAweDI3LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZ2ZyIiwgMHgzMCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2xnZnIiLCAweDMxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJiY3RnciIsIDB4NDYsIElOU1RSX1JSRV9SUiB9LAorCXsgIm5nciIsIDB4ODAsIElOU1RSX1JSRV9SUiB9LAorCXsgIm9nciIsIDB4ODEsIElOU1RSX1JSRV9SUiB9LAorCXsgInhnciIsIDB4ODIsIElOU1RSX1JSRV9SUiB9LAorCXsgImZsb2dyIiwgMHg4MywgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxnY3IiLCAweDg0LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbGdociIsIDB4ODUsIElOU1RSX1JSRV9SUiB9LAorCXsgIm1sZ3IiLCAweDg2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJkbGdyIiwgMHg4NywgSU5TVFJfUlJFX1JSIH0sCisJeyAiYWxjZ3IiLCAweDg4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGJnciIsIDB4ODksIElOU1RSX1JSRV9SUiB9LAorCXsgImNzcGciLCAweDhhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJpZHRlIiwgMHg4ZSwgSU5TVFJfUlJGX1IwUlIgfSwKKwl7ICJsbGNyIiwgMHg5NCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxociIsIDB4OTUsIElOU1RSX1JSRV9SUiB9LAorCXsgImVzZWEiLCAweDlkLCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJscHRlYSIsIDB4YWEsIElOU1RSX1JSRl9SVVJSIH0sCisJeyAiY3UxNCIsIDB4YjAsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3UyNCIsIDB4YjEsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3U0MSIsIDB4YjIsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3U0MiIsIDB4YjMsIElOU1RSX1JSRl9NMFJSIH0sCisjZW5kaWYKKwl7ICJrbWFjIiwgMHgxZSwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHJ2ciIsIDB4MWYsIElOU1RSX1JSRV9SUiB9LAorCXsgImttIiwgMHgyZSwgSU5TVFJfUlJFX1JSIH0sCisJeyAia21jIiwgMHgyZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAia2ltZCIsIDB4M2UsIElOU1RSX1JSRV9SUiB9LAorCXsgImtsbWQiLCAweDNmLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJlcHN3IiwgMHg4ZCwgSU5TVFJfUlJFX1JSIH0sCisJeyAidHJ0dCIsIDB4OTAsIElOU1RSX1JSRV9SUiB9LAorCXsgInRydHQiLCAweDkwLCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgInRydG8iLCAweDkxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0cnRvIiwgMHg5MSwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJ0cm90IiwgMHg5MiwgSU5TVFJfUlJFX1JSIH0sCisJeyAidHJvdCIsIDB4OTIsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAidHJvbyIsIDB4OTMsIElOU1RSX1JSRV9SUiB9LAorCXsgInRyb28iLCAweDkzLCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgIm1sciIsIDB4OTYsIElOU1RSX1JSRV9SUiB9LAorCXsgImRsciIsIDB4OTcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFsY3IiLCAweDk4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGJyIiwgMHg5OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2MwW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibGdmaSIsIDB4MDEsIElOU1RSX1JJTF9SSSB9LAorCXsgInhpaGYiLCAweDA2LCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJ4aWxmIiwgMHgwNywgSU5TVFJfUklMX1JVIH0sCisJeyAiaWloZiIsIDB4MDgsIElOU1RSX1JJTF9SVSB9LAorCXsgImlpbGYiLCAweDA5LCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJuaWhmIiwgMHgwYSwgSU5TVFJfUklMX1JVIH0sCisJeyAibmlsZiIsIDB4MGIsIElOU1RSX1JJTF9SVSB9LAorCXsgIm9paGYiLCAweDBjLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJvaWxmIiwgMHgwZCwgSU5TVFJfUklMX1JVIH0sCisJeyAibGxpaGYiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJsbGlsZiIsIDB4MGYsIElOU1RSX1JJTF9SVSB9LAorI2VuZGlmCisJeyAibGFybCIsIDB4MDAsIElOU1RSX1JJTF9SUCB9LAorCXsgImJyY2wiLCAweDA0LCBJTlNUUl9SSUxfVVAgfSwKKwl7ICJicmFzbCIsIDB4MDUsIElOU1RSX1JJTF9SUCB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9jMltdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgInNsZ2ZpIiwgMHgwNCwgSU5TVFJfUklMX1JVIH0sCisJeyAic2xmaSIsIDB4MDUsIElOU1RSX1JJTF9SVSB9LAorCXsgImFnZmkiLCAweDA4LCBJTlNUUl9SSUxfUkkgfSwKKwl7ICJhZmkiLCAweDA5LCBJTlNUUl9SSUxfUkkgfSwKKwl7ICJhbGdmaSIsIDB4MGEsIElOU1RSX1JJTF9SVSB9LAorCXsgImFsZmkiLCAweDBiLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJjZ2ZpIiwgMHgwYywgSU5TVFJfUklMX1JJIH0sCisJeyAiY2ZpIiwgMHgwZCwgSU5TVFJfUklMX1JJIH0sCisJeyAiY2xnZmkiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJjbGZpIiwgMHgwZiwgSU5TVFJfUklMX1JVIH0sCisjZW5kaWYKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYzhbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJtdmNvcyIsIDB4MDAsIElOU1RSX1NTRl9SUkRSRCB9LAorI2VuZGlmCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2UzW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibHRnIiwgMHgwMiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscmFnIiwgMHgwMywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZyIsIDB4MDQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZieSIsIDB4MDYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYWciLCAweDA4LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNnIiwgMHgwOSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhbGciLCAweDBhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsZyIsIDB4MGIsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibXNnIiwgMHgwYywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJkc2ciLCAweDBkLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImN2YmciLCAweDBlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxydmciLCAweDBmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImx0IiwgMHgxMiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscmF5IiwgMHgxMywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZ2YiLCAweDE0LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxnaCIsIDB4MTUsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnZiIsIDB4MTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxndCIsIDB4MTcsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYWdmIiwgMHgxOCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzZ2YiLCAweDE5LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsZ2YiLCAweDFhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsZ2YiLCAweDFiLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgIm1zZ2YiLCAweDFjLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImRzZ2YiLCAweDFkLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImNnIiwgMHgyMCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJjbGciLCAweDIxLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0ZyIsIDB4MjQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZkeSIsIDB4MjYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZkZyIsIDB4MmUsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RydmciLCAweDJmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImNnZiIsIDB4MzAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2xnZiIsIDB4MzEsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RydmgiLCAweDNmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImJjdGciLCAweDQ2LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0eSIsIDB4NTAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibXN5IiwgMHg1MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJueSIsIDB4NTQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2x5IiwgMHg1NSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJveSIsIDB4NTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAieHkiLCAweDU3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImx5IiwgMHg1OCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJjeSIsIDB4NTksIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYXkiLCAweDVhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN5IiwgMHg1YiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhbHkiLCAweDVlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNseSIsIDB4NWYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RoeSIsIDB4NzAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGF5IiwgMHg3MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzdGN5IiwgMHg3MiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJpY3kiLCAweDczLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxiIiwgMHg3NiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZ2IiLCAweDc3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxoeSIsIDB4NzgsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2h5IiwgMHg3OSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhaHkiLCAweDdhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNoeSIsIDB4N2IsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibmciLCAweDgwLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgIm9nIiwgMHg4MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJ4ZyIsIDB4ODIsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibWxnIiwgMHg4NiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJkbGciLCAweDg3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsY2ciLCAweDg4LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsYmciLCAweDg5LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0cHEiLCAweDhlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxwcSIsIDB4OGYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnYyIsIDB4OTAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnaCIsIDB4OTEsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxjIiwgMHg5NCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsbGgiLCAweDk1LCBJTlNUUl9SWFlfUlJSRCB9LAorI2VuZGlmCisJeyAibHJ2IiwgMHgxZSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscnZoIiwgMHgxZiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzdHJ2IiwgMHgzZSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJtbCIsIDB4OTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiZGwiLCAweDk3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsYyIsIDB4OTgsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic2xiIiwgMHg5OSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfZTVbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJzdHJhZyIsIDB4MDIsIElOU1RSX1NTRV9SRFJEIH0sCisjZW5kaWYKKwl7ICJsYXNwIiwgMHgwMCwgSU5TVFJfU1NFX1JEUkQgfSwKKwl7ICJ0cHJvdCIsIDB4MDEsIElOU1RSX1NTRV9SRFJEIH0sCisJeyAibXZjc2siLCAweDBlLCBJTlNUUl9TU0VfUkRSRCB9LAorCXsgIm12Y2RrIiwgMHgwZiwgSU5TVFJfU1NFX1JEUkQgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfZWJbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJsbWciLCAweDA0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNyYWciLCAweDBhLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNsYWciLCAweDBiLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNybGciLCAweDBjLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNsbGciLCAweDBkLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInRyYWNnIiwgMHgwZiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJjc3kiLCAweDE0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInJsbGciLCAweDFjLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNsbWgiLCAweDIwLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImNsbXkiLCAweDIxLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgInN0bWciLCAweDI0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInN0Y3RnIiwgMHgyNSwgSU5TVFJfUlNZX0NDUkQgfSwKKwl7ICJzdG1oIiwgMHgyNiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJzdGNtaCIsIDB4MmMsIElOU1RSX1JTWV9SVVJEIH0sCisJeyAic3RjbXkiLCAweDJkLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImxjdGxnIiwgMHgyZiwgSU5TVFJfUlNZX0NDUkQgfSwKKwl7ICJjc2ciLCAweDMwLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNkc3kiLCAweDMxLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNkc2ciLCAweDNlLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImJ4aGciLCAweDQ0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImJ4bGVnIiwgMHg0NSwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJ0bXkiLCAweDUxLCBJTlNUUl9TSVlfVVJEIH0sCisJeyAibXZpeSIsIDB4NTIsIElOU1RSX1NJWV9VUkQgfSwKKwl7ICJuaXkiLCAweDU0LCBJTlNUUl9TSVlfVVJEIH0sCisJeyAiY2xpeSIsIDB4NTUsIElOU1RSX1NJWV9VUkQgfSwKKwl7ICJvaXkiLCAweDU2LCBJTlNUUl9TSVlfVVJEIH0sCisJeyAieGl5IiwgMHg1NywgSU5TVFJfU0lZX1VSRCB9LAorCXsgImljbWgiLCAweDgwLCBJTlNUUl9SU0VfUlVSRCB9LAorCXsgImljbWgiLCAweDgwLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImljbXkiLCAweDgxLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImNsY2x1IiwgMHg4ZiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJzdG15IiwgMHg5MCwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJsbWgiLCAweDk2LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImxteSIsIDB4OTgsIElOU1RSX1JTWV9SUlJEIH0sCisJeyAibGFteSIsIDB4OWEsIElOU1RSX1JTWV9BQVJEIH0sCisJeyAic3RhbXkiLCAweDliLCBJTlNUUl9SU1lfQUFSRCB9LAorI2VuZGlmCisJeyAicmxsIiwgMHgxZCwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJtdmNsdSIsIDB4OGUsIElOU1RSX1JTWV9SUlJEIH0sCisJeyAidHAiLCAweGMwLCBJTlNUUl9SU0xfUjBSRCB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9lY1tdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgImJyeGhnIiwgMHg0NCwgSU5TVFJfUklFX1JSUCB9LAorCXsgImJyeGxnIiwgMHg0NSwgSU5TVFJfUklFX1JSUCB9LAorI2VuZGlmCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2VkW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibWF5bCIsIDB4MzgsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15bCIsIDB4MzksIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm1heSIsIDB4M2EsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15IiwgMHgzYiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibWF5aCIsIDB4M2MsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15aCIsIDB4M2QsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgImxleSIsIDB4NjQsIElOU1RSX1JYWV9GUlJEIH0sCisJeyAibGR5IiwgMHg2NSwgSU5TVFJfUlhZX0ZSUkQgfSwKKwl7ICJzdGV5IiwgMHg2NiwgSU5TVFJfUlhZX0ZSUkQgfSwKKwl7ICJzdGR5IiwgMHg2NywgSU5TVFJfUlhZX0ZSUkQgfSwKKyNlbmRpZgorCXsgImxkZWIiLCAweDA0LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZGIiLCAweDA1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZWIiLCAweDA2LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm14ZGIiLCAweDA3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImtlYiIsIDB4MDgsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiY2ViIiwgMHgwOSwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJhZWIiLCAweDBhLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNlYiIsIDB4MGIsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWRlYiIsIDB4MGMsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiZGViIiwgMHgwZCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJtYWViIiwgMHgwZSwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibXNlYiIsIDB4MGYsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgInRjZWIiLCAweDEwLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInRjZGIiLCAweDExLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInRjeGIiLCAweDEyLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNxZWIiLCAweDE0LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNxZGIiLCAweDE1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1lZWIiLCAweDE3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImtkYiIsIDB4MTgsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiY2RiIiwgMHgxOSwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJhZGIiLCAweDFhLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNkYiIsIDB4MWIsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWRiIiwgMHgxYywgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJkZGIiLCAweDFkLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1hZGIiLCAweDFlLCBJTlNUUl9SWEZfRlJSREYgfSwKKwl7ICJtc2RiIiwgMHgxZiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibGRlIiwgMHgyNCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJseGQiLCAweDI1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZSIsIDB4MjYsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWFlIiwgMHgyZSwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibXNlIiwgMHgyZiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAic3FlIiwgMHgzNCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJtZWUiLCAweDM3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1hZCIsIDB4M2UsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm1zZCIsIDB4M2YsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworLyogRXh0cmFjdHMgYW4gb3BlcmFuZCB2YWx1ZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXh0cmFjdF9vcGVyYW5kKHVuc2lnbmVkIGNoYXIgKmNvZGUsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBvcGVyYW5kICpvcGVyYW5kKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGJpdHM7CisKKwkvKiBFeHRyYWN0IGZyYWdtZW50cyBvZiB0aGUgb3BlcmFuZCBieXRlIGZvciBieXRlLiAgKi8KKwljb2RlICs9IG9wZXJhbmQtPnNoaWZ0IC8gODsKKwliaXRzID0gKG9wZXJhbmQtPnNoaWZ0ICYgNykgKyBvcGVyYW5kLT5iaXRzOworCXZhbCA9IDA7CisJZG8geworCQl2YWwgPDw9IDg7CisJCXZhbCB8PSAodW5zaWduZWQgaW50KSAqY29kZSsrOworCQliaXRzIC09IDg7CisJfSB3aGlsZSAoYml0cyA+IDApOworCXZhbCA+Pj0gLWJpdHM7CisJdmFsICY9ICgoMVUgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgPDwgMSkgLSAxOworCisJLyogQ2hlY2sgZm9yIHNwZWNpYWwgbG9uZyBkaXNwbGFjZW1lbnQgY2FzZS4gICovCisJaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMjApCisJCXZhbCA9ICh2YWwgJiAweGZmKSA8PCAxMiB8ICh2YWwgJiAweGZmZjAwKSA+PiA4OworCisJLyogU2lnbiBleHRlbmQgdmFsdWUgaWYgdGhlIG9wZXJhbmQgaXMgc2lnbmVkIG9yIHBjIHJlbGF0aXZlLiAgKi8KKwlpZiAoKG9wZXJhbmQtPmZsYWdzICYgKE9QRVJBTkRfU0lHTkVEIHwgT1BFUkFORF9QQ1JFTCkpICYmCisJICAgICh2YWwgJiAoMVUgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpKQorCQl2YWwgfD0gKC0xVSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSA8PCAxOworCisJLyogRG91YmxlIHZhbHVlIGlmIHRoZSBvcGVyYW5kIGlzIHBjIHJlbGF0aXZlLgkqLworCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfUENSRUwpCisJCXZhbCA8PD0gMTsKKworCS8qIExlbmd0aCB4IGluIGFuIGluc3RydWN0aW9ucyBoYXMgcmVhbCBsZW5ndGggeCArIDEuICAqLworCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfTEVOR1RIKQorCQl2YWwrKzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbnNuX2xlbmd0aCh1bnNpZ25lZCBjaGFyIGNvZGUpCit7CisJcmV0dXJuICgoKChpbnQpIGNvZGUgKyA2NCkgPj4gNykgKyAxKSA8PCAxOworfQorCitzdGF0aWMgc3RydWN0IGluc24gKmZpbmRfaW5zbih1bnNpZ25lZCBjaGFyICpjb2RlKQoreworCXVuc2lnbmVkIGNoYXIgb3BmcmFnID0gY29kZVsxXTsKKwl1bnNpZ25lZCBjaGFyIG9wbWFzazsKKwlzdHJ1Y3QgaW5zbiAqdGFibGU7CisKKwlzd2l0Y2ggKGNvZGVbMF0pIHsKKwljYXNlIDB4MDE6CisJCXRhYmxlID0gb3Bjb2RlXzAxOworCQlicmVhazsKKwljYXNlIDB4YTU6CisJCXRhYmxlID0gb3Bjb2RlX2E1OworCQlicmVhazsKKwljYXNlIDB4YTc6CisJCXRhYmxlID0gb3Bjb2RlX2E3OworCQlicmVhazsKKwljYXNlIDB4YjI6CisJCXRhYmxlID0gb3Bjb2RlX2IyOworCQlicmVhazsKKwljYXNlIDB4YjM6CisJCXRhYmxlID0gb3Bjb2RlX2IzOworCQlicmVhazsKKwljYXNlIDB4Yjk6CisJCXRhYmxlID0gb3Bjb2RlX2I5OworCQlicmVhazsKKwljYXNlIDB4YzA6CisJCXRhYmxlID0gb3Bjb2RlX2MwOworCQlicmVhazsKKwljYXNlIDB4YzI6CisJCXRhYmxlID0gb3Bjb2RlX2MyOworCQlicmVhazsKKwljYXNlIDB4Yzg6CisJCXRhYmxlID0gb3Bjb2RlX2M4OworCQlicmVhazsKKwljYXNlIDB4ZTM6CisJCXRhYmxlID0gb3Bjb2RlX2UzOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZTU6CisJCXRhYmxlID0gb3Bjb2RlX2U1OworCQlicmVhazsKKwljYXNlIDB4ZWI6CisJCXRhYmxlID0gb3Bjb2RlX2ViOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZWM6CisJCXRhYmxlID0gb3Bjb2RlX2VjOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZWQ6CisJCXRhYmxlID0gb3Bjb2RlX2VkOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0YWJsZSA9IG9wY29kZTsKKwkJb3BmcmFnID0gY29kZVswXTsKKwkJYnJlYWs7CisJfQorCXdoaWxlICh0YWJsZS0+Zm9ybWF0ICE9IElOU1RSX0lOVkFMSUQpIHsKKwkJb3BtYXNrID0gZm9ybWF0c1t0YWJsZS0+Zm9ybWF0XVswXTsKKwkJaWYgKHRhYmxlLT5vcGZyYWcgPT0gKG9wZnJhZyAmIG9wbWFzaykpCisJCQlyZXR1cm4gdGFibGU7CisJCXRhYmxlKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHByaW50X2luc24oY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBjaGFyICpjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IGluc24gKmluc247CisJY29uc3QgdW5zaWduZWQgY2hhciAqb3BzOworCWNvbnN0IHN0cnVjdCBvcGVyYW5kICpvcGVyYW5kOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwljaGFyIHNlcGFyYXRvcjsKKwljaGFyICpwdHI7CisKKwlwdHIgPSBidWZmZXI7CisJaW5zbiA9IGZpbmRfaW5zbihjb2RlKTsKKwlpZiAoaW5zbikgeworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlLjVzXHQiLCBpbnNuLT5uYW1lKTsKKwkJLyogRXh0cmFjdCB0aGUgb3BlcmFuZHMuICovCisJCXNlcGFyYXRvciA9IDA7CisJCWZvciAob3BzID0gZm9ybWF0c1tpbnNuLT5mb3JtYXRdICsgMTsgKm9wcyAhPSAwOyBvcHMrKykgeworCQkJb3BlcmFuZCA9IG9wZXJhbmRzICsgKm9wczsKKwkJCXZhbHVlID0gZXh0cmFjdF9vcGVyYW5kKGNvZGUsIG9wZXJhbmQpOworCQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfSU5ERVgpICAmJiB2YWx1ZSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfQkFTRSkgJiYKKwkJCSAgICB2YWx1ZSA9PSAwICYmIHNlcGFyYXRvciA9PSAnKCcpIHsKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2VwYXJhdG9yKQorCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiVjIiwgc2VwYXJhdG9yKTsKKwkJCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfR1BSKQorCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiUlciVpIiwgdmFsdWUpOworCQkJZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBPUEVSQU5EX0ZQUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWYlaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9BUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWElaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9DUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWMlaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9QQ1JFTCkKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlbHgiLCB2YWx1ZSArIGFkZHIpOworCQkJZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlaSIsIHZhbHVlKTsKKwkJCWVsc2UKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIldSIsIHZhbHVlKTsKKwkJCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfRElTUCkKKwkJCQlzZXBhcmF0b3IgPSAnKCc7CisJCQllbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfQkFTRSkgeworCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIikiKTsKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCQl9IGVsc2UKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCX0KKwl9IGVsc2UKKwkJcHRyICs9IHNwcmludGYocHRyLCAidW5rbm93biIpOworCXJldHVybiAoaW50KSAocHRyIC0gYnVmZmVyKTsKK30KKwordm9pZCBzaG93X2NvZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2hhciAqbW9kZSA9IChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgPyAiVXNlciIgOiAiS3JubCI7CisJdW5zaWduZWQgY2hhciBjb2RlWzY0XTsKKwljaGFyIGJ1ZmZlcls2NF0sICpwdHI7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHN0YXJ0LCBlbmQsIG9wc2l6ZSwgaG9wcywgaTsKKworCS8qIEdldCBhIHNuYXBzaG90IG9mIHRoZSA2NCBieXRlcyBzdXJyb3VuZGluZyB0aGUgZmF1bHQgYWRkcmVzcy4gKi8KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSA/IFVTRVJfRFMgOiBLRVJORUxfRFMpOworCWZvciAoc3RhcnQgPSAzMjsgc3RhcnQgJiYgcmVncy0+cHN3LmFkZHIgPj0gMzQgLSBzdGFydDsgc3RhcnQgLT0gMikgeworCQlhZGRyID0gcmVncy0+cHN3LmFkZHIgLSAzNCArIHN0YXJ0OworCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjb2RlICsgc3RhcnQgLSAyLAorCQkJCSAgICAgKGNoYXIgX191c2VyICopIGFkZHIsIDIpKQorCQkJYnJlYWs7CisJfQorCWZvciAoZW5kID0gMzI7IGVuZCA8IDY0OyBlbmQgKz0gMikgeworCQlhZGRyID0gcmVncy0+cHN3LmFkZHIgKyBlbmQgLSAzMjsKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoY29kZSArIGVuZCwKKwkJCQkgICAgIChjaGFyIF9fdXNlciAqKSBhZGRyLCAyKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfZnMob2xkX2ZzKTsKKwkvKiBDb2RlIHNuYXBzaG90IHVzZWFibGUgPyAqLworCWlmICgocmVncy0+cHN3LmFkZHIgJiAxKSB8fCBzdGFydCA+PSBlbmQpIHsKKwkJcHJpbnRrKCIlcyBDb2RlOiBCYWQgUFNXLlxuIiwgbW9kZSk7CisJCXJldHVybjsKKwl9CisJLyogRmluZCBhIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgZGlzYXNzZW1ibHkuICovCisJd2hpbGUgKHN0YXJ0IDwgMzIpIHsKKwkJaG9wcyA9IDA7CisJCWZvciAoaSA9IDAsIGhvcHMgPSAwOyBzdGFydCArIGkgPCAzMiAmJiBob3BzIDwgMzsgaG9wcysrKSB7CisJCQlpZiAoIWZpbmRfaW5zbihjb2RlICsgc3RhcnQgKyBpKSkKKwkJCQlicmVhazsKKwkJCWkgKz0gaW5zbl9sZW5ndGgoY29kZVtzdGFydCArIGldKTsKKwkJfQorCQlpZiAoc3RhcnQgKyBpID09IDMyKQorCQkJLyogTG9va3MgZ29vZCwgc2VxdWVuY2UgZW5kcyBhdCBQU1cuICovCisJCQlicmVhazsKKwkJc3RhcnQgKz0gMjsKKwl9CisJLyogRGVjb2RlIHRoZSBpbnN0cnVjdGlvbnMuICovCisJcHRyID0gYnVmZmVyOworCXB0ciArPSBzcHJpbnRmKHB0ciwgIiVzIENvZGU6IiwgbW9kZSk7CisJaG9wcyA9IDA7CisJd2hpbGUgKHN0YXJ0IDwgZW5kICYmIGhvcHMgPCA4KSB7CisJCSpwdHIrKyA9IChzdGFydCA9PSAzMikgPyAnPicgOiAnICc7CisJCWFkZHIgPSByZWdzLT5wc3cuYWRkciArIHN0YXJ0IC0gMzI7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgT05FTE9ORywgYWRkcik7CisJCW9wc2l6ZSA9IGluc25fbGVuZ3RoKGNvZGVbc3RhcnRdKTsKKwkJaWYgKHN0YXJ0ICsgb3BzaXplID49IGVuZCkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgb3BzaXplOyBpKyspCisJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDJ4IiwgY29kZVtzdGFydCArIGldKTsKKwkJKnB0cisrID0gJ1x0JzsKKwkJaWYgKGkgPCA2KQorCQkJKnB0cisrID0gJ1x0JzsKKwkJcHRyICs9IHByaW50X2luc24ocHRyLCBjb2RlICsgc3RhcnQsIGFkZHIpOworCQlzdGFydCArPSBvcHNpemU7CisJCXByaW50ayhidWZmZXIpOworCQlwdHIgPSBidWZmZXI7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIlxuICAgICAgICAgICIpOworCQlob3BzKys7CisJfQorCXByaW50aygiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwppbmRleCA1ZTQ3OTM2Li41MDUzOGU1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCkBAIC0yNTMsMTEgKzI1MywxMCBAQAogCQkJYnJlYWs7CiAjZW5kaWYKIAkJLyoKLQkJICogRmluaXNoIG1lbW9yeSBkZXRlY3Rpb24gYXQgdGhlIGZpcnN0IGhvbGUsIHVubGVzcwotCQkgKiAtIHdlIHJlYWNoZWQgdGhlIGhzYSAtPiBza2lwIGl0LgotCQkgKiAtIHdlIGtub3cgdGhlcmUgbXVzdCBiZSBtb3JlLgorCQkgKiBGaW5pc2ggbWVtb3J5IGRldGVjdGlvbiBhdCB0aGUgZmlyc3QgaG9sZQorCQkgKiBpZiBzdG9yYWdlIHNpemUgaXMgdW5rbm93bi4KIAkJICovCi0JCWlmIChjYyA9PSAtMVVMICYmICFtZW1zaXplICYmIG9sZF9hZGRyICE9IEFERFIyRykKKwkJaWYgKGNjID09IC0xVUwgJiYgIW1lbXNpemUpCiAJCQlicmVhazsKIAkJaWYgKG1lbXNpemUgJiYgYWRkciA+PSBtZW1zaXplKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggZGRkYzNkZS4uYzhhMjIxMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtMjQ5LDggKzI0OSw2IEBACiAJYm56CUJBU0VEKHN5c2NfdHJhY2VzeXMpCiAJYmFzcgklcjE0LCVyOAkgICMgY2FsbCBzeXNfeHh4eAogCXN0CSVyMixTUF9SMiglcjE1KSAgICMgc3RvcmUgcmV0dXJuIHZhbHVlIChjaGFuZ2UgUjIgb24gc3RhY2spCi0JCQkJICAjIEFUVEVOVElPTjogY2hlY2sgc3lzX2V4ZWN2ZV9nbHVlIGJlZm9yZQotCQkJCSAgIyBjaGFuZ2luZyBhbnl0aGluZyBoZXJlICEhCiAKIHN5c2NfcmV0dXJuOgogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/CkBAIC0zODEsNTAgKzM3OSwzNyBAQAogCWIJQkFTRUQoc3lzY19yZXR1cm4pCiAKICMKLSMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAotIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKLSMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgotIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMga2VybmVsX2V4ZWN2ZSBmdW5jdGlvbiBuZWVkcyB0byBkZWFsIHdpdGggcHRfcmVncyB0aGF0IGlzIG5vdAorIyBhdCB0aGUgdXN1YWwgcGxhY2UKICMKLXN5c19jbG9uZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsCSVyMSxCQVNFRCguTGNsb25lKQotCWJyCSVyMQkJCSMgYnJhbmNoIHRvIHN5c19jbG9uZQotCi1zeXNfZm9ya19nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsCSVyMSxCQVNFRCguTGZvcmspCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX2ZvcmsKLQotc3lzX3Zmb3JrX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwotCWwJJXIxLEJBU0VEKC5MdmZvcmspCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX3Zmb3JrCi0KLXN5c19leGVjdmVfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JbAklcjEsQkFTRUQoLkxleGVjdmUpCi0JbHIJJXIxMiwlcjE0CQkjIHNhdmUgcmV0dXJuIGFkZHJlc3MKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgc3lzX2V4ZWN2ZQotCWx0cgklcjIsJXIyCQkJIyBjaGVjayBpZiBleGVjdmUgZmFpbGVkCi0JYm56CTAoJXIxMikJCQkjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCi0JYgk0KCVyMTIpCQkJIyBTS0lQIFNUIDIsU1BfUjIoMTUpIGFmdGVyIEJBU1IgMTQsOAotCQkJCQkjIGluIHN5c3RlbV9jYWxsL3N5c2NfdHJhY2VzeXMKLQotc3lzX3NpZ3JldHVybl9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JbAklcjEsQkFTRUQoLkxzaWdyZXR1cm4pCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotCi1zeXNfcnRfc2lncmV0dXJuX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKLQlsCSVyMSxCQVNFRCguTHJ0X3NpZ3JldHVybikKLQlicgklcjEJCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLXN5c19zaWdhbHRzdGFja19nbHVlOgotCWxhCSVyNCxTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JbAklcjEsQkFTRUQoLkxzaWdhbHRzdGFjaykKLQlicgklcjEJCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCisJLmdsb2JsCWtlcm5lbF9leGVjdmUKK2tlcm5lbF9leGVjdmU6CisJc3RtCSVyMTIsJXIxNSw0OCglcjE1KQorCWxyCSVyMTQsJXIxNQorCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKKwlzCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkKKwlzdAklcjE0LF9fU0ZfQkFDS0NIQUlOKCVyMTUpCisJbGEJJXIxMixTUF9QVFJFR1MoJXIxNSkKKwl4YwkwKF9fUFRfU0laRSwlcjEyKSwwKCVyMTIpCisJbAklcjEsQkFTRUQoLkxkb19leGVjdmUpCisJbHIJJXI1LCVyMTIKKwliYXNyCSVyMTQsJXIxCisJbHRyCSVyMiwlcjIKKwliZQlCQVNFRCgwZikKKwlhCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkKKwlsbQklcjEyLCVyMTUsNDgoJXIxNSkKKwlicgklcjE0CisJIyBleGVjdmUgc3VjY2VlZGVkLgorMDoJc3Ruc20JX19TRl9FTVBUWSglcjE1KSwweGZjCSMgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbAklcjE1LF9fTENfS0VSTkVMX1NUQUNLCSMgbG9hZCBrc3AKKwlzCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkJIyBtYWtlIHJvb20gZm9yIHJlZ2lzdGVycyAmIHBzdworCWwJJXI5LF9fTENfVEhSRUFEX0lORk8KKwltdmMJU1BfUFRSRUdTKF9fUFRfU0laRSwlcjE1KSwwKCVyMTIpCSMgY29weSBwdF9yZWdzCisJeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlsCSVyMSxCQVNFRCguTGV4ZWN2ZV90YWlsKQorCWJhc3IJJXIxNCwlcjEKKwliCUJBU0VEKHN5c2NfcmV0dXJuKQogCiAvKgogICogUHJvZ3JhbSBjaGVjayBoYW5kbGVyIHJvdXRpbmUKQEAgLTEwMzEsMTkgKzEwMTYsMTEgQEAKIC5MZG9fZXh0aW50OgkubG9uZwlkb19leHRpbnQKIC5MZG9fc2lnbmFsOgkubG9uZwlkb19zaWduYWwKIC5MaGFuZGxlX3BlcjoJLmxvbmcJZG9fc2luZ2xlX3N0ZXAKKy5MZG9fZXhlY3ZlOgkubG9uZwlkb19leGVjdmUKKy5MZXhlY3ZlX3RhaWw6CS5sb25nCWV4ZWN2ZV90YWlsCiAuTGp1bXBfdGFibGU6CS5sb25nCXBnbV9jaGVja190YWJsZQogLkxzY2hlZHVsZToJLmxvbmcJc2NoZWR1bGUKLS5MY2xvbmU6CS5sb25nCXN5c19jbG9uZQotLkxleGVjdmU6CS5sb25nCXN5c19leGVjdmUKLS5MZm9yazogCS5sb25nCXN5c19mb3JrCi0uTHJ0X3NpZ3JldHVybjogLmxvbmcJc3lzX3J0X3NpZ3JldHVybgotLkxydF9zaWdzdXNwZW5kOgotCQkubG9uZwlzeXNfcnRfc2lnc3VzcGVuZAotLkxzaWdyZXR1cm46CS5sb25nCXN5c19zaWdyZXR1cm4KLS5Mc2lnc3VzcGVuZDoJLmxvbmcJc3lzX3NpZ3N1c3BlbmQKLS5Mc2lnYWx0c3RhY2s6CS5sb25nCXN5c19zaWdhbHRzdGFjawogLkx0cmFjZToJLmxvbmcJc3lzY2FsbF90cmFjZQotLkx2Zm9yazoJLmxvbmcJc3lzX3Zmb3JrCiAuTHNjaGVkdGFpbDoJLmxvbmcJc2NoZWR1bGVfdGFpbAogLkxzeXNjX3RhYmxlOgkubG9uZwlzeXNfY2FsbF90YWJsZQogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwppbmRleCAwZjc1OGMzLi45Mzc0NWZkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpAQCAtMjQ0LDggKzI0NCw2IEBACiAJam56CXN5c2NfdHJhY2VzeXMKIAliYXNyCSVyMTQsJXI4CSMgY2FsbCBzeXNfeHh4eAogCXN0ZwklcjIsU1BfUjIoJXIxNSkgIyBzdG9yZSByZXR1cm4gdmFsdWUgKGNoYW5nZSBSMiBvbiBzdGFjaykKLQkJCQkjIEFUVEVOVElPTjogY2hlY2sgc3lzX2V4ZWN2ZV9nbHVlIGJlZm9yZQotCQkJCSMgY2hhbmdpbmcgYW55dGhpbmcgaGVyZSAhIQogCiBzeXNjX3JldHVybjoKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwpAQCAtMzcxLDc3ICszNjksMzUgQEAKIAlqCXN5c2NfcmV0dXJuCiAKICMKLSMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAotIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKLSMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgotIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMga2VybmVsX2V4ZWN2ZSBmdW5jdGlvbiBuZWVkcyB0byBkZWFsIHdpdGggcHRfcmVncyB0aGF0IGlzIG5vdAorIyBhdCB0aGUgdXN1YWwgcGxhY2UKICMKLXN5c19jbG9uZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlqZwlzeXNfY2xvbmUJCSMgYnJhbmNoIHRvIHN5c19jbG9uZQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3lzMzJfY2xvbmVfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JamcJc3lzMzJfY2xvbmUJCSMgYnJhbmNoIHRvIHN5czMyX2Nsb25lCi0jZW5kaWYKLQotc3lzX2ZvcmtfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JamcJc3lzX2ZvcmsJCSMgYnJhbmNoIHRvIHN5c19mb3JrCi0KLXN5c192Zm9ya19nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlqZwlzeXNfdmZvcmsJCSMgYnJhbmNoIHRvIHN5c192Zm9yawotCi1zeXNfZXhlY3ZlX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwotCWxncgklcjEyLCVyMTQJCSMgc2F2ZSByZXR1cm4gYWRkcmVzcwotCWJyYXNsCSVyMTQsc3lzX2V4ZWN2ZSAJIyBjYWxsIHN5c19leGVjdmUKLQlsdGdyCSVyMiwlcjIgCQkjIGNoZWNrIGlmIGV4ZWN2ZSBmYWlsZWQKLQlibnoJMCglcjEyKSAJCSMgaXQgZGlkIGZhaWwgLT4gc3RvcmUgcmVzdWx0IGluIGdwcjIKLQliCTYoJXIxMikgCQkjIFNLSVAgU1RHIDIsU1BfUjIoMTUpIGluCi0JCQkJCSMgc3lzdGVtX2NhbGwvc3lzY190cmFjZXN5cwotI2lmZGVmIENPTkZJR19DT01QQVQKLXN5czMyX2V4ZWN2ZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsZ3IJJXIxMiwlcjE0CQkjIHNhdmUgcmV0dXJuIGFkZHJlc3MKLQlicmFzbAklcjE0LHN5czMyX2V4ZWN2ZQkjIGNhbGwgc3lzMzJfZXhlY3ZlCi0JbHRncgklcjIsJXIyIAkJIyBjaGVjayBpZiBleGVjdmUgZmFpbGVkCi0JYm56CTAoJXIxMikgCQkjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCi0JYgk2KCVyMTIpIAkJIyBTS0lQIFNURyAyLFNQX1IyKDE1KSBpbgotCQkJCQkjIHN5c3RlbV9jYWxsL3N5c2NfdHJhY2VzeXMKLSNlbmRpZgotCi1zeXNfc2lncmV0dXJuX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKLQlqZwlzeXNfc2lncmV0dXJuCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zeXMzMl9zaWdyZXR1cm5fZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3NpZ3JldHVybiAJIyBicmFuY2ggdG8gc3lzMzJfc2lncmV0dXJuCi0jZW5kaWYKLQotc3lzX3J0X3NpZ3JldHVybl9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JamcJc3lzX3J0X3NpZ3JldHVybgkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zeXMzMl9ydF9zaWdyZXR1cm5fZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3J0X3NpZ3JldHVybgkjIGJyYW5jaCB0byBzeXMzMl9zaWdyZXR1cm4KLSNlbmRpZgotCi1zeXNfc2lnYWx0c3RhY2tfZ2x1ZToKLQlsYQklcjQsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5c19zaWdhbHRzdGFjayAJIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3lzMzJfc2lnYWx0c3RhY2tfZ2x1ZToKLQlsYQklcjQsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3NpZ2FsdHN0YWNrX3dyYXBwZXIgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotI2VuZGlmCisJLmdsb2JsCWtlcm5lbF9leGVjdmUKK2tlcm5lbF9leGVjdmU6CisJc3RtZwklcjEyLCVyMTUsOTYoJXIxNSkKKwlsZ3IJJXIxNCwlcjE1CisJYWdoaQklcjE1LC1TUF9TSVpFCisJc3RnCSVyMTQsX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlsYQklcjEyLFNQX1BUUkVHUyglcjE1KQorCXhjCTAoX19QVF9TSVpFLCVyMTIpLDAoJXIxMikKKwlsZ3IJJXI1LCVyMTIKKwlicmFzbAklcjE0LGRvX2V4ZWN2ZQorCWx0Z2ZyCSVyMiwlcjIKKwlqZQkwZgorCWFnaGkJJXIxNSxTUF9TSVpFCisJbG1nCSVyMTIsJXIxNSw5NiglcjE1KQorCWJyCSVyMTQKKwkjIGV4ZWN2ZSBzdWNjZWVkZWQuCiswOglzdG5zbQlfX1NGX0VNUFRZKCVyMTUpLDB4ZmMJIyBkaXNhYmxlIGludGVycnVwdHMKKwlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCSMgbG9hZCBrc3AKKwlhZ2hpCSVyMTUsLVNQX1NJWkUJCSMgbWFrZSByb29tIGZvciByZWdpc3RlcnMgJiBwc3cKKwlsZwklcjEzLF9fTENfU1ZDX05FV19QU1crOAorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCisJbXZjCVNQX1BUUkVHUyhfX1BUX1NJWkUsJXIxNSksMCglcjEyKQkjIGNvcHkgcHRfcmVncworCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJYnJhc2wJJXIxNCxleGVjdmVfdGFpbAorCWoJc3lzY19yZXR1cm4KIAogLyoKICAqIFByb2dyYW0gY2hlY2sgaGFuZGxlciByb3V0aW5lCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUwppbmRleCAzNzAxMDcwLi5hODdiMTk3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKQEAgLTM5LDcgKzM5LDY5IEBACiAJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMToJc2xsCSVyMTMsMQkJCSMgcmVtb3ZlIGhpZ2ggb3JkZXIgYml0CiAJc3JsCSVyMTMsMQotCWxoaQklcjEsMQkJCSMgbW9kZSAxID0gZXNhbWUKKworI2lmZGVmIENPTkZJR19aRkNQRFVNUAorCisJIyBjaGVjayBpZiB3ZSBoYXZlIGJlZW4gaXBsZWQgdXNpbmcgemZjcCBkdW1wOgorCisJdG0JMHhiOSwweDAxCQkjIHRlc3QgaWYgc3ViY2hhbm5lbCBpcyBlbmFibGVkCisJam5vCS5ub2R1bXAJCQkjIHN1YmNoYW5uZWwgZGlzYWJsZWQKKwlsCSVyMSwweGI4CisJbGEJJXI1LC5MaXBsX3NjaGliLS5MUEcxKCVyMTMpCisJc3RzY2gJMCglcjUpCQkJIyBnZXQgc2NoaWIgb2Ygc3ViY2hhbm5lbAorCWpuZQkubm9kdW1wCQkJIyBzY2hpYiBub3QgYXZhaWxhYmxlCisJdG0JNSglcjUpLDB4MDEJCSMgZGV2bm8gdmFsaWQ/CisJam5vCS5ub2R1bXAKKwl0bQk0KCVyNSksMHg4MAkJIyBxZGlvIGNhcGFibGUgZGV2aWNlPworCWpubwkubm9kdW1wCisJbAklcjIsMjAoJXIwKQkJIyBhZGRyZXNzIG9mIGlwbCBwYXJhbWV0ZXIgYmxvY2sKKwlsaGkJJXIzLDAKKwlpYwklcjMsMHgxNDgoJXIyKQkJIyBnZXQgb3B0IGZpZWxkCisJY2hpCSVyMywweDIwCQkjIGxvYWQgd2l0aCBkdW1wPworCWpuZQkubm9kdW1wCisKKwkjIHN0b3JlIGFsbCBwcmVmaXggcmVnaXN0ZXJzIGluIGNhc2Ugb2YgbG9hZCB3aXRoIGR1bXA6CisKKwlsYQklcjcsMAkJCSMgYmFzZSByZWdpc3RlciBmb3IgMCBwYWdlCisJbGEJJXI4LDAJCQkjIGZpcnN0IGNwdQorCWwJJXIxMSwuTHByZWZfYXJyX3B0ci0uTFBHMSglcjEzKQkjIGFkZHJlc3Mgb2YgcHJlZml4IGFycmF5CisJYWhpCSVyMTEsNAkJCSMgc2tpcCBib290IGNwdQorCWxyCSVyMTIsJXIxMQorCWFoaQklcjEyLChDT05GSUdfTlJfQ1BVUyo0KQkjIGVuZCBvZiBwcmVmaXggYXJyYXkKKwlzdGFwCS5MY3VycmVudF9jcHUrMi0uTFBHMSglcjEzKQkjIHN0b3JlIGN1cnJlbnQgY3B1IGFkZHIKKzE6CisJY2wJJXI4LC5MY3VycmVudF9jcHUtLkxQRzEoJXIxMykJIyBpcyBpcGwgY3B1ID8KKwlqZQk0ZgkJCQkjIGlmIHllcyBnZXQgbmV4dCBjcHUKKzI6CisJbHIJJXI5LCVyNworCXNpZ3AJJXI5LCVyOCwweDkJCSMgc3RvcCAmIHN0b3JlIHN0YXR1cyBvZiBjcHUKKwlicmMJOCwzZgkJCSMgYWNjZXB0ZWQKKwlicmMJNCw0ZgkJCSMgc3RhdHVzIHN0b3JlZDogbmV4dCBjcHUKKwlicmMJMiwyYgkJCSMgYnVzeTogCSB0cnkgYWdhaW4KKwlicmMJMSw0ZgkJCSMgbm90IG9wOgkgbmV4dCBjcHUKKzM6CisJbXZjCTAoNCwlcjExKSwyNjQoJXI3KQkjIGNvcHkgcHJlZml4IHJlZ2lzdGVyIHRvIHByZWZpeCBhcnJheQorCWFoaQklcjExLDQJCQkjIG5leHQgZWxlbWVudCBpbiBwcmVmaXggYXJyYXkKKwljbHIJJXIxMSwlcjEyCisJamUJNWYJCQkjIG5vIG1vcmUgc3BhY2UgaW4gcHJlZml4IGFycmF5Cis0OgorCWFoaQklcjgsMQkJCQkjIG5leHQgY3B1IChyOCArPSAxKQorCWNsCSVyOCwuTGxhc3RfY3B1LS5MUEcxKCVyMTMpCSMgaXMgbGFzdCBwb3NzaWJsZSBjcHUgPworCWpsCTFiCQkJCSMganVtcCBpZiBub3QgbGFzdCBjcHUKKzU6CisJbGhpCSVyMSwyCQkJIyBtb2RlIDIgPSBlc2FtZSAoZHVtcCkKKwlqCTZmCisJLmFsaWduIDQKKy5MaXBsX3NjaGliOgorCS5yZXB0IDEzCisJLmxvbmcgMAorCS5lbmRyCisubm9kdW1wOgorCWxoaQklcjEsMQkJCSMgbW9kZSAxID0gZXNhbWUgKG5vcm1hbCBpcGwpCis2OgorI2Vsc2UKKwlsaGkJJXIxLDEJCQkjIG1vZGUgMSA9IGVzYW1lIChub3JtYWwgaXBsKQorI2VuZGlmIC8qIENPTkZJR19aRkNQRFVNUCAqLwogCW12aQlfX0xDX0FSX01PREVfSUQsMQkjIHNldCBlc2FtZSBmbGFnCiAJc2xyCSVyMCwlcjAgCQkjIHNldCBjcHVpZCB0byB6ZXJvCiAJc2lncAklcjEsJXIwLDB4MTIJCSMgc3dpdGNoIHRvIGVzYW1lIG1vZGUKQEAgLTE0OSw2ICsyMTEsMTQgQEAKIC5MNG1hbGlnbjoucXVhZCAweGZmZmZmZmZmZmZjMDAwMDAKIC5Mc2NhbjJnOi5xdWFkCTB4ODAwMDAwMDAgKyAweDIwMDAwIC0gOAkjIDJHQiArIDEyOEsgLSA4CiAuTG5vcDoJLmxvbmcJMHgwNzAwMDcwMAorI2lmZGVmIENPTkZJR19aRkNQRFVNUAorLkxjdXJyZW50X2NwdToKKwkubG9uZyAweDAKKy5MbGFzdF9jcHU6CisJLmxvbmcgMHgwMDAwZmZmZgorLkxwcmVmX2Fycl9wdHI6CisJLmxvbmcgemZjcGR1bXBfcHJlZml4X2FycmF5CisjZW5kaWYgLyogQ09ORklHX1pGQ1BEVU1QICovCiAuTHBhcm1hZGRyOgogCS5xdWFkCVBBUk1BUkVBCiAJLmFsaWduCTY0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwppbmRleCBmNzMxMTg1Li4wNjgzM2FjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKQEAgLTI5LDM2ICsyOSwyMSBAQAogI2RlZmluZSBTQ0NCX0xPQURQQVJNICgmczM5MF9yZWFkaW5mb19zY2NiLmxvYWRwYXJtKQogI2RlZmluZSBTQ0NCX0ZMQUcgKHMzOTBfcmVhZGluZm9fc2NjYi5mbGFncykKIAotZW51bSBpcGxfdHlwZSB7Ci0JSVBMX1RZUEVfTk9ORQkgPSAxLAotCUlQTF9UWVBFX1VOS05PV04gPSAyLAotCUlQTF9UWVBFX0NDVwkgPSA0LAotCUlQTF9UWVBFX0ZDUAkgPSA4LAotCUlQTF9UWVBFX05TUwkgPSAxNiwKLX07Ci0KLSNkZWZpbmUgSVBMX05PTkVfU1RSCSAibm9uZSIKLSNkZWZpbmUgSVBMX1VOS05PV05fU1RSICAidW5rbm93biIKLSNkZWZpbmUgSVBMX0NDV19TVFIJICJjY3ciCi0jZGVmaW5lIElQTF9GQ1BfU1RSCSAiZmNwIgotI2RlZmluZSBJUExfTlNTX1NUUgkgIm5zcyIKLQotLyoKLSAqIE11c3QgYmUgaW4gZGF0YSBzZWN0aW9uIHNpbmNlIHRoZSBic3Mgc2VjdGlvbgotICogaXMgbm90IGNsZWFyZWQgd2hlbiB0aGVzZSBhcmUgYWNjZXNzZWQuCi0gKi8KLXUxNiBpcGxfZGV2bm8gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKSA9IDA7Ci11MzIgaXBsX2ZsYWdzIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSkgPSAwOworI2RlZmluZSBJUExfVU5LTk9XTl9TVFIJCSJ1bmtub3duIgorI2RlZmluZSBJUExfQ0NXX1NUUgkJImNjdyIKKyNkZWZpbmUgSVBMX0ZDUF9TVFIJCSJmY3AiCisjZGVmaW5lIElQTF9GQ1BfRFVNUF9TVFIJImZjcF9kdW1wIgorI2RlZmluZSBJUExfTlNTX1NUUgkJIm5zcyIKIAogc3RhdGljIGNoYXIgKmlwbF90eXBlX3N0cihlbnVtIGlwbF90eXBlIHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJUExfVFlQRV9OT05FOgotCQlyZXR1cm4gSVBMX05PTkVfU1RSOwogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlyZXR1cm4gSVBMX0NDV19TVFI7CiAJY2FzZSBJUExfVFlQRV9GQ1A6CiAJCXJldHVybiBJUExfRkNQX1NUUjsKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgorCQlyZXR1cm4gSVBMX0ZDUF9EVU1QX1NUUjsKIAljYXNlIElQTF9UWVBFX05TUzoKIAkJcmV0dXJuIElQTF9OU1NfU1RSOwogCWNhc2UgSVBMX1RZUEVfVU5LTk9XTjoKQEAgLTY3LDE1ICs1Miw1NSBAQAogCX0KIH0KIAorZW51bSBkdW1wX3R5cGUgeworCURVTVBfVFlQRV9OT05FCT0gMSwKKwlEVU1QX1RZUEVfQ0NXCT0gMiwKKwlEVU1QX1RZUEVfRkNQCT0gNCwKK307CisKKyNkZWZpbmUgRFVNUF9OT05FX1NUUgkgIm5vbmUiCisjZGVmaW5lIERVTVBfQ0NXX1NUUgkgImNjdyIKKyNkZWZpbmUgRFVNUF9GQ1BfU1RSCSAiZmNwIgorCitzdGF0aWMgY2hhciAqZHVtcF90eXBlX3N0cihlbnVtIGR1bXBfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRFVNUF9UWVBFX05PTkU6CisJCXJldHVybiBEVU1QX05PTkVfU1RSOworCWNhc2UgRFVNUF9UWVBFX0NDVzoKKwkJcmV0dXJuIERVTVBfQ0NXX1NUUjsKKwljYXNlIERVTVBfVFlQRV9GQ1A6CisJCXJldHVybiBEVU1QX0ZDUF9TVFI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKgorICogTXVzdCBiZSBpbiBkYXRhIHNlY3Rpb24gc2luY2UgdGhlIGJzcyBzZWN0aW9uCisgKiBpcyBub3QgY2xlYXJlZCB3aGVuIHRoZXNlIGFyZSBhY2Nlc3NlZC4KKyAqLworc3RhdGljIHUxNiBpcGxfZGV2bm8gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKSA9IDA7Cit1MzIgaXBsX2ZsYWdzIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSkgPSAwOworCiBlbnVtIGlwbF9tZXRob2QgewotCUlQTF9NRVRIT0RfTk9ORSwKLQlJUExfTUVUSE9EX0NDV19DSU8sCi0JSVBMX01FVEhPRF9DQ1dfRElBRywKLQlJUExfTUVUSE9EX0NDV19WTSwKLQlJUExfTUVUSE9EX0ZDUF9ST19ESUFHLAotCUlQTF9NRVRIT0RfRkNQX1JXX0RJQUcsCi0JSVBMX01FVEhPRF9GQ1BfUk9fVk0sCi0JSVBMX01FVEhPRF9OU1MsCisJUkVJUExfTUVUSE9EX0NDV19DSU8sCisJUkVJUExfTUVUSE9EX0NDV19ESUFHLAorCVJFSVBMX01FVEhPRF9DQ1dfVk0sCisJUkVJUExfTUVUSE9EX0ZDUF9ST19ESUFHLAorCVJFSVBMX01FVEhPRF9GQ1BfUldfRElBRywKKwlSRUlQTF9NRVRIT0RfRkNQX1JPX1ZNLAorCVJFSVBMX01FVEhPRF9GQ1BfRFVNUCwKKwlSRUlQTF9NRVRIT0RfTlNTLAorCVJFSVBMX01FVEhPRF9ERUZBVUxULAorfTsKKworZW51bSBkdW1wX21ldGhvZCB7CisJRFVNUF9NRVRIT0RfTk9ORSwKKwlEVU1QX01FVEhPRF9DQ1dfQ0lPLAorCURVTVBfTUVUSE9EX0NDV19ESUFHLAorCURVTVBfTUVUSE9EX0NDV19WTSwKKwlEVU1QX01FVEhPRF9GQ1BfRElBRywKIH07CiAKIGVudW0gc2h1dGRvd25fYWN0aW9uIHsKQEAgLTEwNywxNSArMTMyLDE1IEBACiBzdGF0aWMgaW50IHJlaXBsX2NhcGFiaWxpdGllcyA9IElQTF9UWVBFX1VOS05PV047CiAKIHN0YXRpYyBlbnVtIGlwbF90eXBlIHJlaXBsX3R5cGUgPSBJUExfVFlQRV9VTktOT1dOOwotc3RhdGljIGVudW0gaXBsX21ldGhvZCByZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX05PTkU7CitzdGF0aWMgZW51bSBpcGxfbWV0aG9kIHJlaXBsX21ldGhvZCA9IFJFSVBMX01FVEhPRF9ERUZBVUxUOwogc3RhdGljIHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICpyZWlwbF9ibG9ja19mY3A7CiBzdGF0aWMgc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKnJlaXBsX2Jsb2NrX2NjdzsKIAogc3RhdGljIGNoYXIgcmVpcGxfbnNzX25hbWVbTlNTX05BTUVfU0laRSArIDFdOwogCi1zdGF0aWMgaW50IGR1bXBfY2FwYWJpbGl0aWVzID0gSVBMX1RZUEVfTk9ORTsKLXN0YXRpYyBlbnVtIGlwbF90eXBlIGR1bXBfdHlwZSA9IElQTF9UWVBFX05PTkU7Ci1zdGF0aWMgZW51bSBpcGxfbWV0aG9kIGR1bXBfbWV0aG9kID0gSVBMX01FVEhPRF9OT05FOworc3RhdGljIGludCBkdW1wX2NhcGFiaWxpdGllcyA9IERVTVBfVFlQRV9OT05FOworc3RhdGljIGVudW0gZHVtcF90eXBlIGR1bXBfdHlwZSA9IERVTVBfVFlQRV9OT05FOworc3RhdGljIGVudW0gZHVtcF9tZXRob2QgZHVtcF9tZXRob2QgPSBEVU1QX01FVEhPRF9OT05FOwogc3RhdGljIHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICpkdW1wX2Jsb2NrX2ZjcDsKIHN0YXRpYyBzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqZHVtcF9ibG9ja19jY3c7CiAKQEAgLTEzNCw2ICsxNTksNyBAQAogCQk6ICJkIiAoc3ViY29kZSkgOiAiY2MiLCAibWVtb3J5Iik7CiAJcmV0dXJuIF9yYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRpYWczMDgpOwogCiAvKiBTWVNGUyAqLwogCkBAIC0xOTcsNyArMjIzLDcgQEAKICAqIGlwbCBzZWN0aW9uCiAgKi8KIAotc3RhdGljIGVudW0gaXBsX3R5cGUgaXBsX2dldF90eXBlKHZvaWQpCitzdGF0aWMgX19pbml0IGVudW0gaXBsX3R5cGUgZ2V0X2lwbF90eXBlKHZvaWQpCiB7CiAJc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKmlwbCA9IElQTF9QQVJNQkxPQ0tfU1RBUlQ7CiAKQEAgLTIxMSwxMiArMjM3LDQ0IEBACiAJCXJldHVybiBJUExfVFlQRV9VTktOT1dOOwogCWlmIChpcGwtPmhkci5wYnQgIT0gRElBRzMwOF9JUExfVFlQRV9GQ1ApCiAJCXJldHVybiBJUExfVFlQRV9VTktOT1dOOworCWlmIChpcGwtPmlwbF9pbmZvLmZjcC5vcHQgPT0gRElBRzMwOF9JUExfT1BUX0RVTVApCisJCXJldHVybiBJUExfVFlQRV9GQ1BfRFVNUDsKIAlyZXR1cm4gSVBMX1RZUEVfRkNQOwogfQogCit2b2lkIF9faW5pdCBzZXR1cF9pcGxfaW5mbyh2b2lkKQoreworCWlwbF9pbmZvLnR5cGUgPSBnZXRfaXBsX3R5cGUoKTsKKwlzd2l0Y2ggKGlwbF9pbmZvLnR5cGUpIHsKKwljYXNlIElQTF9UWVBFX0NDVzoKKwkJaXBsX2luZm8uZGF0YS5jY3cuZGV2X2lkLmRldm5vID0gaXBsX2Rldm5vOworCQlpcGxfaW5mby5kYXRhLmNjdy5kZXZfaWQuc3NpZCA9IDA7CisJCWJyZWFrOworCWNhc2UgSVBMX1RZUEVfRkNQOgorCWNhc2UgSVBMX1RZUEVfRkNQX0RVTVA6CisJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5kZXZubyA9CisJCQlJUExfUEFSTUJMT0NLX1NUQVJULT5pcGxfaW5mby5mY3AuZGV2bm87CisJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5zc2lkID0gMDsKKwkJaXBsX2luZm8uZGF0YS5mY3Aud3dwbiA9IElQTF9QQVJNQkxPQ0tfU1RBUlQtPmlwbF9pbmZvLmZjcC53d3BuOworCQlpcGxfaW5mby5kYXRhLmZjcC5sdW4gPSBJUExfUEFSTUJMT0NLX1NUQVJULT5pcGxfaW5mby5mY3AubHVuOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX05TUzoKKwkJc3RybmNweShpcGxfaW5mby5kYXRhLm5zcy5uYW1lLCBrZXJuZWxfbnNzX25hbWUsCisJCQlzaXplb2YoaXBsX2luZm8uZGF0YS5uc3MubmFtZSkpOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX1VOS05PV046CisJZGVmYXVsdDoKKwkJLyogV2UgaGF2ZSBubyBpbmZvIHRvIGNvcHkgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgaXBsX2luZm8gaXBsX2luZm87CitFWFBPUlRfU1lNQk9MX0dQTChpcGxfaW5mbyk7CisKIHN0YXRpYyBzc2l6ZV90IGlwbF90eXBlX3Nob3coc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLCBjaGFyICpwYWdlKQogewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgaXBsX3R5cGVfc3RyKGlwbF9nZXRfdHlwZSgpKSk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBpcGxfdHlwZV9zdHIoaXBsX2luZm8udHlwZSkpOwogfQogCiBzdGF0aWMgc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgc3lzX2lwbF90eXBlX2F0dHIgPSBfX0FUVFJfUk8oaXBsX3R5cGUpOwpAQCAtMjI1LDEwICsyODMsMTEgQEAKIHsKIAlzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqaXBsID0gSVBMX1BBUk1CTE9DS19TVEFSVDsKIAotCXN3aXRjaCAoaXBsX2dldF90eXBlKCkpIHsKKwlzd2l0Y2ggKGlwbF9pbmZvLnR5cGUpIHsKIAljYXNlIElQTF9UWVBFX0NDVzoKIAkJcmV0dXJuIHNwcmludGYocGFnZSwgIjAuMC4lMDR4XG4iLCBpcGxfZGV2bm8pOwogCWNhc2UgSVBMX1RZUEVfRkNQOgorCWNhc2UgSVBMX1RZUEVfRkNQX0RVTVA6CiAJCXJldHVybiBzcHJpbnRmKHBhZ2UsICIwLjAuJTA0eFxuIiwgaXBsLT5pcGxfaW5mby5mY3AuZGV2bm8pOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtNDg1LDIzICs1NDQsMjkgQEAKIAlzd2l0Y2godHlwZSkgewogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlpZiAoTUFDSElORV9JU19WTSkKLQkJCXJlaXBsX21ldGhvZCA9IElQTF9NRVRIT0RfQ0NXX1ZNOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0NDV19WTTsKIAkJZWxzZQotCQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9DQ1dfQ0lPOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0NDV19DSU87CiAJCWJyZWFrOwogCWNhc2UgSVBMX1RZUEVfRkNQOgogCQlpZiAoZGlhZzMwOF9zZXRfd29ya3MpCi0JCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX0ZDUF9SV19ESUFHOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0ZDUF9SV19ESUFHOwogCQllbHNlIGlmIChNQUNISU5FX0lTX1ZNKQotCQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9GQ1BfUk9fVk07CisJCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfRkNQX1JPX1ZNOwogCQllbHNlCi0JCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX0ZDUF9ST19ESUFHOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0ZDUF9ST19ESUFHOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgorCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfRkNQX0RVTVA7CiAJCWJyZWFrOwogCWNhc2UgSVBMX1RZUEVfTlNTOgotCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX05TUzsKKwkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX05TUzsKKwkJYnJlYWs7CisJY2FzZSBJUExfVFlQRV9VTktOT1dOOgorCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfREVGQVVMVDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9OT05FOworCQlCVUcoKTsKIAl9CiAJcmVpcGxfdHlwZSA9IHR5cGU7CiAJcmV0dXJuIDA7CkBAIC01NzksMjIgKzY0NCwyMiBAQAogCiAvKiBkdW1wIHR5cGUgKi8KIAotc3RhdGljIGludCBkdW1wX3NldF90eXBlKGVudW0gaXBsX3R5cGUgdHlwZSkKK3N0YXRpYyBpbnQgZHVtcF9zZXRfdHlwZShlbnVtIGR1bXBfdHlwZSB0eXBlKQogewogCWlmICghKGR1bXBfY2FwYWJpbGl0aWVzICYgdHlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCh0eXBlKSB7Ci0JY2FzZSBJUExfVFlQRV9DQ1c6CisJY2FzZSBEVU1QX1RZUEVfQ0NXOgogCQlpZiAoTUFDSElORV9JU19WTSkKLQkJCWR1bXBfbWV0aG9kID0gSVBMX01FVEhPRF9DQ1dfVk07CisJCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0NDV19WTTsKIAkJZWxzZQotCQkJZHVtcF9tZXRob2QgPSBJUExfTUVUSE9EX0NDV19DSU87CisJCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0NDV19DSU87CiAJCWJyZWFrOwotCWNhc2UgSVBMX1RZUEVfRkNQOgotCQlkdW1wX21ldGhvZCA9IElQTF9NRVRIT0RfRkNQX1JXX0RJQUc7CisJY2FzZSBEVU1QX1RZUEVfRkNQOgorCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0ZDUF9ESUFHOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkdW1wX21ldGhvZCA9IElQTF9NRVRIT0RfTk9ORTsKKwkJZHVtcF9tZXRob2QgPSBEVU1QX01FVEhPRF9OT05FOwogCX0KIAlkdW1wX3R5cGUgPSB0eXBlOwogCXJldHVybiAwOwpAQCAtNjAyLDcgKzY2Nyw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGR1bXBfdHlwZV9zaG93KHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywgY2hhciAqcGFnZSkKIHsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGlwbF90eXBlX3N0cihkdW1wX3R5cGUpKTsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGR1bXBfdHlwZV9zdHIoZHVtcF90eXBlKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGR1bXBfdHlwZV9zdG9yZShzdHJ1Y3Qgc3Vic3lzdGVtICpzdWJzeXMsIGNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTYxMCwxMiArNjc1LDEyIEBACiB7CiAJaW50IHJjID0gLUVJTlZBTDsKIAotCWlmIChzdHJuY21wKGJ1ZiwgSVBMX05PTkVfU1RSLCBzdHJsZW4oSVBMX05PTkVfU1RSKSkgPT0gMCkKLQkJcmMgPSBkdW1wX3NldF90eXBlKElQTF9UWVBFX05PTkUpOwotCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCBJUExfQ0NXX1NUUiwgc3RybGVuKElQTF9DQ1dfU1RSKSkgPT0gMCkKLQkJcmMgPSBkdW1wX3NldF90eXBlKElQTF9UWVBFX0NDVyk7Ci0JZWxzZSBpZiAoc3RybmNtcChidWYsIElQTF9GQ1BfU1RSLCBzdHJsZW4oSVBMX0ZDUF9TVFIpKSA9PSAwKQotCQlyYyA9IGR1bXBfc2V0X3R5cGUoSVBMX1RZUEVfRkNQKTsKKwlpZiAoc3RybmNtcChidWYsIERVTVBfTk9ORV9TVFIsIHN0cmxlbihEVU1QX05PTkVfU1RSKSkgPT0gMCkKKwkJcmMgPSBkdW1wX3NldF90eXBlKERVTVBfVFlQRV9OT05FKTsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgRFVNUF9DQ1dfU1RSLCBzdHJsZW4oRFVNUF9DQ1dfU1RSKSkgPT0gMCkKKwkJcmMgPSBkdW1wX3NldF90eXBlKERVTVBfVFlQRV9DQ1cpOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCBEVU1QX0ZDUF9TVFIsIHN0cmxlbihEVU1QX0ZDUF9TVFIpKSA9PSAwKQorCQlyYyA9IGR1bXBfc2V0X3R5cGUoRFVNUF9UWVBFX0ZDUCk7CiAJcmV0dXJuIChyYyAhPSAwKSA/IHJjIDogbGVuOwogfQogCkBAIC02NjQsMTQgKzcyOSwxNCBAQAogCWNoYXIgbG9hZHBhcm1bTE9BRFBBUk1fTEVOICsgMV07CiAKIAlzd2l0Y2ggKHJlaXBsX21ldGhvZCkgewotCWNhc2UgSVBMX01FVEhPRF9DQ1dfQ0lPOgorCWNhc2UgUkVJUExfTUVUSE9EX0NDV19DSU86CiAJCWRldmlkLmRldm5vID0gcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm87Ci0JCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cgJiYgZGV2aWQuZGV2bm8gPT0gaXBsX2Rldm5vKQorCQlpZiAoaXBsX2luZm8udHlwZSA9PSBJUExfVFlQRV9DQ1cgJiYgZGV2aWQuZGV2bm8gPT0gaXBsX2Rldm5vKQogCQkJZGlhZzMwOChESUFHMzA4X0lQTCwgTlVMTCk7CiAJCWRldmlkLnNzaWQgID0gMDsKIAkJcmVpcGxfY2N3X2RldigmZGV2aWQpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfQ0NXX1ZNOgorCWNhc2UgUkVJUExfTUVUSE9EX0NDV19WTToKIAkJcmVpcGxfZ2V0X2FzY2lpX2xvYWRwYXJtKGxvYWRwYXJtKTsKIAkJaWYgKHN0cmxlbihsb2FkcGFybSkgPT0gMCkKIAkJCXNwcmludGYoYnVmLCAiSVBMICVYIiwKQEAgLTY4MSwzMCArNzQ2LDMyIEBACiAJCQkJcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8sIGxvYWRwYXJtKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfQ0NXX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfQ0NXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIHJlaXBsX2Jsb2NrX2Njdyk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JXX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfRkNQX1JXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIHJlaXBsX2Jsb2NrX2ZjcCk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JPX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfRkNQX1JPX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JPX1ZNOgorCWNhc2UgUkVJUExfTUVUSE9EX0ZDUF9ST19WTToKIAkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9OU1M6CisJY2FzZSBSRUlQTF9NRVRIT0RfTlNTOgogCQlzcHJpbnRmKGJ1ZiwgIklQTCAlcyIsIHJlaXBsX25zc19uYW1lKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfTk9ORToKLQlkZWZhdWx0OgorCWNhc2UgUkVJUExfTUVUSE9EX0RFRkFVTFQ6CiAJCWlmIChNQUNISU5FX0lTX1ZNKQogCQkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKKwljYXNlIFJFSVBMX01FVEhPRF9GQ1BfRFVNUDoKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKIH0KQEAgLTcxNSwyOCArNzgyLDI4IEBACiAJc3RhdGljIGNoYXIgYnVmWzEwMF07CiAKIAlzd2l0Y2ggKGR1bXBfbWV0aG9kKSB7Ci0JY2FzZSBJUExfTUVUSE9EX0NDV19DSU86CisJY2FzZSBEVU1QX01FVEhPRF9DQ1dfQ0lPOgogCQlzbXBfc2VuZF9zdG9wKCk7CiAJCWRldmlkLmRldm5vID0gZHVtcF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubzsKIAkJZGV2aWQuc3NpZCAgPSAwOwogCQlyZWlwbF9jY3dfZGV2KCZkZXZpZCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9DQ1dfVk06CisJY2FzZSBEVU1QX01FVEhPRF9DQ1dfVk06CiAJCXNtcF9zZW5kX3N0b3AoKTsKIAkJc3ByaW50ZihidWYsICJTVE9SRSBTVEFUVVMiKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlzcHJpbnRmKGJ1ZiwgIklQTCAlWCIsIGR1bXBfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8pOwogCQlfX2NwY21kKGJ1ZiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9DQ1dfRElBRzoKKwljYXNlIERVTVBfTUVUSE9EX0NDV19ESUFHOgogCQlkaWFnMzA4KERJQUczMDhfU0VULCBkdW1wX2Jsb2NrX2Njdyk7CiAJCWRpYWczMDgoRElBRzMwOF9EVU1QLCBOVUxMKTsKIAkJYnJlYWs7Ci0JY2FzZSBJUExfTUVUSE9EX0ZDUF9SV19ESUFHOgorCWNhc2UgRFVNUF9NRVRIT0RfRkNQX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIGR1bXBfYmxvY2tfZmNwKTsKIAkJZGlhZzMwOChESUFHMzA4X0RVTVAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfTk9ORToKKwljYXNlIERVTVBfTUVUSE9EX05PTkU6CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KQEAgLTc3NywxMiArODQ0LDEzIEBACiAJcmMgPSBmaXJtd2FyZV9yZWdpc3RlcigmaXBsX3N1YnN5cyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0Jc3dpdGNoIChpcGxfZ2V0X3R5cGUoKSkgeworCXN3aXRjaCAoaXBsX2luZm8udHlwZSkgewogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaXBsX3N1YnN5cy5rc2V0LmtvYmosCiAJCQkJCSZpcGxfY2N3X2F0dHJfZ3JvdXApOwogCQlicmVhazsKIAljYXNlIElQTF9UWVBFX0ZDUDoKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgogCQlyYyA9IGlwbF9yZWdpc3Rlcl9mY3BfZmlsZXMoKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfVFlQRV9OU1M6CkBAIC04NTIsNyArOTIwLDcgQEAKIAkvKiBGSVhNRTogY2hlY2sgZm9yIGRpYWczMDhfc2V0X3dvcmtzIHdoZW4gZW5hYmxpbmcgZGlhZyBjY3cgcmVpcGwgKi8KIAlpZiAoIU1BQ0hJTkVfSVNfVk0pCiAJCXN5c19yZWlwbF9jY3dfbG9hZHBhcm1fYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cpCisJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfQ0NXKQogCQlyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubyA9IGlwbF9kZXZubzsKIAlyZWlwbF9jYXBhYmlsaXRpZXMgfD0gSVBMX1RZUEVfQ0NXOwogCXJldHVybiAwOwpAQCAtODYyLDkgKzkzMCw5IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKCghZGlhZzMwOF9zZXRfd29ya3MpICYmIChpcGxfZ2V0X3R5cGUoKSAhPSBJUExfVFlQRV9GQ1ApKQorCWlmICgoIWRpYWczMDhfc2V0X3dvcmtzKSAmJiAoaXBsX2luZm8udHlwZSAhPSBJUExfVFlQRV9GQ1ApKQogCQlyZXR1cm4gMDsKLQlpZiAoKCFkaWFnMzA4X3NldF93b3JrcykgJiYgKGlwbF9nZXRfdHlwZSgpID09IElQTF9UWVBFX0ZDUCkpCisJaWYgKCghZGlhZzMwOF9zZXRfd29ya3MpICYmIChpcGxfaW5mby50eXBlID09IElQTF9UWVBFX0ZDUCkpCiAJCW1ha2VfYXR0cnNfcm8ocmVpcGxfZmNwX2F0dHJzKTsKIAogCXJlaXBsX2Jsb2NrX2ZjcCA9ICh2b2lkICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTg3NSw3ICs5NDMsNyBAQAogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcmVpcGxfYmxvY2tfZmNwKTsKIAkJcmV0dXJuIHJjOwogCX0KLQlpZiAoaXBsX2dldF90eXBlKCkgPT0gSVBMX1RZUEVfRkNQKSB7CisJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfRkNQKSB7CiAJCW1lbWNweShyZWlwbF9ibG9ja19mY3AsIElQTF9QQVJNQkxPQ0tfU1RBUlQsIFBBR0VfU0laRSk7CiAJfSBlbHNlIHsKIAkJcmVpcGxfYmxvY2tfZmNwLT5oZHIubGVuID0gSVBMX1BBUk1fQkxLX0ZDUF9MRU47CkBAIC05MDksNyArOTc3LDcgQEAKIAlyYyA9IHJlaXBsX25zc19pbml0KCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSByZWlwbF9zZXRfdHlwZShpcGxfZ2V0X3R5cGUoKSk7CisJcmMgPSByZWlwbF9zZXRfdHlwZShpcGxfaW5mby50eXBlKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlyZXR1cm4gMDsKQEAgLTkzMSw3ICs5OTksNyBAQAogCWR1bXBfYmxvY2tfY2N3LT5oZHIudmVyc2lvbiA9IElQTF9QQVJNX0JMT0NLX1ZFUlNJT047CiAJZHVtcF9ibG9ja19jY3ctPmhkci5ibGswX2xlbiA9IElQTF9QQVJNX0JMSzBfQ0NXX0xFTjsKIAlkdW1wX2Jsb2NrX2Njdy0+aGRyLnBidCA9IERJQUczMDhfSVBMX1RZUEVfQ0NXOwotCWR1bXBfY2FwYWJpbGl0aWVzIHw9IElQTF9UWVBFX0NDVzsKKwlkdW1wX2NhcGFiaWxpdGllcyB8PSBEVU1QX1RZUEVfQ0NXOwogCXJldHVybiAwOwogfQogCkBAIC05NTYsNyArMTAyNCw3IEBACiAJZHVtcF9ibG9ja19mY3AtPmhkci5ibGswX2xlbiA9IElQTF9QQVJNX0JMSzBfRkNQX0xFTjsKIAlkdW1wX2Jsb2NrX2ZjcC0+aGRyLnBidCA9IERJQUczMDhfSVBMX1RZUEVfRkNQOwogCWR1bXBfYmxvY2tfZmNwLT5pcGxfaW5mby5mY3Aub3B0ID0gRElBRzMwOF9JUExfT1BUX0RVTVA7Ci0JZHVtcF9jYXBhYmlsaXRpZXMgfD0gSVBMX1RZUEVfRkNQOworCWR1bXBfY2FwYWJpbGl0aWVzIHw9IERVTVBfVFlQRV9GQ1A7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5NSw3ICsxMDYzLDcgQEAKIAlyYyA9IGR1bXBfZmNwX2luaXQoKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlkdW1wX3NldF90eXBlKElQTF9UWVBFX05PTkUpOworCWR1bXBfc2V0X3R5cGUoRFVNUF9UWVBFX05PTkUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDM4LDYgKzExMDYsMjcgQEAKIAogX19pbml0Y2FsbChzMzkwX2lwbF9pbml0KTsKIAordm9pZCBfX2luaXQgaXBsX3NhdmVfcGFyYW1ldGVycyh2b2lkKQoreworCXN0cnVjdCBjaW9faXBsaW5mbyBpcGxpbmZvOworCXVuc2lnbmVkIGludCAqaXBsX3B0cjsKKwl2b2lkICpzcmMsICpkc3Q7CisKKwlpZiAoY2lvX2dldF9pcGxpbmZvKCZpcGxpbmZvKSkKKwkJcmV0dXJuOworCisJaXBsX2Rldm5vID0gaXBsaW5mby5kZXZubzsKKwlpcGxfZmxhZ3MgfD0gSVBMX0RFVk5PX1ZBTElEOworCWlmICghaXBsaW5mby5pc19xZGlvKQorCQlyZXR1cm47CisJaXBsX2ZsYWdzIHw9IElQTF9QQVJNQkxPQ0tfVkFMSUQ7CisJaXBsX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilfX0xDX0lQTF9QQVJNQkxPQ0tfUFRSOworCXNyYyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpKmlwbF9wdHI7CisJZHN0ID0gKHZvaWQgKilJUExfUEFSTUJMT0NLX09SSUdJTjsKKwltZW1tb3ZlKGRzdCwgc3JjLCBQQUdFX1NJWkUpOworCSppcGxfcHRyID0gSVBMX1BBUk1CTE9DS19PUklHSU47Cit9CisKIHN0YXRpYyBMSVNUX0hFQUQocmNhbGwpOwogc3RhdGljIERFRklORV9NVVRFWChyY2FsbF9tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCmluZGV4IDM5ZDFkZDcuLjU5YjRlNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC0zOTgsOSArMzk5LDEwIEBACiAJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKIHsKIAl2ZnJlZShtZS0+YXJjaC5zeW1pbmZvKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKTsKIH0KIAogdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKKwltb2R1bGVfYnVnX2NsZWFudXAobW9kKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNWFjZmFjNi4uMTFkOWIwMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI4MCwyNCArMjgwLDI2IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZm9yayh2b2lkKQogewotCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MuZ3Byc1sxNV0sICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKKwlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5ncHJzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfY2xvbmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2xvbmUodm9pZCkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBuZXdzcDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgbmV3c3A7CiAJaW50IF9fdXNlciAqcGFyZW50X3RpZHB0ciwgKmNoaWxkX3RpZHB0cjsKIAotICAgICAgICBjbG9uZV9mbGFncyA9IHJlZ3MuZ3Byc1szXTsKLSAgICAgICAgbmV3c3AgPSByZWdzLm9yaWdfZ3ByMjsKLQlwYXJlbnRfdGlkcHRyID0gKGludCBfX3VzZXIgKikgcmVncy5ncHJzWzRdOwotCWNoaWxkX3RpZHB0ciA9IChpbnQgX191c2VyICopIHJlZ3MuZ3Byc1s1XTsKLSAgICAgICAgaWYgKCFuZXdzcCkKLSAgICAgICAgICAgICAgICBuZXdzcCA9IHJlZ3MuZ3Byc1sxNV07Ci0gICAgICAgIHJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgJnJlZ3MsIDAsCisJY2xvbmVfZmxhZ3MgPSByZWdzLT5ncHJzWzNdOworCW5ld3NwID0gcmVncy0+b3JpZ19ncHIyOworCXBhcmVudF90aWRwdHIgPSAoaW50IF9fdXNlciAqKSByZWdzLT5ncHJzWzRdOworCWNoaWxkX3RpZHB0ciA9IChpbnQgX191c2VyICopIHJlZ3MtPmdwcnNbNV07CisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLT5ncHJzWzE1XTsKKwlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsIHJlZ3MsIDAsCiAJCSAgICAgICBwYXJlbnRfdGlkcHRyLCBjaGlsZF90aWRwdHIpOwogfQogCkBAIC0zMTEsNDAgKzMxMyw1MiBAQAogICogZG8gbm90IGhhdmUgZW5vdWdoIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyB0byBob2xkIGFsbAogICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX3Zmb3JrKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsCi0JCSAgICAgICByZWdzLmdwcnNbMTVdLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7CisJCSAgICAgICByZWdzLT5ncHJzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBleGVjdmVfdGFpbCh2b2lkKQoreworCXRhc2tfbG9jayhjdXJyZW50KTsKKwljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgPSAwOworCWlmIChNQUNISU5FX0hBU19JRUVFKQorCQlhc20gdm9sYXRpbGUoInNmcGMgJTAsJTAiIDogOiAiZCIgKDApKTsKIH0KIAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyByZWdzKQorYXNtbGlua2FnZSBsb25nIHN5c19leGVjdmUodm9pZCkKIHsKLSAgICAgICAgaW50IGVycm9yOwotICAgICAgICBjaGFyICogZmlsZW5hbWU7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJY2hhciAqZmlsZW5hbWU7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJaW50IHJjOwogCi0gICAgICAgIGZpbGVuYW1lID0gZ2V0bmFtZSgoY2hhciBfX3VzZXIgKikgcmVncy5vcmlnX2dwcjIpOwotICAgICAgICBlcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwotICAgICAgICBpZiAoSVNfRVJSKGZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmdwcnNbM10sCi0JCQkgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmdwcnNbNF0sICZyZWdzKTsKLQlpZiAoZXJyb3IgPT0gMCkgewotCQl0YXNrX2xvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOwotCQl0YXNrX3VubG9jayhjdXJyZW50KTsKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjID0gMDsKLQkJaWYgKE1BQ0hJTkVfSEFTX0lFRUUpCi0JCQlhc20gdm9sYXRpbGUoInNmcGMgJTAsJTAiIDogOiAiZCIgKDApKTsKKwlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIHJlZ3MtPm9yaWdfZ3ByMik7CisJaWYgKElTX0VSUihmaWxlbmFtZSkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihmaWxlbmFtZSk7CisJCWdvdG8gb3V0OwogCX0KLSAgICAgICAgcHV0bmFtZShmaWxlbmFtZSk7CisJcmMgPSBkb19leGVjdmUoZmlsZW5hbWUsIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLT5ncHJzWzNdLAorCQkgICAgICAgKGNoYXIgX191c2VyICogX191c2VyICopIHJlZ3MtPmdwcnNbNF0sIHJlZ3MpOworCWlmIChyYykgeworCQlyZXN1bHQgPSByYzsKKwkJZ290byBvdXRfcHV0bmFtZTsKKwl9CisJZXhlY3ZlX3RhaWwoKTsKKwlyZXN1bHQgPSByZWdzLT5ncHJzWzJdOworb3V0X3B1dG5hbWU6CisJcHV0bmFtZShmaWxlbmFtZSk7CiBvdXQ6Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmVzdWx0OwogfQogCi0KIC8qCiAgKiBmaWxsIGluIHRoZSBGUFUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDg2M2M4ZDAuLjNkZmQwOTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTI4NSw2ICsyODUsMjYgQEAKIAl9CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19aRkNQRFVNUCkgfHwgZGVmaW5lZChDT05GSUdfWkZDUERVTVBfTU9EVUxFKQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3pmY3BkdW1wKHVuc2lnbmVkIGludCBjb25zb2xlX2Rldm5vKQoreworCXN0YXRpYyBjaGFyIHN0cls2NF07CisKKwlpZiAoaXBsX2luZm8udHlwZSAhPSBJUExfVFlQRV9GQ1BfRFVNUCkKKwkJcmV0dXJuOworCWlmIChjb25zb2xlX2Rldm5vICE9IC0xKQorCQlzcHJpbnRmKHN0ciwgImNpb19pZ25vcmU9YWxsLCEwLjAuJTA0eCwhMC4wLiUwNHgiLAorCQkJaXBsX2luZm8uZGF0YS5mY3AuZGV2X2lkLmRldm5vLCBjb25zb2xlX2Rldm5vKTsKKwllbHNlCisJCXNwcmludGYoc3RyLCAiY2lvX2lnbm9yZT1hbGwsITAuMC4lMDR4IiwKKwkJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5kZXZubyk7CisJc3RyY2F0KENPTU1BTkRfTElORSwgc3RyKTsKKwljb25zb2xlX2xvZ2xldmVsID0gMjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfemZjcGR1bXAodW5zaWduZWQgaW50IGNvbnNvbGVfZGV2bm8pIHt9CisjZW5kaWYgLyogQ09ORklHX1pGQ1BEVU1QICovCisKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkICgqX21hY2hpbmVfcmVzdGFydCkoY2hhciAqY29tbWFuZCkgPSBtYWNoaW5lX3Jlc3RhcnRfc21wOwogdm9pZCAoKl9tYWNoaW5lX2hhbHQpKHZvaWQpID0gbWFjaGluZV9oYWx0X3NtcDsKQEAgLTU4NiwxMyArNjA2LDIwIEBACiAJfQogfQogCit1bnNpZ25lZCBsb25nIHJlYWxfbWVtb3J5X3NpemU7CitFWFBPUlRfU1lNQk9MX0dQTChyZWFsX21lbW9yeV9zaXplKTsKKwogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX21lbW9yeV9lbmQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJlYWxfc2l6ZSwgbWVtb3J5X3NpemU7CisJdW5zaWduZWQgbG9uZyBtZW1vcnlfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG1heF9tZW0sIG1heF9waHlzOwogCWludCBpOwogCi0JbWVtb3J5X3NpemUgPSByZWFsX3NpemUgPSAwOworI2lmIGRlZmluZWQoQ09ORklHX1pGQ1BEVU1QKSB8fCBkZWZpbmVkKENPTkZJR19aRkNQRFVNUF9NT0RVTEUpCisJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfRkNQX0RVTVApCisJCW1lbW9yeV9lbmQgPSBaRkNQRFVNUF9IU0FfU0laRTsKKyNlbmRpZgorCW1lbW9yeV9zaXplID0gMDsKIAltYXhfcGh5cyA9IFZNQUxMT0NfRU5EX0lOSVQgLSBWTUFMTE9DX01JTl9TSVpFOwogCW1lbW9yeV9lbmQgJj0gUEFHRV9NQVNLOwogCkBAIC02MDEsNyArNjI4LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CiAJCXN0cnVjdCBtZW1fY2h1bmsgKmNodW5rID0gJm1lbW9yeV9jaHVua1tpXTsKIAotCQlyZWFsX3NpemUgPSBtYXgocmVhbF9zaXplLCBjaHVuay0+YWRkciArIGNodW5rLT5zaXplKTsKKwkJcmVhbF9tZW1vcnlfc2l6ZSA9IG1heChyZWFsX21lbW9yeV9zaXplLAorCQkJCSAgICAgICBjaHVuay0+YWRkciArIGNodW5rLT5zaXplKTsKIAkJaWYgKGNodW5rLT5hZGRyID49IG1heF9tZW0pIHsKIAkJCW1lbXNldChjaHVuaywgMCwgc2l6ZW9mKCpjaHVuaykpOwogCQkJY29udGludWU7CkBAIC03NjUsNiArNzkzLDcgQEAKIAogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKKwlzZXR1cF9pcGxfaW5mbygpOwogCXNldHVwX21lbW9yeV9lbmQoKTsKIAlzZXR1cF9hZGRyZXNzaW5nX21vZGUoKTsKIAlzZXR1cF9tZW1vcnkoKTsKQEAgLTc4Miw2ICs4MTEsOSBAQAogCiAgICAgICAgIC8qIFNldHVwIGRlZmF1bHQgY29uc29sZSAqLwogCWNvbm1vZGVfZGVmYXVsdCgpOworCisJLyogU2V0dXAgemZjcGR1bXAgc3VwcG9ydCAqLworCXNldHVwX3pmY3BkdW1wKGNvbnNvbGVfZGV2bm8pOwogfQogCiB2b2lkIHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX1MzOTAgKmNwdWluZm8pCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwppbmRleCA1NTRmOWNmLi4zYzQxOTA3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKQEAgLTEwMiw5ICsxMDIsOSBAQAogfQogCiBhc21saW5rYWdlIGxvbmcKLXN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcywKLQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3Byc1sxNV0pOwogfQogCkBAIC0xNjMsOCArMTYzLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX3NpZ3JldHVybih2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc2lnZnJhbWUgX191c2VyICopcmVncy0+Z3Byc1sxNV07CiAJc2lnc2V0X3Qgc2V0OwogCkBAIC0xODksOCArMTkwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3JldHVybih2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAocnRfc2lnZnJhbWUgX191c2VyICopcmVncy0+Z3Byc1sxNV07CiAJc2lnc2V0X3Qgc2V0OwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCA5Nzc2NGY3Li4zNzU0ZTIwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCiAgKiAgYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwogICoKLSAqICAgIENvcHlyaWdodCAoQykgSUJNIENvcnAuIDE5OTksMjAwNgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk5LDIwMDcKICAqICAgIEF1dGhvcihzKTogRGVuaXMgSm9zZXBoIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKSwKLSAqICAgICAgICAgICAgICAgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQotICogICAgICAgICAgICAgICBIZWlrbyBDYXJzdGVucyAoaGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbSkKKyAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQorICoJCSBIZWlrbyBDYXJzdGVucyAoaGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbSkKICAqCi0gKiAgYmFzZWQgb24gb3RoZXIgc21wIHN0dWZmIGJ5IAorICogIGJhc2VkIG9uIG90aGVyIHNtcCBzdHVmZiBieQogICogICAgKGMpIDE5OTUgQWxhbiBDb3gsIEN5bXJ1TkVUIEx0ZCAgPGFsYW5AY3ltcnUubmV0PgogICogICAgKGMpIDE5OTggSW5nbyBNb2xuYXIKICAqCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaWdwLmg+CkBAIC00MCwxNyArNDEsMTkgQEAKICNpbmNsdWRlIDxhc20vY3BjbWQuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotZXh0ZXJuIHZvbGF0aWxlIGludCBfX2NwdV9sb2dpY2FsX21hcFtdOworI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CiAKIC8qCiAgKiBBbiBhcnJheSB3aXRoIGEgcG9pbnRlciB0aGUgbG93Y29yZSBvZiBldmVyeSBDUFUuCiAgKi8KLQogc3RydWN0IF9sb3djb3JlICpsb3djb3JlX3B0cltOUl9DUFVTXTsKK0VYUE9SVF9TWU1CT0wobG93Y29yZV9wdHIpOwogCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CisKIGNwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwID0gQ1BVX01BU0tfTk9ORTsKK0VYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnJlbnRfc2V0W05SX0NQVVNdOwogCkBAIC03MCw3ICs3Myw3IEBACiAJaW50IHdhaXQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKiBjYWxsX2RhdGE7CitzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKmNhbGxfZGF0YTsKIAogLyoKICAqICdDYWxsIGZ1bmN0aW9uJyBpbnRlcnJ1cHQgY2FsbGJhY2sKQEAgLTE1MCw4ICsxNTMsOCBAQAogICoKICAqIFJ1biBhIGZ1bmN0aW9uIG9uIGFsbCBvdGhlciBDUFVzLgogICoKLSAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIG9yIGZyb20gYQotICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuIFlvdSBtYXkgY2FsbCBpdCBmcm9tIGEgYm90dG9tIGhhbGYuCisgKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cywgZnJvbSBhCisgKiBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBvciBmcm9tIGEgYm90dG9tIGhhbGYuCiAgKi8KIGludCBzbXBfY2FsbF9mdW5jdGlvbih2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgbm9uYXRvbWljLAogCQkgICAgICBpbnQgd2FpdCkKQEAgLTE3NywxMSArMTgwLDExIEBACiAgKgogICogUnVuIGEgZnVuY3Rpb24gb24gb25lIHByb2Nlc3Nvci4KICAqCi0gKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyBvciBmcm9tIGEKLSAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyLiBZb3UgbWF5IGNhbGwgaXQgZnJvbSBhIGJvdHRvbSBoYWxmLgorICogWW91IG11c3Qgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGRpc2FibGVkIGludGVycnVwdHMsIGZyb20gYQorICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgb3IgZnJvbSBhIGJvdHRvbSBoYWxmLgogICovCiBpbnQgc21wX2NhbGxfZnVuY3Rpb25fb24odm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IG5vbmF0b21pYywKLQkJCSAgaW50IHdhaXQsIGludCBjcHUpCisJCQkgaW50IHdhaXQsIGludCBjcHUpCiB7CiAJY3B1bWFza190IG1hcCA9IENQVV9NQVNLX05PTkU7CiAKQEAgLTE5NSw5ICsxOTgsOSBAQAogCiBzdGF0aWMgdm9pZCBkb19zZW5kX3N0b3Aodm9pZCkKIHsKLSAgICAgICAgaW50IGNwdSwgcmM7CisJaW50IGNwdSwgcmM7CiAKLSAgICAgICAgLyogc3RvcCBhbGwgcHJvY2Vzc29ycyAqLworCS8qIHN0b3AgYWxsIHByb2Nlc3NvcnMgKi8KIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjA5LDkgKzIxMiw5IEBACiAKIHN0YXRpYyB2b2lkIGRvX3N0b3JlX3N0YXR1cyh2b2lkKQogewotICAgICAgICBpbnQgY3B1LCByYzsKKwlpbnQgY3B1LCByYzsKIAotICAgICAgICAvKiBzdG9yZSBzdGF0dXMgb2YgYWxsIHByb2Nlc3NvcnMgaW4gdGhlaXIgbG93Y29yZXMgKHJlYWwgMCkgKi8KKwkvKiBzdG9yZSBzdGF0dXMgb2YgYWxsIHByb2Nlc3NvcnMgaW4gdGhlaXIgbG93Y29yZXMgKHJlYWwgMCkgKi8KIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjE5LDggKzIyMiw4IEBACiAJCQlyYyA9IHNpZ25hbF9wcm9jZXNzb3JfcCgKIAkJCQkoX191MzIpKHVuc2lnbmVkIGxvbmcpIGxvd2NvcmVfcHRyW2NwdV0sIGNwdSwKIAkJCQlzaWdwX3N0b3JlX3N0YXR1c19hdF9hZGRyZXNzKTsKLQkJfSB3aGlsZShyYyA9PSBzaWdwX2J1c3kpOwotICAgICAgICB9CisJCX0gd2hpbGUgKHJjID09IHNpZ3BfYnVzeSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBkb193YWl0X2Zvcl9zdG9wKHZvaWQpCkBAIC0yMzEsNyArMjM0LDcgQEAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJCWNvbnRpbnVlOwotCQl3aGlsZSghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQorCQl3aGlsZSAoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKIAkJCWNwdV9yZWxheCgpOwogCX0KIH0KQEAgLTI0NSw3ICsyNDgsNyBAQAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMvbWFjaGluZSBjaGVja3MgKi8KIAlfX2xvYWRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX01DSEVDSyk7CiAKLSAgICAgICAgLyogd3JpdGUgbWFnaWMgbnVtYmVyIHRvIHplcm8gcGFnZSAoYWJzb2x1dGUgMCkgKi8KKwkvKiB3cml0ZSBtYWdpYyBudW1iZXIgdG8gemVybyBwYWdlIChhYnNvbHV0ZSAwKSAqLwogCWxvd2NvcmVfcHRyW3NtcF9wcm9jZXNzb3JfaWQoKV0tPnBhbmljX21hZ2ljID0gX19QQU5JQ19NQUdJQzsKIAogCS8qIHN0b3Agb3RoZXIgcHJvY2Vzc29ycy4gKi8KQEAgLTI2MSw4ICsyNjQsNyBAQAogLyoKICAqIFJlYm9vdCwgaGFsdCBhbmQgcG93ZXJfb2ZmIHJvdXRpbmVzIGZvciBTTVAuCiAgKi8KLQotdm9pZCBtYWNoaW5lX3Jlc3RhcnRfc21wKGNoYXIgKiBfX3VudXNlZCkgCit2b2lkIG1hY2hpbmVfcmVzdGFydF9zbXAoY2hhciAqX191bnVzZWQpCiB7CiAJc21wX3NlbmRfc3RvcCgpOwogCWRvX3JlaXBsKCk7CkBAIC0yOTMsMTcgKzI5NSwxNyBAQAogCiBzdGF0aWMgdm9pZCBkb19leHRfY2FsbF9pbnRlcnJ1cHQoX191MTYgY29kZSkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBiaXRzOworCXVuc2lnbmVkIGxvbmcgYml0czsKIAotICAgICAgICAvKgotICAgICAgICAgKiBoYW5kbGUgYml0IHNpZ25hbCBleHRlcm5hbCBjYWxscwotICAgICAgICAgKgotICAgICAgICAgKiBGb3IgdGhlIGVjX3NjaGVkdWxlIHNpZ25hbCB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcuIEFsbCB0aGUgd29yawotICAgICAgICAgKiBpcyBkb25lIGF1dG9tYXRpY2FsbHkgd2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgaW50ZXJydXB0LgotICAgICAgICAgKi8KKwkvKgorCSAqIGhhbmRsZSBiaXQgc2lnbmFsIGV4dGVybmFsIGNhbGxzCisJICoKKwkgKiBGb3IgdGhlIGVjX3NjaGVkdWxlIHNpZ25hbCB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcuIEFsbCB0aGUgd29yaworCSAqIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCisJICovCiAJYml0cyA9IHhjaGcoJlMzOTBfbG93Y29yZS5leHRfY2FsbF9mYXN0LCAwKTsKIAotCWlmICh0ZXN0X2JpdChlY19jYWxsX2Z1bmN0aW9uLCAmYml0cykpIAorCWlmICh0ZXN0X2JpdChlY19jYWxsX2Z1bmN0aW9uLCAmYml0cykpCiAJCWRvX2NhbGxfZnVuY3Rpb24oKTsKIH0KIApAQCAtMzEzLDExICszMTUsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgc21wX2V4dF9iaXRjYWxsKGludCBjcHUsIGVjX2JpdF9zaWcgc2lnKQogewotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgc2lnbmFsaW5nIGJpdCBpbiBsb3djb3JlIG9mIHRhcmdldCBjcHUgYW5kIGtpY2sgaXQKLSAgICAgICAgICovCisJLyoKKwkgKiBTZXQgc2lnbmFsaW5nIGJpdCBpbiBsb3djb3JlIG9mIHRhcmdldCBjcHUgYW5kIGtpY2sgaXQKKwkgKi8KIAlzZXRfYml0KHNpZywgKHVuc2lnbmVkIGxvbmcgKikgJmxvd2NvcmVfcHRyW2NwdV0tPmV4dF9jYWxsX2Zhc3QpOwotCXdoaWxlKHNpZ25hbF9wcm9jZXNzb3IoY3B1LCBzaWdwX2VtZXJnZW5jeV9zaWduYWwpID09IHNpZ3BfYnVzeSkKKwl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihjcHUsIHNpZ3BfZW1lcmdlbmN5X3NpZ25hbCkgPT0gc2lncF9idXN5KQogCQl1ZGVsYXkoMTApOwogfQogCkBAIC0zMzIsNyArMzM0LDcgQEAKIAogdm9pZCBzbXBfcHRsYl9hbGwodm9pZCkKIHsKLSAgICAgICAgb25fZWFjaF9jcHUoc21wX3B0bGJfY2FsbGJhY2ssIE5VTEwsIDAsIDEpOworCW9uX2VhY2hfY3B1KHNtcF9wdGxiX2NhbGxiYWNrLCBOVUxMLCAwLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woc21wX3B0bGJfYWxsKTsKICNlbmRpZiAvKiAhIENPTkZJR182NEJJVCAqLwpAQCAtMzQ0LDcgKzM0Niw3IEBACiAgKi8KIHZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KQogewotICAgICAgICBzbXBfZXh0X2JpdGNhbGwoY3B1LCBlY19zY2hlZHVsZSk7CisJc21wX2V4dF9iaXRjYWxsKGNwdSwgZWNfc2NoZWR1bGUpOwogfQogCiAvKgpAQCAtMzU4LDExICszNjAsMTIgQEAKIC8qCiAgKiBjYWxsYmFjayBmb3Igc2V0dGluZy9jbGVhcmluZyBjb250cm9sIGJpdHMKICAqLwotc3RhdGljIHZvaWQgc21wX2N0bF9iaXRfY2FsbGJhY2sodm9pZCAqaW5mbykgeworc3RhdGljIHZvaWQgc21wX2N0bF9iaXRfY2FsbGJhY2sodm9pZCAqaW5mbykKK3sKIAlzdHJ1Y3QgZWNfY3JlZ19tYXNrX3Bhcm1zICpwcCA9IGluZm87CiAJdW5zaWduZWQgbG9uZyBjcmVnc1sxNl07CiAJaW50IGk7Ci0JCisKIAlfX2N0bF9zdG9yZShjcmVncywgMCwgMTUpOwogCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykKIAkJY3JlZ3NbaV0gPSAoY3JlZ3NbaV0gJiBwcC0+YW5kdmFsc1tpXSkgfCBwcC0+b3J2YWxzW2ldOwpAQCAtMzgxLDYgKzM4NCw3IEBACiAJcGFybXMub3J2YWxzW2NyXSA9IDEgPDwgYml0OwogCW9uX2VhY2hfY3B1KHNtcF9jdGxfYml0X2NhbGxiYWNrLCAmcGFybXMsIDAsIDEpOwogfQorRVhQT1JUX1NZTUJPTChzbXBfY3RsX3NldF9iaXQpOwogCiAvKgogICogQ2xlYXIgYSBiaXQgaW4gYSBjb250cm9sIHJlZ2lzdGVyIG9mIGFsbCBjcHVzCkBAIC0zOTQsMTMgKzM5OCw3MiBAQAogCXBhcm1zLmFuZHZhbHNbY3JdID0gfigxTCA8PCBiaXQpOwogCW9uX2VhY2hfY3B1KHNtcF9jdGxfYml0X2NhbGxiYWNrLCAmcGFybXMsIDAsIDEpOwogfQorRVhQT1JUX1NZTUJPTChzbXBfY3RsX2NsZWFyX2JpdCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19aRkNQRFVNUCkgfHwgZGVmaW5lZChDT05GSUdfWkZDUERVTVBfTU9EVUxFKQorCisvKgorICogemZjcGR1bXBfcHJlZml4X2FycmF5IGhvbGRzIHByZWZpeCByZWdpc3RlcnMgZm9yIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisgKiA2NCBiaXQgemZjcGR1bXAga2VybmVsIGFuZCAzMSBiaXQga2VybmVsIHdoaWNoIGlzIHRvIGJlIGR1bXBlZC4gV2UgaGF2ZSB0bworICogc2F2ZSBpdHMgcHJlZml4IHJlZ2lzdGVycywgc2luY2UgdGhleSBnZXQgbG9zdCwgd2hlbiBzd2l0Y2hpbmcgZnJvbSAzMSBiaXQKKyAqIHRvIDY0IGJpdC4KKyAqLwordW5zaWduZWQgaW50IHpmY3BkdW1wX3ByZWZpeF9hcnJheVtOUl9DUFVTICsgMV0gXAorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfZ2V0X3NhdmVfYXJlYXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1LCBjcHVfbnVtLCByYzsKKwlfX3UxNiBib290X2NwdV9hZGRyOworCisJaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVApCisJCXJldHVybjsKKwlib290X2NwdV9hZGRyID0gUzM5MF9sb3djb3JlLmNwdV9kYXRhLmNwdV9hZGRyOworCWNwdV9udW0gPSAxOworCWZvciAoY3B1ID0gMDsgY3B1IDw9IDY1NTM1OyBjcHUrKykgeworCQlpZiAoKHUxNikgY3B1ID09IGJvb3RfY3B1X2FkZHIpCisJCQljb250aW51ZTsKKwkJX19jcHVfbG9naWNhbF9tYXBbMV0gPSAoX191MTYpIGNwdTsKKwkJaWYgKHNpZ25hbF9wcm9jZXNzb3IoMSwgc2lncF9zZW5zZSkgPT0gc2lncF9ub3Rfb3BlcmF0aW9uYWwpCisJCQljb250aW51ZTsKKwkJaWYgKGNwdV9udW0gPj0gTlJfQ1BVUykgeworCQkJcHJpbnRrKCJXQVJOSU5HOiBSZWdpc3RlcnMgZm9yIGNwdSAlaSBhcmUgbm90ICIKKwkJCSAgICAgICAic2F2ZWQsIHNpbmNlIGR1bXAga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIgorCQkJICAgICAgICJOUl9DUFVTPSVpIVxuIiwgY3B1X251bSwgTlJfQ1BVUyk7CisJCQljb250aW51ZTsKKwkJfQorCQl6ZmNwZHVtcF9zYXZlX2FyZWFzW2NwdV9udW1dID0KKwkJCWFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHVuaW9uIHNhdmVfYXJlYSkpOworCQl3aGlsZSAoMSkgeworCQkJcmMgPSBzaWduYWxfcHJvY2Vzc29yKDEsIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKKwkJCWlmIChyYyAhPSBzaWdwX2J1c3kpCisJCQkJYnJlYWs7CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCQltZW1jcHkoemZjcGR1bXBfc2F2ZV9hcmVhc1tjcHVfbnVtXSwKKwkJICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpIHN0b3JlX3ByZWZpeCgpICsKKwkJICAgICAgIFNBVkVfQVJFQV9CQVNFLCBTQVZFX0FSRUFfU0laRSk7CisjaWZkZWYgX19zMzkweF9fCisJCS8qIGNvcHkgb3JpZ2luYWwgcHJlZml4IHJlZ2lzdGVyICovCisJCXpmY3BkdW1wX3NhdmVfYXJlYXNbY3B1X251bV0tPnMzOTB4LnByZWZfcmVnID0KKwkJCXpmY3BkdW1wX3ByZWZpeF9hcnJheVtjcHVfbnVtXTsKKyNlbmRpZgorCQljcHVfbnVtKys7CisJfQorfQorCit1bmlvbiBzYXZlX2FyZWEgKnpmY3BkdW1wX3NhdmVfYXJlYXNbTlJfQ1BVUyArIDFdOworRVhQT1JUX1NZTUJPTF9HUEwoemZjcGR1bXBfc2F2ZV9hcmVhcyk7CisKKyNlbHNlCisjZGVmaW5lIHNtcF9nZXRfc2F2ZV9hcmVhcygpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgogCiAvKgogICogTGV0cyBjaGVjayBob3cgbWFueSBDUFVzIHdlIGhhdmUuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludAotX19pbml0IHNtcF9jb3VudF9jcHVzKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBzbXBfY291bnRfY3B1cyh2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUsIG51bV9jcHVzOwogCV9fdTE2IGJvb3RfY3B1X2FkZHI7CkBAIC00MTYsMzEgKzQ3OSwzMCBAQAogCQlpZiAoKF9fdTE2KSBjcHUgPT0gYm9vdF9jcHVfYWRkcikKIAkJCWNvbnRpbnVlOwogCQlfX2NwdV9sb2dpY2FsX21hcFsxXSA9IChfX3UxNikgY3B1OwotCQlpZiAoc2lnbmFsX3Byb2Nlc3NvcigxLCBzaWdwX3NlbnNlKSA9PQotCQkgICAgc2lncF9ub3Rfb3BlcmF0aW9uYWwpCisJCWlmIChzaWduYWxfcHJvY2Vzc29yKDEsIHNpZ3Bfc2Vuc2UpID09IHNpZ3Bfbm90X29wZXJhdGlvbmFsKQogCQkJY29udGludWU7CiAJCW51bV9jcHVzKys7CiAJfQogCi0JcHJpbnRrKCJEZXRlY3RlZCAlZCBDUFUnc1xuIiwoaW50KSBudW1fY3B1cyk7CisJcHJpbnRrKCJEZXRlY3RlZCAlZCBDUFUnc1xuIiwgKGludCkgbnVtX2NwdXMpOwogCXByaW50aygiQm9vdCBjcHUgYWRkcmVzcyAlMlhcbiIsIGJvb3RfY3B1X2FkZHIpOwogCiAJcmV0dXJuIG51bV9jcHVzOwogfQogCiAvKgotICogICAgICBBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCisgKglBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCiAgKi8KIGludCBfX2RldmluaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKmNwdXZvaWQpCiB7Ci0gICAgICAgIC8qIFNldHVwIHRoZSBjcHUgKi8KLSAgICAgICAgY3B1X2luaXQoKTsKKwkvKiBTZXR1cCB0aGUgY3B1ICovCisJY3B1X2luaXQoKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKiBFbmFibGUgVE9EIGNsb2NrIGludGVycnVwdHMgb24gdGhlIHNlY29uZGFyeSBjcHUuICovCi0gICAgICAgIGluaXRfY3B1X3RpbWVyKCk7CisJaW5pdF9jcHVfdGltZXIoKTsKICNpZmRlZiBDT05GSUdfVklSVF9USU1FUgogCS8qIEVuYWJsZSBjcHUgdGltZXIgaW50ZXJydXB0cyBvbiB0aGUgc2Vjb25kYXJ5IGNwdS4gKi8KLSAgICAgICAgaW5pdF9jcHVfdnRpbWVyKCk7CisJaW5pdF9jcHVfdnRpbWVyKCk7CiAjZW5kaWYKIAkvKiBFbmFibGUgcGZhdWx0IHBzZXVkbyBwYWdlIGZhdWx0cyBvbiB0aGlzIGNwdS4gKi8KIAlwZmF1bHRfaW5pdCgpOwpAQCAtNDQ5LDExICs1MTEsMTEgQEAKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwogCS8qIFN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotICAgICAgICAvKiBQcmludCBpbmZvIGFib3V0IHRoaXMgcHJvY2Vzc29yICovCi0gICAgICAgIHByaW50X2NwdV9pbmZvKCZTMzkwX2xvd2NvcmUuY3B1X2RhdGEpOwotICAgICAgICAvKiBjcHVfaWRsZSB3aWxsIGNhbGwgc2NoZWR1bGUgZm9yIHVzICovCi0gICAgICAgIGNwdV9pZGxlKCk7Ci0gICAgICAgIHJldHVybiAwOworCS8qIFByaW50IGluZm8gYWJvdXQgdGhpcyBwcm9jZXNzb3IgKi8KKwlwcmludF9jcHVfaW5mbygmUzM5MF9sb3djb3JlLmNwdV9kYXRhKTsKKwkvKiBjcHVfaWRsZSB3aWxsIGNhbGwgc2NoZWR1bGUgZm9yIHVzICovCisJY3B1X2lkbGUoKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNtcF9jcmVhdGVfaWRsZSh1bnNpZ25lZCBpbnQgY3B1KQpAQCAtNDcwLDU2ICs1MzIsMTMgQEAKIAljdXJyZW50X3NldFtjcHVdID0gcDsKIH0KIAotLyogUmVzZXJ2aW5nIGFuZCByZWxlYXNpbmcgb2YgQ1BVcyAqLwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNtcF9yZXNlcnZlX2xvY2spOwotc3RhdGljIGludCBzbXBfY3B1X3Jlc2VydmVkW05SX0NQVVNdOwotCi1pbnQKLXNtcF9nZXRfY3B1KGNwdW1hc2tfdCBjcHVfbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjcHU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOwotCS8qIFRyeSB0byBmaW5kIGFuIGFscmVhZHkgcmVzZXJ2ZWQgY3B1LiAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY3B1X21hc2spIHsKLQkJaWYgKHNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSAhPSAwKSB7Ci0JCQlzbXBfY3B1X3Jlc2VydmVkW2NwdV0rKzsKLQkJCS8qIEZvdW5kIG9uZS4gKi8KLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCS8qIFJlc2VydmUgYSBuZXcgY3B1IGZyb20gY3B1X21hc2suICovCi0JZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjcHVfbWFzaykgewotCQlpZiAoY3B1X29ubGluZShjcHUpKSB7Ci0JCQlzbXBfY3B1X3Jlc2VydmVkW2NwdV0rKzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWNwdSA9IC1FTk9ERVY7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjcHU7Ci19Ci0KLXZvaWQKLXNtcF9wdXRfY3B1KGludCBjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci0Jc21wX2NwdV9yZXNlcnZlZFtjcHVdLS07Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50Ci1jcHVfc3RvcHBlZChpbnQgY3B1KQorc3RhdGljIGludCBjcHVfc3RvcHBlZChpbnQgY3B1KQogewogCV9fdTMyIHN0YXR1czsKIAogCS8qIENoZWNrIGZvciBzdG9wcGVkIHN0YXRlICovCi0JaWYgKHNpZ25hbF9wcm9jZXNzb3JfcHMoJnN0YXR1cywgMCwgY3B1LCBzaWdwX3NlbnNlKSA9PSBzaWdwX3N0YXR1c19zdG9yZWQpIHsKKwlpZiAoc2lnbmFsX3Byb2Nlc3Nvcl9wcygmc3RhdHVzLCAwLCBjcHUsIHNpZ3Bfc2Vuc2UpID09CisJICAgIHNpZ3Bfc3RhdHVzX3N0b3JlZCkgewogCQlpZiAoc3RhdHVzICYgMHg0MCkKIAkJCXJldHVybiAxOwogCX0KQEAgLTUyOCwxNCArNTQ3LDEzIEBACiAKIC8qIFVwcGluZyBhbmQgZG93bmluZyBvZiBDUFVzICovCiAKLWludAotX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKK2ludCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKLSAgICAgICAgc3RydWN0IF9sb3djb3JlICAgICpjcHVfbG93Y29yZTsKKwlzdHJ1Y3QgX2xvd2NvcmUgKmNwdV9sb3djb3JlOwogCXN0cnVjdCBzdGFja19mcmFtZSAqc2Y7Ci0gICAgICAgIHNpZ3BfY2NvZGUgICAgICAgICAgY2NvZGU7Ci0JaW50ICAgICAgICAgICAgICAgICBjdXJyX2NwdTsKKwlzaWdwX2Njb2RlIGNjb2RlOworCWludCBjdXJyX2NwdTsKIAogCWZvciAoY3Vycl9jcHUgPSAwOyBjdXJyX2NwdSA8PSA2NTUzNTsgY3Vycl9jcHUrKykgewogCQlfX2NwdV9sb2dpY2FsX21hcFtjcHVdID0gKF9fdTE2KSBjdXJyX2NwdTsKQEAgLTU0OCw3ICs1NjYsNyBAQAogCiAJY2NvZGUgPSBzaWduYWxfcHJvY2Vzc29yX3AoKF9fdTMyKSh1bnNpZ25lZCBsb25nKShsb3djb3JlX3B0cltjcHVdKSwKIAkJCQkgICBjcHUsIHNpZ3Bfc2V0X3ByZWZpeCk7Ci0JaWYgKGNjb2RlKXsKKwlpZiAoY2NvZGUpIHsKIAkJcHJpbnRrKCJzaWdwX3NldF9wcmVmaXggZmFpbGVkIGZvciBjcHUgJWQgIgogCQkgICAgICAgIndpdGggY29uZGl0aW9uIGNvZGUgJWRcbiIsCiAJCSAgICAgICAoaW50KSBjcHUsIChpbnQpIGNjb2RlKTsKQEAgLTU1Niw5ICs1NzQsOSBAQAogCX0KIAogCWlkbGUgPSBjdXJyZW50X3NldFtjcHVdOwotICAgICAgICBjcHVfbG93Y29yZSA9IGxvd2NvcmVfcHRyW2NwdV07CisJY3B1X2xvd2NvcmUgPSBsb3djb3JlX3B0cltjcHVdOwogCWNwdV9sb3djb3JlLT5rZXJuZWxfc3RhY2sgPSAodW5zaWduZWQgbG9uZykKLQkJdGFza19zdGFja19wYWdlKGlkbGUpICsgKFRIUkVBRF9TSVpFKTsKKwkJdGFza19zdGFja19wYWdlKGlkbGUpICsgVEhSRUFEX1NJWkU7CiAJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIChjcHVfbG93Y29yZS0+a2VybmVsX3N0YWNrCiAJCQkJICAgICAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKIAkJCQkgICAgIC0gc2l6ZW9mKHN0cnVjdCBzdGFja19mcmFtZSkpOwpAQCAtNTcwLDExICs1ODgsMTEgQEAKIAkJIglzdGFtCTAsMTUsMCglMCkiCiAJCTogOiAiYSIgKCZjcHVfbG93Y29yZS0+YWNjZXNzX3JlZ3Nfc2F2ZV9hcmVhKSA6ICJtZW1vcnkiKTsKIAljcHVfbG93Y29yZS0+cGVyY3B1X29mZnNldCA9IF9fcGVyX2NwdV9vZmZzZXRbY3B1XTsKLSAgICAgICAgY3B1X2xvd2NvcmUtPmN1cnJlbnRfdGFzayA9ICh1bnNpZ25lZCBsb25nKSBpZGxlOwotICAgICAgICBjcHVfbG93Y29yZS0+Y3B1X2RhdGEuY3B1X25yID0gY3B1OworCWNwdV9sb3djb3JlLT5jdXJyZW50X3Rhc2sgPSAodW5zaWduZWQgbG9uZykgaWRsZTsKKwljcHVfbG93Y29yZS0+Y3B1X2RhdGEuY3B1X25yID0gY3B1OwogCWVpZWlvKCk7CiAKLQl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihjcHUsc2lncF9yZXN0YXJ0KSA9PSBzaWdwX2J1c3kpCisJd2hpbGUgKHNpZ25hbF9wcm9jZXNzb3IoY3B1LCBzaWdwX3Jlc3RhcnQpID09IHNpZ3BfYnVzeSkKIAkJdWRlbGF5KDEwKTsKIAogCXdoaWxlICghY3B1X29ubGluZShjcHUpKQpAQCAtNTg5LDYgKzYwNyw3IEBACiB7CiAJdW5zaWduZWQgaW50IHBoeV9jcHVzLCBwb3NfY3B1cywgY3B1OwogCisJc21wX2dldF9zYXZlX2FyZWFzKCk7CiAJcGh5X2NwdXMgPSBzbXBfY291bnRfY3B1cygpOwogCXBvc19jcHVzID0gbWluKHBoeV9jcHVzICsgYWRkaXRpb25hbF9jcHVzLCAodW5zaWduZWQgaW50KSBOUl9DUFVTKTsKIApAQCAtNjIwLDE4ICs2MzksMTEgQEAKIH0KIGVhcmx5X3BhcmFtKCJwb3NzaWJsZV9jcHVzIiwgc2V0dXBfcG9zc2libGVfY3B1cyk7CiAKLWludAotX19jcHVfZGlzYWJsZSh2b2lkKQoraW50IF9fY3B1X2Rpc2FibGUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBlY19jcmVnX21hc2tfcGFybXMgY3JfcGFybXM7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKHNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSAhPSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CiAJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOwogCiAJLyogRGlzYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwpAQCAtNjQyLDI0ICs2NTQsMjMgQEAKIAogCS8qIGRpc2FibGUgYWxsIGV4dGVybmFsIGludGVycnVwdHMgKi8KIAljcl9wYXJtcy5vcnZhbHNbMF0gPSAwOwotCWNyX3Bhcm1zLmFuZHZhbHNbMF0gPSB+KDE8PDE1IHwgMTw8MTQgfCAxPDwxMyB8IDE8PDEyIHwKLQkJCQkxPDwxMSB8IDE8PDEwIHwgMTw8IDYgfCAxPDwgNCk7CisJY3JfcGFybXMuYW5kdmFsc1swXSA9IH4oMSA8PCAxNSB8IDEgPDwgMTQgfCAxIDw8IDEzIHwgMSA8PCAxMiB8CisJCQkJMSA8PCAxMSB8IDEgPDwgMTAgfCAxIDw8ICA2IHwgMSA8PCAgNCk7CiAJLyogZGlzYWJsZSBhbGwgSS9PIGludGVycnVwdHMgKi8KIAljcl9wYXJtcy5vcnZhbHNbNl0gPSAwOwotCWNyX3Bhcm1zLmFuZHZhbHNbNl0gPSB+KDE8PDMxIHwgMTw8MzAgfCAxPDwyOSB8IDE8PDI4IHwKLQkJCQkxPDwyNyB8IDE8PDI2IHwgMTw8MjUgfCAxPDwyNCk7CisJY3JfcGFybXMuYW5kdmFsc1s2XSA9IH4oMSA8PCAzMSB8IDEgPDwgMzAgfCAxIDw8IDI5IHwgMSA8PCAyOCB8CisJCQkJMSA8PCAyNyB8IDEgPDwgMjYgfCAxIDw8IDI1IHwgMSA8PCAyNCk7CiAJLyogZGlzYWJsZSBtb3N0IG1hY2hpbmUgY2hlY2tzICovCiAJY3JfcGFybXMub3J2YWxzWzE0XSA9IDA7Ci0JY3JfcGFybXMuYW5kdmFsc1sxNF0gPSB+KDE8PDI4IHwgMTw8MjcgfCAxPDwyNiB8IDE8PDI1IHwgMTw8MjQpOworCWNyX3Bhcm1zLmFuZHZhbHNbMTRdID0gfigxIDw8IDI4IHwgMSA8PCAyNyB8IDEgPDwgMjYgfAorCQkJCSAxIDw8IDI1IHwgMSA8PCAyNCk7CiAKIAlzbXBfY3RsX2JpdF9jYWxsYmFjaygmY3JfcGFybXMpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCi12b2lkCi1fX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJLyogV2FpdCB1bnRpbCB0YXJnZXQgY3B1IGlzIGRvd24gKi8KIAl3aGlsZSAoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKQEAgLTY2NywxMyArNjc4LDEyIEBACiAJcHJpbnRrKCJQcm9jZXNzb3IgJWQgc3B1biBkb3duXG4iLCBjcHUpOwogfQogCi12b2lkCi1jcHVfZGllKHZvaWQpCit2b2lkIGNwdV9kaWUodm9pZCkKIHsKIAlpZGxlX3Rhc2tfZXhpdCgpOwogCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3ApOwogCUJVRygpOwotCWZvcig7Oyk7CisJZm9yICg7Oyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KQEAgLTY4NiwzNiArNjk2LDM2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdGFjazsKIAl1bnNpZ25lZCBpbnQgY3B1OwotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICAvKiByZXF1ZXN0IHRoZSAweDEyMDEgZW1lcmdlbmN5IHNpZ25hbCBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KLSAgICAgICAgaWYgKHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDEyMDEsIGRvX2V4dF9jYWxsX2ludGVycnVwdCkgIT0gMCkKLSAgICAgICAgICAgICAgICBwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgxMjAxIik7Ci0gICAgICAgIG1lbXNldChsb3djb3JlX3B0ciwwLHNpemVvZihsb3djb3JlX3B0cikpOyAgCi0gICAgICAgIC8qCi0gICAgICAgICAqICBJbml0aWFsaXplIHByZWZpeCBwYWdlcyBhbmQgc3RhY2tzIGZvciBhbGwgcG9zc2libGUgY3B1cwotICAgICAgICAgKi8KKwkvKiByZXF1ZXN0IHRoZSAweDEyMDEgZW1lcmdlbmN5IHNpZ25hbCBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KKwlpZiAocmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MTIwMSwgZG9fZXh0X2NhbGxfaW50ZXJydXB0KSAhPSAwKQorCQlwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgxMjAxIik7CisJbWVtc2V0KGxvd2NvcmVfcHRyLCAwLCBzaXplb2YobG93Y29yZV9wdHIpKTsKKwkvKgorCSAqICBJbml0aWFsaXplIHByZWZpeCBwYWdlcyBhbmQgc3RhY2tzIGZvciBhbGwgcG9zc2libGUgY3B1cworCSAqLwogCXByaW50X2NwdV9pbmZvKCZTMzkwX2xvd2NvcmUuY3B1X2RhdGEpOwogCi0gICAgICAgIGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJbG93Y29yZV9wdHJbaV0gPSAoc3RydWN0IF9sb3djb3JlICopCi0JCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8R0ZQX0RNQSwgCi0JCQkJCXNpemVvZih2b2lkKikgPT0gOCA/IDEgOiAwKTsKLQkJc3RhY2sgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsQVNZTkNfT1JERVIpOwotCQlpZiAobG93Y29yZV9wdHJbaV0gPT0gTlVMTCB8fCBzdGFjayA9PSAwVUxMKQorCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwKKwkJCQkJIHNpemVvZih2b2lkKikgPT0gOCA/IDEgOiAwKTsKKwkJc3RhY2sgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIEFTWU5DX09SREVSKTsKKwkJaWYgKCFsb3djb3JlX3B0cltpXSB8fCAhc3RhY2spCiAJCQlwYW5pYygic21wX2Jvb3RfY3B1cyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAogCQkqKGxvd2NvcmVfcHRyW2ldKSA9IFMzOTBfbG93Y29yZTsKLQkJbG93Y29yZV9wdHJbaV0tPmFzeW5jX3N0YWNrID0gc3RhY2sgKyAoQVNZTkNfU0laRSk7Ci0JCXN0YWNrID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDApOwotCQlpZiAoc3RhY2sgPT0gMFVMTCkKKwkJbG93Y29yZV9wdHJbaV0tPmFzeW5jX3N0YWNrID0gc3RhY2sgKyBBU1lOQ19TSVpFOworCQlzdGFjayA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJCWlmICghc3RhY2spCiAJCQlwYW5pYygic21wX2Jvb3RfY3B1cyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJbG93Y29yZV9wdHJbaV0tPnBhbmljX3N0YWNrID0gc3RhY2sgKyAoUEFHRV9TSVpFKTsKKwkJbG93Y29yZV9wdHJbaV0tPnBhbmljX3N0YWNrID0gc3RhY2sgKyBQQUdFX1NJWkU7CiAjaWZuZGVmIENPTkZJR182NEJJVAogCQlpZiAoTUFDSElORV9IQVNfSUVFRSkgewogCQkJbG93Y29yZV9wdHJbaV0tPmV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyID0KLQkJCQkoX191MzIpIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwwKTsKLQkJCWlmIChsb3djb3JlX3B0cltpXS0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIgPT0gMCkKKwkJCQkoX191MzIpIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJCQlpZiAoIWxvd2NvcmVfcHRyW2ldLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkcikKIAkJCQlwYW5pYygic21wX2Jvb3RfY3B1cyBmYWlsZWQgdG8gIgogCQkJCSAgICAgICJhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQl9CkBAIC03NTQsMzQgKzc2NCw2MyBAQAogICovCiBpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQogewotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19jYXBhYmlsaXR5KHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgY2FwYWJpbGl0eTsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF9jcHVfY2FwYWJpbGl0eSgmY2FwYWJpbGl0eSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGNhcGFiaWxpdHkpOworfQorc3RhdGljIFNZU0RFVl9BVFRSKGNhcGFiaWxpdHksIDA0NDQsIHNob3dfY2FwYWJpbGl0eSwgTlVMTCk7CisKK3N0YXRpYyBpbnQgX19jcHVpbml0IHNtcF9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpKGxvbmcpaGNwdTsKKwlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CisJc3RydWN0IHN5c19kZXZpY2UgKnMgPSAmYy0+c3lzZGV2OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCWlmIChzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfY2FwYWJpbGl0eSkpCisJCQlyZXR1cm4gTk9USUZZX0JBRDsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX2NhcGFiaWxpdHkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIHNtcF9jcHVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBzbXBfY3B1X25vdGlmeSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKIHsKIAlpbnQgY3B1OwotCWludCByZXQ7CisKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNtcF9jcHVfbmIpOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CisJCXN0cnVjdCBzeXNfZGV2aWNlICpzID0gJmMtPnN5c2RldjsKIAogCQljLT5ob3RwbHVnZ2FibGUgPSAxOwotCQlyZXQgPSByZWdpc3Rlcl9jcHUoYywgY3B1KTsKLQkJaWYgKHJldCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRvcG9sb2d5X2luaXQ6IHJlZ2lzdGVyX2NwdSAlZCAiCi0JCQkgICAgICAgImZhaWxlZCAoJWQpXG4iLCBjcHUsIHJldCk7CisJCXJlZ2lzdGVyX2NwdShjLCBjcHUpOworCQlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQlzID0gJmMtPnN5c2RldjsKKwkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX2NhcGFiaWxpdHkpOwogCX0KIAlyZXR1cm4gMDsKIH0KLQogc3Vic3lzX2luaXRjYWxsKHRvcG9sb2d5X2luaXQpOwotCi1FWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKLUVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7Ci1FWFBPUlRfU1lNQk9MKGxvd2NvcmVfcHRyKTsKLUVYUE9SVF9TWU1CT0woc21wX2N0bF9zZXRfYml0KTsKLUVYUE9SVF9TWU1CT0woc21wX2N0bF9jbGVhcl9iaXQpOwotRVhQT1JUX1NZTUJPTChzbXBfZ2V0X2NwdSk7Ci1FWFBPUlRfU1lNQk9MKHNtcF9wdXRfY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYwppbmRleCA1ODRlZDk1Li4zYTc3YzIyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCkBAIC0yNjYsMjMgKzI2NiwzIEBACiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBzeXNfZmFkdmlzZTY0XzY0KGEuZmQsIGEub2Zmc2V0LCBhLmxlbiwgYS5hZHZpY2UpOwogfQotCi0vKgotICogRG8gYSBzeXN0ZW0gY2FsbCBmcm9tIGtlcm5lbCBpbnN0ZWFkIG9mIGNhbGxpbmcgc3lzX2V4ZWN2ZSBzbyB3ZQotICogZW5kIHVwIHdpdGggcHJvcGVyIHB0X3JlZ3MuCi0gKi8KLWludCBrZXJuZWxfZXhlY3ZlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKmNvbnN0IGVudnBbXSkKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpfX2FyZzEgYXNtKCIyIikgPSBmaWxlbmFtZTsKLQlyZWdpc3RlciBjaGFyICpjb25zdCpfX2FyZzIgYXNtKCIzIikgPSBhcmd2OwotCXJlZ2lzdGVyIGNoYXIgKmNvbnN0Kl9fYXJnMyBhc20oIjQiKSA9IGVudnA7Ci0JcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsKLQlhc20gdm9sYXRpbGUoCi0JCSJzdmMgJWIxIgotCQk6ICI9ZCIgKF9fc3ZjcmVzKQotCQk6ICJpIiAoX19OUl9leGVjdmUpLAotCQkgICIwIiAoX19hcmcxKSwKLQkJICAiZCIgKF9fYXJnMiksCi0JCSAgImQiIChfX2FyZzMpIDogIm1lbW9yeSIpOwotCXJldHVybiBfX3N2Y3JlczsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBjNzc0ZjEwLi5jZDhkMzIxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0xMCw3ICsxMCw3IEBACiAKIE5JX1NZU0NBTEwJCQkJCQkJLyogMCAqLwogU1lTQ0FMTChzeXNfZXhpdCxzeXNfZXhpdCxzeXMzMl9leGl0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mb3JrX2dsdWUsc3lzX2ZvcmtfZ2x1ZSxzeXNfZm9ya19nbHVlKQorU1lTQ0FMTChzeXNfZm9yayxzeXNfZm9yayxzeXNfZm9yaykKIFNZU0NBTEwoc3lzX3JlYWQsc3lzX3JlYWQsc3lzMzJfcmVhZF93cmFwcGVyKQogU1lTQ0FMTChzeXNfd3JpdGUsc3lzX3dyaXRlLHN5czMyX3dyaXRlX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19vcGVuLHN5c19vcGVuLHN5czMyX29wZW5fd3JhcHBlcikJCQkvKiA1ICovCkBAIC0xOSw3ICsxOSw3IEBACiBTWVNDQUxMKHN5c19jcmVhdCxzeXNfY3JlYXQsc3lzMzJfY3JlYXRfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2xpbmssc3lzX2xpbmssc3lzMzJfbGlua193cmFwcGVyKQogU1lTQ0FMTChzeXNfdW5saW5rLHN5c191bmxpbmssc3lzMzJfdW5saW5rX3dyYXBwZXIpCQkvKiAxMCAqLwotU1lTQ0FMTChzeXNfZXhlY3ZlX2dsdWUsc3lzX2V4ZWN2ZV9nbHVlLHN5czMyX2V4ZWN2ZV9nbHVlKQorU1lTQ0FMTChzeXNfZXhlY3ZlLHN5c19leGVjdmUsc3lzMzJfZXhlY3ZlKQogU1lTQ0FMTChzeXNfY2hkaXIsc3lzX2NoZGlyLHN5czMyX2NoZGlyX3dyYXBwZXIpCiBTWVNDQUxMKHN5c190aW1lLHN5c19uaV9zeXNjYWxsLHN5czMyX3RpbWVfd3JhcHBlcikJCS8qIG9sZCB0aW1lIHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX21rbm9kLHN5c19ta25vZCxzeXMzMl9ta25vZF93cmFwcGVyKQpAQCAtMTI3LDggKzEyNyw4IEBACiBTWVNDQUxMKHN5c19zeXNpbmZvLHN5c19zeXNpbmZvLGNvbXBhdF9zeXNfc3lzaW5mb193cmFwcGVyKQogU1lTQ0FMTChzeXNfaXBjLHN5c19pcGMsc3lzMzJfaXBjX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19mc3luYyxzeXNfZnN5bmMsc3lzMzJfZnN5bmNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NpZ3JldHVybl9nbHVlLHN5c19zaWdyZXR1cm5fZ2x1ZSxzeXMzMl9zaWdyZXR1cm5fZ2x1ZSkKLVNZU0NBTEwoc3lzX2Nsb25lX2dsdWUsc3lzX2Nsb25lX2dsdWUsc3lzMzJfY2xvbmVfZ2x1ZSkJCS8qIDEyMCAqLworU1lTQ0FMTChzeXNfc2lncmV0dXJuLHN5c19zaWdyZXR1cm4sc3lzMzJfc2lncmV0dXJuKQorU1lTQ0FMTChzeXNfY2xvbmUsc3lzX2Nsb25lLHN5czMyX2Nsb25lKQkJCS8qIDEyMCAqLwogU1lTQ0FMTChzeXNfc2V0ZG9tYWlubmFtZSxzeXNfc2V0ZG9tYWlubmFtZSxzeXMzMl9zZXRkb21haW5uYW1lX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19uZXd1bmFtZSxzMzkweF9uZXd1bmFtZSxzeXMzMl9uZXd1bmFtZV93cmFwcGVyKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBtb2RpZnlfbGR0IGZvciBpMzg2ICovCkBAIC0xODEsNyArMTgxLDcgQEAKIFNZU0NBTEwoc3lzX3NldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlc2dpZDE2X3dyYXBwZXIpCS8qIDE3MCBvbGQgc2V0cmVzZ2lkMTYgc3lzY2FsbCAqLwogU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcikJLyogb2xkIGdldHJlc2dpZDE2IHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX3ByY3RsLHN5c19wcmN0bCxzeXMzMl9wcmN0bF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuX2dsdWUsc3lzX3J0X3NpZ3JldHVybl9nbHVlLHN5czMyX3J0X3NpZ3JldHVybl9nbHVlKQorU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuLHN5c19ydF9zaWdyZXR1cm4sc3lzMzJfcnRfc2lncmV0dXJuKQogU1lTQ0FMTChzeXNfcnRfc2lnYWN0aW9uLHN5c19ydF9zaWdhY3Rpb24sc3lzMzJfcnRfc2lnYWN0aW9uX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19ydF9zaWdwcm9jbWFzayxzeXNfcnRfc2lncHJvY21hc2ssc3lzMzJfcnRfc2lncHJvY21hc2tfd3JhcHBlcikJLyogMTc1ICovCiBTWVNDQUxMKHN5c19ydF9zaWdwZW5kaW5nLHN5c19ydF9zaWdwZW5kaW5nLHN5czMyX3J0X3NpZ3BlbmRpbmdfd3JhcHBlcikKQEAgLTE5NCwxMSArMTk0LDExIEBACiBTWVNDQUxMKHN5c19nZXRjd2Qsc3lzX2dldGN3ZCxzeXMzMl9nZXRjd2Rfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2NhcGdldCxzeXNfY2FwZ2V0LHN5czMyX2NhcGdldF93cmFwcGVyKQogU1lTQ0FMTChzeXNfY2Fwc2V0LHN5c19jYXBzZXQsc3lzMzJfY2Fwc2V0X3dyYXBwZXIpCQkvKiAxODUgKi8KLVNZU0NBTEwoc3lzX3NpZ2FsdHN0YWNrX2dsdWUsc3lzX3NpZ2FsdHN0YWNrX2dsdWUsc3lzMzJfc2lnYWx0c3RhY2tfZ2x1ZSkKK1NZU0NBTEwoc3lzX3NpZ2FsdHN0YWNrLHN5c19zaWdhbHRzdGFjayxzeXMzMl9zaWdhbHRzdGFjaykKIFNZU0NBTEwoc3lzX3NlbmRmaWxlLHN5c19zZW5kZmlsZTY0LHN5czMyX3NlbmRmaWxlX3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMxICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMyICovCi1TWVNDQUxMKHN5c192Zm9ya19nbHVlLHN5c192Zm9ya19nbHVlLHN5c192Zm9ya19nbHVlKQkJLyogMTkwICovCitTWVNDQUxMKHN5c192Zm9yayxzeXNfdmZvcmssc3lzX3Zmb3JrKQkJCQkvKiAxOTAgKi8KIFNZU0NBTEwoc3lzX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfZ2V0cmxpbWl0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19tbWFwMixzeXNfbW1hcDIsc3lzMzJfbW1hcDJfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3RydW5jYXRlNjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfdHJ1bmNhdGU2NF93cmFwcGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCBlMWFkNDY0Li43MTFkYWU4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtMjgwLDcgKzI4MCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkIGV0cl9yZXNldCh2b2lkKTsKLXN0YXRpYyB2b2lkIGV0cl9pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgZXRyX2V4dF9oYW5kbGVyKF9fdTE2KTsKIAogLyoKQEAgLTM1NSw3ICszNTQsNiBAQAogI2lmZGVmIENPTkZJR19WSVJUX1RJTUVSCiAJdnRpbWVfaW5pdCgpOwogI2VuZGlmCi0JZXRyX2luaXQoKTsKIH0KIAogLyoKQEAgLTQyNiwxMSArNDI0LDExIEBACiBzdGF0aWMgaW50IGV0cl9wb3J0MV91cHRvZGF0ZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGV0cl9ldmVudHM7CiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZXRyX3RpbWVyOwotc3RhdGljIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBldHJfdGFza2xldDsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWNfdCwgZXRyX3N5bmNfd29yZCk7CiAKIHN0YXRpYyB2b2lkIGV0cl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZHVtbXkpOwotc3RhdGljIHZvaWQgZXRyX3Rhc2tsZXRfZm4odW5zaWduZWQgbG9uZyBkdW1teSk7CitzdGF0aWMgdm9pZCBldHJfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfV09SSyhldHJfd29yaywgZXRyX3dvcmtfZm4pOwogCiAvKgogICogVGhlIGV0ciBnZXRfY2xvY2sgZnVuY3Rpb24uIEl0IHdpbGwgd3JpdGUgdGhlIGN1cnJlbnQgY2xvY2sgdmFsdWUKQEAgLTUwNywyOSArNTA1LDMxIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBldHJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXRyX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZXRyX2FpYiBhaWI7CiAKIAlpZiAodGVzdF9iaXQoRVRSX0ZMQUdfRU5PU1lTLCAmZXRyX2ZsYWdzKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAkvKiBDaGVjayBpZiB0aGlzIG1hY2hpbmUgaGFzIHRoZSBzdGVhaSBpbnN0cnVjdGlvbi4gKi8KIAlpZiAoZXRyX3N0ZWFpKCZhaWIsIEVUUl9TVEVBSV9TVEVQUElOR19QT1JUKSA9PSAwKQogCQlzZXRfYml0KEVUUl9GTEFHX1NURUFJLCAmZXRyX2ZsYWdzKTsKIAlzZXR1cF90aW1lcigmZXRyX3RpbWVyLCBldHJfdGltZW91dCwgMFVMKTsKLQl0YXNrbGV0X2luaXQoJmV0cl90YXNrbGV0LCBldHJfdGFza2xldF9mbiwgMCk7CiAJaWYgKCFldHJfcG9ydDBfb25saW5lICYmICFldHJfcG9ydDFfb25saW5lKQogCQlzZXRfYml0KEVUUl9GTEFHX0VBQ0NFUywgJmV0cl9mbGFncyk7CiAJaWYgKGV0cl9wb3J0MF9vbmxpbmUpIHsKIAkJc2V0X2JpdChFVFJfRVZFTlRfUE9SVDBfQ0hBTkdFLCAmZXRyX2V2ZW50cyk7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmV0cl90YXNrbGV0KTsKKwkJc2NoZWR1bGVfd29yaygmZXRyX3dvcmspOwogCX0KIAlpZiAoZXRyX3BvcnQxX29ubGluZSkgewogCQlzZXRfYml0KEVUUl9FVkVOVF9QT1JUMV9DSEFOR0UsICZldHJfZXZlbnRzKTsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiAJfQorCXJldHVybiAwOwogfQogCithcmNoX2luaXRjYWxsKGV0cl9pbml0KTsKKwogLyoKICAqIFR3byBzb3J0cyBvZiBFVFIgbWFjaGluZSBjaGVja3MuIFRoZSBhcmNoaXRlY3R1cmUgcmVhZHM6CiAgKiAiV2hlbiBhIG1hY2hpbmUtY2hlY2sgbml0ZXJydXB0aW9uIG9jY3VycyBhbmQgaWYgYSBzd2l0Y2gtdG8tbG9jYWwgb3IKQEAgLTU0OSw3ICs1NDksNyBAQAogCQlyZXR1cm47CiAJZXRyX2Rpc2FibGVfc3luY19jbG9jayhOVUxMKTsKIAlzZXRfYml0KEVUUl9FVkVOVF9TV0lUQ0hfTE9DQUwsICZldHJfZXZlbnRzKTsKLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZldHJfdGFza2xldCk7CisJc2NoZWR1bGVfd29yaygmZXRyX3dvcmspOwogfQogCiAvKgpAQCAtNTY0LDcgKzU2NCw3IEBACiAJCXJldHVybjsKIAlldHJfZGlzYWJsZV9zeW5jX2Nsb2NrKE5VTEwpOwogCXNldF9iaXQoRVRSX0VWRU5UX1NZTkNfQ0hFQ0ssICZldHJfZXZlbnRzKTsKLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZldHJfdGFza2xldCk7CisJc2NoZWR1bGVfd29yaygmZXRyX3dvcmspOwogfQogCiAvKgpAQCAtNTkxLDEzICs1OTEsMTMgQEAKIAkJICogQm90aCBwb3J0cyBhcmUgbm90IHVwLXRvLWRhdGUgbm93LgogCQkgKi8KIAkJc2V0X2JpdChFVFJfRVZFTlRfUE9SVF9BTEVSVCwgJmV0cl9ldmVudHMpOwotCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmV0cl90YXNrbGV0KTsKKwlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGV0cl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7CiAJc2V0X2JpdChFVFJfRVZFTlRfVVBEQVRFLCAmZXRyX2V2ZW50cyk7Ci0JdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCXNjaGVkdWxlX3dvcmsoJmV0cl93b3JrKTsKIH0KIAogLyoKQEAgLTkyNyw3ICs5MjcsNyBAQAogCWlmICghZWFjci5lMCAmJiAhZWFjci5lMSkKIAkJcmV0dXJuIGVhY3I7CiAKLQkvKiBVcGRhdGUgcG9ydDAgb3IgcG9ydDEgd2l0aCBhaWIgc3RvcmVkIGluIGV0cl90YXNrbGV0X2ZuLiAqLworCS8qIFVwZGF0ZSBwb3J0MCBvciBwb3J0MSB3aXRoIGFpYiBzdG9yZWQgaW4gZXRyX3dvcmtfZm4uICovCiAJaWYgKGFpYi0+ZXN3LnEgPT0gMCkgewogCQkvKiBJbmZvcm1hdGlvbiBmb3IgcG9ydCAwIHN0b3JlZC4gKi8KIAkJaWYgKGVhY3IucDAgJiYgIWV0cl9wb3J0MF91cHRvZGF0ZSkgewpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKICAqIHBhcnRpY3VsYXIgdGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGNhbGxzIGV0cl91cGRhdGVfZWFjcigpLAogICogaXQgImNvbnRyb2xzIiB0aGUgZXRyIGNvbnRyb2wgcmVnaXN0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGV0cl90YXNrbGV0X2ZuKHVuc2lnbmVkIGxvbmcgZHVtbXkpCitzdGF0aWMgdm9pZCBldHJfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIG5vdzsKIAlzdHJ1Y3QgZXRyX2VhY3IgZWFjcjsKQEAgLTEyMjAsMTMgKzEyMjAsMTMgQEAKIAkJCXJldHVybiBjb3VudDsJLyogTm90aGluZyB0byBkby4gKi8KIAkJZXRyX3BvcnQwX29ubGluZSA9IHZhbHVlOwogCQlzZXRfYml0KEVUUl9FVkVOVF9QT1JUMF9DSEFOR0UsICZldHJfZXZlbnRzKTsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiAJfSBlbHNlIHsKIAkJaWYgKGV0cl9wb3J0MV9vbmxpbmUgPT0gdmFsdWUpCiAJCQlyZXR1cm4gY291bnQ7CS8qIE5vdGhpbmcgdG8gZG8uICovCiAJCWV0cl9wb3J0MV9vbmxpbmUgPSB2YWx1ZTsKIAkJc2V0X2JpdChFVFJfRVZFTlRfUE9SVDFfQ0hBTkdFLCAmZXRyX2V2ZW50cyk7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmV0cl90YXNrbGV0KTsKKwkJc2NoZWR1bGVfd29yaygmZXRyX3dvcmspOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKaW5kZXggZjBlNWEzMi4uNDlkZWM4MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xODgsMTggKzE4OCwzMSBAQAogCiBFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOwogCitzdGF0aWMgaW5saW5lIGludCBtYXNrX2JpdHMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYml0cykKK3sKKwlyZXR1cm4gKHJlZ3MtPnBzdy5tYXNrICYgYml0cykgLyAoKH5iaXRzICsgMSkgJiBiaXRzKTsKK30KKwogdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwogCWNoYXIgKm1vZGU7Ci0JaW50IGk7CiAKIAltb2RlID0gKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSA/ICJVc2VyIiA6ICJLcm5sIjsKIAlwcmludGsoIiVzIFBTVyA6ICVwICVwIiwKIAkgICAgICAgbW9kZSwgKHZvaWQgKikgcmVncy0+cHN3Lm1hc2ssCiAJICAgICAgICh2b2lkICopIHJlZ3MtPnBzdy5hZGRyKTsKIAlwcmludF9zeW1ib2woIiAoJXMpXG4iLCByZWdzLT5wc3cuYWRkciAmIFBTV19BRERSX0lOU04pOwotCXByaW50aygiJXMgR1BSUzogIiBGT1VSTE9ORywgbW9kZSwKKwlwcmludGsoIiAgICAgICAgICAgUjoleCBUOiV4IElPOiV4IEVYOiV4IEtleToleCBNOiV4IFc6JXggIgorCSAgICAgICAiUDoleCBBUzoleCBDQzoleCBQTToleCIsIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19QRVIpLAorCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfREFUKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0lPKSwKKwkgICAgICAgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0VYVCksIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19LRVkpLAorCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfTUNIRUNLKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX1dBSVQpLAorCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfUFNUQVRFKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0FTQyksCisJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19DQyksIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19QTSkpOworI2lmZGVmIENPTkZJR182NEJJVAorCXByaW50aygiIEVBOiV4IiwgbWFza19iaXRzKHJlZ3MsIFBTV19CQVNFX0JJVFMpKTsKKyNlbmRpZgorCXByaW50aygiXG4lcyBHUFJTOiAiIEZPVVJMT05HLCBtb2RlLAogCSAgICAgICByZWdzLT5ncHJzWzBdLCByZWdzLT5ncHJzWzFdLCByZWdzLT5ncHJzWzJdLCByZWdzLT5ncHJzWzNdKTsKIAlwcmludGsoIiAgICAgICAgICAgIiBGT1VSTE9ORywKIAkgICAgICAgcmVncy0+Z3Byc1s0XSwgcmVncy0+Z3Byc1s1XSwgcmVncy0+Z3Byc1s2XSwgcmVncy0+Z3Byc1s3XSk7CkBAIC0yMDgsNDEgKzIyMSw3IEBACiAJcHJpbnRrKCIgICAgICAgICAgICIgRk9VUkxPTkcsCiAJICAgICAgIHJlZ3MtPmdwcnNbMTJdLCByZWdzLT5ncHJzWzEzXSwgcmVncy0+Z3Byc1sxNF0sIHJlZ3MtPmdwcnNbMTVdKTsKIAotI2lmIDAKLQkvKiBGSVhNRTogdGhpcyBpc24ndCBuZWVkZWQgYW55IG1vcmUgYnV0IGl0IGNoYW5nZXMgdGhlIGtzeW1vb3BzCi0JICogaW5wdXQuIFRvIHJlbW92ZSBvciBub3QgdG8gcmVtb3ZlIC4uLiAqLwotCXNhdmVfYWNjZXNzX3JlZ3MocmVncy0+YWNycyk7Ci0JcHJpbnRrKCIlcyBBQ1JTOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBtb2RlLAotCSAgICAgICByZWdzLT5hY3JzWzBdLCByZWdzLT5hY3JzWzFdLCByZWdzLT5hY3JzWzJdLCByZWdzLT5hY3JzWzNdKTsKLQlwcmludGsoIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkgICAgICAgcmVncy0+YWNyc1s0XSwgcmVncy0+YWNyc1s1XSwgcmVncy0+YWNyc1s2XSwgcmVncy0+YWNyc1s3XSk7Ci0JcHJpbnRrKCIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JICAgICAgIHJlZ3MtPmFjcnNbOF0sIHJlZ3MtPmFjcnNbOV0sIHJlZ3MtPmFjcnNbMTBdLCByZWdzLT5hY3JzWzExXSk7Ci0JcHJpbnRrKCIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JICAgICAgIHJlZ3MtPmFjcnNbMTJdLCByZWdzLT5hY3JzWzEzXSwgcmVncy0+YWNyc1sxNF0sIHJlZ3MtPmFjcnNbMTVdKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBQcmludCB0aGUgZmlyc3QgMjAgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0IHRoZQotCSAqIHRpbWUgb2YgdGhlIGZhdWx0LgotCSAqLwotCW9sZF9mcyA9IGdldF9mcygpOwotCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKLQkJc2V0X2ZzKFVTRVJfRFMpOwotCWVsc2UKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JcHJpbnRrKCIlcyBDb2RlOiAiLCBtb2RlKTsKLQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyIGM7Ci0JCWlmIChfX2dldF91c2VyKGMsIChjaGFyIF9fdXNlciAqKShyZWdzLT5wc3cuYWRkciArIGkpKSkgewotCQkJcHJpbnRrKCIgQmFkIFBTVy4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50aygiJTAyeCAiLCBjKTsKLQl9Ci0Jc2V0X2ZzKG9sZF9mcyk7Ci0KLQlwcmludGsoIlxuIik7CisJc2hvd19jb2RlKHJlZ3MpOwogfQkKIAogLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBmcy9wcm9jL2FycmF5LmMgKi8KQEAgLTMxOCw2ICsyOTcsMTEgQEAKICNlbmRpZgogfQogCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBpbmxpbmUgZG9fdHJhcChsb25nIGludGVycnVwdGlvbl9jb2RlLCBpbnQgc2lnbnIsCiAJCQkJCWNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJCXNpZ2luZm9fdCAqaW5mbykKQEAgLTM0NCw4ICszMjgsMTQgQEAKICAgICAgICAgICAgICAgICBmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBzdy5hZGRyICYgUFNXX0FERFJfSU5TTik7CiAgICAgICAgICAgICAgICAgaWYgKGZpeHVwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmVncy0+cHN3LmFkZHIgPSBmaXh1cC0+Zml4dXAgfCBQU1dfQUREUl9BTU9ERTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBkaWUoc3RyLCByZWdzLCBpbnRlcnJ1cHRpb25fY29kZSk7CisJCWVsc2UgeworCQkJZW51bSBidWdfdHJhcF90eXBlIGJ0dDsKKworCQkJYnR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wc3cuYWRkciAmIFBTV19BRERSX0lOU04pOworCQkJaWYgKGJ0dCA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pCisJCQkJcmV0dXJuOworCQkJZGllKHN0ciwgcmVncywgaW50ZXJydXB0aW9uX2NvZGUpOworCQl9CiAgICAgICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGMzMDcxNmEuLjQxOGY2NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ1LDYgKzQ1LDggQEAKICAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CiAgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKIAorICBCVUdfVEFCTEUKKwogICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCiAJKiguZGF0YSkKIAlDT05TVFJVQ1RPUlMKQEAgLTc3LDYgKzc5LDEyIEBACiAJKiguaW5pdC50ZXh0KQogCV9laW5pdHRleHQgPSAuOwogICB9CisgIC8qCisgICAqIC5leGl0LnRleHQgaXMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsCisgICAqIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzIGZyb20gX19idWdfdGFibGUKKyAgICovCisgIC5leGl0LnRleHQgOgkgeyAqKC5leGl0LnRleHQpIH0KKwogICAuaW5pdC5kYXRhIDogeyAqKC5pbml0LmRhdGEpIH0KICAgLiA9IEFMSUdOKDI1Nik7CiAgIF9fc2V0dXBfc3RhcnQgPSAuOwpAQCAtMTE2LDcgKzEyNCw3IEBACiAKICAgLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCiAgIC9ESVNDQVJELyA6IHsKLQkqKC5leGl0LnRleHQpICooLmV4aXQuZGF0YSkgKiguZXhpdGNhbGwuZXhpdCkKKwkqKC5leGl0LmRhdGEpICooLmV4aXRjYWxsLmV4aXQpCiAJfQogCiAgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggOWQ1YjAyOC4uMWUxYTZlZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyID0gZXhwaXJlczsKIAogCS8qIHN0b3JlIGV4cGlyZSB0aW1lIGZvciB0aGlzIENQVSB0aW1lciAqLwotCXBlcl9jcHUodmlydF9jcHVfdGltZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSkudG9fZXhwaXJlID0gZXhwaXJlczsKKwlfX2dldF9jcHVfdmFyKHZpcnRfY3B1X3RpbWVyKS50b19leHBpcmUgPSBleHBpcmVzOwogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdnRpbWVyKF9fdTY0IGV4cGlyZXMpCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlhc20gdm9sYXRpbGUgKCJTUFQgJTAiIDogOiAibSIgKFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lcikpOwogCiAJLyogc3RvcmUgZXhwaXJlIHRpbWUgZm9yIHRoaXMgQ1BVIHRpbWVyICovCi0JcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKS50b19leHBpcmUgPSBleHBpcmVzOworCV9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpLnRvX2V4cGlyZSA9IGV4cGlyZXM7CiB9CiAjZW5kaWYKIApAQCAtMTQ1LDcgKzE0NSw3IEBACiB7CiAJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKIAotCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2dF9saXN0ID0gJl9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpOwogCiAJLyogQ1BVIHRpbWVyIGludGVycnVwdCBpcyBwZW5kaW5nLCBkb24ndCByZXByb2dyYW1tIGl0ICovCiAJaWYgKHZ0X2xpc3QtPmlkbGUgJiAxTEw8PDYzKQpAQCAtMTU5LDcgKzE1OSw3IEBACiB7CiAJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKIAotCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2dF9saXN0ID0gJl9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpOwogCiAJLyogbm90aGluZyB0byBkbyAqLwogCWlmIChsaXN0X2VtcHR5KCZ2dF9saXN0LT5saXN0KSkgewpAQCAtMjE5LDcgKzIxOSw3IEBACiAJaWYgKGxpc3RfZW1wdHkoY2JfbGlzdCkpCiAJCXJldHVybjsKIAotCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2dF9saXN0ID0gJl9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCB0bXAsIGNiX2xpc3QsIGVudHJ5KSB7CiAJCWZuID0gZXZlbnQtPmZ1bmN0aW9uOwpAQCAtMjQ0LDcgKzI0NCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRvX2NwdV90aW1lcl9pbnRlcnJ1cHQoX191MTYgZXJyb3JfY29kZSkKIHsKLQlpbnQgY3B1OwogCV9fdTY0IG5leHQsIGRlbHRhOwogCXN0cnVjdCB2dGltZXJfcXVldWUgKnZ0X2xpc3Q7CiAJc3RydWN0IHZ0aW1lcl9saXN0ICpldmVudCwgKnRtcDsKQEAgLTI1Myw4ICsyNTIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY2JfbGlzdDsKIAogCUlOSVRfTElTVF9IRUFEKCZjYl9saXN0KTsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBjcHUpOworCXZ0X2xpc3QgPSAmX19nZXRfY3B1X3Zhcih2aXJ0X2NwdV90aW1lcik7CiAKIAkvKiB3YWxrIHRpbWVyIGxpc3QsIGZpcmUgYWxsIGV4cGlyZWQgZXZlbnRzICovCiAJc3Bpbl9sb2NrKCZ2dF9saXN0LT5sb2NrKTsKQEAgLTUzNCw3ICs1MzIsNyBAQAogCS8qIGVuYWJsZSBjcHUgdGltZXIgaW50ZXJydXB0cyAqLwogCV9fY3RsX3NldF9iaXQoMCwxMCk7CiAKLQl2dF9saXN0ID0gJnBlcl9jcHUodmlydF9jcHVfdGltZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJdnRfbGlzdCA9ICZfX2dldF9jcHVfdmFyKHZpcnRfY3B1X3RpbWVyKTsKIAlJTklUX0xJU1RfSEVBRCgmdnRfbGlzdC0+bGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnZ0X2xpc3QtPmxvY2spOwogCXZ0X2xpc3QtPnRvX2V4cGlyZSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlIGIvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQppbmRleCA3YTQ0ZmVkLi41OWFlYTY1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKQEAgLTUsNiArNSw2IEBACiBFWFRSQV9BRkxBR1MgOj0gLXRyYWRpdGlvbmFsCiAKIGxpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzc19zdGQubyB1YWNjZXNzX3B0Lm8gcXJubmQubwotbGliLSQoQ09ORklHXzMyQklUKSArPSBkaXY2NC5vCitvYmotJChDT05GSUdfMzJCSVQpICs9IGRpdjY0Lm8KIGxpYi0kKENPTkZJR182NEJJVCkgKz0gdWFjY2Vzc19tdmNvcy5vCiBsaWItJChDT05GSUdfU01QKSArPSBzcGlubG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL2RpdjY0LmMgYi9hcmNoL3MzOTAvbGliL2RpdjY0LmMKaW5kZXggMDQ4MWYzNC4uYTVmODMwMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9kaXY2NC5jCisrKyBiL2FyY2gvczM5MC9saWIvZGl2NjQuYwpAQCAtMTQ3LDUgKzE0NywzIEBACiB9CiAKICNlbmRpZiAvKiBNQVJDSF9HNSAqLwotCi1FWFBPUlRfU1lNQk9MKF9fZGl2NjRfMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwppbmRleCA3NDYyYWViLi4yYjc2YTg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZmF1bHQuYworKysgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwpAQCAtMjYsOSArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CkBAIC02MywyMSArNjMsMjUgQEAKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKLQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBfX25vdGlmeV9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKIHsKLQlzdHJ1Y3QgZGllX2FyZ3MgYXJncyA9IHsKLQkJLnJlZ3MgPSByZWdzLAotCQkuc3RyID0gc3RyLAotCQkuZXJyID0gZXJyLAotCQkudHJhcG5yID0gdHJhcCwKLQkJLnNpZ25yID0gc2lnCi0JfTsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCB2YWwsICZhcmdzKTsKKwlzdHJ1Y3QgZGllX2FyZ3MgYXJncyA9IHsgLnN0ciA9ICJwYWdlIGZhdWx0IiwKKwkJCQkgLnRyYXBuciA9IDE0LAorCQkJCSAuc2lnbnIgPSBTSUdTRUdWIH07CisJYXJncy5yZWdzID0gcmVnczsKKwlhcmdzLmVyciA9IGVycjsKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLAorCQkJCQkgIERJRV9QQUdFX0ZBVUxULCAmYXJncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlpZiAodW5saWtlbHkoa3Byb2JlX3J1bm5pbmcoKSkpCisJCXJldHVybiBfX25vdGlmeV9wYWdlX2ZhdWx0KHJlZ3MsIGVycik7CisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKLQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCiB7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpAQCAtMTcwLDc0ICsxNzQsMTI3IEBACiAJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJnNpLCBjdXJyZW50KTsKIH0KIAorc3RhdGljIHZvaWQgZG9fbm9fY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLAorCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7CisKKwkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAgKi8KKwlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBzdy5hZGRyICYgX19GSVhVUF9NQVNLKTsKKwlpZiAoZml4dXApIHsKKwkJcmVncy0+cHN3LmFkZHIgPSBmaXh1cC0+Zml4dXAgfCBQU1dfQUREUl9BTU9ERTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogT29wcy4gVGhlIGtlcm5lbCB0cmllZCB0byBhY2Nlc3Mgc29tZSBiYWQgcGFnZS4gV2UnbGwgaGF2ZSB0bworCSAqIHRlcm1pbmF0ZSB0aGluZ3Mgd2l0aCBleHRyZW1lIHByZWp1ZGljZS4KKwkgKi8KKwlpZiAoY2hlY2tfc3BhY2UoY3VycmVudCkgPT0gMCkKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBvaW50ZXIgZGVyZWZlcmVuY2UiCisJCSAgICAgICAiIGF0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgJXBcbiIsICh2b2lkICopYWRkcmVzcyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiCisJCSAgICAgICAiIGF0IHZpcnR1YWwgdXNlciBhZGRyZXNzICVwXG4iLCAodm9pZCAqKWFkZHJlc3MpOworCisJZGllKCJPb3BzIiwgcmVncywgZXJyb3JfY29kZSk7CisJZG9fZXhpdChTSUdLSUxMKTsKK30KKworc3RhdGljIHZvaWQgZG9fbG93X2FkZHJlc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK3sKKwkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiBrZXJuZWwgbW9kZSBtZWFucworCSAgIE5VTEwgcG9pbnRlciB3cml0ZSBhY2Nlc3MgaW4ga2VybmVsIG1vZGUuICAqLworCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgeworCQkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiB1c2VyIG1vZGUgJ2Nhbm5vdCBoYXBwZW4nLiAqLworCQlkaWUgKCJMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIiwgcmVncywgZXJyb3JfY29kZSk7CisJCWRvX2V4aXQoU0lHS0lMTCk7CisJfQorCisJZG9fbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCAwKTsKK30KKworLyoKKyAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQorICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgorICovCitzdGF0aWMgaW50IGRvX291dF9vZl9tZW1vcnkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdHNrLT5tbTsKKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJaWYgKGlzX2luaXQodHNrKSkgeworCQl5aWVsZCgpOworCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCXJldHVybiAxOworCX0KKwlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7CisJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQorCQlkb19leGl0KFNJR0tJTEwpOworCWRvX25vX2NvbnRleHQocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3NpZ2J1cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdHNrLT5tbTsKKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJLyoKKwkgKiBTZW5kIGEgc2lnYnVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2Ugd2VyZSBpbiBrZXJuZWwKKwkgKiBvciB1c2VyIG1vZGUuCisJICovCisJdHNrLT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKKwl0c2stPnRocmVhZC50cmFwX25vID0gZXJyb3JfY29kZTsKKwlmb3JjZV9zaWcoU0lHQlVTLCB0c2spOworCisJLyogS2VybmVsIG1vZGU/IEhhbmRsZSBleGNlcHRpb25zIG9yIGRpZSAqLworCWlmICghKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSkKKwkJZG9fbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKK30KKwogI2lmZGVmIENPTkZJR19TMzkwX0VYRUNfUFJPVEVDVAogZXh0ZXJuIGxvbmcgc3lzX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gbG9uZyBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBsb25nIHN5czMyX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gbG9uZyBzeXMzMl9ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fc2lncmV0dXJuKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQlpbnQgcnQpCi17Ci0JdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJTkdMRV9TVEVQKTsKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl8zMUJJVCkpIHsKLQkJaWYgKHJ0KQotCQkJc3lzMzJfcnRfc2lncmV0dXJuKHJlZ3MpOwotCQllbHNlCi0JCQlzeXMzMl9zaWdyZXR1cm4ocmVncyk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwotCWlmIChydCkKLQkJc3lzX3J0X3NpZ3JldHVybihyZWdzKTsKLQllbHNlCi0JCXN5c19zaWdyZXR1cm4ocmVncyk7Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IHNpZ25hbF9yZXR1cm4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewotCXBnZF90ICpwZ2Q7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwotCXUxNiAqaW5zdHJ1Y3Rpb247Ci0JdW5zaWduZWQgbG9uZyBwZm4sIHVhZGRyID0gcmVncy0+cHN3LmFkZHI7CisJdTE2IGluc3RydWN0aW9uOworCWludCByYywgY29tcGF0OwogCi0Jc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCB1YWRkcik7Ci0JaWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKQotCQlnb3RvIG91dF9mYXVsdDsKLQlwbWQgPSBwbWRfb2Zmc2V0KHBnZCwgdWFkZHIpOwotCWlmIChwbWRfbm9uZSgqcG1kKSB8fCB1bmxpa2VseShwbWRfYmFkKCpwbWQpKSkKLQkJZ290byBvdXRfZmF1bHQ7Ci0JcHRlID0gcHRlX29mZnNldF9tYXAocG1kX29mZnNldChwZ2Rfb2Zmc2V0KG1tLCB1YWRkciksIHVhZGRyKSwgdWFkZHIpOwotCWlmICghcHRlIHx8ICFwdGVfcHJlc2VudCgqcHRlKSkKLQkJZ290byBvdXRfZmF1bHQ7Ci0JcGZuID0gcHRlX3BmbigqcHRlKTsKLQlpZiAoIXBmbl92YWxpZChwZm4pKQotCQlnb3RvIG91dF9mYXVsdDsKLQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwlyYyA9IF9fZ2V0X3VzZXIoaW5zdHJ1Y3Rpb24sICh1MTYgX191c2VyICopIHJlZ3MtPnBzdy5hZGRyKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisJaWYgKHJjKQorCQlyZXR1cm4gLUVGQVVMVDsKIAotCWluc3RydWN0aW9uID0gKHUxNiAqKSAoKHBmbiA8PCBQQUdFX1NISUZUKSArICh1YWRkciAmIChQQUdFX1NJWkUtMSkpKTsKLQlpZiAoKmluc3RydWN0aW9uID09IDB4MGE3NykKLQkJZG9fc2lncmV0dXJuKG1tLCByZWdzLCAwKTsKLQllbHNlIGlmICgqaW5zdHJ1Y3Rpb24gPT0gMHgwYWFkKQotCQlkb19zaWdyZXR1cm4obW0sIHJlZ3MsIDEpOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9TSU5HTEVfU1RFUCk7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCWNvbXBhdCA9IHRlc3RfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl8zMUJJVCk7CisJaWYgKGNvbXBhdCAmJiBpbnN0cnVjdGlvbiA9PSAweDBhNzcpCisJCXN5czMyX3NpZ3JldHVybihyZWdzKTsKKwllbHNlIGlmIChjb21wYXQgJiYgaW5zdHJ1Y3Rpb24gPT0gMHgwYWFkKQorCQlzeXMzMl9ydF9zaWdyZXR1cm4ocmVncyk7CisJZWxzZQorI2VuZGlmCisJaWYgKGluc3RydWN0aW9uID09IDB4MGE3NykKKwkJc3lzX3NpZ3JldHVybihyZWdzKTsKKwllbHNlIGlmIChpbnN0cnVjdGlvbiA9PSAweDBhYWQpCisJCXN5c19ydF9zaWdyZXR1cm4ocmVncyk7CiAJZWxzZSB7Ci0JCXByaW50aygiLSBYWFggLSBkb19leGNlcHRpb246IHRhc2sgPSAlcywgcHJpbWFyeSwgTk8gRVhFQyAiCi0JCSAgICAgICAiLT4gU0lHU0VHVlxuIiwgY3VycmVudC0+Y29tbSk7Ci0JCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJCWN1cnJlbnQtPnRocmVhZC5wcm90X2FkZHIgPSBhZGRyZXNzOwogCQljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IGVycm9yX2NvZGU7CiAJCWRvX3NpZ3NlZ3YocmVncywgZXJyb3JfY29kZSwgU0VHVl9NQVBFUlIsIGFkZHJlc3MpOwogCX0KIAlyZXR1cm4gMDsKLW91dF9mYXVsdDoKLQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiB9CiAjZW5kaWYgLyogQ09ORklHX1MzOTBfRVhFQ19QUk9URUNUICovCiAKQEAgLTI1Myw0OSArMzEwLDIzIEBACiAgKiAgIDNiICAgICAgIFJlZ2lvbiB0aGlyZCB0cmFucy4gIC0+ICBOb3QgcHJlc2VudCAgICAgICAobnVsbGlmaWNhdGlvbikKICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1kb19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSwgaW50IGlzX3Byb3RlY3Rpb24pCitkb19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSwgaW50IHdyaXRlKQogewotICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKLSAgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0gICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOwotCWludCBzaV9jb2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAlpbnQgc3BhY2U7CisJaW50IHNpX2NvZGU7CiAKLSAgICAgICAgdHNrID0gY3VycmVudDsKLSAgICAgICAgbW0gPSB0c2stPm1tOwotCQotCWlmIChub3RpZnlfcGFnZV9mYXVsdChESUVfUEFHRV9GQVVMVCwgInBhZ2UgZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlLCAxNCwKLQkJCQkJU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJaWYgKG5vdGlmeV9wYWdlX2ZhdWx0KHJlZ3MsIGVycm9yX2NvZGUpID09IE5PVElGWV9TVE9QKQogCQlyZXR1cm47CiAKLQkvKiAKLSAgICAgICAgICogQ2hlY2sgZm9yIGxvdy1hZGRyZXNzIHByb3RlY3Rpb24uICBUaGlzIG5lZWRzIHRvIGJlIHRyZWF0ZWQKLQkgKiBhcyBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlIHRoZSB0cmFuc2xhdGlvbiBleGNlcHRpb24gY29kZSAKLQkgKiBmaWVsZCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb250YWluIHZhbGlkIGRhdGEgaW4gdGhpcyBjYXNlLgotCSAqLwotCWlmIChpc19wcm90ZWN0aW9uICYmICEoUzM5MF9sb3djb3JlLnRyYW5zX2V4Y19jb2RlICYgNCkpIHsKKwl0c2sgPSBjdXJyZW50OworCW1tID0gdHNrLT5tbTsKIAotCQkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiBrZXJuZWwgbW9kZSBtZWFucyAKLQkJICAgTlVMTCBwb2ludGVyIHdyaXRlIGFjY2VzcyBpbiBrZXJuZWwgbW9kZS4gICovCi0gCQlpZiAoIShyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkpIHsKLQkJCWFkZHJlc3MgPSAwOwotCQkJc3BhY2UgPSAwOwotCQkJZ290byBub19jb250ZXh0OwotCQl9Ci0KLQkJLyogTG93LWFkZHJlc3MgcHJvdGVjdGlvbiBoaXQgaW4gdXNlciBtb2RlICdjYW5ub3QgaGFwcGVuJy4gICovCi0JCWRpZSAoIkxvdy1hZGRyZXNzIHByb3RlY3Rpb24iLCByZWdzLCBlcnJvcl9jb2RlKTsKLSAgICAgICAgCWRvX2V4aXQoU0lHS0lMTCk7Ci0JfQotCi0gICAgICAgIC8qIAotICAgICAgICAgKiBnZXQgdGhlIGZhaWxpbmcgYWRkcmVzcyAKLSAgICAgICAgICogbW9yZSBzcGVjaWZpYyB0aGUgc2VnbWVudCBhbmQgcGFnZSB0YWJsZSBwb3J0aW9uIG9mIAotICAgICAgICAgKiB0aGUgYWRkcmVzcyAKLSAgICAgICAgICovCi0gICAgICAgIGFkZHJlc3MgPSBTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiBfX0ZBSUxfQUREUl9NQVNLOworCS8qIGdldCB0aGUgZmFpbGluZyBhZGRyZXNzIGFuZCB0aGUgYWZmZWN0ZWQgc3BhY2UgKi8KKwlhZGRyZXNzID0gUzM5MF9sb3djb3JlLnRyYW5zX2V4Y19jb2RlICYgX19GQUlMX0FERFJfTUFTSzsKIAlzcGFjZSA9IGNoZWNrX3NwYWNlKHRzayk7CiAKIAkvKgpAQCAtMzEzLDcgKzM0NCw3IEBACiAJICovCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0gICAgICAgIGRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKIAlzaV9jb2RlID0gU0VHVl9NQVBFUlI7CiAJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwpAQCAtMzMwLDE5ICszNjEsMTkgQEAKIAkJCXJldHVybjsKICNlbmRpZgogCi0gICAgICAgIGlmICh2bWEtPnZtX3N0YXJ0IDw9IGFkZHJlc3MpIAotICAgICAgICAgICAgICAgIGdvdG8gZ29vZF9hcmVhOwotICAgICAgICBpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKLSAgICAgICAgICAgICAgICBnb3RvIGJhZF9hcmVhOwotICAgICAgICBpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCi0gICAgICAgICAgICAgICAgZ290byBiYWRfYXJlYTsKKwlpZiAodm1hLT52bV9zdGFydCA8PSBhZGRyZXNzKQorCQlnb3RvIGdvb2RfYXJlYTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJZ290byBiYWRfYXJlYTsKKwlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCWdvdG8gYmFkX2FyZWE7CiAvKgogICogT2ssIHdlIGhhdmUgYSBnb29kIHZtX2FyZWEgZm9yIHRoaXMgbWVtb3J5IGFjY2Vzcywgc28KICAqIHdlIGNhbiBoYW5kbGUgaXQuLgogICovCiBnb29kX2FyZWE6CiAJc2lfY29kZSA9IFNFR1ZfQUNDRVJSOwotCWlmICghaXNfcHJvdGVjdGlvbikgeworCWlmICghd3JpdGUpIHsKIAkJLyogcGFnZSBub3QgcHJlc2VudCwgY2hlY2sgdm0gZmxhZ3MgKi8KIAkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQyB8IFZNX1dSSVRFKSkpCiAJCQlnb3RvIGJhZF9hcmVhOwpAQCAtMzU3LDcgKzM4OCw3IEBACiAJICogbWFrZSBzdXJlIHdlIGV4aXQgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbmRsZXNzbHkgcmVkbwogCSAqIHRoZSBmYXVsdC4KIAkgKi8KLQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc19wcm90ZWN0aW9uKSkgeworCXN3aXRjaCAoaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIHdyaXRlKSkgewogCWNhc2UgVk1fRkFVTFRfTUlOT1I6CiAJCXRzay0+bWluX2ZsdCsrOwogCQlicmVhazsKQEAgLTM2NSw5ICszOTYsMTIgQEAKIAkJdHNrLT5tYWpfZmx0Kys7CiAJCWJyZWFrOwogCWNhc2UgVk1fRkFVTFRfU0lHQlVTOgotCQlnb3RvIGRvX3NpZ2J1czsKKwkJZG9fc2lnYnVzKHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOworCQlyZXR1cm47CiAJY2FzZSBWTV9GQVVMVF9PT006Ci0JCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJaWYgKGRvX291dF9vZl9tZW1vcnkocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcykpCisJCQlnb3RvIHN1cnZpdmU7CisJCXJldHVybjsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zODUsNzUgKzQxOSwzNCBAQAogICogRml4IGl0LCBidXQgY2hlY2sgaWYgaXQncyBrZXJuZWwgb3IgdXNlciBmaXJzdC4uCiAgKi8KIGJhZF9hcmVhOgotICAgICAgICB1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKLSAgICAgICAgLyogVXNlciBtb2RlIGFjY2Vzc2VzIGp1c3QgY2F1c2UgYSBTSUdTRUdWICovCi0gICAgICAgIGlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgewotICAgICAgICAgICAgICAgIHRzay0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgdHNrLT50aHJlYWQudHJhcF9ubyA9IGVycm9yX2NvZGU7CisJLyogVXNlciBtb2RlIGFjY2Vzc2VzIGp1c3QgY2F1c2UgYSBTSUdTRUdWICovCisJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7CisJCXRzay0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7CisJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOwogCQlkb19zaWdzZWd2KHJlZ3MsIGVycm9yX2NvZGUsIHNpX2NvZGUsIGFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKwkJcmV0dXJuOwogCX0KIAogbm9fY29udGV4dDoKLSAgICAgICAgLyogQXJlIHdlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGtlcm5lbCBmYXVsdD8gICovCi0JZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5wc3cuYWRkciAmIF9fRklYVVBfTUFTSyk7Ci0JaWYgKGZpeHVwKSB7Ci0JCXJlZ3MtPnBzdy5hZGRyID0gZml4dXAtPmZpeHVwIHwgUFNXX0FERFJfQU1PREU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLS8qCi0gKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCi0gKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCi0gKi8KLQlpZiAoc3BhY2UgPT0gMCkKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcG9pbnRlciBkZXJlZmVyZW5jZSIKLSAgICAgICAgCSAgICAgICAiIGF0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgJXBcbiIsICh2b2lkICopYWRkcmVzcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiCi0JCSAgICAgICAiIGF0IHZpcnR1YWwgdXNlciBhZGRyZXNzICVwXG4iLCAodm9pZCAqKWFkZHJlc3MpOwotCi0gICAgICAgIGRpZSgiT29wcyIsIHJlZ3MsIGVycm9yX2NvZGUpOwotICAgICAgICBkb19leGl0KFNJR0tJTEwpOwotCi0KLS8qCi0gKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgb3Igc29tZSBvdGhlciB0aGluZyBoYXBwZW5lZCB0byB1cyB0aGF0IG1hZGUKLSAqIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KLSovCi1vdXRfb2ZfbWVtb3J5OgotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGlzX2luaXQodHNrKSkgewotCQl5aWVsZCgpOwotCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCWdvdG8gc3Vydml2ZTsKLQl9Ci0JcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCB0c2stPmNvbW0pOwotCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKLQkJZG9fZXhpdChTSUdLSUxMKTsKLQlnb3RvIG5vX2NvbnRleHQ7Ci0KLWRvX3NpZ2J1czoKLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCi0JLyoKLQkgKiBTZW5kIGEgc2lnYnVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2Ugd2VyZSBpbiBrZXJuZWwKLQkgKiBvciB1c2VyIG1vZGUuCi0JICovCi0gICAgICAgIHRzay0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7Ci0gICAgICAgIHRzay0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOwotCWZvcmNlX3NpZyhTSUdCVVMsIHRzayk7Ci0KLQkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCi0JaWYgKCEocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpKQotCQlnb3RvIG5vX2NvbnRleHQ7CisJZG9fbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgZG9fcHJvdGVjdGlvbl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKKwkvKiBQcm90ZWN0aW9uIGV4Y2VwdGlvbiBpcyBzdXByZXNzaW5nLCBkZWNyZW1lbnQgcHN3IGFkZHJlc3MuICovCiAJcmVncy0+cHN3LmFkZHIgLT0gKGVycm9yX2NvZGUgPj4gMTYpOworCS8qCisJICogQ2hlY2sgZm9yIGxvdy1hZGRyZXNzIHByb3RlY3Rpb24uICBUaGlzIG5lZWRzIHRvIGJlIHRyZWF0ZWQKKwkgKiBhcyBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlIHRoZSB0cmFuc2xhdGlvbiBleGNlcHRpb24gY29kZQorCSAqIGZpZWxkIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbnRhaW4gdmFsaWQgZGF0YSBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKHVubGlrZWx5KCEoUzM5MF9sb3djb3JlLnRyYW5zX2V4Y19jb2RlICYgNCkpKSB7CisJCWRvX2xvd19hZGRyZXNzKHJlZ3MsIGVycm9yX2NvZGUpOworCQlyZXR1cm47CisJfQogCWRvX2V4Y2VwdGlvbihyZWdzLCA0LCAxKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwppbmRleCA5YzJlN2E3Li5hZGVlY2UxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwpAQCAtNDYsNyArNDYsNyBAQAogewogCSpza2IgPSBldGhlcl9hZGp1c3Rfc2tiKCpza2IsIEVUSF9IRUFERVJfT1RIRVIpOwogCWlmKCpza2IgPT0gTlVMTCkgcmV0dXJuKC1FTk9NRU0pOwotCXJldHVybihuZXRfcmVjdmZyb20oZmQsICgqc2tiKS0+bWFjLnJhdywgCisJcmV0dXJuKG5ldF9yZWN2ZnJvbShmZCwgc2tiX21hY19oZWFkZXIoKnNrYiksCiAJCQkgICAgKCpza2IpLT5kZXYtPm10dSArIEVUSF9IRUFERVJfT1RIRVIpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMKaW5kZXggNTJjY2I3Yi4uZTZiOGUwZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jCkBAIC01MCw3ICs1MCw3IEBACiB7CiAJKnNrYiA9IGV0aGVyX2FkanVzdF9za2IoKnNrYiwgRVRIX0hFQURFUl9PVEhFUik7CiAJaWYoKnNrYiA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7Ci0JcmV0dXJuKG5ldF9yZWN2ZnJvbShmZCwgKCpza2IpLT5tYWMucmF3LCAKKwlyZXR1cm4obmV0X3JlY3Zmcm9tKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwKIAkJCSAgICAoKnNrYiktPmRldi0+bXR1ICsgRVRIX0hFQURFUl9PVEhFUikpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCmluZGV4IDA0ZTMxZjguLjg1OTMwMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCkBAIC01NSw3ICs1NSw3IEBACiAKIAlza2ItPmRldiA9IGRldjsKIAlza2JfcHV0KHNrYiwgZGV2LT5tdHUpOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXBrdF9sZW4gPSAoKmxwLT5yZWFkKShscC0+ZmQsICZza2IsIGxwKTsKIAogCWlmIChwa3RfbGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jCmluZGV4IGU2NzM2MmEuLjk0ODg0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMKQEAgLTM2LDcgKzM2LDcgQEAKIHsKIAkqc2tiID0gZXRoZXJfYWRqdXN0X3NrYigqc2tiLCBFVEhfSEVBREVSX09USEVSKTsKIAlpZigqc2tiID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKLQlyZXR1cm4ocGNhcF91c2VyX3JlYWQoZmQsICgqc2tiKS0+bWFjLnJhdywgCisJcmV0dXJuKHBjYXBfdXNlcl9yZWFkKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwKIAkJCSAgICAgICgqc2tiKS0+ZGV2LT5tdHUgKyBFVEhfSEVBREVSX09USEVSLAogCQkJICAgICAgKHN0cnVjdCBwY2FwX2RhdGEgKikgJmxwLT51c2VyKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMKaW5kZXggMjU2MzRiZC4uMTI1YzQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX2tlcm4uYwpAQCAtNDksNyArNDksNyBAQAogc3RhdGljIGludCBzbGlwX3JlYWQoaW50IGZkLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwgCiAJCSAgICAgICBzdHJ1Y3QgdW1sX25ldF9wcml2YXRlICpscCkKIHsKLQlyZXR1cm4oc2xpcF91c2VyX3JlYWQoZmQsICgqc2tiKS0+bWFjLnJhdywgKCpza2IpLT5kZXYtPm10dSwgCisJcmV0dXJuKHNsaXBfdXNlcl9yZWFkKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwgKCpza2IpLT5kZXYtPm10dSwKIAkJCSAgICAgIChzdHJ1Y3Qgc2xpcF9kYXRhICopICZscC0+dXNlcikpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX2tlcm4uYwppbmRleCBiM2VkOGZiLi4wYTAzMjRhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF9rZXJuLmMKQEAgLTUzLDcgKzUzLDcgQEAKIHN0YXRpYyBpbnQgc2xpcnBfcmVhZChpbnQgZmQsIHN0cnVjdCBza19idWZmICoqc2tiLCAKIAkJICAgICAgIHN0cnVjdCB1bWxfbmV0X3ByaXZhdGUgKmxwKQogewotCXJldHVybihzbGlycF91c2VyX3JlYWQoZmQsICgqc2tiKS0+bWFjLnJhdywgKCpza2IpLT5kZXYtPm10dSwgCisJcmV0dXJuKHNsaXJwX3VzZXJfcmVhZChmZCwgc2tiX21hY19oZWFkZXIoKnNrYiksICgqc2tiKS0+ZGV2LT5tdHUsCiAJCQkgICAgICAoc3RydWN0IHNsaXJwX2RhdGEgKikgJmxwLT51c2VyKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jCmluZGV4IDcwNTQxODIuLjEyNjg5MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYwpAQCAtNDMsNyArNDMsNyBAQAogCiAJKnNrYiA9IGV0aGVyX2FkanVzdF9za2IoKnNrYiwgRVRIX0hFQURFUl9FVEhFUlRBUCk7CiAJaWYoKnNrYiA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7Ci0JbGVuID0gbmV0X3JlY3Zmcm9tKGZkLCAoKnNrYiktPm1hYy5yYXcsIAorCWxlbiA9IG5ldF9yZWN2ZnJvbShmZCwgc2tiX21hY19oZWFkZXIoKnNrYiksCiAJCQkgICAoKnNrYiktPmRldi0+bXR1ICsgMiAqIEVUSF9IRUFERVJfRVRIRVJUQVApOwogCWlmKGxlbiA8PSAwKSByZXR1cm4obGVuKTsKIAlza2JfcHVsbCgqc2tiLCAyKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfa2Vybi5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKaW5kZXggNzY1NzBhMi4uZjE3MTRlNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKQEAgLTQzLDcgKzQzLDcgQEAKIHsKIAkqc2tiID0gZXRoZXJfYWRqdXN0X3NrYigqc2tiLCBFVEhfSEVBREVSX09USEVSKTsKIAlpZigqc2tiID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKLQlyZXR1cm4obmV0X3JlYWQoZmQsICgqc2tiKS0+bWFjLnJhdywgCisJcmV0dXJuKG5ldF9yZWFkKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwKIAkJCSgqc2tiKS0+ZGV2LT5tdHUgKyBFVEhfSEVBREVSX09USEVSKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCmluZGV4IDhlYmZjODcuLmFiMDViZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL25ldHdvcmsuYwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJLyogU2V0dXAgc2tiICovCiAKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlwa3RfbGVuID0gbHAtPnRwLnJlYWQobHAsICZza2IpOwogCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCmluZGV4IDNjMzcyZTAuLjU5NjUxYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYworKysgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogICAgIH0KICAgICAvLyBjYXN0IG5lZWRlZCBhcyB0aGVyZSBpcyBubyAlPyBmb3IgcG9pbnRlciBkaWZmZXJlbmNlcwogICAgIFBSSU5URCAoREJHX1NLQiwgImFsbG9jYXRlZCBza2IgYXQgJXAsIGhlYWQgJXAsIGFyZWEgJWxpIiwKLQkgICAgc2tiLCBza2ItPmhlYWQsIChsb25nKSAoc2tiLT5lbmQgLSBza2ItPmhlYWQpKTsKKwkgICAgc2tiLCBza2ItPmhlYWQsIChsb25nKSAoc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQpKTsKICAgICByeC5oYW5kbGUgPSB2aXJ0X3RvX2J1cyAoc2tiKTsKICAgICByeC5ob3N0X2FkZHJlc3MgPSBjcHVfdG9fYmUzMiAodmlydF90b19idXMgKHNrYi0+ZGF0YSkpOwogICAgIGlmIChyeF9naXZlIChkZXYsICZyeCwgcG9vbCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hdG10Y3AuYyBiL2RyaXZlcnMvYXRtL2F0bXRjcC5jCmluZGV4IGZjNTE4ZDguLjAyYWQ4M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2F0bXRjcC5jCisrKyBiL2RyaXZlcnMvYXRtL2F0bXRjcC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAloZHItPnZwaSA9IGh0b25zKHZjYy0+dnBpKTsKIAloZHItPnZjaSA9IGh0b25zKHZjYy0+dmNpKTsKIAloZHItPmxlbmd0aCA9IGh0b25sKHNrYi0+bGVuKTsKLQltZW1jcHkoc2tiX3B1dChuZXdfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KG5ld19za2IsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOwogCWlmICh2Y2MtPnBvcCkgdmNjLT5wb3AodmNjLHNrYik7CiAJZWxzZSBkZXZfa2ZyZWVfc2tiKHNrYik7CiAJb3V0X3ZjYy0+cHVzaChvdXRfdmNjLG5ld19za2IpOwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAJX19uZXRfdGltZXN0YW1wKG5ld19za2IpOwotCW1lbWNweShza2JfcHV0KG5ld19za2Isc2tiLT5sZW4pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQobmV3X3NrYiwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAJb3V0X3ZjYy0+cHVzaChvdXRfdmNjLG5ld19za2IpOwogCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4KTsKIAlhdG9taWNfaW5jKCZvdXRfdmNjLT5zdGF0cy0+cngpOwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJLm9wcwkJPSAmYXRtdGNwX2NfZGV2X29wcywKIAkudHlwZQkJPSAiYXRtdGNwIiwKIAkubnVtYmVyCQk9IDk5OSwKLQkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChhdG10Y3BfY29udHJvbF9kZXYubG9jaykKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA4ZmNjZjAxLi4wZDNhMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCXJldHVybiAwOwogCX0KIAlza2JfcHV0KHNrYixsZW5ndGgpOwotCXNrYl9zZXRfdGltZXN0YW1wKHNrYiwgJmVuaV92Y2MtPnRpbWVzdGFtcCk7CisJc2tiLT50c3RhbXAgPSBlbmlfdmNjLT50aW1lc3RhbXA7CiAJRFBSSU5USygiZ290IGxlbiAlbGRcbiIsbGVuZ3RoKTsKIAlpZiAoZG9fcnhfZG1hKHZjYyxza2IsMSxsZW5ndGggPj4gMixsZW5ndGggPj4gMikpIHJldHVybiAxOwogCWVuaV92Y2MtPnJ4aW5nKys7CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJCURQUklOVEsoIkdyciwgc2VydmljaW5nIFZDQyAlbGQgdHdpY2VcbiIsdmNpKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWRvX2dldHRpbWVvZmRheSgmRU5JX1ZDQyh2Y2MpLT50aW1lc3RhbXApOworCQlFTklfVkNDKHZjYyktPnRpbWVzdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CiAJCUVOSV9WQ0ModmNjKS0+bmV4dCA9IE5VTEw7CiAJCWlmICh2Y2MtPnFvcy5yeHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgewogCQkJaWYgKGVuaV9kZXYtPmZhc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9lbmkuaCBiL2RyaXZlcnMvYXRtL2VuaS5oCmluZGV4IDM4NTA5MGMuLmQwNGZlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2VuaS5oCisrKyBiL2RyaXZlcnMvYXRtL2VuaS5oCkBAIC01OSw3ICs1OSw3IEBACiAJaW50IHJ4aW5nOwkJCS8qIG51bWJlciBvZiBwZW5kaW5nIFBEVXMgKi8KIAlpbnQgc2VydmljaW5nOwkJCS8qIG51bWJlciBvZiB3YWl0aW5nIFZDcyAoMCBvciAxKSAqLwogCWludCB0eGluZzsJCQkvKiBudW1iZXIgb2YgcGVuZGluZyBUWCBieXRlcyAqLwotCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsJLyogZm9yIFJYIHRpbWluZyAqLworCWt0aW1lX3QgdGltZXN0YW1wOwkJLyogZm9yIFJYIHRpbWluZyAqLwogCXN0cnVjdCBhdG1fdmNjICpuZXh0OwkJLyogbmV4dCBwZW5kaW5nIFJYICovCiAJc3RydWN0IHNrX2J1ZmYgKmxhc3Q7CQkvKiBsYXN0IFBEVSBiZWluZyBETUFlZCAodXNlZCB0byBjYXJyeQogCQkJCQkgICBkaXNjYXJkIGluZm9ybWF0aW9uKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKaW5kZXggYTdjMGVkMy4uNDA1ZWU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYworKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAgJElkOiBmb3JlMjAwZS5jLHYgMS41IDIwMDAvMDQvMTQgMTA6MTA6MzQgZGF2ZW0gRXhwICQKLQogICBBIEZPUkUgU3lzdGVtcyAyMDBFLXNlcmllcyBkcml2ZXIgZm9yIEFUTSBvbiBMaW51eC4KICAgQ2hyaXN0b3BoZSBMaXp6aSAobGl6emlAY25hbS5mciksIE9jdG9iZXIgMTk5OS1NYXJjaCAyMDAzLgogCkBAIC0xNTAyLDkgKzE1MDAsOSBAQAogICAgIC8qIHBzZXVkby1DQlIgYmFuZHdpZHRoIHJlcXVlc3RlZD8gKi8KICAgICBpZiAoKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fQ0JSKSAmJiAodmNjLT5xb3MudHh0cC5tYXhfcGNyID4gMCkpIHsKIAkKLQlkb3duKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJbXV0ZXhfbG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAlpZiAoZm9yZTIwMGUtPmF2YWlsYWJsZV9jZWxsX3JhdGUgPCB2Y2MtPnFvcy50eHRwLm1heF9wY3IpIHsKLQkgICAgdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwkgICAgbXV0ZXhfdW5sb2NrKCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogCiAJICAgIGtmcmVlKGZvcmUyMDBlX3ZjYyk7CiAJICAgIHZjX21hcC0+dmNjID0gTlVMTDsKQEAgLTE1MTMsNyArMTUxMSw3IEBACiAKIAkvKiByZXNlcnZlIGJhbmR3aWR0aCAqLwogCWZvcmUyMDBlLT5hdmFpbGFibGVfY2VsbF9yYXRlIC09IHZjYy0+cW9zLnR4dHAubWF4X3BjcjsKLQl1cCgmZm9yZTIwMGUtPnJhdGVfc2YpOworCW11dGV4X3VubG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKICAgICB9CiAgICAgCiAgICAgdmNjLT5pdGYgPSB2Y2MtPmRldi0+bnVtYmVyOwpAQCAtMTU5OSw5ICsxNTk3LDkgQEAKICAgICAvKiByZWxlYXNlIHJlc2VydmVkIGJhbmR3aWR0aCwgaWYgYW55ICovCiAgICAgaWYgKCh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgJiYgKHZjYy0+cW9zLnR4dHAubWF4X3BjciA+IDApKSB7CiAKLQlkb3duKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJbXV0ZXhfbG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAlmb3JlMjAwZS0+YXZhaWxhYmxlX2NlbGxfcmF0ZSArPSB2Y2MtPnFvcy50eHRwLm1heF9wY3I7Ci0JdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF91bmxvY2soJmZvcmUyMDBlLT5yYXRlX210eCk7CiAKIAljbGVhcl9iaXQoQVRNX1ZGX0hBU1FPUywgJnZjYy0+ZmxhZ3MpOwogICAgIH0KQEAgLTIwNjQsMTYgKzIwNjIsMTYgQEAKIAogICAgIGlmICgocW9zLT50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgJiYgKHFvcy0+dHh0cC5tYXhfcGNyID4gMCkpIHsKIAotCWRvd24oJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF9sb2NrKCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogCWlmIChmb3JlMjAwZS0+YXZhaWxhYmxlX2NlbGxfcmF0ZSArIHZjYy0+cW9zLnR4dHAubWF4X3BjciA8IHFvcy0+dHh0cC5tYXhfcGNyKSB7Ci0JICAgIHVwKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJICAgIG11dGV4X3VubG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAkgICAgcmV0dXJuIC1FQUdBSU47CiAJfQogCiAJZm9yZTIwMGUtPmF2YWlsYWJsZV9jZWxsX3JhdGUgKz0gdmNjLT5xb3MudHh0cC5tYXhfcGNyOwogCWZvcmUyMDBlLT5hdmFpbGFibGVfY2VsbF9yYXRlIC09IHFvcy0+dHh0cC5tYXhfcGNyOwogCi0JdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF91bmxvY2soJmZvcmUyMDBlLT5yYXRlX210eCk7CiAJCiAJbWVtY3B5KCZ2Y2MtPnFvcywgcW9zLCBzaXplb2Yoc3RydWN0IGF0bV9xb3MpKTsKIAkKQEAgLTI0NTksNyArMjQ1Nyw3IEBACiAKICAgICBEUFJJTlRLKDIsICJkZXZpY2UgJXMgYmVpbmcgaW5pdGlhbGl6ZWRcbiIsIGZvcmUyMDBlLT5uYW1lKTsKIAotICAgIGluaXRfTVVURVgoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKyAgICBtdXRleF9pbml0KCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogICAgIHNwaW5fbG9ja19pbml0KCZmb3JlMjAwZS0+cV9sb2NrKTsKIAogICAgIGNwcSA9IGZvcmUyMDBlLT5jcF9xdWV1ZXMgPSBmb3JlMjAwZS0+dmlydF9iYXNlICsgRk9SRTIwMEVfQ1BfUVVFVUVTX09GRlNFVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmggYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5oCmluZGV4IGY5YWJmZGEuLmI4NWE1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmgKKysrIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuaApAQCAtODY5LDcgKzg2OSw3IEBACiAKICAgICBzdHJ1Y3Qgc3RhdHMqICAgICAgICAgICAgICBzdGF0czsgICAgICAgICAgICAgICAgICAvKiBsYXN0IHNuYXBzaG90IG9mIHRoZSBzdGF0cyAgICAgICAgICovCiAgICAgCi0gICAgc3RydWN0IHNlbWFwaG9yZSAgICAgICAgICAgcmF0ZV9zZjsgICAgICAgICAgICAgICAgLyogcHJvdGVjdHMgcmF0ZSByZXNlcnZhdGlvbiBvcHMgICAgICAqLworICAgIHN0cnVjdCBtdXRleCAgICAgICAgICAgICAgIHJhdGVfbXR4OyAgICAgICAgICAgICAgIC8qIHByb3RlY3RzIHJhdGUgcmVzZXJ2YXRpb24gb3BzICAgICAgKi8KICAgICBzcGlubG9ja190ICAgICAgICAgICAgICAgICBxX2xvY2s7ICAgICAgICAgICAgICAgICAvKiBwcm90ZWN0cyBxdWV1ZSBvcHMgICAgICAgICAgICAgICAgICovCiAjaWZkZWYgRk9SRTIwMEVfVVNFX1RBU0tMRVQKICAgICBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICAgICB0eF90YXNrbGV0OyAgICAgICAgICAgICAvKiBwZXJmb3JtcyB0eCBpbnRlcnJ1cHQgd29yayAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9oZS5jIGIvZHJpdmVycy9hdG0vaGUuYwppbmRleCA4NTEwMDI2Li5kMzNhYmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9oZS5jCisrKyBiL2RyaXZlcnMvYXRtL2hlLmMKQEAgLTE5MDEsMTMgKzE5MDEsMTMgQEAKIAkJCWNhc2UgQVRNX0FBTDA6CiAJCQkJLyogMi4xMC4xLjUgcmF3IGNlbGwgcmVjZWl2ZSAqLwogCQkJCXNrYi0+bGVuID0gQVRNX0FBTDBfU0RVOwotCQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVE1fQUFMNToKIAkJCQkvKiAyLjEwLjEuMiBhYWw1IHJlY2VpdmUgKi8KIAogCQkJCXNrYi0+bGVuID0gQUFMNV9MRU4oc2tiLT5kYXRhLCBoZV92Y2MtPnBkdV9sZW4pOwotCQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogI2lmZGVmIFVTRV9DSEVDS1NVTV9IVwogCQkJCWlmICh2Y2MtPnZwaSA9PSAwICYmIHZjYy0+dmNpID49IEFUTV9OT1RfUlNWX1ZDSSkgewogCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKaW5kZXggYjRiODAxNDAuLjA1N2VmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKKysrIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwpAQCAtMTA2NSw3ICsxMDY1LDggQEAKIAl2Y2MgPSB2Yy0+cnhfdmNjOwogCiAJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGNhcmQtPnBjaWRldiwgSURUNzcyNTJfUFJWX1BBRERSKHNrYiksCi0JCQkJICAgIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCSAgICBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwKKwkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWlmICgodmNjLT5xb3MuYWFsID09IEFUTV9BQUwwKSB8fAogCSAgICAodmNjLT5xb3MuYWFsID09IEFUTV9BQUwzNCkpIHsKQEAgLTExOTQsNyArMTE5NSw4IEBACiAJCX0KIAogCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBjaWRldiwgSURUNzcyNTJfUFJWX1BBRERSKHNrYiksCi0JCQkJIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCSBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJc2JfcG9vbF9yZW1vdmUoY2FyZCwgc2tiKTsKIAogCQlza2JfdHJpbShza2IsIGxlbik7CkBAIC0xMjY3LDcgKzEyNjksNyBAQAogCXRhaWwgPSByZWFkbChTQVJfUkVHX1JBV0NUKTsKIAogCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShjYXJkLT5wY2lkZXYsIElEVDc3MjUyX1BSVl9QQUREUihxdWV1ZSksCi0JCQkJICAgIHF1ZXVlLT5lbmQgLSBxdWV1ZS0+aGVhZCAtIDE2LAorCQkJCSAgICBza2JfZW5kX3BvaW50ZXIocXVldWUpIC0gcXVldWUtPmhlYWQgLSAxNiwKIAkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKQEAgLTEzNjMsNyArMTM2NSw4IEBACiAJCQkJcXVldWUgPSBjYXJkLT5yYXdfY2VsbF9oZWFkOwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShjYXJkLT5wY2lkZXYsCiAJCQkJCQkJICAgIElEVDc3MjUyX1BSVl9QQUREUihxdWV1ZSksCi0JCQkJCQkJICAgIHF1ZXVlLT5lbmQgLSBxdWV1ZS0+ZGF0YSwKKwkJCQkJCQkgICAgKHNrYl9lbmRfcG9pbnRlcihxdWV1ZSkgLQorCQkJCQkJCSAgICAgcXVldWUtPmRhdGEpLAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJfSBlbHNlIHsKIAkJCQljYXJkLT5yYXdfY2VsbF9oZWFkID0gTlVMTDsKQEAgLTE4MTYsNyArMTgxOSw4IEBACiAJdTMyIGhhbmRsZTsKIAl1MzIgYWRkcjsKIAotCXNrYi0+ZGF0YSA9IHNrYi0+dGFpbCA9IHNrYi0+aGVhZDsKKwlza2ItPmRhdGEgPSBza2ItPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCXNrYi0+bGVuID0gMDsKIAogCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwpAQCAtMTgzNSw3ICsxODM5LDYgQEAKIAkJc2tiX3B1dChza2IsIFNBUl9GQl9TSVpFXzMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE4NzQsNyArMTg3Nyw3IEBACiAJCX0KIAogCQlwYWRkciA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBjaWRldiwgc2tiLT5kYXRhLAotCQkJCSAgICAgICBza2ItPmVuZCAtIHNrYi0+ZGF0YSwKKwkJCQkgICAgICAgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmRhdGEsCiAJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCUlEVDc3MjUyX1BSVl9QQUREUihza2IpID0gcGFkZHI7CiAKQEAgLTE4ODgsNyArMTg5MSw3IEBACiAKIG91dHVubWFwOgogCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGNpZGV2LCBJRFQ3NzI1Ml9QUlZfUEFERFIoc2tiKSwKLQkJCSBza2ItPmVuZCAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWhhbmRsZSA9IElEVDc3MjUyX1BSVl9QT09MKHNrYik7CiAJY2FyZC0+c2Jwb29sW1BPT0xfUVVFVUUoaGFuZGxlKV0uc2tiW1BPT0xfSU5ERVgoaGFuZGxlKV0gPSBOVUxMOwpAQCAtMTkwNSwxMiArMTkwOCwxNCBAQAogCWludCBlcnI7CiAKIAlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2FyZC0+cGNpZGV2LCBJRFQ3NzI1Ml9QUlZfUEFERFIoc2tiKSwKLQkJCQkgICAgICAgc2tiLT5lbmQgLSBza2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJICAgICAgIHNrYl9lbmRfcG9pbnRlcihza2IpIC0gc2tiLT5kYXRhLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJZXJyID0gcHVzaF9yeF9za2IoY2FyZCwgc2tiLCBQT09MX1FVRVVFKGhhbmRsZSkpOwogCWlmIChlcnIpIHsKIAkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wY2lkZXYsIElEVDc3MjUyX1BSVl9QQUREUihza2IpLAotCQkJCSBza2ItPmVuZCAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmRhdGEsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXNiX3Bvb2xfcmVtb3ZlKGNhcmQsIHNrYik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAl9CkBAIC0zMTIyLDcgKzMxMjcsOCBAQAogCQkJaWYgKHNrYikgewogCQkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGNpZGV2LAogCQkJCQkJIElEVDc3MjUyX1BSVl9QQUREUihza2IpLAotCQkJCQkJIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLAorCQkJCQkJIChza2JfZW5kX3BvaW50ZXIoc2tiKSAtCisJCQkJCQkgIHNrYi0+ZGF0YSksCiAJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCQljYXJkLT5zYnBvb2xbaV0uc2tiW2pdID0gTlVMTDsKIAkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggYWFiOWIzNy4uMTRjZWQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMjIwOCw3ICsyMjA4LDcgQEAKICAgICAgICAgIGlmIChpID09IDEgJiYgbnNfcnNxZV9lb3BkdShyc3FlKSkKICAgICAgICAgICAgICooKHUzMiAqKSBzYi0+ZGF0YSkgfD0gMHgwMDAwMDAwMjsKICAgICAgICAgIHNrYl9wdXQoc2IsIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgICAgIG1lbWNweShzYi0+dGFpbCwgY2VsbCwgQVRNX0NFTExfUEFZTE9BRCk7CisgICAgICAgICBtZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihzYiksIGNlbGwsIEFUTV9DRUxMX1BBWUxPQUQpOwogICAgICAgICAgc2tiX3B1dChzYiwgQVRNX0NFTExfUEFZTE9BRCk7CiAgICAgICAgICBBVE1fU0tCKHNiKS0+dmNjID0gdmNjOwogCSBfX25ldF90aW1lc3RhbXAoc2IpOwpAQCAtMjI1Miw3ICsyMjUyLDggQEAKICAgICAgIHZjLT5yeF9pb3YgPSBpb3ZiOwogICAgICAgTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPSAwOwogICAgICAgaW92Yi0+bGVuID0gMDsKLSAgICAgIGlvdmItPnRhaWwgPSBpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKyAgICAgIGlvdmItPmRhdGEgPSBpb3ZiLT5oZWFkOworICAgICAgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKICAgICAgIE5TX1NLQihpb3ZiKS0+dmNjID0gdmNjOwogICAgICAgLyogSU1QT1JUQU5UOiBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUgc21hbGwgb3IgbGFyZ2UKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlzIHN0b3JlZCBhcyBpb3ZlYyBiYXNlLCBOT1QgYSBwb2ludGVyIHRvIHRoZSAKQEAgLTIyNjUsNyArMjI2Niw4IEBACiAgICAgICByZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhLCBOU19NQVhfSU9WRUNTKTsKICAgICAgIE5TX1NLQihpb3ZiKS0+aW92Y250ID0gMDsKICAgICAgIGlvdmItPmxlbiA9IDA7Ci0gICAgICBpb3ZiLT50YWlsID0gaW92Yi0+ZGF0YSA9IGlvdmItPmhlYWQ7CisgICAgICBpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKyAgICAgIHNrYl9yZXNldF90YWlsX3BvaW50ZXIoaW92Yik7CiAgICAgICBOU19TS0IoaW92YiktPnZjYyA9IHZjYzsKICAgIH0KICAgIGlvdiA9ICYoKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhKVtOU19TS0IoaW92YiktPmlvdmNudCsrXTsKQEAgLTIzOTMsNyArMjM5NSw3IEBACiAgICAgICAgICAgICAgICBza2ItPmRlc3RydWN0b3IgPSBuc19sYl9kZXN0cnVjdG9yOwogI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwogICAgICAgICAgICAgICAgc2tiX3B1c2goc2tiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSwgc2ItPmRhdGEsIE5TX1NNQlVGU0laRSk7CisgICAgICAgICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNiLCBza2ItPmRhdGEsIE5TX1NNQlVGU0laRSk7CiAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgbGVuIC0gTlNfU01CVUZTSVpFKTsKICAgICAgICAgICAgICAgIEFUTV9TS0Ioc2tiKS0+dmNjID0gdmNjOwogCSAgICAgICBfX25ldF90aW1lc3RhbXAoc2tiKTsKQEAgLTI0NzcsNyArMjQ3OSw3IEBACiAJIHsKICAgICAgICAgICAgIC8qIENvcHkgdGhlIHNtYWxsIGJ1ZmZlciB0byB0aGUgaHVnZSBidWZmZXIgKi8KICAgICAgICAgICAgIHNiID0gKHN0cnVjdCBza19idWZmICopIGlvdi0+aW92X2Jhc2U7Ci0gICAgICAgICAgICBtZW1jcHkoaGItPmRhdGEsIHNiLT5kYXRhLCBpb3YtPmlvdl9sZW4pOworICAgICAgICAgICAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzYiwgaGItPmRhdGEsIGlvdi0+aW92X2xlbik7CiAgICAgICAgICAgICBza2JfcHV0KGhiLCBpb3YtPmlvdl9sZW4pOwogICAgICAgICAgICAgcmVtYWluaW5nID0gbGVuIC0gaW92LT5pb3ZfbGVuOwogICAgICAgICAgICAgaW92Kys7CkBAIC0yNDg5LDcgKzI0OTEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgaW92LT5pb3ZfYmFzZTsKICAgICAgICAgICAgICAgIHRvY29weSA9IG1pbl90KGludCwgcmVtYWluaW5nLCBpb3YtPmlvdl9sZW4pOwotICAgICAgICAgICAgICAgbWVtY3B5KGhiLT50YWlsLCBsYi0+ZGF0YSwgdG9jb3B5KTsKKyAgICAgICAgICAgICAgIHNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEobGIsIHNrYl90YWlsX3BvaW50ZXIoaGIpLCB0b2NvcHkpOwogICAgICAgICAgICAgICAgc2tiX3B1dChoYiwgdG9jb3B5KTsKICAgICAgICAgICAgICAgIGlvdisrOwogICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IHRvY29weTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKaW5kZXggMjMwOGU4My4uMWQ4NDY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKQEAgLTQ4LDYgKzQ4LDE1IEBACiAJX19iZTMyIHRhZzsKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFvZV9oZHIgKmFvZV9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhb2VfaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiBzdHJ1Y3QgYW9lX2F0YWhkciB7CiAJdW5zaWduZWQgY2hhciBhZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBlcnJmZWF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwppbmRleCA4ZDE3ZDhkLi4xYTZhZWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwpAQCAtMjcsNyArMjcsOCBAQAogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYikgewotCQlza2ItPm5oLnJhdyA9IHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FPRSk7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCQlza2ItPm5leHQgPSBza2ItPnByZXYgPSBOVUxMOwpAQCAtMTE4LDcgKzExOSw3IEBACiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlza2IgPSBmLT5za2I7Ci0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKQEAgLTIwNyw3ICsyMDgsNyBAQAogCQlza2ItPmRldiA9IGlmcDsKIAkJaWYgKHNsX3RhaWwgPT0gTlVMTCkKIAkJCXNsX3RhaWwgPSBza2I7Ci0JCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCQloID0gYW9lX2hkcihza2IpOwogCQltZW1zZXQoaCwgMCwgc2l6ZW9mICpoICsgc2l6ZW9mICpjaCk7CiAKIAkJbWVtc2V0KGgtPmRzdCwgMHhmZiwgc2l6ZW9mIGgtPmRzdCk7CkBAIC0zMDAsNyArMzAxLDcgQEAKIAlhb2VjaHJfZXJyb3IoYnVmKTsKIAogCXNrYiA9IGYtPnNrYjsKLQloID0gKHN0cnVjdCBhb2VfaGRyICopIHNrYi0+bWFjLnJhdzsKKwloID0gYW9lX2hkcihza2IpOwogCWFoID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChoKzEpOwogCWYtPnRhZyA9IG47CiAJaC0+dGFnID0gY3B1X3RvX2JlMzIobik7CkBAIC01MjksNyArNTMwLDcgQEAKIAljaGFyIGVidWZbMTI4XTsKIAl1MTYgYW9lbWFqb3I7CiAKLQloaW4gPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCWhpbiA9IGFvZV9oZHIoc2tiKTsKIAlhb2VtYWpvciA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoJmhpbi0+bWFqb3IpKTsKIAlkID0gYW9lZGV2X2J5X2FvZWFkZHIoYW9lbWFqb3IsIGhpbi0+bWlub3IpOwogCWlmIChkID09IE5VTEwpIHsKQEAgLTU2MSw3ICs1NjIsNyBAQAogCWNhbGNfcnR0YXZnKGQsIHRzaW5jZShmLT50YWcpKTsKIAogCWFoaW4gPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGhpbisxKTsKLQlob3V0ID0gKHN0cnVjdCBhb2VfaGRyICopIGYtPnNrYi0+bWFjLnJhdzsKKwlob3V0ID0gYW9lX2hkcihmLT5za2IpOwogCWFob3V0ID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChob3V0KzEpOwogCWJ1ZiA9IGYtPmJ1ZjsKIApAQCAtNjk1LDcgKzY5Niw3IEBACiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlza2IgPSBmLT5za2I7Ci0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKQEAgLTcyNiw3ICs3MjcsNyBAQAogCWVudW0geyBNQVhGUkFNRVMgPSAxNiB9OwogCXUxNiBuOwogCi0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAljaCA9IChzdHJ1Y3QgYW9lX2NmZ2hkciAqKSAoaCsxKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCmluZGV4IGFhYjZkOTEuLmY5ZGRmZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkJZ290byBleGl0OwogCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwkvKiAoMSkgKi8KIAotCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCWggPSBhb2VfaGRyKHNrYik7CiAJbiA9IGJlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoJmgtPnRhZykpOwogCWlmICgoaC0+dmVyZmwgJiBBT0VGTF9SU1ApID09IDAgfHwgKG4gJiAxPDwzMSkpCiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JmdXNiLmMgYi9kcml2ZXJzL2JsdWV0b290aC9iZnVzYi5jCmluZGV4IDRjNzY2ZjMuLmI5OTA4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JmdXNiLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiAJCWJ1ZlsyXSA9IChzaXplID09IEJGVVNCX01BWF9CTE9DS19TSVpFKSA/IDAgOiBzaXplOwogCiAJCW1lbWNweShza2JfcHV0KG5za2IsIDMpLCBidWYsIDMpOwotCQltZW1jcHkoc2tiX3B1dChuc2tiLCBzaXplKSwgc2tiLT5kYXRhICsgc2VudCwgc2l6ZSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgc2VudCwgc2tiX3B1dChuc2tiLCBzaXplKSwgc2l6ZSk7CiAKIAkJc2VudCAgKz0gc2l6ZTsKIAkJY291bnQgLT0gc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCmluZGV4IGFjZmI2YTQuLjg1MWRlNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtNDYxLDIwICs0NjEsMjAgQEAKIAkJCQlzd2l0Y2ggKGluZm8tPnJ4X3N0YXRlKSB7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9FVkVOVF9IRUFERVI6Ci0JCQkJCWVoID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopKGluZm8tPnJ4X3NrYi0+ZGF0YSk7CisJCQkJCWVoID0gaGNpX2V2ZW50X2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IGVoLT5wbGVuOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgUkVDVl9XQUlUX0FDTF9IRUFERVI6Ci0JCQkJCWFoID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQlhaCA9IGhjaV9hY2xfaGRyKGluZm8tPnJ4X3NrYik7CiAJCQkJCWRsZW4gPSBfX2xlMTZfdG9fY3B1KGFoLT5kbGVuKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBkbGVuOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgUkVDVl9XQUlUX1NDT19IRUFERVI6Ci0JCQkJCXNoID0gKHN0cnVjdCBoY2lfc2NvX2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQlzaCA9IGhjaV9zY29faGRyKGluZm8tPnJ4X3NrYik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gc2gtPmRsZW47CiAJCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnBhMTB4LmMgYi9kcml2ZXJzL2JsdWV0b290aC9icGExMHguYwppbmRleCA5ZmNhNjUxLi5lOGViZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9icGExMHguYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9icGExMHguYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJCWNyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikgdXJiLT5zZXR1cF9wYWNrZXQ7CiAJCWNyLT53TGVuZ3RoID0gX19jcHVfdG9fbGUxNihza2ItPmxlbik7CiAKLQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBza2ItPmxlbik7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuOwogCiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAkJc2tiID0gc2tiX2RlcXVldWUoJmRhdGEtPnR4X3F1ZXVlKTsKIAogCWlmIChza2IpIHsKLQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBza2ItPmxlbik7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuOwogCiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggMThiMGYzOS4uMzk1MTYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtMzAzLDIwICszMDMsMjAgQEAKIAkJCQlzd2l0Y2ggKGluZm8tPnJ4X3N0YXRlKSB7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9FVkVOVF9IRUFERVI6Ci0JCQkJCWVoID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopKGluZm8tPnJ4X3NrYi0+ZGF0YSk7CisJCQkJCWVoID0gaGNpX2V2ZW50X2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IGVoLT5wbGVuOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgUkVDVl9XQUlUX0FDTF9IRUFERVI6Ci0JCQkJCWFoID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQlhaCA9IGhjaV9hY2xfaGRyKGluZm8tPnJ4X3NrYik7CiAJCQkJCWRsZW4gPSBfX2xlMTZfdG9fY3B1KGFoLT5kbGVuKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBkbGVuOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgUkVDVl9XQUlUX1NDT19IRUFERVI6Ci0JCQkJCXNoID0gKHN0cnVjdCBoY2lfc2NvX2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQlzaCA9IGhjaV9zY29faGRyKGluZm8tPnJ4X3NrYik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gc2gtPmRsZW47CiAJCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwppbmRleCBjMWJjZTc1Li5kN2QyZWEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKQEAgLTI1MCwyMCArMjUwLDIwIEBACiAJCQkJc3dpdGNoIChpbmZvLT5yeF9zdGF0ZSkgewogCiAJCQkJY2FzZSBSRUNWX1dBSVRfRVZFTlRfSEVBREVSOgotCQkJCQllaCA9IChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQllaCA9IGhjaV9ldmVudF9oZHIoaW5mby0+cnhfc2tiKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBlaC0+cGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9BQ0xfSEVBREVSOgotCQkJCQlhaCA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJYWggPSBoY2lfYWNsX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlkbGVuID0gX19sZTE2X3RvX2NwdShhaC0+ZGxlbik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gZGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9TQ09fSEVBREVSOgotCQkJCQlzaCA9IChzdHJ1Y3QgaGNpX3Njb19oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJc2ggPSBoY2lfc2NvX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IHNoLT5kbGVuOwogCQkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwppbmRleCA0NTlhYTk3Li43ZjljNTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlza2JfcmVzZXJ2ZShzLCBOU0hMKTsKLQltZW1jcHkoc2tiX3B1dChzLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHMsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOwogCWlmIChza2ItPmxlbiAmIDB4MDAwMSkKIAkJKnNrYl9wdXQocywgMSkgPSAwOwkvKiBQQUQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYwppbmRleCAzNGYwYWZjLi5iZmJhZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCWNhc2UgSDRfVzRfRVZFTlRfSERSOgotCQkJCWVoID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopIGg0LT5yeF9za2ItPmRhdGE7CisJCQkJZWggPSBoY2lfZXZlbnRfaGRyKGg0LT5yeF9za2IpOwogCiAJCQkJQlRfREJHKCJFdmVudCBoZWFkZXI6IGV2dCAweCUyLjJ4IHBsZW4gJWQiLCBlaC0+ZXZ0LCBlaC0+cGxlbik7CiAKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQljYXNlIEg0X1c0X0FDTF9IRFI6Ci0JCQkJYWggPSAoc3RydWN0IGhjaV9hY2xfaGRyICopIGg0LT5yeF9za2ItPmRhdGE7CisJCQkJYWggPSBoY2lfYWNsX2hkcihoNC0+cnhfc2tiKTsKIAkJCQlkbGVuID0gX19sZTE2X3RvX2NwdShhaC0+ZGxlbik7CiAKIAkJCQlCVF9EQkcoIkFDTCBoZWFkZXI6IGRsZW4gJWQiLCBkbGVuKTsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQljYXNlIEg0X1c0X1NDT19IRFI6Ci0JCQkJc2ggPSAoc3RydWN0IGhjaV9zY29faGRyICopIGg0LT5yeF9za2ItPmRhdGE7CisJCQkJc2ggPSBoY2lfc2NvX2hkcihoNC0+cnhfc2tiKTsKIAogCQkJCUJUX0RCRygiU0NPIGhlYWRlcjogZGxlbiAlZCIsIHNoLT5kbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCmluZGV4IDhkMDI1ZTkuLjE1N2IxZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTQxNjksNyArNDE2OSw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCiAJLyogY29weSBkYXRhIHRvIGRldmljZSBidWZmZXJzICovCi0JbWVtY3B5KGluZm8tPnR4X2J1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGluZm8tPnR4X2J1Ziwgc2tiLT5sZW4pOwogCWluZm8tPnR4X2dldCA9IDA7CiAJaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfY291bnQgPSBza2ItPmxlbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IGI5ZGM3YWEuLjQ2YzFiOTc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtODgxLDE1ICs4ODEsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgaW5pdF9zdGRfZGF0YShzdHJ1Y3QgZW50cm9weV9zdG9yZSAqcikKIHsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKKwlrdGltZV90IG5vdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKIAlyLT5lbnRyb3B5X2NvdW50ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5sb2NrLCBmbGFncyk7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmdHYsIHNpemVvZih0dikvNCk7CisJbm93ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmbm93LCBzaXplb2Yobm93KS80KTsKIAlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKil1dHNuYW1lKCksCiAJCQkgIHNpemVvZigqKHV0c25hbWUoKSkpLzQpOwogfQpAQCAtOTExLDE0ICs5MTEsMTIgQEAKIAkJcmV0dXJuOwogCiAJLyoKLQkgKiBJZiBrbWFsbG9jIHJldHVybnMgbnVsbCwgd2UganVzdCB3b24ndCB1c2UgdGhhdCBlbnRyb3B5CisJICogSWYga3phbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQogCSAqIHNvdXJjZS4KIAkgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlKSB7Ci0JCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkKIAkJaXJxX3RpbWVyX3N0YXRlW2lycV0gPSBzdGF0ZTsKLQl9CiB9CiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKQEAgLTkyNywxNCArOTI1LDEyIEBACiAJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlOwogCiAJLyoKLQkgKiBJZiBrbWFsbG9jIHJldHVybnMgbnVsbCwgd2UganVzdCB3b24ndCB1c2UgdGhhdCBlbnRyb3B5CisJICogSWYga3phbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQogCSAqIHNvdXJjZS4KIAkgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlKSB7Ci0JCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkKIAkJZGlzay0+cmFuZG9tID0gc3RhdGU7Ci0JfQogfQogI2VuZGlmCiAKQEAgLTE0NjksNyArMTQ2NSw2IEBACiBfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiAqc2FkZHIsIF9fYmUzMiAqZGFkZHIsCiAJCQkJICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CiAJX191MzIgc2VxOwogCV9fdTMyIGhhc2hbMTJdOwogCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CkBAIC0xNDg1LDggKzE0ODAsNyBAQAogCXNlcSA9IHR3b3RoaXJkc01ENFRyYW5zZm9ybSgoY29uc3QgX191MzIgKilkYWRkciwgaGFzaCkgJiBIQVNIX01BU0s7CiAJc2VxICs9IGtleXB0ci0+Y291bnQ7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlzZXEgKz0gdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDA7CisJc2VxICs9IGt0aW1lX2dldF9yZWFsKCkudHY2NDsKIAogCXJldHVybiBzZXE7CiB9CkBAIC0xNTIxLDcgKzE1MTUsNiBAQAogX191MzIgc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewotCXN0cnVjdCB0aW1ldmFsIHR2OwogCV9fdTMyIHNlcTsKIAlfX3UzMiBoYXNoWzRdOwogCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CkBAIC0xNTQzLDEyICsxNTM2LDExIEBACiAJICoJQXMgY2xvc2UgYXMgcG9zc2libGUgdG8gUkZDIDc5Mywgd2hpY2gKIAkgKglzdWdnZXN0cyB1c2luZyBhIDI1MCBrSHogY2xvY2suCiAJICoJRnVydGhlciByZWFkaW5nIHNob3dzIHRoaXMgYXNzdW1lcyAyIE1iL3MgbmV0d29ya3MuCi0JICoJRm9yIDEwIE1iL3MgRXRoZXJuZXQsIGEgMSBNSHogY2xvY2sgaXMgYXBwcm9wcmlhdGUuCisJICoJRm9yIDEwIEdiL3MgRXRoZXJuZXQsIGEgMSBHSHogY2xvY2sgaXMgYXBwcm9wcmlhdGUuCiAJICoJVGhhdCdzIGZ1bm55LCBMaW51eCBoYXMgb25lIGJ1aWx0IGluISAgVXNlIGl0IQogCSAqCShOZXR3b3JrcyBhcmUgZmFzdGVyIG5vdyAtIHNob3VsZCB0aGlzIGJlIGluY3JlYXNlZD8pCiAJICovCi0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0Jc2VxICs9IHR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOworCXNlcSArPSBrdGltZV9nZXRfcmVhbCgpLnR2NjQ7CiAjaWYgMAogCXByaW50aygiaW5pdF9zZXEoJWx4LCAlbHgsICVkLCAlZCkgPSAlZFxuIiwKIAkgICAgICAgc2FkZHIsIGRhZGRyLCBzcG9ydCwgZHBvcnQsIHNlcSk7CkBAIC0xNTU2LDggKzE1NDgsNiBAQAogCXJldHVybiBzZXE7CiB9CiAKLUVYUE9SVF9TWU1CT0woc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOwotCiAvKiBHZW5lcmF0ZSBzZWN1cmUgc3RhcnRpbmcgcG9pbnQgZm9yIGVwaGVtZXJhbCBJUFY0IHRyYW5zcG9ydCBwb3J0IHNlYXJjaCAqLwogdTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpCiB7CkBAIC0xNTk4LDcgKzE1ODgsNiBAQAogdTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQlfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKIAl1NjQgc2VxOwogCV9fdTMyIGhhc2hbNF07CiAJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKQEAgLTE2MTEsOCArMTYwMCw3IEBACiAJc2VxID0gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KTsKIAlzZXEgfD0gKCh1NjQpa2V5cHRyLT5jb3VudCkgPDwgKDMyIC0gSEFTSF9CSVRTKTsKIAotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXNlcSArPSB0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMDsKKwlzZXEgKz0ga3RpbWVfZ2V0X3JlYWwoKS50djY0OwogCXNlcSAmPSAoMXVsbCA8PCA0OCkgLSAxOwogI2lmIDAKIAlwcmludGsoImRjY3AgaW5pdF9zZXEoJWx4LCAlbHgsICVkLCAlZCkgPSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggYTkwNWY3OC4uYTdiOWU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCXNrYiA9IHNrYl9nZXQoX19za2IpOwogCiAJaWYgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJCW5saCA9IG5sbXNnX2hkcihza2IpOwogCiAJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZihzdHJ1Y3QgY25fbXNnKSB8fAogCQkgICAgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbiB8fApAQCAtNDQ4LDcgKzQ0OCw3IEBACiAKIAlkZXYtPm5scyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0NPTk5FQ1RPUiwKIAkJCQkJIENOX05FVExJTktfVVNFUlMgKyAweGYsCi0JCQkJCSBkZXYtPmlucHV0LCBUSElTX01PRFVMRSk7CisJCQkJCSBkZXYtPmlucHV0LCBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKCFkZXYtPm5scykKIAkJcmV0dXJuIC1FSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKaW5kZXggMDNlNDRiMy4uYTM2NDAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKQEAgLTgzNCw3ICs4MzQsNyBAQAogCXN0cnVjdCBldGgxMzk0aGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsIChza2IsIEVUSDEzOTRfSExFTik7CiAJZXRoID0gZXRoMTM5NF9oZHIoc2tiKTsKIApAQCAtMTY2OCw3ICsxNjY4LDcgQEAKIAlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmJyb2FkY2FzdCwgRVRIMTM5NF9BTEVOKSA9PSAwIHx8CiAJICAgIHByb3RvID09IGh0b25zKEVUSF9QX0FSUCkgfHwKIAkgICAgKHByb3RvID09IGh0b25zKEVUSF9QX0lQKSAmJgotCSAgICAgSU5fTVVMVElDQVNUKG50b2hsKHNrYi0+bmguaXBoLT5kYWRkcikpKSkgeworCSAgICAgSU5fTVVMVElDQVNUKG50b2hsKGlwX2hkcihza2IpLT5kYWRkcikpKSkgewogCQl0eF90eXBlID0gRVRIMTM5NF9HQVNQOwogCQlkZXN0X25vZGUgPSBMT0NBTF9CVVMgfCBBTExfTk9ERVM7CiAJCW1heF9wYXlsb2FkID0gcHJpdi0+YmNfbWF4cGF5bG9hZCAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmggYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaAppbmRleCBjNDVjYmZmLi4xZTgzNTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaApAQCAtOTAsNyArOTAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBldGgxMzk0aGRyICpldGgxMzk0X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGV0aDEzOTRoZHIgKilza2ItPm1hYy5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwppbmRleCA1OTI0M2Q5Li41OGJjMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwpAQCAtNDM5LDcgKzQzOSw4IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHNrYiBmb3IgcmV1c2Ugc2luY2Ugd2UncmUgZHJvcHBpbmcgdGhpcyBwa3QgKi8KLQllbGVtLT5za2ItPnRhaWwgPSBlbGVtLT5za2ItPmRhdGEgPSBlbGVtLT5za2ItPmhlYWQ7CisJZWxlbS0+c2tiLT5kYXRhID0gZWxlbS0+c2tiLT5oZWFkOworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoZWxlbS0+c2tiKTsKIAogCS8qIFplcm8gb3V0IHRoZSByeHAgaGRyIGluIHRoZSBza19idWZmICovCiAJbWVtc2V0KGVsZW0tPnNrYi0+ZGF0YSwgMCwgc2l6ZW9mKCpyeHBfaGRyKSk7CkBAIC01MjEsOSArNTIyLDggQEAKIAkJICogInNpemVvZihzdHJ1Y3QgYzJfcnhwX2hkcikiLgogCQkgKi8KIAkJc2tiLT5kYXRhICs9IHNpemVvZigqcnhwX2hkcik7Ci0JCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGJ1ZmxlbjsKKwkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBidWZsZW4pOwogCQlza2ItPmxlbiA9IGJ1ZmxlbjsKLQkJc2tiLT5kZXYgPSBuZXRkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAKIAkJbmV0aWZfcngoc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCmluZGV4IDJkMmRlOWIuLjNiNGIwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYwpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJQlVHX09OKHNrYl9jbG9uZWQoc2tiKSk7CiAKIAltcGFsZW4gPSBzaXplb2YoKm1wYSkgKyBlcC0+cGxlbjsKLQlpZiAoc2tiLT5kYXRhICsgbXBhbGVuICsgc2l6ZW9mKCpyZXEpID4gc2tiLT5lbmQpIHsKKwlpZiAoc2tiLT5kYXRhICsgbXBhbGVuICsgc2l6ZW9mKCpyZXEpID4gc2tiX2VuZF9wb2ludGVyKHNrYikpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXNrYj1hbGxvY19za2IobXBhbGVuICsgc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFza2IpIHsKQEAgLTUwNyw3ICs1MDcsNyBAQAogCSAqLwogCXNrYl9nZXQoc2tiKTsKIAlzZXRfYXJwX2ZhaWx1cmVfaGFuZGxlcihza2IsIGFycF9mYWlsdXJlX2Rpc2NhcmQpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlsZW4gPSBza2ItPmxlbjsKIAlyZXEgPSAoc3RydWN0IHR4X2RhdGFfd3IgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnJlcSkpOwogCXJlcS0+d3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX09GTERfVFhfREFUQSkpOwpAQCAtNTU5LDcgKzU1OSw3IEBACiAJc2tiX2dldChza2IpOwogCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfREFUQTsKIAlzZXRfYXJwX2ZhaWx1cmVfaGFuZGxlcihza2IsIGFycF9mYWlsdXJlX2Rpc2NhcmQpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlyZXEgPSAoc3RydWN0IHR4X2RhdGFfd3IgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnJlcSkpOwogCXJlcS0+d3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX09GTERfVFhfREFUQSkpOwogCXJlcS0+d3JfbG8gPSBodG9ubChWX1dSX1RJRChlcC0+aHd0aWQpKTsKQEAgLTYxMCw3ICs2MTAsNyBAQAogCSAqLwogCXNrYl9nZXQoc2tiKTsKIAlzZXRfYXJwX2ZhaWx1cmVfaGFuZGxlcihza2IsIGFycF9mYWlsdXJlX2Rpc2NhcmQpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlsZW4gPSBza2ItPmxlbjsKIAlyZXEgPSAoc3RydWN0IHR4X2RhdGFfd3IgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnJlcSkpOwogCXJlcS0+d3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX09GTERfVFhfREFUQSkpOwpAQCAtODIxLDcgKzgyMSw4IEBACiAJLyoKIAkgKiBjb3B5IHRoZSBuZXcgZGF0YSBpbnRvIG91ciBhY2N1bXVsYXRpb24gYnVmZmVyLgogCSAqLwotCW1lbWNweSgmKGVwLT5tcGFfcGt0W2VwLT5tcGFfcGt0X2xlbl0pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJihlcC0+bXBhX3BrdFtlcC0+bXBhX3BrdF9sZW5dKSwKKwkJCQkgIHNrYi0+bGVuKTsKIAllcC0+bXBhX3BrdF9sZW4gKz0gc2tiLT5sZW47CiAKIAkvKgpAQCAtOTQwLDcgKzk0MSw4IEBACiAJLyoKIAkgKiBDb3B5IHRoZSBuZXcgZGF0YSBpbnRvIG91ciBhY2N1bXVsYXRpb24gYnVmZmVyLgogCSAqLwotCW1lbWNweSgmKGVwLT5tcGFfcGt0W2VwLT5tcGFfcGt0X2xlbl0pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJihlcC0+bXBhX3BrdFtlcC0+bXBhX3BrdF9sZW5dKSwKKwkJCQkgIHNrYi0+bGVuKTsKIAllcC0+bXBhX3BrdF9sZW4gKz0gc2tiLT5sZW47CiAKIAkvKgpAQCAtMTYxOSw3ICsxNjIxLDggQEAKIAlQREJHKCIlcyBlcCAlcFxuIiwgX19GVU5DVElPTl9fLCBlcCk7CiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGNwbF9yZG1hX3Rlcm1pbmF0ZSkpOwogCVBEQkcoIiVzIHNhdmluZyAlZCBieXRlcyBvZiB0ZXJtIG1zZ1xuIiwgX19GVU5DVElPTl9fLCBza2ItPmxlbik7Ci0JbWVtY3B5KGVwLT5jb20ucXAtPmF0dHIudGVybWluYXRlX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGVwLT5jb20ucXAtPmF0dHIudGVybWluYXRlX2J1ZmZlciwKKwkJCQkgIHNrYi0+bGVuKTsKIAllcC0+Y29tLnFwLT5hdHRyLnRlcm1pbmF0ZV9tc2dfbGVuID0gc2tiLT5sZW47CiAJZXAtPmNvbS5xcC0+YXR0ci5pc190ZXJtaW5hdGVfbG9jYWwgPSAwOwogCXJldHVybiBDUExfUkVUX0JVRl9ET05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IDJiMjQyYTQuLmM3MjJlNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTQwOCw3ICs0MDgsNyBAQAogCXNrYl9wdXRfZnJhZ3Moc2tiLCBJUE9JQl9DTV9IRUFEX1NJWkUsIHdjLT5ieXRlX2xlbiwgbmV3c2tiKTsKIAogCXNrYi0+cHJvdG9jb2wgPSAoKHN0cnVjdCBpcG9pYl9oZWFkZXIgKikgc2tiLT5kYXRhKS0+cHJvdG87Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBJUE9JQl9FTkNBUF9MRU4pOwogCiAJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCBiYTBlZTVjLi45M2Y3NDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpZiAod2MtPnNsaWQgIT0gcHJpdi0+bG9jYWxfbGlkIHx8CiAJICAgIHdjLT5zcmNfcXAgIT0gcHJpdi0+cXAtPnFwX251bSkgewogCQlza2ItPnByb3RvY29sID0gKChzdHJ1Y3QgaXBvaWJfaGVhZGVyICopIHNrYi0+ZGF0YSktPnByb3RvOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYl9wdWxsKHNrYiwgSVBPSUJfRU5DQVBfTEVOKTsKIAogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvbW9kdWxlLmMgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYwppbmRleCBlM2U1YzEzLi5lZTJiMGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYworKysgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlza2JfcmVzZXJ2ZSh4bWl0X3NrYiwgMTkpOwotCQltZW1jcHkoc2tiX3B1dCh4bWl0X3NrYiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dCh4bWl0X3NrYiwgbGVuKSwgbGVuKTsKIAl9IGVsc2UgewogCQl4bWl0X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXhtaXRfc2tiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYwppbmRleCAyYmFlZjM0Li5jOGUxYzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKQEAgLTY1Miw3ICs2NTIsNyBAQAogCSAqIHRyYW5zbWl0IGRhdGEKIAkgKi8KIAljb3VudCA9IG1pbihiY3MtPnR4X3NrYi0+bGVuLCAodW5zaWduZWQpIHVjcy0+YnVsa19vdXRfc2l6ZSk7Ci0JbWVtY3B5KHVjcy0+YnVsa19vdXRfYnVmZmVyLCBiY3MtPnR4X3NrYi0+ZGF0YSwgY291bnQpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoYmNzLT50eF9za2IsIHVjcy0+YnVsa19vdXRfYnVmZmVyLCBjb3VudCk7CiAJc2tiX3B1bGwoYmNzLT50eF9za2IsIGNvdW50KTsKIAlhdG9taWNfc2V0KCZ1Y3MtPmJ1c3ksIDEpOwogCWdpZ19kYmcoREVCVUdfT1VUUFVULCAid3JpdGVfbW9kZW06IHNlbmQgJWQgYnl0ZXMiLCBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMKaW5kZXggMWUyZDM4ZS4uNDI4ODcyYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYjFkbWEuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMKQEAgLTQwNCw3ICs0MDQsOCBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAidHg6IHB1dCAweCV4IGxlbj0lZFxuIiwgCiAJCSAgICAgICBza2ItPmRhdGFbMl0sIHR4bGVuKTsKICNlbmRpZgotCQltZW1jcHkoZG1hLT5zZW5kYnVmLmRtYWJ1Ziwgc2tiLT5kYXRhKzIsIHNrYi0+bGVuLTIpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDIsIGRtYS0+c2VuZGJ1Zi5kbWFidWYsCisJCQkJCQkgc2tiLT5sZW4gLSAyKTsKIAl9CiAJdHhsZW4gPSAodHhsZW4gKyAzKSAmIH4zOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMKaW5kZXggNmY1ZWZhOGQuLmQ1OGY5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYzQuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMKQEAgLTQ1Nyw3ICs0NTcsOCBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IHB1dCAweCV4IGxlbj0lZFxuIiwKIAkJCQljYXJkLT5uYW1lLCBza2ItPmRhdGFbMl0sIHR4bGVuKTsKICNlbmRpZgotCQltZW1jcHkoZG1hLT5zZW5kYnVmLmRtYWJ1Ziwgc2tiLT5kYXRhKzIsIHNrYi0+bGVuLTIpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDIsIGRtYS0+c2VuZGJ1Zi5kbWFidWYsCisJCQkJCQkgc2tiLT5sZW4gLSAyKTsKIAl9CiAJdHhsZW4gPSAodHhsZW4gKyAzKSAmIH4zOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX3Nlci5jCmluZGV4IGFlMzc3ZTguLjE2NDJkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX3Nlci5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX3Nlci5jCkBAIC0yNTQsMTQgKzI1NCwxNiBAQAogCWNvdW50ID0gbGVuOwogCWlmIChjb3VudCA+IE1BWF9NT0RFTV9CVUYgLSBmcCkgewogCQljb3VudCA9IE1BWF9NT0RFTV9CVUYgLSBmcDsKLQkJbWVtY3B5KGNzLT5ody5lbHNhLnRyYW5zYnVmICsgZnAsIGJjcy0+dHhfc2tiLT5kYXRhLCBjb3VudCk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoYmNzLT50eF9za2IsCisJCQkJCSAgY3MtPmh3LmVsc2EudHJhbnNidWYgKyBmcCwgY291bnQpOwogCQlza2JfcHVsbChiY3MtPnR4X3NrYiwgY291bnQpOwogCQljcy0+aHcuZWxzYS50cmFuc2NudCArPSBjb3VudDsKIAkJcmV0ID0gY291bnQ7CiAJCWNvdW50ID0gbGVuIC0gY291bnQ7CiAJCWZwID0gMDsKIAl9Ci0JbWVtY3B5KChjcy0+aHcuZWxzYS50cmFuc2J1ZiArIGZwKSwgYmNzLT50eF9za2ItPmRhdGEsIGNvdW50KTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGJjcy0+dHhfc2tiLAorCQkJCSAgY3MtPmh3LmVsc2EudHJhbnNidWYgKyBmcCwgY291bnQpOwogCXNrYl9wdWxsKGJjcy0+dHhfc2tiLCBjb3VudCk7CiAJY3MtPmh3LmVsc2EudHJhbnNjbnQgKz0gY291bnQ7CiAJcmV0ICs9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCmluZGV4IGNkM2I1YWQuLjM0NDZmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKQEAgLTEyOTMsNyArMTI5Myw4IEBACiAJCW9za2IgPSBza2I7CiAJCXNrYiA9IGFsbG9jX3NrYihvc2tiLT5sZW4gKyBpLCBHRlBfQVRPTUlDKTsKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLCBpKSwgaGVhZGVyLCBpKTsKLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBvc2tiLT5sZW4pLCBvc2tiLT5kYXRhLCBvc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKG9za2IsCisJCQkJCSAgc2tiX3B1dChza2IsIG9za2ItPmxlbiksIG9za2ItPmxlbik7CiAJCWRldl9rZnJlZV9za2Iob3NrYik7CiAJfQogCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgSU5ESUNBVElPTiwgc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYwppbmRleCBiMmFlNGVjLi5mODU0NTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5Y2FwaS5jCkBAIC0zOTgsOCArMzk4LDkgQEAKIAkJCV9sZW4gPSBDQVBJTVNHX0xFTihza2ItPmRhdGEpOwogCQkJaWYgKF9sZW4gPiAyMikgewogCQkJCV9sZW4yID0gX2xlbiAtIDIyOwotCQkJCW1lbWNweShtc2doZWFkLCBza2ItPmRhdGEsIDIyKTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhICsgX2xlbjIsIG1zZ2hlYWQsIDIyKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbXNnaGVhZCwgMjIpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIF9sZW4yLAorCQkJCQkJCSAgICAgICBtc2doZWFkLCAyMik7CiAJCQkJc2tiX3B1bGwoc2tiLCBfbGVuMik7CiAJCQkJQ0FQSU1TR19TRVRMRU4oc2tiLT5kYXRhLCAyMik7CiAJCQkJcmV0dmFsID0gY2FwaWxpYl9kYXRhX2IzX3JlcSgmY2luZm8tPm5jY2lfaGVhZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYwppbmRleCA1NTdkOTZjLi5jZmE4ZmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCkBAIC0yMTQsOCArMjE0LDYgQEAKIAkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwogCX0KLQlza2ItPmRldiA9ICZscC0+bmV0ZGV2OwotCiAJLyogY29weSB0aGUgZGF0YSAqLwogCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgYnVmLCBsZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fc2NoZWQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9zY2hlZC5jCmluZGV4IGI3YjVhYTQuLjgxZGI0YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9zY2hlZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9zY2hlZC5jCkBAIC0xMTMsNyArMTEzLDggQEAKIAkgICAgKHNrYiA9IGh5c2RuX3R4X25ldGdldChjYXJkKSkgIT0gTlVMTCkgCiAJewogCQlpZiAoc2tiLT5sZW4gPD0gbWF4bGVuKSB7Ci0JCQltZW1jcHkoYnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsJLyogY29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIgKi8KKwkJCS8qIGNvcHkgdGhlIHBhY2tldCB0byB0aGUgYnVmZmVyICovCisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgYnVmLCBza2ItPmxlbik7CiAJCQkqbGVuID0gc2tiLT5sZW47CiAJCQkqY2hhbiA9IENIQU5fTkRJU19EQVRBOwogCQkJY2FyZC0+bmV0X3R4X2J1c3kgPSAxOwkvKiB3ZSBhcmUgYnVzeSBzZW5kaW5nIG5ldHdvcmsgZGF0YSAqLwpAQCAtMTI2LDcgKzEyNyw3IEBACiAJICAgICgoc2tiID0gaHljYXBpX3R4X2NhcGlnZXQoY2FyZCkpICE9IE5VTEwpICkKIAl7CiAJCWlmIChza2ItPmxlbiA8PSBtYXhsZW4pIHsKLQkJCW1lbWNweShidWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGJ1Ziwgc2tiLT5sZW4pOwogCQkJKmxlbiA9IHNrYi0+bGVuOwogCQkJKmNoYW4gPSBDSEFOX0NBUEk7CiAJCQloeWNhcGlfdHhfY2FwaWFjayhjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwppbmRleCA5YzkyNmU0Li5jOTczMzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCkBAIC04MjksNyArODI5LDcgQEAKIAkJCQlkZmxhZyA9IDA7CiAJCQl9CiAJCQljb3VudF9wdXQgPSBjb3VudF9wdWxsOwotCQkJbWVtY3B5KGNwLCBza2ItPmRhdGEsIGNvdW50X3B1dCk7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgY3AsIGNvdW50X3B1dCk7CiAJCQljcCArPSBjb3VudF9wdXQ7CiAJCQlsZW4gLT0gY291bnRfcHV0OwogI2lmZGVmIENPTkZJR19JU0ROX0FVRElPCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggODM4YjM3My4uYWE4MzI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtODcyLDcgKzg3Miw4IEBACiBzdGF0aWMgdm9pZAogaXNkbl9uZXRfbG9nX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgaXNkbl9uZXRfbG9jYWwgKiBscCkKIHsKLQl1X2NoYXIgKnAgPSBza2ItPm5oLnJhdzsgLyogaG9wZWZ1bGx5LCB0aGlzIHdhcyBzZXQgY29ycmVjdGx5ICovCisJLyogaG9wZWZ1bGx5LCB0aGlzIHdhcyBzZXQgY29ycmVjdGx5ICovCisJY29uc3QgdV9jaGFyICpwID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJdW5zaWduZWQgc2hvcnQgcHJvdG8gPSBudG9ocyhza2ItPnByb3RvY29sKTsKIAlpbnQgZGF0YV9vZnM7CiAJaXBfcG9ydHMgKmlwcDsKQEAgLTg4MCw3ICs4ODEsNyBAQAogCiAJYWRkaW5mb1swXSA9ICdcMCc7CiAJLyogVGhpcyBjaGVjayBzdG9sZW4gZnJvbSAyLjEuNzIgZGV2X3F1ZXVlX3htaXRfbml0KCkgKi8KLQlpZiAoc2tiLT5uaC5yYXcgPCBza2ItPmRhdGEgfHwgc2tiLT5uaC5yYXcgPj0gc2tiLT50YWlsKSB7CisJaWYgKHAgPCBza2ItPmRhdGEgfHwgc2tiLT5uZXR3b3JrX2hlYWRlciA+PSBza2ItPnRhaWwpIHsKIAkJLyogZmFsbCBiYWNrIHRvIG9sZCBpc2RuX25ldF9sb2dfcGFja2V0IG1ldGhvZCgpICovCiAJCWNoYXIgKiBidWYgPSBza2ItPmRhdGE7CiAKQEAgLTExMjEsNyArMTEyMiw3IEBACiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAlpZiAobHAtPnBfZW5jYXAgPT0gSVNETl9ORVRfRU5DQVBfRVRIRVIpIHsKLQkJaW50IHB1bGxzaXplID0gKHVsb25nKXNrYi0+bmgucmF3IC0gKHVsb25nKXNrYi0+ZGF0YSAtIEVUSF9ITEVOOworCQljb25zdCBpbnQgcHVsbHNpemUgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKSAtIEVUSF9ITEVOOwogCQlpZiAocHVsbHNpemUgPiAwKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaXNkbl9uZXQ6IFB1bGwganVuayAlZFxuIiwgcHVsbHNpemUpOwogCQkJc2tiX3B1bGwoc2tiLCBwdWxsc2l6ZSk7CkBAIC0xMzY2LDcgKzEzNjcsNyBAQAogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAJZXRoID0gZXRoX2hkcihza2IpOwogCkBAIC0xNzg2LDcgKzE3ODcsNyBAQAogCX0KIAlza2ItPmRldiA9IG5kZXY7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogI2lmZGVmIElTRE5fREVCVUdfTkVUX0RVTVAKIAlpc2RuX2R1bXBwa3QoIlI6Iiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgNDApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKaW5kZXggMWIyZGY4MC4uMzg3MzkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYwpAQCAtMTEwMCw3ICsxMTAwLDggQEAKIAkJCQkJZ290byBkcm9wX3BhY2tldDsKIAkJCQl9CiAJCQkJc2tiX3B1dChza2IsIHNrYl9vbGQtPmxlbiArIDEyOCk7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2tiX29sZC0+ZGF0YSwgc2tiX29sZC0+bGVuKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYl9vbGQsIHNrYi0+ZGF0YSwKKwkJCQkJCQkgIHNrYl9vbGQtPmxlbik7CiAJCQkJaWYgKG5ldF9kZXYtPmxvY2FsLT5wcHBfc2xvdCA8IDApIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbmV0X2Rldi0+bG9jYWwtPnBwcF9zbG90KCVkKSBvdXQgb2YgcmFuZ2VcbiIsCiAJCQkJCQlfX0ZVTkNUSU9OX18sIG5ldF9kZXYtPmxvY2FsLT5wcHBfc2xvdCk7CkBAIC0xMTY3LDcgKzExNjgsNyBAQAogCQltbHAtPmh1cHRpbWVyID0gMDsKICNlbmRpZiAvKiBDT05GSUdfSVBQUF9GSUxURVIgKi8KIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAluZXRpZl9yeChza2IpOwogCS8qIG5ldF9kZXYtPmxvY2FsLT5zdGF0cy5yeF9wYWNrZXRzKys7IGRvbmUgaW4gaXNkbl9uZXQuYyAqLwogCXJldHVybjsKQEAgLTE5MDIsNyArMTkwMyw5IEBACiAJCXdoaWxlKCBmcm9tICE9IHRvICkgewogCQkJdW5zaWduZWQgaW50IGxlbiA9IGZyb20tPmxlbiAtIE1QX0hFQURFUl9MRU47CiAKLQkJCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCBmcm9tLT5kYXRhK01QX0hFQURFUl9MRU4sIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChmcm9tLCBNUF9IRUFERVJfTEVOLAorCQkJCQkJCSBza2JfcHV0KHNrYixsZW4pLAorCQkJCQkJCSBsZW4pOwogCQkJZnJhZyA9IGZyb20tPm5leHQ7CiAJCQlpc2RuX3BwcF9tcF9mcmVlX3NrYihtcCwgZnJvbSk7CiAJCQlmcm9tID0gZnJhZzsgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaXNkbmxvb3AvaXNkbmxvb3AuYyBiL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCmluZGV4IGUzYWRkMjcuLmU5M2FkNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCkBAIC00MTUsNyArNDE1LDggQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJbnNrYiA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4pOwogCQlpZiAobnNrYikgewotCQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJCQkgIHNrYl9wdXQobnNrYiwgbGVuKSwgbGVuKTsKIAkJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5icXVldWVbY2hhbm5lbF0sIG5za2IpOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmMgYi9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5jCmluZGV4IDQ3YzU5ZTkuLjdiNTVlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL3BjYml0L2NhcGkuYwpAQCAtNDI5LDggKzQyOSw5IEBACiAJCWlmICghKGluZm8tPmRhdGEuc2V0dXAuQ2FsbGluZ1BOID0ga21hbGxvYyhsZW4gLSBjb3VudCArIDEsIEdGUF9BVE9NSUMpKSkKIAkJCXJldHVybiAtMTsKICAgICAgICAKLQkJbWVtY3B5KGluZm8tPmRhdGEuc2V0dXAuQ2FsbGluZ1BOLCBza2ItPmRhdGEgKyBjb3VudCArIDEsIAotCQkgICAgICAgbGVuIC0gY291bnQpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGNvdW50ICsgMSwKKwkJCQkJCSBpbmZvLT5kYXRhLnNldHVwLkNhbGxpbmdQTiwKKwkJCQkJCSBsZW4gLSBjb3VudCk7CiAJCWluZm8tPmRhdGEuc2V0dXAuQ2FsbGluZ1BOW2xlbiAtIGNvdW50XSA9IDA7CiAKIAl9CkBAIC00NTcsOCArNDU4LDkgQEAKIAkJaWYgKCEoaW5mby0+ZGF0YS5zZXR1cC5DYWxsZWRQTiA9IGttYWxsb2MobGVuIC0gY291bnQgKyAxLCBHRlBfQVRPTUlDKSkpCiAJCQlyZXR1cm4gLTE7CiAgICAgICAgIAotCQltZW1jcHkoaW5mby0+ZGF0YS5zZXR1cC5DYWxsZWRQTiwgc2tiLT5kYXRhICsgY291bnQgKyAxLCAKLQkJICAgICAgIGxlbiAtIGNvdW50KTsgCisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgY291bnQgKyAxLAorCQkJCQkJIGluZm8tPmRhdGEuc2V0dXAuQ2FsbGVkUE4sCisJCQkJCQkgbGVuIC0gY291bnQpOwogCQlpbmZvLT5kYXRhLnNldHVwLkNhbGxlZFBOW2xlbiAtIGNvdW50XSA9IDA7CiAKIAl9CkBAIC01MzksNyArNTQxLDcgQEAKIAogI2lmZGVmIERFQlVHCiAJaWYgKGxlbiA+IDEgJiYgbGVuIDwgMzEpIHsKLQkJbWVtY3B5KHN0ciwgc2tiLT5kYXRhICsgMiwgbGVuIC0gMSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMiwgc3RyLCBsZW4gLSAxKTsKIAkJc3RyW2xlbl0gPSAwOwogCQlwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIFBhcnR5IE51bWJlcjogJXNcbiIsIHN0cik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDc2ZTljMzYuLjZhNWFiNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwogCi0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYixkZXYtPmhhcmRfaGVhZGVyX2xlbik7CiAJZXRoID0gZXRoX2hkcihza2IpOwogCkBAIC02MDAsNiArNjAwLDcgQEAKIAkJCS8qIENoZWNrIENSQzMyLCB3ZSd2ZSBnb3QgaXQgaW4gb3VyIHNrYiBhbHJlYWR5LiAqLwogCQkJdW5zaWduZWQgc2hvcnQgdWxlbiA9IGh0b25zKHByaXYtPnVsZV9zbmR1X2xlbik7CiAJCQl1bnNpZ25lZCBzaG9ydCB1dHlwZSA9IGh0b25zKHByaXYtPnVsZV9zbmR1X3R5cGUpOworCQkJY29uc3QgdTggKnRhaWw7CiAJCQlzdHJ1Y3Qga3ZlYyBpb3ZbM10gPSB7CiAJCQkJeyAmdWxlbiwgc2l6ZW9mIHVsZW4gfSwKIAkJCQl7ICZ1dHlwZSwgc2l6ZW9mIHV0eXBlIH0sCkBAIC02MTMsMTAgKzYxNCwxMSBAQAogCQkJfQogCiAJCQl1bGVfY3JjID0gaW92X2NyYzMyKHVsZV9jcmMsIGlvdiwgMyk7Ci0JCQlleHBlY3RlZF9jcmMgPSAqKCh1OCAqKXByaXYtPnVsZV9za2ItPnRhaWwgLSA0KSA8PCAyNCB8Ci0JCQkJICAgICAgICooKHU4ICopcHJpdi0+dWxlX3NrYi0+dGFpbCAtIDMpIDw8IDE2IHwKLQkJCQkgICAgICAgKigodTggKilwcml2LT51bGVfc2tiLT50YWlsIC0gMikgPDwgOCB8Ci0JCQkJICAgICAgICooKHU4ICopcHJpdi0+dWxlX3NrYi0+dGFpbCAtIDEpOworCQkJdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJpdi0+dWxlX3NrYik7CisJCQlleHBlY3RlZF9jcmMgPSAqKHRhaWwgLSA0KSA8PCAyNCB8CisJCQkJICAgICAgICoodGFpbCAtIDMpIDw8IDE2IHwKKwkJCQkgICAgICAgKih0YWlsIC0gMikgPDwgOCB8CisJCQkJICAgICAgICoodGFpbCAtIDEpOwogCQkJaWYgKHVsZV9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBDUkMzMiBjaGVjayBGQUlMRUQ6ICUwOHggLyAlMDh4LCBTTkRVIGxlbiAlZCB0eXBlICUjeCwgdHNfcmVtYWluICVkLCBuZXh0IDI6ICV4LlxuIiwKIAkJCQkgICAgICAgcHJpdi0+dHNfY291bnQsIHVsZV9jcmMsIGV4cGVjdGVkX2NyYywgcHJpdi0+dWxlX3NuZHVfbGVuLCBwcml2LT51bGVfc25kdV90eXBlLCB0c19yZW1haW4sIHRzX3JlbWFpbiA+IDIgPyAqKHVuc2lnbmVkIHNob3J0ICopZnJvbV93aGVyZSA6IDApOwpAQCAtNjk1LDcgKzY5Nyw5IEBACiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7Ci0JCQkJCQltZW1jcHkoZGVzdF9hZGRyLCAgcHJpdi0+dWxlX3NrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShwcml2LT51bGVfc2tiLAorCQkJCQkJCSAgICAgIGRlc3RfYWRkciwKKwkJCQkJCQkgICAgICBFVEhfQUxFTik7CiAJCQkJCQlza2JfcHVsbChwcml2LT51bGVfc2tiLCBFVEhfQUxFTik7CiAJCQkJCX0KIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwppbmRleCBiNjkxMjkyLi43ZGQzNGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKQEAgLTcxNCw2ICs3MTQsNyBAQAogCUxBTlNlbmRSZXF1ZXN0X3QgKnBTZW5kUmVxOwogCVNHRVRyYW5zYWN0aW9uMzJfdCAqcFRyYW5zOwogCVNHRVNpbXBsZTY0X3QgKnBTaW1wbGU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbWFjOwogCWRtYV9hZGRyX3QgZG1hOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGN0eDsKQEAgLTc1Myw3ICs3NTQsNyBAQAogCS8qIFNldCB0aGUgbWFjLnJhdyBwb2ludGVyLCBzaW5jZSB0aGlzIGFwcGFyZW50bHkgaXNuJ3QgZ2V0dGluZwogCSAqIGRvbmUgYmVmb3JlIHdlIGdldCB0aGUgc2tiLiBQdWxsIHRoZSBkYXRhIHBvaW50ZXIgcGFzdCB0aGUgbWFjIGRhdGEuCiAJICovCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCAxMik7CiAKICAgICAgICAgZG1hID0gcGNpX21hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLApAQCAtNzg0LDYgKzc4NSw3IEBACiAvLwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAogLy8JCQljdHgsIHNrYiwgc2tiLT5kYXRhKSk7CiAKKwltYWMgPSBza2JfbWFjX2hlYWRlcihza2IpOwogI2lmZGVmIFFMT0dJQ19OQUFfV09SS0FST1VORAogewogCXN0cnVjdCBOQUFfSG9zZWQgKm5oOwpAQCAtNzkzLDEyICs3OTUsMTIgQEAKIAkgICBkcm9wcy4gKi8KIAlyZWFkX2xvY2tfaXJxKCZiYWRfbmFhX2xvY2spOwogCWZvciAobmggPSBtcHRfYmFkX25hYTsgbmggIT0gTlVMTDsgbmg9bmgtPm5leHQpIHsKLQkJaWYgKChuaC0+aWVlZVswXSA9PSBza2ItPm1hYy5yYXdbMF0pICYmCi0JCSAgICAobmgtPmllZWVbMV0gPT0gc2tiLT5tYWMucmF3WzFdKSAmJgotCQkgICAgKG5oLT5pZWVlWzJdID09IHNrYi0+bWFjLnJhd1syXSkgJiYKLQkJICAgIChuaC0+aWVlZVszXSA9PSBza2ItPm1hYy5yYXdbM10pICYmCi0JCSAgICAobmgtPmllZWVbNF0gPT0gc2tiLT5tYWMucmF3WzRdKSAmJgotCQkgICAgKG5oLT5pZWVlWzVdID09IHNrYi0+bWFjLnJhd1s1XSkpIHsKKwkJaWYgKChuaC0+aWVlZVswXSA9PSBtYWNbMF0pICYmCisJCSAgICAobmgtPmllZWVbMV0gPT0gbWFjWzFdKSAmJgorCQkgICAgKG5oLT5pZWVlWzJdID09IG1hY1syXSkgJiYKKwkJICAgIChuaC0+aWVlZVszXSA9PSBtYWNbM10pICYmCisJCSAgICAobmgtPmllZWVbNF0gPT0gbWFjWzRdKSAmJgorCQkgICAgKG5oLT5pZWVlWzVdID09IG1hY1s1XSkpIHsKIAkJCWN1cl9uYWEgPSBuaC0+TkFBOwogCQkJZGxwcmludGsgKChLRVJOX0lORk8gIm1wdGxhbi9zZHVfc2VuZDogdXNpbmcgTkFBIHZhbHVlICIKIAkJCQkgICI9ICUwNHguXG4iLCBjdXJfbmFhKSk7CkBAIC04MTAsMTIgKzgxMiwxMiBAQAogI2VuZGlmCiAKIAlwVHJhbnMtPlRyYW5zYWN0aW9uRGV0YWlsc1swXSA9IGNwdV90b19sZTMyKChjdXJfbmFhICAgICAgICAgPDwgMTYpIHwKLQkJCQkJCSAgICAoc2tiLT5tYWMucmF3WzBdIDw8ICA4KSB8Ci0JCQkJCQkgICAgKHNrYi0+bWFjLnJhd1sxXSA8PCAgMCkpOwotCXBUcmFucy0+VHJhbnNhY3Rpb25EZXRhaWxzWzFdID0gY3B1X3RvX2xlMzIoKHNrYi0+bWFjLnJhd1syXSA8PCAyNCkgfAotCQkJCQkJICAgIChza2ItPm1hYy5yYXdbM10gPDwgMTYpIHwKLQkJCQkJCSAgICAoc2tiLT5tYWMucmF3WzRdIDw8ICA4KSB8Ci0JCQkJCQkgICAgKHNrYi0+bWFjLnJhd1s1XSA8PCAgMCkpOworCQkJCQkJICAgIChtYWNbMF0gPDwgIDgpIHwKKwkJCQkJCSAgICAobWFjWzFdIDw8ICAwKSk7CisJcFRyYW5zLT5UcmFuc2FjdGlvbkRldGFpbHNbMV0gPSBjcHVfdG9fbGUzMigobWFjWzJdIDw8IDI0KSB8CisJCQkJCQkgICAgKG1hY1szXSA8PCAxNikgfAorCQkJCQkJICAgIChtYWNbNF0gPDwgIDgpIHwKKwkJCQkJCSAgICAobWFjWzVdIDw8ICAwKSk7CiAKIAlwU2ltcGxlID0gKFNHRVNpbXBsZTY0X3QgKikgJnBUcmFucy0+VHJhbnNhY3Rpb25EZXRhaWxzWzJdOwogCkBAIC05MzAsNyArOTMyLDcgQEAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG1wdF9kZXYtPnBjaWRldiwgcHJpdi0+UmN2Q3RsW2N0eF0uZG1hLAogCQkJCQkgICAgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgb2xkX3NrYi0+ZGF0YSwgbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvbGRfc2tiLCBza2JfcHV0KHNrYiwgbGVuKSwgbGVuKTsKIAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXB0X2Rldi0+cGNpZGV2LCBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCiAJCQkJCSAgICAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CkBAIC0xMDkxLDcgKzEwOTMsNyBAQAogCQkJCQkJICAgIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKIAkJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sCiAJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCW1lbWNweShza2JfcHV0KHNrYiwgbCksIG9sZF9za2ItPmRhdGEsIGwpOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvbGRfc2tiLCBza2JfcHV0KHNrYiwgbCksIGwpOwogCiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXB0X2Rldi0+cGNpZGV2LAogCQkJCQkJICAgICAgIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKQEAgLTExMjAsNyArMTEyMiw3IEBACiAJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sCiAJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgb2xkX3NrYi0+ZGF0YSwgbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvbGRfc2tiLCBza2JfcHV0KHNrYiwgbGVuKSwgbGVuKTsKIAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXB0X2Rldi0+cGNpZGV2LAogCQkJCQkgICAgICAgcHJpdi0+UmN2Q3RsW2N0eF0uZG1hLApAQCAtMTU0OSw3ICsxNTUxLDcgQEAKIAlzdHJ1Y3QgbXB0X2xhbl9vaGRyICpmY2ggPSAoc3RydWN0IG1wdF9sYW5fb2hkciAqKXNrYi0+ZGF0YTsKIAlzdHJ1Y3QgZmNsbGMgKmZjbGxjOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IG1wdF9sYW5fb2hkcikpOwogCiAJaWYgKGZjaC0+ZHR5cGUgPT0gaHRvbnMoMHhmZmZmKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDEuYyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKaW5kZXggMDZlMzM3OC4uNGJlZTk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDEuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMS5jCkBAIC03MzUsNyArNzM1LDYgQEAKIAllbHNlCiAJewogICAgIAkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBGb3JjZSAxNiBieXRlIGFsaWdubWVudCAqLwotCQlza2ItPmRldiA9IGRldjsKIAkJLyoKIAkJICoJVGhlIHJlYWQgaW5jcmVtZW50cyB0aHJvdWdoIHRoZSBieXRlcy4gVGhlIGludGVycnVwdAogCQkgKgloYW5kbGVyIHdpbGwgZml4IHRoZSBwb2ludGVyIHdoZW4gaXQgcmV0dXJucyB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDUuYyBiL2RyaXZlcnMvbmV0LzNjNTA1LmMKaW5kZXggNzAyYmZiMi4uZTk4NWE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDUuYworKysgYi9kcml2ZXJzL25ldC8zYzUwNS5jCkBAIC02MTUsNyArNjE1LDYgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmYWRhcHRlci0+ZG1haW5nKSkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcnggYmxvY2tlZCwgRE1BIGluIHByb2dyZXNzLCBkaXIgJWRcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+Y3VycmVudF9kbWEuZGlyZWN0aW9uKTsKIAotCXNrYi0+ZGV2ID0gZGV2OwogCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9IDA7CiAJYWRhcHRlci0+Y3VycmVudF9kbWEubGVuZ3RoID0gcmxlbjsKIAlhZGFwdGVyLT5jdXJyZW50X2RtYS5za2IgPSBza2I7CkBAIC0xMDI2LDcgKzEwMjUsNyBAQAogCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKyBubGVuKSA+PSBNQVhfRE1BX0FERFJFU1MgfHwgbmxlbiAhPSBza2ItPmxlbikgewotCQltZW1jcHkoYWRhcHRlci0+ZG1hX2J1ZmZlciwgc2tiLT5kYXRhLCBubGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGFkYXB0ZXItPmRtYV9idWZmZXIsIG5sZW4pOwogCQltZW1zZXQoYWRhcHRlci0+ZG1hX2J1ZmZlcitza2ItPmxlbiwgMCwgbmxlbi1za2ItPmxlbik7CiAJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhhZGFwdGVyLT5kbWFfYnVmZmVyKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNy5jIGIvZHJpdmVycy9uZXQvM2M1MDcuYwppbmRleCA1NGUxZDVhLi5lZWQ0Mjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwNy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA3LmMKQEAgLTg3Myw3ICs4NzMsNiBAQAogCQkJfQogCiAJCQlza2JfcmVzZXJ2ZShza2IsMik7Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IscGt0X2xlbiksIGRhdGFfZnJhbWUgKyAxMCwgcGt0X2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwOS5jIGIvZHJpdmVycy9uZXQvM2M1MDkuYwppbmRleCBmNzkxYmYwLi5jNzUxMWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKQEAgLTEwOTEsNyArMTA5MSw2IEBACiAJCQkJcHJpbnRrKCJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkJCWlmIChza2IgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7ICAgICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlICovCiAKIAkJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MTUuYyBiL2RyaXZlcnMvbmV0LzNjNTE1LmMKaW5kZXggYzMwN2NlNi4uMjkwMTY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MTUuYworKysgYi9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0xMjkyLDcgKzEyOTIsNiBAQAogCQkJCXByaW50aygiUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCiAJCQkJICAgICBwa3RfbGVuLCByeF9zdGF0dXMpOwogCQkJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQlpbnNsKGlvYWRkciArIFJYX0ZJRk8sCkBAIC0xMzYzLDcgKzEzNjIsNiBAQAogCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkgICAgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDQpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuYyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKaW5kZXggMTdkNjFlYi4uZGExYTIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjMuYworKysgYi9kcml2ZXJzL25ldC8zYzUyMy5jCkBAIC05ODgsNyArOTg4LDYgQEAKIAkJCQlyYmQtPnN0YXR1cyA9IDA7CiAJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuICsgMik7CiAJCQkJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWdubWVudCAqLwogCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOwogCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKGNoYXIgKikgcC0+YmFzZSsodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIsdG90bGVuLDApOwpAQCAtMTE0Niw3ICsxMTQ1LDcgQEAKIAogCWlmIChsZW4gIT0gc2tiLT5sZW4pCiAJCW1lbXNldCgoY2hhciAqKSBwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgMCwgRVRIX1pMRU4pOwotCW1lbWNweSgoY2hhciAqKSBwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgKGNoYXIgKikgKHNrYi0+ZGF0YSksIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIHNrYi0+bGVuKTsKIAogI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQogI2lmZGVmIE5PX05PUENPTU1BTkRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyNy5jIGIvZHJpdmVycy9uZXQvM2M1MjcuYwppbmRleCA2Yzc0MzdlLi5jN2I1NzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUyNy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKQEAgLTExODksNyArMTE4OSw2IEBACiAJCQl9CiAKIAkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7Ci0JCQlza2ItPmRldj1kZXY7CiAJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogIAkJCWxwLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOwogIAkJCWxwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggYjQwNmVjZi4uODA5MjRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC0yNDE0LDcgKzI0MTQsNiBAQAogCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkJCWlmIChza2IgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCiAJCQkJaWYgKHZwLT5idXNfbWFzdGVyICYmCkBAIC0yNDkxLDcgKzI0OTAsNiBAQAogCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBqdXN0IGFjY2VwdCB3aXRob3V0CiAJCQkgICBjb3B5aW5nIHRvIGEgcHJvcGVybHkgc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0Lzc5OTAuYyBiL2RyaXZlcnMvbmV0Lzc5OTAuYwppbmRleCAxYjNkMTFlLi5kMzk2Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC83OTkwLmMKKysrIGIvZHJpdmVycy9uZXQvNzk5MC5jCkBAIC0zMzEsNyArMzMxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMik7ICAgICAgICAgICAvKiAxNiBieXRlIGFsaWduICovCiAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7ICAgICAgICAgICAgIC8qIG1ha2Ugcm9vbSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsCkBAIC01NjgsNyArNTY3LDcgQEAKIAogICAgIAlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikKICAgICAJCW1lbXNldCgoY2hhciAqKSZpYi0+dHhfYnVmW2VudHJ5XVswXSwgMCwgRVRIX1pMRU4pOwotICAgICAgICBtZW1jcHkgKChjaGFyICopJmliLT50eF9idWYgW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmliLT50eF9idWZbZW50cnldWzBdLCBza2JsZW4pOwogCiAgICAgICAgIC8qIE5vdywgZ2l2ZSB0aGUgcGFja2V0IHRvIHRoZSBsYW5jZSAqLwogICAgICAgICBpYi0+YnR4X3JpbmcgW2VudHJ5XS50bWQxX2JpdHMgPSAoTEVfVDFfUE9LfExFX1QxX09XTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCmluZGV4IDEyYzg0NTMuLmU4YzlmMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtNTczLDcgKzU3Myw2IEBACiAJCX0KIAogCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBSWF9PRkZTRVQpOwotCQluZXdfc2tiLT5kZXYgPSBkZXY7CiAKIAkJcGNpX3VubWFwX3NpbmdsZShjcC0+cGRldiwgbWFwcGluZywKIAkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtODA3LDcgKzgwNiw3IEBACiAJCWlmIChtc3MpCiAJCQlmbGFncyB8PSBMYXJnZVNlbmQgfCAoKG1zcyAmIE1TU01hc2spIDw8IE1TU1NoaWZ0KTsKIAkJZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IGlwX2hkcihza2IpOwogCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKIAkJCQlmbGFncyB8PSBJUENTIHwgVENQQ1M7CiAJCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCkBAIC04MjYsNyArODI1LDcgQEAKIAkJdTMyIGZpcnN0X2xlbiwgZmlyc3RfZW9yOwogCQlkbWFfYWRkcl90IGZpcnN0X21hcHBpbmc7CiAJCWludCBmcmFnLCBmaXJzdF9lbnRyeSA9IGVudHJ5OwotCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBpcF9oZHIoc2tiKTsKIAogCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KIAkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgpAQCAtMTA4Miw3ICsxMDgxLDYgQEAKIAkJaWYgKCFza2IpCiAJCQlnb3RvIGVycl9vdXQ7CiAKLQkJc2tiLT5kZXYgPSBjcC0+ZGV2OwogCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CiAKIAkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LCBza2ItPmRhdGEsIGNwLT5yeF9idWZfc3osCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5dG9vLmMgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKaW5kZXggOTkzMDRiMi4uYTg0NGIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOXRvby5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwpAQCAtMTkwNCwxMCArMTkwNCwxMCBAQAogCXUzMiBsZWZ0ID0gUlhfQlVGX0xFTiAtIG9mZnNldDsKIAogCWlmIChzaXplID4gbGVmdCkgewotCQltZW1jcHkoc2tiLT5kYXRhLCByaW5nICsgb2Zmc2V0LCBsZWZ0KTsKLQkJbWVtY3B5KHNrYi0+ZGF0YStsZWZ0LCByaW5nLCBzaXplIC0gbGVmdCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcmluZyArIG9mZnNldCwgbGVmdCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGxlZnQsIHJpbmcsIHNpemUgLSBsZWZ0KTsKIAl9IGVsc2UKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgcmluZyArIG9mZnNldCwgc2l6ZSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcmluZyArIG9mZnNldCwgc2l6ZSk7CiB9CiAjZW5kaWYKIApAQCAtMjAxMyw3ICsyMDEzLDYgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChwa3Rfc2l6ZSArIDIpOwogCQlpZiAobGlrZWx5KHNrYikpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGZpZWxkcy4gKi8KICNpZiBSWF9CVUZfSURYID09IDMKIAkJCXdyYXBfY29weShza2IsIHJ4X3JpbmcsIHJpbmdfb2Zmc2V0KzQsIHBrdF9zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCmluZGV4IDY0MGQ3Y2EyZS4uM2ZmMTE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC04MzAsNyArODMwLDYgQEAKIAkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJfQogCQkJZWxzZSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJaWYgKCFyeF9pbl9wbGFjZSkgewogCQkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBkYXRhIGZpZWxkcyAqLwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCAzM2FmODMzLi41ODUyNzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMjA2LDcgKzIwNiw3IEBACiBvYmotJChDT05GSUdfV0FOKSArPSB3YW4vCiBvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQvCiBvYmotJChDT05GSUdfTkVUX1BDTUNJQSkgKz0gcGNtY2lhLwotb2JqLSQoQ09ORklHX05FVF9SQURJTykgKz0gd2lyZWxlc3MvCitvYmoteSArPSB3aXJlbGVzcy8KIG9iai0kKENPTkZJR19ORVRfVFVMSVApICs9IHR1bGlwLwogb2JqLSQoQ09ORklHX0hBTVJBRElPKSArPSBoYW1yYWRpby8KIG9iai0kKENPTkZJR19JUkRBKSArPSBpcmRhLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYTIwNjUuYyBiL2RyaXZlcnMvbmV0L2EyMDY1LmMKaW5kZXggZDc2NTQ4ZS4uMTIyNmNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYTIwNjUuYworKysgYi9kcml2ZXJzL25ldC9hMjA2NS5jCkBAIC0zMjAsNyArMzIwLDYgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCXNrYl9wdXQgKHNrYiwgbGVuKTsJCS8qIG1ha2Ugcm9vbSAqLwogCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCkBAIC01OTksNyArNTk4LDcgQEAKIAlpYi0+YnR4X3JpbmcgW2VudHJ5XS5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CiAJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7CiAKLQltZW1jcHkgKChjaGFyICopJmliLT50eF9idWYgW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmaWItPnR4X2J1ZiBbZW50cnldWzBdLCBza2JsZW4pOwogCiAJLyogQ2xlYXIgdGhlIHNsYWNrIG9mIHRoZSBwYWNrZXQsIGRvIEkgbmVlZCB0aGlzPyAqLwogCWlmIChsZW4gIT0gc2tibGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmMgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwppbmRleCA3MTM4ZTBlLi43MTIyYjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWMuYworKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtMjAyNyw3ICsyMDI3LDYgQEAKIAkJICovCiAJCWNzdW0gPSByZXRkZXNjLT50Y3BfdWRwX2NzdW07CiAKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCmluZGV4IDk2MmM5NTQuLjY3NWZlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpAQCAtNzk4LDkgKzc5OCw3IEBACiAJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0sCiAJCQkJCSBscC0+cnhfYnVmZl9sZW4tMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X3NrYnVmZltyeF9pbmRleF0gPSBuZXdfc2tiOwotCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LAogCQkJCQkJCQkgICBuZXdfc2tiLT5kYXRhLAogCQkJCQkJCQkgICBscC0+cnhfYnVmZl9sZW4tMiwKQEAgLTkyNiw5ICs5MjQsNyBAQAogCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0sCiAJCQlscC0+cnhfYnVmZl9sZW4tMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwotCQlza2ItPmRldiA9IGRldjsKIAkJbHAtPnJ4X3NrYnVmZltyeF9pbmRleF0gPSBuZXdfc2tiOwotCQluZXdfc2tiLT5kZXYgPSBkZXY7CiAJCWxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKIAkJCW5ld19za2ItPmRhdGEsIGxwLT5yeF9idWZmX2xlbi0yLFBDSV9ETUFfRlJPTURFVklDRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCmluZGV4IGRiYTVlNTEuLmRhNmZmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwpAQCAtODUzLDkgKzg1Myw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgc2tiLT5tYWMucmF3ICAgID0gc2tiLT5kYXRhOyAgICAvKiBQb2ludCB0byBlbnRpcmUgcGFja2V0LiAqLworICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOyAgICAvKiBQb2ludCB0byBlbnRpcmUgcGFja2V0LiAqLwogICAgICAgICBza2JfcHVsbChza2IsMyk7Ci0gICAgICAgIHNrYi0+aC5yYXcgICAgICA9IHNrYi0+ZGF0YTsgICAgLyogUG9pbnQgdG8gZGF0YSAoU2tpcCBoZWFkZXIpLiAqLworICAgICAgICBza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOyAgICAvKiBQb2ludCB0byBkYXRhIChTa2lwIGhlYWRlcikuICovCiAKICAgICAgICAgLyogVXBkYXRlIHRoZSBjb3VudGVycy4gKi8KICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5jCmluZGV4IDJlYTQ0Y2UuLjZhNmNiZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYwpAQCAtNzcwLDEzICs3NzAsMTMgQEAKIAlza2ItPmRhdGFbMF0gPSBkbm9kZTsKIAlza2ItPmRhdGFbMV0gPSBzbm9kZTsKIAlza2ItPmRhdGFbMl0gPSBsbGFwdHlwZTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CS8qIHNhdmUgcG9pbnRlciB0byBsbGFwIGhlYWRlciAqLworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CS8qIHNhdmUgcG9pbnRlciB0byBsbGFwIGhlYWRlciAqLwogCXNrYl9wdWxsKHNrYiwzKTsKIAogCS8qIGNvcHkgZGRwKHMsZSloZHIgKyBjb250ZW50cyAqLwotCW1lbWNweShza2ItPmRhdGEsKHZvaWQqKWx0ZG1hYnVmLGxlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBsdGRtYWJ1ZiwgbGVuKTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCXN0YXRzLT5yeF9wYWNrZXRzKys7CiAJc3RhdHMtPnJ4X2J5dGVzKz1za2ItPmxlbjsKQEAgLTkxNywxMyArOTE3LDE0IEBACiAKIAlpbnQgaTsKIAlzdHJ1Y3QgbHRfc2VuZGxhcCBjYnVmOworCXVuc2lnbmVkIGNoYXIgKmhkcjsKIAogCWNidWYuY29tbWFuZCA9IExUX1NFTkRMQVA7CiAJY2J1Zi5kbm9kZSA9IHNrYi0+ZGF0YVswXTsKIAljYnVmLmxhcHR5cGUgPSBza2ItPmRhdGFbMl07CiAJc2tiX3B1bGwoc2tiLDMpOwkvKiBza2lwIHBhc3QgTExBUCBoZWFkZXIgKi8KIAljYnVmLmxlbmd0aCA9IHNrYi0+bGVuOwkvKiB0aGlzIGlzIGhvc3Qgb3JkZXIgKi8KLQlza2ItPmgucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYoZGVidWcgJiBERUJVR19VUFBFUikgewogCQlwcmludGsoImNvbW1hbmQgIik7CkBAIC05MzIsMTEgKzkzMywxMyBAQAogCQlwcmludGsoIlxuIik7CiAJfQogCi0JZG9fd3JpdGUoZGV2LCZjYnVmLHNpemVvZihjYnVmKSxza2ItPmgucmF3LHNrYi0+bGVuKTsKKwloZHIgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWRvX3dyaXRlKGRldiwgJmNidWYsIHNpemVvZihjYnVmKSwgaGRyLCBza2ItPmxlbik7CiAKIAlpZihkZWJ1ZyAmIERFQlVHX1VQUEVSKSB7CiAJCXByaW50aygic2VudCAlZCBkZHAgYnl0ZXNcbiIsc2tiLT5sZW4pOwotCQlmb3IoaT0wO2k8c2tiLT5sZW47aSsrKSBwcmludGsoIiUwMnggIixza2ItPmgucmF3W2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgaGRyW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yYXdtb2RlLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYwppbmRleCA2MzE4ODE0Li5lMGExOGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CiAKIAkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKaW5kZXggODMwMDRmZC4uNjgxZTIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpAQCAtNTE5LDkgKzUxOSwxMiBAQAogCQkgKiByZWFsIGhlYWRlciB3aGVuIHdlIGRvIHJlYnVpbGRfaGVhZGVyLgogCQkgKi8KIAkJKih1aW50MTZfdCAqKSBza2JfcHVzaChza2IsIDIpID0gdHlwZTsKLQkJaWYgKHNrYi0+bmgucmF3IC0gc2tiLT5tYWMucmF3ICE9IDIpCisJCS8qCisJCSAqIFhYWDogV2h5IG5vdCB1c2Ugc2tiLT5tYWNfbGVuPworCQkgKi8KKwkJaWYgKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIgIT0gMikKIAkJCUJVR01TRyhEX05PUk1BTCwgImFyY25ldF9oZWFkZXI6IFlpa2VzISAgZGlmZiAoJWQpIGlzIG5vdCAyIVxuIiwKLQkJCSAgICAgICAoaW50KShza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdykpOworCQkJICAgICAgIChpbnQpKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIpKTsKIAkJcmV0dXJuIC0yOwkvKiByZXR1cm4gZXJyb3IgLS0gY2FuJ3QgdHJhbnNtaXQgeWV0ISAqLwogCX0KIAllbHNlIHsKQEAgLTU1NCwxMSArNTU3LDEzIEBACiAJdW5zaWduZWQgc2hvcnQgdHlwZTsKIAl1aW50OF90IGRhZGRyPTA7CiAJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKLQotCWlmIChza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdyAhPSAyKSB7CisJLyoKKwkgKiBYWFg6IFdoeSBub3QgdXNlIHNrYi0+bWFjX2xlbj8KKwkgKi8KKwlpZiAoc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlciAhPSAyKSB7CiAJCUJVR01TRyhEX05PUk1BTCwKLQkJICAgICAicmVidWlsZF9oZWFkZXI6IHNob3VsZG4ndCBiZSBoZXJlISAoaGRyc2l6ZT0lZClcbiIsCi0JCSAgICAgKGludCkoc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXcpKTsKKwkJICAgICAgICJyZWJ1aWxkX2hlYWRlcjogc2hvdWxkbid0IGJlIGhlcmUhIChoZHJzaXplPSVkKVxuIiwKKwkJICAgICAgIChpbnQpKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIpKTsKIAkJcmV0dXJuIDA7CiAJfQogCXR5cGUgPSAqKHVpbnQxNl90ICopIHNrYl9wdWxsKHNrYiwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NhcG1vZGUuYwppbmRleCA2NjQ4NTU4Li5jYzQ2MTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMKQEAgLTEyMiwxMCArMTIyLDggQEAKIAl9CiAJc2tiX3B1dChza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSArIHNpemVvZihpbnQpKTsKIAlza2ItPmRldiA9IGRldjsKLQotCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKLQotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CiAKIAkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCkBAIC0yNzAsMTMgKzI2OCwxMyBAQAogICBza2JfcHV0KGFja3NrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFICk7CiAgIGFja3NrYi0+ZGV2ID0gZGV2OwogCi0gIGFja3BrdCA9IChzdHJ1Y3QgYXJjaGRyICopIGFja3NrYi0+ZGF0YTsKLQotICBhY2tza2ItPm1hYy5yYXcgPSBhY2tza2ItPmRhdGE7CisgIHNrYl9yZXNldF9tYWNfaGVhZGVyKGFja3NrYik7CisgIGFja3BrdCA9IChzdHJ1Y3QgYXJjaGRyICopc2tiX21hY19oZWFkZXIoYWNrc2tiKTsKICAgLyogc2tiX3B1bGwoYWNrc2tiLCBBUkNfSERSX1NJWkUpOyAqLwogCiAKLSAgbWVtY3B5KGFja3BrdCwgbHAtPm91dGdvaW5nLnNrYi0+ZGF0YSwgQVJDX0hEUl9TSVpFK3NpemVvZihzdHJ1Y3QgYXJjX2NhcCkpOworICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGxwLT5vdXRnb2luZy5za2IsIGFja3BrdCwKKwkJQVJDX0hEUl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBhcmNfY2FwKSk7CiAgIGFja3BrdC0+c29mdC5jYXAucHJvdG89MDsgLyogdXNpbmcgcHJvdG9jb2wgMCBmb3IgYWNrbm93bGVkZ2UgKi8KICAgYWNrcGt0LT5zb2Z0LmNhcC5tZXMuYWNrPWFja2VkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEwNTEuYwppbmRleCA2ZDZjNjlmLi4yZGU4ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMDUxLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkUgKyBSRkMxMDUxX0hEUl9TSVpFOwogCiAJLyogUHVsbCBvZmYgdGhlIGFyY25ldCBoZWFkZXIuICovCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBoZHJfc2l6ZSk7CiAKIAlpZiAocGt0LT5oYXJkLmRlc3QgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTIwMS5jCmluZGV4IGJlZTM0MjIuLjQ2MGEwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEyMDEuYwpAQCAtOTYsNyArOTYsNyBAQAogCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEyMDFfSERSX1NJWkU7CiAKIAkvKiBQdWxsIG9mZiB0aGUgYXJjbmV0IGhlYWRlci4gKi8KLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIGhkcl9zaXplKTsKIAogCWlmIChwa3QtPmhhcmQuZGVzdCA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJpYWRuZS5jIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCmluZGV4IDlkZmMwOWIuLmEwZTY4ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyaWFkbmUuYworKysgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmMKQEAgLTc0Myw3ICs3NDMsNiBAQAogCSAgICB9CiAKIAotCSAgICBza2ItPmRldiA9IGRldjsKIAkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLwogCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCAoY2hhciAqKXByaXYtPnJ4X2J1ZmZbZW50cnldLCBwa3RfbGVuLDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCmluZGV4IGRkZDEyZDQuLjhmMGQ3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYworKysgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKQEAgLTUyNiw3ICs1MjYsNiBAQAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogCiAJCWlmIChza2IpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAogCQkJYW1fcmVhZGJ1ZmZlcihkZXYsIHBrdGFkZHIsIHNrYl9wdXQoc2tiLCBsZW4pLCBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKaW5kZXggMTYyMWI4Zi4uMTUyZmE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCkBAIC04NTgsNyArODU4LDYgQEAKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdGxlbiksIHBfcmVjdiwgcGt0bGVuKTsKIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwppbmRleCBkZDY5OGIwLi4yNDM4YzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKQEAgLTI1NSw3ICsyNTUsNiBAQAogCiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoICsgMik7CiAJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQlkbWFfc3luY19zaW5nbGUoTlVMTCwgZXAtPmRlc2NzLT5yZGVzY1tlbnRyeV0uYnVmX2FkZHIsCiAJCQkJCQlsZW5ndGgsIERNQV9GUk9NX0RFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMKaW5kZXggYTI5MjE4OC4uZjA3NWNlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYwpAQCAtODc1LDcgKzg3NSw2IEBACiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChsZW5ndGggKyAyKTsKIAogCQkJaWYgKHNrYikgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCiAJCQkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgc2tiX3B1dCAoc2tiLCBsZW5ndGgpLCByYmQucmJkX2J1ZmwsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKaW5kZXggODQxMTc4My4uMzJkYTJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYwpAQCAtNjYxLDcgKzY2MSw2IEBACiAJCQlpZiAoc2tiKSB7CiAJCQkJdW5zaWduZWQgY2hhciAqYnVmOwogCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQlidWYgPSBza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAkJCQlldGhlcjNfcmVhZGJ1ZmZlcihkZXYsIGJ1ZiArIDEyLCBsZW5ndGggLSAxMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdDE3MDAuYyBiL2RyaXZlcnMvbmV0L2F0MTcwMC5jCmluZGV4IDU2YWU4YmEuLmJlZDhlMGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdDE3MDAuYworKysgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpAQCAtNzY4LDcgKzc2OCw2IEBACiAJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwogCiAJCQlpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKaW5kZXggNGUzYmY2YS4uM2Q4N2JkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKQEAgLTQ1Myw3ICs0NTMsOCBAQAogCQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKLQkJCW1lbWNweShuaWNfcGFja2V0LT5idWZmZXIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCisJCQkJCQkgIGxlbmd0aCk7CiAJCQlidWYgPSAodW5zaWduZWQgbG9uZykmKChzdHJ1Y3QgbmljX3BrdF9zICopcGh5c19uaWNfcGFja2V0KS0+YnVmZmVyOwogCQl9CiAKQEAgLTU0NCwxMyArNTQ1LDEzIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkJLyogMTYgQnl0ZSBhbGlnbiAgKi8KIAkJCXNrYl9wdXQoIHNrYiwgcGt0X2xlbiApOwkvKiBtYWtlIHJvb20gKi8KIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KIAkJCSAqLwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgbmljX3BhY2tldC0+YnVmZmVyLCBwa3RfbGVuKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAorCQkJCQkJcGt0X2xlbik7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CiAJCQluZXRpZl9yeChza2IpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwppbmRleCAzYjU0MzYxLi41NDcxNDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCkBAIC03MTcsNyArNzE3LDggQEAKIAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgewotCQkJbWVtY3B5KG5pY19wYWNrZXQtPmJ1ZmZlciwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKKwkJCQkJCSAgbGVuZ3RoKTsKIAkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldDsKIAkJfQogCkBAIC03OTIsNyArNzkzLDggQEAKIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KIAkJCSAqLwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgbmljX3BhY2tldC0+YnVmZmVyLCBwa3RfbGVuKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAorCQkJCQkJcGt0X2xlbik7CiAJCQluZXRpZl9yeChza2IpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKaW5kZXggN2UzN2FjOC4uZGZhOGI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwpAQCAtMTA0Nyw3ICsxMDQ3LDYgQEAKIAkJCQkJCSAgIHBrdF9sZW4gKTsKIAkJCQl9CiAKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KCBza2IsIHBrdF9sZW4gKTsJLyogTWFrZSByb29tICovCiAJCQkJbHAtPm1lbWNweV9mKCBza2ItPmRhdGEsIFBLVEJVRl9BRERSKGhlYWQpLCBwa3RfbGVuICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwppbmRleCA4NjA2ZWFjLi40YjFkNGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKQEAgLTQwOCw3ICs0MDgsNiBAQAogc3RhdGljIHUxNiBhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CkBAIC00NDQsNyArNDQzLDYgQEAKIAkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCiAJCSAqLwogCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7Ci0JCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCiAJCWJ1ZmZlcl9pbmZvLT5hbGxvY2VkID0gMTsKIAkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKQEAgLTEyOTYsMTkgKzEyOTQsMjEgQEAKIAkJfQogCiAJCWlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkgewotCQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOwotCQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPQotCQkJICAgIH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIDAsCi0JCQkJCSAgICAgICBJUFBST1RPX1RDUCwgMCk7Ci0JCQlpcG9mc3QgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwkJCWlwaC0+dG90X2xlbiA9IDA7CisJCQlpcGgtPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkJCQkJIDApOworCQkJaXBvZnN0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCQlpZiAoaXBvZnN0ICE9IEVORVRfSEVBREVSX1NJWkUpIC8qIDgwMi4zIGZyYW1lICovCiAJCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9FVEhUWVBFX1NISUZUOwogCi0JCQl0c28tPnRzb3BsIHw9IChza2ItPm5oLmlwaC0+aWhsICYKKwkJCXRzby0+dHNvcGwgfD0gKGlwaC0+aWhsICYKIAkJCQlDU1VNX1BBUkFNX0lQSExfTUFTSykgPDwgQ1NVTV9QQVJBTV9JUEhMX1NISUZUOwotCQkJdHNvLT50c29wbCB8PSAoKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSAmCisJCQl0c28tPnRzb3BsIHw9ICh0Y3BfaGRybGVuKHNrYikgJgogCQkJCVRTT19QQVJBTV9UQ1BIRFJMRU5fTUFTSykgPDwgVFNPX1BBUkFNX1RDUEhEUkxFTl9TSElGVDsKIAkJCXRzby0+dHNvcGwgfD0gKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgJgogCQkJCVRTT19QQVJBTV9NU1NfTUFTSykgPDwgVFNPX1BBUkFNX01TU19TSElGVDsKQEAgLTEzMjcsOCArMTMyNyw4IEBACiAJdTggY3NzLCBjc287CiAKIAlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7Ci0JCWNzbyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7Ci0JCWNzcyA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtX29mZnNldCkgLSBza2ItPmRhdGE7CisJCWNzbyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWNzcyA9IGNzbyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBheWxvYWQgb2Zmc2V0ICE9IGV2ZW4gbnVtYmVyXG4iLAogCQkJCWF0bDFfZHJpdmVyX25hbWUpOwpAQCAtMTM3MCw4ICsxMzcwLDcgQEAKIAogCWlmICh0Y3Bfc2VnKSB7CiAJCS8qIFRTTy9HU08gKi8KLQkJcHJvdG9faGRyX2xlbiA9Ci0JCSAgICAoKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CisJCXByb3RvX2hkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOwogCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gcHJvdG9faGRyX2xlbjsKIAkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOwogCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOwpAQCAtMTU2Myw4ICsxNTYyLDggQEAKIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCWlmIChtc3MpIHsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCQlwcm90b19oZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArCi0JCQkJCSAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJCXByb3RvX2hkcl9sZW4gPSAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJCSB0Y3BfaGRybGVuKHNrYikpOwogCQkJaWYgKHVubGlrZWx5KHByb3RvX2hkcl9sZW4gPiBsZW4pKSB7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCQlyZXR1cm4gTkVUREVWX1RYX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRwLmMgYi9kcml2ZXJzL25ldC9hdHAuYwppbmRleCAyZDMwNmZjLi4xOGFiYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdHAuYworKysgYi9kcml2ZXJzL25ldC9hdHAuYwpAQCAtNzkzLDcgKzc5Myw2IEBACiAJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJZ290byBkb25lOwogCQl9Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQlyZWFkX2Jsb2NrKGlvYWRkciwgcGt0X2xlbiwgc2tiX3B1dChza2IscGt0X2xlbiksIGRldi0+aWZfcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKaW5kZXggNjlhZTIyOS4uZDEwZmI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAl9CiAKIAlwREIgPSBhdXAtPnR4X2RiX2ludXNlW2F1cC0+dHhfaGVhZF07Ci0JbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHBEQi0+dmFkZHIsIHNrYi0+bGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewogCQlmb3IgKGk9c2tiLT5sZW47IGk8RVRIX1pMRU47IGkrKykgewogCQkJKChjaGFyICopcERCLT52YWRkcilbaV0gPSAwOwpAQCAtMTIwNSw3ICsxMjA1LDYgQEAKIAkJCQlhdXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBJUCBoZWFkZXIgYWxpZ24gKi8KIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAogCQkJCSh1bnNpZ25lZCBjaGFyICopcERCLT52YWRkciwgZnJtbGVuLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggZDc0MmJmZS4uODc5YTJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTgyNSwxMiArODI1LDExIEBACiAJCQlpZiAoY29weV9za2IgPT0gTlVMTCkKIAkJCQlnb3RvIGRyb3BfaXRfbm9fcmVjeWNsZTsKIAotCQkJY29weV9za2ItPmRldiA9IGJwLT5kZXY7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJLyogRE1BIHN5bmMgZG9uZSBhYm92ZSwgY29weSBqdXN0IHRoZSBhY3R1YWwgcGFja2V0ICovCi0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSticC0+cnhfb2Zmc2V0LCBsZW4pOwotCisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGJwLT5yeF9vZmZzZXQsCisJCQkJCQkJIGNvcHlfc2tiLT5kYXRhLCBsZW4pOwogCQkJc2tiID0gY29weV9za2I7CiAJCX0KIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwpAQCAtMTAwNyw3ICsxMDA2LDggQEAKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCW1lbWNweShza2JfcHV0KGJvdW5jZV9za2IsIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChib3VuY2Vfc2tiLCBsZW4pLAorCQkJCQkgIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJc2tiID0gYm91bmNlX3NrYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmMgYi9kcml2ZXJzL25ldC9ibWFjLmMKaW5kZXggYzE0MzMwNGQuLjQ2MTI3MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JtYWMuYworKysgYi9kcml2ZXJzL25ldC9ibWFjLmMKQEAgLTcxNSw3ICs3MTUsNiBAQAogCQlpZiAoc2tiICE9IE5VTEwpIHsKIAkJCW5iIC09IEVUSEVSQ1JDOwogCQkJc2tiX3B1dChza2IsIG5iKTsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IGU4NWY1ZWMuLmY5OGEyMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTE4ODQsMTAgKzE4ODQsOCBAQAogCQkJCWdvdG8gcmV1c2Vfcng7CiAKIAkJCS8qIGFsaWduZWQgY29weSAqLwotCQkJbWVtY3B5KG5ld19za2ItPmRhdGEsCi0JCQkJc2tiLT5kYXRhICsgYnAtPnJ4X29mZnNldCAtIDIsCi0JCQkJbGVuICsgMik7Ci0KKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgYnAtPnJ4X29mZnNldCAtIDIsCisJCQkJICAgICAgbmV3X3NrYi0+ZGF0YSwgbGVuICsgMik7CiAJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKIAkJCXNrYl9wdXQobmV3X3NrYiwgbGVuKTsKIApAQCAtNDUxMyw2ICs0NTExLDcgQEAKIAlpZiAoKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICYmCiAJCShza2ItPmxlbiA+IChicC0+ZGV2LT5tdHUgKyBFVEhfSExFTikpKSB7CiAJCXUzMiB0Y3Bfb3B0X2xlbiwgaXBfdGNwX2xlbjsKKwkJc3RydWN0IGlwaGRyICppcGg7CiAKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKIAkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkgewpAQCAtNDUyMCwyNSArNDUxOSwyMyBAQAogCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCi0JCXRjcF9vcHRfbGVuID0gKChza2ItPmgudGgtPmRvZmYgLSA1KSAqIDQpOwogCQl2bGFuX3RhZ19mbGFncyB8PSBUWF9CRF9GTEFHU19TV19MU087CiAKIAkJdGNwX29wdF9sZW4gPSAwOwotCQlpZiAoc2tiLT5oLnRoLT5kb2ZmID4gNSkgewotCQkJdGNwX29wdF9sZW4gPSAoc2tiLT5oLnRoLT5kb2ZmIC0gNSkgPDwgMjsKLQkJfQotCQlpcF90Y3BfbGVuID0gKHNrYi0+bmguaXBoLT5paGwgPDwgMikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCWlmICh0Y3BfaGRyKHNrYiktPmRvZmYgPiA1KQorCQkJdGNwX29wdF9sZW4gPSB0Y3Bfb3B0bGVuKHNrYik7CiAKLQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pOwotCQlza2ItPmgudGgtPmNoZWNrID0KLQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCSAgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCWlwX3RjcF9sZW4gPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAotCQlpZiAodGNwX29wdF9sZW4gfHwgKHNrYi0+bmguaXBoLT5paGwgPiA1KSkgewotCQkJdmxhbl90YWdfZmxhZ3MgfD0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKwotCQkJCSh0Y3Bfb3B0X2xlbiA+PiAyKSkgPDwgODsKKwkJaXBoID0gaXBfaGRyKHNrYik7CisJCWlwaC0+Y2hlY2sgPSAwOworCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCisJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJIElQUFJPVE9fVENQLCAwKTsKKwkJaWYgKHRjcF9vcHRfbGVuIHx8IChpcGgtPmlobCA+IDUpKSB7CisJCQl2bGFuX3RhZ19mbGFncyB8PSAoKGlwaC0+aWhsIC0gNSkgKworCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpIDw8IDg7CiAJCX0KIAl9CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCmluZGV4IDNmYjM1NGQuLjdlMDNmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKQEAgLTg4NCw4ICs4ODQsOCBAQAogCX0KIAogCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGEgKyBFVEhfSExFTjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBza2ItPm1hY19oZWFkZXIgKyBFVEhfSExFTjsKIAlza2ItPnByb3RvY29sID0gUEtUX1RZUEVfTEFDUERVOwogCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAKQEAgLTkyOCw4ICs5MjgsOCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwogCiAJc2tiLT5kZXYgPSBzbGF2ZS0+ZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YSArIEVUSF9ITEVOOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwogCXNrYi0+cHJvdG9jb2wgPSBQS1RfVFlQRV9MQUNQRFU7CiAKIAltYXJrZXJfaGVhZGVyID0gKHN0cnVjdCBtYXJrZXJfaGVhZGVyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggMjE3YTJlZS4uOTJjM2I2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMTA0LDEwICsxMDQsMTUgQEAKIH07CiAjcHJhZ21hIHBhY2soKQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnBfcGt0ICphcnBfcGt0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgYXJwX3BrdCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworfQorCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCiBzdGF0aWMgdm9pZCBhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHN0cnVjdCBzbGF2ZSAqc2xhdmUsIHU4IG1hY19hZGRyW10pOwogCi1zdGF0aWMgaW5saW5lIHU4IF9zaW1wbGVfaGFzaCh1OCAqaGFzaF9zdGFydCwgaW50IGhhc2hfc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdTggX3NpbXBsZV9oYXNoKGNvbnN0IHU4ICpoYXNoX3N0YXJ0LCBpbnQgaGFzaF9zaXplKQogewogCWludCBpOwogCXU4IGhhc2ggPSAwOwpAQCAtNjEzLDcgKzYxOCw3IEBACiBzdGF0aWMgc3RydWN0IHNsYXZlICpybGJfY2hvb3NlX2NoYW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CiAJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7Ci0Jc3RydWN0IGFycF9wa3QgKmFycCA9IChzdHJ1Y3QgYXJwX3BrdCAqKXNrYi0+bmgucmF3OworCXN0cnVjdCBhcnBfcGt0ICphcnAgPSBhcnBfcGt0KHNrYik7CiAJc3RydWN0IHNsYXZlICphc3NpZ25lZF9zbGF2ZTsKIAlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKIAl1MzIgaGFzaF9pbmRleCA9IDA7CkBAIC03MDEsNyArNzA2LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzbGF2ZSAqcmxiX2FycF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kKQogewotCXN0cnVjdCBhcnBfcGt0ICphcnAgPSAoc3RydWN0IGFycF9wa3QgKilza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgYXJwX3BrdCAqYXJwID0gYXJwX3BrdChza2IpOwogCXN0cnVjdCBzbGF2ZSAqdHhfc2xhdmUgPSBOVUxMOwogCiAJaWYgKGFycC0+b3BfY29kZSA9PSBfX2NvbnN0YW50X2h0b25zKEFSUE9QX1JFUExZKSkgewpAQCAtODkwLDggKzg5NSw4IEBACiAJCWRhdGEgPSBza2JfcHV0KHNrYiwgc2l6ZSk7CiAJCW1lbWNweShkYXRhLCAmcGt0LCBzaXplKTsKIAotCQlza2ItPm1hYy5yYXcgPSBkYXRhOwotCQlza2ItPm5oLnJhdyA9IGRhdGEgKyBFVEhfSExFTjsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwogCQlza2ItPnByb3RvY29sID0gcGt0LnR5cGU7CiAJCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAJCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKQEAgLTEyNjMsMTAgKzEyNjgsMTAgQEAKIAlpbnQgaGFzaF9zaXplID0gMDsKIAlpbnQgZG9fdHhfYmFsYW5jZSA9IDE7CiAJdTMyIGhhc2hfaW5kZXggPSAwOwotCXU4ICpoYXNoX3N0YXJ0ID0gTlVMTDsKKwljb25zdCB1OCAqaGFzaF9zdGFydCA9IE5VTEw7CiAJaW50IHJlcyA9IDE7CiAKLQlza2ItPm1hYy5yYXcgPSAodW5zaWduZWQgY2hhciAqKXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCWV0aF9kYXRhID0gZXRoX2hkcihza2IpOwogCiAJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJfYWN0aXZlX3NsYXZlIGFuZCB0aGUgc2xhdmVzIGxpc3QgZG8KQEAgLTEyODAsMTUgKzEyODUsMTggQEAKIAl9CiAKIAlzd2l0Y2ggKG50b2hzKHNrYi0+cHJvdG9jb2wpKSB7Ci0JY2FzZSBFVEhfUF9JUDoKKwljYXNlIEVUSF9QX0lQOiB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKIAkJaWYgKChtZW1jbXAoZXRoX2RhdGEtPmhfZGVzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikgPT0gMCkgfHwKLQkJICAgIChza2ItPm5oLmlwaC0+ZGFkZHIgPT0gaXBfYmNhc3QpIHx8Ci0JCSAgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCkpIHsKKwkJICAgIChpcGgtPmRhZGRyID09IGlwX2JjYXN0KSB8fAorCQkgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JR01QKSkgewogCQkJZG9fdHhfYmFsYW5jZSA9IDA7CiAJCQlicmVhazsKIAkJfQotCQloYXNoX3N0YXJ0ID0gKGNoYXIqKSYoc2tiLT5uaC5pcGgtPmRhZGRyKTsKLQkJaGFzaF9zaXplID0gc2l6ZW9mKHNrYi0+bmguaXBoLT5kYWRkcik7CisJCWhhc2hfc3RhcnQgPSAoY2hhciAqKSYoaXBoLT5kYWRkcik7CisJCWhhc2hfc2l6ZSA9IHNpemVvZihpcGgtPmRhZGRyKTsKKwl9CiAJCWJyZWFrOwogCWNhc2UgRVRIX1BfSVBWNjoKIAkJaWYgKG1lbWNtcChldGhfZGF0YS0+aF9kZXN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSA9PSAwKSB7CkBAIC0xMjk2LDggKzEzMDQsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQloYXNoX3N0YXJ0ID0gKGNoYXIqKSYoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCQloYXNoX3NpemUgPSBzaXplb2Yoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQloYXNoX3N0YXJ0ID0gKGNoYXIgKikmKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwkJaGFzaF9zaXplID0gc2l6ZW9mKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBFVEhfUF9JUFg6CiAJCWlmIChpcHhfaGRyKHNrYiktPmlweF9jaGVja3N1bSAhPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggZTQ3MjRkOC4uY2VhMzc4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0yNTI0LDcgKzI1MjQsNyBAQAogCQkJCSAoMiAqIHNpemVvZih1MzIpKSkpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlhcnAgPSBza2ItPm5oLmFycGg7CisJYXJwID0gYXJwX2hkcihza2IpOwogCWlmIChhcnAtPmFyX2hsbiAhPSBkZXYtPmFkZHJfbGVuIHx8CiAJICAgIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCB8fAogCSAgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSyB8fApAQCAtMzQ3Niw3ICszNDc2LDcgQEAKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAl1MTYgKmxheWVyNGhkciA9ICh1MTYgKikoKHUzMiAqKWlwaCArIGlwaC0+aWhsKTsKIAlpbnQgbGF5ZXI0X3hvciA9IDA7CiAKQEAgLTM2NDAsOSArMzY0MCw4IEBACiAJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKIAogCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKLQkJaWYgKHNsYXZlLT5kZXYtPmdldF9zdGF0cykgewotCQkJc3N0YXRzID0gc2xhdmUtPmRldi0+Z2V0X3N0YXRzKHNsYXZlLT5kZXYpOwotCisJCXNzdGF0cyA9IHNsYXZlLT5kZXYtPmdldF9zdGF0cyhzbGF2ZS0+ZGV2KTsKKwkJaWYgKHNzdGF0cykgewogCQkJc3RhdHMtPnJ4X3BhY2tldHMgKz0gc3N0YXRzLT5yeF9wYWNrZXRzOwogCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHNzdGF0cy0+cnhfYnl0ZXM7CiAJCQlzdGF0cy0+cnhfZXJyb3JzICs9IHNzdGF0cy0+cnhfZXJyb3JzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCmluZGV4IGM4MTI2NDguLjRhZWM3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKQEAgLTE5OTUsNyArMTk5NSw2IEBACiAJCXJldHVybiAtMTsKIAogCSpza2JyZWYgPSBza2I7Ci0Jc2tiLT5kZXYgPSBjcC0+ZGV2OwogCXNrYl9yZXNlcnZlKHNrYiwgc3dpdmVsKTsKIAogCXAgPSBza2ItPmRhdGE7CkBAIC0yODIyLDEwICsyODIxLDggQEAKIAogCWN0cmwgPSAwOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXU2NCBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7Ci0KLQkJY3N1bV9zdGFydF9vZmYgPSAodTY0KSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCWNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OworCQljb25zdCB1NjQgY3N1bV9zdGFydF9vZmYgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCQljb25zdCB1NjQgY3N1bV9zdHVmZl9vZmYgPSBjc3VtX3N0YXJ0X29mZiArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKIAkJY3RybCA9ICBUWF9ERVNDX0NTVU1fRU4gfAogCQkJQ0FTX0JBU0UoVFhfREVTQ19DU1VNX1NUQVJULCBjc3VtX3N0YXJ0X29mZikgfApAQCAtMjg0OSw4ICsyODQ2LDggQEAKIAkJCSAgICAgIGN0cmwgfCBUWF9ERVNDX1NPRiwgMCk7CiAJCWVudHJ5ID0gVFhfREVTQ19ORVhUKHJpbmcsIGVudHJ5KTsKIAotCQltZW1jcHkodHhfdGlueV9idWYoY3AsIHJpbmcsIGVudHJ5KSwgc2tiLT5kYXRhICsKLQkJICAgICAgIGxlbiAtIHRhYm9ydCwgdGFib3J0KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBsZW4gLSB0YWJvcnQsCisJCQkgICAgICB0eF90aW55X2J1ZihjcCwgcmluZywgZW50cnkpLCB0YWJvcnQpOwogCQltYXBwaW5nID0gdHhfdGlueV9tYXAoY3AsIHJpbmcsIGVudHJ5LCB0ZW50cnkpOwogCQljYXNfd3JpdGVfdHhkKGNwLCByaW5nLCBlbnRyeSwgbWFwcGluZywgdGFib3J0LCBjdHJsLAogCQkJICAgICAgKG5yX2ZyYWdzID09IDApKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCmluZGV4IDMyNmQ0YTYuLmU0Zjg3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYwpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIAkJCQkJICAgIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCiAJCQkJCSAgICBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKIAkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCW1lbWNweShza2ItPmRhdGEsIGNlLT5za2ItPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoY2UtPnNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocGRldiwKIAkJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCiAJCQkJCSAgICAgICBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKQEAgLTEzNzksMTIgKzEzNzksMTEgQEAKIAl9CiAJX19za2JfcHVsbChza2IsIHNpemVvZigqcCkpOwogCi0Jc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OwogCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAlzdCA9IHBlcl9jcHVfcHRyKHNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXN0LT5yeF9wYWNrZXRzKys7CiAKLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+cG9ydFtwLT5pZmZdLmRldik7CiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKIAkgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYKIAkgICAgKHNrYi0+ZGF0YVs5XSA9PSBJUFBST1RPX1RDUCB8fCBza2ItPmRhdGFbOV0gPT0gSVBQUk9UT19VRFApKSB7CkBAIC0xODY2LDE0ICsxODY1LDE0IEBACiAKIAkJKytzdC0+dHhfdHNvOwogCi0JCWV0aF90eXBlID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEgPT0gRVRIX0hMRU4gPworCQlldGhfdHlwZSA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpID09IEVUSF9ITEVOID8KIAkJCUNQTF9FVEhfSUkgOiBDUExfRVRIX0lJX1ZMQU47CiAKIAkJaGRyID0gKHN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpoZHIpKTsKIAkJaGRyLT5vcGNvZGUgPSBDUExfVFhfUEtUX0xTTzsKIAkJaGRyLT5pcF9jc3VtX2RpcyA9IGhkci0+bDRfY3N1bV9kaXMgPSAwOwotCQloZHItPmlwX2hkcl93b3JkcyA9IHNrYi0+bmguaXBoLT5paGw7Ci0JCWhkci0+dGNwX2hkcl93b3JkcyA9IHNrYi0+aC50aC0+ZG9mZjsKKwkJaGRyLT5pcF9oZHJfd29yZHMgPSBpcF9oZHIoc2tiKS0+aWhsOworCQloZHItPnRjcF9oZHJfd29yZHMgPSB0Y3BfaGRyKHNrYiktPmRvZmY7CiAJCWhkci0+ZXRoX3R5cGVfbXNzID0gaHRvbnMoTUtfRVRIX1RZUEVfTVNTKGV0aF90eXBlLAogCQkJCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkpOwogCQloZHItPmxlbiA9IGh0b25sKHNrYi0+bGVuIC0gc2l6ZW9mKCpoZHIpKTsKQEAgLTE5MTMsNyArMTkxMiw3IEBACiAKIAkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBVRFBfQ1NVTV9DQVBBQkxFKSAmJgogCQkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCSAgICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJCWlmICh1bmxpa2VseShza2JfY2hlY2tzdW1faGVscChza2IpKSkgewogCQkJCXByX2RlYnVnKCIlczogdW5hYmxlIHRvIGRvIHVkcCBjaGVja3N1bVxuIiwgZGV2LT5uYW1lKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTkyNiw3ICsxOTI1LDcgQEAKIAkJICovCiAJCWlmICgodW5saWtlbHkoIWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2JbZGV2LT5pZl9wb3J0XSkpKSB7CiAJCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApICYmCi0JCQkgICAgc2tiLT5uaC5hcnBoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkgeworCQkJICAgIGFycF9oZHIoc2tiKS0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpIHsKIAkJCQlhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiW2Rldi0+aWZfcG9ydF0gPSBza2I7CiAJCQkJLyogV2Ugd2FudCB0byByZS11c2UgdGhpcyBza2IgbGF0ZXIuIFdlCiAJCQkJICogc2ltcGx5IGJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgaXQKQEAgLTIwOTYsMTAgKzIwOTUsMTQgQEAKIAkJCQkJMHgwLCAweDcsIDB4NDMsIDB4MCwgMHgwLCAweDAKIAkJCQl9OwogCi0JCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCi0JCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gMTAsCi0JCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwKKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3QpLAorCQkJCQkJCSAgICAgICBjaF9tYWNfYWRkciwKKwkJCQkJCQkgICAgICAgRVRIX0FMRU4pOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuIC0gMTAsCisJCQkJCQkJICAgICAgIGNoX21hY19hZGRyLAorCQkJCQkJCSAgICAgICBFVEhfQUxFTik7CiAJCQkJc2tiLT5jYlswXSA9IDB4ZmY7CiAJCQl9CiAKQEAgLTIxMjYsMTAgKzIxMjksMTQgQEAKIAkgICAgICAgICAgICAgICAgaWYgKCFza2ItPmNiWzBdKSB7CiAJICAgICAgICAgICAgICAgICAgICAgICAgdTggY2hfbWFjX2FkZHJbRVRIX0FMRU5dID0KIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfbWFjX2FkZHIsIEVUSF9BTEVOKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwgY2hfbWFjX2FkZHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICBza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3QpLAorCQkJCQkJCSAgICAgICBjaF9tYWNfYWRkciwKKwkJCQkJCQkgICAgICAgRVRIX0FMRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuIC0gMTAsCisJCQkJCQkJICAgICAgIGNoX21hY19hZGRyLAorCQkJCQkJCSAgICAgICBFVEhfQUxFTik7CiAJICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5jYlswXSA9IDB4ZmY7CiAJICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwppbmRleCA4ZWI1NzEyLi41YmRmNWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYworKysgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwpAQCAtMTM0OCw3ICsxMzQ4LDggQEAKIAogI2lmZGVmIEVUSERFQlVHCiAJCXByaW50aygiaGVhZCA9IDB4JXgsIGRhdGEgPSAweCV4LCB0YWlsID0gMHgleCwgZW5kID0gMHgleFxuIiwKLQkJICBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT50YWlsLCBza2ItPmVuZCk7CisJCSAgICAgICBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQkgICAgICAgc2tiX2VuZF9wb2ludGVyKHNrYikpOwogCQlwcmludGsoImNvcHlpbmcgcGFja2V0IHRvIDB4JXguXG4iLCBza2JfZGF0YV9wdHIpOwogI2VuZGlmCiAKQEAgLTEzNzUsNyArMTM3Niw2IEBACiAJCW15TmV4dFJ4RGVzYy0+ZGVzY3IuYnVmID0gTDFfQ0FDSEVfQUxJR04odmlydF90b19waHlzKG15TmV4dFJ4RGVzYy0+c2tiLT5kYXRhKSk7CiAJfQogCi0Jc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogCS8qIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgdXBwZXIgbGF5ZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IDQ2MTJmNzEuLjk3NzRiYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC0xMDA0LDcgKzEwMDQsNiBAQAogCQlyZXR1cm47CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGxvbmd3b3JkIGFsaWduIEwzIGhlYWRlciAqLwotCXNrYi0+ZGV2ID0gZGV2OwogCiAJaWYgKGJwICsgbGVuZ3RoID4gbHAtPmVuZF9kbWFfYnVmZikgewogCQlpbnQgc2VtaV9jbnQgPSBscC0+ZW5kX2RtYV9idWZmIC0gYnA7CkBAIC0xNzAyLDcgKzE3MDEsNiBAQAogCQlyZXR1cm47CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGxvbmd3b3JkIGFsaWduIEwzIGhlYWRlciAqLwotCXNrYi0+ZGV2ID0gZGV2OwogCiAJcmVhZHdvcmRzKGlvYWRkciwgUlhfRlJBTUVfUE9SVCwgc2tiX3B1dChza2IsIGxlbmd0aCksIGxlbmd0aCA+PiAxKTsKIAlpZiAobGVuZ3RoICYgMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwppbmRleCAxOTllNTA2Li5lYmNmMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC03ODMsNyArNzgzLDcgQEAKIAlza2ItPnByb3RvY29sID0gaHRvbnMoMHhmZmZmKTsKIAlza2ItPmRldiA9IGRldi0+bGxkZXY7CiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwppbmRleCAwMjdhYjJjLi4zNjY2NTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwpAQCAtNjYxLDcgKzY2MSw3IEBACiAKIAlpZiAoc2tiKSB7CiAJCV9fc2tiX3B1dChza2IsIElNTUVEX1BLVF9TSVpFKTsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgcmVzcC0+aW1tX2RhdGEsIElNTUVEX1BLVF9TSVpFKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCByZXNwLT5pbW1fZGF0YSwgSU1NRURfUEtUX1NJWkUpOwogCX0KIAlyZXR1cm4gc2tiOwogfQpAQCAtODk3LDExICs4OTcsMTEgQEAKIAkJZC0+ZmxpdFsyXSA9IDA7CiAJCWNudHJsIHw9IFZfVFhQS1RfT1BDT0RFKENQTF9UWF9QS1RfTFNPKTsKIAkJaGRyLT5jbnRybCA9IGh0b25sKGNudHJsKTsKLQkJZXRoX3R5cGUgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSA9PSBFVEhfSExFTiA/CisJCWV0aF90eXBlID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgPT0gRVRIX0hMRU4gPwogCQkgICAgQ1BMX0VUSF9JSSA6IENQTF9FVEhfSUlfVkxBTjsKIAkJdHNvX2luZm8gfD0gVl9MU09fRVRIX1RZUEUoZXRoX3R5cGUpIHwKLQkJICAgIFZfTFNPX0lQSERSX1dPUkRTKHNrYi0+bmguaXBoLT5paGwpIHwKLQkJICAgIFZfTFNPX1RDUEhEUl9XT1JEUyhza2ItPmgudGgtPmRvZmYpOworCQkgICAgVl9MU09fSVBIRFJfV09SRFMoaXBfaGRyKHNrYiktPmlobCkgfAorCQkgICAgVl9MU09fVENQSERSX1dPUkRTKHRjcF9oZHIoc2tiKS0+ZG9mZik7CiAJCWhkci0+bHNvX2luZm8gPSBodG9ubCh0c29faW5mbyk7CiAJCWZsaXRzID0gMzsKIAl9IGVsc2UgewpAQCAtOTEzLDcgKzkxMyw4IEBACiAJCWlmIChza2ItPmxlbiA8PSBXUl9MRU4gLSBzaXplb2YoKmNwbCkpIHsKIAkJCXEtPnNkZXNjW3BpZHhdLnNrYiA9IE5VTEw7CiAJCQlpZiAoIXNrYi0+ZGF0YV9sZW4pCi0JCQkJbWVtY3B5KCZkLT5mbGl0WzJdLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmQtPmZsaXRbMl0sCisJCQkJCQkJICBza2ItPmxlbik7CiAJCQllbHNlCiAJCQkJc2tiX2NvcHlfYml0cyhza2IsIDAsICZkLT5mbGl0WzJdLCBza2ItPmxlbik7CiAKQEAgLTEzMTksMTYgKzEzMjAsMTkgQEAKIAkvKiBPbmx5IFRYX0RBVEEgYnVpbGRzIFNHTHMgKi8KIAogCWZyb20gPSAoc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgKilza2ItPmRhdGE7Ci0JbWVtY3B5KCZkLT5mbGl0WzFdLCAmZnJvbVsxXSwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSAtIHNpemVvZigqZnJvbSkpOworCW1lbWNweSgmZC0+ZmxpdFsxXSwgJmZyb21bMV0sCisJICAgICAgIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLSBzaXplb2YoKmZyb20pKTsKIAotCWZsaXRzID0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpIC8gODsKKwlmbGl0cyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLyA4OwogCXNncCA9IG5kZXNjID09IDEgPyAoc3RydWN0IHNnX2VudCAqKSZkLT5mbGl0W2ZsaXRzXSA6IHNnbDsKLQlzZ2xfZmxpdHMgPSBtYWtlX3NnbChza2IsIHNncCwgc2tiLT5oLnJhdywgc2tiLT50YWlsIC0gc2tiLT5oLnJhdywKKwlzZ2xfZmxpdHMgPSBtYWtlX3NnbChza2IsIHNncCwgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCSAgICAgc2tiLT50YWlsIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyLAogCQkJICAgICBhZGFwLT5wZGV2KTsKIAlpZiAobmVlZF9za2JfdW5tYXAoKSkgewogCQlzZXR1cF9kZWZlcnJlZF91bm1hcHBpbmcoc2tiLCBhZGFwLT5wZGV2LCBzZ3AsIHNnbF9mbGl0cyk7CiAJCXNrYi0+ZGVzdHJ1Y3RvciA9IGRlZmVycmVkX3VubWFwX2Rlc3RydWN0b3I7Ci0JCSgoc3RydWN0IHVubWFwX2luZm8gKilza2ItPmNiKS0+bGVuID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwkJKChzdHJ1Y3QgdW5tYXBfaW5mbyAqKXNrYi0+Y2IpLT5sZW4gPSAoc2tiLT50YWlsIC0KKwkJCQkJCSAgICAgICBza2ItPnRyYW5zcG9ydF9oZWFkZXIpOwogCX0KIAogCXdyaXRlX3dyX2hkcl9zZ2wobmRlc2MsIHNrYiwgZCwgcGlkeCwgcSwgc2dsLCBmbGl0cywgc2dsX2ZsaXRzLApAQCAtMTM0OSw4ICsxMzUzLDggQEAKIAlpZiAoc2tiLT5sZW4gPD0gV1JfTEVOICYmIGNudCA9PSAwKQogCQlyZXR1cm4gMTsJLyogcGFja2V0IGZpdHMgYXMgaW1tZWRpYXRlIGRhdGEgKi8KIAotCWZsaXRzID0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpIC8gODsJLyogaGVhZGVycyAqLwotCWlmIChza2ItPnRhaWwgIT0gc2tiLT5oLnJhdykKKwlmbGl0cyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLyA4OwkvKiBoZWFkZXJzICovCisJaWYgKHNrYi0+dGFpbCAhPSBza2ItPnRyYW5zcG9ydF9oZWFkZXIpCiAJCWNudCsrOwogCXJldHVybiBmbGl0c190b19kZXNjKGZsaXRzICsgc2dsX2xlbihjbnQpKTsKIH0KQEAgLTE2MjAsNyArMTYyNCw5IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBnYXRoZXJfaWR4KQogewogCXJxLT5vZmZsb2FkX3BrdHMrKzsKLQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKHJxLT5wb2xsaW5nKSB7CiAJCXJ4X2dhdGhlcltnYXRoZXJfaWR4KytdID0gc2tiOwpAQCAtMTY4NCw5ICsxNjkwLDggQEAKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKIAogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpwKSArIHBhZCk7Ci0Jc2tiLT5kZXYgPSBhZGFwLT5wb3J0W3AtPmlmZl07CiAJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBhZGFwLT5wb3J0W3AtPmlmZl0pOwogCXBpID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOwogCWlmIChwaS0+cnhfY3N1bV9vZmZsb2FkICYmIHAtPmNzdW1fdmFsaWQgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKIAkgICAgIXAtPmZyYWdtZW50KSB7CkBAIC0xNzE3LDExICsxNzIyLDExIEBACiB7CiAJc2tiLT5sZW4gPSBsZW47CiAJaWYgKGxlbiA8PSBTS0JfREFUQV9TSVpFKSB7Ci0JCW1lbWNweShza2ItPmRhdGEsIHAtPnZhLCBsZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHAtPnZhLCBsZW4pOwogCQlza2ItPnRhaWwgKz0gbGVuOwogCQlwdXRfcGFnZShwLT5mcmFnLnBhZ2UpOwogCX0gZWxzZSB7Ci0JCW1lbWNweShza2ItPmRhdGEsIHAtPnZhLCBTS0JfREFUQV9TSVpFKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwLT52YSwgU0tCX0RBVEFfU0laRSk7CiAJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0ucGFnZSA9IHAtPmZyYWcucGFnZTsKIAkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlX29mZnNldCA9CiAJCSAgICBwLT5mcmFnLnBhZ2Vfb2Zmc2V0ICsgU0tCX0RBVEFfU0laRTsKQEAgLTE3NjcsNyArMTc3Miw3IEBACiAJCQlfX3NrYl9wdXQoc2tiLCBsZW4pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFkYXAtPnBkZXYsIG1hcHBpbmcsIGxlbiwKIAkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2QtPnQuc2tiLT5kYXRhLCBsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzZC0+dC5za2IsIHNrYi0+ZGF0YSwgbGVuKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShhZGFwLT5wZGV2LCBtYXBwaW5nLCBsZW4sCiAJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfSBlbHNlIGlmICghZHJvcF90aHJlcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjAwLmMgYi9kcml2ZXJzL25ldC9kZTYwMC5jCmluZGV4IGU1NDdjZTEuLmRhZTk3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlNjAwLmMKKysrIGIvZHJpdmVycy9uZXQvZGU2MDAuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAJfQogCS8qIGVsc2UgKi8KIAotCXNrYi0+ZGV2ID0gZGV2OwogCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogQWxpZ24gKi8KIAogCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZTYyMC5jIGIvZHJpdmVycy9uZXQvZGU2MjAuYwppbmRleCBiNmFkMGNiLi5kYzQ4OTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZTYyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlNjIwLmMKQEAgLTY5Nyw3ICs2OTcsNiBAQAogCQl9CiAJCWVsc2UgeyAvKiBZZXAhIEdvIGdldCBpdCEgKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogQWxpZ24gKi8KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJLyogc2tiLT5kYXRhIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEgKi8KIAkJCWJ1ZmZlciA9IHNrYl9wdXQoc2tiLHNpemUpOwogCQkJLyogY29weSB0aGUgcGFja2V0IGludG8gdGhlIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVjbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKaW5kZXggOWY3ZTFkYi4uOTVkODU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVjbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCkBAIC02MTYsNyArNjE2LDYgQEAKIAkJCX0KIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLwogCQkJc2tiX3B1dChza2IsIGxlbik7CS8qIG1ha2Ugcm9vbSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCAwN2QyNzMxLi41NzFkODJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTMwOTEsMTMgKzMwOTEsMTMgQEAKIAkJCQkJewogCQkJCQkJLyogUmVjZWl2ZSBidWZmZXIgYWxsb2NhdGVkLCBwYXNzIHJlY2VpdmUgcGFja2V0IHVwICovCiAKLQkJCQkJCW1lbWNweShza2ItPmRhdGEsIHBfYnVmZiArIFJDVl9CVUZGX0tfUEFERElORywgcGt0X2xlbiszKTsKKwkJCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQkgICAgICAgcF9idWZmICsgUkNWX0JVRkZfS19QQURESU5HLAorCQkJCQkJCSAgICAgICBwa3RfbGVuICsgMyk7CiAJCQkJCX0KIAogCQkJCQlza2JfcmVzZXJ2ZShza2IsMyk7CQkvKiBhZGp1c3QgZGF0YSBmaWVsZCBzbyB0aGF0IGl0IHBvaW50cyB0byBGQyBieXRlICovCiAJCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJCS8qIHBhc3MgdXAgcGFja2V0IGxlbmd0aCwgTk9UIGluY2x1ZGluZyBDUkMgKi8KLQkJCQkJc2tiLT5kZXYgPSBicC0+ZGV2OwkJLyogcGFzcyB1cCBkZXZpY2UgcG9pbnRlciAqLwotCiAJCQkJCXNrYi0+cHJvdG9jb2wgPSBmZGRpX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKIAkJCQkJYnAtPnJjdl90b3RhbF9ieXRlcyArPSBza2ItPmxlbjsKIAkJCQkJbmV0aWZfcngoc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IGYzODA3YWEuLjE4MzQ5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMTA0NCw3ICsxMDQ0LDYgQEAKIAkJCQkJdW5zaWduZWQgY2hhciAqYnVmOwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQkJYnVmID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOwotCQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQkJaWYgKGVudHJ5IDwgbHAtPnJ4X29sZCkgewkvKiBXcmFwcGVkIGJ1ZmZlciAqLwogCQkJCQkJbGVuID0gKGxwLT5yeFJpbmdNYXNrIC0gbHAtPnJ4X29sZCArIDEpICogUlhfQlVGRl9TWjsKIAkJCQkJCW1lbWNweV9mcm9taW8oYnVmLCBscC0+cnhfYnVmZltscC0+cnhfb2xkXSwgbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnMuYyBiL2RyaXZlcnMvbmV0L2RncnMuYwppbmRleCBhNzk1MjAyLi5kZjYyYzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZ3JzLmMKKysrIGIvZHJpdmVycy9uZXQvZGdycy5jCkBAIC01MDMsNyArNTAzLDYgQEAKIAkJLyogZGlzY2FyZGluZyB0aGUgZnJhbWUgKi8KIAkJZ290byBvdXQ7CiAJfQotCXNrYi0+ZGV2ID0gZGV2TjsKIAlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBoZWFkZXIgKi8KIAogYWdhaW46CkBAIC03NDIsNyArNzQxLDcgQEAKIAkJfQogCiAJCWFtdCA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCByYmRwLT5zaXplIC0gY291bnQpOwotCQltZW1jcHkoIChjaGFyICopIFMySChyYmRwLT5idWYpICsgY291bnQsIHNrYi0+ZGF0YSArIGksIGFtdCk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgaSwgUzJIKHJiZHAtPmJ1ZikgKyBjb3VudCwgYW10KTsKIAkJaSArPSBhbXQ7CiAJCWNvdW50ICs9IGFtdDsKIAkJbGVuIC09IGFtdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RsMmsuYyBiL2RyaXZlcnMvbmV0L2RsMmsuYwppbmRleCA5ZDQ0NmEwLi43NGVjNjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbDJrLmMKKysrIGIvZHJpdmVycy9uZXQvZGwyay5jCkBAIC01MDQsNyArNTA0LDYgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCQkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CkBAIC01NzUsNyArNTc0LDYgQEAKIAkJCQlkZXYtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KLQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KIAkJLyogUnViaWNvbiBub3cgc3VwcG9ydHMgNDAgYml0cyBvZiBhZGRyZXNzaW5nIHNwYWNlLiAqLwogCQlucC0+cnhfcmluZ1tpXS5mcmFnaW5mbyA9CkBAIC04NjYsNyArODY0LDYgQEAKIAkJCQkJCQkgICAgCURNQV80OEJJVF9NQVNLLAogCQkJCQkJCSAgICBucC0+cnhfYnVmX3N6LAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCQkJCWV0aF9jb3B5X2FuZF9zdW0gKHNrYiwKQEAgLTkxMCw3ICs5MDcsNiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CiAJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZG05MDAwLmMgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwppbmRleCA2MTVkMmIxLi44Y2MxMTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbTkwMDAuYworKysgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwpAQCAtOTU0LDcgKzk1NCw2IEBACiAJCS8qIE1vdmUgZGF0YSBmcm9tIERNOTAwMCAqLwogCQlpZiAoR29vZFBhY2tldAogCQkgICAgJiYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKFJ4TGVuICsgNCkpICE9IE5VTEwpKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQlyZHB0ciA9ICh1OCAqKSBza2JfcHV0KHNrYiwgUnhMZW4gLSA0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDBjZWZlZjUuLjRkMGUwYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTE3NjksNyArMTc2OSw3IEBACiAKIAkvKiBBbGlnbiwgaW5pdCwgYW5kIG1hcCB0aGUgUkZELiAqLwogCXNrYl9yZXNlcnZlKHJ4LT5za2IsIE5FVF9JUF9BTElHTik7Ci0JbWVtY3B5KHJ4LT5za2ItPmRhdGEsICZuaWMtPmJsYW5rX3JmZCwgc2l6ZW9mKHN0cnVjdCByZmQpKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShyeC0+c2tiLCAmbmljLT5ibGFua19yZmQsIHNpemVvZihzdHJ1Y3QgcmZkKSk7CiAJcngtPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+c2tiLT5kYXRhLAogCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IGIyOGE5MTUuLjQ4ZTJhZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTI4ODcsMzMgKzI4ODcsMzAgQEAKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CiAJCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewotCQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOwotCQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPQotCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCQkgICAwLAotCQkJCQkJICAgSVBQUk9UT19UQ1AsCi0JCQkJCQkgICAwKTsKKwkJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJCQlpcGgtPnRvdF9sZW4gPSAwOworCQkJaXBoLT5jaGVjayA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCisJCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAorCQkJCQkJCQkgSVBQUk9UT19UQ1AsCisJCQkJCQkJCSAwKTsKIAkJCWNtZF9sZW5ndGggPSBFMTAwMF9UWERfQ01EX0lQOwotCQkJaXBjc2UgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gMTsKKwkJCWlwY3NlID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAtIDE7CiAJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSAwOwotCQkJc2tiLT5oLnRoLT5jaGVjayA9Ci0JCQkJfmNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCQkgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJCQkJIDAsCi0JCQkJCQkgSVBQUk9UT19UQ1AsCi0JCQkJCQkgMCk7CisJCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCQl+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgMCwgSVBQUk9UT19UQ1AsIDApOwogCQkJaXBjc2UgPSAwOwogCQl9Ci0JCWlwY3NzID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7Ci0JCWlwY3NvID0gKHZvaWQgKikmKHNrYi0+bmguaXBoLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKLQkJdHVjc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCQl0dWNzbyA9ICh2b2lkICopJihza2ItPmgudGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzcyA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCQlpcGNzbyA9ICh2b2lkICopJihpcF9oZHIoc2tiKS0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCXR1Y3NzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwkJdHVjc28gPSAodm9pZCAqKSYodGNwX2hkcihza2IpLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKIAkJdHVjc2UgPSAwOwogCiAJCWNtZF9sZW5ndGggfD0gKEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RYRF9DTURfVFNFIHwKQEAgLTI5NTQsNyArMjk1MSw3IEBACiAJdWludDhfdCBjc3M7CiAKIAlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7Ci0JCWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCWNzcyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAKIAkJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwogCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKQEAgLTI5NjIsNyArMjk1OSw4IEBACiAKIAkJY29udGV4dF9kZXNjLT5sb3dlcl9zZXR1cC5pcF9jb25maWcgPSAwOwogCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBjc3M7Ci0JCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9IGNzcyArIHNrYi0+Y3N1bTsKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KKwkJCWNzcyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IDA7CiAJCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKIAkJY29udGV4dF9kZXNjLT5jbWRfYW5kX2xlbmd0aCA9IGNwdV90b19sZTMyKEUxMDAwX1RYRF9DTURfREVYVCk7CkBAIC0zMjk2LDcgKzMyOTQsNyBAQAogCQkvKiBUU08gV29ya2Fyb3VuZCBmb3IgODI1NzEvMi8zIENvbnRyb2xsZXJzIC0tIGlmIHNrYi0+ZGF0YQogCQkqIHBvaW50cyB0byBqdXN0IGhlYWRlciwgcHVsbCBhIGZldyBieXRlcyBvZiBwYXlsb2FkIGZyb20KIAkJKiBmcmFncyBpbnRvIHNrYi0+ZGF0YSAqLwotCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOworCQloZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKIAkJaWYgKHNrYi0+ZGF0YV9sZW4gJiYgKGhkcl9sZW4gPT0gKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikpKSB7CiAJCQlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CiAJCQkJdW5zaWduZWQgaW50IHB1bGxfc2l6ZTsKQEAgLTMzMDcsNyArMzMwNSw3IEBACiAJCQkJICogTk9URTogdGhpcyBpcyBhIFRTTyBvbmx5IHdvcmthcm91bmQKIAkJCQkgKiBpZiBlbmQgYnl0ZSBhbGlnbm1lbnQgbm90IGNvcnJlY3QgbW92ZSB1cwogCQkJCSAqIGludG8gdGhlIG5leHQgZHdvcmQgKi8KLQkJCQlpZiAoKHVuc2lnbmVkIGxvbmcpKHNrYi0+dGFpbCAtIDEpICYgNCkKKwkJCQlpZiAoKHVuc2lnbmVkIGxvbmcpKHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIDEpICYgNCkKIAkJCQkJYnJlYWs7CiAJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQljYXNlIGUxMDAwXzgyNTcxOgpAQCAtNDIyNyw5ICs0MjI1LDEyIEBACiAJCQkgICAgbmV0ZGV2X2FsbG9jX3NrYihuZXRkZXYsIGxlbmd0aCArIE5FVF9JUF9BTElHTik7CiAJCQlpZiAobmV3X3NrYikgewogCQkJCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7Ci0JCQkJbWVtY3B5KG5ld19za2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCi0JCQkJICAgICAgIHNrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTiwKLQkJCQkgICAgICAgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQobmV3X3NrYiwKKwkJCQkJCQkgICAgICAgLU5FVF9JUF9BTElHTiwKKwkJCQkJCQkgICAgICAgKHNrYi0+ZGF0YSAtCisJCQkJCQkJICAgICAgICBORVRfSVBfQUxJR04pLAorCQkJCQkJCSAgICAgICAobGVuZ3RoICsKKwkJCQkJCQkgICAgICAgIE5FVF9JUF9BTElHTikpOwogCQkJCS8qIHNhdmUgdGhlIHNrYiBpbiBidWZmZXJfaW5mbyBhcyBnb29kICovCiAJCQkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKIAkJCQlza2IgPSBuZXdfc2tiOwpAQCAtNDM5MSw3ICs0MzkyLDcgQEAKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJdmFkZHIgPSBrbWFwX2F0b21pYyhwc19wYWdlLT5wc19wYWdlWzBdLAogCQkJICAgICAgICAgICAgICAgICAgICBLTV9TS0JfREFUQV9TT0ZUSVJRKTsKLQkJCW1lbWNweShza2ItPnRhaWwsIHZhZGRyLCBsMSk7CisJCQltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCB2YWRkciwgbDEpOwogCQkJa3VubWFwX2F0b21pYyh2YWRkciwgS01fU0tCX0RBVEFfU09GVElSUSk7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocGRldiwKIAkJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbMF0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXByby5jIGIvZHJpdmVycy9uZXQvZWVwcm8uYwppbmRleCBiNDQ2MzA5Li4zOTY1NGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXByby5jCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKQEAgLTE1OTEsNyArMTU5MSw2IEBACiAKIAkJCQlicmVhazsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwogCiAJCQlpZiAobHAtPnZlcnNpb24gPT0gTEFONTk1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWVwcm8xMDAuYyBiL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKaW5kZXggZTI4YmIxZS4uNmMyNjdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWVwcm8xMDAuYworKysgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCkBAIC0xNzkzLDcgKzE3OTMsNiBAQAogCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCkBAIC0xODA1LDggKzE4MDQsOSBAQAogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogI2Vsc2UKLQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKLQkJCQkJICAgcGt0X2xlbik7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzcC0+cnhfc2tidWZmW2VudHJ5XSwKKwkJCQkJCQkgIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCQkJCQkgIHBrdF9sZW4pOwogI2VuZGlmCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLAogCQkJCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IFJ4RkQpICsgcGt0X2xlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCmluZGV4IDM4NjhiODAuLjhhYWY1ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtOTc2LDcgKzk3Niw2IEBACiAJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJCW91dHcocGJ1ZisxMCwgaW9hZGRyK1JFQURfUFRSKTsKIAkJCSAgICAgICAgaW5zdyhpb2FkZHIrREFUQVBPUlQsIHNrYl9wdXQoc2tiLHBrdF9sZW4pLChwa3RfbGVuKzEpPj4xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDBlNDA0MmIuLjU4MzY0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtMzkxLDggKzM5MSw4IEBACiAJCQkJCWlmICghc2tiKQogCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCW1lbWNweShza2ItPmRhdGEsICgoY2hhciopY3FlKSArIDY0LAotCQkJCSAgICAgICBjcWUtPm51bV9ieXRlc190cmFuc2ZlcmVkIC0gNCk7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAoKGNoYXIqKWNxZSkgKyA2NCwKKwkJCQkJICAgICAgIGNxZS0+bnVtX2J5dGVzX3RyYW5zZmVyZWQgLSA0KTsKIAkJCQllaGVhX2ZpbGxfc2tiKGRldiwgc2tiLCBjcWUpOwogCQkJfSBlbHNlIGlmIChycSA9PSAyKSB7ICAvKiBSUTIgKi8KIAkJCQlza2IgPSBnZXRfc2tiX2J5X2luZGV4KHNrYl9hcnJfcnEyLApAQCAtMTI2Miw4ICsxMjYyLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pcF9zdGFydF9lbmQoc3RydWN0IGVoZWFfc3dxZSAqc3dxZSwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN3cWUtPmlwX3N0YXJ0ID0gKHU4KSgoKHU2NClza2ItPm5oLmlwaCkgLSAoKHU2NClza2ItPmRhdGEpKTsKLQlzd3FlLT5pcF9lbmQgPSAodTgpKHN3cWUtPmlwX3N0YXJ0ICsgc2tiLT5uaC5pcGgtPmlobCAqIDQgLSAxKTsKKwlzd3FlLT5pcF9zdGFydCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCXN3cWUtPmlwX2VuZCA9ICh1OCkoc3dxZS0+aXBfc3RhcnQgKyBpcF9oZHJsZW4oc2tiKSAtIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdGNwX29mZnNldF9lbmQoc3RydWN0IGVoZWFfc3dxZSAqc3dxZSwKQEAgLTEzMDAsMTMgKzEzMDAsMTMgQEAKIAkvKiBjb3B5IG9ubHkgZXRoL2lwL3RjcCBoZWFkZXJzIHRvIGltbWVkaWF0ZSBkYXRhIGFuZAogCSAqIHRoZSByZXN0IG9mIHNrYi0+ZGF0YSB0byBzZzFlbnRyeQogCSAqLwotCWhlYWRlcnNpemUgPSBFVEhfSExFTiArIChza2ItPm5oLmlwaC0+aWhsICogNCkgKyAoc2tiLT5oLnRoLT5kb2ZmICogNCk7CisJaGVhZGVyc2l6ZSA9IEVUSF9ITEVOICsgaXBfaGRybGVuKHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CiAKIAlza2JfZGF0YV9zaXplID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOwogCiAJaWYgKHNrYl9kYXRhX3NpemUgPj0gaGVhZGVyc2l6ZSkgewogCQkvKiBjb3B5IGltbWVkaWF0ZSBkYXRhICovCi0JCW1lbWNweShpbW1fZGF0YSwgc2tiLT5kYXRhLCBoZWFkZXJzaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGltbV9kYXRhLCBoZWFkZXJzaXplKTsKIAkJc3dxZS0+aW1tZWRpYXRlX2RhdGFfbGVuZ3RoID0gaGVhZGVyc2l6ZTsKIAogCQlpZiAoc2tiX2RhdGFfc2l6ZSA+IGhlYWRlcnNpemUpIHsKQEAgLTEzMzcsNyArMTMzNyw3IEBACiAJICovCiAJaWYgKHNrYl9kYXRhX3NpemUgPj0gU1dRRTJfTUFYX0lNTSkgewogCQkvKiBjb3B5IGltbWVkaWF0ZSBkYXRhICovCi0JCW1lbWNweShpbW1fZGF0YSwgc2tiLT5kYXRhLCBTV1FFMl9NQVhfSU1NKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGltbV9kYXRhLCBTV1FFMl9NQVhfSU1NKTsKIAogCQlzd3FlLT5pbW1lZGlhdGVfZGF0YV9sZW5ndGggPSBTV1FFMl9NQVhfSU1NOwogCkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0gZWxzZSB7Ci0JCW1lbWNweShpbW1fZGF0YSwgc2tiLT5kYXRhLCBza2JfZGF0YV9zaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGltbV9kYXRhLCBza2JfZGF0YV9zaXplKTsKIAkJc3dxZS0+aW1tZWRpYXRlX2RhdGFfbGVuZ3RoID0gc2tiX2RhdGFfc2l6ZTsKIAl9CiB9CkBAIC0xNjg4LDYgKzE2ODgsNyBAQAogCQkgICAgICAgc3RydWN0IGVoZWFfc3dxZSAqc3dxZSwgdTMyIGxrZXkpCiB7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJCS8qIElQdjQgKi8KIAkJc3dxZS0+dHhfY29udHJvbCB8PSBFSEVBX1NXUUVfQ1JDCiAJCQkJIHwgRUhFQV9TV1FFX0lQX0NIRUNLU1VNCkBAIC0xNjk3LDE1ICsxNjk4LDE1IEBACiAKIAkJd3JpdGVfaXBfc3RhcnRfZW5kKHN3cWUsIHNrYik7CiAKLQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewotCQkJaWYgKChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBJUF9NRikgfHwKLQkJCSAgICAoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgSVBfT0ZGU0VUKSkKKwkJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCWlmICgoaXBoLT5mcmFnX29mZiAmIElQX01GKSB8fAorCQkJICAgIChpcGgtPmZyYWdfb2ZmICYgSVBfT0ZGU0VUKSkKIAkJCQkvKiBJUCBmcmFnbWVudCwgc28gZG9uJ3QgY2hhbmdlIGNzICovCiAJCQkJc3dxZS0+dHhfY29udHJvbCAmPSB+RUhFQV9TV1FFX1RDUF9DSEVDS1NVTTsKIAkJCWVsc2UKIAkJCQl3cml0ZV91ZHBfb2Zmc2V0X2VuZChzd3FlLCBza2IpOwogCi0JCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCX0gZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgewogCQkJd3JpdGVfdGNwX29mZnNldF9lbmQoc3dxZSwgc2tiKTsKIAkJfQogCkBAIC0xNzMxLDEwICsxNzMyLDExIEBACiAJaW50IGk7CiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAkJLyogSVB2NCAqLwogCQl3cml0ZV9pcF9zdGFydF9lbmQoc3dxZSwgc2tiKTsKIAotCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CiAJCQlzd3FlLT50eF9jb250cm9sIHw9IEVIRUFfU1dRRV9DUkMKIAkJCQkJIHwgRUhFQV9TV1FFX0lQX0NIRUNLU1VNCiAJCQkJCSB8IEVIRUFfU1dRRV9UQ1BfQ0hFQ0tTVU0KQEAgLTE3NDIsOSArMTc0NCw5IEBACiAKIAkJCXdyaXRlX3RjcF9vZmZzZXRfZW5kKHN3cWUsIHNrYik7CiAKLQkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKLQkJCWlmICgoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgSVBfTUYpIHx8Ci0JCQkgICAgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIElQX09GRlNFVCkpCisJCX0gZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJaWYgKChpcGgtPmZyYWdfb2ZmICYgSVBfTUYpIHx8CisJCQkgICAgKGlwaC0+ZnJhZ19vZmYgJiBJUF9PRkZTRVQpKQogCQkJCS8qIElQIGZyYWdtZW50LCBzbyBkb24ndCBjaGFuZ2UgY3MgKi8KIAkJCQlzd3FlLT50eF9jb250cm9sIHw9IEVIRUFfU1dRRV9DUkMKIAkJCQkJCSB8IEVIRUFfU1dRRV9JTU1fREFUQV9QUkVTRU5UOwpAQCAtMTc3MCwxMCArMTc3MiwxMSBAQAogCS8qIGNvcHkgKGltbWVkaWF0ZSkgZGF0YSAqLwogCWlmIChuZnJhZ3MgPT0gMCkgewogCQkvKiBkYXRhIGlzIGluIGEgc2luZ2xlIHBpZWNlICovCi0JCW1lbWNweShpbW1fZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBpbW1fZGF0YSwgc2tiLT5sZW4pOwogCX0gZWxzZSB7CiAJCS8qIGZpcnN0IGNvcHkgZGF0YSBmcm9tIHRoZSBza2ItPmRhdGEgYnVmZmVyIC4uLiAqLwotCQltZW1jcHkoaW1tX2RhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGltbV9kYXRhLAorCQkJCQkgIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbik7CiAJCWltbV9kYXRhICs9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKIAogCQkvKiAuLi4gdGhlbiBjb3B5IGRhdGEgZnJvbSB0aGUgZnJhZ21lbnRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lcGljMTAwLmMgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKaW5kZXggM2E2YTgzZC4uNGUzZjE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpAQCAtOTM0LDcgKzkzNCw2IEBACiAJCWVwLT5yeF9za2J1ZmZbaV0gPSBza2I7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwotCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KIAkJZXAtPnJ4X3JpbmdbaV0uYnVmYWRkciA9IHBjaV9tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LAogCQkJc2tiLT5kYXRhLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTE5OSw3ICsxMTk4LDYgQEAKIAkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGVwLT5wY2lfZGV2LAogCQkJCQkJCSAgICBlcC0+cnhfcmluZ1tlbnRyeV0uYnVmYWRkciwKQEAgLTEyMzYsNyArMTIzNCw2IEBACiAJCQlza2IgPSBlcC0+cnhfc2tidWZmW2VudHJ5XSA9IGRldl9hbGxvY19za2IoZXAtPnJ4X2J1Zl9zeik7CiAJCQlpZiAoc2tiID09IE5VTEwpCiAJCQkJYnJlYWs7Ci0JCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIAkJCWVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsCiAJCQkJc2tiLT5kYXRhLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoMTZpLmMgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwppbmRleCA5MzI4M2UzLi4wNGFiZjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGgxNmkuYworKysgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwpAQCAtMTE3NSw3ICsxMTc1LDYgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShza2IsMik7CiAKIAkJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ld3JrMy5jIGIvZHJpdmVycy9uZXQvZXdyazMuYwppbmRleCA3MTRlYTExLi5jYjA3OTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ld3JrMy5jCisrKyBiL2RyaXZlcnMvbmV0L2V3cmszLmMKQEAgLTk5Myw3ICs5OTMsNiBAQAogCiAJCQkJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKIAkJCQkJCXVuc2lnbmVkIGNoYXIgKnA7Ci0JCQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIHRvIDE2IGJ5dGVzICovCiAJCQkJCQlwID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWFsbnguYyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCmluZGV4IDM4YTEzZjQuLmFiZTliMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC0xNzE5LDcgKzE3MTksNiBAQAogCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKIAkJCSAgICAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCiAJCQkJCQkJICAgIG5wLT5jdXJfcngtPmJ1ZmZlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYy5jIGIvZHJpdmVycy9uZXQvZmVjLmMKaW5kZXggNjc2NDI4MS4uMjU1YjA5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZmVjLmMKQEAgLTY0Nyw3ICs2NDcsNiBAQAogCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKIAkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJfSBlbHNlIHsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9wdXQoc2tiLHBrdF9sZW4tNCk7CS8qIE1ha2Ugcm9vbSAqLwogCQlldGhfY29weV9hbmRfc3VtKHNrYiwgZGF0YSwgcGt0X2xlbi00LCAwKTsKIAkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21haW4uYyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21haW4uYwppbmRleCA3N2Y3NDdhLi5lODI0ZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jCkBAIC01NTEsNyArNTUxLDkgQEAKIAkJCQlza2JuID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CiAJCQkJaWYgKHNrYm4gIT0gTlVMTCkgewogCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCi0JCQkJCW1lbWNweShza2JuLT5kYXRhLCBza2ItPmRhdGEsIHBrdF9sZW4pOworCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYgorCQkJCQkJCQkgIHNrYm4tPmRhdGEsCisJCQkJCQkJCSAgcGt0X2xlbik7CiAJCQkJCS8qIHN3YXAgKi8KIAkJCQkJc2tidCA9IHNrYjsKIAkJCQkJc2tiID0gc2tibjsKQEAgLTU2MSw3ICs1NjMsNiBAQAogCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKEVORVRfUlhfRlJTSVpFKTsKIAogCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQlyZWNlaXZlZCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCBkMDQyMTRlLi43YTAxODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTM4NSwxMSArMTM4NSwxMiBAQAogCXdoaWxlIChucC0+cHV0X3J4Lm9yaWcgIT0gbGVzc19yeCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6ICsgTlZfUlhfQUxMT0NfUEFEKTsKIAkJaWYgKHNrYikgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlucC0+cHV0X3J4X2N0eC0+c2tiID0gc2tiOwotCQkJbnAtPnB1dF9yeF9jdHgtPmRtYSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCi0JCQkJCQkJICAgICBza2ItPmVuZC1za2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlucC0+cHV0X3J4X2N0eC0+ZG1hX2xlbiA9IHNrYi0+ZW5kLXNrYi0+ZGF0YTsKKwkJCW5wLT5wdXRfcnhfY3R4LT5kbWEgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgIHNrYi0+ZGF0YSwKKwkJCQkJCQkgICAgIHNrYl90YWlscm9vbShza2IpLAorCQkJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW5wLT5wdXRfcnhfY3R4LT5kbWFfbGVuID0gc2tiX3RhaWxyb29tKHNrYik7CiAJCQlucC0+cHV0X3J4Lm9yaWctPmJ1ZiA9IGNwdV90b19sZTMyKG5wLT5wdXRfcnhfY3R4LT5kbWEpOwogCQkJd21iKCk7CiAJCQlucC0+cHV0X3J4Lm9yaWctPmZsYWdsZW4gPSBjcHVfdG9fbGUzMihucC0+cnhfYnVmX3N6IHwgTlZfUlhfQVZBSUwpOwpAQCAtMTQxNiwxMSArMTQxNywxMiBAQAogCXdoaWxlIChucC0+cHV0X3J4LmV4ICE9IGxlc3NfcngpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeiArIE5WX1JYX0FMTE9DX1BBRCk7CiAJCWlmIChza2IpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJbnAtPnB1dF9yeF9jdHgtPnNrYiA9IHNrYjsKLQkJCW5wLT5wdXRfcnhfY3R4LT5kbWEgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAotCQkJCQkJCSAgICAgc2tiLT5lbmQtc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbnAtPnB1dF9yeF9jdHgtPmRtYV9sZW4gPSBza2ItPmVuZC1za2ItPmRhdGE7CisJCQlucC0+cHV0X3J4X2N0eC0+ZG1hID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQkJICAgICBza2ItPmRhdGEsCisJCQkJCQkJICAgICBza2JfdGFpbHJvb20oc2tiKSwKKwkJCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cHV0X3J4X2N0eC0+ZG1hX2xlbiA9IHNrYl90YWlscm9vbShza2IpOwogCQkJbnAtPnB1dF9yeC5leC0+YnVmaGlnaCA9IGNwdV90b19sZTY0KG5wLT5wdXRfcnhfY3R4LT5kbWEpID4+IDMyOwogCQkJbnAtPnB1dF9yeC5leC0+YnVmbG93ID0gY3B1X3RvX2xlNjQobnAtPnB1dF9yeF9jdHgtPmRtYSkgJiAweDBGRkZGRkZGRjsKIAkJCXdtYigpOwpAQCAtMTYwNCw4ICsxNjA2LDkgQEAKIAkJd21iKCk7CiAJCWlmIChucC0+cnhfc2tiW2ldLnNrYikgewogCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X3NrYltpXS5kbWEsCi0JCQkJCQlucC0+cnhfc2tiW2ldLnNrYi0+ZW5kLW5wLT5yeF9za2JbaV0uc2tiLT5kYXRhLAotCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJIChza2JfZW5kX3BvaW50ZXIobnAtPnJ4X3NrYltpXS5za2IpIC0KKwkJCQkJICBucC0+cnhfc2tiW2ldLnNrYi0+ZGF0YSksCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tiW2ldLnNrYik7CiAJCQlucC0+cnhfc2tiW2ldLnNrYiA9IE5VTEw7CiAJCX0KQEAgLTQzNzYsMTEgKzQzNzksMTIgQEAKIAkJcmV0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQorCXRlc3RfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwgdHhfc2tiLT5kYXRhLAorCQkJCSAgICAgICBza2JfdGFpbHJvb20odHhfc2tiKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAlwa3RfZGF0YSA9IHNrYl9wdXQodHhfc2tiLCBwa3RfbGVuKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGt0X2xlbjsgaSsrKQogCQlwa3RfZGF0YVtpXSA9ICh1OCkoaSAmIDB4ZmYpOwotCXRlc3RfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwgdHhfc2tiLT5kYXRhLAotCQkJCSAgICAgICB0eF9za2ItPmVuZC10eF9za2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKIAkJbnAtPnR4X3Jpbmcub3JpZ1swXS5idWYgPSBjcHVfdG9fbGUzMih0ZXN0X2RtYV9hZGRyKTsKQEAgLTQ0MzcsNyArNDQ0MSw3IEBACiAJfQogCiAJcGNpX3VubWFwX3BhZ2UobnAtPnBjaV9kZXYsIHRlc3RfZG1hX2FkZHIsCi0JCSAgICAgICB0eF9za2ItPmVuZC10eF9za2ItPmRhdGEsCisJCSAgICAgICAoc2tiX2VuZF9wb2ludGVyKHR4X3NrYikgLSB0eF9za2ItPmRhdGEpLAogCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CiAJZGV2X2tmcmVlX3NrYl9hbnkodHhfc2tiKTsKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCA0YTA1YzE0Li5lMmRkZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKQEAgLTE2MCw3ICsxNjAsOCBAQAogCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKIAkJCQlpZiAoc2tibiAhPSBOVUxMKSB7CiAJCQkJCXNrYl9yZXNlcnZlKHNrYm4sIDIpOwkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KLQkJCQkJbWVtY3B5KHNrYm4tPmRhdGEsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJICAgICAgc2tibi0+ZGF0YSwgcGt0X2xlbik7CiAJCQkJCS8qIHN3YXAgKi8KIAkJCQkJc2tidCA9IHNrYjsKIAkJCQkJc2tiID0gc2tibjsKQEAgLTE3MCw3ICsxNzEsNiBAQAogCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKEVORVRfUlhfRlJTSVpFKTsKIAogCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQlyZWNlaXZlZCsrOwpAQCAtMjk0LDcgKzI5NCw4IEBACiAJCQkJc2tibiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOwogCQkJCWlmIChza2JuICE9IE5VTEwpIHsKIAkJCQkJc2tiX3Jlc2VydmUoc2tibiwgMik7CS8qIGFsaWduIElQIGhlYWRlciAqLwotCQkJCQltZW1jcHkoc2tibi0+ZGF0YSwgc2tiLT5kYXRhLCBwa3RfbGVuKTsKKwkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJCQkgICAgICBza2JuLT5kYXRhLCBwa3RfbGVuKTsKIAkJCQkJLyogc3dhcCAqLwogCQkJCQlza2J0ID0gc2tiOwogCQkJCQlza2IgPSBza2JuOwpAQCAtMzA0LDcgKzMwNSw2IEBACiAJCQkJc2tibiA9IGRldl9hbGxvY19za2IoRU5FVF9SWF9GUlNJWkUpOwogCiAJCQlpZiAoc2tibiAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCXJlY2VpdmVkKys7CkBAIC01MTYsNyArNTE2LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWZlcC0+cnhfc2tidWZmW2ldID0gc2tiOwotCQlza2ItPmRldiA9IGRldjsKIAkJQ0JEV19CVUZBRERSKGJkcCwKIAkJCWRtYV9tYXBfc2luZ2xlKGZlcC0+ZGV2LCBza2ItPmRhdGEsCiAJCQkJTDFfQ0FDSEVfQUxJR04oUEtUX01BWEJVRl9TSVpFKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCBkOTgxZDRjLi5iNjY2YTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC05NDIsMTggKzk0MiwxOCBAQAogCiAJLyogVGVsbCB0aGUgY29udHJvbGxlciB3aGF0IHRoZSBwcm90b2NvbCBpcyAqLwogCS8qIEFuZCBwcm92aWRlIHRoZSBhbHJlYWR5IGNhbGN1bGF0ZWQgcGhjcyAqLwotCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CiAJCWZsYWdzIHw9IFRYRkNCX1VEUDsKLQkJZmNiLT5waGNzID0gc2tiLT5oLnVoLT5jaGVjazsKKwkJZmNiLT5waGNzID0gdWRwX2hkcihza2IpLT5jaGVjazsKIAl9IGVsc2UKLQkJZmNiLT5waGNzID0gc2tiLT5oLnRoLT5jaGVjazsKKwkJZmNiLT5waGNzID0gdWRwX2hkcihza2IpLT5jaGVjazsKIAogCS8qIGwzb3MgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQogCSAqIGZyYW1lIChza2ItPmRhdGEpIGFuZCB0aGUgc3RhcnQgb2YgdGhlIElQIGhkci4KIAkgKiBsNG9zIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUKIAkgKiBsMyBoZHIgYW5kIHRoZSBsNCBoZHIgKi8KLQlmY2ItPmwzb3MgPSAodTE2KShza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSAtIEdNQUNfRkNCX0xFTik7Ci0JZmNiLT5sNG9zID0gKHUxNikoc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KTsKKwlmY2ItPmwzb3MgPSAodTE2KShza2JfbmV0d29ya19vZmZzZXQoc2tiKSAtIEdNQUNfRkNCX0xFTik7CisJZmNiLT5sNG9zID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOwogCiAJZmNiLT5mbGFncyA9IGZsYWdzOwogfQpAQCAtMTI5NSw4ICsxMjk1LDYgQEAKIAkgKi8KIAlza2JfcmVzZXJ2ZShza2IsIGFsaWduYW1vdW50KTsKIAotCXNrYi0+ZGV2ID0gZGV2OwotCiAJYmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsCiAJCQlwcml2LT5yeF9idWZmZXJfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCmluZGV4IGMzYzBkNjcuLjI1MjFiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYworKysgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKQEAgLTE1NjgsNyArMTU2OCw2IEBACiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcnhfY29weWJyZWFrIG5vbi16ZXJvICIKIAkJCQkgICJub3QgZ29vZCB3aXRoIFJYX0NIRUNLU1VNXG4iLCBkZXYtPm5hbWUpOwogI2VuZGlmCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhtcC0+cGNpX2RldiwKIAkJCQkJCQkgICAgaG1wLT5yeF9yaW5nW2VudHJ5XS5hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKaW5kZXggZDI1NDI2OS4uNjU2ZjI3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAl9CiAKIAlza2ItPnByb3RvY29sID0gYXgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9CUFEsIGJwcS0+ZGVzdF9hZGRyLCBOVUxMLCAwKTsKIAlicHEtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAlicHEtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKaW5kZXggMGZiYjQxNC4uM2JlOGM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKQEAgLTkzMCw3ICs5MzAsNyBAQAogCiAJLyogVHJhbnNmZXIgZGF0YSB0byBETUEgYnVmZmVyICovCiAJaSA9IHByaXYtPnR4X2hlYWQ7Ci0JbWVtY3B5KHByaXYtPnR4X2J1ZltpXSwgc2tiLT5kYXRhICsgMSwgc2tiLT5sZW4gLSAxKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEsIHByaXYtPnR4X2J1ZltpXSwgc2tiLT5sZW4gLSAxKTsKIAlwcml2LT50eF9sZW5baV0gPSBza2ItPmxlbiAtIDE7CiAKIAkvKiBDbGVhciBpbnRlcnJ1cHRzIHdoaWxlIHdlIHRvdWNoIG91ciBjaXJjdWxhciBidWZmZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKaW5kZXggZjVhMTdhZC4uYjMzYWRjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYwpAQCAtMzE3LDcgKzMxNyw5IEBACiAJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCW1lbWNweShzLT5oZGxjdHguYnVmZmVyLCBza2ItPmRhdGErMSwgcGt0X2xlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEsCisJCQkJCQkJIHMtPmhkbGN0eC5idWZmZXIsCisJCQkJCQkJIHBrdF9sZW4pOwogCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKIAkJCXMtPmhkbGN0eC5icCA9IHMtPmhkbGN0eC5idWZmZXI7CiAJCQlhcHBlbmRfY3JjX2NjaXR0KHMtPmhkbGN0eC5idWZmZXIsIHBrdF9sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwppbmRleCBlZTNlYTRmLi40Njc1NTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwpAQCAtNjM4LDcgKzYzOCw5IEBACiAgICAgICAgIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQltZW1jcHkoeXAtPnR4X2J1Ziwgc2tiLT5kYXRhICsgMSwgeXAtPnR4X2xlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEsCisJCQkJCQkJIHlwLT50eF9idWYsCisJCQkJCQkJIHlwLT50eF9sZW4pOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXlwLT50eF9jb3VudCA9IDA7CiAJCQl5cC0+dHhfY3JjbCA9IDB4MjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocDEwMC5jIGIvZHJpdmVycy9uZXQvaHAxMDAuYwppbmRleCA3ZGM1MTg1Li44MTE4YTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocDEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKQEAgLTE4MTYsNyArMTgxNiw2IEBACiAJCQl1X2NoYXIgKnB0cjsKIAogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwotCQkJc2tiLT5kZXYgPSBkZXY7CiAKIAkJCS8qIHB0ciB0byBzdGFydCBvZiB0aGUgc2tfYnVmZiBkYXRhIGFyZWEgKi8KIAkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuYwppbmRleCBkZDhhZDg3Li4zZDgyZDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jCkBAIC0xMzM4LDcgKzEzMzgsNyBAQAogCQkJZGV2X2tmcmVlX3NrYihkZXYtPnJ4X3NnX3NrYik7CiAJCQlkZXYtPnJ4X3NnX3NrYiA9IE5VTEw7CiAJCX0gZWxzZSB7Ci0JCQljYWNoZWFibGVfbWVtY3B5KGRldi0+cnhfc2dfc2tiLT50YWlsLAorCQkJY2FjaGVhYmxlX21lbWNweShza2JfdGFpbF9wb2ludGVyKGRldi0+cnhfc2dfc2tiKSwKIAkJCQkJIGRldi0+cnhfc2tiW3Nsb3RdLT5kYXRhLCBsZW4pOwogCQkJc2tiX3B1dChkZXYtPnJ4X3NnX3NrYiwgbGVuKTsKIAkJCWVtYWNfcmVjeWNsZV9yeF9za2IoZGV2LCBzbG90LCBsZW4pOwpAQCAtMTM5OCw3ICsxMzk4LDYgQEAKIAogCQlza2JfcHV0KHNrYiwgbGVuKTsKIAkgICAgICBwdXNoX3BhY2tldDoKLQkJc2tiLT5kZXYgPSBkZXYtPm5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldi0+bmRldik7CiAJCWVtYWNfcnhfY3N1bShkZXYsIHNrYiwgY3RybCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libWxhbmEuYyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwppbmRleCAzZjk0NmM4Li5mZTg1ZDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1sYW5hLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCkBAIC02MDEsNyArNjAxLDYgQEAKIAogCQkJCS8qIHNldCB1cCBza2IgZmllbGRzICovCiAKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCmluZGV4IDQ1OGRiMDUuLjA1NzNmY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKQEAgLTc5OCw3ICs3OTgsNiBAQAogCiAJCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOwogCQkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwotCQkJCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAKIAkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwkvKiBzZW5kIGl0IHVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwppbmRleCA0YWQ3ODA3Li5mNzQ5ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTYzMyw4ICs2MzMsNiBAQAogCiAJCQlpcC0+cnhfc2tic1tyeF9lbnRyeV0gPSBOVUxMOwkvKiBQb2lzb24gICovCiAKLQkJCW5ld19za2ItPmRldiA9IHByaXZfbmV0ZGV2KGlwKTsKLQogCQkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCiAJCQlza2JfcHV0KG5ld19za2IsICgxNjY0ICsgUlhfT0ZGU0VUKSk7CiAJCQlyeGIgPSAoc3RydWN0IGlvYzNfZXJ4YnVmICopIG5ld19za2ItPmRhdGE7CkBAIC05NDAsNyArOTM4LDYgQEAKIAkJCX0KIAogCQkJaXAtPnJ4X3NrYnNbaV0gPSBza2I7Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCiAJCQlza2JfcHV0KHNrYiwgKDE2NjQgKyBSWF9PRkZTRVQpKTsKQEAgLTEzOTYsOSArMTM5Myw5IEBACiAJICogbWFudWFsbHkuCiAJICovCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaW50IHByb3RvID0gbnRvaHMoc2tiLT5uaC5pcGgtPnByb3RvY29sKTsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppaCA9IGlwX2hkcihza2IpOworCQljb25zdCBpbnQgcHJvdG8gPSBudG9ocyhpaC0+cHJvdG9jb2wpOwogCQl1bnNpZ25lZCBpbnQgY3NvZmY7Ci0JCXN0cnVjdCBpcGhkciAqaWggPSBza2ItPm5oLmlwaDsKIAkJdWludDMyX3QgY3N1bSwgZWhzdW07CiAJCXVpbnQxNl90ICplaDsKIApAQCAtMTQyNSwxMSArMTQyMiwxMSBAQAogCQljc29mZiA9IEVUSF9ITEVOICsgKGloLT5paGwgPDwgMik7CiAJCWlmIChwcm90byA9PSBJUFBST1RPX1VEUCkgewogCQkJY3NvZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOwotCQkJc2tiLT5oLnVoLT5jaGVjayA9IGNzdW07CisJCQl1ZHBfaGRyKHNrYiktPmNoZWNrID0gY3N1bTsKIAkJfQogCQlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKIAkJCWNzb2ZmICs9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPSBjc3VtOworCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IGNzdW07CiAJCX0KIAogCQl3MCA9IEVUWERfRE9DSEVDS1NVTSB8IChjc29mZiA8PCBFVFhEX0NIS09GRl9TSElGVCk7CkBAIC0xNDQ2LDcgKzE0NDMsNyBAQAogCiAJaWYgKGxlbiA8PSAxMDQpIHsKIAkJLyogU2hvcnQgcGFja2V0LCBsZXQncyBjb3B5IGl0IGRpcmVjdGx5IGludG8gdGhlIHJpbmcuICAqLwotCQltZW1jcHkoZGVzYy0+ZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBkZXNjLT5kYXRhLCBza2ItPmxlbik7CiAJCWlmIChsZW4gPCBFVEhfWkxFTikgewogCQkJLyogVmVyeSBzaG9ydCBwYWNrZXQsIHBhZCB3aXRoIHplcm9zIGF0IHRoZSBlbmQuICovCiAJCQltZW1zZXQoZGVzYy0+ZGF0YSArIGxlbiwgMCwgRVRIX1pMRU4gLSBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCmluZGV4IGNlYmY4YzMuLmY5Yzg4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKQEAgLTE0NzIsOSArMTQ3Miw4IEBACiAKIAlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAotCW1lbWNweShzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsIHNrYi0+ZGF0YSwgCi0JICAgICAgIHNrYi0+bGVuKTsKLQkKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LAorCQkgICAgICBza2ItPmxlbik7CiAJc2VsZi0+dHhfZmlmby5sZW4rKzsKIAlzZWxmLT50eF9maWZvLmZyZWUrKzsKIApAQCAtMTkyNCw3ICsxOTIzLDcgQEAKIAkJCQogCQkJLyogQ29weSBmcmFtZSB3aXRob3V0IENSQywgQ1JDIGlzIHJlbW92ZWQgYnkgaGFyZHdhcmUqLwogCQkJc2tiX3B1dChza2IsIGxlbik7Ci0JCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuKTsKIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwpAQCAtMTkzMiw3ICsxOTMxLDcgQEAKIAkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0JCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwppbmRleCAzNzkxNGRjLi40ZGJkZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAJCiAJaWYgKGF1cC0+c3BlZWQgPT0gNDAwMDAwMCkgewogCQkvKiBGSVIgKi8KLQkJbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBwREItPnZhZGRyLCBza2ItPmxlbik7CiAJCXB0eGQtPmNvdW50XzAgPSBza2ItPmxlbiAmIDB4ZmY7CiAJCXB0eGQtPmNvdW50XzEgPSAoc2tiLT5sZW4gPj4gOCkgJiAweGZmOwogCkBAIC02MDQsOSArNjA0LDkgQEAKIAkJCQlza2JfcHV0KHNrYiwgY291bnQpOwogCQkJZWxzZQogCQkJCXNrYl9wdXQoc2tiLCBjb3VudC0yKTsKLQkJCW1lbWNweShza2ItPmRhdGEsICh2b2lkICopcERCLT52YWRkciwgY291bnQtMik7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHBEQi0+dmFkZHIsIGNvdW50IC0gMik7CiAJCQlza2ItPmRldiA9IGRldjsKLQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCQluZXRpZl9yeChza2IpOwogCQkJcHJ4ZC0+Y291bnRfMCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKaW5kZXggMTFhZjBhZS4uM2NhNDdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYwpAQCAtMTExOSw3ICsxMTE5LDcgQEAKICAgZWxzZQogICAgIHsKICAgICAgIGxlbiA9IHNrYi0+bGVuOwotICAgICAgbWVtY3B5IChzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIHNrYi0+ZGF0YSwgbGVuKTsKKyAgICAgIHNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIGxlbik7CiAgICAgfQogICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9IGxlbiAmIDB4MGZmZjsKIApAQCAtMTI4MiwxMSArMTI4MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgIHNrYl9yZXNlcnZlIChza2IsIDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgc2tiX3B1dCAoc2tiLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZzW3NlbGYtPnJ4c10sIGxlbik7Ci0KKyAgICAgICAgICAgICAgICAgICAgICBza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwKKwkJCQkJICAgICAgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0gICAgICAgICAgICAgICAgICAgICAgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworICAgICAgICAgICAgICAgICAgICAgIHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zIChFVEhfUF9JUkRBKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDFkNTEwYmQuLjBhYzI0MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQlnb3RvIGRyb3A7CiAJfQogCi0JbWVtY3B5KHNlbGYtPnR4X2J1ZmYgKyBzZWxmLT5oZWFkZXJfbGVuZ3RoLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+dHhfYnVmZiArIHNlbGYtPmhlYWRlcl9sZW5ndGgsIHNrYi0+bGVuKTsKIAogCS8qIENoYW5nZSBzZXR0aW5nIGZvciBuZXh0IGZyYW1lICovCiAJaWYgKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU1RJUjQyMVgpIHsKQEAgLTkwMiw3ICs5MDIsNyBAQAogCiAJaWYoZG9jb3B5KSB7CiAJCS8qIENvcHkgcGFja2V0LCBzbyB3ZSBjYW4gcmVjeWNsZSB0aGUgb3JpZ2luYWwgKi8KLQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmV3c2tiLT5kYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkvKiBEZWxpdmVyIHRoaXMgbmV3IHNrYiAqLwogCQlkYXRhc2tiID0gbmV3c2tiOwogCQkvKiBBbmQgaG9vayB0aGUgb2xkIHNrYiB0byB0aGUgVVJCCkBAIC05MjEsNyArOTIxLDcgQEAKIAogCS8qIEFzayB0aGUgbmV0d29ya2luZyBsYXllciB0byBxdWV1ZSB0aGUgcGFja2V0IGZvciB0aGUgSXJEQSBzdGFjayAqLwogCWRhdGFza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQlkYXRhc2tiLT5tYWMucmF3ICA9IGRhdGFza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoZGF0YXNrYik7CiAJZGF0YXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAlsZW4gPSBkYXRhc2tiLT5sZW47CiAJbmV0aWZfcngoZGF0YXNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCmluZGV4IGYwYzYxZjMuLjBkZTg2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCkBAIC0yMDAsMTQgKzIwMCwxNCBAQAogLyogU2V0dXAgYSBjb21tdW5pY2F0aW9uIGJldHdlZW4gbWNzNzc4MCBhbmQgYWdpbGVudCBjaGlwLiAqLwogc3RhdGljIGlubGluZSBpbnQgbWNzX3NldHVwX3RyYW5zY2VpdmVyX2FnaWxlbnQoc3RydWN0IG1jc19jYiAqbWNzKQogewotCUlSREFfV0FSTklORygiVGhpcyB0cmFuc2NlaXZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOworCUlSREFfV0FSTklORygiVGhpcyB0cmFuc2NlaXZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7CiAJcmV0dXJuIDE7CiB9CiAKIC8qIFNldHVwIGEgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG1jczc3ODAgYW5kIHNoYXJwIGNoaXAuICovCiBzdGF0aWMgaW5saW5lIGludCBtY3Nfc2V0dXBfdHJhbnNjZWl2ZXJfc2hhcnAoc3RydWN0IG1jc19jYiAqbWNzKQogewotCUlSREFfV0FSTklORygiVGhpcyB0cmFuc2NlaXZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOworCUlSREFfV0FSTklORygiVGhpcyB0cmFuc2NlaXZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTI3OSw3ICsyNzksNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUlSREFfV0FSTklORygiVW5rbm93biB0cmFuc2NlaXZlciB0eXBlOiAlZCIsCisJCUlSREFfV0FSTklORygiVW5rbm93biB0cmFuc2NlaXZlciB0eXBlOiAlZFxuIiwKIAkJCSAgICAgbWNzLT50cmFuc2NlaXZlcl90eXBlKTsKIAkJcmV0ID0gMTsKIAl9CkBAIC0zMTgsNyArMzE4LDcgQEAKIAkJcmV0dXJuIHJldDsKIAogZXJyb3I6Ci0JSVJEQV9FUlJPUigiJXMiLCBtc2cpOworCUlSREFfRVJST1IoIiVzXG4iLCBtc2cpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM1Myw3ICszNTMsNyBAQAogCWJ1ZlswXSA9IGxlbiAmIDB4ZmY7CiAJYnVmWzFdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CiAJLyogY29weSB0aGUgZGF0YSBpbnRvIHRoZSB0eCBidWZmZXIuICovCi0JbWVtY3B5KGJ1ZisyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgYnVmICsgMiwgc2tiLT5sZW4pOwogCS8qIHB1dCB0aGUgZmNzIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4gKi8KIAlidWZbbGVuIC0gNF0gPSBmY3MgJiAweGZmOwogCWJ1ZltsZW4gLSAzXSA9IChmY3MgPj4gOCkgJiAweGZmOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJYnVmWzBdID0gbGVuICYgMHhmZjsKIAlidWZbMV0gPSAobGVuID4+IDgpICYgMHhmZjsKIAkvKiBjb3B5IHRoZSBkYXRhICovCi0JbWVtY3B5KGJ1ZisyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgYnVmICsgMiwgc2tiLT5sZW4pOwogCS8qIHB1dCB0aGUgZmNzIGluIGxhc3QgdHdvIGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuICovCiAJYnVmW2xlbiAtIDJdID0gZmNzICYgMHhmZjsKIAlidWZbbGVuIC0gMV0gPSAoZmNzID4+IDgpICYgMHhmZjsKQEAgLTQyNiw5ICs0MjYsOSBAQAogCX0KIAogCXNrYl9yZXNlcnZlKHNrYiwgMSk7Ci0JbWVtY3B5KHNrYi0+ZGF0YSwgYnVmLCBuZXdfbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGJ1ZiwgbmV3X2xlbik7CiAJc2tiX3B1dChza2IsIG5ld19sZW4pOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAlza2ItPmRldiA9IG1jcy0+bmV0ZGV2OwogCkBAIC00NzksOSArNDc5LDkgQEAKIAl9CiAKIAlza2JfcmVzZXJ2ZShza2IsIDEpOwotCW1lbWNweShza2ItPmRhdGEsIGJ1ZiwgbmV3X2xlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBidWYsIG5ld19sZW4pOwogCXNrYl9wdXQoc2tiLCBuZXdfbGVuKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJc2tiLT5kZXYgPSBtY3MtPm5ldGRldjsKIApAQCAtNTg3LDcgKzU4Nyw3IEBACiAJfSB3aGlsZShjbnQrKyA8IDEwMCAmJiAocnZhbCAmIE1DU19JUklOVFgpKTsKIAogCWlmKGNudCA+PSAxMDApIHsKLQkJSVJEQV9FUlJPUigidW5hYmxlIHRvIGNoYW5nZSBzcGVlZCIpOworCQlJUkRBX0VSUk9SKCJ1bmFibGUgdG8gY2hhbmdlIHNwZWVkXG4iKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC02MzgsNyArNjM4LDcgQEAKIAogCQlkZWZhdWx0OgogCQkJcmV0ID0gMTsKLQkJCUlSREFfV0FSTklORygiVW5rbm93biB0cmFuc2NlaXZlciB0eXBlOiAlZCIsCisJCQlJUkRBX1dBUk5JTkcoIlVua25vd24gdHJhbnNjZWl2ZXIgdHlwZTogJWRcbiIsCiAJCQkJICAgICBtY3MtPnRyYW5zY2VpdmVyX3R5cGUpOwogCQl9CiAJaWYgKHVubGlrZWx5KHJldCkpCkBAIC03MzMsNyArNzMzLDcgQEAKIAlzcHJpbnRmKGh3bmFtZSwgInVzYiMlZCIsIG1jcy0+dXNiZGV2LT5kZXZudW0pOwogCW1jcy0+aXJsYXAgPSBpcmxhcF9vcGVuKG5ldGRldiwgJm1jcy0+cW9zLCBod25hbWUpOwogCWlmICghbWNzLT5pcmxhcCkgewotCQlJUkRBX0VSUk9SKCJtY3M3NzgwOiBpcmxhcF9vcGVuIGZhaWxlZCIpOworCQlJUkRBX0VSUk9SKCJtY3M3NzgwOiBpcmxhcF9vcGVuIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3IyOwogCX0KIApAQCAtODYyLDcgKzg2Miw3IEBACiAJCQkgIG1jcy0+b3V0X2J1Ziwgd3JhcGxlbiwgbWNzX3NlbmRfaXJxLCBtY3MpOwogCiAJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihtY3MtPnR4X3VyYiwgR0ZQX0FUT01JQykpKSB7Ci0JCUlSREFfRVJST1IoImZhaWxlZCB0eF91cmI6ICVkIiwgcmV0KTsKKwkJSVJEQV9FUlJPUigiZmFpbGVkIHR4X3VyYjogJWRcbiIsIHJldCk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgLUVOT0RFVjoKIAkJY2FzZSAtRVBJUEU6CkBAIC04OTcsNyArODk3LDcgQEAKIAlpZiAoIW5kZXYpCiAJCWdvdG8gZXJyb3IxOwogCi0JSVJEQV9ERUJVRygxLCAiTUNTNzc4MCBVU0ItSXJEQSBicmlkZ2UgZm91bmQgYXQgJWQuIiwgdWRldi0+ZGV2bnVtKTsKKwlJUkRBX0RFQlVHKDEsICJNQ1M3NzgwIFVTQi1JckRBIGJyaWRnZSBmb3VuZCBhdCAlZC5cbiIsIHVkZXYtPmRldm51bSk7CiAKIAkvKiB3aGF0IGlzIGl0IHJlYWx5IGZvcj8gKi8KIAlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOwpAQCAtOTA1LDcgKzkwNSw3IEBACiAKIAlyZXQgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbih1ZGV2KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJSVJEQV9FUlJPUigibWNzNzc4MDogdXNiIHJlc2V0IGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisJCUlSREFfRVJST1IoIm1jczc3ODA6IHVzYiByZXNldCBjb25maWd1cmF0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3IyOwogCX0KIApAQCAtOTUwLDcgKzk1MCw3IEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycm9yMjsKIAotCUlSREFfREVCVUcoMSwgIklyREE6IFJlZ2lzdGVyZWQgTW9zQ2hpcCBNQ1M3NzgwIGRldmljZSBhcyAlcyIsCisJSVJEQV9ERUJVRygxLCAiSXJEQTogUmVnaXN0ZXJlZCBNb3NDaGlwIE1DUzc3ODAgZGV2aWNlIGFzICVzXG4iLAogCQkgICBuZGV2LT5uYW1lKTsKIAogCW1jcy0+dHJhbnNjZWl2ZXJfdHlwZSA9IHRyYW5zY2VpdmVyX3R5cGU7CkBAIC05ODEsNyArOTgxLDcgQEAKIAlmcmVlX25ldGRldihtY3MtPm5ldGRldik7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCUlSREFfREVCVUcoMCwgIk1DUzc3ODAgbm93IGRpc2Nvbm5lY3RlZC4iKTsKKwlJUkRBX0RFQlVHKDAsICJNQ1M3NzgwIG5vdyBkaXNjb25uZWN0ZWQuXG4iKTsKIH0KIAogLyogTW9kdWxlIGluc2VydGlvbiAqLwpAQCAtOTkyLDcgKzk5Miw3IEBACiAJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwogCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmbWNzX2RyaXZlcik7CiAJaWYgKHJlc3VsdCkKLQkJSVJEQV9FUlJPUigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKKwkJSVJEQV9FUlJPUigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwppbmRleCAyOWI1Y2NkLi5kOTZjODk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCkBAIC0xNDY2LDkgKzE0NjYsOCBAQAogCiAJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKLQltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsIAotCSAgICAgICBza2ItPmxlbik7Ci0JCisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwKKwkJICAgICAgc2tiLT5sZW4pOwogCXNlbGYtPnR4X2ZpZm8ubGVuKys7CiAJc2VsZi0+dHhfZmlmby5mcmVlKys7CiAKQEAgLTE4NjksMTAgKzE4NjgsMTQgQEAKIAkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMgKi8KIAkJCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApIHsKIAkJCQlza2JfcHV0KHNrYiwgbGVuLTIpOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTIpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQlzZWxmLT5yeF9idWZmLmRhdGEsCisJCQkJCQkJbGVuIC0gMik7CiAJCQl9IGVsc2UgewogCQkJCXNrYl9wdXQoc2tiLCBsZW4tNCk7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tNCk7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSwKKwkJCQkJCQlsZW4gLSA0KTsKIAkJCX0KIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCkBAIC0xODgxLDcgKzE4ODQsNyBAQAogCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwogCiAJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQkJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCQkJbmV0aWZfcngoc2tiKTsKIAkJCXNlbGYtPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IDIyNzIxNTYuLmZiMTk2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0zODYsMTIgKzM4NiwxMiBAQAogCiAJCS8qIEFsaWduIElQIGhlYWRlciB0byAyMCBieXRlcyAgKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2ktPmRtYV9yeF9idWZmLCBsZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNpLT5kbWFfcnhfYnVmZiwgbGVuKTsKIAkJc2tiX3B1dChza2IsIGxlbik7CiAKIAkJLyogRmVlZCBpdCB0byBJckxBUCAgKi8KIAkJc2tiLT5kZXYgPSBkZXY7Ci0JCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJbmV0aWZfcngoc2tiKTsKIApAQCAtNDg0LDcgKzQ4NCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CiAKIAkJc2ktPmRtYV90eF9idWZmX2xlbiA9IHNrYi0+bGVuOwotCQltZW1jcHkoc2ktPmRtYV90eF9idWZmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNpLT5kbWFfdHhfYnVmZiwgc2tiLT5sZW4pOwogCiAJCWlmIChtdHQpCiAJCQl3aGlsZSAoKHVuc2lnbmVkKShPU0NSIC0gc2ktPmxhc3Rfb3NjcikvNCA8IG10dCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCmluZGV4IDkzNzM3MmQuLjA1NjYzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAKIAkJc2tiX3B1dChza2IsIGxlbik7CiAJCXNrYi0+ZGV2ID0gZGV2OwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJc2ktPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJc2ktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggMzFjNjIzMy4uMTk4YmYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTMxNSw2ICszMTUsNyBAQAogewogCS8qIEJhc2UgYWRkcmVzcyAweDJFIG9yIDB4NEUgKi8KIAl7ICI0N04yMjciLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg1YSwgMHgwMCB9LAorCXsgIjQ3TjIyNyIsCUtFWTU1XzF8RklSfFNFUng0LAkweDdhLCAweDAwIH0sCiAJeyAiNDdOMjY3IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NWUsIDB4MDAgfSwKIAl7IE5VTEwgfQogfTsKQEAgLTExNjEsNyArMTE2Miw3IEBACiAJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOwogCX0KIAotCW1lbWNweShzZWxmLT50eF9idWZmLmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9idWZmLmhlYWQsIHNrYi0+bGVuKTsKIAogCXNlbGYtPnR4X2J1ZmYubGVuID0gc2tiLT5sZW47CiAJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOwpAQCAtMTQxMiw3ICsxNDEzLDcgQEAKIAlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKIAlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCW5ldGlmX3J4KHNrYik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKaW5kZXggMjBkMzA2Zi4uNzU1YWE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpAQCAtNTIsNyArNTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgotI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CkBAIC0zNDksNyArMzQ4LDcgQEAKIAkJfQogCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKIAkJc2tiID0gbnNrYjsKLQkJbWVtY3B5KG5za2ItPmRhdGEsIHJ4X2J1ZmYtPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKG5za2IsIHJ4X2J1ZmYtPmRhdGEsIGxlbik7CiAJfSBlbHNlIHsKIAkJbnNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmZi0+dHJ1ZXNpemUpOwogCQlpZiAodW5saWtlbHkoIW5za2IpKSB7CkBAIC0zNjQsNyArMzYzLDcgQEAKIAogCXNrYl9wdXQoc2tiLCBsZW4pOwogCi0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAlza2ItPmRldiA9IHN0aXItPm5ldGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCmluZGV4IGMzZWQ5YjMuLmZmNTM1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKQEAgLTkyNSw4ICs5MjUsOCBAQAogCiAJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOwogCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwotCW1lbWNweShzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsIHNrYi0+ZGF0YSwKLQkgICAgICAgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkgICAgICBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsIHNrYi0+bGVuKTsKIAlzZWxmLT50eF9maWZvLmxlbisrOwogCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOwogLy9GMDEgICBpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgewpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJbmV0aWZfcngoc2tiKTsKIAkJcmV0dXJuIFRSVUU7CkBAIC0xMTg5LDcgKzExODksNyBAQAogCQlza2JfcmVzZXJ2ZShza2IsIDEpOwogCQlza2JfcHV0KHNrYiwgbGVuIC0gNCk7CiAKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0KTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOwogCQlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXgucnhfYnVmZj0lcFxuIiwgX19GVU5DVElPTl9fLAogCQkJICAgbGVuIC0gNCwgc2VsZi0+cnhfYnVmZi5kYXRhKTsKIApAQCAtMTE5OCw3ICsxMTk4LDcgQEAKIAkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJbmV0aWZfcngoc2tiKTsKIApAQCAtMTIzNCw3ICsxMjM0LDcgQEAKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCAxKTsKIAlza2JfcHV0KHNrYiwgbGVuIC0gNCArIDEpOwotCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCArIDEpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0ICsgMSk7CiAJc3RfZmlmby0+dGFpbCsrOwogCXN0X2ZpZm8tPmxlbisrOwogCWlmIChzdF9maWZvLT50YWlsID4gTUFYX1JYX1dJTkRPVykKQEAgLTEyNDQsNyArMTI0NCw3IEBACiAJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJbmV0aWZfcngoc2tiKTsKIAlpZiAoc3RfZmlmby0+bGVuIDwgKE1BWF9SWF9XSU5ET1cgKyAyKSkgewpAQCAtMTMwMyw3ICsxMzAzLDcgQEAKIAkJCX0KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CiAJCQlza2JfcHV0KHNrYiwgbGVuIC0gNCk7Ci0JCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOwogCiAJCQlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXguaGVhZD0leFxuIiwgX19GVU5DVElPTl9fLAogCQkJCSAgIGxlbiAtIDQsIHN0X2ZpZm8tPmhlYWQpOwpAQCAtMTMxMyw3ICsxMzEzLDcgQEAKIAkJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCX0JCS8vd2hpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKaW5kZXggMzQ1N2U5ZC4uYzRiZTk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKQEAgLTU5NSw3ICs1OTUsNyBAQAogCXJkLT5za2IgPSBOVUxMOwogCXNrYi0+ZGV2ID0gbmRldjsKIAltZW1jcHkoc2tiX3B1dChza2IsbGVuKSwgcmQtPmJ1ZiwgbGVuKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlpZiAoaW5faW50ZXJydXB0KCkpCiAJCW5ldGlmX3J4KHNrYik7CiAJZWxzZQpAQCAtOTkzLDcgKzk5Myw3IEBACiAJCQlnb3RvIGRyb3A7CiAJCX0KIAkJZWxzZQotCQkJbWVtY3B5KHJkLT5idWYsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCByZC0+YnVmLCBsZW4pOwogCX0KIAogCXJkLT5za2IgPSBza2I7CQkJLyogcmVtZW1iZXIgc2tiIGZvciB0eC1jb21wbGV0ZSBzdGF0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCmluZGV4IDQyMTI2NTcuLjUxODJlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKQEAgLTUyOSw3ICs1MjksNyBAQAogCS8qIERlY2lkZSBpZiB3ZSBzaG91bGQgdXNlIFBJTyBvciBETUEgdHJhbnNmZXIgKi8KIAlpZiAoc2VsZi0+aW8uc3BlZWQgPiBQSU9fTUFYX1NQRUVEKSB7CiAJCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKLQkJbWVtY3B5KHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIHNrYi0+bGVuKTsKIAkJc2VsZi0+dHhfYnVmZi5sZW4gPSBza2ItPmxlbjsKIAkJCiAJCW10dCA9IGlyZGFfZ2V0X210dChza2IpOwpAQCAtOTA4LDEwICs5MDgsMTQgQEAKIAkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMgKi8KIAkJCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApIHsKIAkJCQlza2JfcHV0KHNrYiwgbGVuLTIpOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTIpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQlzZWxmLT5yeF9idWZmLmRhdGEsCisJCQkJCQkJbGVuIC0gMik7CiAJCQl9IGVsc2UgewogCQkJCXNrYl9wdXQoc2tiLCBsZW4tNCk7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tNCk7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSwKKwkJCQkJCQlsZW4gLSA0KTsKIAkJCX0KIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCkBAIC05MTksNyArOTIzLDcgQEAKIAkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCQogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0JCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwppbmRleCAwZTliYTNjLi4zNDdkNTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwpAQCAtMTU0MCw3ICsxNTQwLDYgQEAKIAkJfQogCiAJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCQluZXRpZl9yeChza2IpOwkvKiBzZW5kIGl0IHVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwppbmRleCBhZmMyZWM3Li5kZmRlODBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTExODIsMjQgKzExODIsMjcgQEAKIAogCWlmIChsaWtlbHkoc2tiX2lzX2dzbyhza2IpKSkgewogCQlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgewogCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CiAJCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gMDsKLQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5oLnRoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCQkgICAgICAwLCBJUFBST1RPX1RDUCwgMCk7Ci0JCWlwY3NzID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7Ci0JCWlwY3NvID0gKHZvaWQgKikmKHNrYi0+bmguaXBoLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKLQkJaXBjc2UgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gMTsKLQkJdHVjc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCQl0dWNzbyA9ICh2b2lkICopJihza2ItPmgudGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJaXBoLT50b3RfbGVuID0gMDsKKwkJaXBoLT5jaGVjayA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkgaXBoLT5kYWRkciwgMCwKKwkJCQkJCQkgSVBQUk9UT19UQ1AsIDApOworCQlpcGNzcyA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCQlpcGNzbyA9ICh2b2lkICopJihpcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzZSA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLSAxOworCQl0dWNzcyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCXR1Y3NvID0gKHZvaWQgKikmKHRjcF9oZHIoc2tiKS0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CiAJCXR1Y3NlID0gMDsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKQEAgLTEyNDMsNyArMTI0Niw3IEBACiAKIAlpZihsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKIAkJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKLQkJY3NzID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJY3NzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAkJY3NvID0gY3NzICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKQEAgLTIwMTQsOSArMjAxNywxMiBAQAogCQkJICAgIG5ldGRldl9hbGxvY19za2IobmV0ZGV2LCBsZW5ndGggKyBORVRfSVBfQUxJR04pOwogCQkJaWYgKG5ld19za2IpIHsKIAkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBORVRfSVBfQUxJR04pOwotCQkJCW1lbWNweShuZXdfc2tiLT5kYXRhIC0gTkVUX0lQX0FMSUdOLAotCQkJCSAgICAgICBza2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCi0JCQkJICAgICAgIGxlbmd0aCArIE5FVF9JUF9BTElHTik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KG5ld19za2IsCisJCQkJCQkJICAgICAgIC1ORVRfSVBfQUxJR04sCisJCQkJCQkJICAgICAgIChza2ItPmRhdGEgLQorCQkJCQkJCSAgICAgICAgTkVUX0lQX0FMSUdOKSwKKwkJCQkJCQkgICAgICAgKGxlbmd0aCArCisJCQkJCQkJICAgICAgICBORVRfSVBfQUxJR04pKTsKIAkJCQkvKiBzYXZlIHRoZSBza2IgaW4gYnVmZmVyX2luZm8gYXMgZ29vZCAqLwogCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CiAJCQkJc2tiID0gbmV3X3NrYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMgYi9kcml2ZXJzL25ldC9peHAyMDAwL2l4cGRldi5jCmluZGV4IGE0ZWNjYjEuLjY2ODNhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXhwMjAwMC9peHBkZXYuYwpAQCAtMTEwLDExICsxMTAsMTAgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGRlc2MtPnBrdF9sZW5ndGggKyAyKTsKIAkJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKLQkJCXNrYi0+ZGV2ID0gbmRzW2Rlc2MtPmNoYW5uZWxdOwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBidWYsIGRlc2MtPnBrdF9sZW5ndGgsIDApOwogCQkJc2tiX3B1dChza2IsIGRlc2MtPnBrdF9sZW5ndGgpOwotCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRzW2Rlc2MtPmNoYW5uZWxdKTsKIAogCQkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwppbmRleCBhMzg0MzMyLi4wZmU5NmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTk4OCw3ICs5ODgsNyBAQAogCQlpZiAobGFuY2VfZGVidWcgPiA1KQogCQkJcHJpbnRrKCIlczogYm91bmNpbmcgYSBoaWdoLW1lbW9yeSBwYWNrZXQgKCUjeCkuXG4iLAogCQkJCSAgIGRldi0+bmFtZSwgKHUzMilpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKSk7Ci0JCW1lbWNweSgmbHAtPnR4X2JvdW5jZV9idWZmc1tlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmxwLT50eF9ib3VuY2VfYnVmZnNbZW50cnldLCBza2ItPmxlbik7CiAJCWxwLT50eF9yaW5nW2VudHJ5XS5iYXNlID0KIAkJCSgodTMyKWlzYV92aXJ0X3RvX2J1cygobHAtPnR4X2JvdW5jZV9idWZmcyArIGVudHJ5KSkgJiAweGZmZmZmZikgfCAweDgzMDAwMDAwOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMTg0LDcgKzExODQsNiBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMgYi9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKaW5kZXggNDUyODYzZC4uMGVkY2QxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwpAQCAtODAxLDcgKzgwMSw2IEBACiAJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCX0KIAkJCWVsc2UgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCWlmICghcnhfaW5fcGxhY2UpIHsKIAkJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgZGF0YSBmaWVsZHMgKi8KIAkJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobHAtPmRldiwgKGRtYV9hZGRyX3QpV1NXQVBjaGFyKHJiZC0+Yl9kYXRhKSwgUEtUX0JVRl9TWiwgRE1BX0ZST01fREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwppbmRleCBlNzI2YzA2Li41Yzg2ZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9saWI4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC03MjIsNyArNzIyLDYgQEAKIAkJCWVsc2UKIAkJCXsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKIAkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKaW5kZXggMmI3MzlmZC4uNmJhNmVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYworKysgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCkBAIC03NSw4ICs3NSw5IEBACiAjaWZkZWYgTE9PUEJBQ0tfVFNPCiBzdGF0aWMgdm9pZCBlbXVsYXRlX2xhcmdlX3NlbmRfb2ZmbG9hZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciopKHNrYi0+bmgucmF3ICsgKGlwaC0+aWhsICogNCkpOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCSAgICAgIChpcGgtPmlobCAqIDQpKTsKIAl1bnNpZ25lZCBpbnQgZG9mZnNldCA9IChpcGgtPmlobCArIHRoLT5kb2ZmKSAqIDQ7CiAJdW5zaWduZWQgaW50IG10dSA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKyBkb2Zmc2V0OwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwpAQCAtOTAsMTAgKzkxLDExIEBACiAJCWlmICghbnNrYikKIAkJCWJyZWFrOwogCQlza2JfcmVzZXJ2ZShuc2tiLCAzMik7Ci0JCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5kYXRhIC0gMTQ7Ci0JCW5za2ItPm5oLnJhdyA9IG5za2ItPmRhdGE7Ci0JCWlwaCA9IG5za2ItPm5oLmlwaDsKLQkJbWVtY3B5KG5za2ItPmRhdGEsIHNrYi0+bmgucmF3LCBkb2Zmc2V0KTsKKwkJc2tiX3NldF9tYWNfaGVhZGVyKG5za2IsIC1FVEhfSExFTik7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihuc2tiKTsKKwkJaXBoID0gaXBfaGRyKG5za2IpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShuc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwKKwkJCQkJZG9mZnNldCk7CiAJCWlmIChza2JfY29weV9iaXRzKHNrYiwKIAkJCQkgIGRvZmZzZXQgKyBvZmZzZXQsCiAJCQkJICBuc2tiLT5kYXRhICsgZG9mZnNldCwKQEAgLTEwOCw3ICsxMTAsNyBAQAogCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CiAJCW5za2ItPnBrdF90eXBlID0gc2tiLT5wa3RfdHlwZTsKIAotCQl0aCA9IChzdHJ1Y3QgdGNwaGRyKikobnNrYi0+bmgucmF3ICsgaXBoLT5paGwqNCk7CisJCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKG5za2IpICsgaXBoLT5paGwgKiA0KTsKIAkJaXBoLT50b3RfbGVuID0gaHRvbnMoZnJhZ19zaXplICsgZG9mZnNldCk7CiAJCWlwaC0+aWQgPSBodG9ucyhpZCk7CiAJCWlwaC0+Y2hlY2sgPSAwOwpAQCAtMTM3LDcgKzEzOSw2IEBACiAJc2tiX29ycGhhbihza2IpOwogCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotCXNrYi0+ZGV2ID0gZGV2OwogI2lmbmRlZiBMT09QQkFDS19NVVNUX0NIRUNLU1VNCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKICNlbmRpZgpAQCAtMTQ1LDcgKzE0Niw3IEBACiAjaWZkZWYgTE9PUEJBQ0tfVFNPCiAJaWYgKHNrYl9pc19nc28oc2tiKSkgewogCQlCVUdfT04oc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpOwotCQlCVUdfT04oc2tiLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKTsKKwkJQlVHX09OKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCk7CiAKIAkJZW11bGF0ZV9sYXJnZV9zZW5kX29mZmxvYWQoc2tiKTsKIAkJcmV0dXJuIDA7CkBAIC0xNjMsMTEgKzE2NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsb29wYmFja19zdGF0czsKLQogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbG9vcGJhY2tfc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJdW5zaWduZWQgbG9uZyBieXRlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBwYWNrZXRzID0gMDsKIAlpbnQgaTsKQEAgLTIwNyw3ICsyMDYsNiBAQAogc3RydWN0IG5ldF9kZXZpY2UgbG9vcGJhY2tfZGV2ID0gewogCS5uYW1lCSAJCT0gImxvIiwKIAkuZ2V0X3N0YXRzCQk9ICZnZXRfc3RhdHMsCi0JLnByaXYJCQk9ICZsb29wYmFja19zdGF0cywKIAkubXR1CQkJPSAoMTYgKiAxMDI0KSArIDIwICsgMjAgKyAxMiwKIAkuaGFyZF9zdGFydF94bWl0CT0gbG9vcGJhY2tfeG1pdCwKIAkuaGFyZF9oZWFkZXIJCT0gZXRoX2hlYWRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xwNDg2ZS5jIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKaW5kZXggMTc3YzUwMi4uNWZjMThkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbHA0ODZlLmMKKysrIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKQEAgLTY3Niw3ICs2NzYsNiBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAotCQlza2ItPmRldiA9IGRldjsKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLHBrdF9sZW4pLCByZmQtPmRhdGEsIHBrdF9sZW4pOwogCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzg5eDAuYyBiL2RyaXZlcnMvbmV0L21hYzg5eDAuYwppbmRleCBlOTYwMTM4Li45MGU2OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODl4MC5jCkBAIC01MzAsNyArNTMwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQlza2ItPmRldiA9IGRldjsKIAogCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBkZXYtPm1lbV9zdGFydCArIFBQX1J4RnJhbWUsIGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuYyBiL2RyaXZlcnMvbmV0L21hY2IuYwppbmRleCAyZTk1NzFiLi4wZTA0ZjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5jCkBAIC0zNTcsNyArMzU3LDYgQEAKIAl9CiAKIAlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7Ci0Jc2tiLT5kZXYgPSBicC0+ZGV2OwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAlza2JfcHV0KHNrYiwgbGVuKTsKIApAQCAtMzY4LDkgKzM2NywxMCBAQAogCQkJQlVHX09OKGZyYWcgIT0gbGFzdF9mcmFnKTsKIAkJCWZyYWdfbGVuID0gbGVuIC0gb2Zmc2V0OwogCQl9Ci0JCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsCi0JCSAgICAgICBicC0+cnhfYnVmZmVycyArIChSWF9CVUZGRVJfU0laRSAqIGZyYWcpLAotCQkgICAgICAgZnJhZ19sZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsCisJCQkJCSAgICAgICAoYnAtPnJ4X2J1ZmZlcnMgKworCQkJCQkgICAgICAgIChSWF9CVUZGRVJfU0laRSAqIGZyYWcpKSwKKwkJCQkJICAgICAgIGZyYWdfbGVuKTsKIAkJb2Zmc2V0ICs9IFJYX0JVRkZFUl9TSVpFOwogCQlicC0+cnhfcmluZ1tmcmFnXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKIAkJd21iKCk7CkBAIC01NzYsNyArNTc2LDggQEAKIAlpbnQgaTsKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAogCQkic3RhcnRfeG1pdDogbGVuICV1IGhlYWQgJXAgZGF0YSAlcCB0YWlsICVwIGVuZCAlcFxuIiwKLQkJc2tiLT5sZW4sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPnRhaWwsIHNrYi0+ZW5kKTsKKwkJc2tiLT5sZW4sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAorCQlza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpKTsKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAogCQkiZGF0YToiKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY2UuYwppbmRleCA5ZWMyNGYwLi5iM2JkNjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjZS5jCkBAIC05MzksNyArOTM5LDYgQEAKIAkJZWxzZQkvKiBFdGhlcm5ldCBoZWFkZXI7IG1hY2UgaW5jbHVkZXMgRkNTICovCiAJCSAgICBuYiAtPSA4OwogCQlza2JfcHV0KHNrYiwgbmIpOwotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJbXAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCmluZGV4IDVkNTQxZTguLjI3OTExYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNtYWNlLmMKQEAgLTQyMCw4ICs0MjAsNyBAQAogCW1wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCS8qIFdlIG5lZWQgdG8gY29weSBpbnRvIG91ciB4bWl0IGJ1ZmZlciB0byB0YWtlIGNhcmUgb2YgYWxpZ25tZW50IGFuZCBjYWNoaW5nIGlzc3VlcyAqLwotCi0JbWVtY3B5KCh2b2lkICopIG1wLT50eF9yaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbXAtPnR4X3JpbmcsIHNrYi0+bGVuKTsKIAogCS8qIGxvYWQgdGhlIFR4IERNQSBhbmQgZmlyZSBpdCBvZmYgKi8KIApAQCAtNjIxLDcgKzYyMCw2IEBACiAJc2tiX3Jlc2VydmUoc2tiLDIpOwogCW1lbWNweShza2JfcHV0KHNrYiwgbWYtPmxlbiksIG1mLT5kYXRhLCBtZi0+bGVuKTsKIAotCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJbmV0aWZfcngoc2tiKTsKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWV0aC5jIGIvZHJpdmVycy9uZXQvbWV0aC5jCmluZGV4IDdlNjljYTYuLjAzNDNlYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21ldGguYworKysgYi9kcml2ZXJzL25ldC9tZXRoLmMKQEAgLTQyMSw3ICs0MjEsNiBAQAogCQkJCQkvKiBXcml0ZSBtZXRhZGF0YSwgYW5kIHRoZW4gcGFzcyB0byB0aGUgcmVjZWl2ZSBsZXZlbCAqLwogCQkJCQlza2JfcHV0KHNrYl9jLCBsZW4pOwogCQkJCQlwcml2LT5yeF9za2JzW3ByaXYtPnJ4X3dyaXRlXSA9IHNrYjsKLQkJCQkJc2tiX2MtPmRldiA9IGRldjsKIAkJCQkJc2tiX2MtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiX2MsIGRldik7CiAJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKQEAgLTYwOSw3ICs2MDgsNyBAQAogCiAJZGVzYy0+aGVhZGVyLnJhdyA9IE1FVEhfVFhfQ01EX0lOVF9FTiB8IChsZW4tMSkgfCAoKDEyOC1sZW4pIDw8IDE2KTsKIAkvKiBtYXliZSBJIHNob3VsZCBzZXQgd2hvbGUgdGhpbmcgdG8gMCBmaXJzdC4uLiAqLwotCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIGxlbiksIHNrYi0+bGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBsZW4pCiAJCW1lbXNldChkZXNjLT5kYXRhLmR0ICsgMTIwIC0gbGVuICsgc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CiB9CkBAIC02MjcsOCArNjI2LDggQEAKIAogCS8qIHVuYWxpZ25lZCBwYXJ0ICovCiAJaWYgKHVuYWxpZ25lZF9sZW4pIHsKLQkJbWVtY3B5KGRlc2MtPmRhdGEuZHQgKyAoMTIwIC0gdW5hbGlnbmVkX2xlbiksCi0JCSAgICAgICBza2ItPmRhdGEsIHVuYWxpZ25lZF9sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgZGVzYy0+ZGF0YS5kdCArICgxMjAgLSB1bmFsaWduZWRfbGVuKSwKKwkJCSAgICAgIHVuYWxpZ25lZF9sZW4pOwogCQlkZXNjLT5oZWFkZXIucmF3IHw9ICgxMjggLSB1bmFsaWduZWRfbGVuKSA8PCAxNjsKIAl9CiAKQEAgLTY1Myw4ICs2NTIsOCBAQAogCWRlc2MtPmhlYWRlci5yYXcgPSBNRVRIX1RYX0NNRF9JTlRfRU4gfCBUWF9DQVRCVUYxIHwgVFhfQ0FUQlVGMnwgKHNrYi0+bGVuIC0gMSk7CiAJLyogdW5hbGlnbmVkIHBhcnQgKi8KIAlpZiAodW5hbGlnbmVkX2xlbil7Ci0JCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIHVuYWxpZ25lZF9sZW4pLAotCQkgICAgICAgc2tiLT5kYXRhLCB1bmFsaWduZWRfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRlc2MtPmRhdGEuZHQgKyAoMTIwIC0gdW5hbGlnbmVkX2xlbiksCisJCQkgICAgICB1bmFsaWduZWRfbGVuKTsKIAkJZGVzYy0+aGVhZGVyLnJhdyB8PSAoMTI4IC0gdW5hbGlnbmVkX2xlbikgPDwgMTY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9taXBzbmV0LmMgYi9kcml2ZXJzL25ldC9taXBzbmV0LmMKaW5kZXggZjQyYjllMi4uNDAzZjYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWlwc25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L21pcHNuZXQuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiAJaWYgKGlvaW9jcHlfZnJvbW1pcHNuZXQoZGV2LCBza2JfcHV0KHNrYiwgbGVuKSwgbGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDgwMTVhN2MuLmFiMTVlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwpAQCAtNDM0LDcgKzQzNCw2IEBACiAJCQkgKiByZWNlaXZlZCBwYWNrZXQKIAkJCSAqLwogCQkJc2tiX3B1dChza2IsIHBrdF9pbmZvLmJ5dGVfY250IC0gNCk7Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfTEFZRVJfNF9DSEVDS1NVTV9PSykgewogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC0xMTYyLDE1ICsxMTYxLDE1IEBACiAKIAkJY21kX3N0cyB8PSBFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0gfAogCQkJICAgRVRIX0dFTl9JUF9WXzRfQ0hFQ0tTVU0gIHwKLQkJCSAgIHNrYi0+bmguaXBoLT5paGwgPDwgRVRIX1RYX0lITF9TSElGVDsKKwkJCSAgIGlwX2hkcihza2IpLT5paGwgPDwgRVRIX1RYX0lITF9TSElGVDsKIAotCQlzd2l0Y2ggKHNrYi0+bmguaXBoLT5wcm90b2NvbCkgeworCQlzd2l0Y2ggKGlwX2hkcihza2IpLT5wcm90b2NvbCkgewogCQljYXNlIElQUFJPVE9fVURQOgogCQkJY21kX3N0cyB8PSBFVEhfVURQX0ZSQU1FOwotCQkJZGVzYy0+bDRpX2NoayA9IHNrYi0+aC51aC0+Y2hlY2s7CisJCQlkZXNjLT5sNGlfY2hrID0gdWRwX2hkcihza2IpLT5jaGVjazsKIAkJCWJyZWFrOwogCQljYXNlIElQUFJPVE9fVENQOgotCQkJZGVzYy0+bDRpX2NoayA9IHNrYi0+aC50aC0+Y2hlY2s7CisJCQlkZXNjLT5sNGlfY2hrID0gdGNwX2hkcihza2IpLT5jaGVjazsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBmOGVmZTBlLi4xNmUzYzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTg3OSw3ICs4NzksNyBAQAogCSAqIHNrYl9wdWxsKCkgKGZvciBldGhlcl9wYWQgYW5kIGV0aF90eXBlX3RyYW5zKCkpIHJlcXVpcmVzCiAJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0IGluIHNrYl9oZWFkbGVuKCksIG1vdmUgaXQKIAkgKiBtYW51YWxseSAqLwotCW1lbWNweShza2ItPmRhdGEsIHZhLCBobGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHZhLCBobGVuKTsKIAlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ICs9IGhsZW47CiAJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplIC09IGhsZW47CiAJc2tiLT5kYXRhX2xlbiAtPSBobGVuOwpAQCAtMTAyMCw3ICsxMDIwLDYgQEAKIAkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IDA7CiAJfQogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAKIAlpZiAobWdwLT5jc3VtX2ZsYWcpIHsKIAkJaWYgKChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgfHwKQEAgLTIwMzAsNyArMjAyOSw3IEBACiAJb2RkX2ZsYWcgPSAwOwogCWZsYWdzID0gKE1YR0VGV19GTEFHU19OT19UU08gfCBNWEdFRldfRkxBR1NfRklSU1QpOwogCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKLQkJY2tzdW1fb2Zmc2V0ID0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQlja3N1bV9vZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQlwc2V1ZG9faGRyX29mZnNldCA9IGNrc3VtX29mZnNldCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCS8qIElmIHRoZSBoZWFkZXJzIGFyZSBleGNlc3NpdmVseSBsYXJnZSwgdGhlbiB3ZSBtdXN0CiAJCSAqIGZhbGwgYmFjayB0byBhIHNvZnR3YXJlIGNoZWNrc3VtICovCkBAIC0yMDU1LDcgKzIwNTQsNyBAQAogCQkgKiBzZW5kIGxvb3AgdGhhdCB3ZSBhcmUgc3RpbGwgaW4gdGhlCiAJCSAqIGhlYWRlciBwb3J0aW9uIG9mIHRoZSBUU08gcGFja2V0LgogCQkgKiBUU08gaGVhZGVyIG11c3QgYmUgYXQgbW9zdCAxMzQgYnl0ZXMgbG9uZyAqLwotCQljdW1fbGVuID0gLSgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJY3VtX2xlbiA9IC0oc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKSk7CiAKIAkJLyogZm9yIFRTTywgcHNldWRvX2hkcl9vZmZzZXQgaG9sZHMgbXNzLgogCQkgKiBUaGUgZmlybXdhcmUgZmlndXJlcyBvdXQgd2hlcmUgdG8gcHV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCmluZGV4IGVlMjZlZjUuLjEzNDQ0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKIAotCXNrYi0+bWFjLnJhdyA9ICgoKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEpICsgTVlSSV9QQURfTEVOKTsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCBNWVJJX1BBRF9MRU4pOwogCXNrYl9wdWxsKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwogCWV0aCA9IGV0aF9oZHIoc2tiKTsKIApAQCAtNTAyLDcgKzUwMiw3IEBACiAJCQljb3B5X3NrYi0+ZGV2ID0gZGV2OwogCQkJRFJYKCgicmVzdl9hbmRfcHV0ICIpKTsKIAkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7Ci0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKIAogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCiAJCQlEUlgoKCJyZXVzZSAiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggMzQ5Yjk2YS4uYThkN2ZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMjI4OSw3ICsyMjg5LDYgQEAKIAkJCSAqIHdpdGhvdXQgY29weWluZyB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCiAJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhawogCQkJICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyBSWF9PRkZTRVQpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMgYi9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCmluZGV4IGE1MzY0NGYuLjJiOGRhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eC1ldGguYwpAQCAtMTY4LDcgKzE2OCw2IEBACiAJCUZJRk9fUFRSX1NFR01FTlQoc2VnKSB8IEZJRk9fUFRSX0ZSQU1FTk8oZnJhbWVubykpOwogCiAJbmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBuZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwogCW5ldGlmX3J4KHNrYik7CiAJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKaW5kZXggNjUzNzU3NC4uMGZiYThmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgogI2luY2x1ZGUgIm5ldHhlbl9uaWNfcGhhbl9yZWcuaCIKIAorI2luY2x1ZGUgPG5ldC9pcC5oPgorCiAvKiAgUENJIFdpbmRvd2luZyBmb3IgRERSIHJlZ2lvbnMuICAqLwogCiAjZGVmaW5lIEFERFJfSU5fUkFOR0UoYWRkciwgbG93LCBoaWdoKQlcCkBAIC0zNzEsMjIgKzM3MywyMSBAQAogCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKGRlc2MtPm1zcykgewotCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKLQkJICAgICgoc2tiLT5uaC5pcGgpLT5paGwgKiBzaXplb2YodTMyKSkgKwotCQkgICAgKChza2ItPmgudGgpLT5kb2ZmICogc2l6ZW9mKHUzMikpOworCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCisJCQkJCSAgaXBfaGRybGVuKHNrYikgKyB0Y3BfaGRybGVuKHNrYikpOwogCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfTFNPKTsKIAl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CiAJCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfUEtUKTsKLQkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJfSBlbHNlIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGRlc2MsIFRYX1VEUF9QS1QpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuOwogCQl9CiAJfQogCWFkYXB0ZXItPnN0YXRzLnhtaXRjc3VtbWVkKys7Ci0JZGVzYy0+dGNwX2hkcl9vZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCWRlc2MtPmlwX2hkcl9vZmZzZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlkZXNjLT50Y3BfaGRyX29mZnNldCA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJZGVzYy0+aXBfaGRyX29mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogfQogCiBpbnQgbmV0eGVuX2lzX2ZsYXNoX3N1cHBvcnRlZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKaW5kZXggZWZmOTY1ZC4uNWNkNDA1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwpAQCAtMTEyOSw3ICsxMTI5LDYgQEAKIAkJcG9ydC0+c3RhdHMuY3N1bW1lZCsrOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KLQlza2ItPmRldiA9IG5ldGRldjsKIAlpZiAoZGVzY19jdHggPT0gUkNWX0RFU0NfTFJPX0NUWElEKSB7CiAJCS8qIFRydWUgbGVuZ3RoIHdhcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgbGFzdCBwa3QgKi8KIAkJc2tiX3B1dChza2IsIGJ1ZmZlci0+bHJvX2xlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggN2QyNTI1ZS4uYWIyNWMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiTmV0WGVuIE11bHRpIHBvcnQgKDEvMTApIEdpZ2FiaXQgTmV0d29yayBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc3OCw5ICs3NzksOCBAQAogCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA+IDApIHsKIAogCQkJbm9fb2ZfZGVzYysrOwotCQkJaWYgKCgoc2tiLT5uaC5pcGgpLT5paGwgKiBzaXplb2YodTMyKSkgKwotCQkJICAgICgoc2tiLT5oLnRoKS0+ZG9mZiAqIHNpemVvZih1MzIpKSArCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBldGhoZHIpID4KKwkJCWlmICgoaXBfaGRybGVuKHNrYikgKyB0Y3BfaGRybGVuKHNrYikgKworCQkJICAgICBzaXplb2Yoc3RydWN0IGV0aGhkcikpID4KIAkJCSAgICAoc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgLSAyKSkgewogCQkJCW5vX29mX2Rlc2MrKzsKIAkJCX0KQEAgLTkyMCw4ICs5MjAsMTAgQEAKIAkJCS8qIGNvcHkgdGhlIG5leHQgNjQgYnl0ZXMgLSBzaG91bGQgYmUgZW5vdWdoIGV4Y2VwdAogCQkJICogZm9yIHBhdGhvbG9naWNhbCBjYXNlCiAJCQkgKi8KLQkJCW1lbWNweSgodm9pZCAqKWh3ZGVzYywgKHZvaWQgKikoc2tiLT5kYXRhKSArCi0JCQkgICAgICAgZmlyc3RfaGRyX2xlbiwgaGRyX2xlbiAtIGZpcnN0X2hkcl9sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBmaXJzdF9oZHJfbGVuLAorCQkJCQkJCSBod2Rlc2MsCisJCQkJCQkJIChoZHJfbGVuIC0KKwkJCQkJCQkgIGZpcnN0X2hkcl9sZW4pKTsKIAkJCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIG1heF90eF9kZXNjX2NvdW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNTAxMC5jIGIvZHJpdmVycy9uZXQvbmk1MDEwLmMKaW5kZXggOGJlMGQwMy4uM2Q1YjQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmk1MDEwLmMKKysrIGIvZHJpdmVycy9uZXQvbmk1MDEwLmMKQEAgLTU2Miw3ICs1NjIsNiBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2tiLT5kZXYgPSBkZXY7CiAJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAogCS8qIFJlYWQgcGFja2V0IGludG8gYnVmZmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUyLmMgYi9kcml2ZXJzL25ldC9uaTUyLmMKaW5kZXggYTZmNGIyNC4uOGRiZDZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmk1Mi5jCisrKyBiL2RyaXZlcnMvbmV0L25pNTIuYwpAQCAtOTM0LDcgKzkzNCw2IEBACiAJCQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBkZXZfYWxsb2Nfc2tiKHRvdGxlbisyKTsKIAkJCQkJaWYoc2tiICE9IE5VTEwpCiAJCQkJCXsKLQkJCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwogCQkJCQkJc2tiX3B1dChza2IsdG90bGVuKTsKIAkJCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLChjaGFyICopIHAtPmJhc2UrKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyLHRvdGxlbiwwKTsKQEAgLTExODMsNyArMTE4Miw3IEBACiAJZWxzZQogI2VuZGlmCiAJewotCQltZW1jcHkoKGNoYXIgKilwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwoY2hhciAqKShza2ItPmRhdGEpLHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIChjaGFyICopIHAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdLCBza2ItPmxlbik7CiAJCWxlbiA9IHNrYi0+bGVuOwogCQlpZiAobGVuIDwgRVRIX1pMRU4pIHsKIAkJCWxlbiA9IEVUSF9aTEVOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmk2NS5jIGIvZHJpdmVycy9uZXQvbmk2NS5jCmluZGV4IDE1NzhmNGQuLjM4MThlZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25pNjUuYworKysgYi9kcml2ZXJzL25ldC9uaTY1LmMKQEAgLTYxMCw3ICs2MTAsNiBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlcyBtZW1vcnkuXG4iLGRldi0+bmFtZSx3aGF0KTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2JfcmVzZXJ2ZShza2IsMisxNik7CiAJCXNrYl9wdXQoc2tiLFJfQlVGX1NJWkUpOwkgLyogZ3JhYiB0aGUgd2hvbGUgc3BhY2UgLi4gKG5vdCBuZWNlc3NhcnkpICovCiAJCXB0ciA9IHNrYi0+ZGF0YTsKQEAgLTEwOTQsNyArMTA5Myw2IEBACiAJCQlpZihza2IpCiAJCQl7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwotCXNrYi0+ZGV2ID0gZGV2OwogI2lmZGVmIFJDVl9WSUFfU0tCCiAJCQkJaWYoICh1bnNpZ25lZCBsb25nKSAoc2tiLT5kYXRhICsgUl9CVUZfU0laRSkgPiAweDEwMDAwMDApIHsKIAkJCQkJc2tiX3B1dChza2IsbGVuKTsKQEAgLTExNzgsOCArMTE3Niw5IEBACiAJCWlmKCAodW5zaWduZWQgbG9uZykgKHNrYi0+ZGF0YSArIHNrYi0+bGVuKSA+IDB4MTAwMDAwMCkgewogI2VuZGlmCiAKLQkJCW1lbWNweSgoY2hhciAqKSBwLT50bWRib3VuY2VbcC0+dG1kYm91bmNlbnVtXSAsKGNoYXIgKilza2ItPmRhdGEsCi0JCQkJCQkJIChza2ItPmxlbiA+IFRfQlVGX1NJWkUpID8gVF9CVUZfU0laRSA6IHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBwLT50bWRib3VuY2VbcC0+dG1kYm91bmNlbnVtXSwKKwkJCQkgICAgICBza2ItPmxlbiA+IFRfQlVGX1NJWkUgPyBUX0JVRl9TSVpFIDoKKwkJCQkJCQkgICAgICBza2ItPmxlbik7CiAJCQlpZiAobGVuID4gc2tiLT5sZW4pCiAJCQkJbWVtc2V0KChjaGFyICopcC0+dG1kYm91bmNlW3AtPnRtZGJvdW5jZW51bV0rc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CiAJCQlkZXZfa2ZyZWVfc2tiIChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IDllYzZlOWUuLjZhMzIzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTYwNyw3ICs2MDcsNiBAQAogCQlyZXMgJj0gMHhmOwogCQlza2JfcmVzZXJ2ZShza2IsIHJlcyk7CiAKLQkJc2tiLT5kZXYgPSBuZGV2OwogCQlpZiAoZ2ZwICE9IEdGUF9BVE9NSUMpCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yeF9pbmZvLmxvY2ssIGZsYWdzKTsKIAkJcmVzID0gbnM4MzgyMF9hZGRfcnhfc2tiKGRldiwgc2tiKTsKQEAgLTExNTcsOSArMTE1Niw5IEBACiAJZXh0c3RzID0gMDsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQlleHRzdHMgfD0gRVhUU1RTX0lQUEtUOwotCQlpZiAoSVBQUk9UT19UQ1AgPT0gc2tiLT5uaC5pcGgtPnByb3RvY29sKQorCQlpZiAoSVBQUk9UT19UQ1AgPT0gaXBfaGRyKHNrYiktPnByb3RvY29sKQogCQkJZXh0c3RzIHw9IEVYVFNUU19UQ1BQS1Q7Ci0JCWVsc2UgaWYgKElQUFJPVE9fVURQID09IHNrYi0+bmguaXBoLT5wcm90b2NvbCkKKwkJZWxzZSBpZiAoSVBQUk9UT19VRFAgPT0gaXBfaGRyKHNrYiktPnByb3RvY29sKQogCQkJZXh0c3RzIHw9IEVYVFNUU19VRFBQS1Q7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMgYi9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMKaW5kZXggZDY3MGFjNy4uNzZmZTlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYwpAQCAtMzM0LDggKzMzNCw2IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXNrYi0+ZGV2ID0gZGV2OwotCiAJCWRtYSA9IHBjaV9tYXBfc2luZ2xlKG1hYy0+ZG1hX3BkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCiAJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCkBAIC03MzEsMTYgKzcyOSwxOCBAQAogCWRmbGFncyA9IFhDVF9NQUNUWF9PIHwgWENUX01BQ1RYX1NUIHwgWENUX01BQ1RYX1NTIHwgWENUX01BQ1RYX0NSQ19QQUQ7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQlzd2l0Y2ggKHNrYi0+bmguaXBoLT5wcm90b2NvbCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCisJCXN3aXRjaCAoaXBfaGRyKHNrYiktPnByb3RvY29sKSB7CiAJCWNhc2UgSVBQUk9UT19UQ1A6CiAJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0NTVU1fVENQOwotCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9JUEgoKHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdykgPj4gMik7Ci0JCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQTyhza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQSChza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikgPj4gMik7CisJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQTyhuaCAtIHNrYi0+ZGF0YSk7CiAJCQlicmVhazsKIAkJY2FzZSBJUFBST1RPX1VEUDoKIAkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfQ1NVTV9VRFA7Ci0JCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQSCgoc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KSA+PiAyKTsKLQkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBPKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBIKHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSA+PiAyKTsKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBPKG5oIC0gc2tiLT5kYXRhKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwppbmRleCA2Y2E0ZTRmLi5kZjg5OThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYworKysgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwpAQCAtMTM0NCw3ICsxMzQ0LDcgQEAKIAogCXRwLT50eF9pbmZvW2VudHJ5XS5za2IgPSBza2I7CiAJLyogdHAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPSAwOyAqLwotCW1lbWNweSAodHAtPnR4X2J1ZltlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0cC0+dHhfYnVmW2VudHJ5XSwgc2tiLT5sZW4pOwogCiAJLyogTm90ZTogdGhlIGNoaXAgZG9lc24ndCBoYXZlIGF1dG8tcGFkISAqLwogCU5FVERSVl9XMzIgKFR4U3RhdHVzMCArIChlbnRyeSAqIHNpemVvZih1MzIpKSwKQEAgLTE1NjUsNyArMTU2NSw2IEBACiAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYiAocGt0X3NpemUgKyAyKTsKIAkJaWYgKHNrYikgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgZmllbGRzLiAqLwogCiAJCQlldGhfY29weV9hbmRfc3VtIChza2IsICZyeF9yaW5nW3Jpbmdfb2Zmc2V0ICsgNF0sIHBrdF9zaXplLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKaW5kZXggYzdiZDljMS4uMmIzOTVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTEwNTYsNyArMTA1Niw2IEBACiAJCQlERUJVRygzLCAiICBSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJCQkgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CiAJCQlpZiAoc2tiICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJCWluc2woaW9hZGRyK1JYX0ZJRk8sIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKIAkJCQkJCSgocGt0X2xlbiszKT4+MikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwppbmRleCA0NjFlODI3Li4xNDNhZTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpAQCAtODgzLDcgKzg4Myw2IEBACiAJICAgIERFQlVHKDMsICIgICAgUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCiAJCSAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkgICAgaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQlpbnNsKGlvYWRkcitSWF9GSUZPLCBza2JfcHV0KHNrYiwgcGt0X2xlbiksCiAJCQkocGt0X2xlbiszKT4+Mik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCmluZGV4IDYxMzkwNDguLjgwOGZhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCkBAIC0xMTM2LDcgKzExMzYsNyBAQAogCQllaV9ibG9ja19vdXRwdXQoZGV2LCBsZW5ndGgsIHNrYi0+ZGF0YSwgb3V0cHV0X3BhZ2UpOwogCWVsc2UgewogCQltZW1zZXQocGFja2V0LCAwLCBFVEhfWkxFTik7Ci0JCW1lbWNweShwYWNrZXQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcGFja2V0LCBza2ItPmxlbik7CiAJCWVpX2Jsb2NrX291dHB1dChkZXYsIGxlbmd0aCwgcGFja2V0LCBvdXRwdXRfcGFnZSk7CiAJfQogCQpAQCAtMTQ5Niw3ICsxNDk2LDYgQEAKIAkJCWVsc2UKIAkJCXsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKIAkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggMGQ3ZGU2MS4uM2Y5M2Q0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC05OTksNyArOTk5LDYgQEAKIAkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJYnJlYWs7CiAJICAgIH0KLQkgICAgc2tiLT5kZXYgPSBkZXY7CiAKIAkgICAgc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkgICAgaW5zdyhpb2FkZHIgKyBEQVRBUE9SVCwgc2tiX3B1dChza2IsIHBrdF9sZW4pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCmluZGV4IDNiNzA3NzQuLjczZGE2MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKQEAgLTExODIsMTIgKzExODIsMTAgQEAKICAgICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKIAogICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7Ci0Jc2tiLT5kZXYgPSBkZXY7Ci0KIAlza2JfcmVzZXJ2ZShza2IsIDIpOwogCWluc3coaW9hZGRyICsgQU0yMTUwX1JDViwgc2tiX3B1dChza2IsIHBrdF9sZW4pLCBwa3RfbGVuPj4xKTsKIAlpZiAocGt0X2xlbiAmIDEpCi0JICAgICooc2tiLT50YWlsLTEpID0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1YpOworCSAgICAqKHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIDEpID0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1YpOwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCiAJbmV0aWZfcngoc2tiKTsgLyogU2VuZCB0aGUgcGFja2V0IHRvIHRoZSB1cHBlciAocHJvdG9jb2wpIGxheWVycy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKaW5kZXggMjU2MWY3Ni4uNzkxMmRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTE2NjksNyArMTY2OSw2IEBACiAJICAgICAocGFja2V0X2xlbmd0aCsxKT4+MSk7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkKLQlza2ItPmRldiA9IGRldjsKIAluZXRpZl9yeChza2IpOwogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJc21jLT5zdGF0cy5yeF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwppbmRleCA1ODc5ZTdjLi44MDllYzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKQEAgLTEyMjYsNyArMTIyNiw2IEBACiAJCQkgICAgKHBrdGxlbisxKT4+MSk7CiAJCX0KIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCW5ldGlmX3J4KHNrYik7CiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY25ldDMyLmMgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKaW5kZXggNGQ5NGJhNy4uMDc5MTM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpAQCAtMTIwNiw3ICsxMjA2LDYgQEAKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQlscC0+cnhfc2tidWZmW2VudHJ5XSA9IG5ld3NrYjsKLQkJCW5ld3NrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSA9CiAJCQkJCSAgICBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKIAkJCQkJCQkgICBuZXdza2ItPmRhdGEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKaW5kZXggNmJiMDg1Zi4uODc1NGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGxpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CiAKLQlza2ItPm1hYy5yYXc9c2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKIAlldGggPSBldGhfaGRyKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCmluZGV4IGVmNThlNDEuLjZkNTk2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwpAQCAtODgsOCArODgsNiBAQAogI2RlZmluZSBQRl9UT19QUFAocGYpCQlQRl9UT19YKHBmLCBzdHJ1Y3QgcHBwKQogI2RlZmluZSBQRl9UT19DSEFOTkVMKHBmKQlQRl9UT19YKHBmLCBzdHJ1Y3QgY2hhbm5lbCkKIAotI2RlZmluZSBST1VORFVQKG4sIHgpCQkoKChuKSArICh4KSAtIDEpIC8gKHgpKQotCiAvKgogICogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBvbmUgcHBwIHVuaXQuCiAgKiBBIHBwcCB1bml0IGNvcnJlc3BvbmRzIHRvIGEgcHBwIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZQpAQCAtMTI5Nyw3ICsxMjk1LDcgQEAKIAkgKi8KIAlmcmFnc2l6ZSA9IGxlbjsKIAlpZiAobmZyZWUgPiAxKQotCQlmcmFnc2l6ZSA9IFJPVU5EVVAoZnJhZ3NpemUsIG5mcmVlKTsKKwkJZnJhZ3NpemUgPSBESVZfUk9VTkRfVVAoZnJhZ3NpemUsIG5mcmVlKTsKIAkvKiBuYmlnZ2VyIGNoYW5uZWxzIGdldCBmcmFnc2l6ZSBieXRlcywgdGhlIHJlc3QgZ2V0IGZyYWdzaXplLTEsCiAJICAgZXhjZXB0IGlmIG5iaWdnZXI9PTAsIHRoZW4gdGhleSBhbGwgZ2V0IGZyYWdzaXplLiAqLwogCW5iaWdnZXIgPSBsZW4gJSBuZnJlZTsKQEAgLTE2ODUsNyArMTY4Myw3IEBACiAJCQlza2JfcHVsbF9yY3N1bShza2IsIDIpOwogCQkJc2tiLT5kZXYgPSBwcHAtPmRldjsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhucGluZGV4X3RvX2V0aGVydHlwZVtucGldKTsKLQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQluZXRpZl9yeChza2IpOwogCQkJcHBwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jIGIvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYwppbmRleCBiNmYwZTlhLi41OTE4ZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTU5NCw3ICs1OTQsOCBAQAogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQkJc2tiX3Jlc2VydmUobnBrdCwyKTsKLQkJCW1lbWNweShza2JfcHV0KG5wa3Qsc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCSAgICAgIHNrYl9wdXQobnBrdCwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXNrYiA9IG5wa3Q7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9lLmMgYi9kcml2ZXJzL25ldC9wcHBvZS5jCmluZGV4IGViZmEyOTYuLjZmOTg4MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcG9lLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwb2UuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG94X3NvY2sgKmdldF9pdGVtX2J5X2FkZHIoc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpZmluZGV4OwogCiAJZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNwLT5zYV9hZGRyLnBwcG9lLmRldik7CkBAIC0yMTgsMjAgKzIxOCw2IEBACiAJcmV0dXJuIGdldF9pdGVtKHNwLT5zYV9hZGRyLnBwcG9lLnNpZCwgc3AtPnNhX2FkZHIucHBwb2UucmVtb3RlLCBpZmluZGV4KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2V0X2l0ZW0oc3RydWN0IHBwcG94X3NvY2sgKnBvKQotewotCWludCBpOwotCi0JaWYgKCFwbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOwotCWkgPSBfX3NldF9pdGVtKHBvKTsKLQl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7Ci0KLQlyZXR1cm4gaTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb3hfc29jayAqZGVsZXRlX2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIGNoYXIgKmFkZHIsIGludCBpZmluZGV4KQogewogCXN0cnVjdCBwcHBveF9zb2NrICpyZXQ7CkBAIC0yNTUsNTQgKzI0MSw1MyBAQAogc3RhdGljIHZvaWQgcHBwb2VfZmx1c2hfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGhhc2g7Ci0KIAlCVUdfT04oZGV2ID09IE5VTEwpOwogCi0JcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiAJZm9yIChoYXNoID0gMDsgaGFzaCA8IFBQUE9FX0hBU0hfU0laRTsgaGFzaCsrKSB7CiAJCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKIAogCQl3aGlsZSAocG8gIT0gTlVMTCkgewotCQkJaWYgKHBvLT5wcHBvZV9kZXYgPT0gZGV2KSB7Ci0JCQkJc3RydWN0IHNvY2sgKnNrID0gc2tfcHBwb3gocG8pOwotCi0JCQkJc29ja19ob2xkKHNrKTsKLQkJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKLQotCQkJCS8qIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gU0ssIG5vdyBkcm9wIHRoZQotCQkJCSAqIGhhc2ggdGFibGUgbG9jayBzbyB0aGF0IHdlIG1heSBhdHRlbXB0Ci0JCQkJICogdG8gbG9jayB0aGUgc29ja2V0ICh3aGljaCBjYW4gc2xlZXApLgotCQkJCSAqLwotCQkJCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOwotCi0JCQkJbG9ja19zb2NrKHNrKTsKLQotCQkJCWlmIChzay0+c2tfc3RhdGUgJgotCQkJCSAgICAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7Ci0JCQkJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKLQkJCQkJZGV2X3B1dChkZXYpOwotCQkJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9aT01CSUU7Ci0JCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCQkJCX0KLQotCQkJCXJlbGVhc2Vfc29jayhzayk7Ci0KLQkJCQlzb2NrX3B1dChzayk7Ci0KLQkJCQlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7Ci0KLQkJCQkvKiBOb3cgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcwotCQkJCSAqIGhhc2ggY2hhaW4uICBXZSBhbHdheXMgTlVMTCBvdXQgcHBwb2VfZGV2Ci0JCQkJICogc28gd2UgYXJlIGd1YXJhbnRlZWQgdG8gbWFrZSBmb3J3YXJkCi0JCQkJICogcHJvZ3Jlc3MuCi0JCQkJICovCi0JCQkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJCQlzdHJ1Y3Qgc29jayAqc2sgPSBza19wcHBveChwbyk7CisJCQlpZiAocG8tPnBwcG9lX2RldiAhPSBkZXYpIHsKKwkJCQlwbyA9IHBvLT5uZXh0OwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcG8gPSBwby0+bmV4dDsKKwkJCXBvLT5wcHBvZV9kZXYgPSBOVUxMOworCQkJZGV2X3B1dChkZXYpOworCisKKwkJCS8qIFdlIGFsd2F5cyBncmFiIHRoZSBzb2NrZXQgbG9jaywgZm9sbG93ZWQgYnkgdGhlCisJCQkgKiBwcHBvZV9oYXNoX2xvY2ssIGluIHRoYXQgb3JkZXIuICBTaW5jZSB3ZSBzaG91bGQKKwkJCSAqIGhvbGQgdGhlIHNvY2sgbG9jayB3aGlsZSBkb2luZyBhbnkgdW5iaW5kaW5nLAorCQkJICogd2UgbmVlZCB0byByZWxlYXNlIHRoZSBsb2NrIHdlJ3JlIGhvbGRpbmcuCisJCQkgKiBIb2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBzb2NrIHNvIGl0IGRvZXNuJ3QgZGlzYXBwZWFyCisJCQkgKiBhcyB3ZSdyZSBqdW1waW5nIGJldHdlZW4gbG9ja3MuCisJCQkgKi8KKworCQkJc29ja19ob2xkKHNrKTsKKworCQkJd3JpdGVfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCQkJbG9ja19zb2NrKHNrKTsKKworCQkJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9DT05ORUNURUQgfCBQUFBPWF9CT1VORCkpIHsKKwkJCQlwcHBveF91bmJpbmRfc29jayhzayk7CisJCQkJc2stPnNrX3N0YXRlID0gUFBQT1hfWk9NQklFOworCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQkJfQorCisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJc29ja19wdXQoc2spOworCisJCQkvKiBSZXN0YXJ0IHNjYW4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGhhc2ggY2hhaW4uCisJCQkgKiBXaGlsZSB0aGUgbG9jayB3YXMgZHJvcHBlZCB0aGUgY2hhaW4gY29udGVudHMgbWF5CisJCQkgKiBoYXZlIGNoYW5nZWQuCisJCQkgKi8KKwkJCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKIAkJfQogCX0KLQlyZWFkX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgcHBwb2VfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKQEAgLTM0NCwxMCArMzI5LDEwIEBACiBzdGF0aWMgaW50IHBwcG9lX3Jjdl9jb3JlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7Ci0Jc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvID0gTlVMTDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmVsYXlfcG87CiAKIAlpZiAoc2stPnNrX3N0YXRlICYgUFBQT1hfQk9VTkQpIHsKLQkJc3RydWN0IHBwcG9lX2hkciAqcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2ItPm5oLnJhdzsKKwkJc3RydWN0IHBwcG9lX2hkciAqcGggPSBwcHBvZV9oZHIoc2tiKTsKIAkJaW50IGxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOwogCQlza2JfcHVsbF9yY3N1bShza2IsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CiAJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBsZW4pKQpAQCAtNDAxLDcgKzM4Niw3IEBACiAJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKQogCQlnb3RvIG91dDsKIAotCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJcGggPSBwcHBvZV9oZHIoc2tiKTsKIAogCXBvID0gZ2V0X2l0ZW0oKHVuc2lnbmVkIGxvbmcpIHBoLT5zaWQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGRldi0+aWZpbmRleCk7CiAJaWYgKHBvICE9IE5VTEwpCkBAIC00MzMsNyArNDE4LDcgQEAKIAlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpCiAJCWdvdG8gb3V0OwogCi0JcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2ItPm5oLnJhdzsKKwlwaCA9IHBwcG9lX2hkcihza2IpOwogCWlmIChwaC0+Y29kZSAhPSBQQURUX0NPREUpCiAJCWdvdG8gYWJvcnQ7CiAKQEAgLTUxNCwzNiArNDk5LDQ5IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHBwcG94X3NvY2sgKnBvOwotCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXNrKQogCQlyZXR1cm4gMDsKIAotCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKXsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIC1FQkFERjsKKwl9CiAKIAlwcHBveF91bmJpbmRfc29jayhzayk7CiAKIAkvKiBTaWduYWwgdGhlIGRlYXRoIG9mIHRoZSBzb2NrZXQuICovCiAJc2stPnNrX3N0YXRlID0gUFBQT1hfREVBRDsKIAorCisJLyogV3JpdGUgbG9jayBvbiBoYXNoIGxvY2sgcHJvdGVjdHMgdGhlIGVudGlyZSAicG8iIHN0cnVjdCBmcm9tCisJICogY29uY3VycmVudCB1cGRhdGVzIHZpYSBwcHBvZV9mbHVzaF9kZXYuIFRoZSAicG8iIHN0cnVjdCBzaG91bGQKKwkgKiBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGhhc2ggdGFibGUgY29udGVudHMsIHRodXMgcHJvdGVjdGVkCisJICogYnkgdGhlIGhhc2ggdGFibGUgbG9jayAqLworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKIAlwbyA9IHBwcG94X3NrKHNrKTsKIAlpZiAocG8tPnBwcG9lX3BhLnNpZCkgewotCQlkZWxldGVfaXRlbShwby0+cHBwb2VfcGEuc2lkLCBwby0+cHBwb2VfcGEucmVtb3RlLCBwby0+cHBwb2VfaWZpbmRleCk7CisJCV9fZGVsZXRlX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwKKwkJCSAgICAgIHBvLT5wcHBvZV9wYS5yZW1vdGUsIHBvLT5wcHBvZV9pZmluZGV4KTsKIAl9CiAKLQlpZiAocG8tPnBwcG9lX2RldikKKwlpZiAocG8tPnBwcG9lX2RldikgewogCQlkZXZfcHV0KHBvLT5wcHBvZV9kZXYpOworCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKwl9CiAKLQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiAKIAlzb2NrX29ycGhhbihzayk7CiAJc29jay0+c2sgPSBOVUxMOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIAlzb2NrX3B1dChzayk7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNTk5LDE0ICs1OTcsMTggQEAKIAkJcG8tPnBwcG9lX2RldiA9IGRldjsKIAkJcG8tPnBwcG9lX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAKLQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKXsKKwkJCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKIAkJCWdvdG8gZXJyX3B1dDsKKwkJfQogCiAJCW1lbWNweSgmcG8tPnBwcG9lX3BhLAogCQkgICAgICAgJnNwLT5zYV9hZGRyLnBwcG9lLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9hZGRyKSk7CiAKLQkJZXJyb3IgPSBzZXRfaXRlbShwbyk7CisJCWVycm9yID0gX19zZXRfaXRlbShwbyk7CisJCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCWdvdG8gZXJyX3B1dDsKIApAQCAtNzYyLDEwICs3NjQsMTAgQEAKIHN0YXRpYyBpbnQgcHBwb2Vfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCSAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKLQlpbnQgZXJyb3IgPSAwOworCWludCBlcnJvcjsKIAlzdHJ1Y3QgcHBwb2VfaGRyIGhkcjsKIAlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNzk5LDcgKzgwMSw3IEBACiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzLiAqLwogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAKQEAgLTg2OSw3ICs4NzEsOCBAQAogCQkJZ290byBhYm9ydDsKIAogCQlza2JfcmVzZXJ2ZShza2IyLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7Ci0JCW1lbWNweShza2JfcHV0KHNrYjIsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYjIsIHNrYi0+bGVuKSwKKwkJCQkJICBza2ItPmxlbik7CiAJfSBlbHNlIHsKIAkJLyogTWFrZSBhIGNsb25lIHNvIGFzIHRvIG5vdCBkaXN0dXJiIHRoZSBvcmlnaW5hbCBza2IsCiAJCSAqIGdpdmUgZGV2X3F1ZXVlX3htaXQgc29tZXRoaW5nIGl0IGNhbiBmcmVlLgpAQCAtODg0LDcgKzg4Nyw3IEBACiAJbWVtY3B5KHBoLCAmaGRyLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOwogCXNrYjItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKTsKIAotCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJc2tiMi0+ZGV2ID0gZGV2OwogCkBAIC05MjksMTAgKzkzMiw4IEBACiAJCSAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVycm9yID0gMDsKLQlpbnQgbGVuOwotCXN0cnVjdCBwcHBvZV9oZHIgKnBoID0gTlVMTDsKIAogCWlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9CT1VORCkgewogCQllcnJvciA9IC1FSU87CkBAIC05NDIsMjYgKzk0MywyMSBAQAogCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCiAJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnJvcik7CiAKLQlpZiAoZXJyb3IgPCAwKSB7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBlbmQ7Ci0JfQogCiAJbS0+bXNnX25hbWVsZW4gPSAwOwogCiAJaWYgKHNrYikgewotCQllcnJvciA9IDA7Ci0JCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7Ci0JCWxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOworCQlzdHJ1Y3QgcHBwb2VfaGRyICpwaCA9IHBwcG9lX2hkcihza2IpOworCQljb25zdCBpbnQgbGVuID0gbnRvaHMocGgtPmxlbmd0aCk7CiAKIAkJZXJyb3IgPSBtZW1jcHlfdG9pb3ZlYyhtLT5tc2dfaW92LCAodW5zaWduZWQgY2hhciAqKSAmcGgtPnRhZ1swXSwgbGVuKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gZG9fc2tiX2ZyZWU7Ci0JCWVycm9yID0gbGVuOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gbGVuOwogCX0KIAotZG9fc2tiX2ZyZWU6Ci0JaWYgKHNrYikKLQkJa2ZyZWVfc2tiKHNrYik7CisJa2ZyZWVfc2tiKHNrYik7CiBlbmQ6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtOTkxLDcgKzk4Nyw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwcHBveF9zb2NrICpwcHBvZV9nZXRfaWR4KGxvZmZfdCBwb3MpCiB7Ci0Jc3RydWN0IHBwcG94X3NvY2sgKnBvID0gTlVMTDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CiAJaW50IGkgPSAwOwogCiAJZm9yICg7IGkgPCBQUFBPRV9IQVNIX1NJWkU7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb3guYyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKaW5kZXggOTMxNTA0Ni4uM2Y4MTE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwb3guYworKysgYi9kcml2ZXJzL25ldC9wcHBveC5jCkBAIC01OCw3ICs1OCw3IEBACiB7CiAJLyogQ2xlYXIgY29ubmVjdGlvbiB0byBwcHAgZGV2aWNlLCBpZiBhdHRhY2hlZC4gKi8KIAotCWlmIChzay0+c2tfc3RhdGUgJiAoUFBQT1hfQk9VTkQgfCBQUFBPWF9aT01CSUUpKSB7CisJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9CT1VORCB8IFBQUE9YX0NPTk5FQ1RFRCB8IFBQUE9YX1pPTUJJRSkpIHsKIAkJcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgmcHBwb3hfc2soc2spLT5jaGFuKTsKIAkJc2stPnNrX3N0YXRlID0gUFBQT1hfREVBRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGEzeHh4LmMgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmMKaW5kZXggYTgyNDZlYi4uN2I4MGZiNyAxMDA3NTUKLS0tIGEvZHJpdmVycy9uZXQvcWxhM3h4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwpAQCAtMTg3Myw3ICsxODczLDYgQEAKIAkJCSBwY2lfdW5tYXBfbGVuKGxyZ19idWZfY2IyLCBtYXBsZW4pLAogCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJcHJlZmV0Y2goc2tiLT5kYXRhKTsKLQlza2ItPmRldiA9IHFkZXYtPm5kZXY7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHFkZXYtPm5kZXYpOwogCkBAIC0xOTI4LDcgKzE5MjcsOCBAQAogCQkgKiBDb3B5IHRoZSBldGhoZHIgZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kLiBUaGlzCiAJCSAqIGlzIG5lY2Vzc2FyeSBmb3IgMzAyMiBJUCBjb21wbGV0aW9ucy4KIAkJICovCi0JCW1lbWNweShza2JfcHVzaChza2IyLCBzaXplKSwgc2tiMS0+ZGF0YSArIFZMQU5fSURfTEVOLCBzaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiMSwgVkxBTl9JRF9MRU4sCisJCQkJCQkgc2tiX3B1c2goc2tiMiwgc2l6ZSksIHNpemUpOwogCX0gZWxzZSB7CiAJCXUxNiBjaGVja3N1bSA9IGxlMTZfdG9fY3B1KGliX2lwX3JzcF9wdHItPmNoZWNrc3VtKTsKIAkJaWYgKGNoZWNrc3VtICYgCkBAIC0xOTQ2LDcgKzE5NDYsNiBAQAogCQkJc2tiMi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCX0KIAl9Ci0Jc2tiMi0+ZGV2ID0gcWRldi0+bmRldjsKIAlza2IyLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYjIsIHFkZXYtPm5kZXYpOwogCiAJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCA2YTc3YjhhLi40NTg3NmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTIyODQsNyArMjI4NCw3IEBACiAJCQlyZXR1cm4gTGFyZ2VTZW5kIHwgKChtc3MgJiBNU1NNYXNrKSA8PCBNU1NTaGlmdCk7CiAJfQogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IGlwX2hkcihza2IpOwogCiAJCWlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCiAJCQlyZXR1cm4gSVBDUyB8IFRDUENTOwpAQCAtMjU4Niw3ICsyNTg2LDYgQEAKIAkJCXBjaV9hY3Rpb24odHAtPnBjaV9kZXYsIGxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLAogCQkJCSAgIHRwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3B1dChza2IsIHBrdF9zaXplKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Jpb25ldC5jIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKaW5kZXggYjdmZjQ4NC4uZGY2YjczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKQEAgLTExNSw3ICsxMTUsNiBAQAogCiAJCXJuZXQtPnJ4X3NrYltpXS0+ZGF0YSA9IGRhdGE7CiAJCXNrYl9wdXQocm5ldC0+cnhfc2tiW2ldLCBSSU9fTUFYX01TR19TSVpFKTsKLQkJcm5ldC0+cnhfc2tiW2ldLT5kZXYgPSBuZGV2OwogCQlybmV0LT5yeF9za2JbaV0tPnByb3RvY29sID0KIAkJICAgIGV0aF90eXBlX3RyYW5zKHJuZXQtPnJ4X3NrYltpXSwgbmRldik7CiAJCWVycm9yID0gbmV0aWZfcngocm5ldC0+cnhfc2tiW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3JydW5uZXIuYyBiL2RyaXZlcnMvbmV0L3JydW5uZXIuYwppbmRleCBkODE1MzZmLi4yNWM3M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ycnVubmVyLmMKKysrIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5jCkBAIC0xMDI5LDcgKzEwMjksNiBAQAogCQkJCQlnb3RvIGRlZmVyOwogCQkJCX0KIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiLT5wcm90b2NvbCA9IGhpcHBpX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAJCQluZXRpZl9yeChza2IpOwkJLyogc2VuZCBpdCB1cCAqLwpAQCAtMTQ1Miw3ICsxNDUxLDcgQEAKIAkJfQogCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCA4KTsKIAkJc2tiX3B1dChuZXdfc2tiLCBsZW4pOwotCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmV3X3NrYi0+ZGF0YSwgbGVuKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlza2IgPSBuZXdfc2tiOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCA0NmViZjE0MS4uNjAwZDNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtMjE5NSw3ICsyMTk1LDcgQEAKIAlmcmFnX2xpc3QtPm5leHQgPSBOVUxMOwogCXRtcCA9ICh2b2lkICopQUxJR04oKGxvbmcpZnJhZ19saXN0LT5kYXRhLCBBTElHTl9TSVpFICsgMSk7CiAJZnJhZ19saXN0LT5kYXRhID0gdG1wOwotCWZyYWdfbGlzdC0+dGFpbCA9IHRtcDsKKwlza2JfcmVzZXRfdGFpbF9wb2ludGVyKGZyYWdfbGlzdCk7CiAKIAkvKiBCdWZmZXItMiByZWNlaXZlcyBMNCBkYXRhIHBheWxvYWQgKi8KIAkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsCkBAIC0yMzQ5LDcgKzIzNDksNyBAQAogCQkJdG1wICs9IEFMSUdOX1NJWkU7CiAJCQl0bXAgJj0gfkFMSUdOX1NJWkU7CiAJCQlza2ItPmRhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZyl0bXA7Ci0JCQlza2ItPnRhaWwgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZyl0bXA7CisJCQlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CiAKIAkJCWlmICghKCgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0cikpCiAJCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuYyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwppbmRleCAxNDM5NThmLi5hZDk0MzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYWE5NzMwLmMKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5jCkBAIC02ODgsNyArNjg4LDYgQEAKIAkJCX0gZWxzZSB7CiAJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KHNrYiwgbGVuKTsJLyogbWFrZSByb29tICovCiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEwMDAuYyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCmluZGV4IGI5ZmE0ZmIuLjFkZTNlZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCkBAIC04MzQsNyArODM0LDcgQEAKIAkJCWdvdG8gZHJvcHBlZF9mcmFtZTsKIAkJfQogCQlza2ItPmRldiA9IGRldjsKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gKHVuc2lnbmVkIHNob3J0KSBidWZmZXJbTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgMTZdOwogCQlpbnN3KGlvYWRkciwgc2tiX3B1dChza2IsIE5ld0RhdGFncmFtRGF0YVNpemUpLAogCQkJTmV3RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCmluZGV4IDEwM2MzMTcuLjBhM2EzNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYworKysgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKQEAgLTkzMyw5ICs5MzMsNiBAQAogCQl9CiAKIAkJc2JkbWFfYWxpZ25fc2tiKHNiX25ldywgU01QX0NBQ0hFX0JZVEVTLCBFVEhFUl9BTElHTik7Ci0KLQkJLyogbWFyayBza2J1ZmYgb3duZWQgYnkgb3VyIGRldmljZSAqLwotCQlzYl9uZXctPmRldiA9IGQtPnNiZG1hX2V0aC0+c2JtX2RldjsKIAl9CiAJZWxzZSB7CiAJCXNiX25ldyA9IHNiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2M5MjAzMS5jIGIvZHJpdmVycy9uZXQvc2M5MjAzMS5jCmluZGV4IGMzMmMyMWEuLjViNzI4NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NjOTIwMzEuYworKysgYi9kcml2ZXJzL25ldC9zYzkyMDMxLmMKQEAgLTgxNCw3ICs4MTQsNiBAQAogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3Rfc2l6ZSksIHJ4X3JpbmcgKyByeF9yaW5nX29mZnNldCwgcGt0X3NpemUpOwogCQl9CiAKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCW5ldGlmX3J4KHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZWVxODAwNS5jIGIvZHJpdmVycy9uZXQvc2VlcTgwMDUuYwppbmRleCAwZDZjOTVjLi40YmNlN2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZWVxODAwNS5jCisrKyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKQEAgLTU1MCw3ICs1NTAsNiBAQAogCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGFsaWduIGRhdGEgb24gMTYgYnl0ZSAqLwogCQkJYnVmID0gc2tiX3B1dChza2IscGt0X2xlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuYyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwppbmRleCA1MmVkNTIyLi5kOGM5YzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKKysrIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5jCkBAIC0zMTgsNyArMzE4LDYgQEAKIAkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CiAKIAkJCWlmIChza2IpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJCXNrYl9wdXQoc2tiLCBsZW4pOwogCkBAIC01MzUsNyArNTM0LDcgQEAKIAkgKiAgICBlbnRyeSBhbmQgdGhlIEhQQyBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgY2hhaW4gYmVmb3JlIHdlCiAJICogICAgYWRkZWQgdGhpcyBuZXcgZW50cnkgYW5kIHJlc3RhcnRlZCBpdC4KIAkgKi8KLQltZW1jcHkoKGNoYXIgKikobG9uZyl0ZC0+YnVmX3ZhZGRyLCBza2ItPmRhdGEsIHNrYmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciwgc2tibGVuKTsKIAlpZiAobGVuICE9IHNrYmxlbikKIAkJbWVtc2V0KChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciArIHNrYi0+bGVuLCAwLCBsZW4tc2tibGVuKTsKIAl0ZC0+dGRtYS5jbnRpbmZvID0gKGxlbiAmIEhQQ0RNQV9CQ05UKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXMxOTAuYyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCmluZGV4IDM0NDYzY2UuLmJjOGRlNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczE5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCkBAIC02MzIsNyArNjMyLDYgQEAKIAkJCXBjaV9hY3Rpb24odHAtPnBjaV9kZXYsIGxlMzJfdG9fY3B1KGRlc2MtPmFkZHIpLAogCQkJCSAgIHRwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3B1dChza2IsIHBrdF9zaXplKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5jIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKaW5kZXggYjJhM2IxOWQuLmRlYTAxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczkwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCkBAIC0xMTYwLDcgKzExNjAsNiBAQAogCQkJICAgYnVmZmVyICovCiAJCQlicmVhazsKIAkJfQotCQlza2ItPmRldiA9IG5ldF9kZXY7CiAJCXNpc19wcml2LT5yeF9za2J1ZmZbaV0gPSBza2I7CiAJCXNpc19wcml2LT5yeF9yaW5nW2ldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOwogICAgICAgICAgICAgICAgIHNpc19wcml2LT5yeF9yaW5nW2ldLmJ1ZnB0ciA9IHBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LApAQCAtMTgwMCw3ICsxNzk5LDYgQEAKIAkJCXNpc19wcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQlzaXNfcHJpdi0+ZGlydHlfcngrKzsKIHJlZmlsbF9yeF9yaW5nOgotCQkJc2tiLT5kZXYgPSBuZXRfZGV2OwogCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQpAQCAtMTgzMiw3ICsxODMwLDYgQEAKIAkJCQlzaXNfcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWJyZWFrOwogCQkJfQotCQkJc2tiLT5kZXYgPSBuZXRfZGV2OwogCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwppbmRleCBlOTRhYjI1Li5lMGE5MzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtMTU2MiwxMCArMTU2MiwxMCBAQAogCXBUeGQtPnBNQnVmICAgICA9IHBNZXNzYWdlOwogCiAJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1MTYgaGRybGVuID0gcE1lc3NhZ2UtPmgucmF3IC0gcE1lc3NhZ2UtPmRhdGE7CisJCXUxNiBoZHJsZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChwTWVzc2FnZSk7CiAJCXUxNiBvZmZzZXQgPSBoZHJsZW4gKyBwTWVzc2FnZS0+Y3N1bV9vZmZzZXQ7CiAKLQkJaWYgKChwTWVzc2FnZS0+aC5pcGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgKSAmJgorCQlpZiAoKGlwaXBfaGRyKHBNZXNzYWdlKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApICYmCiAJCQkocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSAmJgogCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgewogCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1RDUF9DSEVDSzsKQEAgLTE2ODEsNyArMTY4MSw3IEBACiAJKiogRG9lcyB0aGUgSFcgbmVlZCB0byBldmFsdWF0ZSBjaGVja3N1bSBmb3IgVENQIG9yIFVEUCBwYWNrZXRzPyAKIAkqLwogCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdTE2IGhkcmxlbiA9IHBNZXNzYWdlLT5oLnJhdyAtIHBNZXNzYWdlLT5kYXRhOworCQl1MTYgaGRybGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQocE1lc3NhZ2UpOwogCQl1MTYgb2Zmc2V0ID0gaGRybGVuICsgcE1lc3NhZ2UtPmNzdW1fb2Zmc2V0OwogCiAJCUNvbnRyb2wgPSBCTVVfU1RGV0Q7CkBAIC0xNjkxLDcgKzE2OTEsNyBAQAogCQkqKiBvcGNvZGUgZm9yIHVkcCBpcyBub3Qgd29ya2luZyBpbiB0aGUgaGFyZHdhcmUgeWV0IAogCQkqKiAoUmV2aXNpb24gMi4wKQogCQkqLwotCQlpZiAoKHBNZXNzYWdlLT5oLmlwaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCApICYmCisJCWlmICgoaXBpcF9oZHIocE1lc3NhZ2UpLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgJiYKIAkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCiAJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CiAJCQlDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCQkJCQkJICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKIAkJCQkJCSAgICBGcmFtZUxlbmd0aCwKIAkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KHBOZXdNc2ctPmRhdGEsIHBNc2csIEZyYW1lTGVuZ3RoKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHBOZXdNc2csIHBNc2csIEZyYW1lTGVuZ3RoKTsKIAogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBBQy0+UGNpRGV2LAogCQkJCQkJICAgICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKQEAgLTIxOTMsNyArMjE5Myw2IEBACiAJCQkJU0tfUE5NSV9DTlRfUlhfT0NURVRTX0RFTElWRVJFRChwQUMsCiAJCQkJCUZyYW1lTGVuZ3RoLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOwogCi0JCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKIAkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCiAJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOwogCQkJCW5ldGlmX3J4KHBNc2cpOwpAQCAtMjI0Niw3ICsyMjQ1LDYgQEAKIAkJCQkoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSAhPSAwIHx8CiAJCQkJKEZvclJsbXQgJiBTS19STE1UX1JYX1BST1RPQ09MKSA9PQogCQkJCVNLX1JMTVRfUlhfUFJPVE9DT0wpIHsKLQkJCQlwTXNnLT5kZXYgPSBwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdOwogCQkJCXBNc2ctPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE1zZywKIAkJCQkJcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XSk7CiAJCQkJbmV0aWZfcngocE1zZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwppbmRleCA5NzMzYTExLi5hN2VmNmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKQEAgLTE2ODAsNyArMTY4MCw2IEBACiAJcnhkLT5yeGRfb3Muc2tiID0gTlVMTDsKIAlza2JfdHJpbShza2IsIGxlbik7CiAJc2tiLT5wcm90b2NvbCA9IGZkZGlfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOwotCXNrYi0+ZGV2ID0gYnAtPmRldjsJLyogcGFzcyB1cCBkZXZpY2UgcG9pbnRlciAqLwogCiAJbmV0aWZfcngoc2tiKTsKIAlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTE5MzgsNyArMTkzNyw3IEBACiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMyk7CiAJc2tiX3B1dChza2IsIGxlbik7Ci0JbWVtY3B5KHNrYi0+ZGF0YSwgbG9va19haGVhZCwgbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGxvb2tfYWhlYWQsIGxlbik7CiAKIAkvLyBkZWxpdmVyIGZyYW1lIHRvIHN5c3RlbQogCXNrYi0+cHJvdG9jb2wgPSBmZGRpX3R5cGVfdHJhbnMoc2tiLCBzbWMtPm9zLmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmMgYi9kcml2ZXJzL25ldC9za2dlLmMKaW5kZXggZDQ3NmEzYy4uZjFhMGU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwpAQCAtMjY1NCwxMiArMjY1NCwxMiBAQAogCXRkLT5kbWFfaGkgPSBtYXAgPj4gMzI7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQlpbnQgb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJY29uc3QgaW50IG9mZnNldCA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAKIAkJLyogVGhpcyBzZWVtcyBiYWNrd2FyZHMsIGJ1dCBpdCBpcyB3aGF0IHRoZSBzazk4bGluCiAJCSAqIGRvZXMuICBMb29rcyBsaWtlIGhhcmR3YXJlIGlzIHdyb25nPwogCQkgKi8KLQkJaWYgKHNrYi0+aC5pcGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAKKwkJaWYgKGlwaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVURQCiAJICAgICAgICAgICAgJiYgaHctPmNoaXBfcmV2ID09IDAgJiYgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKIAkJCWNvbnRyb2wgPSBCTVVfVENQX0NIRUNLOwogCQllbHNlCkBAIC0yOTUwLDcgKzI5NTAsNyBAQAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2tnZS0+aHctPnBkZXYsCiAJCQkJCSAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKIAkJCQkJICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgZS0+c2tiLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGUtPnNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc2tnZS0+aHctPnBkZXYsCiAJCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKIAkJCQkJICAgICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCBhYzM2MTUyLi4yMzhjMmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTM5MSw4ICsxMzkyLDggQEAKIAkvKiBDaGVjayBmb3IgVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkICovCiAJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAlpZiAobXNzICE9IDApIHsKLQkJbXNzICs9ICgoc2tiLT5oLnRoLT5kb2ZmIC0gNSkgKiA0KTsJLyogVENQIG9wdGlvbnMgKi8KLQkJbXNzICs9IChza2ItPm5oLmlwaC0+aWhsICogNCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCW1zcyArPSB0Y3Bfb3B0bGVuKHNrYik7IC8qIFRDUCBvcHRpb25zICovCisJCW1zcyArPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAkJbXNzICs9IEVUSF9ITEVOOwogCiAJCWlmIChtc3MgIT0gc2t5Mi0+dHhfbGFzdF9tc3MpIHsKQEAgLTE0MjAsMTQgKzE0MjEsMTQgQEAKIAogCS8qIEhhbmRsZSBUQ1AgY2hlY2tzdW0gb2ZmbG9hZCAqLwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXVuc2lnbmVkIG9mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCWNvbnN0IHVuc2lnbmVkIG9mZnNldCA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAJCXUzMiB0Y3BzdW07CiAKIAkJdGNwc3VtID0gb2Zmc2V0IDw8IDE2OwkJLyogc3VtIHN0YXJ0ICovCiAJCXRjcHN1bSB8PSBvZmZzZXQgKyBza2ItPmNzdW1fb2Zmc2V0OwkvKiBzdW0gd3JpdGUgKi8KIAogCQljdHJsID0gQ0FMU1VNIHwgV1JfU1VNIHwgSU5JVF9TVU0gfCBMT0NLX1NVTTsKLQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKIAkJCWN0cmwgfD0gVURQVENQOwogCiAJCWlmICh0Y3BzdW0gIT0gc2t5Mi0+dHhfdGNwc3VtKSB7CkBAIC0xOTcwLDcgKzE5NzEsNyBAQAogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2t5Mi0+aHctPnBkZXYsIHJlLT5kYXRhX2FkZHIsCiAJCQkJCSAgICBsZW5ndGgsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCW1lbWNweShza2ItPmRhdGEsIHJlLT5za2ItPmRhdGEsIGxlbmd0aCk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocmUtPnNrYiwgc2tiLT5kYXRhLCBsZW5ndGgpOwogCQlza2ItPmlwX3N1bW1lZCA9IHJlLT5za2ItPmlwX3N1bW1lZDsKIAkJc2tiLT5jc3VtID0gcmUtPnNrYi0+Y3N1bTsKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNreTItPmh3LT5wZGV2LCByZS0+ZGF0YV9hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCmluZGV4IDJmNGIxZGUuLjY1YmQyMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaXAuYworKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTM2Myw3ICszNjMsNyBAQAogCX0KIAlza2ItPmRldiA9IHNsLT5kZXY7CiAJbWVtY3B5KHNrYl9wdXQoc2tiLGNvdW50KSwgc2wtPnJidWZmLCBjb3VudCk7Ci0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfSVApOwogCW5ldGlmX3J4KHNrYik7CiAJc2wtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKaW5kZXggYzk1NjE0MS4uOGEyMTA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxMXguYwpAQCAtNTAyLDcgKzUwMiw2IEBACiAJCURCRyhTTUNfREVCVUdfUEtUUywgIiVzOiBSZWNlaXZlZCBwYWNrZXRcbiIsIGRldi0+bmFtZSwpOwogCQlQUklOVF9QS1QoZGF0YSwgKChwa3RfbGVuIC0gNCkgPD0gNjQpID8gcGt0X2xlbiAtIDQgOiA2NCk7CiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQluZXRpZl9yeChza2IpOwogCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtMTMwNyw3ICsxMzA2LDYgQEAKIAlscC0+Y3VycmVudF9yeF9za2IgPSBOVUxMOwogCVBSSU5UX1BLVChza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJbmV0aWZfcngoc2tiKTsKIAlscC0+c3RhdHMucnhfcGFja2V0cysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTE5NC5jIGIvZHJpdmVycy9uZXQvc21jOTE5NC5jCmluZGV4IGJkNmU4NDUuLjM2YzFlYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxOTQuYworKysgYi9kcml2ZXJzL25ldC9zbWM5MTk0LmMKQEAgLTEyNjIsNyArMTI2Miw2IEBACiAKIAkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOyAgIC8qIDE2IGJpdCBhbGlnbm1lbnQgKi8KIAotCQlza2ItPmRldiA9IGRldjsKIAkJZGF0YSA9IHNrYl9wdXQoIHNrYiwgcGFja2V0X2xlbmd0aCk7CiAKICNpZmRlZiBVU0VfMzJfQklUCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCmluZGV4IDQ5ZjRiNzcuLjAxY2MzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCkBAIC01NjgsNyArNTY4LDYgQEAKIAkJUFJJTlRfUEtUKGRhdGEsIHBhY2tldF9sZW4gLSA0KTsKIAogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJbmV0aWZfcngoc2tiKTsKIAkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NvbmljLmMgYi9kcml2ZXJzL25ldC9zb25pYy5jCmluZGV4IGVkN2FhMGEuLmM2MzIwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvc29uaWMuYwpAQCAtODUsNyArODUsNiBAQAogCQkJICAgICAgIGRldi0+bmFtZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlza2ItPmRldiA9IGRldjsKIAkJLyogYWxpZ24gSVAgaGVhZGVyIHVubGVzcyBETUEgcmVxdWlyZXMgb3RoZXJ3aXNlICovCiAJCWlmIChTT05JQ19CVVNfU0NBTEUobHAtPmRtYV9iaXRtb2RlKSA9PSAyKQogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKQEAgLTQ1MSw3ICs0NTAsNiBAQAogCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQluZXdfc2tiLT5kZXYgPSBkZXY7CiAJCQkvKiBwcm92aWRlIDE2IGJ5dGUgSVAgaGVhZGVyIGFsaWdubWVudCB1bmxlc3MgRE1BIHJlcXVpcmVzIG90aGVyd2lzZSAqLwogCQkJaWYoU09OSUNfQlVTX1NDQUxFKGxwLT5kbWFfYml0bW9kZSkgPT0gMikKIAkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwppbmRleCBlMzAxOWQ1Li4yMzBkYTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC03MjAsNyArNzIwLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFpbi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApICYmIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0JCXN3aXRjaCAoc2tiLT5uaC5pcGgtPnByb3RvY29sKSB7CisJCXN3aXRjaCAoaXBfaGRyKHNrYiktPnByb3RvY29sKSB7CiAJCWNhc2UgSVBQUk9UT19UQ1A6CiAJCQlod2Rlc2NyLT5kbWFjX2NtZF9zdGF0dXMgfD0gU1BJREVSX05FVF9ETUFDX1RDUDsKIAkJCWJyZWFrOwpAQCAtOTkwLDcgKzk5MCw2IEBACiAJbmV0ZGV2ID0gY2FyZC0+bmV0ZGV2OwogCiAJc2tiID0gZGVzY3ItPnNrYjsKLQlza2ItPmRldiA9IG5ldGRldjsKIAlza2JfcHV0KHNrYiwgaHdkZXNjci0+dmFsaWRfc2l6ZSk7CiAKIAkvKiB0aGUgY2FyZCBzZWVtcyB0byBhZGQgMiBieXRlcyBvZiBqdW5rIGluIGZyb250CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCA4YmJhMmUzLi45ZDZlNDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTE0NTIsNyArMTQ1Miw2IEBACiAJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKIAkJICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKIAkJCQkJCSAgICBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYyBiL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYwppbmRleCA0NzU3YWE2Li4zOTZjM2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMKKysrIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCkBAIC03NzUsNyArNzc1LDYgQEAKIAkJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuKzIpOwogCQkJCQlpZihza2IgIT0gTlVMTCkKIAkJCQkJewotCQkJCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CiAJCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOwogCQkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsKGNoYXIgKikgcC0+YmFzZStzd2FiMzIoKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyKSx0b3RsZW4sMCk7CkBAIC0xMDI3LDcgKzEwMjYsNyBAQAogCQkJbWVtc2V0KChjaGFyICopcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIDAsIEVUSF9aTEVOKTsKIAkJCWxlbiA9IEVUSF9aTEVOOwogCQl9Ci0JCW1lbWNweSgoY2hhciAqKXAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdLChjaGFyICopKHNrYi0+ZGF0YSksc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIHNrYi0+bGVuKTsKIAogI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQogIwlpZmRlZiBOT19OT1BDT01NQU5EUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwppbmRleCA3YmVlNDViLi43OTFlMDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJaGVhZC0+bGVuZ3RoID0gKC1sZW4pIHwgMHhmMDAwOwogCWhlYWQtPm1pc2MgPSAwOwogCi0JbWVtY3B5KCBQS1RCVUZfQUREUihoZWFkKSwgKHZvaWQgKilza2ItPmRhdGEsIHNrYi0+bGVuICk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIFBLVEJVRl9BRERSKGhlYWQpLCBza2ItPmxlbik7CiAJaWYgKGxlbiAhPSBza2ItPmxlbikKIAkJbWVtc2V0KFBLVEJVRl9BRERSKGhlYWQpICsgc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CiAKQEAgLTg1MSwxMCArODUxLDkgQEAKIAkJCQl9CiAKIAotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJLyogMTYgYnl0ZSBhbGlnbiAqLwogCQkJCXNrYl9wdXQoIHNrYiwgcGt0X2xlbiApOwkvKiBNYWtlIHJvb20gKi8KLS8vCQkJICAgICAgICBtZW1jcHkoIHNrYi0+ZGF0YSwgUEtUQlVGX0FERFIoaGVhZCksIHBrdF9sZW4gKTsKKy8vCQkJICAgICAgICBza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIFBLVEJVRl9BRERSKGhlYWQpLCBwa3RfbGVuKTsKIAkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKIAkJCQkJCSBQS1RCVUZfQUREUihoZWFkKSwKIAkJCQkJCSBwa3RfbGVuLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuYwppbmRleCAxOGY4ODg1Li4yYWQ4ZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCkBAIC04NTUsNyArODU1LDYgQEAKIAkJCQlkcm9wcysrOwogCQkJCWdvdG8gZHJvcF9pdDsKIAkJCX0KLQkJCWNvcHlfc2tiLT5kZXYgPSBicC0+ZGV2OwogCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOwogCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKIAkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYnAtPmJpZ21hY19zZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKaW5kZXggYzA2ZWNjOC4uZjUxYmEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCkBAIC0xMzA4LDcgKzEzMDgsNiBAQAogCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKIAkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCiAJCQkJCQkJICAgIGRlc2MtPmZyYWdbMF0uYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggMDdmMzg5MC4uNWRhNzMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTg0MywxMSArODQzLDEwIEBACiAJCQkJZ290byBkcm9wX2l0OwogCQkJfQogCi0JCQljb3B5X3NrYi0+ZGV2ID0gZ3AtPmRldjsKIAkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKIAkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZ3AtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShncC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLwpAQCAtMTAyNywxMCArMTAyNiw4IEBACiAKIAljdHJsID0gMDsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1NjQgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOwotCi0JCWNzdW1fc3RhcnRfb2ZmID0gKHU2NCkgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOwotCQljc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKKwkJY29uc3QgdTY0IGNzdW1fc3RhcnRfb2ZmID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwkJY29uc3QgdTY0IGNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OwogCiAJCWN0cmwgPSAoVFhEQ1RSTF9DRU5BQiB8CiAJCQkoY3N1bV9zdGFydF9vZmYgPDwgMTUpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKaW5kZXggYmYwZDQ4NC4uNTFjM2ZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuaG1lLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKQEAgLTIwNTUsMTEgKzIwNTUsMTAgQEAKIAkJCQlnb3RvIGRyb3BfaXQ7CiAJCQl9CiAKLQkJCWNvcHlfc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJaG1lX2RtYV9zeW5jX2Zvcl9jcHUoaHAsIGRtYV9hZGRyLCBsZW4sIERNQV9GUk9NREVWSUNFKTsKLQkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGNvcHlfc2tiLT5kYXRhLCBsZW4pOwogCQkJaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoaHAsIGRtYV9hZGRyLCBsZW4sIERNQV9GUk9NREVWSUNFKTsKIAogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCkBAIC0yMjY3LDEwICsyMjY2LDggQEAKIAogCXR4X2ZsYWdzID0gVFhGTEFHX09XTjsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1MzIgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOwotCi0JCWNzdW1fc3RhcnRfb2ZmID0gKHUzMikgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOwotCQljc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKKwkJY29uc3QgdTMyIGNzdW1fc3RhcnRfb2ZmID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwkJY29uc3QgdTMyIGNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OwogCiAJCXR4X2ZsYWdzID0gKFRYRkxBR19PV04gfCBUWEZMQUdfQ1NFTkFCTEUgfAogCQkJICAgICgoY3N1bV9zdGFydF9vZmYgPDwgMTQpICYgVFhGTEFHX0NTQlVGQkVHSU4pIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCmluZGV4IGIwOTI5YTQuLjQyNzIyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VubGFuY2UuYwpAQCAtNTQ3LDcgKzU0Nyw2IEBACiAKIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCXNrYl9wdXQoc2tiLCBsZW4pOwkJLyogbWFrZSByb29tICovCiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKQEAgLTcyMSw3ICs3MjAsNiBAQAogCiAJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCi0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLwogCQkJc2tiX3B1dChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KIAkJCWxhbmNlX3Bpb2NvcHlfdG9fc2tiKHNrYiwgJihpYi0+cnhfYnVmW2VudHJ5XVswXSksIGxlbik7CkBAIC0xMTQ1LDcgKzExNDMsNyBAQAogCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CiAJCWliLT5idHhfcmluZyBbZW50cnldLmxlbmd0aCA9ICgtbGVuKSB8IDB4ZjAwMDsKIAkJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7Ci0JCW1lbWNweSgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYmxlbik7CiAJCWlmIChsZW4gIT0gc2tibGVuKQogCQkJbWVtc2V0KChjaGFyICopICZpYi0+dHhfYnVmIFtlbnRyeV1bc2tibGVuXSwgMCwgbGVuIC0gc2tibGVuKTsKIAkJaWItPmJ0eF9yaW5nIFtlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPSyB8IExFX1QxX09XTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwppbmRleCBmM2JhZDU2Li5mYTcwZTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5xZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTQzNyw3ICs0MzcsNiBAQAogCQkJCWRyb3BzKys7CiAJCQkJcWVwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOwogCQkJfSBlbHNlIHsKLQkJCQlza2ItPmRldiA9IHFlcC0+ZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQkJc2tiX3B1dChza2IsIGxlbik7CiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsICh1bnNpZ25lZCBjaGFyICopIHRoaXNfcWJ1ZiwKQEAgLTU5Myw3ICs1OTIsNyBAQAogCS8qIEF2b2lkIGEgcmFjZS4uLiAqLwogCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPSBUWERfVVBEQVRFOwogCi0JbWVtY3B5KHR4YnVmLCBza2ItPmRhdGEsIGxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHR4YnVmLCBsZW4pOwogCiAJcWVwLT5xZV9ibG9jay0+cWVfdHhkW2VudHJ5XS50eF9hZGRyID0gdHhidWZfZHZtYTsKIAlxZXAtPnFlX2Jsb2NrLT5xZV90eGRbZW50cnldLnR4X2ZsYWdzID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RjMzU4MTUuYyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwppbmRleCBlM2E3ZTNjLi5kNzc0MWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90YzM1ODE1LmMKKysrIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCkBAIC0xMTQ1LDcgKzExNDUsNiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAvKiAxNiBiaXQgYWxpZ25tZW50ICovCi0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCA5ZDA3ZDJkLi45NDg4ZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTMzNDgsNyArMzM0OSw3IEBACiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgY29weV9za2ItPmRhdGEsIGxlbik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCS8qIFdlJ2xsIHJldXNlIHRoZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KQEAgLTM5MDcsMjAgKzM5MDgsMjAgQEAKIAkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KQogCQkJbXNzIHw9IChza2JfaGVhZGxlbihza2IpIC0gRVRIX0hMRU4pIDw8IDk7CiAJCWVsc2UgewotCQkJdGNwX29wdF9sZW4gPSAoKHNrYi0+aC50aC0+ZG9mZiAtIDUpICogNCk7Ci0JCQlpcF90Y3BfbGVuID0gKHNrYi0+bmguaXBoLT5paGwgKiA0KSArCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCi0JCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwotCQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsKLQkJCQkJCSAgICAgdGNwX29wdF9sZW4pOworCQkJdGNwX29wdF9sZW4gPSB0Y3Bfb3B0bGVuKHNrYik7CisJCQlpcF90Y3BfbGVuID0gaXBfaGRybGVuKHNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisKKwkJCWlwaC0+Y2hlY2sgPSAwOworCQkJaXBoLT50b3RfbGVuID0gaHRvbnMobXNzICsgaXBfdGNwX2xlbiArIHRjcF9vcHRfbGVuKTsKIAkJCW1zcyB8PSAoaXBfdGNwX2xlbiArIHRjcF9vcHRfbGVuKSA8PCA5OwogCQl9CiAKIAkJYmFzZV9mbGFncyB8PSAoVFhEX0ZMQUdfQ1BVX1BSRV9ETUEgfAogCQkJICAgICAgIFRYRF9GTEFHX0NQVV9QT1NUX0RNQSk7CiAKLQkJc2tiLT5oLnRoLT5jaGVjayA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSAwOwogCiAJfQogCWVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCkBAIC00MDU0LDYgKzQwNTUsNyBAQAogCW1zcyA9IDA7CiAJaWYgKHNrYi0+bGVuID4gKHRwLT5kZXYtPm10dSArIEVUSF9ITEVOKSAmJgogCSAgICAobXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgIT0gMCkgeworCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAkJaW50IHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuLCBoZHJfbGVuOwogCiAJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCkBAIC00MDYyLDggKzQwNjQsOCBAQAogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAKLQkJdGNwX29wdF9sZW4gPSAoKHNrYi0+aC50aC0+ZG9mZiAtIDUpICogNCk7Ci0JCWlwX3RjcF9sZW4gPSAoc2tiLT5uaC5pcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCQl0Y3Bfb3B0X2xlbiA9IHRjcF9vcHRsZW4oc2tiKTsKKwkJaXBfdGNwX2xlbiA9IGlwX2hkcmxlbihza2IpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwogCiAJCWhkcl9sZW4gPSBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW47CiAJCWlmICh1bmxpa2VseSgoRVRIX0hMRU4gKyBoZHJfbGVuKSA+IDgwKSAmJgpAQCAtNDA3MywzNCArNDA3NSwzMSBAQAogCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19DUFVfUFJFX0RNQSB8CiAJCQkgICAgICAgVFhEX0ZMQUdfQ1BVX1BPU1RfRE1BKTsKIAotCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwotCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IGh0b25zKG1zcyArIGhkcl9sZW4pOworCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJaXBoLT5jaGVjayA9IDA7CisJCWlwaC0+dG90X2xlbiA9IGh0b25zKG1zcyArIGhkcl9sZW4pOwogCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pIHsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPSAwOworCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IDA7CiAJCQliYXNlX2ZsYWdzICY9IH5UWERfRkxBR19UQ1BVRFBfQ1NVTTsKLQkJfQotCQllbHNlIHsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPQotCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCQkgICAwLCBJUFBST1RPX1RDUCwgMCk7Ci0JCX0KKwkJfSBlbHNlCisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCisJCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAorCQkJCQkJCQkgSVBQUk9UT19UQ1AsCisJCQkJCQkJCSAwKTsKIAogCQlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB8fAogCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgewotCQkJaWYgKHRjcF9vcHRfbGVuIHx8IHNrYi0+bmguaXBoLT5paGwgPiA1KSB7CisJCQlpZiAodGNwX29wdF9sZW4gfHwgaXBoLT5paGwgPiA1KSB7CiAJCQkJaW50IHRzZmxhZ3M7CiAKLQkJCQl0c2ZsYWdzID0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKwotCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpOworCQkJCXRzZmxhZ3MgPSAoaXBoLT5paGwgLSA1KSArICh0Y3Bfb3B0X2xlbiA+PiAyKTsKIAkJCQltc3MgfD0gKHRzZmxhZ3MgPDwgMTEpOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKHRjcF9vcHRfbGVuIHx8IHNrYi0+bmguaXBoLT5paGwgPiA1KSB7CisJCQlpZiAodGNwX29wdF9sZW4gfHwgaXBoLT5paGwgPiA1KSB7CiAJCQkJaW50IHRzZmxhZ3M7CiAKLQkJCQl0c2ZsYWdzID0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKwotCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpOworCQkJCXRzZmxhZ3MgPSAoaXBoLT5paGwgLSA1KSArICh0Y3Bfb3B0X2xlbiA+PiAyKTsKIAkJCQliYXNlX2ZsYWdzIHw9IHRzZmxhZ3MgPDwgMTI7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uYyBiL2RyaXZlcnMvbmV0L3RsYW4uYwppbmRleCBmODVmMDAyLi4xMDZkYzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5jCkBAIC0xMTEyLDcgKzExMTIsNyBAQAogCiAJaWYgKCBiYnVmICkgewogCQl0YWlsX2J1ZmZlciA9IHByaXYtPnR4QnVmZmVyICsgKCBwcml2LT50eFRhaWwgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7Ci0JCW1lbWNweSggdGFpbF9idWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRhaWxfYnVmZmVyLCBza2ItPmxlbik7CiAJfSBlbHNlIHsKIAkJdGFpbF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCVRMYW5fU3RvcmVTS0IodGFpbF9saXN0LCBza2IpOwpAQCAtMTU3Nyw3ICsxNTc3LDYgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iKTsKIAkJCWVsc2UgewogCQkJCWhlYWRfYnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAocHJpdi0+cnhIZWFkICogVExBTl9NQVhfRlJBTUVfU0laRSk7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIGZyYW1lU2l6ZSk7CiAKQEAgLTE2MDgsNyArMTYwNyw2IEBACiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOwogCQkJCW5ldGlmX3J4KCBza2IgKTsKIAotCQkJCW5ld19za2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZSggbmV3X3NrYiwgMiApOwogCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KCBuZXdfc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7CiAJCQkJaGVhZF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbmV3X3NrYi0+ZGF0YSwgVExBTl9NQVhfRlJBTUVfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKaW5kZXggNzU4MGJkZS4uZTIyYTNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKQEAgLTkzMywyMCArOTMzLDIxIEBACiAJCQkJcmV0dXJuIDsgCQkJCQogCQkJfQogCQotCQkJc2tiLT5kZXYgPSBkZXYgOyAKLQogCQkJd2hpbGUgKHhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAhPSB0ZW1wX3JpbmdfbG9jKSB7IAogCQkJCWNvcHlfbGVuID0geGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiAmIDB4N0ZGRiA7IAogCQkJCWZyYW1lX2xlbmd0aCAtPSBjb3B5X2xlbiA7ICAKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOwotCQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGNvcHlfbGVuKSA7IAorCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSwKKwkJCQkJCQkgIHNrYl9wdXQoc2tiLCBjb3B5X2xlbiksCisJCQkJCQkJICBjb3B5X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKIAkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCiAJCQl9IAogCiAJCQkvKiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbGFzdCBmcmFnbWVudCAqLwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKLQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGZyYW1lX2xlbmd0aCkgOyAKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSwKKwkJCQkgICAgICBza2JfcHV0KHNrYixjb3B5X2xlbiksIGZyYW1lX2xlbmd0aCk7CiAvKgkJCW1lbWNweShza2JfcHV0KHNrYixmcmFtZV9sZW5ndGgpLCBidXNfdG9fdmlydCh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciksIGZyYW1lX2xlbmd0aCkgOyAqLwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKIAkJCWFkdl9yeF9yaW5nKGRldikgOyAKQEAgLTk2Nyw4ICs5NjgsNiBAQAogCQkJCXJldHVybiA7IAogCQkJfQogCi0JCQlza2ItPmRldiA9IGRldiA7IAotCiAJCQlza2IyID0geGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA7IAogCQkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LCB4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciwgeGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCiAJCQlza2JfcHV0KHNrYjIsIGZyYW1lX2xlbmd0aCkgOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKaW5kZXggMDFkNTUzMS4uMWU4OTU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKQEAgLTE3NzEsNyArMTc3MSw2IEBACiAJLypCTVMgYWdhaW4sIGlmIHNoZSBjb21lcyBpbiB3aXRoIGZldyBidXQgbGVhdmVzIHdpdGggbWFueSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSAtIGxhbl9oZHJfbGVuKTsKIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQlza2ItPmRldiA9IGRldjsKIAlkYXRhID0gc2tiLT5kYXRhOwogCXJidWZmZXJfbGVuID0gbnRvaHMocmVhZHcocmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBidWZfbGVuKSkpOwogCXJidWZkYXRhID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKaW5kZXggZTk5OWZlYi4uNWQ4NDljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKQEAgLTk0NCw4ICs5NDQsNiBAQAogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IHBhY2tldCB0byB1cHBlciBsYXllcnMuIFxuIiwJZGV2LT5uYW1lKTsKIAkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQl9IGVsc2UgewkvKiB3ZSBhbGxvY2F0ZWQgYW4gc2tiIE9LICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7Ci0KIAkJCQlpZiAoYnVmZmVyX2NudCA9PSAxKSB7CiAJCQkJCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCiAJCQkJCXBjaV91bm1hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCkBAIC0xNjA3LDEwICsxNjA1LDExIEBACiAJCQkJICAgICAgZnJhbWVfZGF0YSwgYnVmZmVyX2xlbik7CiAJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZmX29mZiA9IG5leHRfcHRyKSk7CiAKKwkJbWFjX2ZyYW1lLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMobWFjX2ZyYW1lLCBkZXYpOwogI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwotCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopIG1hY19mcmFtZS0+ZGF0YTsKKwkJbWFjX2hkciA9IHRyX2hkcihtYWNfZnJhbWUpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IE1BQyBGcmFtZSBEZXN0LiBBZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIG1hY19oZHItPmRhZGRyWzBdLCBtYWNfaGRyLT5kYWRkclsxXSwKQEAgLTE2MjIsOCArMTYyMSw2IEBACiAJCSAgICAgICBtYWNfaGRyLT5zYWRkclsyXSwgbWFjX2hkci0+c2FkZHJbM10sCiAJCSAgICAgICBtYWNfaGRyLT5zYWRkcls0XSwgbWFjX2hkci0+c2FkZHJbNV0pOwogI2VuZGlmCi0JCW1hY19mcmFtZS0+ZGV2ID0gZGV2OwotCQltYWNfZnJhbWUtPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhtYWNfZnJhbWUsIGRldik7CiAJCW5ldGlmX3J4KG1hY19mcmFtZSk7CiAKIAkJLyogTm93IHRlbGwgdGhlIGNhcmQgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSByZWNlaXZlZCBmcmFtZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMKaW5kZXggOGY0ZWNjMS4uMDliM2NmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCkBAIC04MTQsOCArODE0LDYgQEAKIAkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAogCQkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpIDsgIAogCQkJCX0gZWxzZSAgewotCQkJCQlza2ItPmRldiA9IGRldiA7IAotCiAJCQkJCS8qIE9wdGltaXNlIGJhc2VkIHVwb24gbnVtYmVyIG9mIGJ1ZmZlcnMgdXNlZC4gCiAJCQkgICAJICAgCSAgIElmIG9ubHkgb25lIGJ1ZmZlciBpcyB1c2VkIHdlIGNhbiBzaW1wbHkgc3dhcCB0aGUgYnVmZmVycyBhcm91bmQuCiAJCQkgICAJICAgCSAgIElmIG1vcmUgdGhhbiBvbmUgdGhlbiB3ZSBtdXN0IHVzZSB0aGUgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgaW5mb3JtYXRpb24KQEAgLTg0Nyw3ICs4NDUsOSBAQAogCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShvbHltcGljX3ByaXYtPnBkZXYsCiAJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKIAkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOyAKLQkJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsbGVuZ3RoLTQpLG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS0+ZGF0YSxsZW5ndGgtNCkgOyAKKwkJCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSwKKwkJCQkJCQkJICAgICAgc2tiX3B1dChza2IsbGVuZ3RoIC0gNCksCisJCQkJCQkJCSAgICAgIGxlbmd0aCAtIDQpOwogCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShvbHltcGljX3ByaXYtPnBkZXYsCiAJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKIAkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOwpAQCAtODY0LDcgKzg2NCw5IEBACiAJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCiAJCQkJCQkJcnhfZGVzYyA9ICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSk7CiAJCQkJCQkJY3B5X2xlbmd0aCA9IChpID09IDEgPyBmcmFnX2xlbiA6IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPnJlc19sZW5ndGgpKTsgCi0JCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBjcHlfbGVuZ3RoKSwgb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLT5kYXRhLCBjcHlfbGVuZ3RoKSA7CisJCQkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0sCisJCQkJCQkJCSAgICAgIHNrYl9wdXQoc2tiLCBjcHlfbGVuZ3RoKSwKKwkJCQkJCQkJICAgICAgY3B5X2xlbmd0aCk7CiAJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG9seW1waWNfcHJpdi0+cGRldiwKIAkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAogCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CkBAIC0xNDQwLDE2ICsxNDQyLDE2IEBACiAJCQluZXh0X3B0cj1yZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsbmV4dCkpOyAKIAkJfSB3aGlsZSAobmV4dF9wdHIgJiYgKGJ1Zl9wdHI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG50b2hzKG5leHRfcHRyKSkpOwogCisJCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSwgZGV2KTsKKwogCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKIAkJCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyIDsgCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsZGV2LT5uYW1lKSA7Ci0JCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopbWFjX2ZyYW1lLT5kYXRhIDsgCisJCQltYWNfaGRyID0gdHJfaGRyKG1hY19mcmFtZSk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwgZGV2LT5uYW1lICwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLCBtYWNfaGRyLT5kYWRkclsyXSwgbWFjX2hkci0+ZGFkZHJbM10sIG1hY19oZHItPmRhZGRyWzRdLCBtYWNfaGRyLT5kYWRkcls1XSkgOyAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBkZXYtPm5hbWUgLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sIG1hY19oZHItPnNhZGRyWzJdLCBtYWNfaGRyLT5zYWRkclszXSwgbWFjX2hkci0+c2FkZHJbNF0sIG1hY19oZHItPnNhZGRyWzVdKSA7IAogCQl9Ci0JCW1hY19mcmFtZS0+ZGV2ID0gZGV2IDsgCi0JCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSxkZXYpOwotCQluZXRpZl9yeChtYWNfZnJhbWUpIDsgCQorCQluZXRpZl9yeChtYWNfZnJhbWUpOwogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCiBkcm9wX2ZyYW1lOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBjZWMyODJhLi45YmJlYTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMzg4OSwxNCArMzg4OSwxMyBAQAogCiAgICAgICAgICAgICAgICAgLyogU2xpZGUgZGF0YSBpbnRvIGEgc2xlZWsgc2tiLiAqLwogICAgICAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBza2ItPmxlbik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSwgcm1mLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBybWYsIHNrYi0+bGVuKTsKIAogICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBDb3VudGVycyAqLwogICAgICAgICAgICAgICAgIHRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKICAgICAgICAgICAgICAgICB0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAogICAgICAgICAgICAgICAgIC8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KLSAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CiAgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKIAkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTQ0NzYsMTQgKzQ0NzUsMTMgQEAKIAkJCQlpZiAoc2tiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1lbWNweShza2ItPmRhdGEsIHBidWZmLCByeF9zaXplKTsKKwkJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwYnVmZiwgcnhfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIFVwZGF0ZSBDb3VudGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPk1hY1N0YXQucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPk1hY1N0YXQucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV0aWZfcngoc2tiKTsKIAkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKaW5kZXggZWE3OTdjYS4uMTJiZDI5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJZG1hYnVmICA9IDA7CiAJCWkgCT0gdHAtPlRwbEZyZWUtPlRQTEluZGV4OwogCQlidWYgCT0gdHAtPkxvY2FsVHhCdWZmZXJzW2ldOwotCQltZW1jcHkoYnVmLCBza2ItPmRhdGEsIGxlbmd0aCk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBidWYsIGxlbmd0aCk7CiAJCW5ld2J1ZiAJPSAoKGNoYXIgKilidWYgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXI7CiAJfQogCWVsc2UgewpAQCAtMjE2OCw3ICsyMTY4LDYgQEAKIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKLQkJCQkJc2tiLT5kZXYJPSBkZXY7CiAJCQkJCXNrYl9wdXQoc2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CiAJCQkJCXJwbC0+U2tiU3RhdCAJPSBTS0JfREFUQV9DT1BZOwogCQkJCQlSZWNlaXZlRGF0YVB0ciAJPSBycGwtPk1EYXRhOwpAQCAtMjE3OSw3ICsyMTc4LDggQEAKIAkJCQl8fCBycGwtPlNrYlN0YXQgPT0gU0tCX0RNQV9ESVJFQ1QpKQogCQkJewogCQkJCWlmKHJwbC0+U2tiU3RhdCA9PSBTS0JfREFUQV9DT1BZKQotCQkJCQltZW1jcHkoc2tiLT5kYXRhLCBSZWNlaXZlRGF0YVB0ciwgTGVuZ3RoKTsKKwkJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBSZWNlaXZlRGF0YVB0ciwKKwkJCQkJCSAgICAgICBMZW5ndGgpOwogCiAJCQkJLyogRGVsaXZlciBmcmFtZSB0byBzeXN0ZW0gKi8KIAkJCQlycGwtPlNrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKaW5kZXggZDkyYzVjNS4uMGJmYzJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguYwpAQCAtNzg4LDcgKzc4OCw2IEBACiAJCQlwcmludGsoIi5cbiIpOwogCQl9CiAKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9wdXQoc2tiLCBkYXRhLT5yeHJpbmdbcnhdLmxlbik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggYTBlZGE1Ni4uODYxNzI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtNDM1LDcgKzQzNSw2IEBACiAJCQlyeF93b3JrID0gMTAwOwogCQkJZ290byByeF9uZXh0OwogCQl9Ci0JCWNvcHlfc2tiLT5kZXYgPSBkZS0+ZGV2OwogCiAJCWlmICghY29weWluZ19za2IpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsIG1hcHBpbmcsCkBAIC00NTAsOCArNDQ5LDggQEAKIAkJfSBlbHNlIHsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIFJYX09GRlNFVCk7Ci0JCQltZW1jcHkoc2tiX3B1dChjb3B5X3NrYiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOwotCisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChjb3B5X3NrYiwgbGVuKSwKKwkJCQkJCSAgbGVuKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQkvKiBXZSdsbCByZXVzZSB0aGUgb3JpZ2luYWwgcmluZyBidWZmZXIuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwppbmRleCBlNGFmOTRlLi42MjE0M2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKQEAgLTM2MzAsNyArMzYzMCw2IEBACiAgICAgcCA9IGRldl9hbGxvY19za2IoSUVFRTgwMl8zX1NaICsgREU0WDVfQUxJR04gKyAyKTsKICAgICBpZiAoIXApIHJldHVybiBOVUxMOwogCi0gICAgcC0+ZGV2ID0gZGV2OwogICAgIHRtcCA9IHZpcnRfdG9fYnVzKHAtPmRhdGEpOwogICAgIGkgPSAoKHRtcCArIERFNFg1X0FMSUdOKSAmIH5ERTRYNV9BTElHTikgLSB0bXA7CiAgICAgc2tiX3Jlc2VydmUocCwgaSk7CkBAIC0zNjUxLDcgKzM2NTAsNiBAQAogICAgIHAgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogICAgIGlmICghcCkgcmV0dXJuIE5VTEw7CiAKLSAgICBwLT5kZXYgPSBkZXY7CiAgICAgc2tiX3Jlc2VydmUocCwgMik7CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlnbiAqLwogICAgIGlmIChpbmRleCA8IGxwLT5yeF9vbGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyYXBwZWQgYnVmZmVyICovCiAJc2hvcnQgdGxlbiA9IChscC0+cnhSaW5nU2l6ZSAtIGxwLT5yeF9vbGQpICogUlhfQlVGRl9TWjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwppbmRleCA5YWVhYzc2Li5iM2E2NGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCkBAIC02ODIsNyArNjgyLDcgQEAKIAogCS8qIHRyYW5zbWl0IHRoaXMgcGFja2V0ICovCiAJdHhwdHIgPSBkYi0+dHhfaW5zZXJ0X3B0cjsKLQltZW1jcHkodHhwdHItPnR4X2J1Zl9wdHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0eHB0ci0+dHhfYnVmX3B0ciwgc2tiLT5sZW4pOwogCXR4cHRyLT50ZGVzMSA9IGNwdV90b19sZTMyKDB4ZTEwMDAwMDAgfCBza2ItPmxlbik7CiAKIAkvKiBQb2ludCB0byBuZXh0IHRyYW5zbWl0IGZyZWUgZGVzY3JpcHRvciAqLwpAQCAtOTg4LDE0ICs5ODgsMTQgQEAKIAogCQkJCQkJc2tiID0gbmV3c2tiOwogCQkJCQkJLyogc2l6ZSBsZXNzIHRoYW4gQ09QWV9TSVpFLCBhbGxvY2F0ZSBhIHJ4bGVuIFNLQiAqLwotCQkJCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNmJ5dGUgYWxpZ24gKi8KLQkJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcnhsZW4pLCByeHB0ci0+cnhfc2tiX3B0ci0+ZGF0YSwgcnhsZW4pOworCQkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShyeHB0ci0+cnhfc2tiX3B0ciwKKwkJCQkJCQkgIHNrYl9wdXQoc2tiLCByeGxlbiksCisJCQkJCQkJCQkgIHJ4bGVuKTsKIAkJCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJfSBlbHNlCiAJCQkJCQlza2JfcHV0KHNrYiwgcnhsZW4pOwotCQkJCQl9CisKIAkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQkJbmV0aWZfcngoc2tiKTsKIAkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKaW5kZXggZTM0ODhkNy4uZTg2ZGYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKQEAgLTE5Miw3ICsxOTIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAgLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsCiAJCQkJCQkJCSAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLApAQCAtNDE2LDcgKzQxNSw2IEBACiAJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCiAJCQlpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhawogCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwKIAkJCQkJCQkgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKaW5kZXggMjI5MTU4ZS4uY2EyNTQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwpAQCAtNTgzLDcgKzU4Myw3IEBACiAKIAkvKiB0cmFuc21pdCB0aGlzIHBhY2tldCAqLwogCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7Ci0JbWVtY3B5KHR4cHRyLT50eF9idWZfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdHhwdHItPnR4X2J1Zl9wdHIsIHNrYi0+bGVuKTsKIAl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2tiLT5sZW4pOwogCiAJLyogUG9pbnQgdG8gbmV4dCB0cmFuc21pdCBmcmVlIGRlc2NyaXB0b3IgKi8KQEAgLTgyOCwxNCArODI4LDE0IEBACiAJCQkJCSggKHNrYiA9IGRldl9hbGxvY19za2IocnhsZW4gKyAyKSApCiAJCQkJCSE9IE5VTEwpICkgewogCQkJCQkvKiBzaXplIGxlc3MgdGhhbiBDT1BZX1NJWkUsIGFsbG9jYXRlIGEgcnhsZW4gU0tCICovCi0JCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNmJ5dGUgYWxpZ24gKi8KLQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksIHJ4cHRyLT5yeF9za2JfcHRyLT50YWlsLCByeGxlbik7CisJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcnhsZW4pLAorCQkJCQkgICAgICAgc2tiX3RhaWxfcG9pbnRlcihyeHB0ci0+cnhfc2tiX3B0ciksCisJCQkJCSAgICAgICByeGxlbik7CiAJCQkJCXVsaTUyNnhfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJfSBlbHNlCiAJCQkJCXNrYl9wdXQoc2tiLCByeGxlbik7Ci0JCQkJfQorCiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQluZXRpZl9yeChza2IpOwogCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CkBAIC0xMTc3LDcgKzExNzcsMTAgQEAKIAogCWlmICghKHJ4cHRyLT5yZGVzMCAmIGNwdV90b19sZTMyKDB4ODAwMDAwMDApKSkgewogCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsKLQkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPnRhaWwsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKKwkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoZGItPnBkZXYsCisJCQkJCQkJICBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCQkJCQkJICBSWF9BTExPQ19TSVpFLAorCQkJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCXdtYigpOwogCQlyeHB0ci0+cmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKIAkJZGItPnJ4X2F2YWlsX2NudCsrOwpAQCAtMTM0MSw3ICsxMzQ0LDEwIEBACiAJCWlmICggKCBza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUpICkgPT0gTlVMTCApCiAJCQlicmVhazsKIAkJcnhwdHItPnJ4X3NrYl9wdHIgPSBza2I7IC8qIEZJWE1FICg/KSAqLwotCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwKKwkJCQkJCQkgIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkJCQkgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJd21iKCk7CiAJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwogCQlyeHB0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwppbmRleCBlMTY0YTBkLi41YjcxYWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKQEAgLTgxMyw3ICs4MTMsNiBAQAogCQlucC0+cnhfc2tidWZmW2ldID0gc2tiOwogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlicmVhazsKLQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQlucC0+cnhfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LHNrYi0+ZGF0YSwKIAkJCQkJbnAtPnJ4X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCkBAIC0xMjI5LDcgKzEyMjgsNiBAQAogCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKIAkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAogCQkJCQkJCSAgICBucC0+cnhfc2tidWZmW2VudHJ5XS0+bGVuLApAQCAtMTI3OCw3ICsxMjc2LDYgQEAKIAkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOwogCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCWJyZWFrOwkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCi0JCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlucC0+cnhfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKIAkJCQkJCQlza2ItPmRhdGEsCiAJCQkJCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKaW5kZXggNjFkMzEzMC4uOTg1YTE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKQEAgLTQxMSw5ICs0MTEsOSBAQAogCQkJICAgc29tZXRpbWVzIHNlbmRzIG1vcmUgdGhhbiB5b3UgYXNrIGl0IHRvLiAqLwogCiAJCQltZW1zZXQoJmNhcmQtPnR4X2J1ZmZlcltidWZmZXJvZmZzZXRzW2Rlc2NdLzRdLDAsMTUzNik7Ci0JCQltZW1jcHkoJihjYXJkLT50eF9idWZmZXJbYnVmZmVyb2Zmc2V0c1tkZXNjXS80XSksc2tiLT5kYXRhLHNrYi0+bGVuKTsKLQotCisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkgICYoY2FyZC0+dHhfYnVmZmVyW2J1ZmZlcm9mZnNldHNbZGVzY10gLyA0XSksCisJCQkJCQkgIHNrYi0+bGVuKTsKIAkJCS8qIEZJWE1FOiBUaGUgc3BlY2lmaWNhdGlvbiB0ZWxscyB1cyB0aGF0IHRoZSBsZW5ndGggd2Ugc2VuZCBIQVMgdG8gYmUgYSBtdWx0aXBsZSBvZgogCQkJICAgNCBieXRlcy4gKi8KIApAQCAtMTIwNyw3ICsxMjA3LDYgQEAKIAkJCQljYXJkLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIqKSZjYXJkLT5yeF9idWZmZXJbYnVmZmVyb2Zmc2V0IC8gNF0sIHBrdF9sZW4sIDApOwogCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwppbmRleCAxNWExYmU2Li5mNjQxNzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwpAQCAtOTE1LDcgKzkxNSw5IEBACiAKIAl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAlpZiAodHAtPmNoaXBfaWQgPT0gWDMyMDFfMykgewotCQltZW1jcHkodHAtPnR4X2FsaWduZWRfc2tidWZmW2VudHJ5XS0+ZGF0YSxza2ItPmRhdGEsc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJICB0cC0+dHhfYWxpZ25lZF9za2J1ZmZbZW50cnldLT5kYXRhLAorCQkJCQkgIHNrYi0+bGVuKTsKIAkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyh0cC0+dHhfYWxpZ25lZF9za2J1ZmZbZW50cnldLT5kYXRhKTsKIAl9IGVsc2UKIAkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyhza2ItPmRhdGEpOwpAQCAtMTIzOCw3ICsxMjQwLDYgQEAKIAkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKIAkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgYnVzX3RvX3ZpcnQodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCA1NjQzZDFlLi5hMmM2Y2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtMTgsNiArMTgsMTAgQEAKIC8qCiAgKiAgQ2hhbmdlczoKICAqCisgKiAgQnJpYW4gQnJhdW5zdGVpbiA8bGludXhrZXJuZWxAYnJpc3R5bGUuY29tPiAyMDA3LzAzLzIzCisgKiAgICBGaXhlZCBodyBhZGRyZXNzIGhhbmRsaW5nLiAgTm93IG5ldF9kZXZpY2UuZGV2X2FkZHIgaXMga2VwdCBjb25zaXN0ZW50CisgKiAgICB3aXRoIHR1bi5kZXZfYWRkciB3aGVuIHRoZSBhZGRyZXNzIGlzIHNldCBieSB0aGlzIG1vZHVsZS4KKyAqCiAgKiAgTWlrZSBLZXJzaGF3IDxkcmFnb3JuQGtpc21ldHdpcmVsZXNzLm5ldD4gMjAwNS8wOC8xNAogICogICAgQWRkIFRVTlNFVExJTksgaW9jdGwgdG8gc2V0IHRoZSBsaW5rIGVuY2Fwc3VsYXRpb24KICAqCkBAIC0xOTYsNyArMjAwLDEwIEBACiAJCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdHVuX25ldF9tY2xpc3Q7CiAKIAkJZXRoZXJfc2V0dXAoZGV2KTsKLQkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CisKKwkJLyogcmFuZG9tIGFkZHJlc3MgYWxyZWFkeSBjcmVhdGVkIGZvciB1cyBieSB0dW5fc2V0X2lmZiwgdXNlIGl0ICovCisJCW1lbWNweShkZXYtPmRldl9hZGRyLCB0dW4tPmRldl9hZGRyLCBtaW4oc2l6ZW9mKHR1bi0+ZGV2X2FkZHIpLCBzaXplb2YoZGV2LT5kZXZfYWRkcikpICk7CisKIAkJZGV2LT50eF9xdWV1ZV9sZW4gPSBUVU5fUkVBRFFfU0laRTsgIC8qIFdlIHByZWZlciBvdXIgb3duIHF1ZXVlIGxlbmd0aCAqLwogCQlicmVhazsKIAl9CkBAIC0yNTQsMTEgKzI2MSwxMSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlza2ItPmRldiA9IHR1bi0+ZGV2OwogCXN3aXRjaCAodHVuLT5mbGFncyAmIFRVTl9UWVBFX01BU0spIHsKIAljYXNlIFRVTl9UVU5fREVWOgotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBwaS5wcm90bzsKKwkJc2tiLT5kZXYgPSB0dW4tPmRldjsKIAkJYnJlYWs7CiAJY2FzZSBUVU5fVEFQX0RFVjoKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLT5kZXYpOwpAQCAtMzg2LDggKzM5Myw4IEBACiAJCSAqICAgLSB3ZSBhcmUgbXVsdGljYXN0IHByb21pc2NvdXMuCiAJCSAqICAgLSB3ZSBiZWxvbmcgdG8gdGhlIG11bHRpY2FzdCBncm91cC4KIAkJICovCi0JCW1lbWNweShhZGRyLCBza2ItPmRhdGEsCi0JCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZiBhZGRyLCBza2ItPmxlbikpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgYWRkciwgbWluX3Qoc2l6ZV90LCBzaXplb2YgYWRkciwKKwkJCQkJCQkJICAgc2tiLT5sZW4pKTsKIAkJYml0X25yID0gZXRoZXJfY3JjKHNpemVvZiBhZGRyLCBhZGRyKSA+PiAyNjsKIAkJaWYgKCh0dW4tPmlmX2ZsYWdzICYgSUZGX1BST01JU0MpIHx8CiAJCQkJbWVtY21wKGFkZHIsIHR1bi0+ZGV2X2FkZHIsIHNpemVvZiBhZGRyKSA9PSAwIHx8CkBAIC02MzYsNiArNjQzLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNJT0NHSUZIV0FERFI6CisJCS8qIE5vdGU6IHRoZSBhY3R1YWwgbmV0IGRldmljZSdzIGFkZHJlc3MgbWF5IGJlIGRpZmZlcmVudCAqLwogCQltZW1jcHkoaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgdHVuLT5kZXZfYWRkciwKIAkJCQltaW4oc2l6ZW9mIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHNpemVvZiB0dW4tPmRldl9hZGRyKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoIGFyZ3AsICZpZnIsIHNpemVvZiBpZnIpKQpAQCAtNjQzLDE2ICs2NTEsMjQgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNJT0NTSUZIV0FERFI6Ci0JCS8qKiBTZXQgdGhlIGNoYXJhY3RlciBkZXZpY2UncyBoYXJkd2FyZSBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgd2hlbgotCQkgKiBmaWx0ZXJpbmcgcGFja2V0cyBiZWluZyBzZW50IGZyb20gdGhlIG5ldHdvcmsgZGV2aWNlIHRvIHRoZSBjaGFyYWN0ZXIKLQkJICogZGV2aWNlLiAqLwotCQltZW1jcHkodHVuLT5kZXZfYWRkciwgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwKLQkJCQltaW4oc2l6ZW9mIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHNpemVvZiB0dW4tPmRldl9hZGRyKSk7Ci0JCURCRyhLRVJOX0RFQlVHICIlczogc2V0IGhhcmR3YXJlIGFkZHJlc3M6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAotCQkJCXR1bi0+ZGV2LT5uYW1lLAotCQkJCXR1bi0+ZGV2X2FkZHJbMF0sIHR1bi0+ZGV2X2FkZHJbMV0sIHR1bi0+ZGV2X2FkZHJbMl0sCi0JCQkJdHVuLT5kZXZfYWRkclszXSwgdHVuLT5kZXZfYWRkcls0XSwgdHVuLT5kZXZfYWRkcls1XSk7Ci0JCXJldHVybiAwOworCXsKKwkJLyogdHJ5IHRvIHNldCB0aGUgYWN0dWFsIG5ldCBkZXZpY2UncyBodyBhZGRyZXNzICovCisJCWludCByZXQgPSBkZXZfc2V0X21hY19hZGRyZXNzKHR1bi0+ZGV2LCAmaWZyLmlmcl9od2FkZHIpOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGhhcmR3YXJlIGFkZHJlc3MuIFRoaXMgaXMgdXNlZCB3aGVuCisJCQkgKiBmaWx0ZXJpbmcgcGFja2V0cyBiZWluZyBzZW50IGZyb20gdGhlIG5ldHdvcmsgZGV2aWNlIHRvIHRoZSBjaGFyYWN0ZXIKKwkJCSAqIGRldmljZS4gKi8KKwkJCW1lbWNweSh0dW4tPmRldl9hZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLAorCQkJCQltaW4oc2l6ZW9mIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHNpemVvZiB0dW4tPmRldl9hZGRyKSk7CisJCQlEQkcoS0VSTl9ERUJVRyAiJXM6IHNldCBoYXJkd2FyZSBhZGRyZXNzOiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJCXR1bi0+ZGV2X2FkZHJbMF0sIHR1bi0+ZGV2X2FkZHJbMV0sIHR1bi0+ZGV2X2FkZHJbMl0sCisJCQkJCXR1bi0+ZGV2X2FkZHJbM10sIHR1bi0+ZGV2X2FkZHJbNF0sIHR1bi0+ZGV2X2FkZHJbNV0pOworCQl9CisKKwkJcmV0dXJuICByZXQ7CisJfQogCiAJY2FzZSBTSU9DQURETVVMVEk6CiAJCS8qKiBBZGQgdGhlIHNwZWNpZmllZCBncm91cCB0byB0aGUgY2hhcmFjdGVyIGRldmljZSdzIG11bHRpY2FzdCBmaWx0ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwppbmRleCAwZDkxZDA5Li5mMmRkNzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90eXBob29uLmMKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0xNzA4LDcgKzE3MDgsNiBAQAogCiAJCWlmKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKIAkJICAgKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotCQkJbmV3X3NrYi0+ZGV2ID0gdHAtPmRldjsKIAkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwKIAkJCQkJCSAgICBQS1RfQlVGX1NaLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwppbmRleCBmM2E5NzJlLi5hZGVhMjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYworKysgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpAQCAtMTQ4Niw3ICsxNDg2LDYgQEAKIAkJCSAgIGNvcHlpbmcgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKIAkJCQkoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocnAtPnBkZXYsCiAJCQkJCQkJICAgIHJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKaW5kZXggOGU1ZDgyMC4uMjViNzViNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTEzMzksNyArMTMzOSw4IEBACiAJCQlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19JUF9BTElHTikKIAkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKIAotCQkJbWVtY3B5KG5ld19za2ItPmRhdGEsIHJ4X3NrYlswXS0+ZGF0YSwgcGt0X3NpemUpOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShyeF9za2JbMF0sIG5ld19za2ItPmRhdGEsCisJCQkJCQkgIHBrdF9zaXplKTsKIAkJCSpyeF9za2IgPSBuZXdfc2tiOwogCQkJcmV0ID0gMDsKIAkJfQpAQCAtMTM5OCw3ICsxMzk5LDYgQEAKIAkJdnB0ci0+c3RhdHMubXVsdGljYXN0Kys7CiAKIAlza2IgPSByZF9pbmZvLT5za2I7Ci0Jc2tiLT5kZXYgPSB2cHRyLT5kZXY7CiAKIAlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiX2RtYSwKIAkJCQkgICAgdnB0ci0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTQyOCw3ICsxNDI4LDcgQEAKIAkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCXNrYl9wdXQoc2tiLCBwa3RfbGVuIC0gNCk7Ci0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHZwdHItPmRldik7CiAKIAlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAluZXRpZl9yeChza2IpOwpAQCAtMTkyOCw3ICsxOTI4LDcgQEAKIAlpZiAocGt0bGVuIDwgRVRIX1pMRU4pIHsKIAkJLyogQ2Fubm90IG9jY3VyIHVudGlsIFpDIHN1cHBvcnQgKi8KIAkJcGt0bGVuID0gRVRIX1pMRU47Ci0JCW1lbWNweSh0ZGluZm8tPmJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0ZGluZm8tPmJ1Ziwgc2tiLT5sZW4pOwogCQltZW1zZXQodGRpbmZvLT5idWYgKyBza2ItPmxlbiwgMCwgRVRIX1pMRU4gLSBza2ItPmxlbik7CiAJCXRkaW5mby0+c2tiID0gc2tiOwogCQl0ZGluZm8tPnNrYl9kbWFbMF0gPSB0ZGluZm8tPmJ1Zl9kbWE7CkBAIC0xOTQ0LDcgKzE5NDQsNyBAQAogCQlpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAkJdGRpbmZvLT5za2IgPSBza2I7CiAJCWlmIChuZnJhZ3MgPiA2KSB7Ci0JCQltZW1jcHkodGRpbmZvLT5idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRkaW5mby0+YnVmLCBza2ItPmxlbik7CiAJCQl0ZGluZm8tPnNrYl9kbWFbMF0gPSB0ZGluZm8tPmJ1Zl9kbWE7CiAJCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0KIAkJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVswXSk7CkBAIC0yMDA3LDcgKzIwMDcsNyBAQAogCSAqLwogCWlmICgodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKQogCQkJCSAmJiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKLQkJc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gaXBfaGRyKHNrYik7CiAJCWlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCiAJCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gVENSMF9UQ1BDSzsKIAkJZWxzZSBpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVURQKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKaW5kZXggNWI4MmU0Zi4uMjM0NjQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYworKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC03NzMsNyArNzczLDcgQEAKIAl9CiAJY2hhbi0+cnhfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOwogCWNoYW4tPnJ4X3NrYi0+ZGV2ID0gY2hhbi0+cHBwZGV2LmRldjsKLQljaGFuLT5yeF9za2ItPm1hYy5yYXcgPSBjaGFuLT5yeF9za2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoY2hhbi0+cnhfc2tiKTsKIAljaGFuLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJY2hhbi0+c3RhdHMucnhfYnl0ZXMgKz0gY2hhbi0+Y29zYS0+cnhzaXplOwogCW5ldGlmX3J4KGNoYW4tPnJ4X3NrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCmluZGV4IGE2MzFkMWMuLjAxNmIzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCkBAIC04MzQsNyArODM0LDcgQEAKIAkrK2NoYW4tPmlmc3RhdHMucnhfcGFja2V0czsKIAljaGFuLT5pZnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCW5ldGlmX3J4KHNrYik7CiAJZGV2LT5sYXN0X3J4ID0gamlmZmllczsJCS8qIHRpbWVzdGFtcCAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2RsY2kuYyBiL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMKaW5kZXggNzM2OTg3NS4uNjZiZTIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2RsY2kuYworKysgYi9kcml2ZXJzL25ldC93YW4vZGxjaS5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlpZiAocHJvY2VzcykKIAl7CiAJCS8qIHdlJ3ZlIHNldCB1cCB0aGUgcHJvdG9jb2wsIHNvIGRpc2NhcmQgdGhlIGhlYWRlciAqLwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7IAorCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2JfcHVsbChza2IsIGhlYWRlcik7CiAJCWRscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCW5ldGlmX3J4KHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCmluZGV4IDI1MDIxYTcuLmRjYTAyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC0xOTA0LDcgKzE5MDQsOCBAQAogCQlzdHJ1Y3QgVHhGRCAqdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBsYXN0OwogCiAJCXNrYi0+bGVuID0gRFVNTVlfU0tCX1NJWkU7Ci0JCW1lbWNweShza2ItPmRhdGEsIHZlcnNpb24sIHN0cmxlbih2ZXJzaW9uKSVEVU1NWV9TS0JfU0laRSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgdmVyc2lvbiwKKwkJCQkJc3RybGVuKHZlcnNpb24pICUgRFVNTVlfU0tCX1NJWkUpOwogCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKERVTU1ZX1NLQl9TSVpFKTsKIAkJdHhfZmQtPmRhdGEgPSBwY2lfbWFwX3NpbmdsZShkcHJpdi0+cGNpX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkJICAgICBEVU1NWV9TS0JfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwppbmRleCBjNDVkNmE4Li41OGE1M2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTg2NCw3ICs4NjQsNyBAQAogc3RhdGljIF9fYmUxNiBmYXJzeW5jX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJcmV0dXJuIGh0b25zKEVUSF9QX0NVU1QpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKaW5kZXggYzk2NjRmZC4uMDBlMGFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBjaXNjb19wYWNrZXQpKTsKIAlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOwogCXNrYi0+ZGV2ID0gZGV2OwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJZGV2X3F1ZXVlX3htaXQoc2tiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCmluZGV4IGM2YzNjNzUuLmFlYjI3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwpAQCAtNTMzLDcgKzUzMyw3IEBACiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKE5MUElEX0NDSVRUX0FOU0lfTE1JKTsKIAkJZnJfaGFyZF9oZWFkZXIoJnNrYiwgTE1JX0NDSVRUX0FOU0lfRExDSSk7CiAJfQotCWRhdGEgPSBza2ItPnRhaWw7CisJZGF0YSA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlkYXRhW2krK10gPSBMTUlfQ0FMTFJFRjsKIAlkYXRhW2krK10gPSBkY2UgPyBMTUlfU1RBVFVTIDogTE1JX1NUQVRVU19FTlFVSVJZOwogCWlmIChsbWkgPT0gTE1JX0FOU0kpCkBAIC01OTAsNyArNTkwLDcgQEAKIAlza2JfcHV0KHNrYiwgaSk7CiAJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWRldl9xdWV1ZV94bWl0KHNrYik7CiB9CkBAIC0xMDExLDcgKzEwMTEsNiBAQAogCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCWlmIChwdmMtPnN0YXRlLmJlY24pCiAJCQlzdGF0cy0+cnhfY29tcHJlc3NlZCsrOwotCQlza2ItPmRldiA9IGRldjsKIAkJbmV0aWZfcngoc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMgYi9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMKaW5kZXggYTAyYzVmYi4uOWJhM2U0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYwpAQCAtNTksNyArNTksNyBAQAogCS8qIERyb3AgdGhlIENSQyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSBhbmQgbmVnb3RpYXRlIGl0IDspICovCiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbi0yKTsKIAlza2ItPnByb3RvY29sPV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7Ci0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+ZGV2PWMtPm5ldGRldmljZTsKIAkvKgogCSAqCVNlbmQgaXQgdG8gdGhlIFBQUCBsYXllci4gV2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIHByb2Nlc3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYwppbmRleCAyYjU0ZjFiLi5hZTEzMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogICAgICAgICAgICAgaWYgKG5zYikgewogICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gbnNiOwogICAgICAgICAgICAgICAgIG5zYi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAobnNiLT50YWlsKTsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMoc2tiX3RhaWxfcG9pbnRlcihuc2IpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDE7CiAgICAgICAgICAgICBnb3RvIHNraXBfcGFja2V0OwpAQCAtMTY2Nyw4ICsxNjY3LDggQEAKICAgICAgICAgICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKLSAgICAgICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLS8vICAgICAgICAgICAgc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisgICAgICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworICAgICAgICAgICAgLyogc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7ICovCiAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKICAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgc2tiKTsKIApAQCAtMTY3OSw3ICsxNjc5LDcgQEAKICAgICAgICAgICAgIGlmIChuc2IpIHsKICAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKICAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYl90YWlsX3BvaW50ZXIobnNiKSk7CiAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXJyZWQgdG8gMjExNDAgYmVsb3cgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMTcwMiwxMSArMTcwMiwxMSBAQAogICAgICAgICAgICAgaWYoIW5zYikgewogICAgICAgICAgICAgICAgIGdvdG8gZ2l2ZV9pdF9hbnl3YXlzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQobnNiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisgICAgICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChuc2IsIGxlbiksIGxlbik7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIG5zYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKLSAgICAgICAgICAgIG5zYi0+bWFjLnJhdyA9IG5zYi0+ZGF0YTsKLS8vICAgICAgICAgICAgbnNiLT5uaC5yYXcgPSBuc2ItPmRhdGE7CisgICAgICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihuc2IpOworICAgICAgICAgICAgLyogc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKG5zYik7ICovCiAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKICAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgbnNiKTsKICAgICAgICAgfQpAQCAtMTkzMiw3ICsxOTMyLDcgQEAKICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzID0gMHg4MDAwMDAwMDsKIAogICAgICAgICAvKiB1c2VkIHRvIGJlIFBLVF9CVUZfU1ogbm93IHVzZXMgc2tiIHNpbmNlIHdlIGxvc2Ugc29tZSB0byBoZWFkIHJvb20gKi8KLSAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0ubGVuZ3RoID0gc2tiLT5lbmQgLSBza2ItPmRhdGE7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmxlbmd0aCA9IHNrYl90YWlscm9vbShza2IpOwogCiAgICAgICAgIC8qIHVzZSB0byBiZSB0YWlsIHdoaWNoIGlzIGR1bWIgc2luY2UgeW91J3JlIHRoaW5raW5nIHdoeSB3cml0ZQogICAgICAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBwYWNraixldCBidXQgc2luY2UgdGhlcmUncyBub3RoaW5nIHRoZXJlIHRhaWwgPT0gZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCmluZGV4IDYyMTg0ZGUuLjk5OWJmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYworKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKQEAgLTE3NTUsMTcgKzE3NTUsMTcgQEAKIAogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJc2tiLT5sZW4gPSAxMCArIHNrYl9tYWluLT5sZW47CiAKLQltZW1jcHkoc2tiLT5kYXRhLCBkZXYtPm5hbWUsIDUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgZGV2LT5uYW1lLCA1KTsKIAlza2ItPmRhdGFbNV0gPSAnWyc7CiAJc2tiLT5kYXRhWzZdID0gcnhfdHg7CiAJc2tiLT5kYXRhWzddID0gJ10nOwogCXNrYi0+ZGF0YVs4XSA9ICc6JzsKIAlza2ItPmRhdGFbOV0gPSAnICc7Ci0JbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBza2JfbWFpbi0+ZGF0YSwgc2tiX21haW4tPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2JfbWFpbiwgJnNrYi0+ZGF0YVsxMF0sIHNrYl9tYWluLT5sZW4pOwogCiAJbmV0aWZfcngoc2tiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwppbmRleCA1ODczYzM0Li4wN2RiZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCkBAIC0xMDAzLDE3ICsxMDAzLDE3IEBACiAJc2tiX3B1dCAoc2tiLCAxMCArIGxlbik7IAogCXNrYi0+ZGV2ID0gZGV2LT5kZXY7IAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsgCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOyAKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsgCiAJc2tiLT5sZW4gPSAxMCArIGxlbjsgCiAKLQltZW1jcHkoc2tiLT5kYXRhLGRldi0+ZGV2LT5uYW1lLDUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgZGV2LT5kZXYtPm5hbWUsIDUpOwogCXNrYi0+ZGF0YVs1XSA9ICdbJzsgCiAJc2tiLT5kYXRhWzZdID0gcnh0eDsgCiAJc2tiLT5kYXRhWzddID0gJ10nOyAKIAlza2ItPmRhdGFbOF0gPSAnOic7IAogCXNrYi0+ZGF0YVs5XSA9ICcgJzsgCi0JbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBidWYsIGxlbik7IAorCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEwLCBidWYsIGxlbik7CiAJbmV0aWZfcngoc2tiKTsgCiB9IAkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKaW5kZXggZmM1YzBjNi4uMzVlZGVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCkBAIC05OTksMTEgKzk5OSw2IEBACiAJaWYoICFza2IgKQogCQlyZXR1cm4gIE5VTEw7CiAKLSNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKLQlza2ItPmRldiA9ICgoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXYpLT5tYXN0ZXI7Ci0jZWxzZQotCXNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCiAJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkJLyogQWxpZ24gSVAgb24gbG9uZ3dvcmQgYm91bmRhcmllcyAqLwogCXJldHVybiAgc2tiOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwppbmRleCA3MGZiMWI5Li4xMzEzNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwpAQCAtNjEsNyArNjEsNyBAQAogCS8qIERyb3AgdGhlIENSQyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSBhbmQgbmVnb3RpYXRlIGl0IDspICovCiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbi0yKTsKIAlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX1dBTl9QUFApOwotCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPmRldj1jLT5uZXRkZXZpY2U7CiAJLyoKIAkgKglTZW5kIGl0IHRvIHRoZSBQUFAgbGF5ZXIuIFdlIGRvbid0IGhhdmUgdGltZSB0byBwcm9jZXNzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwppbmRleCAyMThmN2I1Li42N2ZjNjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlza2ItPmRldj1kZXY7Ci0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKaW5kZXggOGI0NTQwYi4uOThlZjQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpAQCAtMTY1Niw3ICsxNjU2LDcgQEAKIAkJZWxzZQogCQl7CiAJCQlza2JfcHV0KHNrYiwgY3QpOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcnhiLCBjdCk7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHJ4YiwgY3QpOwogCQkJYy0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJYy0+c3RhdHMucnhfYnl0ZXMrPWN0OwogCQl9CkBAIC0xNzgyLDcgKzE3ODIsNyBAQAogCQkgKi8KIAkJYy0+dHhfbmV4dF9wdHI9Yy0+dHhfZG1hX2J1ZltjLT50eF9kbWFfdXNlZF07CiAJCWMtPnR4X2RtYV91c2VkXj0xOwkvKiBGbGlwIHRlbXAgYnVmZmVyICovCi0JCW1lbWNweShjLT50eF9uZXh0X3B0ciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjLT50eF9uZXh0X3B0ciwgc2tiLT5sZW4pOwogCX0KIAllbHNlCiAJCWMtPnR4X25leHRfcHRyPXNrYi0+ZGF0YTsJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCBlY2UzZDljLi40NDI2ODQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTIsNDcgKzIsMjEgQEAKICMgV2lyZWxlc3MgTEFOIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIldpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKSIKK21lbnUgIldpcmVsZXNzIExBTiIKKworY29uZmlnIFdMQU5fUFJFODAyMTEKKwlib29sICJXaXJlbGVzcyBMQU4gKHByZS04MDIuMTEpIgogCWRlcGVuZHMgb24gTkVUREVWSUNFUwotCi1jb25maWcgTkVUX1JBRElPCi0JYm9vbCAiV2lyZWxlc3MgTEFOIGRyaXZlcnMgKG5vbi1oYW1yYWRpbykgJiBXaXJlbGVzcyBFeHRlbnNpb25zIgotCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciB3aXJlbGVzcyBMQU5zIGFuZCBldmVyeXRoaW5nIGhhdmluZyB0byBkbyB3aXRoIHJhZGlvLAotCSAgYnV0IG5vdCB3aXRoIGFtYXRldXIgcmFkaW8gb3IgRk0gYnJvYWRjYXN0aW5nLgorCSAgU2F5IFkgaWYgeW91IGhhdmUgYW55IHByZS04MDIuMTEgd2lyZWxlc3MgTEFOIGhhcmR3YXJlLgogCi0JICBTYXlpbmcgWSBoZXJlIGFsc28gZW5hYmxlcyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyAoY3JlYXRlcwotCSAgL3Byb2MvbmV0L3dpcmVsZXNzIGFuZCBlbmFibGVzIGl3Y29uZmlnIGFjY2VzcykuIFRoZSBXaXJlbGVzcwotCSAgRXh0ZW5zaW9uIGlzIGEgZ2VuZXJpYyBBUEkgYWxsb3dpbmcgYSBkcml2ZXIgdG8gZXhwb3NlIHRvIHRoZSB1c2VyCi0JICBzcGFjZSBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHNwZWNpZmljIHRvIGNvbW1vbiBXaXJlbGVzcyBMQU5zLgotCSAgVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IGEgc2luZ2xlIHNldCBvZiB0b29sIGNhbiBzdXBwb3J0IGFsbCB0aGUKLQkgIHZhcmlhdGlvbnMgb2YgV2lyZWxlc3MgTEFOcywgcmVnYXJkbGVzcyBvZiB0aGVpciB0eXBlIChhcyBsb25nIGFzCi0JICB0aGUgZHJpdmVyIHN1cHBvcnRzIFdpcmVsZXNzIEV4dGVuc2lvbikuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQKLQkgIHRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlIGNoYW5nZWQgb24gdGhlIGZseSB3aXRob3V0IHJlc3RhcnRpbmcgdGhlCi0JICBkcml2ZXIgKG9yIExpbnV4KS4gSWYgeW91IHdpc2ggdG8gdXNlIFdpcmVsZXNzIEV4dGVuc2lvbnMgd2l0aAotCSAgd2lyZWxlc3MgUENNQ0lBIChQQy0pIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyB5b3UgY2FuIGZldGNoCi0JICB0aGUgdG9vbHMgZnJvbQotCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCi0KLWNvbmZpZyBORVRfV0lSRUxFU1NfUlRORVRMSU5LCi0JYm9vbCAiV2lyZWxlc3MgRXh0ZW5zaW9uIEFQSSBvdmVyIFJ0TmV0bGluayIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTwotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBBUEkgb3ZlciB0aGUgUnROZXRsaW5rIHNvY2tldAotCSAgaW4gYWRkaXRpb24gdG8gdGhlIHRyYWRpdGlvbmFsIGlvY3RsIGludGVyZmFjZSAoc2VsZWN0ZWQgYWJvdmUpLgotCi0JICBGb3Igbm93LCBmZXcgdG9vbHMgdXNlIHRoaXMgZmFjaWxpdHksIGJ1dCBpdCBtaWdodCBncm93IGluIHRoZQotCSAgZnV0dXJlLiBUaGUgb25seSBkb3duc2lkZSBpcyB0aGF0IGl0IGFkZHMgNC41IGtCIHRvIHlvdXIga2VybmVsLgotCi0jIE5vdGUgOiB0aGUgY2FyZHMgYXJlIG9ic29sZXRlIChjYW4ndCBidXkgdGhlbSBhbnltb3JlKSwgYnV0IHRoZSBkcml2ZXJzCi0jIGFyZSBub3QsIGFzIHBlb3BsZSBhcmUgc3RpbGwgdXNpbmcgdGhlbS4uLgotY29tbWVudCAiT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElORVQgfHwgSVNBIHx8IFBDTUNJQSkKKwkgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUga2VybmVsIGJ1aWxkLCBpdCBvbmx5CisJICBsZXRzIHlvdSBjaG9vc2UgZHJpdmVycy4KIAogY29uZmlnIFNUUklQCiAJdHJpc3RhdGUgIlNUUklQIChNZXRyaWNvbSBzdGFybW9kZSByYWRpbyBJUCkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSU5FVAorCWRlcGVuZHMgb24gSU5FVCAmJiBXTEFOX1BSRTgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGlmIHlvdSBoYXZlIGEgTWV0cmljb20gcmFkaW8gYW5kIGludGVuZCB0byB1c2UgU3Rhcm1vZGUgUmFkaW8KIAkgIElQLiBTVFJJUCBpcyBhIHJhZGlvIHByb3RvY29sIGRldmVsb3BlZCBmb3IgdGhlIE1vc3F1aXRvTmV0IHByb2plY3QKQEAgLTY1LDcgKzM5LDggQEAKIAogY29uZmlnIEFSTEFOCiAJdHJpc3RhdGUgIkFpcm9uZXQgQXJsYW4gNjU1ICYgSUMyMjAwIERTIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmICE2NEJJVAorCWRlcGVuZHMgb24gSVNBICYmICE2NEJJVCAmJiBXTEFOX1BSRTgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIEFpcm9uZXQgbWFrZXMgQXJsYW4sIGEgY2xhc3Mgb2Ygd2lyZWxlc3MgTEFOIGFkYXB0ZXJzLiBUaGVzZSB1c2UgdGhlCiAJICB3d3cuVGVseG9uLmNvbSBjaGlwLCB3aGljaCBpcyBhbHNvIHVzZWQgb24gc2V2ZXJhbCBzaW1pbGFyIGNhcmRzLgpAQCAtODAsNyArNTUsOCBAQAogCiBjb25maWcgV0FWRUxBTgogCXRyaXN0YXRlICJBVCZUL0x1Y2VudCBvbGQgV2F2ZUxBTiAmIERFQyBSb2FtQWJvdXQgRFMgSVNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EgJiYgV0xBTl9QUkU4MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCiAJICBUaGUgTHVjZW50IFdhdmVMQU4gKGZvcm1lcmx5IE5DUiBhbmQgQVQmVDsgb3IgREVDIFJvYW1BYm91dCBEUykgaXMKIAkgIGEgUmFkaW8gTEFOICh3aXJlbGVzcyBFdGhlcm5ldC1saWtlIExvY2FsIEFyZWEgTmV0d29yaykgdXNpbmcgdGhlCkBAIC0xMDcsNyArODMsOCBAQAogCiBjb25maWcgUENNQ0lBX1dBVkVMQU4KIAl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gUGNtY2lhIHdpcmVsZXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgV0xBTl9QUkU4MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEFUJlQvTHVjZW50IFdhdmVsYW4gUENNQ0lBCiAJICAoUEMtY2FyZCkgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuICBUaGlzCkBAIC0xMTgsNyArOTUsOCBAQAogCiBjb25maWcgUENNQ0lBX05FVFdBVkUKIAl0cmlzdGF0ZSAiWGlyY29tIE5ldHdhdmUgQWlyU3VyZmVyIFBjbWNpYSB3aXJlbGVzcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCWRlcGVuZHMgb24gUENNQ0lBICYmIFdMQU5fUFJFODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgUENNQ0lBIChQQy1jYXJkKQogCSAgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC0xMjYsMTIgKzEwNCwyMCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgbmV0d2F2ZV9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbW1lbnQgIldpcmVsZXNzIDgwMi4xMSBGcmVxdWVuY3kgSG9wcGluZyBjYXJkcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCitjb25maWcgV0xBTl84MDIxMQorCWJvb2wgIldpcmVsZXNzIExBTiAoSUVFRSA4MDIuMTEpIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGlmIHlvdSBoYXZlIGFueSA4MDIuMTEgd2lyZWxlc3MgTEFOIGhhcmR3YXJlLgorCisJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGtlcm5lbCBidWlsZCwgaXQgb25seQorCSAgbGV0cyB5b3UgY2hvb3NlIGRyaXZlcnMuCiAKIGNvbmZpZyBQQ01DSUFfUkFZQ1MKIAl0cmlzdGF0ZSAiQXZpYXRvci9SYXl0aGVvbiAyLjRNSHogd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gQXZpYXRvci9SYXl0aGVvbiBQQ01DSUEKIAkgIChQQy1jYXJkKSB3aXJlbGVzcyBFdGhlcm5ldCBuZXR3b3JraW5nIGNhcmQgdG8geW91ciBjb21wdXRlci4KQEAgLTE0MSwxMiArMTI3LDEwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCByYXlfY3MuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCi0KIGNvbmZpZyBJUFcyMTAwCiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAyMTAwIE5ldHdvcmsgQ29ubmVjdGlvbiIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgSUVFRTgwMjExCiAJLS0taGVscC0tLQpAQCAtMjAwLDcgKzE4NCw4IEBACiAKIGNvbmZpZyBJUFcyMjAwCiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAyMjAwQkcgYW5kIDI5MTVBQkcgTmV0d29yayBDb25uZWN0aW9uIgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFdMQU5fODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBJRUVFODAyMTEKIAktLS1oZWxwLS0tCkBAIC0yODIsNyArMjY3LDggQEAKIAogY29uZmlnIEFJUk8KIAl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBJU0EgYW5kIFBDSSBjYXJkcyIKLSAJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBX0RNQV9BUEkgJiYgKFBDSSB8fCBCUk9LRU4pCisJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSSAmJiBXTEFOXzgwMjExICYmIChQQ0kgfHwgQlJPS0VOKQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgQ1JZUFRPCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIHRvIHN1cHBvcnQgQ2lzY28vQWlyb25ldCBJU0EgYW5kCkBAIC0yOTksNyArMjg1LDggQEAKIAogY29uZmlnIEhFUk1FUwogCXRyaXN0YXRlICJIZXJtZXMgY2hpcHNldCA4MDIuMTFiIHN1cHBvcnQgKE9yaW5vY28vUHJpc20yL1N5bWJvbCkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKFBQQ19QTUFDIHx8IFBDSSB8fCBQQ01DSUEpCisJZGVwZW5kcyBvbiAoUFBDX1BNQUMgfHwgUENJIHx8IFBDTUNJQSkgJiYgV0xBTl84MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCiAJICBBIGRyaXZlciBmb3IgODAyLjExYiB3aXJlbGVzcyBjYXJkcyBiYXNlZCBvbiB0aGUgIkhlcm1lcyIgb3IKIAkgIEludGVyc2lsIEhGQTM4NHggKFByaXNtIDIpIE1BQyBjb250cm9sbGVyLiAgVGhpcyBpbmNsdWRlcyB0aGUgdmFzdApAQCAtMzczLDcgKzM2MCw4IEBACiAKIGNvbmZpZyBBVE1FTAogICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTB4IGNoaXBzZXQgIDgwMi4xMWIgc3VwcG9ydCIKLSAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIChQQ0kgfHwgUENNQ0lBKQorICAgICAgZGVwZW5kcyBvbiAoUENJIHx8IFBDTUNJQSkgJiYgV0xBTl84MDIxMQorICAgICAgc2VsZWN0IFdJUkVMRVNTX0VYVAogICAgICAgc2VsZWN0IEZXX0xPQURFUgogICAgICAgc2VsZWN0IENSQzMyCiAgICAgICAgLS0taGVscC0tLQpAQCAtMzk0LDEzICszODIsOSBAQAogICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSBjYXJkcyBjb250YWluaW5nIHRoZQogICAgICAgICBBdG1lbCBhdDc2YzUwNiBjaGlwLgogCi0jIElmIFBjbWNpYSBpcyBjb21waWxlZCBpbiwgb2ZmZXIgUGNtY2lhIGNhcmRzLi4uCi1jb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCi0KIGNvbmZpZyBQQ01DSUFfSEVSTUVTCiAJdHJpc3RhdGUgIkhlcm1lcyBQQ01DSUEgY2FyZCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQSAmJiBIRVJNRVMKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBIRVJNRVMKIAktLS1oZWxwLS0tCiAJICBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKIAkgIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCkBAIC00MjAsNyArNDA0LDcgQEAKIAogY29uZmlnIFBDTUNJQV9TUEVDVFJVTQogCXRyaXN0YXRlICJTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5IFBDTUNJQSBjYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBICYmIEhFUk1FUworCWRlcGVuZHMgb24gUENNQ0lBICYmIEhFUk1FUwogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAKQEAgLTQzNCw3ICs0MTgsOCBAQAogCiBjb25maWcgQUlST19DUwogCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIFBDTUNJQSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEgJiYgKEJST0tFTiB8fCAhTTMyUikKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiAoQlJPS0VOIHx8ICFNMzJSKSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX0FFUwogCS0tLWhlbHAtLS0KQEAgLTQ1OCw3ICs0NDMsOCBAQAogCiBjb25maWcgUENNQ0lBX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAyL2F0NzZjNTA0IFBDTUNJQSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBBVE1FTCAmJiBQQ01DSUEKKwlkZXBlbmRzIG9uIEFUTUVMICYmIFBDTUNJQQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQpAQCAtNDY3LDE3ICs0NTMsMTcgQEAKIAogY29uZmlnIFBDTUNJQV9XTDM1MDEKICAgICAgIHRyaXN0YXRlICJQbGFuZXQgV0wzNTAxIFBDTUNJQSBjYXJkcyIKLSAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTCAmJiBQQ01DSUEKKyAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBDTUNJQSAmJiBXTEFOXzgwMjExCisgICAgICBzZWxlY3QgV0lSRUxFU1NfRVhUCiAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgQSBkcml2ZXIgZm9yIFdMMzUwMSBQQ01DSUEgODAyLjExIHdpcmVsZXNzIGNhcmRzIG1hZGUgYnkgUGxhbmV0LgogCSBJdCBoYXMgYmFzaWMgc3VwcG9ydCBmb3IgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbAogCSBtaWNybyBzdXBwb3J0IGZvciBldGh0b29sLgogCi1jb21tZW50ICJQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQogY29uZmlnIFBSSVNNNTQKIAl0cmlzdGF0ZSAnSW50ZXJzaWwgUHJpc20gR1QvRHVldHRlL0luZGlnbyBQQ0kvQ2FyZGJ1cycgCi0JZGVwZW5kcyBvbiBQQ0kgJiYgTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTCAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgUENJIGFuZCBDYXJkYnVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgY2hpcHNldCBiYXNlZCBjYXJkczoKQEAgLTUyMyw3ICs1MDksOCBAQAogCiBjb25maWcgVVNCX1pEMTIwMQogCXRyaXN0YXRlICJVU0IgWkQxMjAxIGJhc2VkIFdpcmVsZXNzIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIE5FVF9SQURJTworCWRlcGVuZHMgb24gVVNCICYmIFdMQU5fODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSB3aXJlbGVzcyBMQU4gYWRhcHRlcnMgYmFzZWQgb24gdGhlIFp5REFTCkBAIC01NDIsMTEgKzUyOSw0IEBACiBzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZpZyIKIAotIyB5ZXMsIHRoaXMgd29ya3MgZXZlbiB3aGVuIG5vIGRyaXZlcnMgYXJlIHNlbGVjdGVkCi1jb25maWcgTkVUX1dJUkVMRVNTCi0JYm9vbAotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJU0EgfHwgUENJIHx8IFBQQ19QTUFDIHx8IFBDTUNJQSkKLQlkZWZhdWx0IHkKLQogZW5kbWVudQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggMmFkYTc2YS4uN2ZlMGE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtMjQ0NCw3ICsyNDQ0LDcgQEAKIAogc3RhdGljIGludCB3bGxfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQogewotCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsgMTAsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGFkZHIsIHNrYl9tYWNfaGVhZGVyKHNrYikgKyAxMCwgRVRIX0FMRU4pOwogCXJldHVybiBFVEhfQUxFTjsKIH0KIApAQCAtMzQxMSwxNCArMzQxMSwxMiBAQAogCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9SWCk7CiAKIAkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKLQkJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKIAkJCQlza2ItPmRldiA9IGFwcml2LT53aWZpZGV2OwogCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7Ci0JCQl9IGVsc2UgewotCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJfSBlbHNlCiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotCQkJfQogCQkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCkBAIC0zNjQxLDcgKzM2MzksNiBAQAogCQl9CiAjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCiAKLQkJc2tiLT5kZXYgPSBhaS0+ZGV2OwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFpLT5kZXYpOwogCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CkBAIC0zNzQ5LDcgKzM3NDYsNyBAQAogCQl3aXJlbGVzc19zcHlfdXBkYXRlKGFpLT5kZXYsIHNhLCAmd3N0YXRzKTsKIAl9CiAjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJc2tiLT5kZXYgPSBhaS0+d2lmaWRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCmluZGV4IDQ2ODhlNTYuLjQ5OGU4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMKQEAgLTE1MDAsNyArMTUwMCw2IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2J0bXAgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAKIAkJCW1lbWNweV9mcm9taW8oc2tidG1wICsgQVJMQU5fRkFLRV9IRFJfTEVOLCAoKGNoYXIgX19pb21lbSAqKSBhcmxhbikgKyByeE9mZnNldCwgcGt0X2xlbiAtIEFSTEFOX0ZBS0VfSERSX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCAyM2ViYTY5Li41MWE3ZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTgyNywxNCArODI3LDE0IEBACiAJaWYgKHByaXYtPndlcF9pc19vbikKIAkJZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRDsKIAlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgc2tiLT5kYXRhLCA2KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZWFkZXIuYWRkcjEsIDYpOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7CiAJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBwcml2LT5CU1NJRCwgNik7CiAJfSBlbHNlIHsKIAkJZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CiAJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7Ci0JCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBza2ItPmRhdGEsIDYpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmhlYWRlci5hZGRyMywgNik7CiAJfQogCiAJaWYgKHByaXYtPnVzZV93cGEpCkBAIC05MjAsNyArOTIwLDYgQEAKIAkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIyLCA2KTsgLyogc291cmNlIGFkZHJlc3MgKi8KIAogCXByaXYtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBwcml2LT5kZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJbmV0aWZfcngoc2tiKTsKQEAgLTEwMjgsNyArMTAyNyw2IEBACiAJCQkJICAgICAgIHByaXYtPnJ4X2J1ZiwKIAkJCQkgICAgICAgcHJpdi0+ZnJhZ19sZW4gKyAxMik7CiAJCQkJcHJpdi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJCQlza2ItPmRldiA9IHByaXYtPmRldjsKIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2LT5kZXYpOwogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9LY29uZmlnCmluZGV4IDUzMzk5M2YuLmNlMzk3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgQkNNNDNYWAogCXRyaXN0YXRlICJCcm9hZGNvbSBCQ000M3h4IHdpcmVsZXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSUVFRTgwMjExICYmIElFRUU4MDIxMV9TT0ZUTUFDICYmIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFBDSSAmJiBJRUVFODAyMTEgJiYgSUVFRTgwMjExX1NPRlRNQUMgJiYgV0xBTl84MDIxMSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBIV19SQU5ET00KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMKaW5kZXggNmUwZGM3Ni4uZTNkMmU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuYwpAQCAtOTk4LDcgKzk5OCw4IEBACiAJCQlhc3NlcnQoMCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KHNrYl9wdXQoYm91bmNlX3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoYm91bmNlX3NrYiwgc2tiLT5sZW4pLAorCQkJCQkgIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJc2tiID0gYm91bmNlX3NrYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCmluZGV4IDMwOGY3NzMuLjFmZWYzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEhPU1RBUAogCXRyaXN0YXRlICJJRUVFIDgwMi4xMSBmb3IgSG9zdCBBUCAoUHJpc20yLzIuNS8zIGFuZCBXRVAvVEtJUC9DQ01QKSIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTworCWRlcGVuZHMgb24gV0xBTl84MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgSUVFRTgwMjExCiAJc2VsZWN0IElFRUU4MDIxMV9DUllQVF9XRVAKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKaW5kZXggN2UwNGRjOS4uY2JlZGM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIAlyZXQgPSBza2ItPmxlbiAtIHBoZHJsZW47CiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOwogCWlmIChwcmlzbV9oZWFkZXIpCiAJCXNrYl9wdWxsKHNrYiwgcGhkcmxlbik7CkBAIC05MzMsMTIgKzkzMywxNCBAQAogCQlpZiAoZnJhZyA9PSAwKSB7CiAJCQkvKiBjb3B5IGZpcnN0IGZyYWdtZW50IChpbmNsdWRpbmcgZnVsbCBoZWFkZXJzKSBpbnRvCiAJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IGNhY2hlIHNrYiAqLwotCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEsIGZsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLAorCQkJCQkJICBmbGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CiAJCQkgKiBjYWNoZSBza2IgKi8KLQkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAotCQkJICAgICAgIGZsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBoZHJsZW4sCisJCQkJCQkJIHNrYl9wdXQoZnJhZ19za2IsCisJCQkJCQkJCSBmbGVuKSwgZmxlbik7CiAJCX0KIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlza2IgPSBOVUxMOwpAQCAtMTA0NCw4ICsxMDQ2LDkgQEAKIAkgICAgc2tiLT5sZW4gPj0gRVRIX0hMRU4gKyBFVEhfQUxFTikgewogCQkvKiBOb24tc3RhbmRhcmQgZnJhbWU6IGdldCBhZGRyNCBmcm9tIGl0cyBib2d1cyBsb2NhdGlvbiBhZnRlcgogCQkgKiB0aGUgcGF5bG9hZCAqLwotCQltZW1jcHkoc2tiLT5kYXRhICsgRVRIX0FMRU4sCi0JCSAgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiAtIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgc2tiLT5sZW4gLSBFVEhfQUxFTiwKKwkJCQkJCSBza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJCQkJCSBFVEhfQUxFTik7CiAJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBFVEhfQUxFTik7CiAJfQogCkBAIC0xMDczLDE3ICsxMDc2LDE3IEBACiAKIAlpZiAoc2tiMiAhPSBOVUxMKSB7CiAJCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KLQkJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKLQkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7Ci0JCS8qIHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGEgKyBFVEhfSExFTjsgKi8KIAkJc2tiMi0+ZGV2ID0gZGV2OworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IyKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQkvKiBza2IyLT5uZXR3b3JrX2hlYWRlciArPSBFVEhfSExFTjsgKi8KIAkJZGV2X3F1ZXVlX3htaXQoc2tiMik7CiAJfQogCiAJaWYgKHNrYikgewogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCW5ldGlmX3J4KHNrYik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKaW5kZXggNGE1YmU3MC4uMjQ2ZmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYwpAQCAtMTQ2LDcgKzE0Niw4IEBACiAJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTOwogCQkJLyogRnJvbSZUbyBEUzogQWRkcjEgPSBSQSwgQWRkcjIgPSBUQSwgQWRkcjMgPSBEQSwKIAkJCSAqIEFkZHI0ID0gU0EgKi8KLQkJCW1lbWNweSgmaGRyLmFkZHI0LCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwKKwkJCQkJCQkgJmhkci5hZGRyNCwgRVRIX0FMRU4pOwogCQkJaGRyX2xlbiArPSBFVEhfQUxFTjsKIAkJfSBlbHNlIHsKIAkJCS8qIGJvZ3VzIDQtYWRkciBmb3JtYXQgdG8gd29ya2Fyb3VuZCBQcmlzbTIgc3RhdGlvbgpAQCAtMTU5LDcgKzE2MCw4IEBACiAJCQkvKiBTQSBmcm9tIHNrYi0+ZGF0YSArIEVUSF9BTEVOIHdpbGwgYmUgYWRkZWQgYWZ0ZXIKIAkJCSAqIGZyYW1lIHBheWxvYWQ7IHVzZSBoZHIuYWRkcjQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyCiAJCQkgKi8KLQkJCW1lbWNweSgmaGRyLmFkZHI0LCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwKKwkJCQkJCQkgJmhkci5hZGRyNCwgRVRIX0FMRU4pOwogCQkJbmVlZF90YWlscm9vbSArPSBFVEhfQUxFTjsKIAkJfQogCkBAIC0xNzQsMjQgKzE3NiwyNyBAQAogCQllbHNlCiAJCQltZW1jcHkoJmhkci5hZGRyMSwgbG9jYWwtPmJzc2lkLCBFVEhfQUxFTik7CiAJCW1lbWNweSgmaGRyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweSgmaGRyLmFkZHIzLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjMsIEVUSF9BTEVOKTsKIAl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF0b19hc3NvY19hcCkgewogCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFM7CiAJCS8qIEZyb20gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gQlNTSUQsIEFkZHIzID0gU0EgKi8KLQkJbWVtY3B5KCZoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmhkci5hZGRyMSwgRVRIX0FMRU4pOwogCQltZW1jcHkoJmhkci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMywgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwgJmhkci5hZGRyMywKKwkJCQkJCSBFVEhfQUxFTik7CiAJfSBlbHNlIGlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IHRvX2Fzc29jX2FwKSB7CiAJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CiAJCS8qIFRvIERTOiBBZGRyMSA9IEJTU0lELCBBZGRyMiA9IFNBLCBBZGRyMyA9IERBICovCiAJCW1lbWNweSgmaGRyLmFkZHIxLCB0b19hc3NvY19hcCA/CiAJCSAgICAgICBsb2NhbC0+YXNzb2NfYXBfYWRkciA6IGxvY2FsLT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMiwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKLQkJbWVtY3B5KCZoZHIuYWRkcjMsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIEVUSF9BTEVOLCAmaGRyLmFkZHIyLAorCQkJCQkJIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjMsIEVUSF9BTEVOKTsKIAl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsIEFkZHIzID0gQlNTSUQgKi8KLQkJbWVtY3B5KCZoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMiwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjEsIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwgJmhkci5hZGRyMiwKKwkJCQkJCSBFVEhfQUxFTik7CiAJCW1lbWNweSgmaGRyLmFkZHIzLCBsb2NhbC0+YnNzaWQsIEVUSF9BTEVOKTsKIAl9CiAKQEAgLTIzNyw3ICsyNDIsNyBAQAogCWlmYWNlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJaWZhY2UtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CiAJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOwogCW1ldGEtPm1hZ2ljID0gSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCmluZGV4IGVmYjhjZjMuLjRjYThhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKQEAgLTk4Miw3ICs5ODIsOCBAQAogCW1ldGEtPnR4X2NiX2lkeCA9IHR4X2NiX2lkeDsKIAogCXNrYi0+ZGV2ID0gZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZGV2X3F1ZXVlX3htaXQoc2tiKTsKIH0KICNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCkBAIC0xMjc2LDggKzEyNzcsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltZW1jcHkodG1wYnVmLCBza2ItPmRhdGEgKyBhcC0+Y3J5cHQtPmV4dHJhX21wZHVfcHJlZml4X2xlbiwKLQkgICAgICAgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgYXAtPmNyeXB0LT5leHRyYV9tcGR1X3ByZWZpeF9sZW4sCisJCQkJCSB0bXBidWYsIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlyZXR1cm4gdG1wYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCmluZGV4IDMwNzkzNzguLmZiMDFmYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKQEAgLTE4MzgsMTMgKzE4MzgsMTQgQEAKIAogCS8qIHNrYi0+ZGF0YSBzdGFydHMgd2l0aCB0eGRlc2MtPmZyYW1lX2NvbnRyb2wgKi8KIAloZHJfbGVuID0gMjQ7Ci0JbWVtY3B5KCZ0eGRlc2MuZnJhbWVfY29udHJvbCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJnR4ZGVzYy5mcmFtZV9jb250cm9sLCBoZHJfbGVuKTsKICAJZmMgPSBsZTE2X3RvX2NwdSh0eGRlc2MuZnJhbWVfY29udHJvbCk7CiAJaWYgKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBICYmCiAJICAgIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgJiYKIAkgICAgc2tiLT5sZW4gPj0gMzApIHsKIAkJLyogQWRkcjQgKi8KLQkJbWVtY3B5KHR4ZGVzYy5hZGRyNCwgc2tiLT5kYXRhICsgaGRyX2xlbiwgRVRIX0FMRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGhkcl9sZW4sIHR4ZGVzYy5hZGRyNCwKKwkJCQkJCSBFVEhfQUxFTik7CiAJCWhkcl9sZW4gKz0gRVRIX0FMRU47CiAJfQogCkBAIC0yMjE3LDcgKzIyMTgsNyBAQAogCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIHBheWxvYWQsIGxlbik7CiAKIAlza2ItPmRldiA9IGxvY2FsLT5kZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAljYi0+ZnVuYyhza2IsIG9rLCBjYi0+ZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCmluZGV4IDkwNzdlNmUuLjFmOWVkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCkBAIC01OTAsMjAgKzU5MCwyMCBAQAogCiBpbnQgaG9zdGFwXzgwMjExX2hlYWRlcl9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcikKIHsKLQltZW1jcHkoaGFkZHIsIHNrYi0+bWFjLnJhdyArIDEwLCBFVEhfQUxFTik7IC8qIGFkZHIyICovCisJbWVtY3B5KGhhZGRyLCBza2JfbWFjX2hlYWRlcihza2IpICsgMTAsIEVUSF9BTEVOKTsgLyogYWRkcjIgKi8KIAlyZXR1cm4gRVRIX0FMRU47CiB9CiAKIAogaW50IGhvc3RhcF84MDIxMV9wcmlzbV9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCiB7Ci0JaWYgKCoodTMyICopc2tiLT5tYWMucmF3ID09IExXTkdfQ0FQX0RJRF9CQVNFKSB7Ci0JCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIpICsgMTAsCisJY29uc3QgdW5zaWduZWQgY2hhciAqbWFjID0gc2tiX21hY19oZWFkZXIoc2tiKTsKKworCWlmICgqKHUzMiAqKW1hYyA9PSBMV05HX0NBUF9ESURfQkFTRSkgeworCQltZW1jcHkoaGFkZHIsIG1hYyArIHNpemVvZihzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIpICsgMTAsCiAJCSAgICAgICBFVEhfQUxFTik7IC8qIGFkZHIyICovCi0JfSBlbHNlIHsgLyogKCoodTMyICopc2tiLT5tYWMucmF3ID09IGh0b25sKExXTkdfQ0FQSERSX1ZFUlNJT04pKSAqLwotCQltZW1jcHkoaGFkZHIsIHNrYi0+bWFjLnJhdyArCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGxpbnV4X3dsYW5fbmdfY2FwX2hkcikgKyAxMCwKKwl9IGVsc2UgeyAvKiAoKih1MzIgKiltYWMgPT0gaHRvbmwoTFdOR19DQVBIRFJfVkVSU0lPTikpICovCisJCW1lbWNweShoYWRkciwgbWFjICsgc2l6ZW9mKHN0cnVjdCBsaW51eF93bGFuX25nX2NhcF9oZHIpICsgMTAsCiAJCSAgICAgICBFVEhfQUxFTik7IC8qIGFkZHIyICovCiAJfQogCXJldHVybiBFVEhfQUxFTjsKQEAgLTEwNjMsNyArMTA2Myw4IEBACiAJbWV0YS0+aWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlkZXZfcXVldWVfeG1pdChza2IpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggYWQ2ZTRhNC4uOTEzN2E0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtMjQxNiw4ICsyNDE2LDkgQEAKICNpZmRlZiBJUFcyMTAwX1JYX0RFQlVHCiAJLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZyYW1lIHNvIHdlIGNhbiBkdW1wIGl0IHRvIHRoZSBsb2dzIGlmCiAJICogaWVlZTgwMjExX3J4IGZhaWxzICovCi0JbWVtY3B5KHBhY2tldF9kYXRhLCBwYWNrZXQtPnNrYi0+ZGF0YSwKLQkgICAgICAgbWluX3QodTMyLCBzdGF0dXMtPmZyYW1lX3NpemUsIElQV19SWF9OSUNfQlVGRkVSX0xFTkdUSCkpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocGFja2V0LT5za2IsIHBhY2tldF9kYXRhLAorCQkJCSAgbWluX3QodTMyLCBzdGF0dXMtPmZyYW1lX3NpemUsCisJCQkJCSAgICAgSVBXX1JYX05JQ19CVUZGRVJfTEVOR1RIKSk7CiAjZW5kaWYKIAogCWlmICghaWVlZTgwMjExX3J4KHByaXYtPmllZWUsIHBhY2tldC0+c2tiLCBzdGF0cykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCBjODc4YTJmLi40ODM5YTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC04MTMzLDcgKzgxMzMsNyBAQAogCQlza2ItPmRldiA9IHByaXYtPmllZWUtPmRldjsKIAogCQkvKiBQb2ludCByYXcgYXQgdGhlIGllZWU4MDIxMV9zdGF0cyAqLwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjExX1NUQVRTKTsKQEAgLTEwMzU1LDcgKzEwMzU1LDcgQEAKIAogCQlydF9oZHItPml0X2xlbiA9IGRzdC0+bGVuOwogCi0JCW1lbWNweShza2JfcHV0KGRzdCwgbGVuKSwgc3JjLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNyYywgc2tiX3B1dChkc3QsIGxlbiksIGxlbik7CiAKIAkJaWYgKCFpZWVlODAyMTFfcngocHJpdi0+cHJvbV9wcml2LT5pZWVlLCBkc3QsICZkdW1teXN0YXRzKSkKIAkJCWRldl9rZnJlZV9za2JfYW55KGRzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKaW5kZXggYTAwOWFiNS4uNDViMDBlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwpAQCAtMTI4Myw3ICsxMjgzLDYgQEAKIAogCXNrYl9yZXNlcnZlKCBza2IsIDIpOyAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLwogCXNrYl9wdXQoIHNrYiwgcmN2TGVuKTsKLQlza2ItPmRldiA9IGRldjsKIAogCS8qIENvcHkgcGFja2V0IGZyYWdtZW50cyB0byB0aGUgc2tiIGRhdGEgYXJlYSAqLwogCXB0ciA9ICh1X2NoYXIqKSBza2ItPmRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKaW5kZXggNGU3ZjZjZi4uMDYyMjg2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtNjg5LDcgKzY4OSw3IEBACiAJLyogTm90ZSA6IGdjYyB3aWxsIG9wdGltaXNlIHRoZSB3aG9sZSBzZWN0aW9uIGF3YXkgaWYKIAkgKiBXSVJFTEVTU19TUFkgaXMgbm90IGRlZmluZWQuLi4gLSBKZWFuIElJICovCiAJaWYgKFNQWV9OVU1CRVIocHJpdikpIHsKLQkJb3Jpbm9jb19zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgRVRIX0FMRU4sCisJCW9yaW5vY29fc3B5X2dhdGhlcihkZXYsIHNrYl9tYWNfaGVhZGVyKHNrYikgKyBFVEhfQUxFTiwKIAkJCQkgICBkZXNjLT5zaWduYWwsIGRlc2MtPnNpbGVuY2UpOwogCX0KIH0KQEAgLTc3MCw3ICs3NzAsNyBAQAogCiAJLyogQ29weSB0aGUgODAyLjExIGhlYWRlciB0byB0aGUgc2tiICovCiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBoZHJsZW4pLCAmKGRlc2MtPmZyYW1lX2N0bCksIGhkcmxlbik7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkvKiBJZiBhbnksIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgY2FyZCB0byB0aGUgc2tiICovCiAJaWYgKGRhdGFsZW4gPiAwKSB7CkBAIC05MTUsNyArOTE1LDYgQEAKIAkJbWVtY3B5KGhkci0+aF9zb3VyY2UsIGRlc2MuYWRkcjIsIEVUSF9BTEVOKTsKIAogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKaW5kZXggYjExMjI5MS4uZGQwNzBjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJCXByaW50aygiaXNscGNpX2V0aF90cmFuc21pdDp3ZHNfbWFjXG4iKTsKICNlbmRpZgogCQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgNiwgc3JjLCBza2ItPmxlbik7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSwgd2RzX21hYywgNik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCB3ZHNfbWFjLCA2KTsKIAkJCX0gZWxzZSB7CiAJCQkJbWVtbW92ZShza2ItPmRhdGEsIHNyYywgc2tiLT5sZW4pOwogCQkJfQpAQCAtMTYyLDEzICsxNjIsMTYgQEAKIAogCQkJc2tiX3B1dChuZXdza2IsIGluaXRfd2RzID8gc2tiLT5sZW4gKyA2IDogc2tiLT5sZW4pOwogCQkJaWYgKGluaXRfd2RzKSB7Ci0JCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIDYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHdkc19tYWMsIDYpOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJCSAgbmV3c2tiLT5kYXRhICsgNiwKKwkJCQkJCQkgIHNrYi0+bGVuKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShuZXdza2IsIHdkc19tYWMsIDYpOwogI2lmZGVmIElTTFBDSV9FVEhfREVCVUcKIAkJCQlwcmludGsoImlzbHBjaV9ldGhfdHJhbnNtaXQ6d2RzX21hY1xuIik7CiAjZW5kaWYKIAkJCX0gZWxzZQotCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuZXdza2ItPmRhdGEsCisJCQkJCQkJICBza2ItPmxlbik7CiAKICNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUwogCQkJREVCVUcoU0hPV19UUkFDSU5HLCAibWVtY3B5ICVwICVwICVpIHdkcyAlaVxuIiwKQEAgLTMwMyw3ICszMDYsNyBAQAogCQlza2JfcHVsbCgqc2tiLCBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpKTsKIAogCSgqc2tiKS0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7Ci0JKCpza2IpLT5tYWMucmF3ID0gKCpza2IpLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKCpza2IpOwogCSgqc2tiKS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwogCiAJcmV0dXJuIDA7CkBAIC0zNzQsMTAgKzM3Nyw2IEBACiAJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CiAJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAjZW5kaWYKLQotCS8qIGRvIHNvbWUgYWRkaXRpb25hbCBza19idWZmIGFuZCBuZXR3b3JrIGxheWVyIHBhcmFtZXRlcnMgKi8KLQlza2ItPmRldiA9IG5kZXY7Ci0KIAkvKiB0YWtlIGNhcmUgb2YgbW9uaXRvciBtb2RlIGFuZCBzcHkgbW9uaXRvcmluZy4gKi8KIAlpZiAodW5saWtlbHkocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpKQogCQlkaXNjYXJkID0gaXNscGNpX21vbml0b3JfcngocHJpdiwgJnNrYik7CkBAIC0zOTgsOCArMzk3LDEwIEBACiAJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KIAkJCXdpcmVsZXNzX3NweV91cGRhdGUobmRldiwgYW5uZXgtPmFkZHIyLCAmd3N0YXRzKTsKIAotCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlciksCi0JCQkgICAgICAgc2tiLT5kYXRhLCAyICogRVRIX0FMRU4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJCQkgIChza2ItPmRhdGEgKworCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCByZm1vbl9oZWFkZXIpKSwKKwkJCQkJCSAgMiAqIEVUSF9BTEVOKTsKIAkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CiAJCX0KIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDQ3YjJjY2IuLjNiZTYyNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC0yMjMyLDcgKzIyMzIsNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNrYl9yZXNlcnZlKCBza2IsIDIpOyAgIC8qIEFsaWduIElQIG9uIDE2IGJ5dGUgKFRCRCBjaGVjayB0aGlzKSovCi0gICAgc2tiLT5kZXYgPSBkZXY7CiAKICAgICBERUJVRyg0LCJyYXlfY3MgcnhfZGF0YSB0b3RhbF9sZW4gPSAleCwgcnhfbGVuID0gJXhcbiIsdG90YWxfbGVuLHJ4X2xlbik7CiAKQEAgLTIyNDMsNyArMjI0Miw4IEBACiAgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyICYgUlhfQlVGRl9FTkQsIHJ4X2xlbik7CiAgICAgLyogR2V0IHNvdXJjZSBhZGRyZXNzICovCiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgbWVtY3B5KGxpbmtzcmNhZGRyLCAoKHN0cnVjdCBtYWNfaGVhZGVyICopc2tiLT5kYXRhKS0+YWRkcl8yLCBFVEhfQUxFTik7CisgICAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXRvZihzdHJ1Y3QgbWFjX2hlYWRlciwgYWRkcl8yKSwKKwkJCQkgICAgIGxpbmtzcmNhZGRyLCBFVEhfQUxFTik7CiAjZW5kaWYKICAgICAvKiBOb3csIGRlYWwgd2l0aCBlbmNhcHN1bGF0aW9uL3RyYW5zbGF0aW9uL3NuaWZmZXIgKi8KICAgICBpZiAoIXNuaWZmZXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCmluZGV4IGY1Y2UxYzYuLjJhMjk5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpAQCAtMjAwOSw3ICsyMDA5LDcgQEAKIAkJICAgICAgIHBhY2tldGxlbik7CiAJCXNrYi0+ZGV2ID0gZ2V0X3N0cmlwX2RldihzdHJpcF9pbmZvKTsKIAkJc2tiLT5wcm90b2NvbCA9IGhlYWRlci0+cHJvdG9jb2w7Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAogCQkvKiBIYXZpbmcgcHV0IGEgZmFrZSBoZWFkZXIgb24gdGhlIGZyb250IG9mIHRoZSBza19idWZmIGZvciB0aGUgKi8KIAkJLyogYmVuZWZpdCBvZiB0b29scyBsaWtlIHRjcGR1bXAsIHNrYl9wdWxsIG5vdyAnY29uc3VtZXMnIHRoYXQgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKaW5kZXggMmFhM2M3Ni4uMWNmMDkwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpAQCAtMjUxMiwxNCArMjUxMiwxMyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2tiLT5kZXYgPSBkZXY7Ci0KIAkvKiBDb3B5IHRoZSBwYWNrZXQgdG8gdGhlIGJ1ZmZlci4gKi8KIAlvYnJhbV9yZWFkKGlvYWRkciwgYnVmX29mZiwgc2tiX3B1dChza2IsIHNrc2l6ZSksIHNrc2l6ZSk7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogI2lmZGVmIERFQlVHX1JYX0lORk8KLQl3dl9wYWNrZXRfaW5mbyhza2ItPm1hYy5yYXcsIHNrc2l6ZSwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3JlYWQiKTsKKwl3dl9wYWNrZXRfaW5mbyhza2JfbWFjX2hlYWRlcihza2IpLCBza3NpemUsIGRldi0+bmFtZSwKKwkJICAgICAgICJ3dl9wYWNrZXRfcmVhZCIpOwogI2VuZGlmCQkJCS8qIERFQlVHX1JYX0lORk8gKi8KIAogCS8qIFN0YXRpc3RpY3MtZ2F0aGVyaW5nIGFuZCBhc3NvY2lhdGVkIHN0dWZmLgpAQCAtMjU1NSw3ICsyNTU0LDcgQEAKIAogCQkvKiBTcHlpbmcgc3R1ZmYgKi8KICNpZmRlZiBJV19XSVJFTEVTU19TUFkKLQkJd2xfc3B5X2dhdGhlcihkZXYsIHNrYi0+bWFjLnJhdyArIFdBVkVMQU5fQUREUl9TSVpFLAorCQl3bF9zcHlfZ2F0aGVyKGRldiwgc2tiX21hY19oZWFkZXIoc2tiKSArIFdBVkVMQU5fQUREUl9TSVpFLAogCQkJICAgICAgc3RhdHMpOwogI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLwogI2lmZGVmIEhJU1RPR1JBTQpAQCAtMjkzOSw3ICsyOTM4LDcgQEAKIAkgKiBuZWVkIHRvIHBhZC4gSmVhbiBJSSAqLwogCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CiAJCW1lbXNldChkYXRhLCAwLCBFVEhfWkxFTik7Ci0JCW1lbWNweShkYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRhdGEsIHNrYi0+bGVuKTsKIAkJLyogV3JpdGUgcGFja2V0IG9uIHRoZSBjYXJkICovCiAJCWlmKHd2X3BhY2tldF93cml0ZShkZXYsIGRhdGEsIEVUSF9aTEVOKSkKIAkJCXJldHVybiAxOwkvKiBXZSBmYWlsZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwppbmRleCBiMDQyMzk3Li42N2I4NjdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpAQCAtMjg4NCwxNCArMjg4NCwxMiBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICBza2ItPmRldiA9IGRldjsKLQogICBza2JfcmVzZXJ2ZShza2IsIDIpOwogICBmZF9wID0gcmVhZF9yaW5nYnVmKGRldiwgZmRfcCwgKGNoYXIgKikgc2tiX3B1dChza2IsIHNrc2l6ZSksIHNrc2l6ZSk7CiAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKICNpZmRlZiBERUJVR19SWF9JTkZPCi0gIHd2X3BhY2tldF9pbmZvKHNrYi0+bWFjLnJhdywgc2tzaXplLCBkZXYtPm5hbWUsICJ3dl9wYWNrZXRfcmVhZCIpOworICB3dl9wYWNrZXRfaW5mbyhza2JfbWFjX2hlYWRlcihza2IpLCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CiAjZW5kaWYJLyogREVCVUdfUlhfSU5GTyAqLwogICAgICAKICAgLyogU3RhdGlzdGljcyBnYXRoZXJpbmcgJiBzdHVmZiBhc3NvY2lhdGVkLgpAQCAtMjkyNSw3ICsyOTIzLDcgQEAKICNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KIAkgIAogI2lmZGVmIFdJUkVMRVNTX1NQWQotICAgICAgd2xfc3B5X2dhdGhlcihkZXYsIHNrYi0+bWFjLnJhdyArIFdBVkVMQU5fQUREUl9TSVpFLCBzdGF0cyk7CisgICAgICB3bF9zcHlfZ2F0aGVyKGRldiwgc2tiX21hY19oZWFkZXIoc2tiKSArIFdBVkVMQU5fQUREUl9TSVpFLCBzdGF0cyk7CiAjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCiAjaWZkZWYgSElTVE9HUkFNCiAgICAgICB3bF9oaXNfZ2F0aGVyKGRldiwgc3RhdHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYwppbmRleCA2Y2I2NmEzLi45MzViMTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYwpAQCAtMzI3LDcgKzMyNyw2IEBACiAJCQltZW1jcHkoc2tiX3B1dChza2IsIDYpLCAmZGF0YVtkYXRhbGVuLThdLCA2KTsKIAkJCW1lbWNweShza2JfcHV0KHNrYiwgMiksICZkYXRhW2RhdGFsZW4tMjRdLCAyKTsKIAkJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgZGF0YSwgbGVuKTsKLQkJCXNrYi0+ZGV2ID0gemQtPmRldjsKIAkJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHpkLT5kZXYpOwogCQkJemQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKQEAgLTM4NSw3ICszODQsNiBAQAogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCAyKSwgJmRhdGFbNl0sIDIpOwogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBkYXRhKzgsIGxlbik7CiAJCX0KLQkJc2tiLT5kZXYgPSB6ZC0+ZGV2OwogCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHpkLT5kZXYpOwogCQl6ZC0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtODA5LDEwICs4MDcsMTAgQEAKIAl0eGJ1Zls0XSA9IDB4MDA7CiAJdHhidWZbNV0gPSAweDAwOwogCi0JbWVtY3B5KHR4YnVmKzYsIHNrYi0+ZGF0YSsxMiwgc2tiLT5sZW4tMTIpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMTIsIHR4YnVmICsgNiwgc2tiLT5sZW4gLSAxMik7CiAJaWYgKHBhZCkKIAkJdHhidWZbc2tiLT5sZW4tMTIrNl09MDsKLQltZW1jcHkodHhidWYrc2tiLT5sZW4tMTIrNitwYWQsIHNrYi0+ZGF0YSwgMTIpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0eGJ1ZiArIHNrYi0+bGVuIC0gMTIgKyA2ICsgcGFkLCAxMik7CiAJKihfX2JlMTYqKSZ0eGJ1Zltza2ItPmxlbis2K3BhZF0gPSBodG9ucyhza2ItPmxlbi0xMis2KTsKIAl0eGJ1Zlt0eGJ1Zmxlbi0xXSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy9LY29uZmlnCmluZGV4IDY2ZWQ1NWIuLmQxYWIyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBaRDEyMTFSVwogCXRyaXN0YXRlICJaeURBUyBaRDEyMTEvWkQxMjExQiBVU0Itd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBJRUVFODAyMTEgJiYgSUVFRTgwMjExX1NPRlRNQUMgJiYgTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gVVNCICYmIElFRUU4MDIxMV9TT0ZUTUFDICYmIFdMQU5fODAyMTEgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBaeURBUyBaRDEyMTEvWkQxMjExQiB3aXJlbGVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMgYi9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYwppbmRleCAyNDEyY2U0Li4zZjRhN2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYworKysgYi9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYwpAQCAtMTEzNyw3ICsxMTM3LDYgQEAKIAkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKIAkJCQlpZiAoc2tiID09IE5VTEwpCiAJCQkJCWJyZWFrOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCByeF9za2ItPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3puZXQuYyBiL2RyaXZlcnMvbmV0L3puZXQuYwppbmRleCBiMjRiMDcyLi40MDMyZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC96bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvem5ldC5jCkBAIC03NzQsNyArNzc0LDYgQEAKIAkJCQl6bmV0LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJaWYgKCZ6bmV0LT5yeF9jdXJbKHBrdF9sZW4rMSk+PjFdID4gem5ldC0+cnhfZW5kKSB7CiAJCQkJaW50IHNlbWlfY250ID0gKHpuZXQtPnJ4X2VuZCAtIHpuZXQtPnJ4X2N1cik8PDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9sZWQuYyBiL2RyaXZlcnMvcGFyaXNjL2xlZC5jCmluZGV4IGQxOTBjMDUuLjQ1M2U2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xlZC5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2xlZC5jCkBAIC0zNzIsOSArMzcyLDkgQEAKIAkJY29udGludWU7CiAJICAgIGlmIChMT09QQkFDSyhpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwpKQogCQljb250aW51ZTsKLQkgICAgaWYgKCFkZXYtPmdldF9zdGF0cykgCi0JCWNvbnRpbnVlOwogCSAgICBzdGF0cyA9IGRldi0+Z2V0X3N0YXRzKGRldik7CisJICAgIGlmICghc3RhdHMpCisJCWNvbnRpbnVlOwogCSAgICByeF90b3RhbCArPSBzdGF0cy0+cnhfcGFja2V0czsKIAkgICAgdHhfdG90YWwgKz0gc3RhdHMtPnR4X3BhY2tldHM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggZWI1ZGM2Mi4uZTcxOTI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0zOTgsNiArMzk4LDkgQEAKIAogCWlmIChkZXZpY2UtPnN0YXRlID09IGRldmljZS0+dGFyZ2V0KQogCQl3YWtlX3VwKCZkYXNkX2luaXRfd2FpdHEpOworCisJLyogbGV0IHVzZXItc3BhY2Uga25vdyB0aGF0IHRoZSBkZXZpY2Ugc3RhdHVzIGNoYW5nZWQgKi8KKwlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5jZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwppbmRleCBlZDcwODUyLi42YTg5Y2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXBsLmg+CiAKIC8qIFRoaXMgaXMgdWdseS4uLiAqLwogI2RlZmluZSBQUklOVEtfSEVBREVSICJkYXNkX2Rldm1hcDoiCkBAIC0xMzMsNiArMTM0LDggQEAKIF9fc2V0dXAgKCJkYXNkPSIsIGRhc2RfY2FsbF9zZXR1cCk7CiAjZW5kaWYJLyogI2lmbmRlZiBNT0RVTEUgKi8KIAorI2RlZmluZQlEQVNEX0lQTERFVgkiaXBsZGV2IgorCiAvKgogICogUmVhZCBhIGRldmljZSBidXNpZC9kZXZubyBmcm9tIGEgc3RyaW5nLgogICovCkBAIC0xNDEsNiArMTQ0LDIwIEBACiB7CiAJaW50IHZhbCwgb2xkX3N0eWxlOwogCisJLyogSW50ZXJwcmV0IGlwbGRldiBidXNpZCAqLworCWlmIChzdHJuY21wKERBU0RfSVBMREVWLCAqc3RyLCBzdHJsZW4oREFTRF9JUExERVYpKSA9PSAwKSB7CisJCWlmIChpcGxfaW5mby50eXBlICE9IElQTF9UWVBFX0NDVykgeworCQkJTUVTU0FHRShLRVJOX0VSUiwgIiVzIiwgImlwbCBkZXZpY2UgaXMgbm90IGEgY2N3ICIKKwkJCQkiZGV2aWNlIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqaWQwID0gMDsKKwkJKmlkMSA9IGlwbF9pbmZvLmRhdGEuY2N3LmRldl9pZC5zc2lkOworCQkqZGV2bm8gPSBpcGxfaW5mby5kYXRhLmNjdy5kZXZfaWQuZGV2bm87CisJCSpzdHIgKz0gc3RybGVuKERBU0RfSVBMREVWKTsKKworCQlyZXR1cm4gMDsKKwl9CiAJLyogY2hlY2sgZm9yIGxlYWRpbmcgJzB4JyAqLwogCW9sZF9zdHlsZSA9IDA7CiAJaWYgKCgqc3RyKVswXSA9PSAnMCcgJiYgKCpzdHIpWzFdID09ICd4JykgewpAQCAtODI5LDYgKzg0Niw0NiBAQAogc3RhdGljIERFVklDRV9BVFRSKGRpc2NpcGxpbmUsIDA0NDQsIGRhc2RfZGlzY2lwbGluZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QKK2Rhc2RfZGV2aWNlX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOworCXNzaXplX3QgbGVuOworCisJZGV2aWNlID0gZGFzZF9kZXZpY2VfZnJvbV9jZGV2KHRvX2Njd2RldihkZXYpKTsKKwlpZiAoIUlTX0VSUihkZXZpY2UpKSB7CisJCXN3aXRjaCAoZGV2aWNlLT5zdGF0ZSkgeworCQljYXNlIERBU0RfU1RBVEVfTkVXOgorCQkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJuZXdcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9LTk9XTjoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZGV0ZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9CQVNJQzoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiYmFzaWNcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9VTkZNVDoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5mb3JtYXR0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9SRUFEWToKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicmVhZHlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9PTkxJTkU6CisJCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm9ubGluZVxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibm8gc3RhdFxuIik7CisJCQlicmVhazsKKwkJfQorCQlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwl9IGVsc2UKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJ1bmtub3duXG4iKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCAwNDQ0LCBkYXNkX2RldmljZV9zdGF0dXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CiBkYXNkX2FsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwpAQCAtOTM5LDYgKzk5Niw3IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRhc2RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVhZG9ubHkuYXR0ciwKIAkmZGV2X2F0dHJfZGlzY2lwbGluZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKIAkmZGV2X2F0dHJfYWxpYXMuYXR0ciwKIAkmZGV2X2F0dHJfdmVuZG9yLmF0dHIsCiAJJmRldl9hdHRyX3VpZC5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL3MzOTAvY2hhci9NYWtlZmlsZQppbmRleCAyOTNlNjY3Li5jMjEwNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3MzOTAvY2hhci9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogb2JqLXkgKz0gY3RybGNoYXIubyBrZXlib2FyZC5vIGRlZmtleW1hcC5vIHNjbHAubyBzY2xwX3J3Lm8gc2NscF9xdWllc2NlLm8gXAotCSBzY2xwX2luZm8ubworCSBzY2xwX2luZm8ubyBzY2xwX2NvbmZpZy5vIHNjbHBfY2hwLm8KIAogb2JqLSQoQ09ORklHX1ROMzI3MCkgKz0gcmF3MzI3MC5vCiBvYmotJChDT05GSUdfVE4zMjcwX0NPTlNPTEUpICs9IGNvbjMyNzAubwpAQCAtMjksMyArMjksNiBAQAogb2JqLSQoQ09ORklHX1MzOTBfVEFQRV8zNTkwKSArPSB0YXBlXzM1OTAubwogb2JqLSQoQ09ORklHX01PTlJFQURFUikgKz0gbW9ucmVhZGVyLm8KIG9iai0kKENPTkZJR19NT05XUklURVIpICs9IG1vbndyaXRlci5vCisKK3pjb3JlX21vZC1vYmpzIDo9IHNjbHBfc2RpYXMubyB6Y29yZS5vCitvYmotJChDT05GSUdfWkZDUERVTVApICs9IHpjb3JlX21vZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggOWEzMjhmMS4uNjAwMGJkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwpAQCAtODEzLDEyICs4MTMsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgCi1jb24zMjE1X2NvbnNldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKLXsKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqICBUaGUgY29uc29sZSBzdHJ1Y3R1cmUgZm9yIHRoZSAzMjE1IGNvbnNvbGUKICAqLwpAQCAtODI3LDcgKzgyMSw2IEBACiAJLndyaXRlCSA9IGNvbjMyMTVfd3JpdGUsCiAJLmRldmljZQkgPSBjb24zMjE1X2RldmljZSwKIAkudW5ibGFuayA9IGNvbjMyMTVfdW5ibGFuaywKLQkuc2V0dXAJID0gY29uMzIxNV9jb25zZXR1cCwKIAkuZmxhZ3MJID0gQ09OX1BSSU5UQlVGRkVSLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCmluZGV4IDhlN2YyZDcuLmZkMzQ3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKQEAgLTU1NSwxMiArNTU1LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+dmlldy5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IAotY29uMzI3MF9jb25zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiAgVGhlIGNvbnNvbGUgc3RydWN0dXJlIGZvciB0aGUgMzI3MCBjb25zb2xlCiAgKi8KQEAgLTU2OSw3ICs1NjMsNiBAQAogCS53cml0ZQkgPSBjb24zMjcwX3dyaXRlLAogCS5kZXZpY2UJID0gY29uMzI3MF9kZXZpY2UsCiAJLnVuYmxhbmsgPSBjb24zMjcwX3VuYmxhbmssCi0JLnNldHVwCSA9IGNvbjMyNzBfY29uc2V0dXAsCiAJLmZsYWdzCSA9IENPTl9QUklOVEJVRkZFUiwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHAuYwppbmRleCBmMTcxZGUzLi5mYTYyZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgogCkBAIC01MTAsNyArNTExLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfc3RhdGVfY2hhbmdlX2V2ZW50ID0gewotCS5yZWNlaXZlX21hc2sgPSBFdlR5cF9TdGF0ZUNoYW5nZV9NYXNrLAorCS5yZWNlaXZlX21hc2sgPSBFVlRZUF9TVEFURUNIQU5HRV9NQVNLLAogCS5yZWNlaXZlcl9mbiA9IHNjbHBfc3RhdGVfY2hhbmdlX2NiCiB9OwogCkBAIC05MzAsMyArOTMxLDEwIEBACiAJc2NscF9pbml0X21hc2soMSk7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBfX2luaXQgaW50IHNjbHBfaW5pdGNhbGwodm9pZCkKK3sKKwlyZXR1cm4gc2NscF9pbml0KCk7Cit9CisKK2FyY2hfaW5pdGNhbGwoc2NscF9pbml0Y2FsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmggYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmgKaW5kZXggN2QyOWFiNC4uODdhYzRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHAuaApAQCAtMTksMzMgKzE5LDM3IEBACiAjZGVmaW5lIE1BWF9LTUVNX1BBR0VTIChzaXplb2YodW5zaWduZWQgbG9uZykgPDwgMykKICNkZWZpbmUgTUFYX0NPTlNPTEVfUEFHRVMJNAogCi0jZGVmaW5lIEV2VHlwX09wQ21kCQkweDAxCi0jZGVmaW5lIEV2VHlwX01zZwkJMHgwMgotI2RlZmluZSBFdlR5cF9TdGF0ZUNoYW5nZQkweDA4Ci0jZGVmaW5lIEV2VHlwX1BNc2dDbWQJCTB4MDkKLSNkZWZpbmUgRXZUeXBfQ250bFByb2dPcENtZAkweDIwCi0jZGVmaW5lIEV2VHlwX0NudGxQcm9nSWRlbnQJMHgwQgotI2RlZmluZSBFdlR5cF9TaWdRdWllc2NlCTB4MUQKLSNkZWZpbmUgRXZUeXBfVlQyMjBNc2cJCTB4MUEKKyNkZWZpbmUgRVZUWVBfT1BDTUQJCTB4MDEKKyNkZWZpbmUgRVZUWVBfTVNHCQkweDAyCisjZGVmaW5lIEVWVFlQX1NUQVRFQ0hBTkdFCTB4MDgKKyNkZWZpbmUgRVZUWVBfUE1TR0NNRAkJMHgwOQorI2RlZmluZSBFVlRZUF9DTlRMUFJPR09QQ01ECTB4MjAKKyNkZWZpbmUgRVZUWVBfQ05UTFBST0dJREVOVAkweDBCCisjZGVmaW5lIEVWVFlQX1NJR1FVSUVTQ0UJMHgxRAorI2RlZmluZSBFVlRZUF9WVDIyME1TRwkJMHgxQQorI2RlZmluZSBFVlRZUF9DT05GTUdNREFUQQkweDA0CisjZGVmaW5lIEVWVFlQX1NESUFTCQkweDFDCiAKLSNkZWZpbmUgRXZUeXBfT3BDbWRfTWFzawkweDgwMDAwMDAwCi0jZGVmaW5lIEV2VHlwX01zZ19NYXNrCQkweDQwMDAwMDAwCi0jZGVmaW5lIEV2VHlwX1N0YXRlQ2hhbmdlX01hc2sJMHgwMTAwMDAwMAotI2RlZmluZSBFdlR5cF9QTXNnQ21kX01hc2sJMHgwMDgwMDAwMAotI2RlZmluZSBFdlR5cF9DdGxQcm9nT3BDbWRfTWFzawkweDAwMDAwMDAxCi0jZGVmaW5lIEV2VHlwX0N0bFByb2dJZGVudF9NYXNrCTB4MDAyMDAwMDAKLSNkZWZpbmUgRXZUeXBfU2lnUXVpZXNjZV9NYXNrCTB4MDAwMDAwMDgKLSNkZWZpbmUgRXZUeXBfVlQyMjBNc2dfTWFzawkweDAwMDAwMDQwCisjZGVmaW5lIEVWVFlQX09QQ01EX01BU0sJMHg4MDAwMDAwMAorI2RlZmluZSBFVlRZUF9NU0dfTUFTSwkJMHg0MDAwMDAwMAorI2RlZmluZSBFVlRZUF9TVEFURUNIQU5HRV9NQVNLCTB4MDEwMDAwMDAKKyNkZWZpbmUgRVZUWVBfUE1TR0NNRF9NQVNLCTB4MDA4MDAwMDAKKyNkZWZpbmUgRVZUWVBfQ1RMUFJPR09QQ01EX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBFVlRZUF9DVExQUk9HSURFTlRfTUFTSwkweDAwMjAwMDAwCisjZGVmaW5lIEVWVFlQX1NJR1FVSUVTQ0VfTUFTSwkweDAwMDAwMDA4CisjZGVmaW5lIEVWVFlQX1ZUMjIwTVNHX01BU0sJMHgwMDAwMDA0MAorI2RlZmluZSBFVlRZUF9DT05GTUdNREFUQV9NQVNLCTB4MTAwMDAwMDAKKyNkZWZpbmUgRVZUWVBfU0RJQVNfTUFTSwkweDAwMDAwMDEwCiAKLSNkZWZpbmUgR25ybE1zZ0ZsZ3NfRE9NCQkweDgwMDAKLSNkZWZpbmUgR25ybE1zZ0ZsZ3NfU25kQWxybQkweDQwMDAKLSNkZWZpbmUgR25ybE1zZ0ZsZ3NfSG9sZE1zZwkweDIwMDAKKyNkZWZpbmUgR05STE1TR0ZMR1NfRE9NCQkweDgwMDAKKyNkZWZpbmUgR05STE1TR0ZMR1NfU05EQUxSTQkweDQwMDAKKyNkZWZpbmUgR05STE1TR0ZMR1NfSE9MRE1TRwkweDIwMDAKIAotI2RlZmluZSBMblRwRmxnc19DbnRsVGV4dAkweDgwMDAKLSNkZWZpbmUgTG5UcEZsZ3NfTGFiZWxUZXh0CTB4NDAwMAotI2RlZmluZSBMblRwRmxnc19EYXRhVGV4dAkweDIwMDAKLSNkZWZpbmUgTG5UcEZsZ3NfRW5kVGV4dAkweDEwMDAKLSNkZWZpbmUgTG5UcEZsZ3NfUHJvbXB0VGV4dAkweDA4MDAKKyNkZWZpbmUgTE5UUEZMR1NfQ05UTFRFWFQJMHg4MDAwCisjZGVmaW5lIExOVFBGTEdTX0xBQkVMVEVYVAkweDQwMDAKKyNkZWZpbmUgTE5UUEZMR1NfREFUQVRFWFQJMHgyMDAwCisjZGVmaW5lIExOVFBGTEdTX0VORFRFWFQJMHgxMDAwCisjZGVmaW5lIExOVFBGTEdTX1BST01QVFRFWFQJMHgwODAwCiAKIHR5cGVkZWYgdW5zaWduZWQgaW50IHNjbHBfY21kd190OwogCkBAIC01NiwxNSArNjAsMTUgQEAKICNkZWZpbmUgU0NMUF9DTURXX1JFQURfU0NQX0lORk9fRk9SQ0VECTB4MDAxMjAwMDEKIAogI2RlZmluZSBHRFNfSURfTURTTVUJCTB4MTMxMAotI2RlZmluZSBHRFNfSURfTURTUm91dGVJbmZvCTB4MTMxMQotI2RlZmluZSBHRFNfSURfQWdVbldya0NvcnIJMHgxNTQ5Ci0jZGVmaW5lIEdEU19JRF9TTkFDb25kUmVwb3J0CTB4MTUzMgorI2RlZmluZSBHRFNfSURfTURTUk9VVEVJTkZPCTB4MTMxMQorI2RlZmluZSBHRFNfSURfQUdVTldSS0NPUlIJMHgxNTQ5CisjZGVmaW5lIEdEU19JRF9TTkFDT05EUkVQT1JUCTB4MTUzMgogI2RlZmluZSBHRFNfSURfQ1BNU1UJCTB4MTIxMgotI2RlZmluZSBHRFNfSURfUm91dFRhcmdJbnN0cgkweDE1NEQKLSNkZWZpbmUgR0RTX0lEX09wUmVxCQkweDgwNzAKLSNkZWZpbmUgR0RTX0lEX1RleHRDbWQJCTB4MTMyMAorI2RlZmluZSBHRFNfSURfUk9VVFRBUkdJTlNUUgkweDE1NEQKKyNkZWZpbmUgR0RTX0lEX09QUkVRCQkweDgwNzAKKyNkZWZpbmUgR0RTX0lEX1RFWFRDTUQJCTB4MTMyMAogCi0jZGVmaW5lIEdEU19LRVlfU2VsZkRlZlRleHRNc2cJMHgzMQorI2RlZmluZSBHRFNfS0VZX1NFTEZERUZURVhUTVNHCTB4MzEKIAogdHlwZWRlZiB1MzIgc2NjYl9tYXNrX3Q7CS8qIEFUVEVOVElPTjogYXNzdW1lcyAzMmJpdCBtYXNrICEhISAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NocC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jaHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZiOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jaHAuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NocC5jCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxhc20vc2NscC5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgorCisjaW5jbHVkZSAic2NscC5oIgorCisjZGVmaW5lIFRBRwkic2NscF9jaHA6ICIKKworI2RlZmluZSBTQ0xQX0NNRFdfQ09ORklHVVJFX0NIQU5ORUxfUEFUSAkweDAwMGYwMDAxCisjZGVmaW5lIFNDTFBfQ01EV19ERUNPTkZJR1VSRV9DSEFOTkVMX1BBVEgJMHgwMDBlMDAwMQorI2RlZmluZSBTQ0xQX0NNRFdfUkVBRF9DSEFOTkVMX1BBVEhfSU5GT1JNQVRJT04JMHgwMDAzMDAwMQorCitzdGF0aWMgaW5saW5lIHNjbHBfY21kd190IGdldF9jb25maWd1cmVfY21kdyhzdHJ1Y3QgY2hwX2lkIGNocGlkKQoreworCXJldHVybiBTQ0xQX0NNRFdfQ09ORklHVVJFX0NIQU5ORUxfUEFUSCB8IGNocGlkLmlkIDw8IDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2NscF9jbWR3X3QgZ2V0X2RlY29uZmlndXJlX2NtZHcoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gU0NMUF9DTURXX0RFQ09ORklHVVJFX0NIQU5ORUxfUEFUSCB8IGNocGlkLmlkIDw8IDg7Cit9CisKK3N0YXRpYyB2b2lkIGNocF9jYWxsYmFjayhzdHJ1Y3Qgc2NscF9yZXEgKnJlcSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbiA9IGRhdGE7CisKKwljb21wbGV0ZShjb21wbGV0aW9uKTsKK30KKworc3RydWN0IGNocF9jZmdfc2NjYiB7CisJc3RydWN0IHNjY2JfaGVhZGVyIGhlYWRlcjsKKwl1OCBjY207CisJdTggcmVzZXJ2ZWRbNl07CisJdTggY3NzaWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgY2hwX2NmZ19kYXRhIHsKKwlzdHJ1Y3QgY2hwX2NmZ19zY2NiIHNjY2I7CisJc3RydWN0IHNjbHBfcmVxIHJlcTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIGludCBkb19jb25maWd1cmUoc2NscF9jbWR3X3QgY21kKQoreworCXN0cnVjdCBjaHBfY2ZnX2RhdGEgKmRhdGE7CisJaW50IHJjOworCisJLyogUHJlcGFyZSBzY2NiLiAqLworCWRhdGEgPSAoc3RydWN0IGNocF9jZmdfZGF0YSAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGF0YS0+c2NjYi5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBjaHBfY2ZnX3NjY2IpOworCWRhdGEtPnJlcS5jb21tYW5kID0gY21kOworCWRhdGEtPnJlcS5zY2NiID0gJihkYXRhLT5zY2NiKTsKKwlkYXRhLT5yZXEuc3RhdHVzID0gU0NMUF9SRVFfRklMTEVEOworCWRhdGEtPnJlcS5jYWxsYmFjayA9IGNocF9jYWxsYmFjazsKKwlkYXRhLT5yZXEuY2FsbGJhY2tfZGF0YSA9ICYoZGF0YS0+Y29tcGxldGlvbik7CisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5jb21wbGV0aW9uKTsKKworCS8qIFBlcmZvcm0gc2NscCByZXF1ZXN0LiAqLworCXJjID0gc2NscF9hZGRfcmVxdWVzdCgmKGRhdGEtPnJlcSkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZGF0YS0+Y29tcGxldGlvbik7CisKKwkvKiBDaGVjayByZXNwb25zZSAuKi8KKwlpZiAoZGF0YS0+cmVxLnN0YXR1cyAhPSBTQ0xQX1JFUV9ET05FKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJjb25maWd1cmUgY2hhbm5lbC1wYXRoIHJlcXVlc3QgZmFpbGVkICIKKwkJICAgICAgICIoc3RhdHVzPTB4JTAyeClcbiIsIGRhdGEtPnJlcS5zdGF0dXMpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlzd2l0Y2ggKGRhdGEtPnNjY2IuaGVhZGVyLnJlc3BvbnNlX2NvZGUpIHsKKwljYXNlIDB4MDAyMDoKKwljYXNlIDB4MDEyMDoKKwljYXNlIDB4MDQ0MDoKKwljYXNlIDB4MDQ1MDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBUQUcgImNvbmZpZ3VyZSBjaGFubmVsLXBhdGggZmFpbGVkICIKKwkJICAgICAgICIoY21kPTB4JTA4eCwgcmVzcG9uc2U9MHglMDR4KVxuIiwgY21kLAorCQkgICAgICAgZGF0YS0+c2NjYi5oZWFkZXIucmVzcG9uc2VfY29kZSk7CisJCXJjID0gLUVJTzsKKwkJYnJlYWs7CisJfQorb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGF0YSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc2NscF9jaHBfY29uZmlndXJlIC0gcGVyZm9ybSBjb25maWd1cmUgY2hhbm5lbC1wYXRoIHNjbHAgY29tbWFuZAorICogQGNocGlkOiBjaGFubmVsLXBhdGggSUQKKyAqCisgKiBQZXJmb3JtIGNvbmZpZ3VyZSBjaGFubmVsLXBhdGggY29tbWFuZCBzY2xwIGNvbW1hbmQgZm9yIHNwZWNpZmllZCBjaHBpZC4KKyAqIFJldHVybiAwIGFmdGVyIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkLCBub24temVybyBvdGhlcndpc2UuCisgKi8KK2ludCBzY2xwX2NocF9jb25maWd1cmUoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gZG9fY29uZmlndXJlKGdldF9jb25maWd1cmVfY21kdyhjaHBpZCkpOworfQorCisvKioKKyAqIHNjbHBfY2hwX2RlY29uZmlndXJlIC0gcGVyZm9ybSBkZWNvbmZpZ3VyZSBjaGFubmVsLXBhdGggc2NscCBjb21tYW5kCisgKiBAY2hwaWQ6IGNoYW5uZWwtcGF0aCBJRAorICoKKyAqIFBlcmZvcm0gZGVjb25maWd1cmUgY2hhbm5lbC1wYXRoIGNvbW1hbmQgc2NscCBjb21tYW5kIGZvciBzcGVjaWZpZWQgY2hwaWQKKyAqIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiBPbiBzdWNjZXNzIHJldHVybiAwLiBSZXR1cm4gbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgc2NscF9jaHBfZGVjb25maWd1cmUoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gZG9fY29uZmlndXJlKGdldF9kZWNvbmZpZ3VyZV9jbWR3KGNocGlkKSk7Cit9CisKK3N0cnVjdCBjaHBfaW5mb19zY2NiIHsKKwlzdHJ1Y3Qgc2NjYl9oZWFkZXIgaGVhZGVyOworCXU4IHJlY29nbml6ZWRbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworCXU4IHN0YW5kYnlbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworCXU4IGNvbmZpZ3VyZWRbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworCXU4IGNjbTsKKwl1OCByZXNlcnZlZFs2XTsKKwl1OCBjc3NpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjaHBfaW5mb19kYXRhIHsKKwlzdHJ1Y3QgY2hwX2luZm9fc2NjYiBzY2NiOworCXN0cnVjdCBzY2xwX3JlcSByZXE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgorICogc2NscF9jaHBfcmVhZF9pbmZvIC0gcGVyZm9ybSByZWFkIGNoYW5uZWwtcGF0aCBpbmZvcm1hdGlvbiBzY2xwIGNvbW1hbmQKKyAqIEBpbmZvOiByZXN1bHRpbmcgY2hhbm5lbC1wYXRoIGluZm9ybWF0aW9uIGRhdGEKKyAqCisgKiBQZXJmb3JtIHJlYWQgY2hhbm5lbC1wYXRoIGluZm9ybWF0aW9uIHNjbHAgY29tbWFuZCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4KKyAqIE9uIHN1Y2Nlc3MsIHN0b3JlIGNoYW5uZWwtcGF0aCBpbmZvcm1hdGlvbiBpbiBAaW5mbyBhbmQgcmV0dXJuIDAuIFJldHVybgorICogbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgc2NscF9jaHBfcmVhZF9pbmZvKHN0cnVjdCBzY2xwX2NocF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjaHBfaW5mb19kYXRhICpkYXRhOworCWludCByYzsKKworCS8qIFByZXBhcmUgc2NjYi4gKi8KKwlkYXRhID0gKHN0cnVjdCBjaHBfaW5mb19kYXRhICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkYXRhLT5zY2NiLmhlYWRlci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGNocF9pbmZvX3NjY2IpOworCWRhdGEtPnJlcS5jb21tYW5kID0gU0NMUF9DTURXX1JFQURfQ0hBTk5FTF9QQVRIX0lORk9STUFUSU9OOworCWRhdGEtPnJlcS5zY2NiID0gJihkYXRhLT5zY2NiKTsKKwlkYXRhLT5yZXEuc3RhdHVzID0gU0NMUF9SRVFfRklMTEVEOworCWRhdGEtPnJlcS5jYWxsYmFjayA9IGNocF9jYWxsYmFjazsKKwlkYXRhLT5yZXEuY2FsbGJhY2tfZGF0YSA9ICYoZGF0YS0+Y29tcGxldGlvbik7CisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5jb21wbGV0aW9uKTsKKworCS8qIFBlcmZvcm0gc2NscCByZXF1ZXN0LiAqLworCXJjID0gc2NscF9hZGRfcmVxdWVzdCgmKGRhdGEtPnJlcSkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZGF0YS0+Y29tcGxldGlvbik7CisKKwkvKiBDaGVjayByZXNwb25zZSAuKi8KKwlpZiAoZGF0YS0+cmVxLnN0YXR1cyAhPSBTQ0xQX1JFUV9ET05FKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJyZWFkIGNoYW5uZWwtcGF0aCBpbmZvIHJlcXVlc3QgZmFpbGVkICIKKwkJICAgICAgICIoc3RhdHVzPTB4JTAyeClcbiIsIGRhdGEtPnJlcS5zdGF0dXMpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZGF0YS0+c2NjYi5oZWFkZXIucmVzcG9uc2VfY29kZSAhPSAweDAwMTApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBUQUcgInJlYWQgY2hhbm5lbC1wYXRoIGluZm8gZmFpbGVkICIKKwkJICAgICAgICIocmVzcG9uc2U9MHglMDR4KVxuIiwgZGF0YS0+c2NjYi5oZWFkZXIucmVzcG9uc2VfY29kZSk7CisJCXJjID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweShpbmZvLT5yZWNvZ25pemVkLCBkYXRhLT5zY2NiLnJlY29nbml6ZWQsCisJICAgICAgIFNDTFBfQ0hQX0lORk9fTUFTS19TSVpFKTsKKwltZW1jcHkoaW5mby0+c3RhbmRieSwgZGF0YS0+c2NjYi5zdGFuZGJ5LAorCSAgICAgICBTQ0xQX0NIUF9JTkZPX01BU0tfU0laRSk7CisJbWVtY3B5KGluZm8tPmNvbmZpZ3VyZWQsIGRhdGEtPnNjY2IuY29uZmlndXJlZCwKKwkgICAgICAgU0NMUF9DSFBfSU5GT19NQVNLX1NJWkUpOworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGF0YSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NvbmZpZy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzIyZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jb25maWcuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogIGRyaXZlcnMvczM5MC9jaGFyL3NjbHBfY29uZmlnLmMKKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqICAgIEF1dGhvcihzKTogSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgInNjbHAuaCIKKworI2RlZmluZSBUQUcJInNjbHBfY29uZmlnOiAiCisKK3N0cnVjdCBjb25mX21nbV9kYXRhIHsKKwl1OCByZXNlcnZlZDsKKwl1OCBldl9xdWFsaWZpZXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIEVWX1FVQUxfQ0FQX0NIQU5HRQkzCisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2NscF9jcHVfY2FwYWJpbGl0eV93b3JrOworCitzdGF0aWMgdm9pZCBzY2xwX2NwdV9jYXBhYmlsaXR5X25vdGlmeShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IGNwdTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCisJcHJpbnRrKEtFUk5fV0FSTklORyBUQUcgImNwdSBjYXBhYmlsaXR5IGNoYW5nZWQuXG4iKTsKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3lzZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJa29iamVjdF91ZXZlbnQoJnN5c2Rldi0+a29iaiwgS09CSl9DSEFOR0UpOworCX0KKwl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKK30KKworc3RhdGljIHZvaWQgc2NscF9jb25mX3JlY2VpdmVyX2ZuKHN0cnVjdCBldmJ1Zl9oZWFkZXIgKmV2YnVmKQoreworCXN0cnVjdCBjb25mX21nbV9kYXRhICpjZGF0YTsKKworCWNkYXRhID0gKHN0cnVjdCBjb25mX21nbV9kYXRhICopKGV2YnVmICsgMSk7CisJaWYgKGNkYXRhLT5ldl9xdWFsaWZpZXIgPT0gRVZfUVVBTF9DQVBfQ0hBTkdFKQorCQlzY2hlZHVsZV93b3JrKCZzY2xwX2NwdV9jYXBhYmlsaXR5X3dvcmspOworfQorCitzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF9jb25mX3JlZ2lzdGVyID0KK3sKKwkucmVjZWl2ZV9tYXNrID0gRVZUWVBfQ09ORk1HTURBVEFfTUFTSywKKwkucmVjZWl2ZXJfZm4gID0gc2NscF9jb25mX3JlY2VpdmVyX2ZuLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2NscF9jb25mX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlJTklUX1dPUksoJnNjbHBfY3B1X2NhcGFiaWxpdHlfd29yaywgc2NscF9jcHVfY2FwYWJpbGl0eV9ub3RpZnkpOworCisJcmMgPSBzY2xwX3JlZ2lzdGVyKCZzY2xwX2NvbmZfcmVnaXN0ZXIpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgVEFHICJmYWlsZWQgdG8gcmVnaXN0ZXIgKCVkKS5cbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmICghKHNjbHBfY29uZl9yZWdpc3Rlci5zY2xwX3JlY2VpdmVfbWFzayAmIEVWVFlQX0NPTkZNR01EQVRBX01BU0spKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJubyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQuXG4iKTsKKwkJc2NscF91bnJlZ2lzdGVyKCZzY2xwX2NvbmZfcmVnaXN0ZXIpOworCQlyYyA9IC1FTk9TWVM7CisJfQorCXJldHVybiByYzsKK30KKworX19pbml0Y2FsbChzY2xwX2NvbmZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NwaS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGkuYwppbmRleCA2NWFhMmM4Li4yOWZlMmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NwaS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qIEV2ZW50IHR5cGUgc3RydWN0dXJlIGZvciB3cml0ZSBtZXNzYWdlIGFuZCB3cml0ZSBwcmlvcml0eSBtZXNzYWdlICovCiBzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF9jcGlfZXZlbnQgPQogewotCS5zZW5kX21hc2sgPSBFdlR5cF9DdGxQcm9nSWRlbnRfTWFzaworCS5zZW5kX21hc2sgPSBFVlRZUF9DVExQUk9HSURFTlRfTUFTSwogfTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCSAgICAgICAiY29uc29sZS5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEoc2NscF9jcGlfZXZlbnQuc2NscF9zZW5kX21hc2sgJiBFdlR5cF9DdGxQcm9nSWRlbnRfTWFzaykpIHsKKwlpZiAoIShzY2xwX2NwaV9ldmVudC5zY2xwX3NlbmRfbWFzayAmIEVWVFlQX0NUTFBST0dJREVOVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjcGk6IG5vIGNvbnRyb2wgcHJvZ3JhbSBpZGVudGlmaWNhdGlvbiAiCiAJCSAgICAgICAic3VwcG9ydFxuIik7CiAJCXNjbHBfdW5yZWdpc3Rlcigmc2NscF9jcGlfZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwppbmRleCBiYWE4ZmU2Li40NWZmMjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwpAQCAtNDMsNyArNDMsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF9xdWllc2NlX2V2ZW50ID0gewotCS5yZWNlaXZlX21hc2sgPSBFdlR5cF9TaWdRdWllc2NlX01hc2ssCisJLnJlY2VpdmVfbWFzayA9IEVWVFlQX1NJR1FVSUVTQ0VfTUFTSywKIAkucmVjZWl2ZXJfZm4gPSBzY2xwX3F1aWVzY2VfaGFuZGxlcgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9ydy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9ydy5jCmluZGV4IDI0ODY3ODMuLmJiZDViOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcncuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3J3LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogLyogRXZlbnQgdHlwZSBzdHJ1Y3R1cmUgZm9yIHdyaXRlIG1lc3NhZ2UgYW5kIHdyaXRlIHByaW9yaXR5IG1lc3NhZ2UgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2NscF9yZWdpc3RlciBzY2xwX3J3X2V2ZW50ID0gewotCS5zZW5kX21hc2sgPSBFdlR5cF9Nc2dfTWFzayB8IEV2VHlwX1BNc2dDbWRfTWFzaworCS5zZW5kX21hc2sgPSBFVlRZUF9NU0dfTUFTSyB8IEVWVFlQX1BNU0dDTURfTUFTSwogfTsKIAogLyoKQEAgLTY0LDcgKzY0LDcgQEAKIAltZW1zZXQoc2NjYiwgMCwgc2l6ZW9mKHN0cnVjdCB3cml0ZV9zY2NiKSk7CiAJc2NjYi0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgd3JpdGVfc2NjYik7CiAJc2NjYi0+bXNnX2J1Zi5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtc2dfYnVmKTsKLQlzY2NiLT5tc2dfYnVmLmhlYWRlci50eXBlID0gRXZUeXBfTXNnOworCXNjY2ItPm1zZ19idWYuaGVhZGVyLnR5cGUgPSBFVlRZUF9NU0c7CiAJc2NjYi0+bXNnX2J1Zi5tZGIuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbWRiKTsKIAlzY2NiLT5tc2dfYnVmLm1kYi5oZWFkZXIudHlwZSA9IDE7CiAJc2NjYi0+bXNnX2J1Zi5tZGIuaGVhZGVyLnRhZyA9IDB4RDRDNEMyNDA7CS8qIGViY2RpYyAiTURCICIgKi8KQEAgLTExNCw3ICsxMTQsNyBAQAogCW1lbXNldChtdG8sIDAsIHNpemVvZihzdHJ1Y3QgbXRvKSk7CiAJbXRvLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG10byk7CiAJbXRvLT50eXBlID0gNDsJLyogbWVzc2FnZSB0ZXh0IG9iamVjdCAqLwotCW10by0+bGluZV90eXBlX2ZsYWdzID0gTG5UcEZsZ3NfRW5kVGV4dDsgLyogZW5kIHRleHQgKi8KKwltdG8tPmxpbmVfdHlwZV9mbGFncyA9IExOVFBGTEdTX0VORFRFWFQ7IC8qIGVuZCB0ZXh0ICovCiAKIAkvKiBzZXQgcG9pbnRlciB0byBmaXJzdCBieXRlIGFmdGVyIHN0cnVjdCBtdG8uICovCiAJYnVmZmVyLT5jdXJyZW50X2xpbmUgPSAoY2hhciAqKSAobXRvICsgMSk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAkJY2FzZSAnXGEnOgkvKiBiZWxsLCBvbmUgZm9yIHNldmVyYWwgdGltZXMJKi8KIAkJCS8qIHNldCBTQ0xQIHNvdW5kIGFsYXJtIGJpdCBpbiBHZW5lcmFsIE9iamVjdCAqLwogCQkJYnVmZmVyLT5zY2NiLT5tc2dfYnVmLm1kYi5nby5nZW5lcmFsX21zZ19mbGFncyB8PQotCQkJCUducmxNc2dGbGdzX1NuZEFscm07CisJCQkJR05STE1TR0ZMR1NfU05EQUxSTTsKIAkJCWJyZWFrOwogCQljYXNlICdcdCc6CS8qIGhvcml6b250YWwgdGFidWxhdG9yCSAqLwogCQkJLyogY2hlY2sgaWYgbmV3IG10byBuZWVkcyB0byBiZSBjcmVhdGVkICovCkBAIC00NTIsMTIgKzQ1MiwxMiBAQAogCQlyZXR1cm4gLUVJTzsKIAogCXNjY2IgPSBidWZmZXItPnNjY2I7Ci0JaWYgKHNjbHBfcndfZXZlbnQuc2NscF9zZW5kX21hc2sgJiBFdlR5cF9Nc2dfTWFzaykKKwlpZiAoc2NscF9yd19ldmVudC5zY2xwX3NlbmRfbWFzayAmIEVWVFlQX01TR19NQVNLKQogCQkvKiBVc2Ugbm9ybWFsIHdyaXRlIG1lc3NhZ2UgKi8KLQkJc2NjYi0+bXNnX2J1Zi5oZWFkZXIudHlwZSA9IEV2VHlwX01zZzsKLQllbHNlIGlmIChzY2xwX3J3X2V2ZW50LnNjbHBfc2VuZF9tYXNrICYgRXZUeXBfUE1zZ0NtZF9NYXNrKQorCQlzY2NiLT5tc2dfYnVmLmhlYWRlci50eXBlID0gRVZUWVBfTVNHOworCWVsc2UgaWYgKHNjbHBfcndfZXZlbnQuc2NscF9zZW5kX21hc2sgJiBFVlRZUF9QTVNHQ01EX01BU0spCiAJCS8qIFVzZSB3cml0ZSBwcmlvcml0eSBtZXNzYWdlICovCi0JCXNjY2ItPm1zZ19idWYuaGVhZGVyLnR5cGUgPSBFdlR5cF9QTXNnQ21kOworCQlzY2NiLT5tc2dfYnVmLmhlYWRlci50eXBlID0gRVZUWVBfUE1TR0NNRDsKIAllbHNlCiAJCXJldHVybiAtRU5PU1lTOwogCWJ1ZmZlci0+cmVxdWVzdC5jb21tYW5kID0gU0NMUF9DTURXX1dSSVRFX0VWRU5UX0RBVEE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3NkaWFzLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3NkaWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyODNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfc2RpYXMuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIFNjbHAgInN0b3JlIGRhdGEgaW4gYWJzb2x1dCBzdG9yYWdlIgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMywyMDA3CisgKiBBdXRob3Iocyk6IE1pY2hhZWwgSG9semhldQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CisjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL2lwbC5oPgorI2luY2x1ZGUgInNjbHAuaCIKKyNpbmNsdWRlICJzY2xwX3J3LmgiCisKKyNkZWZpbmUgVFJBQ0UoeC4uLikgZGVidWdfc3ByaW50Zl9ldmVudChzZGlhc19kYmYsIDEsIHgpCisjZGVmaW5lIEVSUk9SX01TRyh4Li4uKSBwcmludGsgKCBLRVJOX0FMRVJUICJTRElBUzogIiB4ICkKKworI2RlZmluZSBTRElBU19SRVRSSUVTIDMwMAorI2RlZmluZSBTRElBU19TTEVFUF9USUNLUyA1MAorCisjZGVmaW5lIEVRX1NUT1JFX0RBVEEJMHgwCisjZGVmaW5lIEVRX1NJWkUJCTB4MQorI2RlZmluZSBESV9GQ1BfRFVNUAkweDAKKyNkZWZpbmUgQVNBX1NJWkVfMzIJMHgwCisjZGVmaW5lIEFTQV9TSVpFXzY0CTB4MQorI2RlZmluZSBFVlNUQVRFX0FMTF9TVE9SRUQJMHgwCisjZGVmaW5lIEVWU1RBVEVfTk9fREFUQQkJMHgzCisjZGVmaW5lIEVWU1RBVEVfUEFSVF9TVE9SRUQJMHgxMAorCitzdGF0aWMgc3RydWN0IGRlYnVnX2luZm8gKnNkaWFzX2RiZjsKKworc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfc2RpYXNfcmVnaXN0ZXIgPSB7CisJLnNlbmRfbWFzayA9IEVWVFlQX1NESUFTX01BU0ssCit9OworCitzdHJ1Y3Qgc2RpYXNfZXZidWYgeworCXN0cnVjdAlldmJ1Zl9oZWFkZXIgaGRyOworCXU4CWV2ZW50X3F1YWw7CisJdTgJZGF0YV9pZDsKKwl1NjQJcmVzZXJ2ZWQyOworCXUzMglldmVudF9pZDsKKwl1MTYJcmVzZXJ2ZWQzOworCXU4CWFzYV9zaXplOworCXU4CWV2ZW50X3N0YXR1czsKKwl1MzIJcmVzZXJ2ZWQ0OworCXUzMglibGtfY250OworCXU2NAlhc2E7CisJdTMyCXJlc2VydmVkNTsKKwl1MzIJZmJuOworCXUzMglyZXNlcnZlZDY7CisJdTMyCWxibjsKKwl1MTYJcmVzZXJ2ZWQ3OworCXUxNglkYnM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RpYXNfc2NjYiB7CisJc3RydWN0IHNjY2JfaGVhZGVyICBoZHI7CisJc3RydWN0IHNkaWFzX2V2YnVmICBldmJ1ZjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2RpYXNfc2NjYiBzY2NiIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNDA5NikpKTsKKworc3RhdGljIGludCBzY2xwX3JlcV9kb25lOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHNkaWFzX3dxOworc3RhdGljIERFRklORV9NVVRFWChzZGlhc19tdXRleCk7CisKK3N0YXRpYyB2b2lkIHNkaWFzX2NhbGxiYWNrKHN0cnVjdCBzY2xwX3JlcSAqcmVxdWVzdCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2RpYXNfc2NjYiAqc2NjYjsKKworCXNjY2IgPSAoc3RydWN0IHNkaWFzX3NjY2IgKikgcmVxdWVzdC0+c2NjYjsKKwlzY2xwX3JlcV9kb25lID0gMTsKKwl3YWtlX3VwKCZzZGlhc193cSk7IC8qIEluZm9ybSBjYWxsZXIsIHRoYXQgcmVxdWVzdCBpcyBjb21wbGV0ZSAqLworCVRSQUNFKCJjYWxsYmFjayBkb25lXG4iKTsKK30KKworc3RhdGljIGludCBzZGlhc19zY2xwX3NlbmQoc3RydWN0IHNjbHBfcmVxICpyZXEpCit7CisJaW50IHJldHJpZXM7CisJaW50IHJjOworCisJZm9yIChyZXRyaWVzID0gU0RJQVNfUkVUUklFUzsgcmV0cmllczsgcmV0cmllcy0tKSB7CisJCXNjbHBfcmVxX2RvbmUgPSAwOworCQlUUkFDRSgiYWRkIHJlcXVlc3RcbiIpOworCQlyYyA9IHNjbHBfYWRkX3JlcXVlc3QocmVxKTsKKwkJaWYgKHJjKSB7CisJCQkvKiBub3QgaW5pdGlhdGVkLCB3YWl0IHNvbWUgdGltZSBhbmQgcmV0cnkgKi8KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlUUkFDRSgiYWRkIHJlcXVlc3QgZmFpbGVkOiByYyA9ICVpXG4iLHJjKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoU0RJQVNfU0xFRVBfVElDS1MpOworCQkJY29udGludWU7CisJCX0KKwkJLyogaW5pdGlhdGVkLCB3YWl0IGZvciBjb21wbGV0aW9uIG9mIHNlcnZpY2UgY2FsbCAqLworCQl3YWl0X2V2ZW50KHNkaWFzX3dxLCAoc2NscF9yZXFfZG9uZSA9PSAxKSk7CisJCWlmIChyZXEtPnN0YXR1cyA9PSBTQ0xQX1JFUV9GQUlMRUQpIHsKKwkJCVRSQUNFKCJzY2xwIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJCXJjID0gLUVJTzsKKwkJCWNvbnRpbnVlOworCQl9CisJCVRSQUNFKCJyZXF1ZXN0IGRvbmVcbiIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKgorICogR2V0IG51bWJlciBvZiBibG9ja3MgKDRLKSBhdmFpbGFibGUgaW4gdGhlIEhTQQorICovCitpbnQgc2NscF9zZGlhc19ibGtfY291bnQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NscF9yZXEgcmVxdWVzdDsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZzZGlhc19tdXRleCk7CisKKwltZW1zZXQoJnNjY2IsIDAsIHNpemVvZihzY2NiKSk7CisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCisJc2NjYi5oZHIubGVuZ3RoID0gc2l6ZW9mKHNjY2IpOworCXNjY2IuZXZidWYuaGRyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2RpYXNfZXZidWYpOworCXNjY2IuZXZidWYuaGRyLnR5cGUgPSBFVlRZUF9TRElBUzsKKwlzY2NiLmV2YnVmLmV2ZW50X3F1YWwgPSBFUV9TSVpFOworCXNjY2IuZXZidWYuZGF0YV9pZCA9IERJX0ZDUF9EVU1QOworCXNjY2IuZXZidWYuZXZlbnRfaWQgPSA0NzEyOworCXNjY2IuZXZidWYuZGJzID0gMTsKKworCXJlcXVlc3Quc2NjYiA9ICZzY2NiOworCXJlcXVlc3QuY29tbWFuZCA9IFNDTFBfQ01EV19XUklURV9FVkVOVF9EQVRBOworCXJlcXVlc3Quc3RhdHVzID0gU0NMUF9SRVFfRklMTEVEOworCXJlcXVlc3QuY2FsbGJhY2sgPSBzZGlhc19jYWxsYmFjazsKKworCXJjID0gc2RpYXNfc2NscF9zZW5kKCZyZXF1ZXN0KTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJzY2xwX3NlbmQgZmFpbGVkIGZvciBnZXRfbnJfYmxvY2tzXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzY2NiLmhkci5yZXNwb25zZV9jb2RlICE9IDB4MDAyMCkgeworCQlUUkFDRSgic2VuZCBmYWlsZWQ6ICV4XG4iLCBzY2NiLmhkci5yZXNwb25zZV9jb2RlKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHNjY2IuZXZidWYuZXZlbnRfc3RhdHVzKSB7CisJCWNhc2UgMDoKKwkJCXJjID0gc2NjYi5ldmJ1Zi5ibGtfY250OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlFUlJPUl9NU0coIlNDTFAgZXJyb3I6ICV4XG4iLCBzY2NiLmV2YnVmLmV2ZW50X3N0YXR1cyk7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwl9CisJVFJBQ0UoIiVpIGJsb2Nrc1xuIiwgcmMpOworb3V0OgorCW11dGV4X3VubG9jaygmc2RpYXNfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIENvcHkgZnJvbSBIU0EgdG8gYWJzb2x1dGUgc3RvcmFnZSAobm90IHJlZW50cmFudCk6CisgKgorICogQGRlc3QgICAgIDogQWRkcmVzcyBvZiBidWZmZXIgd2hlcmUgZGF0YSBzaG91bGQgYmUgY29waWVkCisgKiBAc3RhcnRfYmxrOiBTdGFydCBCbG9jayAoYmVnaW5uaW5nIHdpdGggMSkKKyAqIEBucl9ibGtzICA6IE51bWJlciBvZiA0SyBibG9ja3MgdG8gY29weQorICoKKyAqIFJldHVybiBWYWx1ZTogMCA6IFJlcXVlc3RlZCAnbnVtYmVyJyBvZiBibG9ja3Mgb2YgZGF0YSBjb3BpZWQKKyAqCQkgPDA6IEVSUk9SIC0gbmVnYXRpdmUgZXZlbnQgc3RhdHVzCisgKi8KK2ludCBzY2xwX3NkaWFzX2NvcHkodm9pZCAqZGVzdCwgaW50IHN0YXJ0X2JsaywgaW50IG5yX2Jsa3MpCit7CisJc3RydWN0IHNjbHBfcmVxIHJlcXVlc3Q7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmc2RpYXNfbXV0ZXgpOworCisJbWVtc2V0KCZzY2NiLCAwLCBzaXplb2Yoc2NjYikpOworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXNjY2IuaGRyLmxlbmd0aCA9IHNpemVvZihzY2NiKTsKKwlzY2NiLmV2YnVmLmhkci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNkaWFzX2V2YnVmKTsKKwlzY2NiLmV2YnVmLmhkci50eXBlID0gRVZUWVBfU0RJQVM7CisJc2NjYi5ldmJ1Zi5oZHIuZmxhZ3MgPSAwOworCXNjY2IuZXZidWYuZXZlbnRfcXVhbCA9IEVRX1NUT1JFX0RBVEE7CisJc2NjYi5ldmJ1Zi5kYXRhX2lkID0gRElfRkNQX0RVTVA7CisJc2NjYi5ldmJ1Zi5ldmVudF9pZCA9IDQ3MTI7CisjaWZkZWYgX19zMzkweF9fCisJc2NjYi5ldmJ1Zi5hc2Ffc2l6ZSA9IEFTQV9TSVpFXzY0OworI2Vsc2UKKwlzY2NiLmV2YnVmLmFzYV9zaXplID0gQVNBX1NJWkVfMzI7CisjZW5kaWYKKwlzY2NiLmV2YnVmLmV2ZW50X3N0YXR1cyA9IDA7CisJc2NjYi5ldmJ1Zi5ibGtfY250ID0gbnJfYmxrczsKKwlzY2NiLmV2YnVmLmFzYSA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7CisJc2NjYi5ldmJ1Zi5mYm4gPSBzdGFydF9ibGs7CisJc2NjYi5ldmJ1Zi5sYm4gPSAwOworCXNjY2IuZXZidWYuZGJzID0gMTsKKworCXJlcXVlc3Quc2NjYgkgPSAmc2NjYjsKKwlyZXF1ZXN0LmNvbW1hbmQgID0gU0NMUF9DTURXX1dSSVRFX0VWRU5UX0RBVEE7CisJcmVxdWVzdC5zdGF0dXMJID0gU0NMUF9SRVFfRklMTEVEOworCXJlcXVlc3QuY2FsbGJhY2sgPSBzZGlhc19jYWxsYmFjazsKKworCXJjID0gc2RpYXNfc2NscF9zZW5kKCZyZXF1ZXN0KTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJzY2xwX3NlbmQgZmFpbGVkOiAleFxuIiwgcmMpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHNjY2IuaGRyLnJlc3BvbnNlX2NvZGUgIT0gMHgwMDIwKSB7CisJCVRSQUNFKCJjb3B5IGZhaWxlZDogJXhcbiIsIHNjY2IuaGRyLnJlc3BvbnNlX2NvZGUpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoc2NjYi5ldmJ1Zi5ldmVudF9zdGF0dXMpIHsKKwkJY2FzZSBFVlNUQVRFX0FMTF9TVE9SRUQ6CisJCQlUUkFDRSgiYWxsIHN0b3JlZFxuIik7CisJCWNhc2UgRVZTVEFURV9QQVJUX1NUT1JFRDoKKwkJCVRSQUNFKCJwYXJ0IHN0b3JlZDogJWlcbiIsIHNjY2IuZXZidWYuYmxrX2NudCk7CisJCQlicmVhazsKKwkJY2FzZSBFVlNUQVRFX05PX0RBVEE6CisJCQlUUkFDRSgibm8gZGF0YVxuIik7CisJCWRlZmF1bHQ6CisJCQlFUlJPUl9NU0coIkVycm9yIGZyb20gU0NMUCB3aGlsZSBjb3B5aW5nIGhzYS4gIgorCQkJCSAgIkV2ZW50IHN0YXR1cyA9ICV4XG4iLAorCQkJCXNjY2IuZXZidWYuZXZlbnRfc3RhdHVzKTsKKwkJCXJjID0gLUVJTzsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzZGlhc19tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgX19pbml0IHNkaWFzX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoaXBsX2luZm8udHlwZSAhPSBJUExfVFlQRV9GQ1BfRFVNUCkKKwkJcmV0dXJuIDA7CisJc2RpYXNfZGJmID0gZGVidWdfcmVnaXN0ZXIoImR1bXBfc2RpYXMiLCA0LCAxLCA0ICogc2l6ZW9mKGxvbmcpKTsKKwlkZWJ1Z19yZWdpc3Rlcl92aWV3KHNkaWFzX2RiZiwgJmRlYnVnX3NwcmludGZfdmlldyk7CisJZGVidWdfc2V0X2xldmVsKHNkaWFzX2RiZiwgNik7CisJcmMgPSBzY2xwX3JlZ2lzdGVyKCZzY2xwX3NkaWFzX3JlZ2lzdGVyKTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJzY2xwIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2RpYXNfd3EpOworCVRSQUNFKCJpbml0IGRvbmVcbiIpOworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBzZGlhc19leGl0KHZvaWQpCit7CisJZGVidWdfdW5yZWdpc3RlcihzZGlhc19kYmYpOworCXNjbHBfdW5yZWdpc3Rlcigmc2NscF9zZGlhc19yZWdpc3Rlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYwppbmRleCAwNzY4MTZiLi5lM2IzZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdHR5LmMKQEAgLTY0OCw3ICs2NDgsNyBAQAogCXN1YnZlYyA9IHN0YXJ0OwogCXdoaWxlIChzdWJ2ZWMgPCBlbmQpIHsKIAkJc3VidmVjID0gZmluZF9nZHNfc3VidmVjdG9yKHN1YnZlYywgZW5kLAotCQkJCQkgICAgR0RTX0tFWV9TZWxmRGVmVGV4dE1zZyk7CisJCQkJCSAgICBHRFNfS0VZX1NFTEZERUZURVhUTVNHKTsKIAkJaWYgKCFzdWJ2ZWMpCiAJCQlicmVhazsKIAkJc2NscF9ldmFsX3NlbGZkZWZ0ZXh0bXNnKChzdHJ1Y3QgZ2RzX3N1YnZlY3RvciAqKShzdWJ2ZWMgKyAxKSwKQEAgLTY2NCw3ICs2NjQsNyBAQAogCiAJdmVjID0gc3RhcnQ7CiAJd2hpbGUgKHZlYyA8IGVuZCkgewotCQl2ZWMgPSBmaW5kX2dkc192ZWN0b3IodmVjLCBlbmQsIEdEU19JRF9UZXh0Q21kKTsKKwkJdmVjID0gZmluZF9nZHNfdmVjdG9yKHZlYywgZW5kLCBHRFNfSURfVEVYVENNRCk7CiAJCWlmICghdmVjKQogCQkJYnJlYWs7CiAJCXNjbHBfZXZhbF90ZXh0Y21kKChzdHJ1Y3QgZ2RzX3N1YnZlY3RvciAqKSh2ZWMgKyAxKSwKQEAgLTcwMyw3ICs3MDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF9pbnB1dF9ldmVudCA9CiB7Ci0JLnJlY2VpdmVfbWFzayA9IEV2VHlwX09wQ21kX01hc2sgfCBFdlR5cF9QTXNnQ21kX01hc2ssCisJLnJlY2VpdmVfbWFzayA9IEVWVFlQX09QQ01EX01BU0sgfCBFVlRZUF9QTVNHQ01EX01BU0ssCiAJLnN0YXRlX2NoYW5nZV9mbiA9IHNjbHBfdHR5X3N0YXRlX2NoYW5nZSwKIAkucmVjZWl2ZXJfZm4gPSBzY2xwX3R0eV9yZWNlaXZlcgogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYwppbmRleCBmNzdkYzMzLi43MjYzMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCkBAIC05OSw4ICs5OSw4IEBACiAKIC8qIFJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmUgZm9yIG91ciBpbnRlcmVzdCBpbiBTQ0xQIGV2ZW50IGJ1ZmZlcnMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2NscF9yZWdpc3RlciBzY2xwX3Z0MjIwX3JlZ2lzdGVyID0gewotCS5zZW5kX21hc2sJCT0gRXZUeXBfVlQyMjBNc2dfTWFzaywKLQkucmVjZWl2ZV9tYXNrCQk9IEV2VHlwX1ZUMjIwTXNnX01hc2ssCisJLnNlbmRfbWFzawkJPSBFVlRZUF9WVDIyME1TR19NQVNLLAorCS5yZWNlaXZlX21hc2sJCT0gRVZUWVBfVlQyMjBNU0dfTUFTSywKIAkuc3RhdGVfY2hhbmdlX2ZuCT0gTlVMTCwKIAkucmVjZWl2ZXJfZm4JCT0gc2NscF92dDIyMF9yZWNlaXZlcl9mbgogfTsKQEAgLTIwMiw3ICsyMDIsNyBAQAogc3RhdGljIGludAogX19zY2xwX3Z0MjIwX2VtaXQoc3RydWN0IHNjbHBfdnQyMjBfcmVxdWVzdCAqcmVxdWVzdCkKIHsKLQlpZiAoIShzY2xwX3Z0MjIwX3JlZ2lzdGVyLnNjbHBfc2VuZF9tYXNrICYgRXZUeXBfVlQyMjBNc2dfTWFzaykpIHsKKwlpZiAoIShzY2xwX3Z0MjIwX3JlZ2lzdGVyLnNjbHBfc2VuZF9tYXNrICYgRVZUWVBfVlQyMjBNU0dfTUFTSykpIHsKIAkJcmVxdWVzdC0+c2NscF9yZXEuc3RhdHVzID0gU0NMUF9SRVFfRkFJTEVEOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yODQsNyArMjg0LDcgQEAKIAlzY2NiLT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzY2xwX3Z0MjIwX3NjY2IpOwogCXNjY2ItPmhlYWRlci5mdW5jdGlvbl9jb2RlID0gU0NMUF9OT1JNQUxfV1JJVEU7CiAJc2NjYi0+aGVhZGVyLnJlc3BvbnNlX2NvZGUgPSAweDAwMDA7Ci0Jc2NjYi0+ZXZidWYudHlwZSA9IEV2VHlwX1ZUMjIwTXNnOworCXNjY2ItPmV2YnVmLnR5cGUgPSBFVlRZUF9WVDIyME1TRzsKIAlzY2NiLT5ldmJ1Zi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGV2YnVmX2hlYWRlcik7CiAKIAlyZXR1cm4gcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCmluZGV4IGI4N2QzYjAuLmE1YTAwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJICAucmVjb3JkaW5nX25hbWUgPSAiRVJFUCIsCiAJICAubWlub3JfbnVtICAgICAgPSAwLAogCSAgLmJ1ZmZlcl9mcmVlICAgID0gMSwKLQkgIC5wcml2X2xvY2sgICAgICA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkgIC5wcml2X2xvY2sJICA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHN5c19zZXJbMF0ucHJpdl9sb2NrKSwKIAkgIC5hdXRvcmVjb3JkaW5nICA9IDEsCiAJICAuYXV0b3B1cmdlICAgICAgPSAxLAogCX0sCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkgIC5yZWNvcmRpbmdfbmFtZSA9ICJBQ0NPVU5UIiwKIAkgIC5taW5vcl9udW0gICAgICA9IDEsCiAJICAuYnVmZmVyX2ZyZWUgICAgPSAxLAotCSAgLnByaXZfbG9jayAgICAgID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCSAgLnByaXZfbG9jawkgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoc3lzX3NlclsxXS5wcml2X2xvY2spLAogCSAgLmF1dG9yZWNvcmRpbmcgID0gMSwKIAkgIC5hdXRvcHVyZ2UgICAgICA9IDEsCiAJfSwKQEAgLTE0Myw3ICsxNDMsNyBAQAogCSAgLnJlY29yZGluZ19uYW1lID0gIlNZTVBUT00iLAogCSAgLm1pbm9yX251bSAgICAgID0gMiwKIAkgIC5idWZmZXJfZnJlZSAgICA9IDEsCi0JICAucHJpdl9sb2NrICAgICAgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJICAucHJpdl9sb2NrCSAgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChzeXNfc2VyWzJdLnByaXZfbG9jayksCiAJICAuYXV0b3JlY29yZGluZyAgPSAxLAogCSAgLmF1dG9wdXJnZSAgICAgID0gMSwKIAl9CkBAIC0zODUsNiArMzg1LDkgQEAKIAogCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKKwlpdWN2X3BhdGhfc2V2ZXIobG9ncHRyLT5wYXRoLCBOVUxMKTsKKwlrZnJlZShsb2dwdHItPnBhdGgpOworCWxvZ3B0ci0+cGF0aCA9IE5VTEw7CiAJaWYgKGxvZ3B0ci0+YXV0b3JlY29yZGluZykgewogCQlyZXQgPSB2bWxvZ3Jkcl9yZWNvcmRpbmcobG9ncHRyLDAsbG9ncHRyLT5hdXRvcHVyZ2UpOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkNDM5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCkBAIC0wLDAgKzEsNjUxIEBACisvKgorICogemNvcmUgbW9kdWxlIHRvIGV4cG9ydCBtZW1vcnkgY29udGVudCBhbmQgcmVnaXN0ZXIgc2V0cyBmb3IgY3JlYXRpbmcgc3lzdGVtCisgKiBkdW1wcyBvbiBTQ1NJIGRpc2tzICh6ZmNwZHVtcCkuIFRoZSAiemNvcmUvbWVtIiBkZWJ1Z2ZzIGZpbGUgc2hvd3MgdGhlIHNhbWUKKyAqIGR1bXAgZm9ybWF0IGFzIHMzOTAgc3RhbmRhbG9uZSBkdW1wcy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9zMzkwL3pmY3BkdW1wLnR4dAorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMywyMDA3CisgKiBBdXRob3Iocyk6IE1pY2hhZWwgSG9semhldQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8YXNtL2lwbC5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KKworI2RlZmluZSBUUkFDRSh4Li4uKSBkZWJ1Z19zcHJpbnRmX2V2ZW50KHpjb3JlX2RiZiwgMSwgeCkKKyNkZWZpbmUgTVNHKHguLi4pIHByaW50ayggS0VSTl9BTEVSVCB4ICkKKyNkZWZpbmUgRVJST1JfTVNHKHguLi4pIHByaW50ayAoIEtFUk5fQUxFUlQgIkRVTVA6ICIgeCApCisKKyNkZWZpbmUgVE9fVVNFUgkJMAorI2RlZmluZSBUT19LRVJORUwJMQorCitlbnVtIGFyY2hfaWQgeworCUFSQ0hfUzM5MAk9IDAsCisJQVJDSF9TMzkwWAk9IDEsCit9OworCisvKiBkdW1wIHN5c3RlbSBpbmZvICovCisKK3N0cnVjdCBzeXNfaW5mbyB7CisJZW51bSBhcmNoX2lkCWFyY2g7CisJdW5zaWduZWQgbG9uZwlzYV9iYXNlOworCXUzMgkJc2Ffc2l6ZTsKKwlpbnQJCWNwdV9tYXBbTlJfQ1BVU107CisJdW5zaWduZWQgbG9uZwltZW1fc2l6ZTsKKwl1bmlvbiBzYXZlX2FyZWEJbGNfbWFzazsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2luZm8gc3lzX2luZm87CitzdGF0aWMgc3RydWN0IGRlYnVnX2luZm8gKnpjb3JlX2RiZjsKK3N0YXRpYyBpbnQgaHNhX2F2YWlsYWJsZTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp6Y29yZV9kaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqemNvcmVfZmlsZTsKKworLyoKKyAqIENvcHkgbWVtb3J5IGZyb20gSFNBIHRvIGtlcm5lbCBvciB1c2VyIG1lbW9yeSAobm90IHJlZW50cmFudCk6CisgKgorICogQGRlc3Q6ICBLZXJuZWwgb3IgdXNlciBidWZmZXIgd2hlcmUgbWVtb3J5IHNob3VsZCBiZSBjb3BpZWQgdG8KKyAqIEBzcmM6ICAgU3RhcnQgYWRkcmVzcyB3aXRoaW4gSFNBIHdoZXJlIGRhdGEgc2hvdWxkIGJlIGNvcGllZAorICogQGNvdW50OiBTaXplIG9mIGJ1ZmZlciwgd2hpY2ggc2hvdWxkIGJlIGNvcGllZAorICogQG1vZGU6ICBFaXRoZXIgVE9fS0VSTkVMIG9yIFRPX1VTRVIKKyAqLworc3RhdGljIGludCBtZW1jcHlfaHNhKHZvaWQgKmRlc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBzaXplX3QgY291bnQsIGludCBtb2RlKQoreworCWludCBvZmZzLCBibGtfbnVtOworCXN0YXRpYyBjaGFyIGJ1ZltQQUdFX1NJWkVdIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFBBR0VfU0laRSkpKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGNvcHkgZmlyc3QgYmxvY2sgKi8KKwlvZmZzID0gMDsKKwlpZiAoKHNyYyAlIFBBR0VfU0laRSkgIT0gMCkgeworCQlibGtfbnVtID0gc3JjIC8gUEFHRV9TSVpFICsgMjsKKwkJaWYgKHNjbHBfc2RpYXNfY29weShidWYsIGJsa19udW0sIDEpKSB7CisJCQlUUkFDRSgic2NscF9zZGlhc19jb3B5KCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCW9mZnMgPSBtaW4oKFBBR0VfU0laRSAtIChzcmMgJSBQQUdFX1NJWkUpKSwgY291bnQpOworCQlpZiAobW9kZSA9PSBUT19VU0VSKSB7CisJCQlpZiAoY29weV90b191c2VyKChfX2ZvcmNlIF9fdXNlciB2b2lkKikgZGVzdCwKKwkJCQkJIGJ1ZiArIChzcmMgJSBQQUdFX1NJWkUpLCBvZmZzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlCisJCQltZW1jcHkoZGVzdCwgYnVmICsgKHNyYyAlIFBBR0VfU0laRSksIG9mZnMpOworCX0KKwlpZiAob2ZmcyA9PSBjb3VudCkKKwkJZ290byBvdXQ7CisKKwkvKiBjb3B5IG1pZGRsZSAqLworCWZvciAoOyAob2ZmcyArIFBBR0VfU0laRSkgPD0gY291bnQ7IG9mZnMgKz0gUEFHRV9TSVpFKSB7CisJCWJsa19udW0gPSAoc3JjICsgb2ZmcykgLyBQQUdFX1NJWkUgKyAyOworCQlpZiAoc2NscF9zZGlhc19jb3B5KGJ1ZiwgYmxrX251bSwgMSkpIHsKKwkJCVRSQUNFKCJzY2xwX3NkaWFzX2NvcHkoKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKG1vZGUgPT0gVE9fVVNFUikgeworCQkJaWYgKGNvcHlfdG9fdXNlcigoX19mb3JjZSBfX3VzZXIgdm9pZCopIGRlc3QgKyBvZmZzLAorCQkJCQkgYnVmLCBQQUdFX1NJWkUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9IGVsc2UKKwkJCW1lbWNweShkZXN0ICsgb2ZmcywgYnVmLCBQQUdFX1NJWkUpOworCX0KKwlpZiAob2ZmcyA9PSBjb3VudCkKKwkJZ290byBvdXQ7CisKKwkvKiBjb3B5IGxhc3QgYmxvY2sgKi8KKwlibGtfbnVtID0gKHNyYyArIG9mZnMpIC8gUEFHRV9TSVpFICsgMjsKKwlpZiAoc2NscF9zZGlhc19jb3B5KGJ1ZiwgYmxrX251bSwgMSkpIHsKKwkJVFJBQ0UoInNjbHBfc2RpYXNfY29weSgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAobW9kZSA9PSBUT19VU0VSKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoKF9fZm9yY2UgX191c2VyIHZvaWQqKSBkZXN0ICsgb2ZmcywgYnVmLAorCQkJCSBQQUdFX1NJWkUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlCisJCW1lbWNweShkZXN0ICsgb2ZmcywgYnVmLCBjb3VudCAtIG9mZnMpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbWNweV9oc2FfdXNlcih2b2lkIF9fdXNlciAqZGVzdCwgdW5zaWduZWQgbG9uZyBzcmMsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gbWVtY3B5X2hzYSgodm9pZCBfX2ZvcmNlICopIGRlc3QsIHNyYywgY291bnQsIFRPX1VTRVIpOworfQorCitzdGF0aWMgaW50IG1lbWNweV9oc2Ffa2VybmVsKHZvaWQgKmRlc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIG1lbWNweV9oc2EoZGVzdCwgc3JjLCBjb3VudCwgVE9fS0VSTkVMKTsKK30KKworc3RhdGljIGludCBtZW1jcHlfcmVhbCh2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIHNyYywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVGQVVMVDsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9kZXN0IGFzbSgiMiIpID0gKHVuc2lnbmVkIGxvbmcpIGRlc3Q7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfbGVuMSBhc20oIjMiKSA9ICh1bnNpZ25lZCBsb25nKSBjb3VudDsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9zcmMgIGFzbSgiNCIpID0gc3JjOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX2xlbjIgYXNtKCI1IikgPSAodW5zaWduZWQgbG9uZykgY291bnQ7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJZmxhZ3MgPSBfX3Jhd19sb2NhbF9pcnFfc3Ruc20oMHhmOCk7IC8qIHN3aXRjaCB0byByZWFsIG1vZGUgKi8KKwlhc20gdm9sYXRpbGUgKAorCQkiMDoJbXZjbGUJJTEsJTIsMHgwXG4iCisJCSIxOglqbwkwYlxuIgorCQkiCWxoaQklMCwweDBcbiIKKwkJIjI6XG4iCisJCUVYX1RBQkxFKDFiLDJiKQorCQk6ICIrZCIgKHJjKQorCQk6ICJkIiAoX2Rlc3QpLCAiZCIgKF9zcmMpLCAiZCIgKF9sZW4xKSwgImQiIChfbGVuMikKKwkJOiAiY2MiLCAibWVtb3J5Iik7CisJX19yYXdfbG9jYWxfaXJxX3NzbShmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbWVtY3B5X3JlYWxfdXNlcihfX3VzZXIgdm9pZCAqZGVzdCwgdW5zaWduZWQgbG9uZyBzcmMsIHNpemVfdCBjb3VudCkKK3sKKwlzdGF0aWMgY2hhciBidWZbNDA5Nl07CisJaW50IG9mZnMgPSAwLCBzaXplOworCisJd2hpbGUgKG9mZnMgPCBjb3VudCkgeworCQlzaXplID0gbWluKHNpemVvZihidWYpLCBjb3VudCAtIG9mZnMpOworCQlpZiAobWVtY3B5X3JlYWwoYnVmLCBzcmMgKyBvZmZzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKGRlc3QgKyBvZmZzLCBidWYsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mZnMgKz0gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX3MzOTB4X18KKy8qCisgKiBDb252ZXJ0IHMzOTB4ICg2NCBiaXQpIGNwdSBpbmZvIHRvIHMzOTAgKDMyIGJpdCkgY3B1IGluZm8KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHMzOTB4X3RvX3MzOTBfcmVncyh1bmlvbiBzYXZlX2FyZWEgKm91dCwgdW5pb24gc2F2ZV9hcmVhICppbiwKKwkJCQkgICAgICBpbnQgY3B1KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb3V0LT5zMzkwLmdwX3JlZ3NbaV0gPSBpbi0+czM5MHguZ3BfcmVnc1tpXSAmIDB4MDAwMDAwMDBmZmZmZmZmZjsKKwkJb3V0LT5zMzkwLmFjY19yZWdzW2ldID0gaW4tPnMzOTB4LmFjY19yZWdzW2ldOworCQlvdXQtPnMzOTAuY3RybF9yZWdzW2ldID0KKwkJCWluLT5zMzkweC5jdHJsX3JlZ3NbaV0gJiAweDAwMDAwMDAwZmZmZmZmZmY7CisJfQorCS8qIGxvY29yZSBmb3IgMzEgYml0IGhhcyBvbmx5IHNwYWNlIGZvciBmcHJlZ3MgMCwyLDQsNiAqLworCW91dC0+czM5MC5mcF9yZWdzWzBdID0gaW4tPnMzOTB4LmZwX3JlZ3NbMF07CisJb3V0LT5zMzkwLmZwX3JlZ3NbMV0gPSBpbi0+czM5MHguZnBfcmVnc1syXTsKKwlvdXQtPnMzOTAuZnBfcmVnc1syXSA9IGluLT5zMzkweC5mcF9yZWdzWzRdOworCW91dC0+czM5MC5mcF9yZWdzWzNdID0gaW4tPnMzOTB4LmZwX3JlZ3NbNl07CisJbWVtY3B5KCYob3V0LT5zMzkwLnBzd1swXSksICYoaW4tPnMzOTB4LnBzd1swXSksIDQpOworCW91dC0+czM5MC5wc3dbMV0gfD0gMHg4OyAvKiBzZXQgYml0IDEyICovCisJbWVtY3B5KCYob3V0LT5zMzkwLnBzd1s0XSksJihpbi0+czM5MHgucHN3WzEyXSksIDQpOworCW91dC0+czM5MC5wc3dbNF0gfD0gMHg4MDsgLyogc2V0ICgzMWJpdCkgYWRkcmVzc2luZyBiaXQgKi8KKwlvdXQtPnMzOTAucHJlZl9yZWcgPSBpbi0+czM5MHgucHJlZl9yZWc7CisJb3V0LT5zMzkwLnRpbWVyID0gaW4tPnMzOTB4LnRpbWVyOworCW91dC0+czM5MC5jbGtfY21wID0gaW4tPnMzOTB4LmNsa19jbXA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzMzkweF90b19zMzkwX3NhdmVfYXJlYXModm9pZCkKK3sKKwlpbnQgaSA9IDE7CisJc3RhdGljIHVuaW9uIHNhdmVfYXJlYSB0bXA7CisKKwl3aGlsZSAoemZjcGR1bXBfc2F2ZV9hcmVhc1tpXSkgeworCQlzMzkweF90b19zMzkwX3JlZ3MoJnRtcCwgemZjcGR1bXBfc2F2ZV9hcmVhc1tpXSwgaSk7CisJCW1lbWNweSh6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWkrKzsKKwl9Cit9CisKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jcHVfaW5mbyhlbnVtIGFyY2hfaWQgYXJjaCkKK3sKKwl1bmlvbiBzYXZlX2FyZWEgKnNhOworCisJLyogZ2V0IGluZm8gZm9yIGJvb3QgY3B1IGZyb20gbG93Y29yZSwgc3RvcmVkIGluIHRoZSBIU0EgKi8KKworCXNhID0ga21hbGxvYyhzaXplb2YoKnNhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYSkgeworCQlFUlJPUl9NU0coImttYWxsb2MgZmFpbGVkOiAlczogJWlcbiIsX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAobWVtY3B5X2hzYV9rZXJuZWwoc2EsIHN5c19pbmZvLnNhX2Jhc2UsIHN5c19pbmZvLnNhX3NpemUpIDwgMCkgeworCQlFUlJPUl9NU0coImNvdWxkIG5vdCBjb3B5IGZyb20gSFNBXG4iKTsKKwkJa2ZyZWUoc2EpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJemZjcGR1bXBfc2F2ZV9hcmVhc1swXSA9IHNhOworCisjaWZkZWYgX19zMzkweF9fCisJLyogY29udmVydCBzMzkweCByZWdzIHRvIHMzOTAsIGlmIHdlIGFyZSBkdW1waW5nIGFuIHMzOTAgTGludXggKi8KKworCWlmIChhcmNoID09IEFSQ0hfUzM5MCkKKwkJczM5MHhfdG9fczM5MF9zYXZlX2FyZWFzKCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgREVGSU5FX01VVEVYKHpjb3JlX211dGV4KTsKKworI2RlZmluZSBEVU1QX1ZFUlNJT04JMHgzCisjZGVmaW5lIERVTVBfTUFHSUMJMHhhODE5MDE3MzYxOGYyM2ZkVUxMCisjZGVmaW5lIERVTVBfQVJDSF9TMzkwWAkyCisjZGVmaW5lIERVTVBfQVJDSF9TMzkwCTEKKyNkZWZpbmUgSEVBREVSX1NJWkUJNDA5NgorCisvKiBkdW1wIGhlYWRlciBkdW1wZWQgYWNjb3JkaW5nIHRvIHMzOTAgY3Jhc2ggZHVtcCBmb3JtYXQgKi8KKworc3RydWN0IHpjb3JlX2hlYWRlciB7CisJdTY0IG1hZ2ljOworCXUzMiB2ZXJzaW9uOworCXUzMiBoZWFkZXJfc2l6ZTsKKwl1MzIgZHVtcF9sZXZlbDsKKwl1MzIgcGFnZV9zaXplOworCXU2NCBtZW1fc2l6ZTsKKwl1NjQgbWVtX3N0YXJ0OworCXU2NCBtZW1fZW5kOworCXUzMiBudW1fcGFnZXM7CisJdTMyIHBhZDE7CisJdTY0IHRvZDsKKwljcHVpZF90IGNwdV9pZDsKKwl1MzIgYXJjaF9pZDsKKwl1MzIgYnVpbGRfYXJjaDsKKwljaGFyIHBhZDJbNDAxNl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCxfX2FsaWduZWRfXygxNikpKTsKKworc3RhdGljIHN0cnVjdCB6Y29yZV9oZWFkZXIgemNvcmVfaGVhZGVyID0geworCS5tYWdpYwkJPSBEVU1QX01BR0lDLAorCS52ZXJzaW9uCT0gRFVNUF9WRVJTSU9OLAorCS5oZWFkZXJfc2l6ZQk9IDQwOTYsCisJLmR1bXBfbGV2ZWwJPSAwLAorCS5wYWdlX3NpemUJPSBQQUdFX1NJWkUsCisJLm1lbV9zdGFydAk9IDAsCisjaWZkZWYgX19zMzkweF9fCisJLmJ1aWxkX2FyY2gJPSBEVU1QX0FSQ0hfUzM5MFgsCisjZWxzZQorCS5idWlsZF9hcmNoCT0gRFVNUF9BUkNIX1MzOTAsCisjZW5kaWYKK307CisKKy8qCisgKiBDb3B5IGxvd2NvcmUgaW5mbyB0byBidWZmZXIuIFVzZSBtYXAgaW4gb3JkZXIgdG8gY29weSBvbmx5IHJlZ2lzdGVyIHBhcnRzLgorICoKKyAqIEBidWY6ICAgIFVzZXIgYnVmZmVyCisgKiBAc2E6ICAgICBQb2ludGVyIHRvIHNhdmUgYXJlYQorICogQHNhX29mZjogT2Zmc2V0IGluIHNhdmUgYXJlYSB0byBjb3B5CisgKiBAbGVuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICovCitzdGF0aWMgaW50IGNvcHlfbGModm9pZCBfX3VzZXIgKmJ1Ziwgdm9pZCAqc2EsIGludCBzYV9vZmYsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciAqbGNfbWFzayA9IChjaGFyKikmc3lzX2luZm8ubGNfbWFzazsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoIWxjX21hc2tbaSArIHNhX29mZl0pCisJCQljb250aW51ZTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBpLCBzYSArIHNhX29mZiArIGksIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ29weSBsb3djb3JlcyBpbmZvIHRvIG1lbW9yeSwgaWYgbmVjZXNzYXJ5CisgKgorICogQGJ1ZjogICBVc2VyIGJ1ZmZlcgorICogQGFkZHI6ICBTdGFydCBhZGRyZXNzIG9mIGJ1ZmZlciBpbiBkdW1wIG1lbW9yeQorICogQGNvdW50OiBTaXplIG9mIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHpjb3JlX2FkZF9sYyhjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IGkgPSAwOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJZW5kID0gc3RhcnQgKyBjb3VudDsKKwl3aGlsZSAoemZjcGR1bXBfc2F2ZV9hcmVhc1tpXSkgeworCQl1bnNpZ25lZCBsb25nIGNwX3N0YXJ0LCBjcF9lbmQ7IC8qIGNvcHkgcmFuZ2UgKi8KKwkJdW5zaWduZWQgbG9uZyBzYV9zdGFydCwgc2FfZW5kOyAvKiBzYXZlIGFyZWEgcmFuZ2UgKi8KKwkJdW5zaWduZWQgbG9uZyBwcmVmaXg7CisJCXVuc2lnbmVkIGxvbmcgc2Ffb2ZmLCBsZW4sIGJ1Zl9vZmY7CisKKwkJaWYgKHN5c19pbmZvLmFyY2ggPT0gQVJDSF9TMzkwKQorCQkJcHJlZml4ID0gemZjcGR1bXBfc2F2ZV9hcmVhc1tpXS0+czM5MC5wcmVmX3JlZzsKKwkJZWxzZQorCQkJcHJlZml4ID0gemZjcGR1bXBfc2F2ZV9hcmVhc1tpXS0+czM5MHgucHJlZl9yZWc7CisKKwkJc2Ffc3RhcnQgPSBwcmVmaXggKyBzeXNfaW5mby5zYV9iYXNlOworCQlzYV9lbmQgPSBwcmVmaXggKyBzeXNfaW5mby5zYV9iYXNlICsgc3lzX2luZm8uc2Ffc2l6ZTsKKworCQlpZiAoKGVuZCA8IHNhX3N0YXJ0KSB8fCAoc3RhcnQgPiBzYV9lbmQpKQorCQkJZ290byBuZXh0OworCQljcF9zdGFydCA9IG1heChzdGFydCwgc2Ffc3RhcnQpOworCQljcF9lbmQgPSBtaW4oZW5kLCBzYV9lbmQpOworCisJCWJ1Zl9vZmYgPSBjcF9zdGFydCAtIHN0YXJ0OworCQlzYV9vZmYgPSBjcF9zdGFydCAtIHNhX3N0YXJ0OworCQlsZW4gPSBjcF9lbmQgLSBjcF9zdGFydDsKKworCQlUUkFDRSgiY29weV9sYyBmb3I6ICVseFxuIiwgc3RhcnQpOworCQlpZiAoY29weV9sYyhidWYgKyBidWZfb2ZmLCB6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldLCBzYV9vZmYsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKK25leHQ6CisJCWkrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHJvdXRpbmUgZm9yIHpjb3JlIGNoYXJhY3RlciBkZXZpY2UKKyAqIEZpcnN0IDRLIGFyZSBkdW1wIGhlYWRlcgorICogTmV4dCAzMk1CIGFyZSBIU0EgTWVtb3J5CisgKiBSZXN0IGlzIHJlYWQgZnJvbSBhYnNvbHV0ZSBNZW1vcnkKKyAqLworc3RhdGljIHNzaXplX3QgemNvcmVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQ7IC8qIFN0YXJ0IGFkZHJlc3MgaW4gbWVtb3J5ICovCisJc2l6ZV90IG1lbV9vZmZzOwkgLyogT2Zmc2V0IGluIGR1bXAgbWVtb3J5ICovCisJc2l6ZV90IGhkcl9jb3VudDsJIC8qIFNpemUgb2YgaGVhZGVyIHBhcnQgb2Ygb3V0cHV0IGJ1ZmZlciAqLworCXNpemVfdCBzaXplOworCWludCByYzsKKworCW11dGV4X2xvY2soJnpjb3JlX211dGV4KTsKKworCWlmICgqcHBvcyA+IChzeXNfaW5mby5tZW1fc2l6ZSArIEhFQURFUl9TSVpFKSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljb3VudCA9IG1pbihjb3VudCwgKHNpemVfdCkgKHN5c19pbmZvLm1lbV9zaXplICsgSEVBREVSX1NJWkUgLSAqcHBvcykpOworCisJLyogQ29weSBkdW1wIGhlYWRlciAqLworCWlmICgqcHBvcyA8IEhFQURFUl9TSVpFKSB7CisJCXNpemUgPSBtaW4oY291bnQsIChzaXplX3QpIChIRUFERVJfU0laRSAtICpwcG9zKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmemNvcmVfaGVhZGVyICsgKnBwb3MsIHNpemUpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaGRyX2NvdW50ID0gc2l6ZTsKKwkJbWVtX3N0YXJ0ID0gMDsKKwl9IGVsc2UgeworCQloZHJfY291bnQgPSAwOworCQltZW1fc3RhcnQgPSAqcHBvcyAtIEhFQURFUl9TSVpFOworCX0KKworCW1lbV9vZmZzID0gMDsKKworCS8qIENvcHkgZnJvbSBIU0EgZGF0YSAqLworCWlmICgqcHBvcyA8IChaRkNQRFVNUF9IU0FfU0laRSArIEhFQURFUl9TSVpFKSkgeworCQlzaXplID0gbWluKChjb3VudCAtIGhkcl9jb3VudCksIChzaXplX3QpIChaRkNQRFVNUF9IU0FfU0laRQorCQkJICAgLSBtZW1fc3RhcnQpKTsKKwkJcmMgPSBtZW1jcHlfaHNhX3VzZXIoYnVmICsgaGRyX2NvdW50LCBtZW1fc3RhcnQsIHNpemUpOworCQlpZiAocmMpCisJCQlnb3RvIGZhaWw7CisKKwkJbWVtX29mZnMgKz0gc2l6ZTsKKwl9CisKKwkvKiBDb3B5IGZyb20gcmVhbCBtZW0gKi8KKwlzaXplID0gY291bnQgLSBtZW1fb2ZmcyAtIGhkcl9jb3VudDsKKwlyYyA9IG1lbWNweV9yZWFsX3VzZXIoYnVmICsgaGRyX2NvdW50ICsgbWVtX29mZnMsIG1lbV9zdGFydCArIG1lbV9vZmZzLAorCQkJICAgICAgc2l6ZSk7CisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIFNpbmNlIHMzOTAgZHVtcCBhbmFseXNpcyB0b29scyBsaWtlIGxjcmFzaCBvciBjcmFzaAorCSAqIGV4cGVjdCByZWdpc3RlciBzZXRzIGluIHRoZSBwcmVmaXggcGFnZXMgb2YgdGhlIGNwdXMsCisJICogd2UgY29weSB0aGVtIGludG8gdGhlIHJlYWQgYnVmZmVyLCBpZiBuZWNlc3NhcnkuCisJICogYnVmICsgaGRyX2NvdW50OiBTdGFydCBvZiBtZW1vcnkgcGFydCBvZiBvdXRwdXQgYnVmZmVyCisJICogbWVtX3N0YXJ0OiBTdGFydCBtZW1vcnkgYWRkcmVzcyB0byBjb3B5IGZyb20KKwkgKiBjb3VudCAtIGhkcl9jb3VudDogU2l6ZSBvZiBtZW1vcnkgYXJlYSB0byBjb3B5CisJICovCisJaWYgKHpjb3JlX2FkZF9sYyhidWYgKyBoZHJfY291bnQsIG1lbV9zdGFydCwgY291bnQgLSBoZHJfY291bnQpKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBmYWlsOworCX0KKwkqcHBvcyArPSBjb3VudDsKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZ6Y29yZV9tdXRleCk7CisJcmV0dXJuIChyYyA8IDApID8gcmMgOiBjb3VudDsKK30KKworc3RhdGljIGludCB6Y29yZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmICghaHNhX2F2YWlsYWJsZSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWVsc2UKKwkJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOworfQorCitzdGF0aWMgaW50IHpjb3JlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCWRpYWczMDgoRElBRzMwOF9SRUxfSFNBLCBOVUxMKTsKKwloc2FfYXZhaWxhYmxlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvZmZfdCB6Y29yZV9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJjOworCisJbXV0ZXhfbG9jaygmemNvcmVfbXV0ZXgpOworCXN3aXRjaCAob3JpZykgeworCWNhc2UgMDoKKwkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCXJjID0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZmlsZS0+Zl9wb3MgKz0gb2Zmc2V0OworCQlyYyA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJfQorCW11dGV4X3VubG9jaygmemNvcmVfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgemNvcmVfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSB6Y29yZV9sc2VlaywKKwkucmVhZAkJPSB6Y29yZV9yZWFkLAorCS5vcGVuCQk9IHpjb3JlX29wZW4sCisJLnJlbGVhc2UJPSB6Y29yZV9yZWxlYXNlLAorfTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3MzOTBfbGNfbWFzayh1bmlvbiBzYXZlX2FyZWEgKm1hcCkKK3sKKwltZW1zZXQoJm1hcC0+czM5MC5leHRfc2F2ZSwgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5leHRfc2F2ZSkpOworCW1lbXNldCgmbWFwLT5zMzkwLnRpbWVyLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLnRpbWVyKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAuY2xrX2NtcCwgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5jbGtfY21wKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAucHN3LCAweGZmLCBzaXplb2YobWFwLT5zMzkwLnBzdykpOworCW1lbXNldCgmbWFwLT5zMzkwLnByZWZfcmVnLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLnByZWZfcmVnKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAuYWNjX3JlZ3MsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTAuYWNjX3JlZ3MpKTsKKwltZW1zZXQoJm1hcC0+czM5MC5mcF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLmZwX3JlZ3MpKTsKKwltZW1zZXQoJm1hcC0+czM5MC5ncF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLmdwX3JlZ3MpKTsKKwltZW1zZXQoJm1hcC0+czM5MC5jdHJsX3JlZ3MsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTAuY3RybF9yZWdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfczM5MHhfbGNfbWFzayh1bmlvbiBzYXZlX2FyZWEgKm1hcCkKK3sKKwltZW1zZXQoJm1hcC0+czM5MHguZnBfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguZnBfcmVncykpOworCW1lbXNldCgmbWFwLT5zMzkweC5ncF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkweC5ncF9yZWdzKSk7CisJbWVtc2V0KCZtYXAtPnMzOTB4LnBzdywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHgucHN3KSk7CisJbWVtc2V0KCZtYXAtPnMzOTB4LnByZWZfcmVnLCAweGZmLCBzaXplb2YobWFwLT5zMzkweC5wcmVmX3JlZykpOworCW1lbXNldCgmbWFwLT5zMzkweC5mcF9jdHJsX3JlZywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguZnBfY3RybF9yZWcpKTsKKwltZW1zZXQoJm1hcC0+czM5MHgudG9kX3JlZywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHgudG9kX3JlZykpOworCW1lbXNldCgmbWFwLT5zMzkweC50aW1lciwgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHgudGltZXIpKTsKKwltZW1zZXQoJm1hcC0+czM5MHguY2xrX2NtcCwgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguY2xrX2NtcCkpOworCW1lbXNldCgmbWFwLT5zMzkweC5hY2NfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguYWNjX3JlZ3MpKTsKKwltZW1zZXQoJm1hcC0+czM5MHguY3RybF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkweC5jdHJsX3JlZ3MpKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgZHVtcCBnbG9iYWxzIGZvciBhIGdpdmVuIGFyY2hpdGVjdHVyZQorICovCitzdGF0aWMgaW50IF9faW5pdCBzeXNfaW5mb19pbml0KGVudW0gYXJjaF9pZCBhcmNoKQoreworCXN3aXRjaCAoYXJjaCkgeworCWNhc2UgQVJDSF9TMzkwWDoKKwkJTVNHKCJERVRFQ1RFRCAnUzM5MFggKDY0IGJpdCkgT1MnXG4iKTsKKwkJc3lzX2luZm8uc2FfYmFzZSA9IFNBVkVfQVJFQV9CQVNFX1MzOTBYOworCQlzeXNfaW5mby5zYV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYXZlX2FyZWFfczM5MHgpOworCQlzZXRfczM5MHhfbGNfbWFzaygmc3lzX2luZm8ubGNfbWFzayk7CisJCWJyZWFrOworCWNhc2UgQVJDSF9TMzkwOgorCQlNU0coIkRFVEVDVEVEICdTMzkwICgzMiBiaXQpIE9TJ1xuIik7CisJCXN5c19pbmZvLnNhX2Jhc2UgPSBTQVZFX0FSRUFfQkFTRV9TMzkwOworCQlzeXNfaW5mby5zYV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYXZlX2FyZWFfczM5MCk7CisJCXNldF9zMzkwX2xjX21hc2soJnN5c19pbmZvLmxjX21hc2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlFUlJPUl9NU0coInVua25vd24gYXJjaGl0ZWN0dXJlIDB4JXguXG4iLGFyY2gpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3lzX2luZm8uYXJjaCA9IGFyY2g7CisJaWYgKGluaXRfY3B1X2luZm8oYXJjaCkpIHsKKwkJRVJST1JfTVNHKCJnZXQgY3B1IGluZm8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN5c19pbmZvLm1lbV9zaXplID0gcmVhbF9tZW1vcnlfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaGVja19zZGlhcyh2b2lkKQoreworCWludCByYywgYWN0X2hzYV9zaXplOworCisJcmMgPSBzY2xwX3NkaWFzX2Jsa19jb3VudCgpOworCWlmIChyYyA8IDApIHsKKwkJRVJST1JfTVNHKCJDb3VsZCBub3QgZGV0ZXJtaW5lIEhTQSBzaXplXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKwlhY3RfaHNhX3NpemUgPSAocmMgLSAxKSAqIFBBR0VfU0laRTsKKwlpZiAoYWN0X2hzYV9zaXplIDwgWkZDUERVTVBfSFNBX1NJWkUpIHsKKwkJRVJST1JfTVNHKCJIU0Egc2l6ZSB0b28gc21hbGw6ICVpXG4iLCBhY3RfaHNhX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB6Y29yZV9oZWFkZXJfaW5pdChpbnQgYXJjaCwgc3RydWN0IHpjb3JlX2hlYWRlciAqaGRyKQoreworCWlmIChhcmNoID09IEFSQ0hfUzM5MFgpCisJCWhkci0+YXJjaF9pZCA9IERVTVBfQVJDSF9TMzkwWDsKKwllbHNlCisJCWhkci0+YXJjaF9pZCA9IERVTVBfQVJDSF9TMzkwOworCWhkci0+bWVtX3NpemUgPSBzeXNfaW5mby5tZW1fc2l6ZTsKKwloZHItPm1lbV9lbmQgPSBzeXNfaW5mby5tZW1fc2l6ZTsKKwloZHItPm51bV9wYWdlcyA9IHN5c19pbmZvLm1lbV9zaXplIC8gUEFHRV9TSVpFOworCWhkci0+dG9kID0gZ2V0X2Nsb2NrKCk7CisJZ2V0X2NwdV9pZCgmaGRyLT5jcHVfaWQpOworfQorCitleHRlcm4gaW50IHNkaWFzX2luaXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHpjb3JlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGFyY2g7CisJaW50IHJjOworCisJaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVApCisJCXJldHVybiAtRU5PREFUQTsKKworCXpjb3JlX2RiZiA9IGRlYnVnX3JlZ2lzdGVyKCJ6Y29yZSIsIDQsIDEsIDQgKiBzaXplb2YobG9uZykpOworCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoemNvcmVfZGJmLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKKwlkZWJ1Z19zZXRfbGV2ZWwoemNvcmVfZGJmLCA2KTsKKworCVRSQUNFKCJkZXZubzogICV4XG4iLCBpcGxfaW5mby5kYXRhLmZjcC5kZXZfaWQuZGV2bm8pOworCVRSQUNFKCJ3d3BuOiAgICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwbF9pbmZvLmRhdGEuZmNwLnd3cG4pOworCVRSQUNFKCJsdW46ICAgICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwbF9pbmZvLmRhdGEuZmNwLmx1bik7CisKKwlyYyA9IHNkaWFzX2luaXQoKTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbDsKKworCXJjID0gY2hlY2tfc2RpYXMoKTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJEdW1wIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyYyA9IG1lbWNweV9oc2Ffa2VybmVsKCZhcmNoLCBfX0xDX0FSX01PREVfSUQsIDEpOworCWlmIChyYykgeworCQlFUlJPUl9NU0coInNkaWFsIG1lbWNweSBmb3IgYXJjaCBpZCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisjaWZuZGVmIF9fczM5MHhfXworCWlmIChhcmNoID09IEFSQ0hfUzM5MFgpIHsKKwkJRVJST1JfTVNHKCIzMiBiaXQgZHVtcGVyIGNhbid0IGR1bXAgNjQgYml0IHN5c3RlbSFcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisjZW5kaWYKKworCXJjID0gc3lzX2luZm9faW5pdChhcmNoKTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJhcmNoIGluaXQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXpjb3JlX2hlYWRlcl9pbml0KGFyY2gsICZ6Y29yZV9oZWFkZXIpOworCisJemNvcmVfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ6Y29yZSIgLCBOVUxMKTsKKwlpZiAoIXpjb3JlX2RpcikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJemNvcmVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1lbSIsIFNfSVJVU1IsIHpjb3JlX2RpciwgTlVMTCwKKwkJCQkJICZ6Y29yZV9mb3BzKTsKKwlpZiAoIXpjb3JlX2ZpbGUpIHsKKwkJZGVidWdmc19yZW1vdmUoemNvcmVfZGlyKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWhzYV9hdmFpbGFibGUgPSAxOworCXJldHVybiAwOworCitmYWlsOgorCWRpYWczMDgoRElBRzMwOF9SRUxfSFNBLCBOVUxMKTsKKwlyZXR1cm4gcmM7Cit9CisKK2V4dGVybiB2b2lkIHNkaWFzX2V4aXQodm9pZCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6Y29yZV9leGl0KHZvaWQpCit7CisJZGVidWdfdW5yZWdpc3Rlcih6Y29yZV9kYmYpOworCXNkaWFzX2V4aXQoKTsKKwlkaWFnMzA4KERJQUczMDhfUkVMX0hTQSwgTlVMTCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkNvcHlyaWdodCBJQk0gQ29ycC4gMjAwMywyMDA3Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInpjb3JlIG1vZHVsZSBmb3IgemZjcGR1bXAgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdWJzeXNfaW5pdGNhbGwoemNvcmVfaW5pdCk7Cittb2R1bGVfZXhpdCh6Y29yZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3MzOTAvY2lvL01ha2VmaWxlCmluZGV4IGM0OTBjMmEuLmNmYWY3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zMzkwL2Npby9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBTLzM5MCBjb21tb24gaS9vIGRyaXZlcnMKICMKIAotb2JqLXkgKz0gYWlycS5vIGJsYWNrbGlzdC5vIGNoc2MubyBjaW8ubyBjc3Mubworb2JqLXkgKz0gYWlycS5vIGJsYWNrbGlzdC5vIGNoc2MubyBjaW8ubyBjc3MubyBjaHAubyBpZHNldC5vCiBjY3dfZGV2aWNlLW9ianMgKz0gZGV2aWNlLm8gZGV2aWNlX2ZzbS5vIGRldmljZV9vcHMubwogY2N3X2RldmljZS1vYmpzICs9IGRldmljZV9pZC5vIGRldmljZV9wZ2lkLm8gZGV2aWNlX3N0YXR1cy5vCiBvYmoteSArPSBjY3dfZGV2aWNlLm8gY21mLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCA1YWViNjhlLi5lNWNjZGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCkBAIC03NSw4ICs3NSwxMCBAQAogewogCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwogCisJbXV0ZXhfbG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKIAlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTE3Myw3ICsxNzUsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKLQorCW11dGV4X2luaXQoJmdkZXYtPnJlZ19tdXRleCk7CisJbXV0ZXhfbG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAJCWdkZXYtPmNkZXZbaV0gPSBnZXRfY2N3ZGV2X2J5X2J1c2lkKGNkcnYsIGFyZ3ZbaV0pOwogCkBAIC0xODMsMTIgKzE4NiwxMiBAQAogCQkgICAgfHwgZ2Rldi0+Y2RldltpXS0+aWQuZHJpdmVyX2luZm8gIT0KIAkJICAgIGdkZXYtPmNkZXZbMF0tPmlkLmRyaXZlcl9pbmZvKSB7CiAJCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZyZWVfZGV2OworCQkJZ290byBlcnJvcjsKIAkJfQogCQkvKiBEb24ndCBhbGxvdyBhIGRldmljZSB0byBiZWxvbmcgdG8gbW9yZSB0aGFuIG9uZSBncm91cC4gKi8KIAkJaWYgKGdkZXYtPmNkZXZbaV0tPmRldi5kcml2ZXJfZGF0YSkgewogCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBmcmVlX2RldjsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJZ2Rldi0+Y2RldltpXS0+ZGV2LmRyaXZlcl9kYXRhID0gZ2RldjsKIAl9CkBAIC0yMDMsOSArMjA2LDggQEAKIAkJCWdkZXYtPmNkZXZbMF0tPmRldi5idXNfaWQpOwogCiAJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJmdkZXYtPmRldik7Ci0JCiAJaWYgKHJjKQotCQlnb3RvIGZyZWVfZGV2OworCQlnb3RvIGVycm9yOwogCWdldF9kZXZpY2UoJmdkZXYtPmRldik7CiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmdkZXYtPmRldiwgJmRldl9hdHRyX3VuZ3JvdXApOwogCkBAIC0yMTYsNiArMjE4LDcgQEAKIAogCXJjID0gX19jY3dncm91cF9jcmVhdGVfc3ltbGlua3MoZ2Rldik7CiAJaWYgKCFyYykgeworCQltdXRleF91bmxvY2soJmdkZXYtPnJlZ19tdXRleCk7CiAJCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CiAJCXJldHVybiAwOwogCX0KQEAgLTIyNCwxOSArMjI3LDEyIEBACiBlcnJvcjoKIAlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQogCQlpZiAoZ2Rldi0+Y2RldltpXSkgewotCQkJcHV0X2RldmljZSgmZ2Rldi0+Y2RldltpXS0+ZGV2KTsKLQkJCWdkZXYtPmNkZXZbaV0tPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCX0KLQlwdXRfZGV2aWNlKCZnZGV2LT5kZXYpOwotCXJldHVybiByYzsKLWZyZWVfZGV2OgotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCi0JCWlmIChnZGV2LT5jZGV2W2ldKSB7CiAJCQlpZiAoZ2Rldi0+Y2RldltpXS0+ZGV2LmRyaXZlcl9kYXRhID09IGdkZXYpCiAJCQkJZ2Rldi0+Y2RldltpXS0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAkJCXB1dF9kZXZpY2UoJmdkZXYtPmNkZXZbaV0tPmRldik7CiAJCX0KLQlrZnJlZShnZGV2KTsKKwltdXRleF91bmxvY2soJmdkZXYtPnJlZ19tdXRleCk7CisJcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQyMiw4ICs0MTgsMTIgQEAKIAlnZXRfZHJpdmVyKCZjZHJpdmVyLT5kcml2ZXIpOwogCXdoaWxlICgoZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKCZjZHJpdmVyLT5kcml2ZXIsIE5VTEwsIE5VTEwsCiAJCQkJCSBfX2Njd2dyb3VwX21hdGNoX2FsbCkpKSB7Ci0JCV9fY2N3Z3JvdXBfcmVtb3ZlX3N5bWxpbmtzKHRvX2Njd2dyb3VwZGV2KGRldikpOworCQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKKworCQltdXRleF9sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOworCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQogCXB1dF9kcml2ZXIoJmNkcml2ZXItPmRyaXZlcik7CkBAIC00NDQsOCArNDQ0LDEwIEBACiAJaWYgKGNkZXYtPmRldi5kcml2ZXJfZGF0YSkgewogCQlnZGV2ID0gKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKiljZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJCWlmIChnZXRfZGV2aWNlKCZnZGV2LT5kZXYpKSB7CisJCQltdXRleF9sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCQkJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZnZGV2LT5kZXYpKQogCQkJCXJldHVybiBnZGV2OworCQkJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCQkJcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKIAkJfQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ2NSw2ICs0NjcsNyBAQAogCWlmIChnZGV2KSB7CiAJCV9fY2N3Z3JvdXBfcmVtb3ZlX3N5bWxpbmtzKGdkZXYpOwogCQlkZXZpY2VfdW5yZWdpc3RlcigmZ2Rldi0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCQlwdXRfZGV2aWNlKCZnZGV2LT5kZXYpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjg5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogIGRyaXZlcnMvczM5MC9jaW8vY2hwLmMKKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDE5OTksMjAwNworICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCisgKgkJIEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCisgKgkJIFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CisKKyNpbmNsdWRlICJjaW8uaCIKKyNpbmNsdWRlICJjc3MuaCIKKyNpbmNsdWRlICJpb2FzbS5oIgorI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgorI2luY2x1ZGUgImNocC5oIgorCisjZGVmaW5lIHRvX2NoYW5uZWxwYXRoKGRldmljZSkgY29udGFpbmVyX29mKGRldmljZSwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KQorI2RlZmluZSBDSFBfSU5GT19VUERBVEVfSU5URVJWQUwJMSpIWgorCitlbnVtIGNmZ190YXNrX3QgeworCWNmZ19ub25lLAorCWNmZ19jb25maWd1cmUsCisJY2ZnX2RlY29uZmlndXJlCit9OworCisvKiBNYXAgZm9yIHBlbmRpbmcgY29uZmlndXJlIHRhc2tzLiAqLworc3RhdGljIGVudW0gY2ZnX3Rhc2tfdCBjaHBfY2ZnX3Rhc2tbX19NQVhfQ1NTSUQgKyAxXVtfX01BWF9DSFBJRCArIDFdOworc3RhdGljIERFRklORV9NVVRFWChjZmdfbG9jayk7CitzdGF0aWMgaW50IGNmZ19idXN5OworCisvKiBNYXAgZm9yIGNoYW5uZWwtcGF0aCBzdGF0dXMuICovCitzdGF0aWMgc3RydWN0IHNjbHBfY2hwX2luZm8gY2hwX2luZm87CitzdGF0aWMgREVGSU5FX01VVEVYKGluZm9fbG9jayk7CisKKy8qIFRpbWUgYWZ0ZXIgd2hpY2ggY2hhbm5lbC1wYXRoIHN0YXR1cyBtYXkgYmUgb3V0ZGF0ZWQuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaHBfaW5mb19leHBpcmVzOworCisvKiBXb3JrcXVldWUgdG8gcGVyZm9ybSBwZW5kaW5nIGNvbmZpZ3VyZSB0YXNrcy4gKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY2hwX3dxOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjZmdfd29yazsKKworLyogV2FpdCBxdWV1ZSBmb3IgY29uZmlndXJlIGNvbXBsZXRpb24gZXZlbnRzLiAqLworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGNmZ193YWl0X3F1ZXVlOworCisvKiBSZXR1cm4gY2hhbm5lbF9wYXRoIHN0cnVjdCBmb3IgZ2l2ZW4gY2hwaWQuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaGFubmVsX3BhdGggKmNocGlkX3RvX2NocChzdHJ1Y3QgY2hwX2lkIGNocGlkKQoreworCXJldHVybiBjc3NbY2hwaWQuY3NzaWRdLT5jaHBzW2NocGlkLmlkXTsKK30KKworLyogU2V0IHZhcnkgc3RhdGUgZm9yIGdpdmVuIGNocGlkLiAqLworc3RhdGljIHZvaWQgc2V0X2NocF9sb2dpY2FsbHlfb25saW5lKHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBvbm9mZikKK3sKKwljaHBpZF90b19jaHAoY2hwaWQpLT5zdGF0ZSA9IG9ub2ZmOworfQorCisvKiBPbiBzdWNjZXMgcmV0dXJuIDAgaWYgY2hhbm5lbC1wYXRoIGlzIHZhcmllZCBvZmZsaW5lLCAxIGlmIGl0IGlzIHZhcmllZAorICogb25saW5lLiBSZXR1cm4gLUVOT0RFViBpZiBjaGFubmVsLXBhdGggaXMgbm90IHJlZ2lzdGVyZWQuICovCitpbnQgY2hwX2dldF9zdGF0dXMoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gKGNocGlkX3RvX2NocChjaHBpZCkgPyBjaHBpZF90b19jaHAoY2hwaWQpLT5zdGF0ZSA6IC1FTk9ERVYpOworfQorCisvKioKKyAqIGNocF9nZXRfc2NoX29wbSAtIHJldHVybiBvcG0gZm9yIHN1YmNoYW5uZWwKKyAqIEBzY2g6IHN1YmNoYW5uZWwKKyAqCisgKiBDYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgb3BlcmF0aW9uYWwgcGF0aCBtYXNrIChvcG0pIGJhc2VkIG9uIHRoZSBjaHBpZHMKKyAqIHVzZWQgYnkgdGhlIHN1YmNoYW5uZWwgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGFzc29jaWF0ZWQgY2hhbm5lbC1wYXRocy4KKyAqLwordTggY2hwX2dldF9zY2hfb3BtKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCit7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKwlpbnQgb3BtOworCWludCBpOworCisJb3BtID0gMDsKKwljaHBfaWRfaW5pdCgmY2hwaWQpOworCWZvciAoaT0wOyBpIDwgODsgaSsrKSB7CisJCW9wbSA8PD0gMTsKKwkJY2hwaWQuaWQgPSBzY2gtPnNjaGliLnBtY3cuY2hwaWRbaV07CisJCWlmIChjaHBfZ2V0X3N0YXR1cyhjaHBpZCkgIT0gMCkKKwkJCW9wbSB8PSAxOworCX0KKwlyZXR1cm4gb3BtOworfQorCisvKioKKyAqIGNocF9pc19yZWdpc3RlcmVkIC0gY2hlY2sgaWYgYSBjaGFubmVsLXBhdGggaXMgcmVnaXN0ZXJlZAorICogQGNocGlkOiBjaGFubmVsLXBhdGggSUQKKyAqCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgYSBjaGFubmVsLXBhdGggd2l0aCB0aGUgZ2l2ZW4gY2hwaWQgaXMgcmVnaXN0ZXJlZCwKKyAqIHplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgY2hwX2lzX3JlZ2lzdGVyZWQoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gY2hwaWRfdG9fY2hwKGNocGlkKSAhPSBOVUxMOworfQorCisvKgorICogRnVuY3Rpb246IHMzOTBfdmFyeV9jaHBpZAorICogVmFyaWVzIHRoZSBzcGVjaWZpZWQgY2hwaWQgb25saW5lIG9yIG9mZmxpbmUKKyAqLworc3RhdGljIGludCBzMzkwX3ZhcnlfY2hwaWQoc3RydWN0IGNocF9pZCBjaHBpZCwgaW50IG9uKQoreworCWNoYXIgZGJmX3RleHRbMTVdOworCWludCBzdGF0dXM7CisKKwlzcHJpbnRmKGRiZl90ZXh0LCBvbj8idmFyeW9uJXguJTAyeCI6InZhcnlvZmYleC4lMDJ4IiwgY2hwaWQuY3NzaWQsCisJCWNocGlkLmlkKTsKKwlDSU9fVFJBQ0VfRVZFTlQoIDIsIGRiZl90ZXh0KTsKKworCXN0YXR1cyA9IGNocF9nZXRfc3RhdHVzKGNocGlkKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHZhcnkgdW5rbm93biBjaHBpZCAleC4lMDJ4XG4iLAorCQkgICAgICAgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvbiAmJiAhc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2hwaWQgJXguJTAyeCBpcyBhbHJlYWR5IG9mZmxpbmVcbiIsCisJCSAgICAgICBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzZXRfY2hwX2xvZ2ljYWxseV9vbmxpbmUoY2hwaWQsIG9uKTsKKwljaHNjX2NocF92YXJ5KGNocGlkLCBvbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGFubmVsIG1lYXN1cmVtZW50IHJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNocF9tZWFzdXJlbWVudF9jaGFyc19yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkJCSAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCWNocCA9IHRvX2NoYW5uZWxwYXRoKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisJaWYgKCFjaHAtPmNtZ19jaGFycykKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBjbWdfY2hhcnMpOworCisJaWYgKG9mZiA+IHNpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBjb3VudCA+IHNpemUpCisJCWNvdW50ID0gc2l6ZSAtIG9mZjsKKwltZW1jcHkoYnVmLCBjaHAtPmNtZ19jaGFycyArIG9mZiwgY291bnQpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGNocF9tZWFzdXJlbWVudF9jaGFyc19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJtZWFzdXJlbWVudF9jaGFycyIsCisJCS5tb2RlID0gU19JUlVTUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2NoYXJzKSwKKwkucmVhZCA9IGNocF9tZWFzdXJlbWVudF9jaGFyc19yZWFkLAorfTsKKworc3RhdGljIHZvaWQgY2hwX21lYXN1cmVtZW50X2NvcHlfYmxvY2soc3RydWN0IGNtZ19lbnRyeSAqYnVmLAorCQkJCSAgICAgICBzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzcywKKwkJCQkgICAgICAgc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwl2b2lkICphcmVhOworCXN0cnVjdCBjbWdfZW50cnkgKmVudHJ5LCByZWZlcmVuY2VfYnVmOworCWludCBpZHg7CisKKwlpZiAoY2hwaWQuaWQgPCAxMjgpIHsKKwkJYXJlYSA9IGNzcy0+Y3ViX2FkZHIxOworCQlpZHggPSBjaHBpZC5pZDsKKwl9IGVsc2UgeworCQlhcmVhID0gY3NzLT5jdWJfYWRkcjI7CisJCWlkeCA9IGNocGlkLmlkIC0gMTI4OworCX0KKwllbnRyeSA9IGFyZWEgKyAoaWR4ICogc2l6ZW9mKHN0cnVjdCBjbWdfZW50cnkpKTsKKwlkbyB7CisJCW1lbWNweShidWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSk7CisJCW1lbWNweSgmcmVmZXJlbmNlX2J1ZiwgZW50cnksIHNpemVvZigqZW50cnkpKTsKKwl9IHdoaWxlIChyZWZlcmVuY2VfYnVmLnZhbHVlc1swXSAhPSBidWYtPnZhbHVlc1swXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNocF9tZWFzdXJlbWVudF9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkJICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7CisJc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3M7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwljaHAgPSB0b19jaGFubmVscGF0aChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCWNzcyA9IHRvX2NzcyhjaHAtPmRldi5wYXJlbnQpOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2VudHJ5KTsKKworCS8qIE9ubHkgYWxsb3cgc2luZ2xlIHJlYWRzLiAqLworCWlmIChvZmYgfHwgY291bnQgPCBzaXplKQorCQlyZXR1cm4gMDsKKwljaHBfbWVhc3VyZW1lbnRfY29weV9ibG9jaygoc3RydWN0IGNtZ19lbnRyeSAqKWJ1ZiwgY3NzLCBjaHAtPmNocGlkKTsKKwljb3VudCA9IHNpemU7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgY2hwX21lYXN1cmVtZW50X2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm1lYXN1cmVtZW50IiwKKwkJLm1vZGUgPSBTX0lSVVNSLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBjbWdfZW50cnkpLAorCS5yZWFkID0gY2hwX21lYXN1cmVtZW50X3JlYWQsCit9OworCit2b2lkIGNocF9yZW1vdmVfY21nX2F0dHIoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKQoreworCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOworCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2F0dHIpOworfQorCitpbnQgY2hwX2FkZF9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCit7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfYXR0cik7CisJaWYgKHJldCkKKwkJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfY2hhcnNfYXR0cik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbGVzIGZvciB0aGUgY2hhbm5lbCBwYXRoIGVudHJpZXMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNocF9zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOworCisJaWYgKCFjaHApCisJCXJldHVybiAwOworCXJldHVybiAoY2hwX2dldF9zdGF0dXMoY2hwLT5jaHBpZCkgPyBzcHJpbnRmKGJ1ZiwgIm9ubGluZVxuIikgOgorCQlzcHJpbnRmKGJ1ZiwgIm9mZmxpbmVcbiIpKTsKK30KKworc3RhdGljIHNzaXplX3QgY2hwX3N0YXR1c193cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOworCWNoYXIgY21kWzEwXTsKKwlpbnQgbnVtX2FyZ3M7CisJaW50IGVycm9yOworCisJbnVtX2FyZ3MgPSBzc2NhbmYoYnVmLCAiJTVzIiwgY21kKTsKKwlpZiAoIW51bV9hcmdzKQorCQlyZXR1cm4gY291bnQ7CisKKwlpZiAoIXN0cm5pY21wKGNtZCwgIm9uIiwgMikgfHwgIXN0cmNtcChjbWQsICIxIikpCisJCWVycm9yID0gczM5MF92YXJ5X2NocGlkKGNwLT5jaHBpZCwgMSk7CisJZWxzZSBpZiAoIXN0cm5pY21wKGNtZCwgIm9mZiIsIDMpIHx8ICFzdHJjbXAoY21kLCAiMCIpKQorCQllcnJvciA9IHMzOTBfdmFyeV9jaHBpZChjcC0+Y2hwaWQsIDApOworCWVsc2UKKwkJZXJyb3IgPSAtRUlOVkFMOworCisJcmV0dXJuIGVycm9yIDwgMCA/IGVycm9yIDogY291bnQ7CisKK30KKworc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgMDY0NCwgY2hwX3N0YXR1c19zaG93LCBjaHBfc3RhdHVzX3dyaXRlKTsKKworc3RhdGljIHNzaXplX3QgY2hwX2NvbmZpZ3VyZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY3A7CisJaW50IHN0YXR1czsKKworCWNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKKwlzdGF0dXMgPSBjaHBfaW5mb19nZXRfc3RhdHVzKGNwLT5jaHBpZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc3RhdHVzKTsKK30KKworc3RhdGljIGludCBjZmdfd2FpdF9pZGxlKHZvaWQpOworCitzdGF0aWMgc3NpemVfdCBjaHBfY29uZmlndXJlX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjcDsKKwlpbnQgdmFsOworCWNoYXIgZGVsaW07CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkICVjIiwgJnZhbCwgJmRlbGltKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCWNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKKwljaHBfY2ZnX3NjaGVkdWxlKGNwLT5jaHBpZCwgdmFsKTsKKwljZmdfd2FpdF9pZGxlKCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjb25maWd1cmUsIDA2NDQsIGNocF9jb25maWd1cmVfc2hvdywgY2hwX2NvbmZpZ3VyZV93cml0ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNocF90eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldik7CisKKwlpZiAoIWNocCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGNocC0+ZGVzYy5kZXNjKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHR5cGUsIDA0NDQsIGNocF90eXBlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBjaHBfY21nX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gdG9fY2hhbm5lbHBhdGgoZGV2KTsKKworCWlmICghY2hwKQorCQlyZXR1cm4gMDsKKwlpZiAoY2hwLT5jbWcgPT0gLTEpIC8qIGNoYW5uZWwgbWVhc3VyZW1lbnRzIG5vdCBhdmFpbGFibGUgKi8KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGNocC0+Y21nKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNtZywgMDQ0NCwgY2hwX2NtZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgY2hwX3NoYXJlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocCA9IHRvX2NoYW5uZWxwYXRoKGRldik7CisKKwlpZiAoIWNocCkKKwkJcmV0dXJuIDA7CisJaWYgKGNocC0+c2hhcmVkID09IC0xKSAvKiBjaGFubmVsIG1lYXN1cmVtZW50cyBub3QgYXZhaWxhYmxlICovCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd25cbiIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBjaHAtPnNoYXJlZCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzaGFyZWQsIDA0NDQsIGNocF9zaGFyZWRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogY2hwX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3N0YXR1cy5hdHRyLAorCSZkZXZfYXR0cl9jb25maWd1cmUuYXR0ciwKKwkmZGV2X2F0dHJfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9jbWcuYXR0ciwKKwkmZGV2X2F0dHJfc2hhcmVkLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNocF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGNocF9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGNocF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjcDsKKworCWNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKKwlrZnJlZShjcCk7Cit9CisKKy8qKgorICogY2hwX25ldyAtIHJlZ2lzdGVyIGEgbmV3IGNoYW5uZWwtcGF0aAorICogQGNocGlkIC0gY2hhbm5lbC1wYXRoIElECisgKgorICogQ3JlYXRlIGFuZCByZWdpc3RlciBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgbmV3IGNoYW5uZWwtcGF0aC4gUmV0dXJuCisgKiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IGNocF9uZXcoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7CisJaW50IHJldDsKKworCWlmIChjaHBfaXNfcmVnaXN0ZXJlZChjaHBpZCkpCisJCXJldHVybiAwOworCWNocCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3BhdGgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNocCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBmaWxsIGluIHN0YXR1cywgZXRjLiAqLworCWNocC0+Y2hwaWQgPSBjaHBpZDsKKwljaHAtPnN0YXRlID0gMTsKKwljaHAtPmRldi5wYXJlbnQgPSAmY3NzW2NocGlkLmNzc2lkXS0+ZGV2aWNlOworCWNocC0+ZGV2LnJlbGVhc2UgPSBjaHBfcmVsZWFzZTsKKwlzbnByaW50ZihjaHAtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY2hwJXguJTAyeCIsIGNocGlkLmNzc2lkLAorCQkgY2hwaWQuaWQpOworCisJLyogT2J0YWluIGNoYW5uZWwgcGF0aCBkZXNjcmlwdGlvbiBhbmQgZmlsbCBpdCBpbi4gKi8KKwlyZXQgPSBjaHNjX2RldGVybWluZV9jaGFubmVsX3BhdGhfZGVzY3JpcHRpb24oY2hwaWQsICZjaHAtPmRlc2MpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKChjaHAtPmRlc2MuZmxhZ3MgJiAweDgwKSA9PSAwKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCS8qIEdldCBjaGFubmVsLW1lYXN1cmVtZW50IGNoYXJhY3RlcmlzdGljcy4gKi8KKwlpZiAoY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbCAmJiBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2NtYworCSAgICAmJiBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2VjbSkgeworCQlyZXQgPSBjaHNjX2dldF9jaGFubmVsX21lYXN1cmVtZW50X2NoYXJzKGNocCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9mcmVlOworCX0gZWxzZSB7CisJCXN0YXRpYyBpbnQgbXNnX2RvbmU7CisKKwkJaWYgKCFtc2dfZG9uZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBDaGFubmVsIG1lYXN1cmVtZW50cyBub3QgIgorCQkJICAgICAgICJhdmFpbGFibGUsIGNvbnRpbnVpbmcuXG4iKTsKKwkJCW1zZ19kb25lID0gMTsKKwkJfQorCQljaHAtPmNtZyA9IC0xOworCX0KKworCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLworCXJldCA9IGRldmljZV9yZWdpc3RlcigmY2hwLT5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCByZWdpc3RlciAleC4lMDJ4XG4iLAorCQkgICAgICAgX19mdW5jX18sIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2hwLT5kZXYua29iaiwgJmNocF9hdHRyX2dyb3VwKTsKKwlpZiAocmV0KSB7CisJCWRldmljZV91bnJlZ2lzdGVyKCZjaHAtPmRldik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCW11dGV4X2xvY2soJmNzc1tjaHBpZC5jc3NpZF0tPm11dGV4KTsKKwlpZiAoY3NzW2NocGlkLmNzc2lkXS0+Y21fZW5hYmxlZCkgeworCQlyZXQgPSBjaHBfYWRkX2NtZ19hdHRyKGNocCk7CisJCWlmIChyZXQpIHsKKwkJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2hwLT5kZXYua29iaiwgJmNocF9hdHRyX2dyb3VwKTsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZjaHAtPmRldik7CisJCQltdXRleF91bmxvY2soJmNzc1tjaHBpZC5jc3NpZF0tPm11dGV4KTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisJY3NzW2NocGlkLmNzc2lkXS0+Y2hwc1tjaHBpZC5pZF0gPSBjaHA7CisJbXV0ZXhfdW5sb2NrKCZjc3NbY2hwaWQuY3NzaWRdLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK291dF9mcmVlOgorCWtmcmVlKGNocCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjaHBfZ2V0X2NocF9kZXNjIC0gcmV0dXJuIG5ld2x5IGFsbG9jYXRlZCBjaGFubmVsLXBhdGggZGVzY3JpcHRpb24KKyAqIEBjaHBpZDogY2hhbm5lbC1wYXRoIElECisgKgorICogT24gc3VjY2VzcyByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgY29weSBvZiB0aGUgY2hhbm5lbC1wYXRoIGRlc2NyaXB0aW9uCisgKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY2hhbm5lbC1wYXRoIElELiBSZXR1cm4gJU5VTEwgb24gZXJyb3IuCisgKi8KK3ZvaWQgKmNocF9nZXRfY2hwX2Rlc2Moc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7CisJc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjICpkZXNjOworCisJY2hwID0gY2hwaWRfdG9fY2hwKGNocGlkKTsKKwlpZiAoIWNocCkKKwkJcmV0dXJuIE5VTEw7CisJZGVzYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghZGVzYykKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KGRlc2MsICZjaHAtPmRlc2MsIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MpKTsKKwlyZXR1cm4gZGVzYzsKK30KKworLyoqCisgKiBjaHBfcHJvY2Vzc19jcncgLSBwcm9jZXNzIGNoYW5uZWwtcGF0aCBzdGF0dXMgY2hhbmdlCisgKiBAaWQ6IGNoYW5uZWwtcGF0aCBJRCBudW1iZXIKKyAqIEBzdGF0dXM6IG5vbi16ZXJvIGlmIGNoYW5uZWwtcGF0aCBoYXMgYmVjb21lIGF2YWlsYWJsZSwgemVybyBvdGhlcndpc2UKKyAqCisgKiBIYW5kbGUgY2hhbm5lbC1yZXBvcnQtd29yZHMgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgb2YgYSBjaGFubmVsLXBhdGgKKyAqIGhhcyBjaGFuZ2VkLgorICovCit2b2lkIGNocF9wcm9jZXNzX2NydyhpbnQgaWQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKworCWNocF9pZF9pbml0KCZjaHBpZCk7CisJY2hwaWQuaWQgPSBpZDsKKwlpZiAoc3RhdHVzKSB7CisJCWlmICghY2hwX2lzX3JlZ2lzdGVyZWQoY2hwaWQpKQorCQkJY2hwX25ldyhjaHBpZCk7CisJCWNoc2NfY2hwX29ubGluZShjaHBpZCk7CisJfSBlbHNlCisJCWNoc2NfY2hwX29mZmxpbmUoY2hwaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbmZvX2JpdF9udW0oc3RydWN0IGNocF9pZCBpZCkKK3sKKwlyZXR1cm4gaWQuaWQgKyBpZC5jc3NpZCAqIChfX01BWF9DSFBJRCArIDEpOworfQorCisvKiBGb3JjZSBjaHBfaW5mbyByZWZyZXNoIG9uIG5leHQgY2FsbCB0byBpbmZvX3ZhbGlkYXRlKCkuICovCitzdGF0aWMgdm9pZCBpbmZvX2V4cGlyZSh2b2lkKQoreworCW11dGV4X2xvY2soJmluZm9fbG9jayk7CisJY2hwX2luZm9fZXhwaXJlcyA9IGppZmZpZXMgLSAxOworCW11dGV4X3VubG9jaygmaW5mb19sb2NrKTsKK30KKworLyogRW5zdXJlIHRoYXQgY2hwX2luZm8gaXMgdXAtdG8tZGF0ZS4gKi8KK3N0YXRpYyBpbnQgaW5mb191cGRhdGUodm9pZCkKK3sKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZpbmZvX2xvY2spOworCXJjID0gMDsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBjaHBfaW5mb19leHBpcmVzKSkgeworCQkvKiBEYXRhIGlzIHRvbyBvbGQsIHVwZGF0ZS4gKi8KKwkJcmMgPSBzY2xwX2NocF9yZWFkX2luZm8oJmNocF9pbmZvKTsKKwkJY2hwX2luZm9fZXhwaXJlcyA9IGppZmZpZXMgKyBDSFBfSU5GT19VUERBVEVfSU5URVJWQUwgOworCX0KKwltdXRleF91bmxvY2soJmluZm9fbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogY2hwX2luZm9fZ2V0X3N0YXR1cyAtIHJldHJpZXZlIGNvbmZpZ3VyZSBzdGF0dXMgb2YgYSBjaGFubmVsLXBhdGgKKyAqIEBjaHBpZDogY2hhbm5lbC1wYXRoIElECisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIDAgZm9yIHN0YW5kYnksIDEgZm9yIGNvbmZpZ3VyZWQsIDIgZm9yIHJlc2VydmVkLAorICogMyBmb3Igbm90IHJlY29nbml6ZWQuIFJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICovCitpbnQgY2hwX2luZm9fZ2V0X3N0YXR1cyhzdHJ1Y3QgY2hwX2lkIGNocGlkKQoreworCWludCByYzsKKwlpbnQgYml0OworCisJcmMgPSBpbmZvX3VwZGF0ZSgpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJYml0ID0gaW5mb19iaXRfbnVtKGNocGlkKTsKKwltdXRleF9sb2NrKCZpbmZvX2xvY2spOworCWlmICghY2hwX3Rlc3RfYml0KGNocF9pbmZvLnJlY29nbml6ZWQsIGJpdCkpCisJCXJjID0gQ0hQX1NUQVRVU19OT1RfUkVDT0dOSVpFRDsKKwllbHNlIGlmIChjaHBfdGVzdF9iaXQoY2hwX2luZm8uY29uZmlndXJlZCwgYml0KSkKKwkJcmMgPSBDSFBfU1RBVFVTX0NPTkZJR1VSRUQ7CisJZWxzZSBpZiAoY2hwX3Rlc3RfYml0KGNocF9pbmZvLnN0YW5kYnksIGJpdCkpCisJCXJjID0gQ0hQX1NUQVRVU19TVEFOREJZOworCWVsc2UKKwkJcmMgPSBDSFBfU1RBVFVTX1JFU0VSVkVEOworCW11dGV4X3VubG9jaygmaW5mb19sb2NrKTsKKworCXJldHVybiByYzsKK30KKworLyogUmV0dXJuIGNvbmZpZ3VyZSB0YXNrIGZvciBjaHBpZC4gKi8KK3N0YXRpYyBlbnVtIGNmZ190YXNrX3QgY2ZnX2dldF90YXNrKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIGNocF9jZmdfdGFza1tjaHBpZC5jc3NpZF1bY2hwaWQuaWRdOworfQorCisvKiBTZXQgY29uZmlndXJlIHRhc2sgZm9yIGNocGlkLiAqLworc3RhdGljIHZvaWQgY2ZnX3NldF90YXNrKHN0cnVjdCBjaHBfaWQgY2hwaWQsIGVudW0gY2ZnX3Rhc2tfdCBjZmcpCit7CisJY2hwX2NmZ190YXNrW2NocGlkLmNzc2lkXVtjaHBpZC5pZF0gPSBjZmc7Cit9CisKKy8qIFBlcmZvcm0gb25lIGNvbmZpZ3VyZS9kZWNvbmZpZ3VyZSByZXF1ZXN0LiBSZXNjaGVkdWxlIHdvcmsgZnVuY3Rpb24gdW50aWwKKyAqIGxhc3QgcmVxdWVzdC4gKi8KK3N0YXRpYyB2b2lkIGNmZ19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOworCWVudW0gY2ZnX3Rhc2tfdCB0OworCisJbXV0ZXhfbG9jaygmY2ZnX2xvY2spOworCXQgPSBjZmdfbm9uZTsKKwljaHBfaWRfZm9yX2VhY2goJmNocGlkKSB7CisJCXQgPSBjZmdfZ2V0X3Rhc2soY2hwaWQpOworCQlpZiAodCAhPSBjZmdfbm9uZSkgeworCQkJY2ZnX3NldF90YXNrKGNocGlkLCBjZmdfbm9uZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNmZ19sb2NrKTsKKworCXN3aXRjaCAodCkgeworCWNhc2UgY2ZnX2NvbmZpZ3VyZToKKwkJc2NscF9jaHBfY29uZmlndXJlKGNocGlkKTsKKwkJaW5mb19leHBpcmUoKTsKKwkJY2hzY19jaHBfb25saW5lKGNocGlkKTsKKwkJYnJlYWs7CisJY2FzZSBjZmdfZGVjb25maWd1cmU6CisJCXNjbHBfY2hwX2RlY29uZmlndXJlKGNocGlkKTsKKwkJaW5mb19leHBpcmUoKTsKKwkJY2hzY19jaHBfb2ZmbGluZShjaHBpZCk7CisJCWJyZWFrOworCWNhc2UgY2ZnX25vbmU6CisJCS8qIEdldCB1cGRhdGVkIGluZm9ybWF0aW9uIGFmdGVyIGxhc3QgY2hhbmdlLiAqLworCQlpbmZvX3VwZGF0ZSgpOworCQltdXRleF9sb2NrKCZjZmdfbG9jayk7CisJCWNmZ19idXN5ID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZjZmdfbG9jayk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2ZnX3dhaXRfcXVldWUpOworCQlyZXR1cm47CisJfQorCXF1ZXVlX3dvcmsoY2hwX3dxLCAmY2ZnX3dvcmspOworfQorCisvKioKKyAqIGNocF9jZmdfc2NoZWR1bGUgLSBzY2hlZHVsZSBjaHBpZCBjb25maWd1cmF0aW9uIHJlcXVlc3QKKyAqIEBjaHBpZCAtIGNoYW5uZWwtcGF0aCBJRAorICogQGNvbmZpZ3VyZSAtIE5vbi16ZXJvIGZvciBjb25maWd1cmUsIHplcm8gZm9yIGRlY29uZmlndXJlCisgKgorICogU2NoZWR1bGUgYSBjaGFubmVsLXBhdGggY29uZmlndXJhdGlvbi9kZWNvbmZpZ3VyYXRpb24gcmVxdWVzdC4KKyAqLwordm9pZCBjaHBfY2ZnX3NjaGVkdWxlKHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBjb25maWd1cmUpCit7CisJQ0lPX01TR19FVkVOVCgyLCAiY2hwX2NmZ19zY2hlZCV4LiUwMng9JWRcbiIsIGNocGlkLmNzc2lkLCBjaHBpZC5pZCwKKwkJICAgICAgY29uZmlndXJlKTsKKwltdXRleF9sb2NrKCZjZmdfbG9jayk7CisJY2ZnX3NldF90YXNrKGNocGlkLCBjb25maWd1cmUgPyBjZmdfY29uZmlndXJlIDogY2ZnX2RlY29uZmlndXJlKTsKKwljZmdfYnVzeSA9IDE7CisJbXV0ZXhfdW5sb2NrKCZjZmdfbG9jayk7CisJcXVldWVfd29yayhjaHBfd3EsICZjZmdfd29yayk7Cit9CisKKy8qKgorICogY2hwX2NmZ19jYW5jZWxfZGVjb25maWd1cmUgLSBjYW5jZWwgY2hwaWQgZGVjb25maWd1cmF0aW9uIHJlcXVlc3QKKyAqIEBjaHBpZCAtIGNoYW5uZWwtcGF0aCBJRAorICoKKyAqIENhbmNlbCBhbiBhY3RpdmUgY2hhbm5lbC1wYXRoIGRlY29uZmlndXJhdGlvbiByZXF1ZXN0IGlmIGl0IGhhcyBub3QgeWV0CisgKiBiZWVuIHBlcmZvcm1lZC4KKyAqLwordm9pZCBjaHBfY2ZnX2NhbmNlbF9kZWNvbmZpZ3VyZShzdHJ1Y3QgY2hwX2lkIGNocGlkKQoreworCUNJT19NU0dfRVZFTlQoMiwgImNocF9jZmdfY2FuY2VsOiV4LiUwMnhcbiIsIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CisJbXV0ZXhfbG9jaygmY2ZnX2xvY2spOworCWlmIChjZmdfZ2V0X3Rhc2soY2hwaWQpID09IGNmZ19kZWNvbmZpZ3VyZSkKKwkJY2ZnX3NldF90YXNrKGNocGlkLCBjZmdfbm9uZSk7CisJbXV0ZXhfdW5sb2NrKCZjZmdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX3dhaXRfaWRsZSh2b2lkKQoreworCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2ZnX3dhaXRfcXVldWUsICFjZmdfYnVzeSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNocF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKworCWNocF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjaW9fY2hwIik7CisJaWYgKCFjaHBfd3EpCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfV09SSygmY2ZnX3dvcmssIGNmZ19mdW5jKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjZmdfd2FpdF9xdWV1ZSk7CisJaWYgKGluZm9fdXBkYXRlKCkpCisJCXJldHVybiAwOworCS8qIFJlZ2lzdGVyIGF2YWlsYWJsZSBjaGFubmVsLXBhdGhzLiAqLworCWNocF9pZF9mb3JfZWFjaCgmY2hwaWQpIHsKKwkJaWYgKGNocF9pbmZvX2dldF9zdGF0dXMoY2hwaWQpICE9IENIUF9TVEFUVVNfTk9UX1JFQ09HTklaRUQpCisJCQljaHBfbmV3KGNocGlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGNocF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hwLmggYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Mjg2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9jaHAuaAorICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICogICAgQXV0aG9yKHMpOiBQZXRlciBPYmVycGFybGVpdGVyIDxwZXRlci5vYmVycGFybGVpdGVyQGRlLmlibS5jb20+CisgKi8KKworI2lmbmRlZiBTMzkwX0NIUF9ICisjZGVmaW5lIFMzOTBfQ0hQX0ggUzM5MF9DSFBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KKyNpbmNsdWRlICJjaHNjLmgiCisKKyNkZWZpbmUgQ0hQX1NUQVRVU19TVEFOREJZCQkwCisjZGVmaW5lIENIUF9TVEFUVVNfQ09ORklHVVJFRAkJMQorI2RlZmluZSBDSFBfU1RBVFVTX1JFU0VSVkVECQkyCisjZGVmaW5lIENIUF9TVEFUVVNfTk9UX1JFQ09HTklaRUQJMworCitzdGF0aWMgaW5saW5lIGludCBjaHBfdGVzdF9iaXQodTggKmJpdG1hcCwgaW50IG51bSkKK3sKKwlpbnQgYnl0ZSA9IG51bSA+PiAzOworCWludCBtYXNrID0gMTI4ID4+IChudW0gJiA3KTsKKworCXJldHVybiAoYml0bWFwW2J5dGVdICYgbWFzaykgPyAxIDogMDsKK30KKworCitzdHJ1Y3QgY2hhbm5lbF9wYXRoIHsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOworCWludCBzdGF0ZTsKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MgZGVzYzsKKwkvKiBDaGFubmVsLW1lYXN1cmVtZW50IHJlbGF0ZWQgc3R1ZmY6ICovCisJaW50IGNtZzsKKwlpbnQgc2hhcmVkOworCXZvaWQgKmNtZ19jaGFyczsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKK307CisKK2ludCBjaHBfZ2V0X3N0YXR1cyhzdHJ1Y3QgY2hwX2lkIGNocGlkKTsKK3U4IGNocF9nZXRfc2NoX29wbShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKK2ludCBjaHBfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgY2hwX2lkIGNocGlkKTsKK3ZvaWQgKmNocF9nZXRfY2hwX2Rlc2Moc3RydWN0IGNocF9pZCBjaHBpZCk7Cit2b2lkIGNocF9wcm9jZXNzX2NydyhpbnQgaWQsIGludCBhdmFpbGFibGUpOwordm9pZCBjaHBfcmVtb3ZlX2NtZ19hdHRyKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCk7CitpbnQgY2hwX2FkZF9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApOworaW50IGNocF9uZXcoc3RydWN0IGNocF9pZCBjaHBpZCk7Cit2b2lkIGNocF9jZmdfc2NoZWR1bGUoc3RydWN0IGNocF9pZCBjaHBpZCwgaW50IGNvbmZpZ3VyZSk7Cit2b2lkIGNocF9jZmdfY2FuY2VsX2RlY29uZmlndXJlKHN0cnVjdCBjaHBfaWQgY2hwaWQpOworaW50IGNocF9pbmZvX2dldF9zdGF0dXMoc3RydWN0IGNocF9pZCBjaHBpZCk7CisKKyNlbmRpZiAvKiBTMzkwX0NIUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCmluZGV4IDZmMDVhNDQuLmVhOTJhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCkBAIC0xNSwyMDIgKzE1LDEyNCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Npby5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgogCiAjaW5jbHVkZSAiY3NzLmgiCiAjaW5jbHVkZSAiY2lvLmgiCiAjaW5jbHVkZSAiY2lvX2RlYnVnLmgiCiAjaW5jbHVkZSAiaW9hc20uaCIKKyNpbmNsdWRlICJjaHAuaCIKICNpbmNsdWRlICJjaHNjLmgiCiAKIHN0YXRpYyB2b2lkICpzZWlfcGFnZTsKIAotc3RhdGljIGludCBuZXdfY2hhbm5lbF9wYXRoKGludCBjaHBpZCk7CitzdHJ1Y3QgY2hzY19zc2RfYXJlYSB7CisJc3RydWN0IGNoc2NfaGVhZGVyIHJlcXVlc3Q7CisJdTE2IDoxMDsKKwl1MTYgc3NpZDoyOworCXUxNiA6NDsKKwl1MTYgZl9zY2g7CSAgLyogZmlyc3Qgc3ViY2hhbm5lbCAqLworCXUxNiA6MTY7CisJdTE2IGxfc2NoOwkgIC8qIGxhc3Qgc3ViY2hhbm5lbCAqLworCXUzMiA6MzI7CisJc3RydWN0IGNoc2NfaGVhZGVyIHJlc3BvbnNlOworCXUzMiA6MzI7CisJdTggc2NoX3ZhbGlkIDogMTsKKwl1OCBkZXZfdmFsaWQgOiAxOworCXU4IHN0CSAgICAgOiAzOyAvKiBzdWJjaGFubmVsIHR5cGUgKi8KKwl1OCB6ZXJvZXMgICAgOiAzOworCXU4ICB1bml0X2FkZHI7CSAgLyogdW5pdCBhZGRyZXNzICovCisJdTE2IGRldm5vOwkgIC8qIGRldmljZSBudW1iZXIgKi8KKwl1OCBwYXRoX21hc2s7CisJdTggZmxhX3ZhbGlkX21hc2s7CisJdTE2IHNjaDsJICAvKiBzdWJjaGFubmVsICovCisJdTggY2hwaWRbOF07CSAgLyogY2hwaWRzIDAtNyAqLworCXUxNiBmbGFbOF07CSAgLyogZnVsbCBsaW5rIGFkZHJlc3NlcyAwLTcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9jaHBfbG9naWNhbGx5X29ubGluZShpbnQgY2hwLCBpbnQgb25vZmYpCitpbnQgY2hzY19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QpCiB7Ci0JY3NzWzBdLT5jaHBzW2NocF0tPnN0YXRlID0gb25vZmY7Ci19CisJdW5zaWduZWQgbG9uZyBwYWdlOworCXN0cnVjdCBjaHNjX3NzZF9hcmVhICpzc2RfYXJlYTsKKwlpbnQgY2NvZGU7CisJaW50IHJldDsKKwlpbnQgaTsKKwlpbnQgbWFzazsKIAotc3RhdGljIGludAotZ2V0X2NocF9zdGF0dXMoaW50IGNocCkKLXsKLQlyZXR1cm4gKGNzc1swXS0+Y2hwc1tjaHBdID8gY3NzWzBdLT5jaHBzW2NocF0tPnN0YXRlIDogLUVOT0RFVik7Ci19Ci0KLXZvaWQKLWNoc2NfdmFsaWRhdGVfY2hwaWRzKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCi17Ci0JaW50IG1hc2ssIGNocDsKLQotCWZvciAoY2hwID0gMDsgY2hwIDw9IDc7IGNocCsrKSB7Ci0JCW1hc2sgPSAweDgwID4+IGNocDsKLQkJaWYgKCFnZXRfY2hwX3N0YXR1cyhzY2gtPnNjaGliLnBtY3cuY2hwaWRbY2hwXSkpCi0JCQkvKiBkaXNhYmxlIHVzaW5nIHRoaXMgcGF0aCAqLwotCQkJc2NoLT5vcG0gJj0gfm1hc2s7Ci0JfQotfQotCi12b2lkCi1jaHBpZF9pc19hY3R1YWxseV9vbmxpbmUoaW50IGNocCkKLXsKLQlpbnQgc3RhdGU7Ci0KLQlzdGF0ZSA9IGdldF9jaHBfc3RhdHVzKGNocCk7Ci0JaWYgKHN0YXRlIDwgMCkgewotCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmc2xvd19wYXRoX3dvcmspOwotCX0gZWxzZQotCQlXQVJOX09OKCFzdGF0ZSk7Ci19Ci0KLS8qIEZJWE1FOiB0aGlzIGlzIF9hbHdheXNfIGNhbGxlZCBmb3IgZXZlcnkgc3ViY2hhbm5lbC4gc2hvdWxkbid0IHdlCi0gKgkgIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBhdCBhIHRpbWU/ICovCi1zdGF0aWMgaW50Ci1jaHNjX2dldF9zY2hfZGVzY19pcnEoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwgdm9pZCAqcGFnZSkKLXsKLQlpbnQgY2NvZGUsIGo7Ci0KLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgY2hzY19oZWFkZXIgcmVxdWVzdDsKLQkJdTE2IHJlc2VydmVkMWE6MTA7Ci0JCXUxNiBzc2lkOjI7Ci0JCXUxNiByZXNlcnZlZDFiOjQ7Ci0JCXUxNiBmX3NjaDsJICAvKiBmaXJzdCBzdWJjaGFubmVsICovCi0JCXUxNiByZXNlcnZlZDI7Ci0JCXUxNiBsX3NjaDsJICAvKiBsYXN0IHN1YmNoYW5uZWwgKi8KLQkJdTMyIHJlc2VydmVkMzsKLQkJc3RydWN0IGNoc2NfaGVhZGVyIHJlc3BvbnNlOwotCQl1MzIgcmVzZXJ2ZWQ0OwotCQl1OCBzY2hfdmFsaWQgOiAxOwotCQl1OCBkZXZfdmFsaWQgOiAxOwotCQl1OCBzdAkgICAgIDogMzsgLyogc3ViY2hhbm5lbCB0eXBlICovCi0JCXU4IHplcm9lcyAgICA6IDM7Ci0JCXU4ICB1bml0X2FkZHI7CSAgLyogdW5pdCBhZGRyZXNzICovCi0JCXUxNiBkZXZubzsJICAvKiBkZXZpY2UgbnVtYmVyICovCi0JCXU4IHBhdGhfbWFzazsKLQkJdTggZmxhX3ZhbGlkX21hc2s7Ci0JCXUxNiBzY2g7CSAgLyogc3ViY2hhbm5lbCAqLwotCQl1OCBjaHBpZFs4XTsJICAvKiBjaHBpZHMgMC03ICovCi0JCXUxNiBmbGFbOF07CSAgLyogZnVsbCBsaW5rIGFkZHJlc3NlcyAwLTcgKi8KLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqc3NkX2FyZWE7Ci0KLQlzc2RfYXJlYSA9IHBhZ2U7Ci0KKwlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCXNzZF9hcmVhID0gKHN0cnVjdCBjaHNjX3NzZF9hcmVhICopIHBhZ2U7CiAJc3NkX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwogCXNzZF9hcmVhLT5yZXF1ZXN0LmNvZGUgPSAweDAwMDQ7Ci0KLQlzc2RfYXJlYS0+c3NpZCA9IHNjaC0+c2NoaWQuc3NpZDsKLQlzc2RfYXJlYS0+Zl9zY2ggPSBzY2gtPnNjaGlkLnNjaF9ubzsKLQlzc2RfYXJlYS0+bF9zY2ggPSBzY2gtPnNjaGlkLnNjaF9ubzsKKwlzc2RfYXJlYS0+c3NpZCA9IHNjaGlkLnNzaWQ7CisJc3NkX2FyZWEtPmZfc2NoID0gc2NoaWQuc2NoX25vOworCXNzZF9hcmVhLT5sX3NjaCA9IHNjaGlkLnNjaF9ubzsKIAogCWNjb2RlID0gY2hzYyhzc2RfYXJlYSk7CisJLyogQ2hlY2sgcmVzcG9uc2UuICovCiAJaWYgKGNjb2RlID4gMCkgewotCQlwcl9kZWJ1ZygiY2hzYyByZXR1cm5lZCB3aXRoIGNjb2RlID0gJWRcbiIsIGNjb2RlKTsKLQkJcmV0dXJuIChjY29kZSA9PSAzKSA/IC1FTk9ERVYgOiAtRUJVU1k7CisJCXJldCA9IChjY29kZSA9PSAzKSA/IC1FTk9ERVYgOiAtRUJVU1k7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCi0Jc3dpdGNoIChzc2RfYXJlYS0+cmVzcG9uc2UuY29kZSkgewotCWNhc2UgMHgwMDAxOiAvKiBldmVyeXRoaW5nIG9rICovCi0JCWJyZWFrOwotCWNhc2UgMHgwMDAyOgotCQlDSU9fQ1JXX0VWRU5UKDIsICJJbnZhbGlkIGNvbW1hbmQhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSAweDAwMDM6Ci0JCUNJT19DUldfRVZFTlQoMiwgIkVycm9yIGluIGNoc2MgcmVxdWVzdCBibG9jayFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIDB4MDAwNDoKLQkJQ0lPX0NSV19FVkVOVCgyLCAiTW9kZWwgZG9lcyBub3QgcHJvdmlkZSBzc2RcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JZGVmYXVsdDoKLQkJQ0lPX0NSV19FVkVOVCgyLCAiVW5rbm93biBDSFNDIHJlc3BvbnNlICVkXG4iLAorCWlmIChzc2RfYXJlYS0+cmVzcG9uc2UuY29kZSAhPSAweDAwMDEpIHsKKwkJQ0lPX01TR19FVkVOVCgyLCAiY2hzYzogc3NkIGZhaWxlZCBmb3IgMC4leC4lMDR4IChyYz0lMDR4KVxuIiwKKwkJCSAgICAgIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubywKIAkJCSAgICAgIHNzZF9hcmVhLT5yZXNwb25zZS5jb2RlKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCi0JLyoKLQkgKiBzc2RfYXJlYS0+c3Qgc3RvcmVzIHRoZSB0eXBlIG9mIHRoZSBkZXRlY3RlZAotCSAqIHN1YmNoYW5uZWwsIHdpdGggdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLQkgKgotCSAqIDA6IEkvTyBzdWJjaGFubmVsOgkgIEFsbCBmaWVsZHMgaGF2ZSBtZWFuaW5nCi0JICogMTogQ0hTQyBzdWJjaGFubmVsOgkgIE9ubHkgc2NoX3ZhbCwgc3QgYW5kIHNjaAotCSAqCQkJICBoYXZlIG1lYW5pbmcKLQkgKiAyOiBNZXNzYWdlIHN1YmNoYW5uZWw6IEFsbCBmaWVsZHMgZXhjZXB0IHVuaXRfYWRkcgotCSAqCQkJICBoYXZlIG1lYW5pbmcKLQkgKiAzOiBBRE0gc3ViY2hhbm5lbDoJICBPbmx5IHNjaF92YWwsIHN0IGFuZCBzY2gKLQkgKgkJCSAgaGF2ZSBtZWFuaW5nCi0JICoKLQkgKiBPdGhlciB0eXBlcyBhcmUgY3VycmVudGx5IHVuZGVmaW5lZC4KLQkgKi8KLQlpZiAoc3NkX2FyZWEtPnN0ID4gMykgeyAvKiB1aG0sIHRoYXQgbG9va3Mgc3RyYW5nZS4uLiAqLwotCQlDSU9fQ1JXX0VWRU5UKDAsICJTdHJhbmdlIHN1YmNoYW5uZWwgdHlwZSAlZCIKLQkJCSAgICAgICIgZm9yIHNjaCAwLiV4LiUwNHhcbiIsIHNzZF9hcmVhLT5zdCwKLQkJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8pOwotCQkvKgotCQkgKiBUaGVyZSBtYXkgaGF2ZSBiZWVuIGEgbmV3IHN1YmNoYW5uZWwgdHlwZSBkZWZpbmVkIGluIHRoZQotCQkgKiB0aW1lIHNpbmNlIHRoaXMgY29kZSB3YXMgd3JpdHRlbjsgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaAotCQkgKiBmaWVsZHMgaGF2ZSBtZWFuaW5nIGFuZCB3aGF0IHRvIGRvIHdpdGggaXQgd2UganVzdCBqdW1wIG91dAotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJY29uc3QgY2hhciAqdHlwZVs0XSA9IHsiSS9PIiwgImNoc2MiLCAibWVzc2FnZSIsICJBRE0ifTsKLQkJQ0lPX0NSV19FVkVOVCg2LCAic3NkOiBzY2ggMC4leC4lMDR4IGlzICVzIHN1YmNoYW5uZWxcbiIsCi0JCQkgICAgICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vLAotCQkJICAgICAgdHlwZVtzc2RfYXJlYS0+c3RdKTsKLQotCQlzY2gtPnNzZF9pbmZvLnZhbGlkID0gMTsKLQkJc2NoLT5zc2RfaW5mby50eXBlID0gc3NkX2FyZWEtPnN0OworCWlmICghc3NkX2FyZWEtPnNjaF92YWxpZCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOwogCX0KLQotCWlmIChzc2RfYXJlYS0+c3QgPT0gMCB8fCBzc2RfYXJlYS0+c3QgPT0gMikgewotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Ci0JCQlpZiAoISgoMHg4MCA+PiBqKSAmIHNzZF9hcmVhLT5wYXRoX21hc2sgJgotCQkJICAgICAgc3NkX2FyZWEtPmZsYV92YWxpZF9tYXNrKSkKLQkJCQljb250aW51ZTsKLQkJCXNjaC0+c3NkX2luZm8uY2hwaWRbal0gPSBzc2RfYXJlYS0+Y2hwaWRbal07Ci0JCQlzY2gtPnNzZF9pbmZvLmZsYVtqXSAgID0gc3NkX2FyZWEtPmZsYVtqXTsKKwkvKiBDb3B5IGRhdGEgKi8KKwlyZXQgPSAwOworCW1lbXNldChzc2QsIDAsIHNpemVvZihzdHJ1Y3QgY2hzY19zc2RfaW5mbykpOworCWlmICgoc3NkX2FyZWEtPnN0ICE9IDApICYmIChzc2RfYXJlYS0+c3QgIT0gMikpCisJCWdvdG8gb3V0X2ZyZWU7CisJc3NkLT5wYXRoX21hc2sgPSBzc2RfYXJlYS0+cGF0aF9tYXNrOworCXNzZC0+ZmxhX3ZhbGlkX21hc2sgPSBzc2RfYXJlYS0+ZmxhX3ZhbGlkX21hc2s7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltYXNrID0gMHg4MCA+PiBpOworCQlpZiAoc3NkX2FyZWEtPnBhdGhfbWFzayAmIG1hc2spIHsKKwkJCWNocF9pZF9pbml0KCZzc2QtPmNocGlkW2ldKTsKKwkJCXNzZC0+Y2hwaWRbaV0uaWQgPSBzc2RfYXJlYS0+Y2hwaWRbaV07CiAJCX0KKwkJaWYgKHNzZF9hcmVhLT5mbGFfdmFsaWRfbWFzayAmIG1hc2spCisJCQlzc2QtPmZsYVtpXSA9IHNzZF9hcmVhLT5mbGFbaV07CiAJfQorb3V0X2ZyZWU6CisJZnJlZV9wYWdlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZm9yX2lvX29uX3BhdGgoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwgaW50IG1hc2spCit7CisJaW50IGNjOworCisJY2MgPSBzdHNjaChzY2gtPnNjaGlkLCAmc2NoLT5zY2hpYik7CisJaWYgKGNjKQorCQlyZXR1cm4gMDsKKwlpZiAoc2NoLT5zY2hpYi5zY3N3LmFjdGwgJiYgc2NoLT5zY2hpYi5wbWN3LmxwdW0gPT0gbWFzaykKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotY3NzX2dldF9zc2RfaW5mbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgdGVybWluYXRlX2ludGVybmFsX2lvKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7Ci0JaW50IHJldDsKLQl2b2lkICpwYWdlOwotCi0JcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOwotCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQlyZXQgPSBjaHNjX2dldF9zY2hfZGVzY19pcnEoc2NoLCBwYWdlKTsKLQlpZiAocmV0KSB7Ci0JCXN0YXRpYyBpbnQgY2lvX2Noc2NfZXJyX21zZzsKLQkJCi0JCWlmICghY2lvX2Noc2NfZXJyX21zZykgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNoc2NfZ2V0X3NjaF9kZXNjcmlwdGlvbnM6IgotCQkJICAgICAgICIgRXJyb3IgJWQgd2hpbGUgZG9pbmcgY2hzYzsgIgotCQkJICAgICAgICJwcm9jZXNzaW5nIHNvbWUgbWFjaGluZSBjaGVja3MgbWF5ICIKLQkJCSAgICAgICAibm90IHdvcmtcbiIsIHJldCk7Ci0JCQljaW9fY2hzY19lcnJfbXNnID0gMTsKLQkJfQorCWlmIChjaW9fY2xlYXIoc2NoKSkgeworCQkvKiBSZWNoZWNrIGRldmljZSBpbiBjYXNlIGNsZWFyIGZhaWxlZC4gKi8KKwkJc2NoLT5scG0gPSAwOworCQlpZiAoZGV2aWNlX3RyaWdnZXJfdmVyaWZ5KHNjaCkgIT0gMCkKKwkJCWNzc19zY2hlZHVsZV9ldmFsKHNjaC0+c2NoaWQpOworCQlyZXR1cm47CiAJfQotCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKLQlpZiAoIXJldCkgewotCQlpbnQgaiwgY2hwaWQsIG1hc2s7Ci0JCS8qIEFsbG9jYXRlIGNoYW5uZWwgcGF0aCBzdHJ1Y3R1cmVzLCBpZiBuZWVkZWQuICovCi0JCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJCW1hc2sgPSAweDgwID4+IGo7Ci0JCQljaHBpZCA9IHNjaC0+c3NkX2luZm8uY2hwaWRbal07Ci0JCQlpZiAoKHNjaC0+c2NoaWIucG1jdy5waW0gJiBtYXNrKSAmJgotCQkJICAgIChnZXRfY2hwX3N0YXR1cyhjaHBpZCkgPCAwKSkKLQkJCSAgICBuZXdfY2hhbm5lbF9wYXRoKGNocGlkKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OworCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLworCWRldmljZV9zZXRfaW50cmV0cnkoc2NoKTsKKwkvKiBDYWxsIGhhbmRsZXIuICovCisJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKKwkJc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKCZzY2gtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTIxOSw3ICsxNDEsNyBAQAogCWludCBqOwogCWludCBtYXNrOwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwaWQ7CisJc3RydWN0IGNocF9pZCAqY2hwaWQ7CiAJc3RydWN0IHNjaGliIHNjaGliOwogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOwpAQCAtMjQzLDEwNiArMTY1LDUwIEBACiAJaWYgKHNjaC0+c2NoaWIucG1jdy5waW0gPT0gMHg4MCkKIAkJZ290byBvdXRfdW5yZWc7CiAKLQlpZiAoKHNjaC0+c2NoaWIuc2Nzdy5hY3RsICYgU0NTV19BQ1RMX0RFVkFDVCkgJiYKLQkgICAgKHNjaC0+c2NoaWIuc2Nzdy5hY3RsICYgU0NTV19BQ1RMX1NDSEFDVCkgJiYKLQkgICAgKHNjaC0+c2NoaWIucG1jdy5scHVtID09IG1hc2spKSB7Ci0JCWludCBjYzsKLQotCQljYyA9IGNpb19jbGVhcihzY2gpOwotCQlpZiAoY2MgPT0gLUVOT0RFVikKKwlpZiAoY2hlY2tfZm9yX2lvX29uX3BhdGgoc2NoLCBtYXNrKSkgeworCQlpZiAoZGV2aWNlX2lzX29ubGluZShzY2gpKQorCQkJZGV2aWNlX2tpbGxfaW8oc2NoKTsKKwkJZWxzZSB7CisJCQl0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc2NoKTsKKwkJCS8qIFJlLXN0YXJ0IHBhdGggdmVyaWZpY2F0aW9uLiAqLworCQkJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCisJCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOworCQl9CisJfSBlbHNlIHsKKwkJLyogdHJpZ2dlciBwYXRoIHZlcmlmaWNhdGlvbi4gKi8KKwkJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCisJCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7CisJCWVsc2UgaWYgKHNjaC0+bHBtID09IG1hc2spCiAJCQlnb3RvIG91dF91bnJlZzsKLQkJLyogUmVxdWVzdCByZXRyeSBvZiBpbnRlcm5hbCBvcGVyYXRpb24uICovCi0JCWRldmljZV9zZXRfaW50cmV0cnkoc2NoKTsKLQkJLyogQ2FsbCBoYW5kbGVyLiAqLwotCQlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKQotCQkJc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKCZzY2gtPmRldik7Ci0JCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQkvKiB0cmlnZ2VyIHBhdGggdmVyaWZpY2F0aW9uLiAqLwotCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQotCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7Ci0JZWxzZSBpZiAoc2NoLT5scG0gPT0gbWFzaykKLQkJZ290byBvdXRfdW5yZWc7Ci1vdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXJldHVybiAwOworCiBvdXRfdW5yZWc6Ci0Jc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJc2NoLT5scG0gPSAwOwotCWlmIChjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoLT5zY2hpZCkpIHsKLQkJY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KCk7Ci0JCW5lZWRfcmVzY2FuID0gMTsKLQl9CisJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CisJY3NzX3NjaGVkdWxlX2V2YWwoc2NoLT5zY2hpZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1zMzkwX3NldF9jaHBpZF9vZmZsaW5lKCBfX3U4IGNocGlkKQordm9pZCBjaHNjX2NocF9vZmZsaW5lKHN0cnVjdCBjaHBfaWQgY2hwaWQpCiB7CiAJY2hhciBkYmZfdHh0WzE1XTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlzcHJpbnRmKGRiZl90eHQsICJjaHByJXgiLCBjaHBpZCk7CisJc3ByaW50ZihkYmZfdHh0LCAiY2hwciV4LiUwMngiLCBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOwogCUNJT19UUkFDRV9FVkVOVCgyLCBkYmZfdHh0KTsKIAotCWlmIChnZXRfY2hwX3N0YXR1cyhjaHBpZCkgPD0gMCkKKwlpZiAoY2hwX2dldF9zdGF0dXMoY2hwaWQpIDw9IDApCiAJCXJldHVybjsKLQlkZXYgPSBnZXRfZGV2aWNlKCZjc3NbMF0tPmNocHNbY2hwaWRdLT5kZXYpOwotCWJ1c19mb3JfZWFjaF9kZXYoJmNzc19idXNfdHlwZSwgTlVMTCwgdG9fY2hhbm5lbHBhdGgoZGV2KSwKKwlidXNfZm9yX2VhY2hfZGV2KCZjc3NfYnVzX3R5cGUsIE5VTEwsICZjaHBpZCwKIAkJCSBzMzkwX3N1YmNoYW5uZWxfcmVtb3ZlX2NocGlkKTsKLQotCWlmIChuZWVkX3Jlc2NhbiB8fCBjc3Nfc2xvd19zdWJjaGFubmVsc19leGlzdCgpKQotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKLQlwdXRfZGV2aWNlKGRldik7Ci19Ci0KLXN0cnVjdCByZXNfYWNjX2RhdGEgewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKLQl1MzIgZmxhX21hc2s7Ci0JdTE2IGZsYTsKLX07Ci0KLXN0YXRpYyBpbnQKLXMzOTBfcHJvY2Vzc19yZXNfYWNjX3NjaChzdHJ1Y3QgcmVzX2FjY19kYXRhICpyZXNfZGF0YSwgc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKLXsKLQlpbnQgZm91bmQ7Ci0JaW50IGNocDsKLQlpbnQgY2NvZGU7Ci0JCi0JZm91bmQgPSAwOwotCWZvciAoY2hwID0gMDsgY2hwIDw9IDc7IGNocCsrKQotCQkvKgotCQkgKiBjaGVjayBpZiBjaHBpZCBpcyBpbiBpbmZvcm1hdGlvbiB1cGRhdGVkIGJ5IHNzZAotCQkgKi8KLQkJaWYgKHNjaC0+c3NkX2luZm8udmFsaWQgJiYKLQkJICAgIHNjaC0+c3NkX2luZm8uY2hwaWRbY2hwXSA9PSByZXNfZGF0YS0+Y2hwLT5pZCAmJgotCQkgICAgKHNjaC0+c3NkX2luZm8uZmxhW2NocF0gJiByZXNfZGF0YS0+ZmxhX21hc2spCi0JCSAgICA9PSByZXNfZGF0YS0+ZmxhKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQotCWlmIChmb3VuZCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogRG8gYSBzdHNjaCB0byB1cGRhdGUgb3VyIHN1YmNoYW5uZWwgc3RydWN0dXJlIHdpdGggdGhlCi0JICogbmV3IHBhdGggaW5mb3JtYXRpb24gYW5kIGV2ZW50dWFsbHkgY2hlY2sgZm9yIGxvZ2ljYWxseQotCSAqIG9mZmxpbmUgY2hwaWRzLgotCSAqLwotCWNjb2RlID0gc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpOwotCWlmIChjY29kZSA+IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDB4ODAgPj4gY2hwOwogfQogCiBzdGF0aWMgaW50CiBzMzkwX3Byb2Nlc3NfcmVzX2FjY19uZXdfc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQogewogCXN0cnVjdCBzY2hpYiBzY2hpYjsKLQlpbnQgcmV0OwogCS8qCiAJICogV2UgZG9uJ3Qga25vdyB0aGUgZGV2aWNlIHlldCwgYnV0IHNpbmNlIGEgcGF0aAogCSAqIG1heSBiZSBhdmFpbGFibGUgbm93IHRvIHRoZSBkZXZpY2Ugd2UnbGwgaGF2ZQpAQCAtMzUzLDE0ICsyMTksMzUgQEAKIAkgKi8KIAlpZiAoc3RzY2hfZXJyKHNjaGlkLCAmc2NoaWIpKQogCQkvKiBXZSdyZSB0aHJvdWdoICovCi0JCXJldHVybiBuZWVkX3Jlc2NhbiA/IC1FQUdBSU4gOiAtRU5YSU87CisJCXJldHVybiAtRU5YSU87CiAKIAkvKiBQdXQgaXQgb24gdGhlIHNsb3cgcGF0aC4gKi8KLQlyZXQgPSBjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoaWQpOwotCWlmIChyZXQpIHsKLQkJY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KCk7Ci0JCW5lZWRfcmVzY2FuID0gMTsKLQkJcmV0dXJuIC1FQUdBSU47CisJY3NzX3NjaGVkdWxlX2V2YWwoc2NoaWQpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcmVzX2FjY19kYXRhIHsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOworCXUzMiBmbGFfbWFzazsKKwl1MTYgZmxhOworfTsKKworc3RhdGljIGludCBnZXRfcmVzX2NocGlkX21hc2soc3RydWN0IGNoc2Nfc3NkX2luZm8gKnNzZCwKKwkJCSAgICAgIHN0cnVjdCByZXNfYWNjX2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisJaW50IG1hc2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW1hc2sgPSAweDgwID4+IGk7CisJCWlmICghKHNzZC0+cGF0aF9tYXNrICYgbWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKCFjaHBfaWRfaXNfZXF1YWwoJnNzZC0+Y2hwaWRbaV0sICZkYXRhLT5jaHBpZCkpCisJCQljb250aW51ZTsKKwkJaWYgKChzc2QtPmZsYV92YWxpZF9tYXNrICYgbWFzaykgJiYKKwkJICAgICgoc3NkLT5mbGFbaV0gJiBkYXRhLT5mbGFfbWFzaykgIT0gZGF0YS0+ZmxhKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbWFzazsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNzksMTQgKzI2NiwxMSBAQAogCQlyZXR1cm4gczM5MF9wcm9jZXNzX3Jlc19hY2NfbmV3X3NjaChzY2hpZCk7CiAKIAlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7Ci0KLQljaHBfbWFzayA9IHMzOTBfcHJvY2Vzc19yZXNfYWNjX3NjaChyZXNfZGF0YSwgc2NoKTsKLQotCWlmIChjaHBfbWFzayA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7Ci0JCXJldHVybiAwOwotCX0KKwljaHBfbWFzayA9IGdldF9yZXNfY2hwaWRfbWFzaygmc2NoLT5zc2RfaW5mbywgcmVzX2RhdGEpOworCWlmIChjaHBfbWFzayA9PSAwKQorCQlnb3RvIG91dDsKKwlpZiAoc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpKQorCQlnb3RvIG91dDsKIAlvbGRfbHBtID0gc2NoLT5scG07CiAJc2NoLT5scG0gPSAoKHNjaC0+c2NoaWIucG1jdy5waW0gJgogCQkgICAgIHNjaC0+c2NoaWIucG1jdy5wYW0gJgpAQCAtMzk2LDIwICsyODAsMTggQEAKIAkJZGV2aWNlX3RyaWdnZXJfcmVwcm9iZShzY2gpOwogCWVsc2UgaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCiAJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKLQorb3V0OgogCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50Ci1zMzkwX3Byb2Nlc3NfcmVzX2FjYyAoc3RydWN0IHJlc19hY2NfZGF0YSAqcmVzX2RhdGEpCitzdGF0aWMgdm9pZCBzMzkwX3Byb2Nlc3NfcmVzX2FjYyAoc3RydWN0IHJlc19hY2NfZGF0YSAqcmVzX2RhdGEpCiB7Ci0JaW50IHJjOwogCWNoYXIgZGJmX3R4dFsxNV07CiAKLQlzcHJpbnRmKGRiZl90eHQsICJhY2NwciV4IiwgcmVzX2RhdGEtPmNocC0+aWQpOworCXNwcmludGYoZGJmX3R4dCwgImFjY3ByJXguJTAyeCIsIHJlc19kYXRhLT5jaHBpZC5jc3NpZCwKKwkJcmVzX2RhdGEtPmNocGlkLmlkKTsKIAlDSU9fVFJBQ0VfRVZFTlQoIDIsIGRiZl90eHQpOwogCWlmIChyZXNfZGF0YS0+ZmxhICE9IDApIHsKIAkJc3ByaW50ZihkYmZfdHh0LCAiZmxhJXgiLCByZXNfZGF0YS0+ZmxhKTsKQEAgLTQyMywxMiArMzA1LDcgQEAKIAkgKiBUaGUgbW9yZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIChpbmZvKSwgdGhlIGxlc3Mgc2Nhbm5pbmcKIAkgKiB3aWxsIHdlIGhhdmUgdG8gZG8uCiAJICovCi0JcmMgPSBmb3JfZWFjaF9zdWJjaGFubmVsKF9fczM5MF9wcm9jZXNzX3Jlc19hY2MsIHJlc19kYXRhKTsKLQlpZiAoY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3QoKSkKLQkJcmMgPSAtRUFHQUlOOwotCWVsc2UgaWYgKHJjICE9IC1FQUdBSU4pCi0JCXJjID0gMDsKLQlyZXR1cm4gcmM7CisJZm9yX2VhY2hfc3ViY2hhbm5lbChfX3MzOTBfcHJvY2Vzc19yZXNfYWNjLCByZXNfZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ4MCw0MyArMzU3LDQ1IEBACiAJLyogY2NkZiBoYXMgdG8gYmUgYmlnIGVub3VnaCBmb3IgYSBsaW5rLWluY2lkZW50IHJlY29yZCAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0YXRpYyBpbnQgY2hzY19wcm9jZXNzX3NlaV9saW5rX2luY2lkZW50KHN0cnVjdCBjaHNjX3NlaV9hcmVhICpzZWlfYXJlYSkKK3N0YXRpYyB2b2lkIGNoc2NfcHJvY2Vzc19zZWlfbGlua19pbmNpZGVudChzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCiB7Ci0JaW50IGNocGlkOworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CisJaW50IGlkOwogCiAJQ0lPX0NSV19FVkVOVCg0LCAiY2hzYzogbGluayBpbmNpZGVudCAocnM9JTAyeCwgcnNfaWQ9JTA0eClcbiIsCiAJCSAgICAgIHNlaV9hcmVhLT5ycywgc2VpX2FyZWEtPnJzaWQpOwogCWlmIChzZWlfYXJlYS0+cnMgIT0gNCkKLQkJcmV0dXJuIDA7Ci0JY2hwaWQgPSBfX2dldF9jaHBpZF9mcm9tX2xpcihzZWlfYXJlYS0+Y2NkZik7Ci0JaWYgKGNocGlkIDwgMCkKKwkJcmV0dXJuOworCWlkID0gX19nZXRfY2hwaWRfZnJvbV9saXIoc2VpX2FyZWEtPmNjZGYpOworCWlmIChpZCA8IDApCiAJCUNJT19DUldfRVZFTlQoNCwgImNoc2M6IGxpbmsgaW5jaWRlbnQgLSBpbnZhbGlkIExJUlxuIik7Ci0JZWxzZQotCQlzMzkwX3NldF9jaHBpZF9vZmZsaW5lKGNocGlkKTsKLQotCXJldHVybiAwOworCWVsc2UgeworCQljaHBfaWRfaW5pdCgmY2hwaWQpOworCQljaHBpZC5pZCA9IGlkOworCQljaHNjX2NocF9vZmZsaW5lKGNocGlkKTsKKwl9CiB9CiAKLXN0YXRpYyBpbnQgY2hzY19wcm9jZXNzX3NlaV9yZXNfYWNjKHN0cnVjdCBjaHNjX3NlaV9hcmVhICpzZWlfYXJlYSkKK3N0YXRpYyB2b2lkIGNoc2NfcHJvY2Vzc19zZWlfcmVzX2FjYyhzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCiB7CiAJc3RydWN0IHJlc19hY2NfZGF0YSByZXNfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKIAlpbnQgc3RhdHVzOwotCWludCByYzsKIAogCUNJT19DUldfRVZFTlQoNCwgImNoc2M6IHJlc291cmNlIGFjY2Vzc2liaWxpdHkgZXZlbnQgKHJzPSUwMngsICIKIAkJICAgICAgInJzX2lkPSUwNHgpXG4iLCBzZWlfYXJlYS0+cnMsIHNlaV9hcmVhLT5yc2lkKTsKIAlpZiAoc2VpX2FyZWEtPnJzICE9IDQpCi0JCXJldHVybiAwOworCQlyZXR1cm47CisJY2hwX2lkX2luaXQoJmNocGlkKTsKKwljaHBpZC5pZCA9IHNlaV9hcmVhLT5yc2lkOwogCS8qIGFsbG9jYXRlIGEgbmV3IGNoYW5uZWwgcGF0aCBzdHJ1Y3R1cmUsIGlmIG5lZWRlZCAqLwotCXN0YXR1cyA9IGdldF9jaHBfc3RhdHVzKHNlaV9hcmVhLT5yc2lkKTsKKwlzdGF0dXMgPSBjaHBfZ2V0X3N0YXR1cyhjaHBpZCk7CiAJaWYgKHN0YXR1cyA8IDApCi0JCW5ld19jaGFubmVsX3BhdGgoc2VpX2FyZWEtPnJzaWQpOworCQljaHBfbmV3KGNocGlkKTsKIAllbHNlIGlmICghc3RhdHVzKQotCQlyZXR1cm4gMDsKLQlkZXYgPSBnZXRfZGV2aWNlKCZjc3NbMF0tPmNocHNbc2VpX2FyZWEtPnJzaWRdLT5kZXYpOworCQlyZXR1cm47CiAJbWVtc2V0KCZyZXNfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNfYWNjX2RhdGEpKTsKLQlyZXNfZGF0YS5jaHAgPSB0b19jaGFubmVscGF0aChkZXYpOworCXJlc19kYXRhLmNocGlkID0gY2hwaWQ7CiAJaWYgKChzZWlfYXJlYS0+dmYgJiAweGMwKSAhPSAwKSB7CiAJCXJlc19kYXRhLmZsYSA9IHNlaV9hcmVhLT5mbGE7CiAJCWlmICgoc2VpX2FyZWEtPnZmICYgMHhjMCkgPT0gMHhjMCkKQEAgLTUyNiw1MSArNDA1LDgyIEBACiAJCQkvKiBsaW5rIGFkZHJlc3MgKi8KIAkJCXJlc19kYXRhLmZsYV9tYXNrID0gMHhmZjAwOwogCX0KLQlyYyA9IHMzOTBfcHJvY2Vzc19yZXNfYWNjKCZyZXNfZGF0YSk7Ci0JcHV0X2RldmljZShkZXYpOwotCi0JcmV0dXJuIHJjOworCXMzOTBfcHJvY2Vzc19yZXNfYWNjKCZyZXNfZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hzY19wcm9jZXNzX3NlaShzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCi17Ci0JaW50IHJjOworc3RydWN0IGNocF9jb25maWdfZGF0YSB7CisJdTggbWFwWzMyXTsKKwl1OCBvcDsKKwl1OCBwYzsKK307CiAKK3N0YXRpYyB2b2lkIGNoc2NfcHJvY2Vzc19zZWlfY2hwX2NvbmZpZyhzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCit7CisJc3RydWN0IGNocF9jb25maWdfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOworCWludCBudW07CisKKwlDSU9fQ1JXX0VWRU5UKDQsICJjaHNjOiBjaGFubmVsLXBhdGgtY29uZmlndXJhdGlvbiBub3RpZmljYXRpb25cbiIpOworCWlmIChzZWlfYXJlYS0+cnMgIT0gMCkKKwkJcmV0dXJuOworCWRhdGEgPSAoc3RydWN0IGNocF9jb25maWdfZGF0YSAqKSAmKHNlaV9hcmVhLT5jY2RmKTsKKwljaHBfaWRfaW5pdCgmY2hwaWQpOworCWZvciAobnVtID0gMDsgbnVtIDw9IF9fTUFYX0NIUElEOyBudW0rKykgeworCQlpZiAoIWNocF90ZXN0X2JpdChkYXRhLT5tYXAsIG51bSkpCisJCQljb250aW51ZTsKKwkJY2hwaWQuaWQgPSBudW07CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogcHJvY2Vzc2luZyBjb25maWd1cmUgZXZlbnQgJWQgZm9yICIKKwkJICAgICAgICJjaHBpZCAleC4lMDJ4XG4iLCBkYXRhLT5vcCwgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKKwkJc3dpdGNoIChkYXRhLT5vcCkgeworCQljYXNlIDA6CisJCQljaHBfY2ZnX3NjaGVkdWxlKGNocGlkLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQljaHBfY2ZnX3NjaGVkdWxlKGNocGlkLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQljaHBfY2ZnX2NhbmNlbF9kZWNvbmZpZ3VyZShjaHBpZCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2hzY19wcm9jZXNzX3NlaShzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCit7CiAJLyogQ2hlY2sgaWYgd2UgbWlnaHQgaGF2ZSBsb3N0IHNvbWUgaW5mb3JtYXRpb24uICovCi0JaWYgKHNlaV9hcmVhLT5mbGFncyAmIDB4NDApCisJaWYgKHNlaV9hcmVhLT5mbGFncyAmIDB4NDApIHsKIAkJQ0lPX0NSV19FVkVOVCgyLCAiY2hzYzogZXZlbnQgb3ZlcmZsb3dcbiIpOworCQljc3Nfc2NoZWR1bGVfZXZhbF9hbGwoKTsKKwl9CiAJLyogd2hpY2gga2luZCBvZiBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkPyAqLwotCXJjID0gMDsKIAlzd2l0Y2ggKHNlaV9hcmVhLT5jYykgewogCWNhc2UgMTogLyogbGluayBpbmNpZGVudCovCi0JCXJjID0gY2hzY19wcm9jZXNzX3NlaV9saW5rX2luY2lkZW50KHNlaV9hcmVhKTsKKwkJY2hzY19wcm9jZXNzX3NlaV9saW5rX2luY2lkZW50KHNlaV9hcmVhKTsKIAkJYnJlYWs7CiAJY2FzZSAyOiAvKiBpL28gcmVzb3VyY2UgYWNjZXNzaWJpbGl5ICovCi0JCXJjID0gY2hzY19wcm9jZXNzX3NlaV9yZXNfYWNjKHNlaV9hcmVhKTsKKwkJY2hzY19wcm9jZXNzX3NlaV9yZXNfYWNjKHNlaV9hcmVhKTsKKwkJYnJlYWs7CisJY2FzZSA4OiAvKiBjaGFubmVsLXBhdGgtY29uZmlndXJhdGlvbiBub3RpZmljYXRpb24gKi8KKwkJY2hzY19wcm9jZXNzX3NlaV9jaHBfY29uZmlnKHNlaV9hcmVhKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDogLyogb3RoZXIgc3R1ZmYgKi8KIAkJQ0lPX0NSV19FVkVOVCg0LCAiY2hzYzogdW5oYW5kbGVkIHNlaSBjb250ZW50IGNvZGUgJWRcbiIsCiAJCQkgICAgICBzZWlfYXJlYS0+Y2MpOwogCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gcmM7CiB9CiAKLWludCBjaHNjX3Byb2Nlc3NfY3J3KHZvaWQpCit2b2lkIGNoc2NfcHJvY2Vzc19jcncodm9pZCkKIHsKIAlzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWE7Ci0JaW50IHJldDsKLQlpbnQgcmM7CiAKIAlpZiAoIXNlaV9wYWdlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCS8qIEFjY2VzcyB0byBzZWlfcGFnZSBpcyBzZXJpYWxpemVkIHRocm91Z2ggbWFjaGluZSBjaGVjayBoYW5kbGVyCiAJICogdGhyZWFkLCBzbyBubyBuZWVkIGZvciBsb2NraW5nLiAqLwogCXNlaV9hcmVhID0gc2VpX3BhZ2U7CiAKIAlDSU9fVFJBQ0VfRVZFTlQoIDIsICJwcmNzcyIpOwotCXJldCA9IDA7CiAJZG8gewogCQltZW1zZXQoc2VpX2FyZWEsIDAsIHNpemVvZigqc2VpX2FyZWEpKTsKIAkJc2VpX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwpAQCAtNTgwLDM3ICs0OTAsMjYgQEAKIAogCQlpZiAoc2VpX2FyZWEtPnJlc3BvbnNlLmNvZGUgPT0gMHgwMDAxKSB7CiAJCQlDSU9fQ1JXX0VWRU5UKDQsICJjaHNjOiBzZWkgc3VjY2Vzc2Z1bFxuIik7Ci0JCQlyYyA9IGNoc2NfcHJvY2Vzc19zZWkoc2VpX2FyZWEpOwotCQkJaWYgKHJjKQotCQkJCXJldCA9IHJjOworCQkJY2hzY19wcm9jZXNzX3NlaShzZWlfYXJlYSk7CiAJCX0gZWxzZSB7CiAJCQlDSU9fQ1JXX0VWRU5UKDIsICJjaHNjOiBzZWkgZmFpbGVkIChyYz0lMDR4KVxuIiwKIAkJCQkgICAgICBzZWlfYXJlYS0+cmVzcG9uc2UuY29kZSk7Ci0JCQlyZXQgPSAwOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChzZWlfYXJlYS0+ZmxhZ3MgJiAweDgwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKIF9fY2hwX2FkZF9uZXdfc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQogewogCXN0cnVjdCBzY2hpYiBzY2hpYjsKLQlpbnQgcmV0OwogCiAJaWYgKHN0c2NoX2VycihzY2hpZCwgJnNjaGliKSkKIAkJLyogV2UncmUgdGhyb3VnaCAqLwotCQlyZXR1cm4gbmVlZF9yZXNjYW4gPyAtRUFHQUlOIDogLUVOWElPOworCQlyZXR1cm4gLUVOWElPOwogCiAJLyogUHV0IGl0IG9uIHRoZSBzbG93IHBhdGguICovCi0JcmV0ID0gY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHNjaGlkKTsKLQlpZiAocmV0KSB7Ci0JCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KKwljc3Nfc2NoZWR1bGVfZXZhbChzY2hpZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxOSwxMCArNTE4LDEwIEBACiBfX2NocF9hZGQoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvaWQgKmRhdGEpCiB7CiAJaW50IGksIG1hc2s7Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOworCXN0cnVjdCBjaHBfaWQgKmNocGlkOwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKLQljaHAgPSBkYXRhOworCWNocGlkID0gZGF0YTsKIAlzY2ggPSBnZXRfc3ViY2hhbm5lbF9ieV9zY2hpZChzY2hpZCk7CiAJaWYgKCFzY2gpCiAJCS8qIENoZWNrIGlmIHRoZSBzdWJjaGFubmVsIGlzIG5vdyBhdmFpbGFibGUuICovCkBAIC02MzEsNyArNTMwLDcgQEAKIAlmb3IgKGk9MDsgaTw4OyBpKyspIHsKIAkJbWFzayA9IDB4ODAgPj4gaTsKIAkJaWYgKChzY2gtPnNjaGliLnBtY3cucGltICYgbWFzaykgJiYKLQkJICAgIChzY2gtPnNjaGliLnBtY3cuY2hwaWRbaV0gPT0gY2hwLT5pZCkpIHsKKwkJICAgIChzY2gtPnNjaGliLnBtY3cuY2hwaWRbaV0gPT0gY2hwaWQtPmlkKSkgewogCQkJaWYgKHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKSAhPSAwKSB7CiAJCQkJLyogRW5kZ2FtZS4gKi8KIAkJCQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKQEAgLTY1NywxMjIgKzU1Niw1OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1jaHBfYWRkKGludCBjaHBpZCkKK3ZvaWQgY2hzY19jaHBfb25saW5lKHN0cnVjdCBjaHBfaWQgY2hwaWQpCiB7Ci0JaW50IHJjOwogCWNoYXIgZGJmX3R4dFsxNV07Ci0Jc3RydWN0IGRldmljZSAqZGV2OwogCi0JaWYgKCFnZXRfY2hwX3N0YXR1cyhjaHBpZCkpCi0JCXJldHVybiAwOyAvKiBubyBuZWVkIHRvIGRvIHRoZSByZXN0ICovCi0JCi0Jc3ByaW50ZihkYmZfdHh0LCAiY2FkZCV4IiwgY2hwaWQpOworCXNwcmludGYoZGJmX3R4dCwgImNhZGQleC4lMDJ4IiwgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKIAlDSU9fVFJBQ0VfRVZFTlQoMiwgZGJmX3R4dCk7CiAKLQlkZXYgPSBnZXRfZGV2aWNlKCZjc3NbMF0tPmNocHNbY2hwaWRdLT5kZXYpOwotCXJjID0gZm9yX2VhY2hfc3ViY2hhbm5lbChfX2NocF9hZGQsIHRvX2NoYW5uZWxwYXRoKGRldikpOwotCWlmIChjc3Nfc2xvd19zdWJjaGFubmVsc19leGlzdCgpKQotCQlyYyA9IC1FQUdBSU47Ci0JaWYgKHJjICE9IC1FQUdBSU4pCi0JCXJjID0gMDsKLQlwdXRfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHJjOworCWlmIChjaHBfZ2V0X3N0YXR1cyhjaHBpZCkgIT0gMCkKKwkJZm9yX2VhY2hfc3ViY2hhbm5lbChfX2NocF9hZGQsICZjaHBpZCk7CiB9CiAKLS8qIAotICogSGFuZGxpbmcgb2YgY3J3IG1hY2hpbmUgY2hlY2tzIHdpdGggY2hhbm5lbCBwYXRoIHNvdXJjZS4KLSAqLwotaW50Ci1jaHBfcHJvY2Vzc19jcncoaW50IGNocGlkLCBpbnQgb24pCi17Ci0JaWYgKG9uID09IDApIHsKLQkJLyogUGF0aCBoYXMgZ29uZS4gV2UgdXNlIHRoZSBsaW5rIGluY2lkZW50IHJvdXRpbmUuKi8KLQkJczM5MF9zZXRfY2hwaWRfb2ZmbGluZShjaHBpZCk7Ci0JCXJldHVybiAwOyAvKiBEZS1yZWdpc3RlciBpcyBhc3luYyBhbnl3YXkuICovCi0JfQotCS8qCi0JICogUGF0aCBoYXMgY29tZS4gQWxsb2NhdGUgYSBuZXcgY2hhbm5lbCBwYXRoIHN0cnVjdHVyZSwKLQkgKiBpZiBuZWVkZWQuCi0JICovCi0JaWYgKGdldF9jaHBfc3RhdHVzKGNocGlkKSA8IDApCi0JCW5ld19jaGFubmVsX3BhdGgoY2hwaWQpOwotCS8qIEF2b2lkIHRoZSBleHRyYSBvdmVyaGVhZCBpbiBwcm9jZXNzX3JlY19hY2MuICovCi0JcmV0dXJuIGNocF9hZGQoY2hwaWQpOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX2Zvcl9pb19vbl9wYXRoKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBpbmRleCkKLXsKLQlpbnQgY2M7Ci0KLQljYyA9IHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKLQlpZiAoY2MpCi0JCXJldHVybiAwOwotCWlmIChzY2gtPnNjaGliLnNjc3cuYWN0bCAmJiBzY2gtPnNjaGliLnBtY3cubHB1bSA9PSAoMHg4MCA+PiBpbmRleCkpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKLXsKLQlpZiAoY2lvX2NsZWFyKHNjaCkpIHsKLQkJLyogUmVjaGVjayBkZXZpY2UgaW4gY2FzZSBjbGVhciBmYWlsZWQuICovCi0JCXNjaC0+bHBtID0gMDsKLQkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApIHsKLQkJCWlmKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgewotCQkJCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQkJCW5lZWRfcmVzY2FuID0gMTsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLwotCWRldmljZV9zZXRfaW50cmV0cnkoc2NoKTsKLQkvKiBDYWxsIGhhbmRsZXIuICovCi0JaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKLQkJc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKCZzY2gtPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1fX3MzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIF9fdTggY2hwaWQsIGludCBvbikKK3N0YXRpYyB2b2lkIF9fczM5MF9zdWJjaGFubmVsX3ZhcnlfY2hwaWQoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwKKwkJCQkJIHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBvbikKIHsKIAlpbnQgY2hwLCBvbGRfbHBtOworCWludCBtYXNrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIXNjaC0+c3NkX2luZm8udmFsaWQpCi0JCXJldHVybjsKLQkKIAlzcGluX2xvY2tfaXJxc2F2ZShzY2gtPmxvY2ssIGZsYWdzKTsKIAlvbGRfbHBtID0gc2NoLT5scG07CiAJZm9yIChjaHAgPSAwOyBjaHAgPCA4OyBjaHArKykgewotCQlpZiAoc2NoLT5zc2RfaW5mby5jaHBpZFtjaHBdICE9IGNocGlkKQorCQltYXNrID0gMHg4MCA+PiBjaHA7CisJCWlmICghKHNjaC0+c3NkX2luZm8ucGF0aF9tYXNrICYgbWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKCFjaHBfaWRfaXNfZXF1YWwoJnNjaC0+c3NkX2luZm8uY2hwaWRbY2hwXSwgJmNocGlkKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChvbikgewotCQkJc2NoLT5vcG0gfD0gKDB4ODAgPj4gY2hwKTsKLQkJCXNjaC0+bHBtIHw9ICgweDgwID4+IGNocCk7CisJCQlzY2gtPm9wbSB8PSBtYXNrOworCQkJc2NoLT5scG0gfD0gbWFzazsKIAkJCWlmICghb2xkX2xwbSkKIAkJCQlkZXZpY2VfdHJpZ2dlcl9yZXByb2JlKHNjaCk7CiAJCQllbHNlIGlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQogCQkJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKIAkJCWJyZWFrOwogCQl9Ci0JCXNjaC0+b3BtICY9IH4oMHg4MCA+PiBjaHApOwotCQlzY2gtPmxwbSAmPSB+KDB4ODAgPj4gY2hwKTsKLQkJaWYgKGNoZWNrX2Zvcl9pb19vbl9wYXRoKHNjaCwgY2hwKSkgeworCQlzY2gtPm9wbSAmPSB+bWFzazsKKwkJc2NoLT5scG0gJj0gfm1hc2s7CisJCWlmIChjaGVja19mb3JfaW9fb25fcGF0aChzY2gsIG1hc2spKSB7CiAJCQlpZiAoZGV2aWNlX2lzX29ubGluZShzY2gpKQogCQkJCS8qIFBhdGggdmVyaWZpY2F0aW9uIGlzIGRvbmUgYWZ0ZXIga2lsbGluZy4gKi8KIAkJCQlkZXZpY2Vfa2lsbF9pbyhzY2gpOwotCQkJZWxzZQorCQkJZWxzZSB7CiAJCQkJLyogS2lsbCBhbmQgcmV0cnkgaW50ZXJuYWwgSS9PLiAqLwogCQkJCXRlcm1pbmF0ZV9pbnRlcm5hbF9pbyhzY2gpOwotCQl9IGVsc2UgaWYgKCFzY2gtPmxwbSkgewotCQkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApIHsKLQkJCQlpZiAoY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHNjaC0+c2NoaWQpKSB7Ci0JCQkJCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQkJCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCQkJfQorCQkJCS8qIFJlLXN0YXJ0IHBhdGggdmVyaWZpY2F0aW9uLiAqLworCQkJCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQorCQkJCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7CiAJCQl9CisJCX0gZWxzZSBpZiAoIXNjaC0+bHBtKSB7CisJCQlpZiAoZGV2aWNlX3RyaWdnZXJfdmVyaWZ5KHNjaCkgIT0gMCkKKwkJCQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKIAkJfSBlbHNlIGlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQogCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwogCQlicmVhazsKQEAgLTc4MCwxMSArNjE1LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludAotczM5MF9zdWJjaGFubmVsX3ZhcnlfY2hwaWRfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgczM5MF9zdWJjaGFubmVsX3ZhcnlfY2hwaWRfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCV9fdTggKmNocGlkOworCXN0cnVjdCBjaHBfaWQgKmNocGlkOwogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOwogCWNocGlkID0gZGF0YTsKQEAgLTc5MywxMSArNjI3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXMzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkX29uKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgczM5MF9zdWJjaGFubmVsX3ZhcnlfY2hwaWRfb24oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JX191OCAqY2hwaWQ7CisJc3RydWN0IGNocF9pZCAqY2hwaWQ7CiAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7CiAJY2hwaWQgPSBkYXRhOwpAQCAtODIxLDQwICs2NTQsMTcgQEAKIAkJLyogV2UncmUgdGhyb3VnaCAqLwogCQlyZXR1cm4gLUVOWElPOwogCS8qIFB1dCBpdCBvbiB0aGUgc2xvdyBwYXRoLiAqLwotCWlmIChjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoaWQpKSB7Ci0JCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KKwljc3Nfc2NoZWR1bGVfZXZhbChzY2hpZCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBGdW5jdGlvbjogczM5MF92YXJ5X2NocGlkCi0gKiBWYXJpZXMgdGhlIHNwZWNpZmllZCBjaHBpZCBvbmxpbmUgb3Igb2ZmbGluZQorLyoqCisgKiBjaHNjX2NocF92YXJ5IC0gcHJvcGFnYXRlIGNoYW5uZWwtcGF0aCB2YXJ5IG9wZXJhdGlvbiB0byBzdWJjaGFubmVscworICogQGNocGlkOiBjaGFubmwtcGF0aCBJRAorICogQG9uOiBub24temVybyBmb3IgdmFyeSBvbmxpbmUsIHplcm8gZm9yIHZhcnkgb2ZmbGluZQogICovCi1zdGF0aWMgaW50Ci1zMzkwX3ZhcnlfY2hwaWQoIF9fdTggY2hwaWQsIGludCBvbikKK2ludCBjaHNjX2NocF92YXJ5KHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBvbikKIHsKLQljaGFyIGRiZl90ZXh0WzE1XTsKLQlpbnQgc3RhdHVzOwotCi0Jc3ByaW50ZihkYmZfdGV4dCwgb24/InZhcnlvbiV4IjoidmFyeW9mZiV4IiwgY2hwaWQpOwotCUNJT19UUkFDRV9FVkVOVCggMiwgZGJmX3RleHQpOwotCi0Jc3RhdHVzID0gZ2V0X2NocF9zdGF0dXMoY2hwaWQpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgdmFyeSB1bmtub3duIGNocGlkICUwMlhcbiIsIGNocGlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFvbiAmJiAhc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2hwaWQgJXggaXMgYWxyZWFkeSBvZmZsaW5lXG4iLCBjaHBpZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNldF9jaHBfbG9naWNhbGx5X29ubGluZShjaHBpZCwgb24pOwotCiAJLyoKIAkgKiBSZWRvIFBhdGhWZXJpZmljYXRpb24gb24gdGhlIGRldmljZXMgdGhlIGNocGlkIGNvbm5lY3RzIHRvCiAJICovCkBAIC04NjUsMTE4ICs2NzUsOSBAQAogCWlmIChvbikKIAkJLyogU2NhbiBmb3IgbmV3IGRldmljZXMgb24gdmFyaWVkIG9uIHBhdGguICovCiAJCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zMzkwX3ZhcnlfY2hwaWRfb24sIE5VTEwpOwotCWlmIChuZWVkX3Jlc2NhbiB8fCBjc3Nfc2xvd19zdWJjaGFubmVsc19leGlzdCgpKQotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIENoYW5uZWwgbWVhc3VyZW1lbnQgcmVsYXRlZCBmdW5jdGlvbnMKLSAqLwotc3RhdGljIHNzaXplX3QKLWNocF9tZWFzdXJlbWVudF9jaGFyc19yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsCi0JCQkgICBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOwotCXVuc2lnbmVkIGludCBzaXplOwotCi0JY2hwID0gdG9fY2hhbm5lbHBhdGgoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKLQlpZiAoIWNocC0+Y21nX2NoYXJzKQotCQlyZXR1cm4gMDsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtZ19jaGFycyk7Ci0KLQlpZiAob2ZmID4gc2l6ZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKG9mZiArIGNvdW50ID4gc2l6ZSkKLQkJY291bnQgPSBzaXplIC0gb2ZmOwotCW1lbWNweShidWYsIGNocC0+Y21nX2NoYXJzICsgb2ZmLCBjb3VudCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIgPSB7Ci0JLmF0dHIgPSB7Ci0JCS5uYW1lID0gIm1lYXN1cmVtZW50X2NoYXJzIiwKLQkJLm1vZGUgPSBTX0lSVVNSLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBjbWdfY2hhcnMpLAotCS5yZWFkID0gY2hwX21lYXN1cmVtZW50X2NoYXJzX3JlYWQsCi19OwotCi1zdGF0aWMgdm9pZAotY2hwX21lYXN1cmVtZW50X2NvcHlfYmxvY2soc3RydWN0IGNtZ19lbnRyeSAqYnVmLAotCQkJICAgc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MsIGludCBjaHBpZCkKLXsKLQl2b2lkICphcmVhOwotCXN0cnVjdCBjbWdfZW50cnkgKmVudHJ5LCByZWZlcmVuY2VfYnVmOwotCWludCBpZHg7Ci0KLQlpZiAoY2hwaWQgPCAxMjgpIHsKLQkJYXJlYSA9IGNzcy0+Y3ViX2FkZHIxOwotCQlpZHggPSBjaHBpZDsKLQl9IGVsc2UgewotCQlhcmVhID0gY3NzLT5jdWJfYWRkcjI7Ci0JCWlkeCA9IGNocGlkIC0gMTI4OwotCX0KLQllbnRyeSA9IGFyZWEgKyAoaWR4ICogc2l6ZW9mKHN0cnVjdCBjbWdfZW50cnkpKTsKLQlkbyB7Ci0JCW1lbWNweShidWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSk7Ci0JCW1lbWNweSgmcmVmZXJlbmNlX2J1ZiwgZW50cnksIHNpemVvZigqZW50cnkpKTsKLQl9IHdoaWxlIChyZWZlcmVuY2VfYnVmLnZhbHVlc1swXSAhPSBidWYtPnZhbHVlc1swXSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jaHBfbWVhc3VyZW1lbnRfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOwotCXN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzOwotCXVuc2lnbmVkIGludCBzaXplOwotCi0JY2hwID0gdG9fY2hhbm5lbHBhdGgoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKLQljc3MgPSB0b19jc3MoY2hwLT5kZXYucGFyZW50KTsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtZ19lbnRyeSk7Ci0KLQkvKiBPbmx5IGFsbG93IHNpbmdsZSByZWFkcy4gKi8KLQlpZiAob2ZmIHx8IGNvdW50IDwgc2l6ZSkKLQkJcmV0dXJuIDA7Ci0JY2hwX21lYXN1cmVtZW50X2NvcHlfYmxvY2soKHN0cnVjdCBjbWdfZW50cnkgKilidWYsIGNzcywgY2hwLT5pZCk7Ci0JY291bnQgPSBzaXplOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGNocF9tZWFzdXJlbWVudF9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJtZWFzdXJlbWVudCIsCi0JCS5tb2RlID0gU19JUlVTUiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2VudHJ5KSwKLQkucmVhZCA9IGNocF9tZWFzdXJlbWVudF9yZWFkLAotfTsKLQotc3RhdGljIHZvaWQKLWNoc2NfcmVtb3ZlX2NocF9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCi17Ci0JZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfY2hhcnNfYXR0cik7Ci0JZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfYXR0cik7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoc2NfYWRkX2NocF9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfYXR0cik7Ci0JaWYgKHJldCkKLQkJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmY2hwLT5kZXYsICZjaHBfbWVhc3VyZW1lbnRfY2hhcnNfYXR0cik7Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHZvaWQKIGNoc2NfcmVtb3ZlX2NtZ19hdHRyKHN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzKQogewpAQCAtOTg1LDcgKzY4Niw3IEBACiAJZm9yIChpID0gMDsgaSA8PSBfX01BWF9DSFBJRDsgaSsrKSB7CiAJCWlmICghY3NzLT5jaHBzW2ldKQogCQkJY29udGludWU7Ci0JCWNoc2NfcmVtb3ZlX2NocF9jbWdfYXR0cihjc3MtPmNocHNbaV0pOworCQljaHBfcmVtb3ZlX2NtZ19hdHRyKGNzcy0+Y2hwc1tpXSk7CiAJfQogfQogCkBAIC05OTgsNyArNjk5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDw9IF9fTUFYX0NIUElEOyBpKyspIHsKIAkJaWYgKCFjc3MtPmNocHNbaV0pCiAJCQljb250aW51ZTsKLQkJcmV0ID0gY2hzY19hZGRfY2hwX2NtZ19hdHRyKGNzcy0+Y2hwc1tpXSk7CisJCXJldCA9IGNocF9hZGRfY21nX2F0dHIoY3NzLT5jaHBzW2ldKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0xMDA3LDEyICs3MDgsMTEgQEAKIAlmb3IgKC0taTsgaSA+PSAwOyBpLS0pIHsKIAkJaWYgKCFjc3MtPmNocHNbaV0pCiAJCQljb250aW51ZTsKLQkJY2hzY19yZW1vdmVfY2hwX2NtZ19hdHRyKGNzcy0+Y2hwc1tpXSk7CisJCWNocF9yZW1vdmVfY21nX2F0dHIoY3NzLT5jaHBzW2ldKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgaW50CiBfX2Noc2NfZG9fc2VjbShzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzcywgaW50IGVuYWJsZSwgdm9pZCAqcGFnZSkKIHsKQEAgLTExMTgsNyArODE4LDcgQEAKIAkJfSBlbHNlCiAJCQljaHNjX3JlbW92ZV9jbWdfYXR0cihjc3MpOwogCX0KLQlpZiAoZW5hYmxlICYmICFjc3MtPmNtX2VuYWJsZWQpIHsKKwlpZiAoIWNzcy0+Y21fZW5hYmxlZCkgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY3NzLT5jdWJfYWRkcjEpOwogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY3NzLT5jdWJfYWRkcjIpOwogCX0KQEAgLTExMjcsMTA5ICs4MjcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBGaWxlcyBmb3IgdGhlIGNoYW5uZWwgcGF0aCBlbnRyaWVzLgotICovCi1zdGF0aWMgc3NpemVfdAotY2hwX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOwotCi0JaWYgKCFjaHApCi0JCXJldHVybiAwOwotCXJldHVybiAoZ2V0X2NocF9zdGF0dXMoY2hwLT5pZCkgPyBzcHJpbnRmKGJ1ZiwgIm9ubGluZVxuIikgOgotCQlzcHJpbnRmKGJ1ZiwgIm9mZmxpbmVcbiIpKTsKLX0KLQotc3RhdGljIHNzaXplX3QKLWNocF9zdGF0dXNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOwotCWNoYXIgY21kWzEwXTsKLQlpbnQgbnVtX2FyZ3M7Ci0JaW50IGVycm9yOwotCi0JbnVtX2FyZ3MgPSBzc2NhbmYoYnVmLCAiJTVzIiwgY21kKTsKLQlpZiAoIW51bV9hcmdzKQotCQlyZXR1cm4gY291bnQ7Ci0KLQlpZiAoIXN0cm5pY21wKGNtZCwgIm9uIiwgMikpCi0JCWVycm9yID0gczM5MF92YXJ5X2NocGlkKGNwLT5pZCwgMSk7Ci0JZWxzZSBpZiAoIXN0cm5pY21wKGNtZCwgIm9mZiIsIDMpKQotCQllcnJvciA9IHMzOTBfdmFyeV9jaHBpZChjcC0+aWQsIDApOwotCWVsc2UKLQkJZXJyb3IgPSAtRUlOVkFMOwotCi0JcmV0dXJuIGVycm9yIDwgMCA/IGVycm9yIDogY291bnQ7Ci0KLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgMDY0NCwgY2hwX3N0YXR1c19zaG93LCBjaHBfc3RhdHVzX3dyaXRlKTsKLQotc3RhdGljIHNzaXplX3QKLWNocF90eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldik7Ci0KLQlpZiAoIWNocCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGNocC0+ZGVzYy5kZXNjKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHR5cGUsIDA0NDQsIGNocF90eXBlX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdAotY2hwX2NtZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSB0b19jaGFubmVscGF0aChkZXYpOwotCi0JaWYgKCFjaHApCi0JCXJldHVybiAwOwotCWlmIChjaHAtPmNtZyA9PSAtMSkgLyogY2hhbm5lbCBtZWFzdXJlbWVudHMgbm90IGF2YWlsYWJsZSAqLwotCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgY2hwLT5jbWcpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoY21nLCAwNDQ0LCBjaHBfY21nX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdAotY2hwX3NoYXJlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSB0b19jaGFubmVscGF0aChkZXYpOwotCi0JaWYgKCFjaHApCi0JCXJldHVybiAwOwotCWlmIChjaHAtPnNoYXJlZCA9PSAtMSkgLyogY2hhbm5lbCBtZWFzdXJlbWVudHMgbm90IGF2YWlsYWJsZSAqLwotCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgY2hwLT5zaGFyZWQpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoc2hhcmVkLCAwNDQ0LCBjaHBfc2hhcmVkX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGNocF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfdHlwZS5hdHRyLAotCSZkZXZfYXR0cl9jbWcuYXR0ciwKLQkmZGV2X2F0dHJfc2hhcmVkLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNocF9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGNocF9hdHRycywKLX07Ci0KLXN0YXRpYyB2b2lkCi1jaHBfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY3A7Ci0JCi0JY3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOwotCWtmcmVlKGNwKTsKLX0KLQotc3RhdGljIGludAotY2hzY19kZXRlcm1pbmVfY2hhbm5lbF9wYXRoX2Rlc2NyaXB0aW9uKGludCBjaHBpZCwKLQkJCQkJc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjICpkZXNjKQoraW50IGNoc2NfZGV0ZXJtaW5lX2NoYW5uZWxfcGF0aF9kZXNjcmlwdGlvbihzdHJ1Y3QgY2hwX2lkIGNocGlkLAorCQkJCQkgICAgc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjICpkZXNjKQogewogCWludCBjY29kZSwgcmV0OwogCkBAIC0xMjUyLDggKzg1MSw4IEBACiAJc2NwZF9hcmVhLT5yZXF1ZXN0Lmxlbmd0aCA9IDB4MDAxMDsKIAlzY3BkX2FyZWEtPnJlcXVlc3QuY29kZSA9IDB4MDAwMjsKIAotCXNjcGRfYXJlYS0+Zmlyc3RfY2hwaWQgPSBjaHBpZDsKLQlzY3BkX2FyZWEtPmxhc3RfY2hwaWQgPSBjaHBpZDsKKwlzY3BkX2FyZWEtPmZpcnN0X2NocGlkID0gY2hwaWQuaWQ7CisJc2NwZF9hcmVhLT5sYXN0X2NocGlkID0gY2hwaWQuaWQ7CiAKIAljY29kZSA9IGNoc2Moc2NwZF9hcmVhKTsKIAlpZiAoY2NvZGUgPiAwKSB7CkBAIC0xMzE2LDggKzkxNSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1jaHNjX2dldF9jaGFubmVsX21lYXN1cmVtZW50X2NoYXJzKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKK2ludCBjaHNjX2dldF9jaGFubmVsX21lYXN1cmVtZW50X2NoYXJzKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKIHsKIAlpbnQgY2NvZGUsIHJldDsKIApAQCAtMTM0OSw4ICs5NDcsOCBAQAogCXNjbWNfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CiAJc2NtY19hcmVhLT5yZXF1ZXN0LmNvZGUgPSAweDAwMjI7CiAKLQlzY21jX2FyZWEtPmZpcnN0X2NocGlkID0gY2hwLT5pZDsKLQlzY21jX2FyZWEtPmxhc3RfY2hwaWQgPSBjaHAtPmlkOworCXNjbWNfYXJlYS0+Zmlyc3RfY2hwaWQgPSBjaHAtPmNocGlkLmlkOworCXNjbWNfYXJlYS0+bGFzdF9jaHBpZCA9IGNocC0+Y2hwaWQuaWQ7CiAKIAljY29kZSA9IGNoc2Moc2NtY19hcmVhKTsKIAlpZiAoY2NvZGUgPiAwKSB7CkBAIC0xMzkyLDk0ICs5OTAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBFbnRyaWVzIGZvciBjaHBpZHMgb24gdGhlIHN5c3RlbSBidXMuCi0gKiBUaGlzIHJlcGxhY2VzIC9wcm9jL2NocGlkcy4KLSAqLwotc3RhdGljIGludAotbmV3X2NoYW5uZWxfcGF0aChpbnQgY2hwaWQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOwotCWludCByZXQ7Ci0KLQljaHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9wYXRoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaHApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogZmlsbCBpbiBzdGF0dXMsIGV0Yy4gKi8KLQljaHAtPmlkID0gY2hwaWQ7Ci0JY2hwLT5zdGF0ZSA9IDE7Ci0JY2hwLT5kZXYucGFyZW50ID0gJmNzc1swXS0+ZGV2aWNlOwotCWNocC0+ZGV2LnJlbGVhc2UgPSBjaHBfcmVsZWFzZTsKLQlzbnByaW50ZihjaHAtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY2hwMC4leCIsIGNocGlkKTsKLQotCS8qIE9idGFpbiBjaGFubmVsIHBhdGggZGVzY3JpcHRpb24gYW5kIGZpbGwgaXQgaW4uICovCi0JcmV0ID0gY2hzY19kZXRlcm1pbmVfY2hhbm5lbF9wYXRoX2Rlc2NyaXB0aW9uKGNocGlkLCAmY2hwLT5kZXNjKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mcmVlOwotCS8qIEdldCBjaGFubmVsLW1lYXN1cmVtZW50IGNoYXJhY3RlcmlzdGljcy4gKi8KLQlpZiAoY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbCAmJiBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2NtYwotCSAgICAmJiBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2VjbSkgewotCQlyZXQgPSBjaHNjX2dldF9jaGFubmVsX21lYXN1cmVtZW50X2NoYXJzKGNocCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF9mcmVlOwotCX0gZWxzZSB7Ci0JCXN0YXRpYyBpbnQgbXNnX2RvbmU7Ci0KLQkJaWYgKCFtc2dfZG9uZSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBDaGFubmVsIG1lYXN1cmVtZW50cyBub3QgIgotCQkJICAgICAgICJhdmFpbGFibGUsIGNvbnRpbnVpbmcuXG4iKTsKLQkJCW1zZ19kb25lID0gMTsKLQkJfQotCQljaHAtPmNtZyA9IC0xOwotCX0KLQotCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwotCXJldCA9IGRldmljZV9yZWdpc3RlcigmY2hwLT5kZXYpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCByZWdpc3RlciAlMDJ4XG4iLAotCQkgICAgICAgX19mdW5jX18sIGNocGlkKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjaHAtPmRldi5rb2JqLCAmY2hwX2F0dHJfZ3JvdXApOwotCWlmIChyZXQpIHsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJmNocC0+ZGV2KTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0JbXV0ZXhfbG9jaygmY3NzWzBdLT5tdXRleCk7Ci0JaWYgKGNzc1swXS0+Y21fZW5hYmxlZCkgewotCQlyZXQgPSBjaHNjX2FkZF9jaHBfY21nX2F0dHIoY2hwKTsKLQkJaWYgKHJldCkgewotCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjaHAtPmRldi5rb2JqLCAmY2hwX2F0dHJfZ3JvdXApOwotCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmNocC0+ZGV2KTsKLQkJCW11dGV4X3VubG9jaygmY3NzWzBdLT5tdXRleCk7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9Ci0JfQotCWNzc1swXS0+Y2hwc1tjaHBpZF0gPSBjaHA7Ci0JbXV0ZXhfdW5sb2NrKCZjc3NbMF0tPm11dGV4KTsKLQlyZXR1cm4gcmV0Owotb3V0X2ZyZWU6Ci0Ja2ZyZWUoY2hwKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkICoKLWNoc2NfZ2V0X2NocF9kZXNjKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBjaHBfbm8pCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOwotCXN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyAqZGVzYzsKLQotCWNocCA9IGNzc1swXS0+Y2hwc1tzY2gtPnNjaGliLnBtY3cuY2hwaWRbY2hwX25vXV07Ci0JaWYgKCFjaHApCi0JCXJldHVybiBOVUxMOwotCWRlc2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweShkZXNjLCAmY2hwLT5kZXNjLCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjKSk7Ci0JcmV0dXJuIGRlc2M7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0CiBjaHNjX2FsbG9jX3NlaV9hcmVhKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaCBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5oCmluZGV4IDBmYjJiMDIuLjJhZDgxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5oCkBAIC0xLDkgKzEsMTAgQEAKICNpZm5kZWYgUzM5MF9DSFNDX0gKICNkZWZpbmUgUzM5MF9DSFNDX0gKIAotI2RlZmluZSBDSFNDX1NFSV9BQ0NfQ0hQSUQgICAgICAgIDEKLSNkZWZpbmUgQ0hTQ19TRUlfQUNDX0xJTktBRERSICAgICAyCi0jZGVmaW5lIENIU0NfU0VJX0FDQ19GVUxMTElOS0FERFIgMworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CisjaW5jbHVkZSAic2NoaWQuaCIKIAogI2RlZmluZSBDSFNDX1NEQV9PQ19NU1MgICAweDIKIApAQCAtMzMsMjMgKzM0LDkgQEAKIAl1OCBjaHBwOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBjaGFubmVsX3BhdGggewotCWludCBpZDsKLQlpbnQgc3RhdGU7Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjIGRlc2M7Ci0JLyogQ2hhbm5lbC1tZWFzdXJlbWVudCByZWxhdGVkIHN0dWZmOiAqLwotCWludCBjbWc7Ci0JaW50IHNoYXJlZDsKLQl2b2lkICpjbWdfY2hhcnM7Ci0Jc3RydWN0IGRldmljZSBkZXY7Ci19Oworc3RydWN0IGNoYW5uZWxfcGF0aDsKIAotZXh0ZXJuIHZvaWQgczM5MF9wcm9jZXNzX2Nzcyggdm9pZCApOwotZXh0ZXJuIHZvaWQgY2hzY192YWxpZGF0ZV9jaHBpZHMoc3RydWN0IHN1YmNoYW5uZWwgKik7Ci1leHRlcm4gdm9pZCBjaHBpZF9pc19hY3R1YWxseV9vbmxpbmUoaW50KTsKLWV4dGVybiBpbnQgY3NzX2dldF9zc2RfaW5mbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKLWV4dGVybiBpbnQgY2hzY19wcm9jZXNzX2Nydyh2b2lkKTsKLWV4dGVybiBpbnQgY2hwX3Byb2Nlc3NfY3J3KGludCwgaW50KTsKK2V4dGVybiB2b2lkIGNoc2NfcHJvY2Vzc19jcncodm9pZCk7CiAKIHN0cnVjdCBjc3NfZ2VuZXJhbF9jaGFyIHsKIAl1NjQgOiA0MTsKQEAgLTgyLDE1ICs2OSwyNiBAQAogZXh0ZXJuIHN0cnVjdCBjc3NfZ2VuZXJhbF9jaGFyIGNzc19nZW5lcmFsX2NoYXJhY3RlcmlzdGljczsKIGV4dGVybiBzdHJ1Y3QgY3NzX2Noc2NfY2hhciBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3M7CiAKK3N0cnVjdCBjaHNjX3NzZF9pbmZvIHsKKwl1OCBwYXRoX21hc2s7CisJdTggZmxhX3ZhbGlkX21hc2s7CisJc3RydWN0IGNocF9pZCBjaHBpZFs4XTsKKwl1MTYgZmxhWzhdOworfTsKK2V4dGVybiBpbnQgY2hzY19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsCisJCQkgICAgIHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QpOwogZXh0ZXJuIGludCBjaHNjX2RldGVybWluZV9jc3NfY2hhcmFjdGVyaXN0aWNzKHZvaWQpOwogZXh0ZXJuIGludCBjc3NfY2hhcmFjdGVyaXN0aWNzX2F2YWlsOwogCi1leHRlcm4gdm9pZCAqY2hzY19nZXRfY2hwX2Rlc2Moc3RydWN0IHN1YmNoYW5uZWwqLCBpbnQpOwotCiBleHRlcm4gaW50IGNoc2NfZW5hYmxlX2ZhY2lsaXR5KGludCk7CiBzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW07CiBleHRlcm4gaW50IGNoc2Nfc2VjbShzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKiwgaW50KTsKIAotI2RlZmluZSB0b19jaGFubmVscGF0aChkZXZpY2UpIGNvbnRhaW5lcl9vZihkZXZpY2UsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldikKK2ludCBjaHNjX2NocF92YXJ5KHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBvbik7CitpbnQgY2hzY19kZXRlcm1pbmVfY2hhbm5lbF9wYXRoX2Rlc2NyaXB0aW9uKHN0cnVjdCBjaHBfaWQgY2hwaWQsCisJCQkJCSAgICBzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MgKmRlc2MpOwordm9pZCBjaHNjX2NocF9vbmxpbmUoc3RydWN0IGNocF9pZCBjaHBpZCk7Cit2b2lkIGNoc2NfY2hwX29mZmxpbmUoc3RydWN0IGNocF9pZCBjaHBpZCk7CitpbnQgY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDljYjEyOWEuLmVhMWRlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogI2luY2x1ZGUgPGFzbS9pcGwuaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KICNpbmNsdWRlICJhaXJxLmgiCiAjaW5jbHVkZSAiY2lvLmgiCiAjaW5jbHVkZSAiY3NzLmgiCkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSAiaW9hc20uaCIKICNpbmNsdWRlICJibGFja2xpc3QuaCIKICNpbmNsdWRlICJjaW9fZGVidWcuaCIKKyNpbmNsdWRlICJjaHAuaCIKICNpbmNsdWRlICIuLi9zMzkwbWFjaC5oIgogCiBkZWJ1Z19pbmZvX3QgKmNpb19kZWJ1Z19tc2dfaWQ7CkBAIC01OTIsOSArNTk0LDEwIEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KLQlzY2gtPm9wbSA9IDB4ZmY7Ci0JaWYgKCFjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkKLQkJY2hzY192YWxpZGF0ZV9jaHBpZHMoc2NoKTsKKwlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCisJCXNjaC0+b3BtID0gMHhmZjsKKwllbHNlCisJCXNjaC0+b3BtID0gY2hwX2dldF9zY2hfb3BtKHNjaCk7CiAJc2NoLT5scG0gPSBzY2gtPnNjaGliLnBtY3cucGFtICYgc2NoLT5vcG07CiAKIAlDSU9fREVCVUcoS0VSTl9JTkZPLCAwLApAQCAtOTU0LDYgKzk1Nyw3IEBACiB7CiAJaW50IGksIHJldDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOwogCiAJLyogUmVzZXQgc3ViY2hhbm5lbHMuICovCiAJZm9yX2VhY2hfc3ViY2hhbm5lbChfX3NodXRkb3duX3N1YmNoYW5uZWxfZWFzeSwgIE5VTEwpOwpAQCAtOTYzLDggKzk2NywxMCBAQAogCV9fY3RsX3NldF9iaXQoMTQsIDI4KTsKIAkvKiBUZW1wb3JhcmlseSByZWVuYWJsZSBtYWNoaW5lIGNoZWNrcy4gKi8KIAlsb2NhbF9tY2NrX2VuYWJsZSgpOworCWNocF9pZF9pbml0KCZjaHBpZCk7CiAJZm9yIChpID0gMDsgaSA8PSBfX01BWF9DSFBJRDsgaSsrKSB7Ci0JCXJldCA9IHJjaHAoaSk7CisJCWNocGlkLmlkID0gaTsKKwkJcmV0ID0gcmNocChjaHBpZCk7CiAJCWlmICgocmV0ID09IDApIHx8IChyZXQgPT0gMikpCiAJCQkvKgogCQkJICogcmNocCBlaXRoZXIgc3VjY2VlZGVkLCBvciBhbm90aGVyIHJjaHAgaXMgYWxyZWFkeQpAQCAtMTA0OCwzNyArMTA1NCwxOSBAQAogCWRvX3JlaXBsX2FzbSgqKChfX3UzMiopJnNjaGlkKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NoaWIgX19pbml0ZGF0YSBpcGxfc2NoaWI7Ci0KLS8qCi0gKiBpcGxfc2F2ZV9wYXJhbWV0ZXJzIGdldHMgY2FsbGVkIHZlcnkgZWFybHkuIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcwotICogYW55dGhpbmcgaW4gdGhlIGJzcyBzZWN0aW9uIGF0IGFsbC4gVGhlIGJzcyBzZWN0aW9uIGlzIG5vdCBjbGVhcmVkIHlldCwKLSAqIGJ1dCBtYXkgY29udGFpbiBzb21lIGlwbCBwYXJhbWV0ZXJzIHdyaXR0ZW4gYnkgdGhlIGZpcm13YXJlLgotICogVGhlc2UgcGFyYW1ldGVycyAoaWYgcHJlc2VudCkgYXJlIGNvcGllZCB0byAweDIwMDAuCi0gKiBUbyBhdm9pZCBjb3JydXB0aW9uIG9mIHRoZSBpcGwgcGFyYW1ldGVycywgYWxsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoaXMKLSAqIGZ1bmN0aW9uIG11c3QgcmVzaWRlIG9uIHRoZSBzdGFjayBvciBpbiB0aGUgZGF0YSBzZWN0aW9uLgotICovCi12b2lkIGlwbF9zYXZlX3BhcmFtZXRlcnModm9pZCkKK2ludCBfX2luaXQgY2lvX2dldF9pcGxpbmZvKHN0cnVjdCBjaW9faXBsaW5mbyAqaXBsaW5mbykKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKLQl1bnNpZ25lZCBpbnQgKmlwbF9wdHI7Ci0Jdm9pZCAqc3JjLCAqZHN0OworCXN0cnVjdCBzY2hpYiBzY2hpYjsKIAogCXNjaGlkID0gKihzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCAqKV9fTENfU1VCQ0hBTk5FTF9JRDsKIAlpZiAoIXNjaGlkLm9uZSkKLQkJcmV0dXJuOwotCWlmIChzdHNjaChzY2hpZCwgJmlwbF9zY2hpYikpCi0JCXJldHVybjsKLQlpZiAoIWlwbF9zY2hpYi5wbWN3LmRudikKLQkJcmV0dXJuOwotCWlwbF9kZXZubyA9IGlwbF9zY2hpYi5wbWN3LmRldjsKLQlpcGxfZmxhZ3MgfD0gSVBMX0RFVk5PX1ZBTElEOwotCWlmICghaXBsX3NjaGliLnBtY3cucWYpCi0JCXJldHVybjsKLQlpcGxfZmxhZ3MgfD0gSVBMX1BBUk1CTE9DS19WQUxJRDsKLQlpcGxfcHRyID0gKHVuc2lnbmVkIGludCAqKV9fTENfSVBMX1BBUk1CTE9DS19QVFI7Ci0Jc3JjID0gKHZvaWQgKikodW5zaWduZWQgbG9uZykqaXBsX3B0cjsKLQlkc3QgPSAodm9pZCAqKUlQTF9QQVJNQkxPQ0tfT1JJR0lOOwotCW1lbW1vdmUoZHN0LCBzcmMsIFBBR0VfU0laRSk7Ci0JKmlwbF9wdHIgPSBJUExfUEFSTUJMT0NLX09SSUdJTjsKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHN0c2NoKHNjaGlkLCAmc2NoaWIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXNjaGliLnBtY3cuZG52KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpcGxpbmZvLT5kZXZubyA9IHNjaGliLnBtY3cuZGV2OworCWlwbGluZm8tPmlzX3FkaW8gPSBzY2hpYi5wbWN3LnFmOworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKaW5kZXggMzUxNTRhMi4uNzQ0NmMzOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uaApAQCAtMSwxOCArMSwxMSBAQAogI2lmbmRlZiBTMzkwX0NJT19ICiAjZGVmaW5lIFMzOTBfQ0lPX0gKIAotI2luY2x1ZGUgInNjaGlkLmgiCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotLyoKLSAqIHdoZXJlIHdlIHB1dCB0aGUgc3NkIGluZm8KLSAqLwotc3RydWN0IHNzZF9pbmZvIHsKLQlfX3U4ICB2YWxpZDoxOwotCV9fdTggIHR5cGU6NzsJCS8qIHN1YmNoYW5uZWwgdHlwZSAqLwotCV9fdTggIGNocGlkWzhdOwkJLyogY2hwaWRzICovCi0JX191MTYgZmxhWzhdOwkJLyogZnVsbCBsaW5rIGFkZHJlc3NlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CisjaW5jbHVkZSAiY2hzYy5oIgorI2luY2x1ZGUgInNjaGlkLmgiCiAKIC8qCiAgKiBwYXRoIG1hbmFnZW1lbnQgY29udHJvbCB3b3JkCkBAIC0xMDgsNyArMTAxLDcgQEAKIAlzdHJ1Y3Qgc2NoaWIgc2NoaWI7CS8qIHN1YmNoYW5uZWwgaW5mb3JtYXRpb24gYmxvY2sgKi8KIAlzdHJ1Y3Qgb3JiIG9yYjsJCS8qIG9wZXJhdGlvbiByZXF1ZXN0IGJsb2NrICovCiAJc3RydWN0IGNjdzEgc2Vuc2VfY2N3OwkvKiBzdGF0aWMgY2N3IGZvciBzZW5zZSBjb21tYW5kICovCi0Jc3RydWN0IHNzZF9pbmZvIHNzZF9pbmZvOwkvKiBzdWJjaGFubmVsIGRlc2NyaXB0aW9uICovCisJc3RydWN0IGNoc2Nfc3NkX2luZm8gc3NkX2luZm87CS8qIHN1YmNoYW5uZWwgZGVzY3JpcHRpb24gKi8KIAlzdHJ1Y3QgZGV2aWNlIGRldjsJLyogZW50cnkgaW4gZGV2aWNlIHRyZWUgKi8KIAlzdHJ1Y3QgY3NzX2RyaXZlciAqZHJpdmVyOwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jbWYuYyBiL2RyaXZlcnMvczM5MC9jaW8vY21mLmMKaW5kZXggOTBiMjJmYS4uMjhhYmQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jbWYuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2NtZi5jCkBAIC00NzYsNyArNDc2LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY21iX2FyZWEgY21iX2FyZWEgPSB7Ci0JLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChjbWJfYXJlYS5sb2NrKSwKIAkubGlzdCA9IExJU1RfSEVBRF9JTklUKGNtYl9hcmVhLmxpc3QpLAogCS5udW1fY2hhbm5lbHMgID0gMTAyNCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwppbmRleCBmZTBhY2U3Li4yN2M2ZDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKQEAgLTIwLDggKzIwLDkgQEAKICNpbmNsdWRlICJpb2FzbS5oIgogI2luY2x1ZGUgImNoc2MuaCIKICNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJpZHNldC5oIgorI2luY2x1ZGUgImNocC5oIgogCi1pbnQgbmVlZF9yZXNjYW4gPSAwOwogaW50IGNzc19pbml0X2RvbmUgPSAwOwogc3RhdGljIGludCBuZWVkX3JlcHJvYmUgPSAwOwogc3RhdGljIGludCBtYXhfc3NpZCA9IDA7CkBAIC0xMjUsOCArMTI2LDUyIEBACiAJbXV0ZXhfdW5sb2NrKCZzY2gtPnJlZ19tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQKLWNzc19yZWdpc3Rlcl9zdWJjaGFubmVsKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCitzdGF0aWMgdm9pZCBzc2RfZnJvbV9wbWN3KHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QsIHN0cnVjdCBwbWN3ICpwbWN3KQoreworCWludCBpOworCWludCBtYXNrOworCisJbWVtc2V0KHNzZCwgMCwgc2l6ZW9mKHN0cnVjdCBjaHNjX3NzZF9pbmZvKSk7CisJc3NkLT5wYXRoX21hc2sgPSBwbWN3LT5waW07CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltYXNrID0gMHg4MCA+PiBpOworCQlpZiAocG1jdy0+cGltICYgbWFzaykgeworCQkJY2hwX2lkX2luaXQoJnNzZC0+Y2hwaWRbaV0pOworCQkJc3NkLT5jaHBpZFtpXS5pZCA9IHBtY3ctPmNocGlkW2ldOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzc2RfcmVnaXN0ZXJfY2hwaWRzKHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QpCit7CisJaW50IGk7CisJaW50IG1hc2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW1hc2sgPSAweDgwID4+IGk7CisJCWlmIChzc2QtPnBhdGhfbWFzayAmIG1hc2spCisJCQlpZiAoIWNocF9pc19yZWdpc3RlcmVkKHNzZC0+Y2hwaWRbaV0pKQorCQkJCWNocF9uZXcoc3NkLT5jaHBpZFtpXSk7CisJfQorfQorCit2b2lkIGNzc191cGRhdGVfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGNpb19pc19jb25zb2xlKHNjaC0+c2NoaWQpKSB7CisJCS8qIENvbnNvbGUgaXMgaW5pdGlhbGl6ZWQgdG9vIGVhcmx5IGZvciBmdW5jdGlvbnMgcmVxdWlyaW5nCisJCSAqIG1lbW9yeSBhbGxvY2F0aW9uLiAqLworCQlzc2RfZnJvbV9wbWN3KCZzY2gtPnNzZF9pbmZvLCAmc2NoLT5zY2hpYi5wbWN3KTsKKwl9IGVsc2UgeworCQlyZXQgPSBjaHNjX2dldF9zc2RfaW5mbyhzY2gtPnNjaGlkLCAmc2NoLT5zc2RfaW5mbyk7CisJCWlmIChyZXQpCisJCQlzc2RfZnJvbV9wbWN3KCZzY2gtPnNzZF9pbmZvLCAmc2NoLT5zY2hpYi5wbWN3KTsKKwkJc3NkX3JlZ2lzdGVyX2NocGlkcygmc2NoLT5zc2RfaW5mbyk7CisJfQorfQorCitzdGF0aWMgaW50IGNzc19yZWdpc3Rlcl9zdWJjaGFubmVsKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7CiAJaW50IHJldDsKIApAQCAtMTM1LDkgKzE4MCw3IEBACiAJc2NoLT5kZXYuYnVzID0gJmNzc19idXNfdHlwZTsKIAlzY2gtPmRldi5yZWxlYXNlID0gJmNzc19zdWJjaGFubmVsX3JlbGVhc2U7CiAJc2NoLT5kZXYuZ3JvdXBzID0gc3ViY2hfYXR0cl9ncm91cHM7Ci0KLQljc3NfZ2V0X3NzZF9pbmZvKHNjaCk7Ci0KKwljc3NfdXBkYXRlX3NzZF9pbmZvKHNjaCk7CiAJLyogbWFrZSBpdCBrbm93biB0byB0aGUgc3lzdGVtICovCiAJcmV0ID0gY3NzX3NjaF9kZXZpY2VfcmVnaXN0ZXIoc2NoKTsKIAlpZiAocmV0KSB7CkBAIC0zMDYsNyArMzQ5LDcgQEAKIAlyZXR1cm4gY3NzX3Byb2JlX2RldmljZShzY2hpZCk7CiB9CiAKLXN0YXRpYyBpbnQgY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIGludCBzbG93KQorc3RhdGljIHZvaWQgY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIGludCBzbG93KQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IHJldDsKQEAgLTMxNyw1MyArMzYwLDY2IEBACiAJCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKIAl9IGVsc2UKIAkJcmV0ID0gY3NzX2V2YWx1YXRlX25ld19zdWJjaGFubmVsKHNjaGlkLCBzbG93KTsKLQotCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAtRUFHQUlOKQorCQljc3Nfc2NoZWR1bGVfZXZhbChzY2hpZCk7CiB9CiAKLXN0YXRpYyBpbnQKLWNzc19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgaWRzZXQgKnNsb3dfc3ViY2hhbm5lbF9zZXQ7CitzdGF0aWMgc3BpbmxvY2tfdCBzbG93X3N1YmNoYW5uZWxfbG9jazsKKworc3RhdGljIGludCBfX2luaXQgc2xvd19zdWJjaGFubmVsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwoc2NoaWQsIDEpOwotfQotCi1zdHJ1Y3Qgc2xvd19zdWJjaGFubmVsIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNsb3dfbGlzdDsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoc2xvd19zdWJjaGFubmVsc19oZWFkKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2xvd19zdWJjaGFubmVsX2xvY2spOwotCi1zdGF0aWMgdm9pZAotY3NzX3RyaWdnZXJfc2xvd19wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQotewotCUNJT19UUkFDRV9FVkVOVCg0LCAic2xvd3BhdGgiKTsKLQotCWlmIChuZWVkX3Jlc2NhbikgewotCQluZWVkX3Jlc2NhbiA9IDA7Ci0JCWZvcl9lYWNoX3N1YmNoYW5uZWwoY3NzX3Jlc2Nhbl9kZXZpY2VzLCBOVUxMKTsKLQkJcmV0dXJuOworCXNwaW5fbG9ja19pbml0KCZzbG93X3N1YmNoYW5uZWxfbG9jayk7CisJc2xvd19zdWJjaGFubmVsX3NldCA9IGlkc2V0X3NjaF9uZXcoKTsKKwlpZiAoIXNsb3dfc3ViY2hhbm5lbF9zZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBjb3VsZCBub3QgYWxsb2NhdGUgc2xvdyBzdWJjaGFubmVsICIKKwkJICAgICAgICJzZXRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJcmV0dXJuIDA7Cit9CiAKK3N1YnN5c19pbml0Y2FsbChzbG93X3N1YmNoYW5uZWxfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGNzc19zbG93X3BhdGhfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKKworCUNJT19UUkFDRV9FVkVOVCg0LCAic2xvd3BhdGgiKTsKIAlzcGluX2xvY2tfaXJxKCZzbG93X3N1YmNoYW5uZWxfbG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzbG93X3N1YmNoYW5uZWxzX2hlYWQpKSB7Ci0JCXN0cnVjdCBzbG93X3N1YmNoYW5uZWwgKnNsb3dfc2NoID0KLQkJCWxpc3RfZW50cnkoc2xvd19zdWJjaGFubmVsc19oZWFkLm5leHQsCi0JCQkJICAgc3RydWN0IHNsb3dfc3ViY2hhbm5lbCwgc2xvd19saXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KHNsb3dfc3ViY2hhbm5lbHNfaGVhZC5uZXh0KTsKKwlpbml0X3N1YmNoYW5uZWxfaWQoJnNjaGlkKTsKKwl3aGlsZSAoaWRzZXRfc2NoX2dldF9maXJzdChzbG93X3N1YmNoYW5uZWxfc2V0LCAmc2NoaWQpKSB7CisJCWlkc2V0X3NjaF9kZWwoc2xvd19zdWJjaGFubmVsX3NldCwgc2NoaWQpOwogCQlzcGluX3VubG9ja19pcnEoJnNsb3dfc3ViY2hhbm5lbF9sb2NrKTsKLQkJY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwoc2xvd19zY2gtPnNjaGlkLCAxKTsKKwkJY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwoc2NoaWQsIDEpOwogCQlzcGluX2xvY2tfaXJxKCZzbG93X3N1YmNoYW5uZWxfbG9jayk7Ci0JCWtmcmVlKHNsb3dfc2NoKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZzbG93X3N1YmNoYW5uZWxfbG9jayk7CiB9CiAKLURFQ0xBUkVfV09SSyhzbG93X3BhdGhfd29yaywgY3NzX3RyaWdnZXJfc2xvd19wYXRoKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoc2xvd19wYXRoX3dvcmssIGNzc19zbG93X3BhdGhfZnVuYyk7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc2xvd19wYXRoX3dxOwogCit2b2lkIGNzc19zY2hlZHVsZV9ldmFsKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKKwlpZHNldF9zY2hfYWRkKHNsb3dfc3ViY2hhbm5lbF9zZXQsIHNjaGlkKTsKKwlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGNzc19zY2hlZHVsZV9ldmFsX2FsbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKKwlpZHNldF9maWxsKHNsb3dfc3ViY2hhbm5lbF9zZXQpOworCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmc2xvd19wYXRoX3dvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb3dfc3ViY2hhbm5lbF9sb2NrLCBmbGFncyk7Cit9CisKIC8qIFJlcHJvYmUgc3ViY2hhbm5lbCBpZiB1bnJlZ2lzdGVyZWQuICovCiBzdGF0aWMgaW50IHJlcHJvYmVfc3ViY2hhbm5lbChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCwgdm9pZCAqZGF0YSkKIHsKQEAgLTQyNiwzMyArNDgyLDE0IEBACiBFWFBPUlRfU1lNQk9MX0dQTChjc3Nfc2NoZWR1bGVfcmVwcm9iZSk7CiAKIC8qCi0gKiBSZXNjYW4gZm9yIG5ldyBkZXZpY2VzLiBGSVhNRTogVGhpcyBpcyBzbG93LgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGxvc3QgQ1JXcyBkdWUgdG8gb3ZlcmZsb3dzIGFuZCB3ZSBoYXZlCi0gKiB0byBkbyBzdWJjaGFubmVsIGhvdXNla2VlcGluZy4KLSAqLwotdm9pZAotY3NzX3JlaXRlcmF0ZV9zdWJjaGFubmVscyh2b2lkKQotewotCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCW5lZWRfcmVzY2FuID0gMTsKLX0KLQotLyoKICAqIENhbGxlZCBmcm9tIHRoZSBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgZm9yIHN1YmNoYW5uZWwgcmVwb3J0IHdvcmRzLgogICovCi1pbnQKLWNzc19wcm9jZXNzX2NydyhpbnQgcnNpZDEsIGludCByc2lkMikKK3ZvaWQgY3NzX3Byb2Nlc3NfY3J3KGludCByc2lkMSwgaW50IHJzaWQyKQogewotCWludCByZXQ7CiAJc3RydWN0IHN1YmNoYW5uZWxfaWQgbWNoa19zY2hpZDsKIAogCUNJT19DUldfRVZFTlQoMiwgInNvdXJjZSBpcyBzdWJjaGFubmVsICUwNFgsIHN1YnN5c3RlbSBpZCAleFxuIiwKIAkJICAgICAgcnNpZDEsIHJzaWQyKTsKLQotCWlmIChuZWVkX3Jlc2NhbikKLQkJLyogV2UgbmVlZCB0byBpdGVyYXRlIGFsbCBzdWJjaGFubmVscyBhbnl3YXkuICovCi0JCXJldHVybiAtRUFHQUlOOwotCiAJaW5pdF9zdWJjaGFubmVsX2lkKCZtY2hrX3NjaGlkKTsKIAltY2hrX3NjaGlkLnNjaF9ubyA9IHJzaWQxOwogCWlmIChyc2lkMiAhPSAwKQpAQCAtNDYzLDE0ICs1MDAsNyBAQAogCSAqIHVzZSBzdHNjaCgpIHRvIGZpbmQgb3V0IGlmIHRoZSBzdWJjaGFubmVsIGluIHF1ZXN0aW9uIGhhcyBjb21lCiAJICogb3IgZ29uZS4KIAkgKi8KLQlyZXQgPSBjc3NfZXZhbHVhdGVfc3ViY2hhbm5lbChtY2hrX3NjaGlkLCAwKTsKLQlpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJaWYgKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhtY2hrX3NjaGlkKSkgewotCQkJY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KCk7Ci0JCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKKwljc3NfZXZhbHVhdGVfc3ViY2hhbm5lbChtY2hrX3NjaGlkLCAwKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQKQEAgLTc0NSw0NyArNzc1LDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKGluaXRfY2hhbm5lbF9zdWJzeXN0ZW0pOwogCi1pbnQKLWNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKLXsKLQlzdHJ1Y3Qgc2xvd19zdWJjaGFubmVsICpuZXdfc2xvd19zY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW5ld19zbG93X3NjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbG93X3N1YmNoYW5uZWwpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW5ld19zbG93X3NjaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbmV3X3Nsb3dfc2NoLT5zY2hpZCA9IHNjaGlkOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm5ld19zbG93X3NjaC0+c2xvd19saXN0LCAmc2xvd19zdWJjaGFubmVsc19oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi12b2lkCi1jc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3Qodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNsb3dfc3ViY2hhbm5lbF9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzbG93X3N1YmNoYW5uZWxzX2hlYWQpKSB7Ci0JCXN0cnVjdCBzbG93X3N1YmNoYW5uZWwgKnNsb3dfc2NoID0KLQkJCWxpc3RfZW50cnkoc2xvd19zdWJjaGFubmVsc19oZWFkLm5leHQsCi0JCQkJICAgc3RydWN0IHNsb3dfc3ViY2hhbm5lbCwgc2xvd19saXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KHNsb3dfc3ViY2hhbm5lbHNfaGVhZC5uZXh0KTsKLQkJa2ZyZWUoc2xvd19zY2gpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotfQotCi0KLQotaW50Ci1jc3Nfc2xvd19zdWJjaGFubmVsc19leGlzdCh2b2lkKQotewotCXJldHVybiAoIWxpc3RfZW1wdHkoJnNsb3dfc3ViY2hhbm5lbHNfaGVhZCkpOwotfQotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBFWFBPUlRfU1lNQk9MKGNzc19idXNfdHlwZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChjc3NfY2hhcmFjdGVyaXN0aWNzX2F2YWlsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IGNhMmJhYjkuLjcxZmNmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtNCw4ICs0LDExIEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9jaW8uaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KIAogI2luY2x1ZGUgInNjaGlkLmgiCiAKQEAgLTE0MywxMyArMTQ2LDEyIEBACiBleHRlcm4gc3RydWN0IHN1YmNoYW5uZWwgKiBnZXRfc3ViY2hhbm5lbF9ieV9zY2hpZChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCk7CiBleHRlcm4gaW50IGNzc19pbml0X2RvbmU7CiBleHRlcm4gaW50IGZvcl9lYWNoX3N1YmNoYW5uZWwoaW50KCpmbikoc3RydWN0IHN1YmNoYW5uZWxfaWQsIHZvaWQgKiksIHZvaWQgKik7Ci1leHRlcm4gaW50IGNzc19wcm9jZXNzX2NydyhpbnQsIGludCk7CitleHRlcm4gdm9pZCBjc3NfcHJvY2Vzc19jcncoaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgY3NzX3JlaXRlcmF0ZV9zdWJjaGFubmVscyh2b2lkKTsKK3ZvaWQgY3NzX3VwZGF0ZV9zc2RfaW5mbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKIAogI2RlZmluZSBfX01BWF9TVUJDSEFOTkVMIDY1NTM1CiAjZGVmaW5lIF9fTUFYX1NTSUQgMwotI2RlZmluZSBfX01BWF9DSFBJRCAyNTUKLSNkZWZpbmUgX19NQVhfQ1NTSUQgMAogCiBzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gewogCXU4IGNzc2lkOwpAQCAtMTg1LDE2ICsxODcsMTIgQEAKIHZvaWQgZGV2aWNlX2tpbGxfcGVuZGluZ190aW1lcihzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIAogLyogSGVscGVyIGZ1bmN0aW9ucyB0byBidWlsZCBsaXN0cyBmb3IgdGhlIHNsb3cgcGF0aC4gKi8KLWV4dGVybiBpbnQgY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKTsKLXZvaWQgY3NzX3dhbGtfc3ViY2hhbm5lbF9zbG93X2xpc3Qodm9pZCAoKmZuKSh1bnNpZ25lZCBsb25nKSk7Ci12b2lkIGNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCh2b2lkKTsKLWludCBjc3Nfc2xvd19zdWJjaGFubmVsc19leGlzdCh2b2lkKTsKLWV4dGVybiBpbnQgbmVlZF9yZXNjYW47Cit2b2lkIGNzc19zY2hlZHVsZV9ldmFsKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKTsKK3ZvaWQgY3NzX3NjaGVkdWxlX2V2YWxfYWxsKHZvaWQpOwogCiBpbnQgc2NoX2lzX3BzZXVkb19zY2goc3RydWN0IHN1YmNoYW5uZWwgKik7CiAKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc2xvd19wYXRoX3dxOwotZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBzbG93X3BhdGhfd29yazsKIAogaW50IHN1YmNoYW5uZWxfYWRkX2ZpbGVzIChzdHJ1Y3QgZGV2aWNlICopOwogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnN1YmNoX2F0dHJfZ3JvdXBzW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwppbmRleCBlMzIyMTExLi4wMzM1NTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKQEAgLTU2LDEzICs1NiwxMiBAQAogLyogU3RvcmUgbW9kYWxpYXMgc3RyaW5nIGRlbGltaXRlZCBieSBwcmVmaXgvc3VmZml4IHN0cmluZyBpbnRvIGJ1ZmZlciB3aXRoCiAgKiBzcGVjaWZpZWQgc2l6ZS4gUmV0dXJuIGxlbmd0aCBvZiByZXN1bHRpbmcgc3RyaW5nIChleGNsdWRpbmcgdHJhaWxpbmcgJ1wwJykKICAqIGV2ZW4gaWYgc3RyaW5nIGRvZXNuJ3QgZml0IGJ1ZmZlciAoc25wcmludGYgc2VtYW50aWNzKS4gKi8KLXN0YXRpYyBpbnQgc25wcmludF9hbGlhcyhjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpwcmVmaXgsCitzdGF0aWMgaW50IHNucHJpbnRfYWxpYXMoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwKIAkJCSBzdHJ1Y3QgY2N3X2RldmljZV9pZCAqaWQsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKIHsKIAlpbnQgbGVuOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBzaXplLCAiJXNjY3c6dCUwNFhtJTAyWCIsIHByZWZpeCwgaWQtPmN1X3R5cGUsCi0JCSAgICAgICBpZC0+Y3VfbW9kZWwpOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgImNjdzp0JTA0WG0lMDJYIiwgaWQtPmN1X3R5cGUsIGlkLT5jdV9tb2RlbCk7CiAJaWYgKGxlbiA+IHNpemUpCiAJCXJldHVybiBsZW47CiAJYnVmICs9IGxlbjsKQEAgLTg1LDUzICs4NCw0MCBAQAogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CiAJc3RydWN0IGNjd19kZXZpY2VfaWQgKmlkID0gJihjZGV2LT5pZCk7CiAJaW50IGkgPSAwOwotCWludCBsZW47CisJaW50IGxlbiA9IDA7CisJaW50IHJldDsKKwljaGFyIG1vZGFsaWFzX2J1ZlszMF07CiAKIAkvKiBDVV9UWVBFPSAqLwotCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJDVV9UWVBFPSUwNFgiLCBpZC0+Y3VfdHlwZSkgKyAxOwotCWlmIChsZW4gPiBidWZmZXJfc2l6ZSB8fCBpID49IG51bV9lbnZwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllbnZwW2krK10gPSBidWZmZXI7Ci0JYnVmZmVyICs9IGxlbjsKLQlidWZmZXJfc2l6ZSAtPSBsZW47CisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuLAorCQkJICAgICAiQ1VfVFlQRT0lMDRYIiwgaWQtPmN1X3R5cGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBDVV9NT0RFTD0gKi8KLQlsZW4gPSBzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiQ1VfTU9ERUw9JTAyWCIsIGlkLT5jdV9tb2RlbCkgKyAxOwotCWlmIChsZW4gPiBidWZmZXJfc2l6ZSB8fCBpID49IG51bV9lbnZwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllbnZwW2krK10gPSBidWZmZXI7Ci0JYnVmZmVyICs9IGxlbjsKLQlidWZmZXJfc2l6ZSAtPSBsZW47CisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuLAorCQkJICAgICAiQ1VfTU9ERUw9JTAyWCIsIGlkLT5jdV9tb2RlbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIFRoZSBuZXh0IHR3byBjYW4gYmUgemVybywgdGhhdCdzIG9rIGZvciB1cyAqLwogCS8qIERFVl9UWVBFPSAqLwotCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJERVZfVFlQRT0lMDRYIiwgaWQtPmRldl90eXBlKSArIDE7Ci0JaWYgKGxlbiA+IGJ1ZmZlcl9zaXplIHx8IGkgPj0gbnVtX2VudnApCi0JCXJldHVybiAtRU5PTUVNOwotCWVudnBbaSsrXSA9IGJ1ZmZlcjsKLQlidWZmZXIgKz0gbGVuOwotCWJ1ZmZlcl9zaXplIC09IGxlbjsKKwlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW4sCisJCQkgICAgICJERVZfVFlQRT0lMDRYIiwgaWQtPmRldl90eXBlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogREVWX01PREVMPSAqLwotCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJERVZfTU9ERUw9JTAyWCIsCi0JCQkodW5zaWduZWQgY2hhcikgaWQtPmRldl9tb2RlbCkgKyAxOwotCWlmIChsZW4gPiBidWZmZXJfc2l6ZSB8fCBpID49IG51bV9lbnZwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllbnZwW2krK10gPSBidWZmZXI7Ci0JYnVmZmVyICs9IGxlbjsKLQlidWZmZXJfc2l6ZSAtPSBsZW47CisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuLAorCQkJICAgICAiREVWX01PREVMPSUwMlgiLCBpZC0+ZGV2X21vZGVsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogTU9EQUxJQVM9ICAqLwotCWxlbiA9IHNucHJpbnRfYWxpYXMoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIk1PREFMSUFTPSIsIGlkLCAiIikgKyAxOwotCWlmIChsZW4gPiBidWZmZXJfc2l6ZSB8fCBpID49IG51bV9lbnZwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllbnZwW2krK10gPSBidWZmZXI7Ci0JYnVmZmVyICs9IGxlbjsKLQlidWZmZXJfc2l6ZSAtPSBsZW47Ci0KLQllbnZwW2ldID0gTlVMTDsKLQotCXJldHVybiAwOworCXNucHJpbnRfYWxpYXMobW9kYWxpYXNfYnVmLCBzaXplb2YobW9kYWxpYXNfYnVmKSwgaWQsICIiKTsKKwlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW4sCisJCQkgICAgICJNT0RBTElBUz0lcyIsIG1vZGFsaWFzX2J1Zik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RydWN0IGJ1c190eXBlIGNjd19idXNfdHlwZTsKQEAgLTIzMCwxMiArMjE2LDE4IEBACiBjaHBpZHNfc2hvdyAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpCiB7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKLQlzdHJ1Y3Qgc3NkX2luZm8gKnNzZCA9ICZzY2gtPnNzZF9pbmZvOworCXN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QgPSAmc2NoLT5zc2RfaW5mbzsKIAlzc2l6ZV90IHJldCA9IDA7CiAJaW50IGNocDsKKwlpbnQgbWFzazsKIAotCWZvciAoY2hwID0gMDsgY2hwIDwgODsgY2hwKyspCi0JCXJldCArPSBzcHJpbnRmIChidWYrcmV0LCAiJTAyeCAiLCBzc2QtPmNocGlkW2NocF0pOworCWZvciAoY2hwID0gMDsgY2hwIDwgODsgY2hwKyspIHsKKwkJbWFzayA9IDB4ODAgPj4gY2hwOworCQlpZiAoc3NkLT5wYXRoX21hc2sgJiBtYXNrKQorCQkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiJTAyeCAiLCBzc2QtPmNocGlkW2NocF0uaWQpOworCQllbHNlCisJCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICIwMCAiKTsKKwl9CiAJcmV0ICs9IHNwcmludGYgKGJ1ZityZXQsICJcbiIpOwogCXJldHVybiBtaW4oKHNzaXplX3QpUEFHRV9TSVpFLCByZXQpOwogfQpAQCAtMjgwLDcgKzI3Miw3IEBACiAJc3RydWN0IGNjd19kZXZpY2VfaWQgKmlkID0gJihjZGV2LT5pZCk7CiAJaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRfYWxpYXMoYnVmLCBQQUdFX1NJWkUsICIiLCBpZCwgIlxuIikgKyAxOworCWxlbiA9IHNucHJpbnRfYWxpYXMoYnVmLCBQQUdFX1NJWkUsIGlkLCAiXG4iKSArIDE7CiAKIAlyZXR1cm4gbGVuID4gUEFHRV9TSVpFID8gUEFHRV9TSVpFIDogbGVuOwogfQpAQCAtMjk4LDE2ICsyOTAsMTAgQEAKIAlyZXR1cm4gc2NoX2lzX3BzZXVkb19zY2godG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNjd19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQotCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKLQljZGV2ID0gcHJpdi0+Y2RldjsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKSkKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJmNkZXYtPmRldik7Ci0JcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKKwkJZGV2aWNlX2RlbCgmY2Rldi0+ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTMyNCwxMSArMzEwLDggQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwogCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7Ci0JCWlmIChnZXRfZGV2aWNlKCZjZGV2LT5kZXYpKSB7Ci0JCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3Rlcik7Ci0JCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7Ci0JCX0KKwkJY2N3X2RldmljZV91bnJlZ2lzdGVyKGNkZXYpOworCQlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogCQlyZXR1cm4gOwogCX0KIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwpAQCAtNDEzLDExICszOTYsNjAgQEAKIAlyZXR1cm4gKHJldCA9PSAwKSA/IC1FTk9ERVYgOiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1vbmxpbmVfc3RvcmUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHZvaWQgb25saW5lX3N0b3JlX2hhbmRsZV9vZmZsaW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKQorCQljY3dfZGV2aWNlX3JlbW92ZV9kaXNjb25uZWN0ZWQoY2Rldik7CisJZWxzZSBpZiAoY2Rldi0+ZHJ2ICYmIGNkZXYtPmRydi0+c2V0X29mZmxpbmUpCisJCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2Rldik7Cit9CisKK3N0YXRpYyBpbnQgb25saW5lX3N0b3JlX3JlY29nX2FuZF9vbmxpbmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJaW50IHJldDsKKworCS8qIERvIGRldmljZSByZWNvZ25pdGlvbiwgaWYgbmVlZGVkLiAqLworCWlmIChjZGV2LT5pZC5jdV90eXBlID09IDApIHsKKwkJcmV0ID0gY2N3X2RldmljZV9yZWNvZ25pdGlvbihjZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJDb3VsZG4ndCBzdGFydCByZWNvZ25pdGlvbiAiCisJCQkgICAgICAgImZvciBkZXZpY2UgJXMgKHJldD0lZClcbiIsCisJCQkgICAgICAgY2Rldi0+ZGV2LmJ1c19pZCwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsCisJCQkgICBjZGV2LT5wcml2YXRlLT5mbGFncy5yZWNvZ19kb25lKTsKKwl9CisJaWYgKGNkZXYtPmRydiAmJiBjZGV2LT5kcnYtPnNldF9vbmxpbmUpCisJCWNjd19kZXZpY2Vfc2V0X29ubGluZShjZGV2KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIG9ubGluZV9zdG9yZV9oYW5kbGVfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgZm9yY2UpCit7CisJaW50IHJldDsKKworCXJldCA9IG9ubGluZV9zdG9yZV9yZWNvZ19hbmRfb25saW5lKGNkZXYpOworCWlmIChyZXQpCisJCXJldHVybjsKKwlpZiAoZm9yY2UgJiYgY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0JPWEVEKSB7CisJCXJldCA9IGNjd19kZXZpY2Vfc3RsY2soY2Rldik7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciY2N3X2RldmljZV9zdGxjayBmb3IgZGV2aWNlICVzICIKKwkJCSAgICAgICAicmV0dXJuZWQgJWQhXG4iLCBjZGV2LT5kZXYuYnVzX2lkLCByZXQpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjZGV2LT5pZC5jdV90eXBlID09IDApCisJCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKKwkJb25saW5lX3N0b3JlX3JlY29nX2FuZF9vbmxpbmUoY2Rldik7CisJfQorCit9CisKK3N0YXRpYyBzc2l6ZV90IG9ubGluZV9zdG9yZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSB0b19jY3dkZXYoZGV2KTsKLQlpbnQgaSwgZm9yY2UsIHJldDsKKwlpbnQgaSwgZm9yY2U7CiAJY2hhciAqdG1wOwogCiAJaWYgKGF0b21pY19jbXB4Y2hnKCZjZGV2LT5wcml2YXRlLT5vbm9mZiwgMCwgMSkgIT0gMCkKQEAgLTQzNCw1MSArNDY2LDE3IEBACiAJCWZvcmNlID0gMDsKIAkJaSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnRtcCwgMTYpOwogCX0KLQlpZiAoaSA9PSAxKSB7Ci0JCS8qIERvIGRldmljZSByZWNvZ25pdGlvbiwgaWYgbmVlZGVkLiAqLwotCQlpZiAoY2Rldi0+aWQuY3VfdHlwZSA9PSAwKSB7Ci0JCQlyZXQgPSBjY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkciQ291bGRuJ3Qgc3RhcnQgcmVjb2duaXRpb24gIgotCQkJCSAgICAgICAiZm9yIGRldmljZSAlcyAocmV0PSVkKVxuIiwKLQkJCQkgICAgICAgY2Rldi0+ZGV2LmJ1c19pZCwgcmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAotCQkJCSAgIGNkZXYtPnByaXZhdGUtPmZsYWdzLnJlY29nX2RvbmUpOwotCQl9Ci0JCWlmIChjZGV2LT5kcnYgJiYgY2Rldi0+ZHJ2LT5zZXRfb25saW5lKQotCQkJY2N3X2RldmljZV9zZXRfb25saW5lKGNkZXYpOwotCX0gZWxzZSBpZiAoaSA9PSAwKSB7Ci0JCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKQotCQkJY2N3X2RldmljZV9yZW1vdmVfZGlzY29ubmVjdGVkKGNkZXYpOwotCQllbHNlIGlmIChjZGV2LT5kcnYgJiYgY2Rldi0+ZHJ2LT5zZXRfb2ZmbGluZSkKLQkJCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2Rldik7CisKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCW9ubGluZV9zdG9yZV9oYW5kbGVfb2ZmbGluZShjZGV2KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlvbmxpbmVfc3RvcmVfaGFuZGxlX29ubGluZShjZGV2LCBmb3JjZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvdW50ID0gLUVJTlZBTDsKIAl9Ci0JaWYgKGZvcmNlICYmIGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9CT1hFRCkgewotCQlyZXQgPSBjY3dfZGV2aWNlX3N0bGNrKGNkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HImNjd19kZXZpY2Vfc3RsY2sgZm9yIGRldmljZSAlcyAiCi0JCQkgICAgICAgInJldHVybmVkICVkIVxuIiwgY2Rldi0+ZGV2LmJ1c19pZCwgcmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCS8qIERvIGRldmljZSByZWNvZ25pdGlvbiwgaWYgbmVlZGVkLiAqLwotCQlpZiAoY2Rldi0+aWQuY3VfdHlwZSA9PSAwKSB7Ci0JCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKLQkJCXJldCA9IGNjd19kZXZpY2VfcmVjb2duaXRpb24oY2Rldik7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyJDb3VsZG4ndCBzdGFydCByZWNvZ25pdGlvbiAiCi0JCQkJICAgICAgICJmb3IgZGV2aWNlICVzIChyZXQ9JWQpXG4iLAotCQkJCSAgICAgICBjZGV2LT5kZXYuYnVzX2lkLCByZXQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsCi0JCQkJICAgY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucmVjb2dfZG9uZSk7Ci0JCX0KLQkJaWYgKGNkZXYtPmRydiAmJiBjZGV2LT5kcnYtPnNldF9vbmxpbmUpCi0JCQljY3dfZGV2aWNlX3NldF9vbmxpbmUoY2Rldik7Ci0JfQotCW91dDoKIAlpZiAoY2Rldi0+ZHJ2KQogCQltb2R1bGVfcHV0KGNkZXYtPmRydi0+b3duZXIpOwogCWF0b21pY19zZXQoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwKTsKQEAgLTU0OCwxNyArNTQ2LDEwIEBACiAJLmF0dHJzID0gY2N3ZGV2X2F0dHJzLAogfTsKIAotc3RhdGljIGludAotZGV2aWNlX2FkZF9maWxlcyAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmNjd2Rldl9hdHRyX2dyb3VwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRldmljZV9yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmY2N3ZGV2X2F0dHJfZ3JvdXApOwotfQorc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY2N3ZGV2X2F0dHJfZ3JvdXBzW10gPSB7CisJJmNjd2Rldl9hdHRyX2dyb3VwLAorCU5VTEwsCit9OwogCiAvKiB0aGlzIGlzIGEgc2ltcGxlIGFic3RyYWN0aW9uIGZvciBkZXZpY2VfcmVnaXN0ZXIgdGhhdCBzZXRzIHRoZQogICogY29ycmVjdCBidXMgdHlwZSBhbmQgYWRkcyB0aGUgYnVzIHNwZWNpZmljIGZpbGVzICovCkBAIC01NzMsMTAgKzU2NCw2IEBACiAJCXJldHVybiByZXQ7CiAKIAlzZXRfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKTsKLQlpZiAoKHJldCA9IGRldmljZV9hZGRfZmlsZXMoZGV2KSkpIHsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCkpCi0JCQlkZXZpY2VfZGVsKGRldik7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0OCwxMCArNjM1LDYgQEAKIAkJcmV0dXJuOwogCX0KIAlzZXRfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKTsKLQlpZiAoZGV2aWNlX2FkZF9maWxlcygmY2Rldi0+ZGV2KSkgewotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKSkKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZjZGV2LT5kZXYpOwotCX0KIH0KIAogdm9pZCBjY3dfZGV2aWNlX2RvX3VucmVnX3JlcmVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTY2NCw5ICs2NDcsNyBAQAogCWNkZXYgPSBwcml2LT5jZGV2OwogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGVzKCZjZGV2LT5kZXYpOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMSwgJmNkZXYtPnByaXZhdGUtPnJlZ2lzdGVyZWQpKQotCQlkZXZpY2VfZGVsKCZjZGV2LT5kZXYpOworCWNjd19kZXZpY2VfdW5yZWdpc3RlcihjZGV2KTsKIAlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKIAkJICAgICBjY3dfZGV2aWNlX2FkZF9jaGFuZ2VkKTsKIAlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CkBAIC03MDUsNiArNjg2LDcgQEAKIAljZGV2LT5kZXYucGFyZW50ID0gJnNjaC0+ZGV2OwogCWNkZXYtPmRldi5yZWxlYXNlID0gY2N3X2RldmljZV9yZWxlYXNlOwogCUlOSVRfTElTVF9IRUFEKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmsuZW50cnkpOworCWNkZXYtPmRldi5ncm91cHMgPSBjY3dkZXZfYXR0cl9ncm91cHM7CiAJLyogRG8gZmlyc3QgaGFsZiBvZiBkZXZpY2VfcmVnaXN0ZXIuICovCiAJZGV2aWNlX2luaXRpYWxpemUoJmNkZXYtPmRldik7CiAJaWYgKCFnZXRfZGV2aWNlKCZzY2gtPmRldikpIHsKQEAgLTczNiw2ICs3MTgsNyBAQAogc3RhdGljIHZvaWQgc2NoX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwKIAkJCSAgICAgIHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogeworCWNzc191cGRhdGVfc3NkX2luZm8oc2NoKTsKIAlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CiAJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBjZGV2OwogCWNkZXYtPnByaXZhdGUtPnNjaGlkID0gc2NoLT5zY2hpZDsKQEAgLTg3MSw3ICs4NTQsNyBAQAogCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKIAljZGV2ID0gcHJpdi0+Y2RldjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCisJY3NzX3VwZGF0ZV9zc2RfaW5mbyhzY2gpOwogCS8qCiAJICogaW9fc3ViY2hhbm5lbF9yZWdpc3RlcigpIHdpbGwgYWxzbyBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlCiAJICogcmVjb2duaXRpb24gaGFzIGJlZW4gZG9uZSBmb3IgYSBib3hlZCBkZXZpY2UgKHdoaWNoIHdpbGwgYWxyZWFkeQpAQCAtMTEzMywxNSArMTExNiw4IEBACiAJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCS8qCi0JICogUHV0IHVucmVnaXN0cmF0aW9uIG9uIHdvcmtxdWV1ZSB0byBhdm9pZCBsaXZlbG9ja3Mgb24gdGhlIGNzcyBidXMKLQkgKiBzZW1hcGhvcmUuCi0JICovCi0JaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKLQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3Rlcik7Ci0JCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKLQl9CisJY2N3X2RldmljZV91bnJlZ2lzdGVyKGNkZXYpOworCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggMDg5YTNkZC4uODk4ZWMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAKICNpbmNsdWRlICJjaW8uaCIKICNpbmNsdWRlICJjaW9fZGVidWcuaCIKQEAgLTIyLDYgKzIzLDcgQEAKICNpbmNsdWRlICJkZXZpY2UuaCIKICNpbmNsdWRlICJjaHNjLmgiCiAjaW5jbHVkZSAiaW9hc20uaCIKKyNpbmNsdWRlICJjaHAuaCIKIAogaW50CiBkZXZpY2VfaXNfb25saW5lKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCkBAIC0yMTAsMTQgKzIxMiwxOCBAQAogX19yZWNvdmVyX2xvc3RfY2hwaWRzKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBvbGRfbHBtKQogewogCWludCBtYXNrLCBpOworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CiAKKwljaHBfaWRfaW5pdCgmY2hwaWQpOwogCWZvciAoaSA9IDA7IGk8ODsgaSsrKSB7CiAJCW1hc2sgPSAweDgwID4+IGk7CiAJCWlmICghKHNjaC0+bHBtICYgbWFzaykpCiAJCQljb250aW51ZTsKIAkJaWYgKG9sZF9scG0gJiBtYXNrKQogCQkJY29udGludWU7Ci0JCWNocGlkX2lzX2FjdHVhbGx5X29ubGluZShzY2gtPnNjaGliLnBtY3cuY2hwaWRbaV0pOworCQljaHBpZC5pZCA9IHNjaC0+c2NoaWIucG1jdy5jaHBpZFtpXTsKKwkJaWYgKCFjaHBfaXNfcmVnaXN0ZXJlZChjaHBpZCkpCisJCQljc3Nfc2NoZWR1bGVfZXZhbF9hbGwoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggN2M3Nzc1YS4uMTZmNTlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTE2LDEyICsxNiwxNCBAQAogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9pZGFscy5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgogCiAjaW5jbHVkZSAiY2lvLmgiCiAjaW5jbHVkZSAiY2lvX2RlYnVnLmgiCiAjaW5jbHVkZSAiY3NzLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImNocC5oIgogCiBpbnQgY2N3X2RldmljZV9zZXRfb3B0aW9uc19tYXNrKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtNjA2LDkgKzYwOCwxMiBAQAogY2N3X2RldmljZV9nZXRfY2hwX2Rlc2Moc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBjaHBfbm8pCiB7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOwogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlyZXR1cm4gY2hzY19nZXRfY2hwX2Rlc2Moc2NoLCBjaHBfbm8pOworCWNocF9pZF9pbml0KCZjaHBpZCk7CisJY2hwaWQuaWQgPSBzY2gtPnNjaGliLnBtY3cuY2hwaWRbY2hwX25vXTsKKwlyZXR1cm4gY2hwX2dldF9jaHBfZGVzYyhjaHBpZCk7CiB9CiAKIC8vIEZJWE1FOiB0aGVzZSBoYXZlIHRvIGdvOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9pZHNldC5jIGIvZHJpdmVycy9zMzkwL2Npby9pZHNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2lkc2V0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9pZHNldC5jCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlICJpZHNldC5oIgorI2luY2x1ZGUgImNzcy5oIgorCitzdHJ1Y3QgaWRzZXQgeworCWludCBudW1fc3NpZDsKKwlpbnQgbnVtX2lkOworCXVuc2lnbmVkIGxvbmcgYml0bWFwWzBdOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKGludCBudW1fc3NpZCwgaW50IG51bV9pZCkKK3sKKwlyZXR1cm4gX19CSVRPUFNfV09SRFMobnVtX3NzaWQgKiBudW1faWQpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworfQorCitzdGF0aWMgc3RydWN0IGlkc2V0ICppZHNldF9uZXcoaW50IG51bV9zc2lkLCBpbnQgbnVtX2lkKQoreworCXN0cnVjdCBpZHNldCAqc2V0OworCisJc2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlkc2V0KSArIGJpdG1hcF9zaXplKG51bV9zc2lkLCBudW1faWQpLAorCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc2V0KSB7CisJCXNldC0+bnVtX3NzaWQgPSBudW1fc3NpZDsKKwkJc2V0LT5udW1faWQgPSBudW1faWQ7CisJfQorCXJldHVybiBzZXQ7Cit9CisKK3ZvaWQgaWRzZXRfZnJlZShzdHJ1Y3QgaWRzZXQgKnNldCkKK3sKKwlrZnJlZShzZXQpOworfQorCit2b2lkIGlkc2V0X2NsZWFyKHN0cnVjdCBpZHNldCAqc2V0KQoreworCW1lbXNldChzZXQtPmJpdG1hcCwgMCwgYml0bWFwX3NpemUoc2V0LT5udW1fc3NpZCwgc2V0LT5udW1faWQpKTsKK30KKwordm9pZCBpZHNldF9maWxsKHN0cnVjdCBpZHNldCAqc2V0KQoreworCW1lbXNldChzZXQtPmJpdG1hcCwgMHhmZiwgYml0bWFwX3NpemUoc2V0LT5udW1fc3NpZCwgc2V0LT5udW1faWQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkc2V0X2FkZChzdHJ1Y3QgaWRzZXQgKnNldCwgaW50IHNzaWQsIGludCBpZCkKK3sKKwlzZXRfYml0KHNzaWQgKiBzZXQtPm51bV9pZCArIGlkLCBzZXQtPmJpdG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZHNldF9kZWwoc3RydWN0IGlkc2V0ICpzZXQsIGludCBzc2lkLCBpbnQgaWQpCit7CisJY2xlYXJfYml0KHNzaWQgKiBzZXQtPm51bV9pZCArIGlkLCBzZXQtPmJpdG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlkc2V0X2NvbnRhaW5zKHN0cnVjdCBpZHNldCAqc2V0LCBpbnQgc3NpZCwgaW50IGlkKQoreworCXJldHVybiB0ZXN0X2JpdChzc2lkICogc2V0LT5udW1faWQgKyBpZCwgc2V0LT5iaXRtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZHNldF9nZXRfZmlyc3Qoc3RydWN0IGlkc2V0ICpzZXQsIGludCAqc3NpZCwgaW50ICppZCkKK3sKKwlpbnQgYml0bnVtOworCisJYml0bnVtID0gZmluZF9maXJzdF9iaXQoc2V0LT5iaXRtYXAsIHNldC0+bnVtX3NzaWQgKiBzZXQtPm51bV9pZCk7CisJaWYgKGJpdG51bSA+PSBzZXQtPm51bV9zc2lkICogc2V0LT5udW1faWQpCisJCXJldHVybiAwOworCSpzc2lkID0gYml0bnVtIC8gc2V0LT5udW1faWQ7CisJKmlkID0gYml0bnVtICUgc2V0LT5udW1faWQ7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBpZHNldCAqaWRzZXRfc2NoX25ldyh2b2lkKQoreworCXJldHVybiBpZHNldF9uZXcoX19NQVhfU1NJRCArIDEsIF9fTUFYX1NVQkNIQU5ORUwgKyAxKTsKK30KKwordm9pZCBpZHNldF9zY2hfYWRkKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKK3sKKwlpZHNldF9hZGQoc2V0LCBzY2hpZC5zc2lkLCBzY2hpZC5zY2hfbm8pOworfQorCit2b2lkIGlkc2V0X3NjaF9kZWwoc3RydWN0IGlkc2V0ICpzZXQsIHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQoreworCWlkc2V0X2RlbChzZXQsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7Cit9CisKK2ludCBpZHNldF9zY2hfY29udGFpbnMoc3RydWN0IGlkc2V0ICpzZXQsIHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQoreworCXJldHVybiBpZHNldF9jb250YWlucyhzZXQsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7Cit9CisKK2ludCBpZHNldF9zY2hfZ2V0X2ZpcnN0KHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCAqc2NoaWQpCit7CisJaW50IHNzaWQgPSAwOworCWludCBpZCA9IDA7CisJaW50IHJjOworCisJcmMgPSBpZHNldF9nZXRfZmlyc3Qoc2V0LCAmc3NpZCwgJmlkKTsKKwlpZiAocmMpIHsKKwkJaW5pdF9zdWJjaGFubmVsX2lkKHNjaGlkKTsKKwkJc2NoaWQtPnNzaWQgPSBzc2lkOworCQlzY2hpZC0+c2NoX25vID0gaWQ7CisJfQorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaWRzZXQuaCBiL2RyaXZlcnMvczM5MC9jaW8vaWRzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ0NjZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pZHNldC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9pZHNldC5oCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaWZuZGVmIFMzOTBfSURTRVRfSAorI2RlZmluZSBTMzkwX0lEU0VUX0ggUzM5MF9JRFNFVF9ICisKKyNpbmNsdWRlICJzY2hpZC5oIgorCitzdHJ1Y3QgaWRzZXQ7CisKK3ZvaWQgaWRzZXRfZnJlZShzdHJ1Y3QgaWRzZXQgKnNldCk7Cit2b2lkIGlkc2V0X2NsZWFyKHN0cnVjdCBpZHNldCAqc2V0KTsKK3ZvaWQgaWRzZXRfZmlsbChzdHJ1Y3QgaWRzZXQgKnNldCk7CisKK3N0cnVjdCBpZHNldCAqaWRzZXRfc2NoX25ldyh2b2lkKTsKK3ZvaWQgaWRzZXRfc2NoX2FkZChzdHJ1Y3QgaWRzZXQgKnNldCwgc3RydWN0IHN1YmNoYW5uZWxfaWQgaWQpOwordm9pZCBpZHNldF9zY2hfZGVsKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBpZCk7CitpbnQgaWRzZXRfc2NoX2NvbnRhaW5zKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBpZCk7CitpbnQgaWRzZXRfc2NoX2dldF9maXJzdChzdHJ1Y3QgaWRzZXQgKnNldCwgc3RydWN0IHN1YmNoYW5uZWxfaWQgKmlkKTsKKworI2VuZGlmIC8qIFMzOTBfSURTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oIGIvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oCmluZGV4IGFkNmQ4MjkuLjcxNTNkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2lvYXNtLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIFMzOTBfQ0lPX0lPQVNNX0gKICNkZWZpbmUgUzM5MF9DSU9fSU9BU01fSAogCisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAjaW5jbHVkZSAic2NoaWQuaCIKIAogLyoKQEAgLTE4OSw5ICsxOTAsOSBAQAogCXJldHVybiBjYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmNocChpbnQgY2hwaWQpCitzdGF0aWMgaW5saW5lIGludCByY2hwKHN0cnVjdCBjaHBfaWQgY2hwaWQpCiB7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZzEgYXNtICgiMSIpID0gY2hwaWQ7CisJcmVnaXN0ZXIgc3RydWN0IGNocF9pZCByZWcxIGFzbSAoIjEiKSA9IGNocGlkOwogCWludCBjY29kZTsKIAogCWFzbSB2b2xhdGlsZSgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggNzgwOWE3OS4uNmRkNjRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKQEAgLTM1MjUsOCArMzUyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShza2JfcHV0KHNrYixsZW5fb2ZfZGF0YSksCiAJCQkJCXByaXZwdHItPnBfbXRjX2VudmVsb3BlLAogCQkJCQlsZW5fb2ZfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2PWRldjsKKwkJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5pcF9zdW1tZWQ9Q0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKaW5kZXggMGQ2ZDVmYy4uYjIwZmQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCXNrYl9wdXQocHNrYiwgaGVhZGVyLT5sZW5ndGgpOwotCQlwc2tiLT5tYWMucmF3ID0gcHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIocHNrYik7CiAJCWxlbiAtPSBoZWFkZXItPmxlbmd0aDsKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihwc2tiLT5sZW4pOwogCQlpZiAoIXNrYikgewpAQCAtNDcyLDggKzQ3Miw5IEBACiAJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwc2tiLT5sZW4pLCBwc2tiLT5kYXRhLCBwc2tiLT5sZW4pOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocHNrYiwgc2tiX3B1dChza2IsIHBza2ItPmxlbiksCisJCQkJCSAgcHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5kZXYgPSBwc2tiLT5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBwc2tiLT5wcm90b2NvbDsKIAkJcHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC03MDYsNyArNzA3LDggQEAKIAkJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKIAkJCXJldHVybjsKIAkJfQotCQljaC0+dHJhbnNfc2tiLT50YWlsID0gY2gtPnRyYW5zX3NrYi0+ZGF0YSA9IGNoLT50cmFuc19za2JfZGF0YTsKKwkJY2gtPnRyYW5zX3NrYi0+ZGF0YSA9IGNoLT50cmFuc19za2JfZGF0YTsKKwkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjaC0+dHJhbnNfc2tiKTsKIAkJY2gtPnRyYW5zX3NrYi0+bGVuID0gMDsKIAkJaWYgKGNoLT5wcm9mLm1heG11bHRpIDwgKGNoLT5jb2xsZWN0X2xlbiArIDIpKQogCQkJY2gtPnByb2YubWF4bXVsdGkgPSBjaC0+Y29sbGVjdF9sZW4gKyAyOwpAQCAtNzE1LDggKzcxNyw5IEBACiAJCSooKF9fdTE2ICopIHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwgMikpID0gY2gtPmNvbGxlY3RfbGVuICsgMjsKIAkJaSA9IDA7CiAJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNoLT5jb2xsZWN0X3F1ZXVlKSkpIHsKLQkJCW1lbWNweShza2JfcHV0KGNoLT50cmFuc19za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLAotCQkJICAgICAgIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGNoLT50cmFuc19za2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuKSwKKwkJCQkJCSAgc2tiLT5sZW4pOwogCQkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gLSBMTF9IRUFERVJfTEVOR1RIOwogCQkJYXRvbWljX2RlYygmc2tiLT51c2Vycyk7CkBAIC04MzEsNyArODM0LDggQEAKIAkJY3RjX3VucGFja19za2IoY2gsIHNrYik7CiAJfQogIGFnYWluOgotCXNrYi0+ZGF0YSA9IHNrYi0+dGFpbCA9IGNoLT50cmFuc19za2JfZGF0YTsKKwlza2ItPmRhdGEgPSBjaC0+dHJhbnNfc2tiX2RhdGE7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCXNrYi0+bGVuID0gMDsKIAlpZiAoY3RjX2NoZWNrYWxsb2NfYnVmZmVyKGNoLCAxKSkKIAkJcmV0dXJuOwpAQCAtMTYzOCwyMSArMTY0MiwxOSBAQAogCXN0cnVjdCBjaGFubmVsICpjaDsKIAogCURCRl9URVhUKHRyYWNlLCAyLCBfX0ZVTkNUSU9OX18pOwotCWlmICgoY2ggPQotCSAgICAgKHN0cnVjdCBjaGFubmVsICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2hhbm5lbCksCi0JCQkJCUdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2gpIHsKIAkJY3RjX3ByX3dhcm4oImN0YzogT3V0IG9mIG1lbW9yeSBpbiBhZGRfY2hhbm5lbFxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtc2V0KGNoLCAwLCBzaXplb2YgKHN0cnVjdCBjaGFubmVsKSk7Ci0JaWYgKChjaC0+Y2N3ID0ga21hbGxvYyg4KnNpemVvZihzdHJ1Y3QgY2N3MSksCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSkpID09IE5VTEwpIHsKKwkvKiBhc3N1cmUgYWxsIGZsYWdzIGFuZCBjb3VudGVycyBhcmUgcmVzZXQgKi8KKwljaC0+Y2N3ID0ga3phbGxvYyg4ICogc2l6ZW9mKHN0cnVjdCBjY3cxKSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghY2gtPmNjdykgewogCQlrZnJlZShjaCk7CiAJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JbWVtc2V0KGNoLT5jY3csIDAsIDgqc2l6ZW9mKHN0cnVjdCBjY3cxKSk7CS8vIGFzc3VyZSBhbGwgZmxhZ3MgYW5kIGNvdW50ZXJzIGFyZSByZXNldAogCiAJLyoqCiAJICogInN0YXRpYyIgY2N3cyBhcmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKQEAgLTE2OTIsMTUgKzE2OTQsMTQgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlmc21fbmV3c3RhdGUoY2gtPmZzbSwgQ0hfU1RBVEVfSURMRSk7Ci0JaWYgKChjaC0+aXJiID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBpcmIpLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCWNoLT5pcmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaC0+aXJiKSB7CiAJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwogCQlrZnJlZV9mc20oY2gtPmZzbSk7CiAJCWtmcmVlKGNoLT5jY3cpOwogCQlrZnJlZShjaCk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtc2V0KGNoLT5pcmIsIDAsIHNpemVvZiAoc3RydWN0IGlyYikpOwogCXdoaWxlICgqYyAmJiBsZXNzX3RoYW4oKCpjKS0+aWQsIGNoLT5pZCkpCiAJCWMgPSAmKCpjKS0+bmV4dDsKIAlpZiAoKmMgJiYgKCFzdHJuY21wKCgqYyktPmlkLCBjaC0+aWQsIENUQ19JRF9TSVpFKSkpIHsKQEAgLTIyMjYsNyArMjIyNyw4IEBACiAJCSAqIElEQUwgc3VwcG9ydCBpbiBDVEMgaXMgYnJva2VuLCBzbyB3ZSBoYXZlIHRvCiAJCSAqIGNhcmUgYWJvdXQgc2tiJ3MgYWJvdmUgMkcgb3Vyc2VsdmVzLgogCQkgKi8KLQkJaGkgPSAoKHVuc2lnbmVkIGxvbmcpIHNrYi0+dGFpbCArIExMX0hFQURFUl9MRU5HVEgpID4+IDMxOworCQloaSA9ICgodW5zaWduZWQgbG9uZylza2JfdGFpbF9wb2ludGVyKHNrYikgKworCQkgICAgICBMTF9IRUFERVJfTEVOR1RIKSA+PiAzMTsKIAkJaWYgKGhpKSB7CiAJCQluc2tiID0gYWxsb2Nfc2tiKHNrYi0+bGVuLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiAJCQlpZiAoIW5za2IpIHsKQEAgLTIyNjIsMTEgKzIyNjQsMTIgQEAKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCi0JCQljaC0+dHJhbnNfc2tiLT50YWlsID0gY2gtPnRyYW5zX3NrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoY2gtPnRyYW5zX3NrYik7CiAJCQljaC0+dHJhbnNfc2tiLT5sZW4gPSAwOwogCQkJY2gtPmNjd1sxXS5jb3VudCA9IHNrYi0+bGVuOwotCQkJbWVtY3B5KHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsCi0JCQkgICAgICAgc2tiLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwKKwkJCQkJCQkgICAgICAgc2tiLT5sZW4pLAorCQkJCQkJICBza2ItPmxlbik7CiAJCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQljY3dfaWR4ID0gMDsKQEAgLTI3NDUsMTQgKzI3NDgsMTMgQEAKIAlpZiAoIWdldF9kZXZpY2UoJmNnZGV2LT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGN0Y19wcml2KSwgR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjdGNfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikgewogCQljdGNfcHJfZXJyKCIlczogT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlwdXRfZGV2aWNlKCZjZ2Rldi0+ZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KHByaXYsIDAsIHNpemVvZiAoc3RydWN0IGN0Y19wcml2KSk7CiAJcmMgPSBjdGNfYWRkX2ZpbGVzKCZjZ2Rldi0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJa2ZyZWUocHJpdik7CkBAIC0yNzkzLDEwICsyNzk1LDkgQEAKIAlEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKIAogCWlmIChhbGxvY19kZXZpY2UpIHsKLQkJZGV2ID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2KQogCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbXNldChkZXYsIDAsIHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2UpKTsKIAl9CiAKIAlkZXYtPnByaXYgPSBwcml2cHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKaW5kZXggZWNjYTEwNC4uMDhhOTk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCkBAIC0xNTc2LDcgKzE1NzYsNyBAQAogCWhlYWRlci0+b2Zmc2V0ID0gY2FyZC0+dHhfYnVmZmVyLT5jb3VudDsKIAloZWFkZXItPnR5cGUgPSBjYXJkLT5sYW5fdHlwZTsKIAloZWFkZXItPnNsb3QgPSBjYXJkLT5wb3J0bm87Ci0JbWVtY3B5KGhlYWRlciArIDEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBoZWFkZXIgKyAxLCBza2ItPmxlbik7CiAJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCWNhcmQtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCWNhcmQtPnN0YXRzLnR4X3BhY2tldHMrKzsKQEAgLTE3ODQsNyArMTc4NCw2IEBACiAJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwogCX0KLQlza2ItPmRldiA9IGNhcmQtPmRldjsKIAltZW1jcHkoc2tiX3B1dChza2IsIHNrYl9sZW4pLCBza2JfZGF0YSwgc2tiX2xlbik7CiAJc2tiLT5wcm90b2NvbCA9CWNhcmQtPmxhbl90eXBlX3RyYW5zKHNrYiwgY2FyZC0+ZGV2KTsKIAljYXJkLT5zdGF0cy5yeF9ieXRlcyArPSBza2JfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCA1OTQzMjBjLi5lMTBlODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJc2tiX3B1dChwc2tiLCBoZWFkZXItPm5leHQpOwotCQlwc2tiLT5tYWMucmF3ID0gcHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIocHNrYik7CiAJCXNrYiA9IGRldl9hbGxvY19za2IocHNrYi0+bGVuKTsKIAkJaWYgKCFza2IpIHsKIAkJCVBSSU5UX1dBUk4oIiVzIE91dCBvZiBtZW1vcnkgaW4gbmV0aXVjdl91bnBhY2tfc2tiXG4iLApAQCAtNjQ1LDggKzY0NSw5IEBACiAJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwc2tiLT5sZW4pLCBwc2tiLT5kYXRhLCBwc2tiLT5sZW4pOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocHNrYiwgc2tiX3B1dChza2IsIHBza2ItPmxlbiksCisJCQkJCSAgcHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5kZXYgPSBwc2tiLT5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBwc2tiLT5wcm90b2NvbDsKIAkJcHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC02ODksNyArNjkwLDggQEAKIAkJCSAgICAgICBtc2ctPmxlbmd0aCwgY29ubi0+bWF4X2J1ZmZzaXplKTsKIAkJcmV0dXJuOwogCX0KLQljb25uLT5yeF9idWZmLT5kYXRhID0gY29ubi0+cnhfYnVmZi0+dGFpbCA9IGNvbm4tPnJ4X2J1ZmYtPmhlYWQ7CisJY29ubi0+cnhfYnVmZi0+ZGF0YSA9IGNvbm4tPnJ4X2J1ZmYtPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjb25uLT5yeF9idWZmKTsKIAljb25uLT5yeF9idWZmLT5sZW4gPSAwOwogCXJjID0gaXVjdl9tZXNzYWdlX3JlY2VpdmUoY29ubi0+cGF0aCwgbXNnLCAwLCBjb25uLT5yeF9idWZmLT5kYXRhLAogCQkJCSAgbXNnLT5sZW5ndGgsIE5VTEwpOwpAQCAtNzM1LDE0ICs3MzcsMTcgQEAKIAkJCX0KIAkJfQogCX0KLQljb25uLT50eF9idWZmLT5kYXRhID0gY29ubi0+dHhfYnVmZi0+dGFpbCA9IGNvbm4tPnR4X2J1ZmYtPmhlYWQ7CisJY29ubi0+dHhfYnVmZi0+ZGF0YSA9IGNvbm4tPnR4X2J1ZmYtPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjb25uLT50eF9idWZmKTsKIAljb25uLT50eF9idWZmLT5sZW4gPSAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25uLT5jb2xsZWN0X2xvY2ssIHNhdmVmbGFncyk7CiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+Y29sbGVjdF9xdWV1ZSkpKSB7CiAJCWhlYWRlci5uZXh0ID0gY29ubi0+dHhfYnVmZi0+bGVuICsgc2tiLT5sZW4gKyBORVRJVUNWX0hEUkxFTjsKIAkJbWVtY3B5KHNrYl9wdXQoY29ubi0+dHhfYnVmZiwgTkVUSVVDVl9IRFJMRU4pLCAmaGVhZGVyLAogCQkgICAgICAgTkVUSVVDVl9IRFJMRU4pOwotCQltZW1jcHkoc2tiX3B1dChjb25uLT50eF9idWZmLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJICBza2JfcHV0KGNvbm4tPnR4X2J1ZmYsIHNrYi0+bGVuKSwKKwkJCQkJICBza2ItPmxlbik7CiAJCXR4Ynl0ZXMgKz0gc2tiLT5sZW47CiAJCXR4cGFja2V0cysrOwogCQlzdGF0X21heGNxKys7CkBAIC0xMTY0LDggKzExNjksOCBAQAogCQkgKiBDb3B5IHRoZSBza2IgdG8gYSBuZXcgYWxsb2NhdGVkIHNrYiBpbiBsb3dtZW0gb25seSBpZiB0aGUKIAkJICogZGF0YSBpcyBsb2NhdGVkIGFib3ZlIDJHIGluIG1lbW9yeSBvciB0YWlscm9vbSBpcyA8IDIuCiAJCSAqLwotCQl1bnNpZ25lZCBsb25nIGhpID0KLQkJCSgodW5zaWduZWQgbG9uZykoc2tiLT50YWlsICsgTkVUSVVDVl9IRFJMRU4pKSA+PiAzMTsKKwkJdW5zaWduZWQgbG9uZyBoaSA9ICgodW5zaWduZWQgbG9uZykoc2tiX3RhaWxfcG9pbnRlcihza2IpICsKKwkJCQkgICAgTkVUSVVDVl9IRFJMRU4pKSA+PiAzMTsKIAkJaW50IGNvcGllZCA9IDA7CiAJCWlmIChoaSB8fCAoc2tiX3RhaWxyb29tKHNrYikgPCAyKSkgewogCQkJbnNrYiA9IGFsbG9jX3NrYihza2ItPmxlbiArIE5FVElVQ1ZfSERSTEVOICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jCmluZGV4IDdjNzM1ZTEuLmRkNzAzNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuYwpAQCAtMjY3LDcgKzI2Nyw4IEBACiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiZWRkcGNkdGMiKTsKIAlpZiAoc2tiX3NoaW5mbyhlZGRwLT5za2IpLT5ucl9mcmFncyA9PSAwKSB7Ci0JCW1lbWNweShkc3QsIGVkZHAtPnNrYi0+ZGF0YSArIGVkZHAtPnNrYl9vZmZzZXQsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KGVkZHAtPnNrYiwgZWRkcC0+c2tiX29mZnNldCwKKwkJCQkJCSBkc3QsIGxlbik7CiAJCSpoY3N1bSA9IGNzdW1fcGFydGlhbChlZGRwLT5za2ItPmRhdGEgKyBlZGRwLT5za2Jfb2Zmc2V0LCBsZW4sCiAJCQkJICAgICAgKmhjc3VtKTsKIAkJZWRkcC0+c2tiX29mZnNldCArPSBsZW47CkBAIC00MTYsNyArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgZWRkcC0+c2tiX29mZnNldCArPSBWTEFOX0hMRU47CiAjZW5kaWYgLyogQ09ORklHX1FFVEhfVkxBTiAqLwogICAgICAgIH0KLQl0Y3BoID0gZWRkcC0+c2tiLT5oLnRoOworCXRjcGggPSB0Y3BfaGRyKGVkZHAtPnNrYik7CiAJd2hpbGUgKGVkZHAtPnNrYl9vZmZzZXQgPCBlZGRwLT5za2ItPmxlbikgewogCQlkYXRhX2xlbiA9IG1pbigoaW50KXNrYl9zaGluZm8oZWRkcC0+c2tiKS0+Z3NvX3NpemUsCiAJCQkgICAgICAgKGludCkoZWRkcC0+c2tiLT5sZW4gLSBlZGRwLT5za2Jfb2Zmc2V0KSk7CkBAIC00NzMsMjAgKzQ3NCwyNCBAQAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJlZGRwZmljeCIpOwogCS8qIGNyZWF0ZSBvdXIgc2VnbWVudGF0aW9uIGhlYWRlcnMgYW5kIGNvcHkgb3JpZ2luYWwgaGVhZGVycyAqLwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKLQkJZWRkcCA9IHFldGhfZWRkcF9jcmVhdGVfZWRkcF9kYXRhKHFoZHIsICh1OCAqKXNrYi0+bmguaXBoLAotCQkJCXNrYi0+bmguaXBoLT5paGwqNCwKLQkJCQkodTggKilza2ItPmgudGgsIHNrYi0+aC50aC0+ZG9mZio0KTsKKwkJZWRkcCA9IHFldGhfZWRkcF9jcmVhdGVfZWRkcF9kYXRhKHFoZHIsCisJCQkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLAorCQkJCQkJICBpcF9oZHJsZW4oc2tiKSwKKwkJCQkJCSAgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkJCSAgdGNwX2hkcmxlbihza2IpKTsKIAllbHNlCi0JCWVkZHAgPSBxZXRoX2VkZHBfY3JlYXRlX2VkZHBfZGF0YShxaGRyLCAodTggKilza2ItPm5oLmlwdjZoLAotCQkJCXNpemVvZihzdHJ1Y3QgaXB2NmhkciksCi0JCQkJKHU4ICopc2tiLT5oLnRoLCBza2ItPmgudGgtPmRvZmYqNCk7CisJCWVkZHAgPSBxZXRoX2VkZHBfY3JlYXRlX2VkZHBfZGF0YShxaGRyLAorCQkJCQkJICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwKKwkJCQkJCSAgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkJCSAgdGNwX2hkcmxlbihza2IpKTsKIAogCWlmIChlZGRwID09IE5VTEwpIHsKIAkJUUVUSF9EQkZfVEVYVCh0cmFjZSwgMiwgImVkZHBmY25tIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAocWhkci0+aGRyLmwyLmlkID09IFFFVEhfSEVBREVSX1RZUEVfTEFZRVIyKSB7Ci0JCXNrYi0+bWFjLnJhdyA9IChza2ItPmRhdGEpICsgc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcik7CisJCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpKTsKIAkJbWVtY3B5KCZlZGRwLT5tYWMsIGV0aF9oZHIoc2tiKSwgRVRIX0hMRU4pOwogI2lmZGVmIENPTkZJR19RRVRIX1ZMQU4KIAkJaWYgKGVkZHAtPm1hYy5oX3Byb3RvID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CkBAIC01OTAsMTIgKzU5NSwxMyBAQAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJjcmVkZHBjdCIpOwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJY3R4ID0gcWV0aF9lZGRwX2NyZWF0ZV9jb250ZXh0X2dlbmVyaWMoY2FyZCwgc2tiLAotCQkJc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKyBza2ItPm5oLmlwaC0+aWhsKjQgKwotCQkJc2tiLT5oLnRoLT5kb2ZmKjQpOworCQkJCQkJICAgICAgIChzaXplb2Yoc3RydWN0IHFldGhfaGRyKSArCisJCQkJCQkgICAgICAgIGlwX2hkcmxlbihza2IpICsKKwkJCQkJCQl0Y3BfaGRybGVuKHNrYikpKTsKIAllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQogCQljdHggPSBxZXRoX2VkZHBfY3JlYXRlX2NvbnRleHRfZ2VuZXJpYyhjYXJkLCBza2IsCiAJCQlzaXplb2Yoc3RydWN0IHFldGhfaGRyKSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKwotCQkJc2tiLT5oLnRoLT5kb2ZmKjQpOworCQkJdGNwX2hkcmxlbihza2IpKTsKIAllbHNlCiAJCVFFVEhfREJGX1RFWFQodHJhY2UsIDIsICJjZXRjcGludiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwppbmRleCBkOGE4NmY1Li5hZDc3OTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKQEAgLTIyNzgsNyArMjI3OCw3IEBACiAJICAgIChjYXJkLT5pbmZvLmxpbmtfdHlwZSA9PSBRRVRIX0xJTktfVFlQRV9MQU5FX1RSKSkKIAkgCXJldHVybiB0cl90eXBlX3RyYW5zKHNrYixkZXYpOwogI2VuZGlmIC8qIENPTkZJR19UUiAqLwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4gKTsKIAlldGggPSBldGhfaGRyKHNrYik7CiAKQEAgLTIzMDYsOSArMjMwNiw5IEBACiAJc3RydWN0IGlwaGRyICppcF9oZHI7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDUsInNrYmZrdHIiKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGEgLSBRRVRIX0ZBS0VfTExfTEVOX1RSOworCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1RRVRIX0ZBS0VfTExfTEVOX1RSKTsKIAkvKiB0aGlzIGlzIGEgZmFrZSBldGhlcm5ldCBoZWFkZXIgKi8KLQlmYWtlX2hkciA9IChzdHJ1Y3QgdHJoX2hkciAqKSBza2ItPm1hYy5yYXc7CisJZmFrZV9oZHIgPSB0cl9oZHIoc2tiKTsKIAogCS8qIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLwogCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSl7CkBAIC0yMzU5LDkgKzIzNTksOSBAQAogCXN0cnVjdCBpcGhkciAqaXBfaGRyOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSw1LCJza2Jma2V0aCIpOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YSAtIFFFVEhfRkFLRV9MTF9MRU5fRVRIOworCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1RRVRIX0ZBS0VfTExfTEVOX0VUSCk7CiAJLyogdGhpcyBpcyBhIGZha2UgZXRoZXJuZXQgaGVhZGVyICovCi0JZmFrZV9oZHIgPSAoc3RydWN0IGV0aGhkciAqKSBza2ItPm1hYy5yYXc7CisJZmFrZV9oZHIgPSBldGhfaGRyKHNrYik7CiAKIAkvKiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KIAlzd2l0Y2ggKHNrYi0+cGt0X3R5cGUpewpAQCAtMjQ2MSw3ICsyNDYxLDcgQEAKIAlpZiAoY2FyZC0+b3B0aW9ucy5mYWtlX2xsKQogCQlxZXRoX3JlYnVpbGRfc2tiX2Zha2VfbGwoY2FyZCwgc2tiLCBoZHIpOwogCWVsc2UKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+aXBfc3VtbWVkID0gY2FyZC0+b3B0aW9ucy5jaGVja3N1bV90eXBlOwogCWlmIChjYXJkLT5vcHRpb25zLmNoZWNrc3VtX3R5cGUgPT0gSFdfQ0hFQ0tTVU1NSU5HKXsKIAkJaWYgKCAoaGRyLT5oZHIubDMuZXh0X2ZsYWdzICYKQEAgLTI1MDEsNyArMjUwMSw4IEBACiAJCQl2bGFuX3RhZyA9IHFldGhfcmVidWlsZF9za2IoY2FyZCwgc2tiLCBoZHIpOwogCQllbHNlIHsgLyppbiBjYXNlIG9mIE9TTiovCiAJCQlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpKTsKLQkJCW1lbWNweShza2ItPmRhdGEsIGhkciwgc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikpOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBoZHIsCisJCQkJCQlzaXplb2Yoc3RydWN0IHFldGhfaGRyKSk7CiAJCX0KIAkJLyogaXMgZGV2aWNlIFVQID8gKi8KIAkJaWYgKCEoY2FyZC0+ZGV2LT5mbGFncyAmIElGRl9VUCkpewpAQCAtMzc3OCw5ICszNzc5LDExIEBACiAJfQogCS8qIHRyeSBzb21ldGhpbmcgZWxzZSAqLwogCWlmIChza2ItPnByb3RvY29sID09IEVUSF9QX0lQVjYpCi0JCXJldHVybiAoc2tiLT5uaC5yYXdbMjRdID09IDB4ZmYpID8gUlROX01VTFRJQ0FTVCA6IDA7CisJCXJldHVybiAoc2tiX25ldHdvcmtfaGVhZGVyKHNrYilbMjRdID09IDB4ZmYpID8KKwkJCQlSVE5fTVVMVElDQVNUIDogMDsKIAllbHNlIGlmIChza2ItPnByb3RvY29sID09IEVUSF9QX0lQKQotCQlyZXR1cm4gKChza2ItPm5oLnJhd1sxNl0gJiAweGYwKSA9PSAweGUwKSA/IFJUTl9NVUxUSUNBU1QgOiAwOworCQlyZXR1cm4gKChza2JfbmV0d29ya19oZWFkZXIoc2tiKVsxNl0gJiAweGYwKSA9PSAweGUwKSA/CisJCQkJUlROX01VTFRJQ0FTVCA6IDA7CiAJLyogLi4uICovCiAJaWYgKCFtZW1jbXAoc2tiLT5kYXRhLCBza2ItPmRldi0+YnJvYWRjYXN0LCA2KSkKIAkJcmV0dXJuIFJUTl9CUk9BRENBU1Q7CkBAIC0zODE4LDE4ICszODIxLDIwIEBACiAJCQlyZXR1cm4gY2FyZC0+aW5mby5pc19tdWx0aWNhc3RfZGlmZmVyZW50ICYKIAkJCQkoY2FyZC0+cWRpby5ub19vdXRfcXVldWVzIC0gMSk7CiAJCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgJiYgKGlwdiA9PSA0KSkgeworCQkJY29uc3QgdTggdG9zID0gaXBfaGRyKHNrYiktPnRvczsKKwogCQkJaWYgKGNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZz09UUVUSF9QUklPX1FfSU5HX1RPUyl7Ci0JCQkJaWYgKHNrYi0+bmguaXBoLT50b3MgJiBJUF9UT1NfTk9USU1QT1JUQU5UKQorCQkJCWlmICh0b3MgJiBJUF9UT1NfTk9USU1QT1JUQU5UKQogCQkJCQlyZXR1cm4gMzsKLQkJCQlpZiAoc2tiLT5uaC5pcGgtPnRvcyAmIElQX1RPU19ISUdIUkVMSUFCSUxJVFkpCisJCQkJaWYgKHRvcyAmIElQX1RPU19ISUdIUkVMSUFCSUxJVFkpCiAJCQkJCXJldHVybiAyOwotCQkJCWlmIChza2ItPm5oLmlwaC0+dG9zICYgSVBfVE9TX0hJR0hUSFJPVUdIUFVUKQorCQkJCWlmICh0b3MgJiBJUF9UT1NfSElHSFRIUk9VR0hQVVQpCiAJCQkJCXJldHVybiAxOwotCQkJCWlmIChza2ItPm5oLmlwaC0+dG9zICYgSVBfVE9TX0xPV0RFTEFZKQorCQkJCWlmICh0b3MgJiBJUF9UT1NfTE9XREVMQVkpCiAJCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKGNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZz09UUVUSF9QUklPX1FfSU5HX1BSRUMpCi0JCQkJcmV0dXJuIDMgLSAoc2tiLT5uaC5pcGgtPnRvcyA+PiA2KTsKKwkJCQlyZXR1cm4gMyAtICh0b3MgPj4gNik7CiAJCX0gZWxzZSBpZiAoY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nICYmIChpcHYgPT0gNikpIHsKIAkJCS8qIFRPRE86IElQdjYhISEgKi8KIAkJfQpAQCAtMzg2Niw5ICszODcxLDkgQEAKIAkJICogbWVtY3B5cyBpbnN0ZWFkIG9mIG9uZSBtZW1tb3ZlIHRvIHNhdmUgY3ljbGVzLgogCQkgKi8KIAkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCQltZW1jcHkoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyA0LCA0KTsKLQkJbWVtY3B5KHNrYi0+ZGF0YSArIDQsIHNrYi0+ZGF0YSArIDgsIDQpOwotCQltZW1jcHkoc2tiLT5kYXRhICsgOCwgc2tiLT5kYXRhICsgMTIsIDQpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNrYi0+ZGF0YSArIDQsIDQpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCA0LCBza2ItPmRhdGEgKyA4LCA0KTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgOCwgc2tiLT5kYXRhICsgMTIsIDQpOwogCQl0YWcgPSAodTE2ICopKHNrYi0+ZGF0YSArIDEyKTsKIAkJLyoKIAkJICogZmlyc3QgdHdvIGJ5dGVzICA9IEVUSF9QXzgwMjFRICgweDgxMDApCkBAIC00MDM5LDcgKzQwNDQsOCBAQAogCQkJICAgICooKHUzMiAqKSBza2ItPmRzdC0+bmVpZ2hib3VyLT5wcmltYXJ5X2tleSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBmaWxsIGluIGRlc3RpbmF0aW9uIGFkZHJlc3MgdXNlZCBpbiBpcCBoZWFkZXIgKi8KLQkJCSooKHUzMiAqKSAoJmhkci0+aGRyLmwzLmRlc3RfYWRkclsxMl0pKSA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwkJCSooKHUzMiAqKSgmaGRyLT5oZHIubDMuZGVzdF9hZGRyWzEyXSkpID0KKwkJCQkJCQkgICBpcF9oZHIoc2tiKS0+ZGFkZHI7CiAJCX0KIAl9IGVsc2UgaWYgKGlwdiA9PSA2KSB7IC8qIElQdjYgb3IgcGFzc3RocnUgKi8KIAkJaGRyLT5oZHIubDMuZmxhZ3MgPSBxZXRoX2dldF9xZXRoX2hkcl9mbGFnczYoY2FzdF90eXBlKTsKQEAgLTQwNDgsNyArNDA1NCw4IEBACiAJCQkgICAgICAgc2tiLT5kc3QtPm5laWdoYm91ci0+cHJpbWFyeV9rZXksIDE2KTsKIAkJfSBlbHNlIHsKIAkJCS8qIGZpbGwgaW4gZGVzdGluYXRpb24gYWRkcmVzcyB1c2VkIGluIGlwIGhlYWRlciAqLwotCQkJbWVtY3B5KGhkci0+aGRyLmwzLmRlc3RfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAxNik7CisJCQltZW1jcHkoaGRyLT5oZHIubDMuZGVzdF9hZGRyLAorCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMTYpOwogCQl9CiAJfSBlbHNlIHsgLyogcGFzc3Rocm91Z2ggKi8KICAgICAgICAgICAgICAgICBpZigoc2tiLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDJfVFIpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmgKaW5kZXggMTQ1MDRhZi4uYzIwZTkyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Rzby5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF90c28uaApAQCAtNDAsOCArNDAsOCBAQAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJ0c29maGRyIik7CiAKIAloZHIgID0gKHN0cnVjdCBxZXRoX2hkcl90c28gKikgc2tiLT5kYXRhOwotCWlwaCAgPSBza2ItPm5oLmlwaDsKLQl0Y3BoID0gc2tiLT5oLnRoOworCWlwaCAgPSBpcF9oZHIoc2tiKTsKKwl0Y3BoID0gdGNwX2hkcihza2IpOwogCS8qZml4IGhlYWRlciB0byBUU08gdmFsdWVzIC4uLiovCiAJaGRyLT5oZHIuaGRyLmwzLmlkID0gUUVUSF9IRUFERVJfVFlQRV9UU087CiAJLypzZXQgdmFsdWVzIHdoaWNoIGFyZSBmaXggZm9yIHRoZSBmaXJzdCBhcHByb2FjaCAuLi4qLwpAQCAtNjMsMTMgKzYzLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWV0aF90c29fc2V0X3RjcGlwX2hlYWRlcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoOwotCXN0cnVjdCBpcHY2aGRyICppcDZoOwotCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0KLQlpcGggID0gc2tiLT5uaC5pcGg7Ci0JaXA2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JdGNwaCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCAgICA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoICA9IHRjcF9oZHIoc2tiKTsKIAogCXRjcGgtPmNoZWNrID0gMDsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUFY2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvczM5MG1hY2guYyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCmluZGV4IDgwNmJiMWEuLjY0NGEwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCisrKyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY2lvL2Npby5oIgogI2luY2x1ZGUgImNpby9jaHNjLmgiCiAjaW5jbHVkZSAiY2lvL2Nzcy5oIgorI2luY2x1ZGUgImNpby9jaHAuaCIKICNpbmNsdWRlICJzMzkwbWFjaC5oIgogCiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBtX3NlbTsKQEAgLTQ0LDE0ICs0NSwxMyBAQAogczM5MF9jb2xsZWN0X2Nyd19pbmZvKHZvaWQgKnBhcmFtKQogewogCXN0cnVjdCBjcncgY3J3WzJdOwotCWludCBjY29kZSwgcmV0LCBzbG93OworCWludCBjY29kZTsKIAlzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CiAJdW5zaWduZWQgaW50IGNoYWluOwogCiAJc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUgKilwYXJhbTsKIHJlcGVhdDoKIAlkb3duX2ludGVycnVwdGlibGUoc2VtKTsKLQlzbG93ID0gMDsKIAljaGFpbiA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJaWYgKHVubGlrZWx5KGNoYWluID4gMSkpIHsKQEAgLTg0LDkgKzg0LDggQEAKIAkJLyogQ2hlY2sgZm9yIG92ZXJmbG93cy4gKi8KIAkJaWYgKGNyd1tjaGFpbl0ub2ZsdykgewogCQkJcHJfZGVidWcoIiVzOiBjcncgb3ZlcmZsb3cgZGV0ZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJY3NzX3JlaXRlcmF0ZV9zdWJjaGFubmVscygpOworCQkJY3NzX3NjaGVkdWxlX2V2YWxfYWxsKCk7CiAJCQljaGFpbiA9IDA7Ci0JCQlzbG93ID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXN3aXRjaCAoY3J3W2NoYWluXS5yc2MpIHsKQEAgLTk0LDEwICs5Myw3IEBACiAJCQlpZiAoY3J3WzBdLmNobiAmJiAhY2hhaW4pCiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1Zygic291cmNlIGlzIHN1YmNoYW5uZWwgJTA0WFxuIiwgY3J3WzBdLnJzaWQpOwotCQkJcmV0ID0gY3NzX3Byb2Nlc3NfY3J3IChjcndbMF0ucnNpZCwKLQkJCQkJICAgICAgIGNoYWluID8gY3J3WzFdLnJzaWQgOiAwKTsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJCQlzbG93ID0gMTsKKwkJCWNzc19wcm9jZXNzX2NydyhjcndbMF0ucnNpZCwgY2hhaW4gPyBjcndbMV0ucnNpZCA6IDApOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1JXX1JTQ19NT05JVE9SOgogCQkJcHJfZGVidWcoInNvdXJjZSBpcyBtb25pdG9yaW5nIGZhY2lsaXR5XG4iKTsKQEAgLTExNiwyOCArMTEyLDIzIEBACiAJCQl9CiAJCQlzd2l0Y2ggKGNyd1swXS5lcmMpIHsKIAkJCWNhc2UgQ1JXX0VSQ19JUEFSTTogLyogUGF0aCBoYXMgY29tZS4gKi8KLQkJCQlyZXQgPSBjaHBfcHJvY2Vzc19jcncoY3J3WzBdLnJzaWQsIDEpOworCQkJCWNocF9wcm9jZXNzX2NydyhjcndbMF0ucnNpZCwgMSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENSV19FUkNfUEVSUkk6IC8qIFBhdGggaGFzIGdvbmUuICovCiAJCQljYXNlIENSV19FUkNfUEVSUk46Ci0JCQkJcmV0ID0gY2hwX3Byb2Nlc3NfY3J3KGNyd1swXS5yc2lkLCAwKTsKKwkJCQljaHBfcHJvY2Vzc19jcncoY3J3WzBdLnJzaWQsIDApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlwcl9kZWJ1ZygiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGVyYz0leFxuIiwKIAkJCQkJIGNyd1swXS5lcmMpOwotCQkJCXJldCA9IDA7CiAJCQl9Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCi0JCQkJc2xvdyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBDUldfUlNDX0NPTkZJRzoKIAkJCXByX2RlYnVnKCJzb3VyY2UgaXMgY29uZmlndXJhdGlvbi1hbGVydCBmYWNpbGl0eVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBDUldfUlNDX0NTUzoKIAkJCXByX2RlYnVnKCJzb3VyY2UgaXMgY2hhbm5lbCBzdWJzeXN0ZW1cbiIpOwotCQkJcmV0ID0gY2hzY19wcm9jZXNzX2NydygpOwotCQkJaWYgKHJldCA9PSAtRUFHQUlOKQotCQkJCXNsb3cgPSAxOworCQkJY2hzY19wcm9jZXNzX2NydygpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcl9kZWJ1ZygidW5rbm93biBzb3VyY2VcbiIpOwpAQCAtMTQ2LDggKzEzNyw2IEBACiAJCS8qIGNoYWluIGlzIGFsd2F5cyAwIG9yIDEgaGVyZS4gKi8KIAkJY2hhaW4gPSBjcndbY2hhaW5dLmNobiA/IGNoYWluICsgMSA6IDA7CiAJfQotCWlmIChzbG93KQotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKIAlnb3RvIHJlcGVhdDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zeXNpbmZvLmMgYi9kcml2ZXJzL3MzOTAvc3lzaW5mby5jCmluZGV4IDA5MDc0M2QuLjE5MzQzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zeXNpbmZvLmMKKysrIGIvZHJpdmVycy9zMzkwL3N5c2luZm8uYwpAQCAtMzU3LDYgKzM1NywyNCBAQAogCiBfX2luaXRjYWxsKGNyZWF0ZV9wcm9jX3N5c2luZm8pOwogCitpbnQgZ2V0X2NwdV9jYXBhYmlsaXR5KHVuc2lnbmVkIGludCAqY2FwYWJpbGl0eSkKK3sKKwlzdHJ1Y3Qgc3lzaW5mb18xXzJfMiAqaW5mbzsKKwlpbnQgcmM7CisKKwlpbmZvID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSBzdHNpKGluZm8sIDEsIDIsIDIpOworCWlmIChyYyA9PSAtRU5PU1lTKQorCQlnb3RvIG91dDsKKwlyYyA9IDA7CisJKmNhcGFiaWxpdHkgPSBpbmZvLT5jYXBhYmlsaXR5Oworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mbyk7CisJcmV0dXJuIHJjOworfQorCiAvKgogICogQ1BVIGNhcGFiaWxpdHkgbWlnaHQgaGF2ZSBjaGFuZ2VkLiBUaGVyZWZvcmUgcmVjYWxjdWxhdGUgbG9vcHNfcGVyX2ppZmZ5LgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKaW5kZXggMWI1OWIyNy4uNGJmOWFhNTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCkBAIC01MCw3ICs1MCw3IEBACiAJd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7CiAJCWVyciA9IDA7CiAKLQkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKSBza2ItPmRhdGE7CisJCW5saCA9IG5sbXNnX2hkcihza2IpOwogCQlpZiAoKG5saC0+bmxtc2dfbGVuIDwgKHNpemVvZigqbmxoKSArIHNpemVvZigqaGRyKSkpIHx8CiAJCSAgICAoc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkaXNjYXJkaW5nIHBhcnRpYWwgc2tiXG4iLApAQCAtMTY4LDcgKzE2OCw4IEBACiAJfQogCiAJc2NzaV9ubF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfU0NTSVRSQU5TUE9SVCwKLQkJCQlTQ1NJX05MX0dSUF9DTlQsIHNjc2lfbmxfcmN2LCBUSElTX01PRFVMRSk7CisJCQkJU0NTSV9OTF9HUlBfQ05ULCBzY3NpX25sX3JjdiwgTlVMTCwKKwkJCQlUSElTX01PRFVMRSk7CiAJaWYgKCFzY3NpX25sX3NvY2spIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaXN0ZXIgb2YgcmVjaWV2ZSBoYW5kbGVyIGZhaWxlZFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwppbmRleCBjZTBkMTRhLi5hYWJhYTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMTA4MSw3ICsxMDgxLDcgQEAKIAkJCXN0cnVjdCBubG1zZ2hkcgkqbmxoOwogCQkJc3RydWN0IGlzY3NpX3VldmVudCAqZXY7CiAKLQkJCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJCQlubGggPSBubG1zZ19oZHIoc2tiKTsKIAkJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZigqbmxoKSB8fAogCQkJICAgIHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pIHsKIAkJCQlicmVhazsKQEAgLTE0MzUsNyArMTQzNSw3IEBACiAJaWYgKGVycikKIAkJZ290byB1bnJlZ2lzdGVyX2Nvbm5fY2xhc3M7CiAKLQlubHMgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19JU0NTSSwgMSwgaXNjc2lfaWZfcngsCisJbmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSVNDU0ksIDEsIGlzY3NpX2lmX3J4LCBOVUxMLAogCQkJVEhJU19NT0RVTEUpOwogCWlmICghbmxzKSB7CiAJCWVyciA9IC1FTk9CVUZTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCmluZGV4IGVjNjNiMGUuLmQzZTJjNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlVRFNMX0FTU0VSVChzYXJiLT50YWlsICsgQVRNX0NFTExfUEFZTE9BRCA8PSBzYXJiLT5lbmQpOwogCX0KIAotCW1lbWNweShzYXJiLT50YWlsLCBzb3VyY2UgKyBBVE1fQ0VMTF9IRUFERVIsIEFUTV9DRUxMX1BBWUxPQUQpOworCW1lbWNweShza2JfdGFpbF9wb2ludGVyKHNhcmIpLCBzb3VyY2UgKyBBVE1fQ0VMTF9IRUFERVIsIEFUTV9DRUxMX1BBWUxPQUQpOwogCV9fc2tiX3B1dChzYXJiLCBBVE1fQ0VMTF9QQVlMT0FEKTsKIAogCWlmIChwdGkgJiAxKSB7CkBAIC0zNzAsNyArMzcwLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKGNyYzMyX2JlKH4wLCBzYXJiLT50YWlsIC0gcGR1X2xlbmd0aCwgcGR1X2xlbmd0aCkgIT0gMHhjNzA0ZGQ3YikgeworCQlpZiAoY3JjMzJfYmUofjAsIHNrYl90YWlsX3BvaW50ZXIoc2FyYikgLSBwZHVfbGVuZ3RoLCBwZHVfbGVuZ3RoKSAhPSAweGM3MDRkZDdiKSB7CiAJCQlhdG1fcmxkYmcoaW5zdGFuY2UsICIlczogcGFja2V0IGZhaWxlZCBjcmMgY2hlY2sgKHZjYzogMHglcCkhXG4iLAogCQkJCSAgX19mdW5jX18sIHZjYyk7CiAJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwpAQCAtMzk2LDcgKzM5Niw5IEBACiAJCQlnb3RvIG91dDsJLyogYXRtX2NoYXJnZSBpbmNyZW1lbnRzIHJ4X2Ryb3AgKi8KIAkJfQogCi0JCW1lbWNweShza2ItPmRhdGEsIHNhcmItPnRhaWwgLSBwZHVfbGVuZ3RoLCBsZW5ndGgpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsCisJCQkJCXNrYl90YWlsX3BvaW50ZXIoc2FyYikgLSBwZHVfbGVuZ3RoLAorCQkJCQlsZW5ndGgpOwogCQlfX3NrYl9wdXQoc2tiLCBsZW5ndGgpOwogCiAJCXZkYmcoIiVzOiBzZW5kaW5nIHNrYiAweCVwLCBza2ItPmxlbiAldSwgc2tiLT50cnVlc2l6ZSAldSIsCkBAIC00ODQsNyArNDg2LDcgQEAKIAkJcHRyWzRdID0gMHhlYzsKIAkJcHRyICs9IEFUTV9DRUxMX0hFQURFUjsKIAotCQltZW1jcHkocHRyLCBza2ItPmRhdGEsIGRhdGFfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHB0ciwgZGF0YV9sZW4pOwogCQlwdHIgKz0gZGF0YV9sZW47CiAJCV9fc2tiX3B1bGwoc2tiLCBkYXRhX2xlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggMDRlNmI4NS4uOGY5ZjIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTE3NjYsNyArMTc2Niw2IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXNrYi0+ZGV2ID0gZGV2LT5uZXQ7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyAoc2tiLCBkZXYtPm5ldCk7CiAJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2FzaXguYyBiL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKaW5kZXggNTgwOGVhMC4uZDVlZjk3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2FzaXguYworKysgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAkJaWYgKGF4X3NrYikgewogCQkJYXhfc2tiLT5sZW4gPSBzaXplOwogCQkJYXhfc2tiLT5kYXRhID0gcGFja2V0OwotCQkJYXhfc2tiLT50YWlsID0gcGFja2V0ICsgc2l6ZTsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKGF4X3NrYiwgc2l6ZSk7CiAJCQl1c2JuZXRfc2tiX3JldHVybihkZXYsIGF4X3NrYik7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gMDsKQEAgLTMzOCw3ICszMzgsNyBAQAogCSAgICAmJiAoKGhlYWRyb29tICsgdGFpbHJvb20pID49ICg0ICsgcGFkbGVuKSkpIHsKIAkJaWYgKChoZWFkcm9vbSA8IDQpIHx8ICh0YWlscm9vbSA8IHBhZGxlbikpIHsKIAkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUoc2tiLT5oZWFkICsgNCwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JCQlza2ItPnRhaWwgPSBza2ItPmRhdGEgKyBza2ItPmxlbjsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogCQl9CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CkBAIC0zNTIsMTEgKzM1MiwxMSBAQAogCXNrYl9wdXNoKHNrYiwgNCk7CiAJcGFja2V0X2xlbiA9ICgoKHNrYi0+bGVuIC0gNCkgXiAweDAwMDBmZmZmKSA8PCAxNikgKyAoc2tiLT5sZW4gLSA0KTsKIAljcHVfdG9fbGUzMnMoJnBhY2tldF9sZW4pOwotCW1lbWNweShza2ItPmRhdGEsICZwYWNrZXRfbGVuLCBzaXplb2YocGFja2V0X2xlbikpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgJnBhY2tldF9sZW4sIHNpemVvZihwYWNrZXRfbGVuKSk7CiAKIAlpZiAoKHNrYi0+bGVuICUgNTEyKSA9PSAwKSB7CiAJCWNwdV90b19sZTMycygmcGFkYnl0ZXMpOwotCQltZW1jcHkoIHNrYi0+dGFpbCwgJnBhZGJ5dGVzLCBzaXplb2YocGFkYnl0ZXMpKTsKKwkJbWVtY3B5KHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgJnBhZGJ5dGVzLCBzaXplb2YocGFkYnl0ZXMpKTsKIAkJc2tiX3B1dChza2IsIHNpemVvZihwYWRieXRlcykpOwogCX0KIAlyZXR1cm4gc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2NhdGMuYyBiL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKaW5kZXggNDg1MjAxMi4uZmZlYzJlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2NhdGMuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCkBAIC0yNTUsNyArMjU1LDYgQEAKIAkJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKSkpCiAJCQlyZXR1cm47CiAKLQkJc2tiLT5kZXYgPSBjYXRjLT5uZXRkZXY7CiAJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBwa3Rfc3RhcnQgKyBwa3Rfb2Zmc2V0LCBwa3RfbGVuLCAwKTsKIAkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCkBAIC00MTksNyArNDE4LDcgQEAKIAljYXRjLT50eF9wdHIgPSAoKChjYXRjLT50eF9wdHIgLSAxKSA+PiA2KSArIDEpIDw8IDY7CiAJdHhfYnVmID0gY2F0Yy0+dHhfYnVmW2NhdGMtPnR4X2lkeF0gKyBjYXRjLT50eF9wdHI7CiAJKigodTE2Kil0eF9idWYpID0gKGNhdGMtPmlzX2Y1dTAxMSkgPyBjcHVfdG9fYmUxNigodTE2KXNrYi0+bGVuKSA6IGNwdV90b19sZTE2KCh1MTYpc2tiLT5sZW4pOwotCW1lbWNweSh0eF9idWYgKyAyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdHhfYnVmICsgMiwgc2tiLT5sZW4pOwogCWNhdGMtPnR4X3B0ciArPSBza2ItPmxlbiArIDI7CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFhfUlVOTklORywgJmNhdGMtPmZsYWdzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYyBiL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYwppbmRleCBkMjU3YThlLi4wMzFjZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvZ2w2MjBhLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJaWYgKChoZWFkcm9vbSA8ICg0ICsgNCoxKSkgfHwgKHRhaWxyb29tIDwgcGFkbGVuKSkgewogCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyAoNCArIDQqMSksCiAJCQkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JCQlza2ItPnRhaWwgPSBza2ItPmRhdGEgKyBza2ItPmxlbjsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogCQl9CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNrX2J1ZmYJKnNrYjI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKaW5kZXggZGU5NTI2OC4uYTBjYzA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwpAQCAtNjM2LDggKzYzNiw2IEBACiAKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAKLQkJc2tiLT5kZXYgPSBuZXQ7Ci0KIAkJZXRoX2NvcHlfYW5kX3N1bShza2IsIGthd2V0aC0+cnhfYnVmICsgMiwgcGt0X2xlbiwgMCk7CiAKIAkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKaW5kZXggY2NlYmZkZS4uMTliZjhkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUoc2tiLT5oZWFkCiAJCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCiAJCQkJCSAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGxlbjsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIAkJCWdvdG8gZW5jYXBzdWxhdGU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYwppbmRleCA2ZDEyOTYxLi4xYWQ0ZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKQEAgLTU3NSw3ICs1NzUsNiBAQAogCQkgKi8KIAkJaWYgKHBlZ2FzdXMtPnJ4X3Bvb2xbaV0gPT0gTlVMTCkKIAkJCXJldHVybjsKLQkJcGVnYXN1cy0+cnhfcG9vbFtpXS0+ZGV2ID0gcGVnYXN1cy0+bmV0OwogCQlza2JfcmVzZXJ2ZShwZWdhc3VzLT5yeF9wb29sW2ldLCAyKTsKIAl9CiB9CkBAIC04OTAsNyArODg5LDcgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CiAKIAkoKF9fbGUxNiAqKSBwZWdhc3VzLT50eF9idWZmKVswXSA9IGNwdV90b19sZTE2KGwxNik7Ci0JbWVtY3B5KHBlZ2FzdXMtPnR4X2J1ZmYgKyAyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcGVnYXN1cy0+dHhfYnVmZiArIDIsIHNrYi0+bGVuKTsKIAl1c2JfZmlsbF9idWxrX3VyYihwZWdhc3VzLT50eF91cmIsIHBlZ2FzdXMtPnVzYiwKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBlZ2FzdXMtPnVzYiwgMiksCiAJCQkgIHBlZ2FzdXMtPnR4X2J1ZmYsIGNvdW50LApAQCAtMTQxNSw4ICsxNDE0LDEwIEBACiAJdW5saW5rX2FsbF91cmJzKHBlZ2FzdXMpOwogCWZyZWVfYWxsX3VyYnMocGVnYXN1cyk7CiAJZnJlZV9za2JfcG9vbChwZWdhc3VzKTsKLQlpZiAocGVnYXN1cy0+cnhfc2tiKQorCWlmIChwZWdhc3VzLT5yeF9za2IgIT0gTlVMTCkgewogCQlkZXZfa2ZyZWVfc2tiKHBlZ2FzdXMtPnJ4X3NrYik7CisJCXBlZ2FzdXMtPnJ4X3NrYiA9IE5VTEw7CisJfQogCWZyZWVfbmV0ZGV2KHBlZ2FzdXMtPm5ldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ybmRpc19ob3N0LmMgYi9kcml2ZXJzL3VzYi9uZXQvcm5kaXNfaG9zdC5jCmluZGV4IDM5YTIxYzcuLjFkMzY3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ybmRpc19ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpAQCAtNTg4LDcgKzU4OCw3IEBACiAJCWlmIChsaWtlbHkoKHNpemVvZiAqaGRyKSA8PSByb29tKSkgewogCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyBzaXplb2YgKmhkciwKIAkJCQkJICAgIHNrYi0+ZGF0YSwgbGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGxlbjsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIAkJCWdvdG8gZmlsbDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCmluZGV4IGVhMTUzZGMuLmZhNTk4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYwpAQCAtNjQ2LDcgKzY0Niw2IEBACiAJCWlmICghc2tiKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJc2tiLT5kZXYgPSBkZXYtPm5ldGRldjsKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJZGV2LT5yeF9za2JfcG9vbFtpXSA9IHNrYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggZGU2OWIxOC4uMGM1NDY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiB7CiAJaW50CXN0YXR1czsKIAotCXNrYi0+ZGV2ID0gZGV2LT5uZXQ7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldi0+bmV0KTsKIAlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggM2M0ODg2Yi4uZTMzYzA4OSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0yMDE5LDcgKzIwMTksNyBAQAogY29uZmlnIEFGU19GUwogCXRyaXN0YXRlICJBbmRyZXcgRmlsZSBTeXN0ZW0gc3VwcG9ydCAoQUZTKSAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IFJYUlBDCisJc2VsZWN0IEFGX1JYUlBDCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGdldCBhbiBleHBlcmltZW50YWwgQW5kcmV3IEZpbGUgU3lzdGVtCiAJICBkcml2ZXIuIEl0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuc2VjdXJlZCByZWFkLW9ubHkgQUZTIGFjY2Vzcy4KQEAgLTIwMjgsOCArMjAyOCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgUlhSUEMKLQl0cmlzdGF0ZQorY29uZmlnIEFGU19ERUJVRworCWJvb2wgIkFGUyBkeW5hbWljIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEFGU19GUworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gbWFrZSBydW50aW1lIGNvbnRyb2xsYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgYXBwZWFyLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZnMudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIDlQX0ZTCiAJdHJpc3RhdGUgIlBsYW4gOSBSZXNvdXJjZSBTaGFyaW5nIFN1cHBvcnQgKDlQMjAwMCkgKEV4cGVyaW1lbnRhbCkiCmRpZmYgLS1naXQgYS9mcy9hZnMvTWFrZWZpbGUgYi9mcy9hZnMvTWFrZWZpbGUKaW5kZXggNDAyOWM5ZC4uMDE1NDVlYiAxMDA2NDQKLS0tIGEvZnMvYWZzL01ha2VmaWxlCisrKyBiL2ZzL2Fmcy9NYWtlZmlsZQpAQCAtMiw4ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIFJlZCBIYXQgTGludXggQUZTIGNsaWVudC4KICMKIAotI0NGTEFHUyArPSAtZmluc3RydW1lbnQtZnVuY3Rpb25zCi0KIGthZnMtb2JqcyA6PSBcCiAJY2FsbGJhY2subyBcCiAJY2VsbC5vIFwKQEAgLTEyLDE0ICsxMCwxNSBAQAogCWZpbGUubyBcCiAJZnNjbGllbnQubyBcCiAJaW5vZGUubyBcCi0Ja2Fmc2FzeW5jZC5vIFwKLQlrYWZzdGltb2QubyBcCiAJbWFpbi5vIFwKIAltaXNjLm8gXAogCW1udHB0Lm8gXAogCXByb2MubyBcCisJcnhycGMubyBcCisJc2VjdXJpdHkubyBcCiAJc2VydmVyLm8gXAogCXN1cGVyLm8gXAorCXVzZS1ydG5ldGxpbmsubyBcCiAJdmxjbGllbnQubyBcCiAJdmxvY2F0aW9uLm8gXAogCXZub2RlLm8gXApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Fmcy5oIGIvZnMvYWZzL2Fmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDA3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvYWZzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qIEFGUyBjb21tb24gdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBRlNfSAorI2RlZmluZSBBRlNfSAorCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKworI2RlZmluZSBBRlNfTUFYQ0VMTE5BTUUJNjQJCS8qIG1heGltdW0gbGVuZ3RoIG9mIGEgY2VsbCBuYW1lICovCisjZGVmaW5lIEFGU19NQVhWT0xOQU1FCTY0CQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHZvbHVtZSBuYW1lICovCisKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm9saWRfdDsKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm5vZGVpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCWFmc19kYXRhdmVyc2lvbl90OworCit0eXBlZGVmIGVudW0geworCUFGU1ZMX1JXVk9MLAkJCS8qIHJlYWQvd3JpdGUgdm9sdW1lICovCisJQUZTVkxfUk9WT0wsCQkJLyogcmVhZC1vbmx5IHZvbHVtZSAqLworCUFGU1ZMX0JBQ0tWT0wsCQkJLyogYmFja3VwIHZvbHVtZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhZnNfdm9sdHlwZV90OworCit0eXBlZGVmIGVudW0geworCUFGU19GVFlQRV9JTlZBTElECT0gMCwKKwlBRlNfRlRZUEVfRklMRQkJPSAxLAorCUFGU19GVFlQRV9ESVIJCT0gMiwKKwlBRlNfRlRZUEVfU1lNTElOSwk9IDMsCit9IGFmc19maWxlX3R5cGVfdDsKKworLyoKKyAqIEFGUyBmaWxlIGlkZW50aWZpZXIKKyAqLworc3RydWN0IGFmc19maWQgeworCWFmc192b2xpZF90CXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192bm9kZWlkX3QJdm5vZGU7CQkvKiBmaWxlIGluZGV4IHdpdGhpbiB2b2x1bWUgKi8KKwl1bnNpZ25lZAl1bmlxdWU7CQkvKiB1bmlxdWUgSUQgbnVtYmVyIChmaWxlIGluZGV4IHZlcnNpb24pICovCit9OworCisvKgorICogQUZTIGNhbGxiYWNrIG5vdGlmaWNhdGlvbgorICovCit0eXBlZGVmIGVudW0geworCUFGU0NNX0NCX1VOVFlQRUQJPSAwLAkvKiBubyB0eXBlIHNldCBvbiBDQiBicmVhayAqLworCUFGU0NNX0NCX0VYQ0xVU0lWRQk9IDEsCS8qIENCIGV4Y2x1c2l2ZSB0byBDTSBbbm90IGltcGxlbWVudGVkXSAqLworCUFGU0NNX0NCX1NIQVJFRAkJPSAyLAkvKiBDQiBzaGFyZWQgYnkgb3RoZXIgQ00ncyAqLworCUFGU0NNX0NCX0RST1BQRUQJPSAzLAkvKiBDQiBwcm9taXNlIGNhbmNlbGxlZCBieSBmaWxlIHNlcnZlciAqLworfSBhZnNfY2FsbGJhY2tfdHlwZV90OworCitzdHJ1Y3QgYWZzX2NhbGxiYWNrIHsKKwlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogZmlsZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQJCXZlcnNpb247CS8qIGNhbGxiYWNrIHZlcnNpb24gKi8KKwl1bnNpZ25lZAkJZXhwaXJ5OwkJLyogdGltZSBhdCB3aGljaCBleHBpcmVzICovCisJYWZzX2NhbGxiYWNrX3R5cGVfdAl0eXBlOwkJLyogdHlwZSBvZiBjYWxsYmFjayAqLworfTsKKworI2RlZmluZSBBRlNDQk1BWCA1MAkvKiBtYXhpbXVtIGNhbGxiYWNrcyB0cmFuc2ZlcnJlZCBwZXIgYnVsayBvcCAqLworCisvKgorICogQUZTIHZvbHVtZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYWZzX3ZvbHVtZV9pbmZvIHsKKwlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCisJYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2YgdGhpcyB2b2x1bWUgKi8KKwlhZnNfdm9saWRfdAkJdHlwZV92aWRzWzVdOwkvKiB2b2x1bWUgSUQncyBmb3IgcG9zc2libGUgdHlwZXMgZm9yIHRoaXMgdm9sICovCisKKwkvKiBsaXN0IG9mIGZpbGVzZXJ2ZXJzIHNlcnZpbmcgdGhpcyB2b2x1bWUgKi8KKwlzaXplX3QJCQluc2VydmVyczsJLyogbnVtYmVyIG9mIGVudHJpZXMgdXNlZCBpbiBzZXJ2ZXJzW10gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaW5fYWRkcglhZGRyOwkJLyogZmlsZXNlcnZlciBhZGRyZXNzICovCisJfSBzZXJ2ZXJzWzhdOworfTsKKworLyoKKyAqIEFGUyBzZWN1cml0eSBBQ0UgYWNjZXNzIG1hc2sKKyAqLwordHlwZWRlZiB1MzIgYWZzX2FjY2Vzc190OworI2RlZmluZSBBRlNfQUNFX1JFQUQJCTB4MDAwMDAwMDFVCS8qIC0gcGVybWlzc2lvbiB0byByZWFkIGEgZmlsZS9kaXIgKi8KKyNkZWZpbmUgQUZTX0FDRV9XUklURQkJMHgwMDAwMDAwMlUJLyogLSBwZXJtaXNzaW9uIHRvIHdyaXRlL2NobW9kIGEgZmlsZSAqLworI2RlZmluZSBBRlNfQUNFX0lOU0VSVAkJMHgwMDAwMDAwNFUJLyogLSBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBkaXJlbnQgaW4gYSBkaXIgKi8KKyNkZWZpbmUgQUZTX0FDRV9MT09LVVAJCTB4MDAwMDAwMDhVCS8qIC0gcGVybWlzc2lvbiB0byBsb29rdXAgYSBmaWxlL2RpciBpbiBhIGRpciAqLworI2RlZmluZSBBRlNfQUNFX0RFTEVURQkJMHgwMDAwMDAxMFUJLyogLSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGRpcmVudCBmcm9tIGEgZGlyICovCisjZGVmaW5lIEFGU19BQ0VfTE9DSwkJMHgwMDAwMDAyMFUJLyogLSBwZXJtaXNzaW9uIHRvIGxvY2sgYSBmaWxlICovCisjZGVmaW5lIEFGU19BQ0VfQURNSU5JU1RFUgkweDAwMDAwMDQwVQkvKiAtIHBlcm1pc3Npb24gdG8gY2hhbmdlIEFDTCAqLworI2RlZmluZSBBRlNfQUNFX1VTRVJfQQkJMHgwMTAwMDAwMFUJLyogLSAnQScgdXNlci1kZWZpbmVkIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0IJCTB4MDIwMDAwMDBVCS8qIC0gJ0InIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisjZGVmaW5lIEFGU19BQ0VfVVNFUl9DCQkweDA0MDAwMDAwVQkvKiAtICdDJyB1c2VyLWRlZmluZWQgcGVybWlzc2lvbiAqLworI2RlZmluZSBBRlNfQUNFX1VTRVJfRAkJMHgwODAwMDAwMFUJLyogLSAnRCcgdXNlci1kZWZpbmVkIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0UJCTB4MTAwMDAwMDBVCS8qIC0gJ0UnIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisjZGVmaW5lIEFGU19BQ0VfVVNFUl9GCQkweDIwMDAwMDAwVQkvKiAtICdGJyB1c2VyLWRlZmluZWQgcGVybWlzc2lvbiAqLworI2RlZmluZSBBRlNfQUNFX1VTRVJfRwkJMHg0MDAwMDAwMFUJLyogLSAnRycgdXNlci1kZWZpbmVkIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0gJCTB4ODAwMDAwMDBVCS8qIC0gJ0gnIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisKKy8qCisgKiBBRlMgZmlsZSBzdGF0dXMgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGFmc19maWxlX3N0YXR1cyB7CisJdW5zaWduZWQJCWlmX3ZlcnNpb247CS8qIGludGVyZmFjZSB2ZXJzaW9uICovCisjZGVmaW5lIEFGU19GU1RBVFVTX1ZFUlNJT04JMQorCisJYWZzX2ZpbGVfdHlwZV90CQl0eXBlOwkJLyogZmlsZSB0eXBlICovCisJdW5zaWduZWQJCW5saW5rOwkJLyogbGluayBjb3VudCAqLworCXU2NAkJCXNpemU7CQkvKiBmaWxlIHNpemUgKi8KKwlhZnNfZGF0YXZlcnNpb25fdAlkYXRhX3ZlcnNpb247CS8qIGN1cnJlbnQgZGF0YSB2ZXJzaW9uICovCisJdTMyCQkJYXV0aG9yOwkJLyogYXV0aG9yIElEICovCisJdTMyCQkJb3duZXI7CQkvKiBvd25lciBJRCAqLworCXUzMgkJCWdyb3VwOwkJLyogZ3JvdXAgSUQgKi8KKwlhZnNfYWNjZXNzX3QJCWNhbGxlcl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIGF1dGhlbnRpY2F0ZWQgY2FsbGVyICovCisJYWZzX2FjY2Vzc190CQlhbm9uX2FjY2VzczsJLyogYWNjZXNzIHJpZ2h0cyBmb3IgdW5hdXRoZW50aWNhdGVkIGNhbGxlciAqLworCXVtb2RlX3QJCQltb2RlOwkJLyogVU5JWCBtb2RlICovCisJc3RydWN0IGFmc19maWQJCXBhcmVudDsJCS8qIHBhcmVudCBkaXIgSUQgZm9yIG5vbi1kaXJzIG9ubHkgKi8KKwl0aW1lX3QJCQltdGltZV9jbGllbnQ7CS8qIGxhc3QgdGltZSBjbGllbnQgY2hhbmdlZCBkYXRhICovCisJdGltZV90CQkJbXRpbWVfc2VydmVyOwkvKiBsYXN0IHRpbWUgc2VydmVyIGNoYW5nZWQgZGF0YSAqLworfTsKKworLyoKKyAqIEFGUyBmaWxlIHN0YXR1cyBjaGFuZ2UgcmVxdWVzdAorICovCitzdHJ1Y3QgYWZzX3N0b3JlX3N0YXR1cyB7CisJdTMyCQkJbWFzazsJCS8qIHdoaWNoIGJpdHMgb2YgdGhlIHN0cnVjdCBhcmUgc2V0ICovCisJdTMyCQkJbXRpbWVfY2xpZW50OwkvKiBsYXN0IHRpbWUgY2xpZW50IGNoYW5nZWQgZGF0YSAqLworCXUzMgkJCW93bmVyOwkJLyogb3duZXIgSUQgKi8KKwl1MzIJCQlncm91cDsJCS8qIGdyb3VwIElEICovCisJdW1vZGVfdAkJCW1vZGU7CQkvKiBVTklYIG1vZGUgKi8KK307CisKKyNkZWZpbmUgQUZTX1NFVF9NVElNRQkJMHgwMQkJLyogc2V0IHRoZSBtdGltZSAqLworI2RlZmluZSBBRlNfU0VUX09XTkVSCQkweDAyCQkvKiBzZXQgdGhlIG93bmVyIElEICovCisjZGVmaW5lIEFGU19TRVRfR1JPVVAJCTB4MDQJCS8qIHNldCB0aGUgZ3JvdXAgSUQgKHVuc3VwcG9ydGVkPykgKi8KKyNkZWZpbmUgQUZTX1NFVF9NT0RFCQkweDA4CQkvKiBzZXQgdGhlIFVOSVggbW9kZSAqLworI2RlZmluZSBBRlNfU0VUX1NFR19TSVpFCTB4MTAJCS8qIHNldCB0aGUgc2VnbWVudCBzaXplICh1bnN1cHBvcnRlZCkgKi8KKworLyoKKyAqIEFGUyB2b2x1bWUgc3luY2hyb25pc2F0aW9uIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfdm9sc3luYyB7CisJdGltZV90CQkJY3JlYXRpb247CS8qIHZvbHVtZSBjcmVhdGlvbiB0aW1lICovCit9OworCisjZW5kaWYgLyogQUZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnNfY20uaCBiL2ZzL2Fmcy9hZnNfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRkNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Fmc19jbS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEFGUyBDYWNoZSBNYW5hZ2VyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQUZTX0NNX0gKKyNkZWZpbmUgQUZTX0NNX0gKKworI2RlZmluZSBBRlNfQ01fUE9SVAkJNzAwMQkvKiBBRlMgZmlsZSBzZXJ2ZXIgcG9ydCAqLworI2RlZmluZSBDTV9TRVJWSUNFCQkxCS8qIEFGUyBGaWxlIFNlcnZpY2UgSUQgKi8KKworZW51bSBBRlNfQ01fT3BlcmF0aW9ucyB7CisJQ0JDYWxsQmFjawkJPSAyMDQsCS8qIGJyZWFrIGNhbGxiYWNrIHByb21pc2VzICovCisJQ0JJbml0Q2FsbEJhY2tTdGF0ZQk9IDIwNSwJLyogaW5pdGlhbGlzZSBjYWxsYmFjayBzdGF0ZSAqLworCUNCUHJvYmUJCQk9IDIwNiwJLyogcHJvYmUgY2xpZW50ICovCisJQ0JHZXRMb2NrCQk9IDIwNywJLyogZ2V0IGNvbnRlbnRzIG9mIENNIGxvY2sgdGFibGUgKi8KKwlDQkdldENFCQkJPSAyMDgsCS8qIGdldCBjYWNoZSBmaWxlIGRlc2NyaXB0aW9uICovCisJQ0JHZXRYU3RhdHNWZXJzaW9uCT0gMjA5LAkvKiBnZXQgdmVyc2lvbiBvZiBleHRlbmRlZCBzdGF0aXN0aWNzICovCisJQ0JHZXRYU3RhdHMJCT0gMjEwLAkvKiBnZXQgY29udGVudHMgb2YgZXh0ZW5kZWQgc3RhdGlzdGljcyBkYXRhICovCisJQ0JJbml0Q2FsbEJhY2tTdGF0ZTMJPSAyMTMsCS8qIGluaXRpYWxpc2UgY2FsbGJhY2sgc3RhdGUsIHZlcnNpb24gMyAqLworCUNCR2V0Q2FwYWJpbGl0aWVzCT0gNjU1MzgsIC8qIGdldCBjbGllbnQgY2FwYWJpbGl0aWVzICovCit9OworCisjZGVmaW5lIEFGU19DQVBfRVJST1JfVFJBTlNMQVRJT04JMHgxCisKKyNlbmRpZiAvKiBBRlNfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Fmc19mcy5oIGIvZnMvYWZzL2Fmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTBkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvYWZzX2ZzLmgKQEAgLTAsMCArMSw0OCBAQAorLyogQUZTIEZpbGUgU2VydmljZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFGU19GU19ICisjZGVmaW5lIEFGU19GU19ICisKKyNkZWZpbmUgQUZTX0ZTX1BPUlQJCTcwMDAJLyogQUZTIGZpbGUgc2VydmVyIHBvcnQgKi8KKyNkZWZpbmUgRlNfU0VSVklDRQkJMQkvKiBBRlMgRmlsZSBTZXJ2aWNlIElEICovCisKK2VudW0gQUZTX0ZTX09wZXJhdGlvbnMgeworCUZTRkVUQ0hEQVRBCQk9IDEzMCwJLyogQUZTIEZldGNoIGZpbGUgZGF0YSAqLworCUZTRkVUQ0hTVEFUVVMJCT0gMTMyLAkvKiBBRlMgRmV0Y2ggZmlsZSBzdGF0dXMgKi8KKwlGU1JFTU9WRUZJTEUJCT0gMTM2LAkvKiBBRlMgUmVtb3ZlIGEgZmlsZSAqLworCUZTQ1JFQVRFRklMRQkJPSAxMzcsCS8qIEFGUyBDcmVhdGUgYSBmaWxlICovCisJRlNSRU5BTUUJCT0gMTM4LAkvKiBBRlMgUmVuYW1lIG9yIG1vdmUgYSBmaWxlIG9yIGRpcmVjdG9yeSAqLworCUZTU1lNTElOSwkJPSAxMzksCS8qIEFGUyBDcmVhdGUgYSBzeW1ib2xpYyBsaW5rICovCisJRlNMSU5LCQkJPSAxNDAsCS8qIEFGUyBDcmVhdGUgYSBoYXJkIGxpbmsgKi8KKwlGU01BS0VESVIJCT0gMTQxLAkvKiBBRlMgQ3JlYXRlIGEgZGlyZWN0b3J5ICovCisJRlNSRU1PVkVESVIJCT0gMTQyLAkvKiBBRlMgUmVtb3ZlIGEgZGlyZWN0b3J5ICovCisJRlNHSVZFVVBDQUxMQkFDS1MJPSAxNDcsCS8qIEFGUyBEaXNjYXJkIGNhbGxiYWNrIHByb21pc2VzICovCisJRlNHRVRWT0xVTUVJTkZPCQk9IDE0OCwJLyogQUZTIEdldCByb290IHZvbHVtZSBpbmZvcm1hdGlvbiAqLworCUZTR0VUUk9PVFZPTFVNRQkJPSAxNTEsCS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgbmFtZSAqLworCUZTTE9PS1VQCQk9IDE2MSwJLyogQUZTIGxvb2t1cCBmaWxlIGluIGRpcmVjdG9yeSAqLworfTsKKworZW51bSBBRlNfRlNfRXJyb3JzIHsKKwlWU0FMVkFHRQk9IDEwMSwJLyogdm9sdW1lIG5lZWRzIHNhbHZhZ2luZyAqLworCVZOT1ZOT0RFCT0gMTAyLAkvKiBubyBzdWNoIGZpbGUvZGlyICh2bm9kZSkgKi8KKwlWTk9WT0wJCT0gMTAzLAkvKiBubyBzdWNoIHZvbHVtZSBvciB2b2x1bWUgdW5hdmFpbGFibGUgKi8KKwlWVk9MRVhJU1RTCT0gMTA0LAkvKiB2b2x1bWUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLworCVZOT1NFUlZJQ0UJPSAxMDUsCS8qIHZvbHVtZSBub3QgY3VycmVudGx5IGluIHNlcnZpY2UgKi8KKwlWT0ZGTElORQk9IDEwNiwJLyogdm9sdW1lIGlzIGN1cnJlbnRseSBvZmZsaW5lIChtb3JlIGluZm8gYXZhaWxhYmxlIFtWVkwtc3BlY10pICovCisJVk9OTElORQkJPSAxMDcsCS8qIHZvbHVtZSBpcyBhbHJlYWR5IG9ubGluZSAqLworCVZESVNLRlVMTAk9IDEwOCwJLyogZGlzayBwYXJ0aXRpb24gaXMgZnVsbCAqLworCVZPVkVSUVVPVEEJPSAxMDksCS8qIHZvbHVtZSdzIG1heGltdW0gcXVvdGEgZXhjZWVkZWQgKi8KKwlWQlVTWQkJPSAxMTAsCS8qIHZvbHVtZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSAqLworCVZNT1ZFRAkJPSAxMTEsCS8qIHZvbHVtZSBtb3ZlZCB0byBuZXcgc2VydmVyIC0gYXNrIHRoaXMgRlMgd2hlcmUgKi8KK307CisKKyNlbmRpZiAvKiBBRlNfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmggYi9mcy9hZnMvYWZzX3ZsLmgKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZnMvYWZzL3ZsY2xpZW50LmgKcmVuYW1lIHRvIGZzL2Fmcy9hZnNfdmwuaAppbmRleCBlM2Q2MDExLi44YmJlZmUwIDEwMDY0NAotLS0gYS9mcy9hZnMvdmxjbGllbnQuaAorKysgYi9mcy9hZnMvYWZzX3ZsLmgKQEAgLTEsNiArMSw2IEBACi0vKiB2bGNsaWVudC5oOiBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQgaW50ZXJmYWNlCisvKiBBRlMgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgY2xpZW50IGludGVyZmFjZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTksMTAgKzksMTkgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19WTENMSUVOVF9ICisjaWZuZGVmIEFGU19WTF9ICisjZGVmaW5lIEFGU19WTF9ICiAKLSNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImFmcy5oIgorCisjZGVmaW5lIEFGU19WTF9QT1JUCQk3MDAzCS8qIHZvbHVtZSBsb2NhdGlvbiBzZXJ2aWNlIHBvcnQgKi8KKyNkZWZpbmUgVkxfU0VSVklDRQkJNTIJLyogUnhSUEMgc2VydmljZSBJRCBmb3IgdGhlIFZvbHVtZSBMb2NhdGlvbiBzZXJ2aWNlICovCisKK2VudW0gQUZTVkxfT3BlcmF0aW9ucyB7CisJVkxHRVRFTlRSWUJZSUQJCT0gNTAzLAkvKiBBRlMgR2V0IENhY2hlIEVudHJ5IEJ5IElEIG9wZXJhdGlvbiBJRCAqLworCVZMR0VURU5UUllCWU5BTUUJPSA1MDQsCS8qIEFGUyBHZXQgQ2FjaGUgRW50cnkgQnkgTmFtZSBvcGVyYXRpb24gSUQgKi8KKwlWTFBST0JFCQkJPSA1MTQsCS8qIEFGUyBQcm9iZSBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBvcGVyYXRpb24gSUQgKi8KK307CiAKIGVudW0gQUZTVkxfRXJyb3JzIHsKIAlBRlNWTF9JREVYSVNUIAkJPSAzNjM1MjAsCS8qIFZvbHVtZSBJZCBlbnRyeSBleGlzdHMgaW4gdmwgZGF0YWJhc2UgKi8KQEAgLTQwLDE0ICs0OSwxNiBAQAogCUFGU1ZMX0JBRFZPTE9QRVIgCT0gMzYzNTQyLAkvKiBCYWQgdm9sdW1lIG9wZXJhdGlvbiBjb2RlICovCiAJQUZTVkxfQkFEUkVMTE9DS1RZUEUgCT0gMzYzNTQzLAkvKiBCYWQgcmVsZWFzZSBsb2NrIHR5cGUgKi8KIAlBRlNWTF9SRVJFTEVBU0UgCT0gMzYzNTQ0LAkvKiBTdGF0dXMgcmVwb3J0OiBsYXN0IHJlbGVhc2Ugd2FzIGFib3J0ZWQgKi8KLQlBRlNWTF9CQURTRVJWRVJGTEFHIAk9IDM2MzU0NSwJLyogSW52YWxpZCByZXBsaWNhdGlvbiBzaXRlIHNlcnZlciCwYWcgKi8KKwlBRlNWTF9CQURTRVJWRVJGTEFHIAk9IDM2MzU0NSwJLyogSW52YWxpZCByZXBsaWNhdGlvbiBzaXRlIHNlcnZlciDCsGFnICovCiAJQUZTVkxfUEVSTSAJCT0gMzYzNTQ2LAkvKiBObyBwZXJtaXNzaW9uIGFjY2VzcyAqLwogCUFGU1ZMX05PTUVNIAkJPSAzNjM1NDcsCS8qIG1hbGxvYy9yZWFsbG9jIGZhaWxlZCB0byBhbGxvYyBlbm91Z2ggbWVtb3J5ICovCiB9OwogCi0vKiBtYXBzIHRvICJzdHJ1Y3QgdmxkYmVudHJ5IiBpbiB2dmwtc3BlYy5wZGYgKi8KKy8qCisgKiBtYXBzIHRvICJzdHJ1Y3QgdmxkYmVudHJ5IiBpbiB2dmwtc3BlYy5wZGYKKyAqLwogc3RydWN0IGFmc192bGRiZW50cnkgewotCWNoYXIJCW5hbWVbNjVdOwkJLyogbmFtZSBvZiB2b2x1bWUgKGluY2x1ZGluZyBOVUwgY2hhcikgKi8KKwljaGFyCQluYW1lWzY1XTsJCS8qIG5hbWUgb2Ygdm9sdW1lICh3aXRoIE5VTCBjaGFyKSAqLwogCWFmc192b2x0eXBlX3QJdHlwZTsJCQkvKiB2b2x1bWUgdHlwZSAqLwogCXVuc2lnbmVkCW51bV9zZXJ2ZXJzOwkJLyogbnVtIHNlcnZlcnMgdGhhdCBob2xkIGluc3RhbmNlcyBvZiB0aGlzIHZvbCAqLwogCXVuc2lnbmVkCWNsb25lX2lkOwkJLyogY2xvbmluZyBJRCAqLwpAQCAtNjgsMjYgKzc5LDYgQEAKICNkZWZpbmUgQUZTX1ZMU0ZfUldWT0wJCTB4MDAwNAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIFIvVyBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCiAjZGVmaW5lIEFGU19WTFNGX0JBQ0tWT0wJMHgwMDA4CS8qIHRoaXMgc2VydmVyIGhvbGRzIGEgYmFja3VwIGluc3RhbmNlIG9mIHRoZSB2b2x1bWUgKi8KIAl9IHNlcnZlcnNbOF07Ci0KIH07CiAKLS8qIGxvb2sgdXAgYSB2b2x1bWUgbG9jYXRpb24gZGF0YWJhc2UgZW50cnkgYnkgbmFtZSAqLwotZXh0ZXJuIGludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZvbG5hbWUsCi0JCQkJICAgICAgdW5zaWduZWQgdm9sbmFtZXN6LAotCQkJCSAgICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSk7Ci0KLS8qIGxvb2sgdXAgYSB2b2x1bWUgbG9jYXRpb24gZGF0YWJhc2UgZW50cnkgYnkgSUQgKi8KLWV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICAgIGFmc192b2xpZF90CXZvbGlkLAotCQkJCSAgICBhZnNfdm9sdHlwZV90IHZvbHR5cGUsCi0JCQkJICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSk7Ci0KLWV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2FzeW5jKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wLAotCQkJCQkgIGFmc192b2xpZF90IHZvbGlkLAotCQkJCQkgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSk7Ci0KLWV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2FzeW5jMihzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCwKLQkJCQkJICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KTsKLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfVkxDTElFTlRfSCAqLworI2VuZGlmIC8qIEFGU19WTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FjaGUuYyBiL2ZzL2Fmcy9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGQ3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2FjaGUuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogQUZTIGNhY2hpbmcgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKKworc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJCT0gImNlbGxfaXgiLAorCS5kYXRhX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfY2VsbCksCisJLmtleXNbMF0JCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQVNDSUlaLCA2NCB9LAorCS5tYXRjaAkJCT0gYWZzX2NlbGxfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJCT0gYWZzX2NlbGxfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKgorICogbWF0Y2ggYSBjZWxsIHJlY29yZCBvYnRhaW5lZCBmcm9tIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX2NlbGxfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJY29uc3Qgdm9pZCAqZW50cnkpCit7CisJY29uc3Qgc3RydWN0IGFmc19jYWNoZV9jZWxsICpjY2VsbCA9IGVudHJ5OworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHRhcmdldDsKKworCV9lbnRlcigieyVzfSx7JXN9IiwgY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUpOworCisJaWYgKHN0cm5jbXAoY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUsIHNpemVvZihjY2VsbC0+bmFtZSkpID09IDApIHsKKwkJX2xlYXZlKCIgPSBTVUNDRVNTIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJfQorCisJX2xlYXZlKCIgPSBGQUlMRUQiKTsKKwlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Cit9CisjZW5kaWYKKworLyoKKyAqIHVwZGF0ZSBhIGNlbGwgcmVjb3JkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX2NlbGxfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCit7CisJc3RydWN0IGFmc19jYWNoZV9jZWxsICpjY2VsbCA9IGVudHJ5OworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHNvdXJjZTsKKworCV9lbnRlcigiJXAsJXAiLCBzb3VyY2UsIGVudHJ5KTsKKworCXN0cm5jcHkoY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUsIHNpemVvZihjY2VsbC0+bmFtZSkpOworCisJbWVtY3B5KGNjZWxsLT52bF9zZXJ2ZXJzLAorCSAgICAgICBjZWxsLT52bF9hZGRycywKKwkgICAgICAgbWluKHNpemVvZihjY2VsbC0+dmxfc2VydmVycyksIHNpemVvZihjZWxsLT52bF9hZGRycykpKTsKKworfQorI2VuZGlmCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgICAgY29uc3Qgdm9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdmxvY2F0aW9uX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidmxkYiIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiksCisJLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19BU0NJSVosIDY0IH0sCisJLm1hdGNoCQk9IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoKKyAqIG1hdGNoIGEgVkxEQiByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICogLSBtYXkgYWxzbyBsb2FkIHRhcmdldCBmcm9tIGVudHJ5CisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgICAgY29uc3Qgdm9pZCAqZW50cnkpCit7CisJY29uc3Qgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKnZsZGIgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0gdGFyZ2V0OworCisJX2VudGVyKCJ7JXN9LHslc30iLCB2bG9jYXRpb24tPnZsZGIubmFtZSwgdmxkYi0+bmFtZSk7CisKKwlpZiAoc3RybmNtcCh2bG9jYXRpb24tPnZsZGIubmFtZSwgdmxkYi0+bmFtZSwgc2l6ZW9mKHZsZGItPm5hbWUpKSA9PSAwCisJICAgICkgeworCQlpZiAoIXZsb2NhdGlvbi0+dmFsaWQgfHwKKwkJICAgIHZsb2NhdGlvbi0+dmxkYi5ydGltZSA9PSB2bGRiLT5ydGltZQorCQkgICAgKSB7CisJCQl2bG9jYXRpb24tPnZsZGIgPSAqdmxkYjsKKwkJCXZsb2NhdGlvbi0+dmFsaWQgPSAxOworCQkJX2xlYXZlKCIgPSBTVUNDRVNTIFtjLT5tXSIpOworCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKKwkJfSBlbHNlIGlmIChtZW1jbXAoJnZsb2NhdGlvbi0+dmxkYiwgdmxkYiwgc2l6ZW9mKCp2bGRiKSkgIT0gMCkgeworCQkJLyogZGVsZXRlIGlmIFZJRHMgZm9yIHRoaXMgbmFtZSBkaWZmZXIgKi8KKwkJCWlmIChtZW1jbXAoJnZsb2NhdGlvbi0+dmxkYi52aWQsCisJCQkJICAgJnZsZGItPnZpZCwKKwkJCQkgICBzaXplb2YodmxkYi0+dmlkKSkgIT0gMCkgeworCQkJCV9sZWF2ZSgiID0gREVMRVRFIik7CisJCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19ERUxFVEU7CisJCQl9CisKKwkJCV9sZWF2ZSgiID0gVVBEQVRFIik7CisJCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTX1VQREFURTsKKwkJfSBlbHNlIHsKKwkJCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKKwkJfQorCX0KKworCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworfQorI2VuZGlmCisKKy8qCisgKiB1cGRhdGUgYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiID0gZW50cnk7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IHNvdXJjZTsKKworCV9lbnRlcigiIik7CisKKwkqdmxkYiA9IHZsb2NhdGlvbi0+dmxkYjsKK30KKyNlbmRpZgorCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgIGNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc192b2x1bWVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpOworCitzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3ZvbHVtZV9jYWNoZV9pbmRleF9kZWYgPSB7CisJLm5hbWUJCT0gInZvbHVtZSIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3ZoYXNoKSwKKwkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgMSB9LAorCS5rZXlzWzFdCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQklOLCAxIH0sCisJLm1hdGNoCQk9IGFmc192b2x1bWVfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdm9sdW1lX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoKKyAqIG1hdGNoIGEgdm9sdW1lIGhhc2ggcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192b2x1bWVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJICBjb25zdCB2b2lkICplbnRyeSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX3ZoYXNoICp2aGFzaCA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUgPSB0YXJnZXQ7CisKKwlfZW50ZXIoInsldX0seyV1fSIsIHZvbHVtZS0+dHlwZSwgdmhhc2gtPnZ0eXBlKTsKKworCWlmICh2b2x1bWUtPnR5cGUgPT0gdmhhc2gtPnZ0eXBlKSB7CisJCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCX0KKworCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworfQorI2VuZGlmCisKKy8qCisgKiB1cGRhdGUgYSB2b2x1bWUgaGFzaCByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3ZoYXNoICp2aGFzaCA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUgPSBzb3VyY2U7CisKKwlfZW50ZXIoIiIpOworCisJdmhhc2gtPnZ0eXBlID0gdm9sdW1lLT50eXBlOworfQorI2VuZGlmCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmID0geworCS5uYW1lCQk9ICJ2bm9kZSIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlKSwKKwkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgNCB9LAorCS5tYXRjaAkJPSBhZnNfdm5vZGVfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKgorICogbWF0Y2ggYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3Zub2RlX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSBjb25zdCB2b2lkICplbnRyeSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlICpjdm5vZGUgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IHRhcmdldDsKKworCV9lbnRlcigieyV4LCV4LCVMeH0seyV4LCV4LCVMeH0iLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uLAorCSAgICAgICBjdm5vZGUtPnZub2RlX2lkLAorCSAgICAgICBjdm5vZGUtPnZub2RlX3VuaXF1ZSwKKwkgICAgICAgY3Zub2RlLT5kYXRhX3ZlcnNpb24pOworCisJaWYgKHZub2RlLT5maWQudm5vZGUgIT0gY3Zub2RlLT52bm9kZV9pZCkgeworCQlfbGVhdmUoIiA9IEZBSUxFRCIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7CisJfQorCisJaWYgKHZub2RlLT5maWQudW5pcXVlICE9IGN2bm9kZS0+dm5vZGVfdW5pcXVlIHx8CisJICAgIHZub2RlLT5zdGF0dXMudmVyc2lvbiAhPSBjdm5vZGUtPmRhdGFfdmVyc2lvbikgeworCQlfbGVhdmUoIiA9IERFTEVURSIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTX0RFTEVURTsKKwl9CisKKwlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKKwlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworfQorI2VuZGlmCisKKy8qCisgKiB1cGRhdGUgYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCWN2bm9kZS0+dm5vZGVfaWQJPSB2bm9kZS0+ZmlkLnZub2RlOworCWN2bm9kZS0+dm5vZGVfdW5pcXVlCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJY3Zub2RlLT5kYXRhX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLnZlcnNpb247Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jYWNoZS5oIGIvZnMvYWZzL2NhY2hlLmgKaW5kZXggOWViNzcyMi4uMzZhMzY0MiAxMDA2NDQKLS0tIGEvZnMvYWZzL2NhY2hlLmgKKysrIGIvZnMvYWZzL2NhY2hlLmgKQEAgLTEsNCArMSw0IEBACi0vKiBjYWNoZS5oOiBBRlMgbG9jYWwgY2FjaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UKKy8qIEFGUyBsb2NhbCBjYWNoZSBtYW5hZ2VtZW50IGludGVyZmFjZQogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCkBAIC05LDggKzksOCBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaWZuZGVmIF9MSU5VWF9BRlNfQ0FDSEVfSAotI2RlZmluZSBfTElOVVhfQUZTX0NBQ0hFX0gKKyNpZm5kZWYgQUZTX0NBQ0hFX0gKKyNkZWZpbmUgQUZTX0NBQ0hFX0gKIAogI3VuZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIApAQCAtMjAsOCArMjAsNCBAQAogI2VuZGlmCiAjaW5jbHVkZSAidHlwZXMuaCIKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ0FDSEVfSCAqLworI2VuZGlmIC8qIEFGU19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCmluZGV4IDljYjIwNmUuLjYzOTM5OWYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWxsYmFjay5jCisrKyBiL2ZzL2Fmcy9jYWxsYmFjay5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgpAQCAtMTYsODUgKzE2LDE4NyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgYWZzX3Zub2RlX3VwZGF0ZV90aW1lb3V0ID0gMTA7CisKKyNkZWZpbmUgYWZzX2JyZWFrcmluZ19zcGFjZShzZXJ2ZXIpIFwKKwlDSVJDX1NQQUNFKChzZXJ2ZXIpLT5jYl9icmVha19oZWFkLCAoc2VydmVyKS0+Y2JfYnJlYWtfdGFpbCwJXAorCQkgICBBUlJBWV9TSVpFKChzZXJ2ZXIpLT5jYl9icmVhaykpCisKKy8vc3RhdGljIHZvaWQgYWZzX2NhbGxiYWNrX3VwZGF0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICopOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFmc19jYWxsYmFja191cGRhdGVfd29ya2VyOworCiAvKgogICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gcmVxdWVzdCBjYWxsYmFjayBzdGF0ZSAocmUtKWluaXRpYWxpc2F0aW9uCiAgKi8KLWludCBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQordm9pZCBhZnNfaW5pdF9jYWxsYmFja19zdGF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQogewotCXN0cnVjdCBsaXN0X2hlYWQgY2FsbGJhY2tzOworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOwogCi0JX2VudGVyKCIlcCIsIHNlcnZlcik7CisJX2VudGVyKCJ7JXB9Iiwgc2VydmVyKTsKIAotCUlOSVRfTElTVF9IRUFEKCZjYWxsYmFja3MpOwotCi0JLyogdHJhbnNmZXIgdGhlIGNhbGxiYWNrIGxpc3QgZnJvbSB0aGUgc2VydmVyIHRvIGEgdGVtcCBob2xkaW5nIGFyZWEgKi8KIAlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CiAKLQlsaXN0X2FkZCgmY2FsbGJhY2tzLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7Ci0JbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5jYl9wcm9taXNlcyk7Ci0KLQkvKiBtdW5jaCBvdXIgd2F5IHRocm91Z2ggdGhlIGxpc3QsIGdyYWJiaW5nIHRoZSBpbm9kZSwgZHJvcHBpbmcgYWxsIHRoZQotCSAqIGxvY2tzIGFuZCByZWdldHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgb3JkZXIKLQkgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGxiYWNrcykpIHsKLQkJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0KLQkJdm5vZGUgPSBsaXN0X2VudHJ5KGNhbGxiYWNrcy5uZXh0LCBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9saW5rKTsKLQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOwotCi0JCS8qIHRyeSBhbmQgZ3JhYiB0aGUgaW5vZGUgLSBtYXkgZmFpbCAqLwotCQlpbm9kZSA9IGlncmFiKEFGU19WTk9ERV9UT19JKHZub2RlKSk7Ci0JCWlmIChpbm9kZSkgewotCQkJaW50IHJlbGVhc2UgPSAwOwotCi0JCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCi0JCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKLQkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKLQkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOwotCQkJCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7Ci0JCQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCQkJCXJlbGVhc2UgPSAxOwotCQkJfQotCi0JCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwotCi0JCQlpcHV0KGlub2RlKTsKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJfQorCS8qIGtpbGwgYWxsIHRoZSBwcm9taXNlcyBvbiByZWNvcmQgZnJvbSB0aGlzIHNlcnZlciAqLworCXdoaWxlICghUkJfRU1QVFlfUk9PVCgmc2VydmVyLT5jYl9wcm9taXNlcykpIHsKKwkJdm5vZGUgPSByYl9lbnRyeShzZXJ2ZXItPmNiX3Byb21pc2VzLnJiX25vZGUsCisJCQkJIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3Byb21pc2UpOworCQlfZGVidWcoIlVOUFJPTUlTRSB7IHZpZD0leCB2bj0ldSB1cT0ldX0iLAorCQkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKwkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOwogCX0KIAogCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CiAKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKLX0gLyogZW5kIFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKCkgKi8KKy8qCisgKiBoYW5kbGUgdGhlIGRhdGEgaW52YWxpZGF0aW9uIHNpZGUgb2YgYSBjYWxsYmFjayBiZWluZyBicm9rZW4KKyAqLwordm9pZCBhZnNfYnJva2VuX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfdm5vZGUsIGNiX2Jyb2tlbl93b3JrKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCV9lbnRlcigiIik7CisKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwkvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZGVhbGluZyB3aXRoIGEgYnJva2VuIGNhbGxiYWNrIG9uICp0aGlzKgorCSAqIHZub2RlIGFuZCBvbmx5IGlmIG5vLW9uZSBlbHNlIGhhcyBkZWFsdCB3aXRoIGl0IHlldCAqLworCWlmICghbXV0ZXhfdHJ5bG9jaygmdm5vZGUtPnZhbGlkYXRlX2xvY2spKQorCQlyZXR1cm47IC8qIHNvbWVvbmUgZWxzZSBpcyBkZWFsaW5nIHdpdGggaXQgKi8KKworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKSkgeworCQlpZiAoU19JU0RJUih2bm9kZS0+dmZzX2lub2RlLmlfbW9kZSkpCisJCQlhZnNfY2xlYXJfcGVybWl0cyh2bm9kZSk7CisKKwkJaWYgKGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUsIE5VTEwsIE5VTEwpIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncykpCisJCQlnb3RvIG91dDsKKworCQkvKiBpZiB0aGUgdm5vZGUncyBkYXRhIHZlcnNpb24gbnVtYmVyIGNoYW5nZWQgdGhlbiBpdHMgY29udGVudHMKKwkJICogYXJlIGRpZmZlcmVudCAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9aQVBfREFUQSwgJnZub2RlLT5mbGFncykpIHsKKwkJCV9kZWJ1ZygiemFwIGRhdGEgeyV4OiV1fSIsCisJCQkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOworCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoJnZub2RlLT52ZnNfaW5vZGUpOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+dmFsaWRhdGVfbG9jayk7CisKKwkvKiBhdm9pZCB0aGUgcG90ZW50aWFsIHJhY2Ugd2hlcmVieSB0aGUgbXV0ZXhfdHJ5bG9jaygpIGluIHRoaXMKKwkgKiBmdW5jdGlvbiBoYXBwZW5zIGFnYWluIGJldHdlZW4gdGhlIGNsZWFyX2JpdCgpIGFuZCB0aGUKKwkgKiBtdXRleF91bmxvY2soKSAqLworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoInJlcXVldWUiKTsKKwkJcXVldWVfd29yayhhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciwgJnZub2RlLT5jYl9icm9rZW5fd29yayk7CisJfQorCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBhY3R1YWxseSBicmVhayBhIGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGFmc19icmVha19jYWxsYmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJICAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCV9lbnRlcigiIik7CisKKwlzZXRfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpOworCisJaWYgKHZub2RlLT5jYl9wcm9taXNlZCkgeworCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCQlfZGVidWcoImJyZWFrIGNhbGxiYWNrIik7CisKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCQlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCQlyYl9lcmFzZSgmdm5vZGUtPmNiX3Byb21pc2UsICZzZXJ2ZXItPmNiX3Byb21pc2VzKTsKKwkJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCQl9CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCisJCXF1ZXVlX3dvcmsoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIsICZ2bm9kZS0+Y2JfYnJva2VuX3dvcmspOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCX0KK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIGV4cGxpY2l0bHkgYnJlYWsgb25lIGNhbGxiYWNrCisgKiAtIGhhcHBlbnMgd2hlbgorICogICAtIHRoZSBiYWNraW5nIGZpbGUgaXMgY2hhbmdlZAorICogICAtIGEgbG9jayBpcyByZWxlYXNlZAorICovCitzdGF0aWMgdm9pZCBhZnNfYnJlYWtfb25lX2NhbGxiYWNrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgc3RydWN0IGFmc19maWQgKmZpZCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKworCV9kZWJ1ZygiZmluZCIpOworCXNwaW5fbG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwlwID0gc2VydmVyLT5mc192bm9kZXMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQl2bm9kZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCBhZnNfdm5vZGUsIHNlcnZlcl9yYik7CisJCWlmIChmaWQtPnZpZCA8IHZub2RlLT5maWQudmlkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGZpZC0+dmlkID4gdm5vZGUtPmZpZC52aWQpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UgaWYgKGZpZC0+dm5vZGUgPCB2bm9kZS0+ZmlkLnZub2RlKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGZpZC0+dm5vZGUgPiB2bm9kZS0+ZmlkLnZub2RlKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlIGlmIChmaWQtPnVuaXF1ZSA8IHZub2RlLT5maWQudW5pcXVlKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGZpZC0+dW5pcXVlID4gdm5vZGUtPmZpZC51bmlxdWUpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJLyogbm90IGZvdW5kIHNvIHdlIGp1c3QgaWdub3JlIGl0IChpdCBtYXkgaGF2ZSBtb3ZlZCB0byBhbm90aGVyCisJICogc2VydmVyKSAqLworbm90X2F2YWlsYWJsZToKKwlfZGVidWcoIm5vdCBhdmFpbCIpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCitmb3VuZDoKKwlfZGVidWcoImZvdW5kIik7CisJQVNTRVJUQ01QKHNlcnZlciwgPT0sIHZub2RlLT5zZXJ2ZXIpOworCisJaWYgKCFpZ3JhYihBRlNfVk5PREVfVE9fSSh2bm9kZSkpKQorCQlnb3RvIG5vdF9hdmFpbGFibGU7CisJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwlhZnNfYnJlYWtfY2FsbGJhY2soc2VydmVyLCB2bm9kZSk7CisJaXB1dCgmdm5vZGUtPnZmc19pbm9kZSk7CisJX2xlYXZlKCIiKTsKK30KKwogLyoKICAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIGJyZWFrIGNhbGxiYWNrIHByb21pc2VzCiAgKi8KLWludCBTUlhBRlNDTV9DYWxsQmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLCBzaXplX3QgY291bnQsCi0JCSAgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgY2FsbGJhY2tzW10pCit2b2lkIGFmc19icmVha19jYWxsYmFja3Moc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgc2l6ZV90IGNvdW50LAorCQkJIHN0cnVjdCBhZnNfY2FsbGJhY2sgY2FsbGJhY2tzW10pCiB7Ci0JX2VudGVyKCIlcCwldSwiLCBzZXJ2ZXIsIGNvdW50KTsKKwlfZW50ZXIoIiVwLCV6dSwiLCBzZXJ2ZXIsIGNvdW50KTsKKworCUFTU0VSVChzZXJ2ZXIgIT0gTlVMTCk7CisJQVNTRVJUQ01QKGNvdW50LCA8PSwgQUZTQ0JNQVgpOwogCiAJZm9yICg7IGNvdW50ID4gMDsgY2FsbGJhY2tzKyssIGNvdW50LS0pIHsKLQkJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBOVUxMOwotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKLQkJaW50IHZhbGlkID0gMDsKLQogCQlfZGVidWcoIi0gRmlkIHsgdmw9JTA4eCBuPSV1IHU9JXUgfSAgQ0IgeyB2PSV1IHg9JXUgdD0ldSB9IiwKIAkJICAgICAgIGNhbGxiYWNrcy0+ZmlkLnZpZCwKIAkJICAgICAgIGNhbGxiYWNrcy0+ZmlkLnZub2RlLApAQCAtMTAzLDY3ICsyMDUsMjcwIEBACiAJCSAgICAgICBjYWxsYmFja3MtPmV4cGlyeSwKIAkJICAgICAgIGNhbGxiYWNrcy0+dHlwZQogCQkgICAgICAgKTsKLQotCQkvKiBmaW5kIHRoZSBpbm9kZSBmb3IgdGhpcyBmaWQgKi8KLQkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZub2RlLAotCQkJCSAgICAmYWZzX2NiX2hhc2goc2VydmVyLCAmY2FsbGJhY2tzLT5maWQpLAotCQkJCSAgICBjYl9oYXNoX2xpbmspIHsKLQkJCWlmIChtZW1jbXAoJnZub2RlLT5maWQsICZjYWxsYmFja3MtPmZpZCwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGFmc19maWQpKSAhPSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiByaWdodCB2bm9kZSwgYnV0IGlzIGl0IHNhbWUgc2VydmVyPyAqLwotCQkJaWYgKHZub2RlLT5jYl9zZXJ2ZXIgIT0gc2VydmVyKQotCQkJCWJyZWFrOyAvKiBubyAqLwotCi0JCQkvKiB0cnkgYW5kIG5haWwgdGhlIGlub2RlIGRvd24gKi8KLQkJCWlub2RlID0gaWdyYWIoQUZTX1ZOT0RFX1RPX0kodm5vZGUpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCi0JCWlmIChpbm9kZSkgewotCQkJLyogd2UndmUgZm91bmQgdGhlIHJlY29yZCBmb3IgdGhpcyB2bm9kZSAqLwotCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0JCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKLQkJCQkvKiB0aGUgY2FsbGJhY2sgX2lzXyBvbiB0aGUgY2FsbGluZyBzZXJ2ZXIgKi8KLQkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKLQkJCQl2YWxpZCA9IDE7Ci0KLQkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOwotCQkJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKLQotCQkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7Ci0JCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0KLQkJCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCQkJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9oYXNoX2xpbmspOwotCQkJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7Ci0KLQkJCWlmICh2YWxpZCkgewotCQkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKLQkJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCQkJfQotCQkJaXB1dChpbm9kZSk7Ci0JCX0KKwkJYWZzX2JyZWFrX29uZV9jYWxsYmFjayhzZXJ2ZXIsICZjYWxsYmFja3MtPmZpZCk7CiAJfQogCi0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci19IC8qIGVuZCBTUlhBRlNDTV9DYWxsQmFjaygpICovCisJX2xlYXZlKCIiKTsKKwlyZXR1cm47Cit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBzZWUgaWYgdGhlIGNhY2hlIG1hbmFnZXIgaXMgc3RpbGwgYWxpdmUKKyAqIHJlY29yZCB0aGUgY2FsbGJhY2sgZm9yIGJyZWFraW5nCisgKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIHNlcnZlci0+Y2JfbG9jawogICovCi1pbnQgU1JYQUZTQ01fUHJvYmUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3N0YXRpYyB2b2lkIGFmc19kb19naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQogewotCV9kZWJ1ZygiU1JYQUZTQ01fUHJvYmUoJXApXG4iLCBzZXJ2ZXIpOwotCXJldHVybiAwOwotfSAvKiBlbmQgU1JYQUZTQ01fUHJvYmUoKSAqLworCXN0cnVjdCBhZnNfY2FsbGJhY2sgKmNiOworCisJX2VudGVyKCIlcCwlcCIsIHNlcnZlciwgdm5vZGUpOworCisJY2IgPSAmc2VydmVyLT5jYl9icmVha1tzZXJ2ZXItPmNiX2JyZWFrX2hlYWRdOworCWNiLT5maWQJCT0gdm5vZGUtPmZpZDsKKwljYi0+dmVyc2lvbgk9IHZub2RlLT5jYl92ZXJzaW9uOworCWNiLT5leHBpcnkJPSB2bm9kZS0+Y2JfZXhwaXJ5OworCWNiLT50eXBlCT0gdm5vZGUtPmNiX3R5cGU7CisJc21wX3dtYigpOworCXNlcnZlci0+Y2JfYnJlYWtfaGVhZCA9CisJCShzZXJ2ZXItPmNiX2JyZWFrX2hlYWQgKyAxKSAmCisJCShBUlJBWV9TSVpFKHNlcnZlci0+Y2JfYnJlYWspIC0gMSk7CisKKwkvKiBkZWZlciB0aGUgYnJlYWtpbmcgb2YgY2FsbGJhY2tzIHRvIHRyeSBhbmQgY29sbGVjdCBhcyBtYW55IGFzCisJICogcG9zc2libGUgdG8gc2hpcCBpbiBvbmUgb3BlcmF0aW9uICovCisJc3dpdGNoIChhdG9taWNfaW5jX3JldHVybigmc2VydmVyLT5jYl9icmVha19uKSkgeworCWNhc2UgMSAuLi4gQUZTQ0JNQVggLSAxOgorCQlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIsCisJCQkJICAgJnNlcnZlci0+Y2JfYnJlYWtfd29yaywgSFogKiAyKTsKKwkJYnJlYWs7CisJY2FzZSBBRlNDQk1BWDoKKwkJYWZzX2ZsdXNoX2NhbGxiYWNrX2JyZWFrcyhzZXJ2ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlBU1NFUlQoc2VydmVyLT5jYl9wcm9taXNlcy5yYl9ub2RlICE9IE5VTEwpOworCXJiX2VyYXNlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkaXNjYXJkIHRoZSBjYWxsYmFjayBvbiBhIGRlbGV0ZWQgaXRlbQorICovCit2b2lkIGFmc19kaXNjYXJkX2NhbGxiYWNrX29uX2RlbGV0ZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gdm5vZGUtPnNlcnZlcjsKKworCV9lbnRlcigiJWQiLCB2bm9kZS0+Y2JfcHJvbWlzZWQpOworCisJaWYgKCF2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJX2xlYXZlKCIgW25vdCBwcm9taXNlZF0iKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChzZXJ2ZXIgIT0gTlVMTCk7CisKKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJaWYgKHZub2RlLT5jYl9wcm9taXNlZCkgeworCQlBU1NFUlQoc2VydmVyLT5jYl9wcm9taXNlcy5yYl9ub2RlICE9IE5VTEwpOworCQlyYl9lcmFzZSgmdm5vZGUtPmNiX3Byb21pc2UsICZzZXJ2ZXItPmNiX3Byb21pc2VzKTsKKwkJdm5vZGUtPmNiX3Byb21pc2VkID0gZmFsc2U7CisJfQorCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBnaXZlIHVwIHRoZSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciBhIHZub2RlIG9uIHRoZSBmaWxlIHNlcnZlciB3aGVuIHRoZQorICogaW5vZGUgaXMgYmVpbmcgY2xlYXJlZAorICovCit2b2lkIGFmc19naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSB2bm9kZS0+c2VydmVyOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJWQiLCB2bm9kZS0+Y2JfcHJvbWlzZWQpOworCisJX2RlYnVnKCJHSVZFIFVQIElOT0RFICVwIiwgJnZub2RlLT52ZnNfaW5vZGUpOworCisJaWYgKCF2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJX2xlYXZlKCIgW25vdCBwcm9taXNlZF0iKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChzZXJ2ZXIgIT0gTlVMTCk7CisKKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJaWYgKHZub2RlLT5jYl9wcm9taXNlZCAmJiBhZnNfYnJlYWtyaW5nX3NwYWNlKHNlcnZlcikgPT0gMCkgeworCQlhZGRfd2FpdF9xdWV1ZSgmc2VydmVyLT5jYl9icmVha193YWl0cSwgJm15c2VsZik7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCWlmICghdm5vZGUtPmNiX3Byb21pc2VkIHx8CisJCQkgICAgYWZzX2JyZWFrcmluZ19zcGFjZShzZXJ2ZXIpICE9IDApCisJCQkJYnJlYWs7CisJCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnNlcnZlci0+Y2JfYnJlYWtfd2FpdHEsICZteXNlbGYpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCisJLyogb2YgY291cnNlLCBpdCdzIGFsd2F5cyBwb3NzaWJsZSBmb3IgdGhlIHNlcnZlciB0byBicmVhayB0aGlzIHZub2RlJ3MKKwkgKiBjYWxsYmFjayBmaXJzdC4uLiAqLworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpCisJCWFmc19kb19naXZlX3VwX2NhbGxiYWNrKHNlcnZlciwgdm5vZGUpOworCisJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRpc3BhdGNoIGEgZGVmZXJyZWQgZ2l2ZSB1cCBjYWxsYmFja3Mgb3BlcmF0aW9uCisgKi8KK3ZvaWQgYWZzX2Rpc3BhdGNoX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfc2VydmVyLCBjYl9icmVha193b3JrLndvcmspOworCisJX2VudGVyKCIiKTsKKworCS8qIHRlbGwgdGhlIGZpbGVzZXJ2ZXIgdG8gZGlzY2FyZCB0aGUgY2FsbGJhY2sgcHJvbWlzZXMgaXQgaGFzCisJICogLSBpbiB0aGUgZXZlbnQgb2YgRU5PTUVNIG9yIHNvbWUgb3RoZXIgZXJyb3IsIHdlIGp1c3QgZm9yZ2V0IHRoYXQgd2UKKwkgKiAgIGhhZCBjYWxsYmFja3MgZW50aXJlbHksIGFuZCB0aGUgc2VydmVyIHdpbGwgY2FsbCB1cyBsYXRlciB0byBicmVhaworCSAqICAgdGhlbQorCSAqLworCWFmc19mc19naXZlX3VwX2NhbGxiYWNrcyhzZXJ2ZXIsICZhZnNfYXN5bmNfY2FsbCk7Cit9CisKKy8qCisgKiBmbHVzaCB0aGUgb3V0c3RhbmRpbmcgY2FsbGJhY2sgYnJlYWtzIG9uIGEgc2VydmVyCisgKi8KK3ZvaWQgYWZzX2ZsdXNoX2NhbGxiYWNrX2JyZWFrcyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnNlcnZlci0+Y2JfYnJlYWtfd29yayk7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyLAorCQkJICAgJnNlcnZlci0+Y2JfYnJlYWtfd29yaywgMCk7Cit9CisKKyNpZiAwCisvKgorICogdXBkYXRlIGEgYnVuY2ggb2YgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyB2b2lkIGFmc19jYWxsYmFja191cGRhdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCAqeHZub2RlOworCXRpbWVfdCBub3c7CisJbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisKKwlzZXJ2ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19zZXJ2ZXIsIHVwZGF0ZXIpOworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisKKwkvKiBmaW5kIHRoZSBmaXJzdCB2bm9kZSB0byB1cGRhdGUgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJZm9yICg7OykgeworCQlpZiAoUkJfRU1QVFlfUk9PVCgmc2VydmVyLT5jYl9wcm9taXNlcykpIHsKKwkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCQkJX2xlYXZlKCIgW25vdGhpbmddIik7CisJCQlyZXR1cm47CisJCX0KKworCQl2bm9kZSA9IHJiX2VudHJ5KHJiX2ZpcnN0KCZzZXJ2ZXItPmNiX3Byb21pc2VzKSwKKwkJCQkgc3RydWN0IGFmc192bm9kZSwgY2JfcHJvbWlzZSk7CisJCWlmIChhdG9taWNfcmVhZCgmdm5vZGUtPnVzYWdlKSA+IDApCisJCQlicmVhazsKKwkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCX0KKworCXRpbWVvdXQgPSB2bm9kZS0+dXBkYXRlX2F0IC0gbm93OworCWlmICh0aW1lb3V0ID4gMCkgeworCQlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX3Zub2RlX3VwZGF0ZV93b3JrZXIsCisJCQkJICAgJmFmc192bm9kZV91cGRhdGUsIHRpbWVvdXQgKiBIWik7CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCQlfbGVhdmUoIiBbbm90aGluZ10iKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGVsX2luaXQoJnZub2RlLT51cGRhdGUpOworCWF0b21pY19pbmMoJnZub2RlLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwkvKiB3ZSBjYW4gbm93IHBlcmZvcm0gdGhlIHVwZGF0ZSAqLworCV9kZWJ1ZygidXBkYXRlICVzIiwgdm5vZGUtPnZsZGIubmFtZSk7CisJdm5vZGUtPnN0YXRlID0gQUZTX1ZMX1VQREFUSU5HOworCXZub2RlLT51cGRfcmVqX2NudCA9IDA7CisJdm5vZGUtPnVwZF9idXN5X2NudCA9IDA7CisKKwlyZXQgPSBhZnNfdm5vZGVfdXBkYXRlX3JlY29yZCh2bCwgJnZsZGIpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlhZnNfdm5vZGVfYXBwbHlfdXBkYXRlKHZsLCAmdmxkYik7CisJCXZub2RlLT5zdGF0ZSA9IEFGU19WTF9VUERBVElORzsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTUVESVVNOgorCQl2bm9kZS0+c3RhdGUgPSBBRlNfVkxfVk9MVU1FX0RFTEVURUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZub2RlLT5zdGF0ZSA9IEFGU19WTF9VTkNFUlRBSU47CisJCWJyZWFrOworCX0KKworCS8qIGFuZCB0aGVuIHJlc2NoZWR1bGUgKi8KKwlfZGVidWcoInJlc2NoZWR1bGUiKTsKKwl2bm9kZS0+dXBkYXRlX2F0ID0gZ2V0X3NlY29uZHMoKSArIGFmc192bm9kZV91cGRhdGVfdGltZW91dDsKKworCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKworCWlmICghbGlzdF9lbXB0eSgmc2VydmVyLT5jYl9wcm9taXNlcykpIHsKKwkJLyogbmV4dCB1cGRhdGUgaW4gMTAgbWludXRlcywgYnV0IHdhaXQgYXQgbGVhc3QgMSBzZWNvbmQgbW9yZQorCQkgKiB0aGFuIHRoZSBuZXdlc3QgcmVjb3JkIGFscmVhZHkgcXVldWVkIHNvIHRoYXQgd2UgZG9uJ3Qgc3BhbQorCQkgKiB0aGUgVkwgc2VydmVyIHN1ZGRlbmx5IHdpdGggbG90cyBvZiByZXF1ZXN0cworCQkgKi8KKwkJeHZub2RlID0gbGlzdF9lbnRyeShzZXJ2ZXItPmNiX3Byb21pc2VzLnByZXYsCisJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUsIHVwZGF0ZSk7CisJCWlmICh2bm9kZS0+dXBkYXRlX2F0IDw9IHh2bm9kZS0+dXBkYXRlX2F0KQorCQkJdm5vZGUtPnVwZGF0ZV9hdCA9IHh2bm9kZS0+dXBkYXRlX2F0ICsgMTsKKwkJeHZub2RlID0gbGlzdF9lbnRyeShzZXJ2ZXItPmNiX3Byb21pc2VzLm5leHQsCisJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUsIHVwZGF0ZSk7CisJCXRpbWVvdXQgPSB4dm5vZGUtPnVwZGF0ZV9hdCAtIG5vdzsKKwkJaWYgKHRpbWVvdXQgPCAwKQorCQkJdGltZW91dCA9IDA7CisJfSBlbHNlIHsKKwkJdGltZW91dCA9IGFmc192bm9kZV91cGRhdGVfdGltZW91dDsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZ2bm9kZS0+dXBkYXRlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisKKwlfZGVidWcoInRpbWVvdXQgJWxkIiwgdGltZW91dCk7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc192bm9kZV91cGRhdGVfd29ya2VyLAorCQkJICAgJmFmc192bm9kZV91cGRhdGUsIHRpbWVvdXQgKiBIWik7CisJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJYWZzX3B1dF92bm9kZSh2bCk7Cit9CisjZW5kaWYKKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIGNhbGxiYWNrIHVwZGF0ZSBwcm9jZXNzCisgKi8KK2ludCBfX2luaXQgYWZzX2NhbGxiYWNrX3VwZGF0ZV9pbml0KHZvaWQpCit7CisJYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc19jYWxsYmFja2QiKTsKKwlyZXR1cm4gYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIgPyAwIDogLUVOT01FTTsKK30KKworLyoKKyAqIHNodXQgZG93biB0aGUgY2FsbGJhY2sgdXBkYXRlIHByb2Nlc3MKKyAqLwordm9pZCBfX2V4aXQgYWZzX2NhbGxiYWNrX3VwZGF0ZV9raWxsKHZvaWQpCit7CisJZGVzdHJveV93b3JrcXVldWUoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIpOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NlbGwuYyBiL2ZzL2Fmcy9jZWxsLmMKaW5kZXggMWZjNTc4My4uOWIxMzExYSAxMDA2NDQKLS0tIGEvZnMvYWZzL2NlbGwuYworKysgYi9mcy9hZnMvY2VsbC5jCkBAIC0xLDQgKzEsNCBAQAotLyogY2VsbC5jOiBBRlMgY2VsbCBhbmQgc2VydmVyIHJlY29yZCBtYW5hZ2VtZW50CisvKiBBRlMgY2VsbCBhbmQgc2VydmVyIHJlY29yZCBtYW5hZ2VtZW50CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKQEAgLTExLDE1ICsxMSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8a2V5cy9yeHJwYy10eXBlLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogREVDTEFSRV9SV1NFTShhZnNfcHJvY19jZWxsc19zZW0pOwpAQCAtMjgsNjYgKzIyLDQ3IEBACiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZnNfY2VsbHMgPSBMSVNUX0hFQURfSU5JVChhZnNfY2VsbHMpOwogc3RhdGljIERFRklORV9SV0xPQ0soYWZzX2NlbGxzX2xvY2spOwogc3RhdGljIERFQ0xBUkVfUldTRU0oYWZzX2NlbGxzX3NlbSk7IC8qIGFkZC9yZW1vdmUgc2VyaWFsaXNhdGlvbiAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGFmc19jZWxsc19mcmVlYWJsZV93cSk7CiBzdGF0aWMgc3RydWN0IGFmc19jZWxsICphZnNfY2VsbF9yb290OwogCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX2NlbGxfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJY29uc3Qgdm9pZCAqZW50cnkpOwotc3RhdGljIHZvaWQgYWZzX2NlbGxfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpOwotCi1zdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX2NhY2hlX2NlbGxfaW5kZXhfZGVmID0gewotCS5uYW1lCQkJPSAiY2VsbF9peCIsCi0JLmRhdGFfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV9jZWxsKSwKLQkua2V5c1swXQkJPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19BU0NJSVosIDY0IH0sCi0JLm1hdGNoCQkJPSBhZnNfY2VsbF9jYWNoZV9tYXRjaCwKLQkudXBkYXRlCQkJPSBhZnNfY2VsbF9jYWNoZV91cGRhdGUsCi19OwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBjcmVhdGUgYSBjZWxsIHJlY29yZAotICogLSAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGNlbGwKLSAqIC0gInZsbGlzdCIgaXMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgaW4gImEuYi5jLmQiIGZvcm1hdAorICogYWxsb2NhdGUgYSBjZWxsIHJlY29yZCBhbmQgZmlsbCBpbiBpdHMgbmFtZSwgVkwgc2VydmVyIGFkZHJlc3MgbGlzdCBhbmQKKyAqIGFsbG9jYXRlIGFuIGFub255bW91cyBrZXkKICAqLwotaW50IGFmc19jZWxsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2bGxpc3QsIHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKQorc3RhdGljIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfYWxsb2MoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmxsaXN0KQogewogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQljaGFyICpuZXh0OworCXNpemVfdCBuYW1lbGVuOworCWNoYXIga2V5bmFtZVs0ICsgQUZTX01BWENFTExOQU1FICsgMV0sICpjcCwgKmRwLCAqbmV4dDsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCIlcyIsIG5hbWUpOworCV9lbnRlcigiJXMsJXMiLCBuYW1lLCB2bGxpc3QpOwogCiAJQlVHX09OKCFuYW1lKTsgLyogVE9ETzogd2FudCB0byBsb29rIHVwICJ0aGlzIGNlbGwiIGluIHRoZSBjYWNoZSAqLwogCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZWxlbiA+IEFGU19NQVhDRUxMTkFNRSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKIAkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNlbGwgcmVjb3JkICovCi0JY2VsbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2VsbCkgKyBzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwljZWxsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFmc19jZWxsKSArIG5hbWVsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNlbGwpIHsKIAkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlkb3duX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwltZW1jcHkoY2VsbC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJY2VsbC0+bmFtZVtuYW1lbGVuXSA9IDA7CiAKLQltZW1zZXQoY2VsbCwgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfY2VsbCkpOwotCWF0b21pY19zZXQoJmNlbGwtPnVzYWdlLCAwKTsKLQorCWF0b21pY19zZXQoJmNlbGwtPnVzYWdlLCAxKTsKIAlJTklUX0xJU1RfSEVBRCgmY2VsbC0+bGluayk7Ci0KLQlyd2xvY2tfaW5pdCgmY2VsbC0+c3ZfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnN2X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjZWxsLT5zdl9ncmF2ZXlhcmQpOwotCXNwaW5fbG9ja19pbml0KCZjZWxsLT5zdl9neWxvY2spOwotCisJcndsb2NrX2luaXQoJmNlbGwtPnNlcnZlcnNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnNlcnZlcnMpOwogCWluaXRfcndzZW0oJmNlbGwtPnZsX3NlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnZsX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjZWxsLT52bF9ncmF2ZXlhcmQpOwotCXNwaW5fbG9ja19pbml0KCZjZWxsLT52bF9neWxvY2spOwotCi0Jc3RyY3B5KGNlbGwtPm5hbWUsbmFtZSk7CisJc3Bpbl9sb2NrX2luaXQoJmNlbGwtPnZsX2xvY2spOwogCiAJLyogZmlsbCBpbiB0aGUgVkwgc2VydmVyIGxpc3QgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nICovCi0JcmV0ID0gLUVJTlZBTDsKIAlkbyB7CiAJCXVuc2lnbmVkIGEsIGIsIGMsIGQ7CiAKQEAgLTk2LDIwICs3MSw3NSBAQAogCQkJKm5leHQrKyA9IDA7CiAKIAkJaWYgKHNzY2FuZih2bGxpc3QsICIldS4ldS4ldS4ldSIsICZhLCAmYiwgJmMsICZkKSAhPSA0KQotCQkJZ290byBiYWRhZGRyOworCQkJZ290byBiYWRfYWRkcmVzczsKIAogCQlpZiAoYSA+IDI1NSB8fCBiID4gMjU1IHx8IGMgPiAyNTUgfHwgZCA+IDI1NSkKLQkJCWdvdG8gYmFkYWRkcjsKKwkJCWdvdG8gYmFkX2FkZHJlc3M7CiAKIAkJY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfbmFkZHJzKytdLnNfYWRkciA9CiAJCQlodG9ubCgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoYyA8PCA4KSB8IGQpOwogCi0JCWlmIChjZWxsLT52bF9uYWRkcnMgPj0gQUZTX0NFTExfTUFYX0FERFJTKQotCQkJYnJlYWs7CisJfSB3aGlsZSAoY2VsbC0+dmxfbmFkZHJzIDwgQUZTX0NFTExfTUFYX0FERFJTICYmICh2bGxpc3QgPSBuZXh0KSk7CiAKLQl9IHdoaWxlKHZsbGlzdCA9IG5leHQsIHZsbGlzdCk7CisJLyogY3JlYXRlIGEga2V5IHRvIHJlcHJlc2VudCBhbiBhbm9ueW1vdXMgdXNlciAqLworCW1lbWNweShrZXluYW1lLCAiYWZzQCIsIDQpOworCWRwID0ga2V5bmFtZSArIDQ7CisJY3AgPSBjZWxsLT5uYW1lOworCWRvIHsKKwkJKmRwKysgPSB0b3VwcGVyKCpjcCk7CisJfSB3aGlsZSAoKmNwKyspOworCWNlbGwtPmFub255bW91c19rZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3J4cnBjLCBrZXluYW1lLCAwLCAwLCBjdXJyZW50LAorCQkJCQlLRVlfUE9TX1NFQVJDSCwgS0VZX0FMTE9DX05PVF9JTl9RVU9UQSk7CisJaWYgKElTX0VSUihjZWxsLT5hbm9ueW1vdXNfa2V5KSkgeworCQlfZGVidWcoIm5vIGtleSIpOworCQlyZXQgPSBQVFJfRVJSKGNlbGwtPmFub255bW91c19rZXkpOworCQlnb3RvIGVycm9yOworCX0KIAotCS8qIGFkZCBhIHByb2MgZGlyIGZvciB0aGlzIGNlbGwgKi8KKwlyZXQgPSBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoY2VsbC0+YW5vbnltb3VzX2tleSwgTlVMTCwgMCwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJX2RlYnVnKCJpbnN0YW50aWF0ZSBmYWlsZWQiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlfZGVidWcoImFub24ga2V5ICVweyV4fSIsCisJICAgICAgIGNlbGwtPmFub255bW91c19rZXksIGtleV9zZXJpYWwoY2VsbC0+YW5vbnltb3VzX2tleSkpOworCisJX2xlYXZlKCIgPSAlcCIsIGNlbGwpOworCXJldHVybiBjZWxsOworCitiYWRfYWRkcmVzczoKKwlwcmludGsoS0VSTl9FUlIgImtBRlM6IGJhZCBWTCBzZXJ2ZXIgSVAgYWRkcmVzc1xuIik7CisJcmV0ID0gLUVJTlZBTDsKK2Vycm9yOgorCWtleV9wdXQoY2VsbC0+YW5vbnltb3VzX2tleSk7CisJa2ZyZWUoY2VsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoKKyAqIGNyZWF0ZSBhIGNlbGwgcmVjb3JkCisgKiAtICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgY2VsbAorICogLSAidmxsaXN0IiBpcyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIElQIGFkZHJlc3NlcyBpbiAiYS5iLmMuZCIgZm9ybWF0CisgKi8KK3N0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZsbGlzdCkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJaW50IHJldDsKKworCV9lbnRlcigiJXMsJXMiLCBuYW1lLCB2bGxpc3QpOworCisJY2VsbCA9IGFmc19jZWxsX2FsbG9jKG5hbWUsIHZsbGlzdCk7CisJaWYgKElTX0VSUihjZWxsKSkgeworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY2VsbCkpOworCQlyZXR1cm4gY2VsbDsKKwl9CisKKwlkb3duX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKworCS8qIGFkZCBhIHByb2MgZGlyZWN0b3J5IGZvciB0aGlzIGNlbGwgKi8KIAlyZXQgPSBhZnNfcHJvY19jZWxsX3NldHVwKGNlbGwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwpAQCAtMTMwLDMxICsxNjAsMjggQEAKIAlkb3duX3dyaXRlKCZhZnNfcHJvY19jZWxsc19zZW0pOwogCWxpc3RfYWRkX3RhaWwoJmNlbGwtPnByb2NfbGluaywgJmFmc19wcm9jX2NlbGxzKTsKIAl1cF93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKLQotCSpfY2VsbCA9IGNlbGw7CiAJdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOwogCi0JX2xlYXZlKCIgPSAwICglcCkiLCBjZWxsKTsKLQlyZXR1cm4gMDsKKwlfbGVhdmUoIiA9ICVwIiwgY2VsbCk7CisJcmV0dXJuIGNlbGw7CiAKLSBiYWRhZGRyOgotCXByaW50ayhLRVJOX0VSUiAia0FGUzogYmFkIFZMIHNlcnZlciBJUCBhZGRyZXNzOiAnJXMnXG4iLCB2bGxpc3QpOwotIGVycm9yOgorZXJyb3I6CiAJdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOworCWtleV9wdXQoY2VsbC0+YW5vbnltb3VzX2tleSk7CiAJa2ZyZWUoY2VsbCk7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19jZWxsX2NyZWF0ZSgpICovCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGluaXRpYWxpc2UgdGhlIGNlbGwgZGF0YWJhc2UgZnJvbSBtb2R1bGUgcGFyYW1ldGVycworICogc2V0IHRoZSByb290IGNlbGwgaW5mb3JtYXRpb24KKyAqIC0gY2FuIGJlIGNhbGxlZCB3aXRoIGEgbW9kdWxlIHBhcmFtZXRlciBzdHJpbmcKKyAqIC0gY2FuIGJlIGNhbGxlZCBmcm9tIGEgd3JpdGUgdG8gL3Byb2MvZnMvYWZzL3Jvb3RjZWxsCiAgKi8KIGludCBhZnNfY2VsbF9pbml0KGNoYXIgKnJvb3RjZWxsKQogewogCXN0cnVjdCBhZnNfY2VsbCAqb2xkX3Jvb3QsICpuZXdfcm9vdDsKIAljaGFyICpjcDsKLQlpbnQgcmV0OwogCiAJX2VudGVyKCIiKTsKIApAQCAtMTYyLDgyICsxODksNjAgQEAKIAkJLyogbW9kdWxlIGlzIGxvYWRlZCB3aXRoIG5vIHBhcmFtZXRlcnMsIG9yIGJ1aWx0IHN0YXRpY2FsbHkuCiAJCSAqIC0gaW4gdGhlIGZ1dHVyZSB3ZSBtaWdodCBpbml0aWFsaXplIGNlbGwgREIgaGVyZS4KIAkJICovCi0JCV9sZWF2ZSgiID0gMCAoYnV0IG5vIHJvb3QpIik7CisJCV9sZWF2ZSgiID0gMCBbbm8gcm9vdF0iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJY3AgPSBzdHJjaHIocm9vdGNlbGwsICc6Jyk7CiAJaWYgKCFjcCkgewogCQlwcmludGsoS0VSTl9FUlIgImtBRlM6IG5vIFZMIHNlcnZlciBJUCBhZGRyZXNzZXMgc3BlY2lmaWVkXG4iKTsKLQkJX2xlYXZlKCIgPSAlZCAobm8gY29sb24pIiwgLUVJTlZBTCk7CisJCV9sZWF2ZSgiID0gLUVJTlZBTCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBhbGxvY2F0ZSBhIGNlbGwgcmVjb3JkIGZvciB0aGUgcm9vdCBjZWxsICovCiAJKmNwKysgPSAwOwotCXJldCA9IGFmc19jZWxsX2NyZWF0ZShyb290Y2VsbCwgY3AsICZuZXdfcm9vdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJbmV3X3Jvb3QgPSBhZnNfY2VsbF9jcmVhdGUocm9vdGNlbGwsIGNwKTsKKwlpZiAoSVNfRVJSKG5ld19yb290KSkgeworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIobmV3X3Jvb3QpKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3X3Jvb3QpOwogCX0KIAotCS8qIGFzIGFmc19wdXRfY2VsbCgpIHRha2VzIGxvY2tzIGJ5IGl0c2VsZiwgd2UgaGF2ZSB0byBkbwotCSAqIGEgbGl0dGxlIGd5bW5hc3RpY3MgdG8gYmUgcmFjZS1mcmVlLgotCSAqLwotCWFmc19nZXRfY2VsbChuZXdfcm9vdCk7Ci0KKwkvKiBpbnN0YWxsIHRoZSBuZXcgY2VsbCAqLwogCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKLQl3aGlsZSAoYWZzX2NlbGxfcm9vdCkgewotCQlvbGRfcm9vdCA9IGFmc19jZWxsX3Jvb3Q7Ci0JCWFmc19jZWxsX3Jvb3QgPSBOVUxMOwotCQl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKLQkJYWZzX3B1dF9jZWxsKG9sZF9yb290KTsKLQkJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOwotCX0KKwlvbGRfcm9vdCA9IGFmc19jZWxsX3Jvb3Q7CiAJYWZzX2NlbGxfcm9vdCA9IG5ld19yb290OwogCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCWFmc19wdXRfY2VsbChvbGRfcm9vdCk7CiAKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQogCi19IC8qIGVuZCBhZnNfY2VsbF9pbml0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGxvb2t1cCBhIGNlbGwgcmVjb3JkCiAgKi8KLWludCBhZnNfY2VsbF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbmFtZXN6LCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCkKK3N0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5hbWVzeikKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0JaW50IHJldDsKIAogCV9lbnRlcigiXCIlKi4qc1wiLCIsIG5hbWVzeiwgbmFtZXN6LCBuYW1lID8gbmFtZSA6ICIiKTsKIAotCSpfY2VsbCA9IE5VTEw7CisJZG93bl9yZWFkKCZhZnNfY2VsbHNfc2VtKTsKKwlyZWFkX2xvY2soJmFmc19jZWxsc19sb2NrKTsKIAogCWlmIChuYW1lKSB7CiAJCS8qIGlmIHRoZSBjZWxsIHdhcyBuYW1lZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNlbGwgcmVjb3JkIGxpc3QgKi8KLQkJcmV0ID0gLUVOT0VOVDsKLQkJY2VsbCA9IE5VTEw7Ci0JCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOwotCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2VsbCwgJmFmc19jZWxscywgbGluaykgewogCQkJaWYgKHN0cm5jbXAoY2VsbC0+bmFtZSwgbmFtZSwgbmFtZXN6KSA9PSAwKSB7CiAJCQkJYWZzX2dldF9jZWxsKGNlbGwpOwogCQkJCWdvdG8gZm91bmQ7CiAJCQl9CiAJCX0KLQkJY2VsbCA9IE5VTEw7CisJCWNlbGwgPSBFUlJfUFRSKC1FTk9FTlQpOwogCWZvdW5kOgotCi0JCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KLQkJaWYgKGNlbGwpCi0JCQlyZXQgPSAwOwotCX0KLQllbHNlIHsKLQkJcmVhZF9sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KKwkJOworCX0gZWxzZSB7CiAJCWNlbGwgPSBhZnNfY2VsbF9yb290OwogCQlpZiAoIWNlbGwpIHsKIAkJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHVzZXIgdHJpZXMgdG8gbW91bnQKQEAgLTI0Niw0NCArMjUxLDM1IEBACiAJCQkgKiBFTk9FTlQgbWlnaHQgYmUgIm1vcmUgYXBwcm9wcmlhdGUiIGJ1dCB0aGV5IGhhcHBlbgogCQkJICogZm9yIG90aGVyIHJlYXNvbnMuCiAJCQkgKi8KLQkJCXJldCA9IC1FREVTVEFERFJSRVE7Ci0JCX0KLQkJZWxzZSB7CisJCQljZWxsID0gRVJSX1BUUigtRURFU1RBRERSUkVRKTsKKwkJfSBlbHNlIHsKIAkJCWFmc19nZXRfY2VsbChjZWxsKTsKLQkJCXJldCA9IDA7CiAJCX0KIAotCQlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOwogCX0KIAotCSpfY2VsbCA9IGNlbGw7Ci0JX2xlYXZlKCIgPSAlZCAoJXApIiwgcmV0LCBjZWxsKTsKLQlyZXR1cm4gcmV0OworCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJdXBfcmVhZCgmYWZzX2NlbGxzX3NlbSk7CisJX2xlYXZlKCIgPSAlcCIsIGNlbGwpOworCXJldHVybiBjZWxsOworfQogCi19IC8qIGVuZCBhZnNfY2VsbF9sb29rdXAoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogdHJ5IGFuZCBnZXQgYSBjZWxsIHJlY29yZAogICovCi1zdHJ1Y3QgYWZzX2NlbGwgKmFmc19nZXRfY2VsbF9tYXliZShzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCkKK3N0cnVjdCBhZnNfY2VsbCAqYWZzX2dldF9jZWxsX21heWJlKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCkKIHsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0KIAl3cml0ZV9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CiAKLQljZWxsID0gKl9jZWxsOwogCWlmIChjZWxsICYmICFsaXN0X2VtcHR5KCZjZWxsLT5saW5rKSkKIAkJYWZzX2dldF9jZWxsKGNlbGwpOwogCWVsc2UKIAkJY2VsbCA9IE5VTEw7CiAKIAl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKLQogCXJldHVybiBjZWxsOwotfSAvKiBlbmQgYWZzX2dldF9jZWxsX21heWJlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRlc3Ryb3kgYSBjZWxsIHJlY29yZAogICovCkBAIC0yOTQsOCArMjkwLDcgQEAKIAogCV9lbnRlcigiJXB7JWQsJXN9IiwgY2VsbCwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7CiAKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlCVUdfT04oYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSA8PSAwKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgPiwgMCk7CiAKIAkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZSBlZmZlY3RpdmVseQogCSAqIGF0b21pYyAqLwpAQCAtMzA3LDM2ICszMDIsNDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCUFTU0VSVChsaXN0X2VtcHR5KCZjZWxsLT5zZXJ2ZXJzKSk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKwogCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOwogCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOworCXdha2VfdXAoJmFmc19jZWxsc19mcmVlYWJsZV93cSk7CiAKIAlfbGVhdmUoIiBbdW51c2VkXSIpOwotfSAvKiBlbmQgYWZzX3B1dF9jZWxsKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRlc3Ryb3kgYSBjZWxsIHJlY29yZAorICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBhZnNfY2VsbHNfc2VtIHdyaXRlLWxvY2tlZAorICogLSBjZWxsLT5saW5rIHNob3VsZCBoYXZlIGJlZW4gYnJva2VuIGJ5IHRoZSBjYWxsZXIKICAqLwogc3RhdGljIHZvaWQgYWZzX2NlbGxfZGVzdHJveShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCiB7CiAJX2VudGVyKCIlcHslZCwlc30iLCBjZWxsLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCBjZWxsLT5uYW1lKTsKIAotCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5Ci0JICogYXRvbWljICovCi0Jd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCA+PSwgMCk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmNlbGwtPmxpbmspKTsKIAotCS8qIHNhbml0eSBjaGVjayAqLwotCUJVR19PTihhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpICE9IDApOworCS8qIHdhaXQgZm9yIGV2ZXJ5b25lIHRvIHN0b3AgdXNpbmcgdGhlIGNlbGwgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSA+IDApIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKIAotCWxpc3RfZGVsX2luaXQoJmNlbGwtPmxpbmspOworCQlfZGVidWcoIndhaXQgZm9yIGNlbGwgJXMiLCBjZWxsLT5uYW1lKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmYWZzX2NlbGxzX2ZyZWVhYmxlX3dxLCAmbXlzZWxmKTsKIAotCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCQl3aGlsZSAoYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSA+IDApIHsKKwkJCXNjaGVkdWxlKCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KIAotCWRvd25fd3JpdGUoJmFmc19jZWxsc19zZW0pOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYWZzX2NlbGxzX2ZyZWVhYmxlX3dxLCAmbXlzZWxmKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisKKwlfZGVidWcoImNlbGwgZGVhZCIpOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCA9PSwgMCk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmNlbGwtPnNlcnZlcnMpKTsKKwlBU1NFUlQobGlzdF9lbXB0eSgmY2VsbC0+dmxfbGlzdCkpOwogCiAJYWZzX3Byb2NfY2VsbF9yZW1vdmUoY2VsbCk7CiAKQEAgLTM0OCwxMDQgKzM1NiwyNiBAQAogCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUoY2VsbC0+Y2FjaGUsIDApOwogI2VuZGlmCiAKLQl1cF93cml0ZSgmYWZzX2NlbGxzX3NlbSk7Ci0KLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnN2X2xpc3QpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnN2X2dyYXZleWFyZCkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmY2VsbC0+dmxfbGlzdCkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmY2VsbC0+dmxfZ3JhdmV5YXJkKSk7Ci0KLQkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIGNlbGwgKi8KKwlrZXlfcHV0KGNlbGwtPmFub255bW91c19rZXkpOwogCWtmcmVlKGNlbGwpOwogCiAJX2xlYXZlKCIgW2Rlc3Ryb3llZF0iKTsKLX0gLyogZW5kIGFmc19jZWxsX2Rlc3Ryb3koKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbG9va3VwIHRoZSBzZXJ2ZXIgcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gYW4gUnggUlBDIHBlZXIKLSAqLwotaW50IGFmc19zZXJ2ZXJfZmluZF9ieV9wZWVyKGNvbnN0IHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcikKLXsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQotCV9lbnRlcigiJXB7YT0lMDh4fSwiLCBwZWVyLCBudG9obChwZWVyLT5hZGRyLnNfYWRkcikpOwotCi0JLyogc2VhcmNoIHRoZSBjZWxsIGxpc3QgKi8KLQlyZWFkX2xvY2soJmFmc19jZWxsc19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2VsbCwgJmFmc19jZWxscywgbGluaykgewotCi0JCV9kZWJ1ZygiPyBjZWxsICVzIixjZWxsLT5uYW1lKTsKLQotCQl3cml0ZV9sb2NrKCZjZWxsLT5zdl9sb2NrKTsKLQotCQkvKiBjaGVjayB0aGUgYWN0aXZlIGxpc3QgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXJ2ZXIsICZjZWxsLT5zdl9saXN0LCBsaW5rKSB7Ci0JCQlfZGVidWcoIj8/IHNlcnZlciAlMDh4IiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOwotCi0JCQlpZiAobWVtY21wKCZzZXJ2ZXItPmFkZHIsICZwZWVyLT5hZGRyLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDApCi0JCQkJZ290byBmb3VuZF9zZXJ2ZXI7Ci0JCX0KLQotCQkvKiBjaGVjayB0aGUgaW5hY3RpdmUgbGlzdCAqLwotCQlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c3ZfZ3JhdmV5YXJkLCBsaW5rKSB7Ci0JCQlfZGVidWcoIj8/IGRlYWQgc2VydmVyICUwOHgiLAotCQkJICAgICAgIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKLQotCQkJaWYgKG1lbWNtcCgmc2VydmVyLT5hZGRyLCAmcGVlci0+YWRkciwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSA9PSAwKQotCQkJCWdvdG8gZm91bmRfZGVhZF9zZXJ2ZXI7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0KLQkJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKLQl9Ci0JcmVhZF91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKLQotCV9sZWF2ZSgiID0gLUVOT0VOVCIpOwotCXJldHVybiAtRU5PRU5UOwotCi0JLyogd2UgZm91bmQgaXQgaW4gdGhlIGdyYXZleWFyZCAtIHJlc3VycmVjdCBpdCAqLwotIGZvdW5kX2RlYWRfc2VydmVyOgotCWxpc3RfbW92ZV90YWlsKCZzZXJ2ZXItPmxpbmssICZjZWxsLT5zdl9saXN0KTsKLQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOwotCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXQpOwotCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCWdvdG8gc3VjY2VzczsKLQotCS8qIHdlIGZvdW5kIGl0IC0gaW5jcmVtZW50IGl0cyByZWYgY291bnQgYW5kIHJldHVybiBpdCAqLwotIGZvdW5kX3NlcnZlcjoKLQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOwotCi0gc3VjY2VzczoKLQl3cml0ZV91bmxvY2soJmNlbGwtPnN2X2xvY2spOwotCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KLQkqX3NlcnZlciA9IHNlcnZlcjsKLQlfbGVhdmUoIiA9IDAgKHM9JXAgYz0lcCkiLCBzZXJ2ZXIsIGNlbGwpOwotCXJldHVybiAwOwotCi19IC8qIGVuZCBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBwdXJnZSBpbi1tZW1vcnkgY2VsbCBkYXRhYmFzZSBvbiBtb2R1bGUgdW5sb2FkIG9yIGFmc19pbml0KCkgZmFpbHVyZQogICogLSB0aGUgdGltZW91dCBkYWVtb24gaXMgc3RvcHBlZCBiZWZvcmUgY2FsbGluZyB0aGlzCiAgKi8KIHZvaWQgYWZzX2NlbGxfcHVyZ2Uodm9pZCkKIHsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKIAogCV9lbnRlcigiIik7CiAKIAlhZnNfcHV0X2NlbGwoYWZzX2NlbGxfcm9vdCk7CiAKKwlkb3duX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmYWZzX2NlbGxzKSkgewogCQljZWxsID0gTlVMTDsKIApAQCAtNDY0LDEwNCArMzk0LDExIEBACiAJCQlfZGVidWcoIlBVUkdJTkcgQ0VMTCAlcyAoJWQpIiwKIAkJCSAgICAgICBjZWxsLT5uYW1lLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpKTsKIAotCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7Ci0JCQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKLQotCQkJLyogcHVyZ2UgdGhlIGNlbGwncyBWTCBncmF2ZXlhcmQgbGlzdCAqLwotCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBWTCBncmF2ZXlhcmQiKTsKLQotCQkJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCi0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpIHsKLQkJCQl2bG9jYXRpb24gPSBsaXN0X2VudHJ5KGNlbGwtPnZsX2dyYXZleWFyZC5uZXh0LAotCQkJCQkJICAgICAgIHN0cnVjdCBhZnNfdmxvY2F0aW9uLAotCQkJCQkJICAgICAgIGxpbmspOwotCQkJCWxpc3RfZGVsX2luaXQoJnZsb2NhdGlvbi0+bGluayk7Ci0KLQkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0KTsKLQotCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCi0JCQkJYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHZsb2NhdGlvbik7Ci0JCQkJLyogVE9ETzogcmFjZSBpZiBtb3ZlIHRvIHVzZSBrcnh0aW1vZCBpbnN0ZWFkCi0JCQkJICogb2Yga2Fmc3RpbW9kICovCi0KLQkJCQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCi0JCQkvKiBwdXJnZSB0aGUgY2VsbCdzIHNlcnZlciBncmF2ZXlhcmQgbGlzdCAqLwotCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBzZXJ2ZXIgZ3JhdmV5YXJkIik7Ci0KLQkJCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKSB7Ci0JCQkJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQotCQkJCXNlcnZlciA9IGxpc3RfZW50cnkoY2VsbC0+c3ZfZ3JhdmV5YXJkLm5leHQsCi0JCQkJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOwotCQkJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+bGluayk7Ci0KLQkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKLQotCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCi0JCQkJYWZzX3NlcnZlcl9kb190aW1lb3V0KHNlcnZlcik7Ci0KLQkJCQlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCiAJCQkvKiBub3cgdGhlIGNlbGwgc2hvdWxkIGJlIGxlZnQgd2l0aCBubyByZWZlcmVuY2VzICovCiAJCQlhZnNfY2VsbF9kZXN0cm95KGNlbGwpOwogCQl9CiAJfQogCisJdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOwogCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfY2VsbF9wdXJnZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBtYXRjaCBhIGNlbGwgcmVjb3JkIG9idGFpbmVkIGZyb20gdGhlIGNhY2hlCi0gKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfY2VsbF9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCi0JCQkJCQljb25zdCB2b2lkICplbnRyeSkKLXsKLQljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX2NlbGwgKmNjZWxsID0gZW50cnk7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsID0gdGFyZ2V0OwotCi0JX2VudGVyKCJ7JXN9LHslc30iLCBjY2VsbC0+bmFtZSwgY2VsbC0+bmFtZSk7Ci0KLQlpZiAoc3RybmNtcChjY2VsbC0+bmFtZSwgY2VsbC0+bmFtZSwgc2l6ZW9mKGNjZWxsLT5uYW1lKSkgPT0gMCkgewotCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKLQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKLQl9Ci0KLQlfbGVhdmUoIiA9IEZBSUxFRCIpOwotCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKLX0gLyogZW5kIGFmc19jZWxsX2NhY2hlX21hdGNoKCkgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdXBkYXRlIGEgY2VsbCByZWNvcmQgaW4gdGhlIGNhY2hlCi0gKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgdm9pZCBhZnNfY2VsbF9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSkKLXsKLQlzdHJ1Y3QgYWZzX2NhY2hlX2NlbGwgKmNjZWxsID0gZW50cnk7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsID0gc291cmNlOwotCi0JX2VudGVyKCIlcCwlcCIsIHNvdXJjZSwgZW50cnkpOwotCi0Jc3RybmNweShjY2VsbC0+bmFtZSwgY2VsbC0+bmFtZSwgc2l6ZW9mKGNjZWxsLT5uYW1lKSk7Ci0KLQltZW1jcHkoY2NlbGwtPnZsX3NlcnZlcnMsCi0JICAgICAgIGNlbGwtPnZsX2FkZHJzLAotCSAgICAgICBtaW4oc2l6ZW9mKGNjZWxsLT52bF9zZXJ2ZXJzKSwgc2l6ZW9mKGNlbGwtPnZsX2FkZHJzKSkpOwotCi19IC8qIGVuZCBhZnNfY2VsbF9jYWNoZV91cGRhdGUoKSAqLwotI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvY2VsbC5oIGIvZnMvYWZzL2NlbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzNDkxMC4uMDAwMDAwMAotLS0gYS9mcy9hZnMvY2VsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogY2VsbC5oOiBBRlMgY2VsbCByZWNvcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX0NFTExfSAotI2RlZmluZSBfTElOVVhfQUZTX0NFTExfSAotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJjYWNoZS5oIgotCi0jZGVmaW5lIEFGU19DRUxMX01BWF9BRERSUyAxNQotCi1leHRlcm4gdm9sYXRpbGUgaW50IGFmc19jZWxsc19iZWluZ19wdXJnZWQ7IC8qIFQgd2hlbiBjZWxscyBhcmUgYmVpbmcgcHVyZ2VkIGJ5IHJtbW9kICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBlbnRyeSBpbiB0aGUgY2FjaGVkIGNlbGwgY2F0YWxvZ3VlCi0gKi8KLXN0cnVjdCBhZnNfY2FjaGVfY2VsbAotewotCWNoYXIJCQluYW1lWzY0XTsJLyogY2VsbCBuYW1lIChwYWRkZWQgd2l0aCBOVUxzKSAqLwotCXN0cnVjdCBpbl9hZGRyCQl2bF9zZXJ2ZXJzWzE1XTsJLyogY2FjaGVkIGNlbGwgVkwgc2VydmVycyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBjZWxsIHJlY29yZAotICovCi1zdHJ1Y3QgYWZzX2NlbGwKLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbWFpbiBjZWxsIGxpc3QgbGluayAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiAvcHJvYyBjZWxsIGxpc3QgbGluayAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19kaXI7CS8qIC9wcm9jIGRpciBmb3IgdGhpcyBjZWxsICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLwotI2VuZGlmCi0KLQkvKiBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQgKi8KLQlyd2xvY2tfdAkJc3ZfbG9jazsJLyogYWN0aXZlIHNlcnZlciBsaXN0IGxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXN2X2xpc3Q7CS8qIGFjdGl2ZSBzZXJ2ZXIgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc3ZfZ3JhdmV5YXJkOwkvKiBpbmFjdGl2ZSBzZXJ2ZXIgbGlzdCAqLwotCXNwaW5sb2NrX3QJCXN2X2d5bG9jazsJLyogaW5hY3RpdmUgc2VydmVyIGxpc3QgbG9jayAqLwotCi0JLyogdm9sdW1lIGxvY2F0aW9uIHJlY29yZCBtYW5hZ2VtZW50ICovCi0Jc3RydWN0IHJ3X3NlbWFwaG9yZQl2bF9zZW07CQkvKiB2b2x1bWUgbWFuYWdlbWVudCBzZXJpYWxpc2F0aW9uIHNlbWFwaG9yZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJdmxfbGlzdDsJLyogY2VsbCdzIGFjdGl2ZSBWTCByZWNvcmQgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJdmxfZ3JhdmV5YXJkOwkvKiBjZWxsJ3MgaW5hY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KLQlzcGlubG9ja190CQl2bF9neWxvY2s7CS8qIGdyYXZleWFyZCBsb2NrICovCi0JdW5zaWduZWQgc2hvcnQJCXZsX25hZGRyczsJLyogbnVtYmVyIG9mIFZMIHNlcnZlcnMgaW4gYWRkciBsaXN0ICovCi0JdW5zaWduZWQgc2hvcnQJCXZsX2N1cnJfc3ZpeDsJLyogY3VycmVudCBzZXJ2ZXIgaW5kZXggKi8KLQlzdHJ1Y3QgaW5fYWRkcgkJdmxfYWRkcnNbQUZTX0NFTExfTUFYX0FERFJTXTsJLyogY2VsbCBWTCBzZXJ2ZXIgYWRkcmVzc2VzICovCi0KLQljaGFyCQkJbmFtZVswXTsJLyogY2VsbCBuYW1lIC0gbXVzdCBnbyBsYXN0ICovCi19OwotCi1leHRlcm4gaW50IGFmc19jZWxsX2luaXQoY2hhciAqcm9vdGNlbGwpOwotCi1leHRlcm4gaW50IGFmc19jZWxsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2bGxpc3QsIHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKTsKLQotZXh0ZXJuIGludCBhZnNfY2VsbF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbm1zaXplLCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7Ci0KLSNkZWZpbmUgYWZzX2dldF9jZWxsKEMpIGRvIHsgYXRvbWljX2luYygmKEMpLT51c2FnZSk7IH0gd2hpbGUoMCkKLQotZXh0ZXJuIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2dldF9jZWxsX21heWJlKHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKTsKLQotZXh0ZXJuIHZvaWQgYWZzX3B1dF9jZWxsKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCk7Ci0KLWV4dGVybiB2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpOwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19DRUxMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jbXNlcnZpY2UuYyBiL2ZzL2Fmcy9jbXNlcnZpY2UuYwppbmRleCAzZDA5N2ZkLi42Njg1ZjRjIDEwMDY0NAotLS0gYS9mcy9hZnMvY21zZXJ2aWNlLmMKKysrIGIvZnMvYWZzL2Ntc2VydmljZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogY21zZXJ2aWNlLmM6IEFGUyBDYWNoZSBNYW5hZ2VyIFNlcnZpY2UKKy8qIEFGUyBDYWNoZSBNYW5hZ2VyIFNlcnZpY2UKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMTIsNjQxICsxMiw0NjMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC5oIgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBhZnNjbV91c2FnZTsJCS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHVzYWdlIGNvdW50ICovCi1zdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSBhZnNjbV9zZW07CS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHN0YXJ0L3N0b3Agc2VtYXBob3JlICovCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX2NtX3dvcmtxdWV1ZTsKIAotc3RhdGljIGludCBhZnNjbV9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci1zdGF0aWMgdm9pZCBhZnNjbV9hdHRlbnRpb24oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgYWZzY21fZXJyb3Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgYWZzY21fYWVtYXAoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICosCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmUoc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2dldF9jYXBhYmlsaXRpZXMoc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkJCSAgIGJvb2wpOworc3RhdGljIHZvaWQgYWZzX2NtX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwogCi1zdGF0aWMgdm9pZCBfU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIF9TUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisvKgorICogQ0IuQ2FsbEJhY2sgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19TUlhDQkNhbGxCYWNrID0geworCS5uYW1lCQk9ICJDQi5DYWxsQmFjayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjaywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfY21fZGVzdHJ1Y3RvciwKK307CiAKLXR5cGVkZWYgdm9pZCAoKl9TUlhBRlNDTV94eHh4X3QpKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKy8qCisgKiBDQi5Jbml0Q2FsbEJhY2tTdGF0ZSBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1NSWENCSW5pdENhbGxCYWNrU3RhdGUgPSB7CisJLm5hbWUJCT0gIkNCLkluaXRDYWxsQmFja1N0YXRlIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NiX2luaXRfY2FsbF9iYWNrX3N0YXRlLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19jbV9kZXN0cnVjdG9yLAorfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24gQUZTQ01fb3BzW10gPSB7Ci0JewotCQkuaWQJPSAyMDQsCi0JCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKLQkJLm5hbWUJPSAiQ2FsbEJhY2siLAotCQkudXNlcgk9IF9TUlhBRlNDTV9DYWxsQmFjaywKLQl9LAotCXsKLQkJLmlkCT0gMjA1LAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkluaXRDYWxsQmFja1N0YXRlIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUsCi0JfSwKLQl7Ci0JCS5pZAk9IDIwNiwKLQkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAotCQkubmFtZQk9ICJQcm9iZSIsCi0JCS51c2VyCT0gX1NSWEFGU0NNX1Byb2JlLAotCX0sCi0jaWYgMAotCXsKLQkJLmlkCT0gMjA3LAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkdldExvY2siLAotCQkudXNlcgk9IF9TUlhBRlNDTV9HZXRMb2NrLAotCX0sCi0JewotCQkuaWQJPSAyMDgsCi0JCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKLQkJLm5hbWUJPSAiR2V0Q0UiLAotCQkudXNlcgk9IF9TUlhBRlNDTV9HZXRDRSwKLQl9LAotCXsKLQkJLmlkCT0gMjA5LAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkdldFhTdGF0c1ZlcnNpb24iLAotCQkudXNlcgk9IF9TUlhBRlNDTV9HZXRYU3RhdHNWZXJzaW9uLAotCX0sCi0JewotCQkuaWQJPSAyMTAsCi0JCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKLQkJLm5hbWUJPSAiR2V0WFN0YXRzIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0WFN0YXRzLAorLyoKKyAqIENCLkluaXRDYWxsQmFja1N0YXRlMyBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1NSWENCSW5pdENhbGxCYWNrU3RhdGUzID0geworCS5uYW1lCQk9ICJDQi5Jbml0Q2FsbEJhY2tTdGF0ZTMiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19jbV9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIENCLlByb2JlIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfU1JYQ0JQcm9iZSA9IHsKKwkubmFtZQkJPSAiQ0IuUHJvYmUiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfY2JfcHJvYmUsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2NtX2Rlc3RydWN0b3IsCit9OworCisvKgorICogQ0IuR2V0Q2FwYWJpbGl0aWVzIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfU1JYQ0JHZXRDYXBhYmlsaXRlcyA9IHsKKwkubmFtZQkJPSAiQ0IuR2V0Q2FwYWJpbGl0aWVzIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NiX2dldF9jYXBhYmlsaXRpZXMsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2NtX2Rlc3RydWN0b3IsCit9OworCisvKgorICogcm91dGUgYW4gaW5jb21pbmcgY2FjaGUgbWFuYWdlciBjYWxsCisgKiAtIHJldHVybiBUIGlmIHN1cHBvcnRlZCwgRiBpZiBub3QKKyAqLworYm9vbCBhZnNfY21faW5jb21pbmdfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJdTMyIG9wZXJhdGlvbl9pZCA9IG50b2hsKGNhbGwtPm9wZXJhdGlvbl9JRCk7CisKKwlfZW50ZXIoIntDQi5PUCAldX0iLCBvcGVyYXRpb25faWQpOworCisJc3dpdGNoIChvcGVyYXRpb25faWQpIHsKKwljYXNlIENCQ2FsbEJhY2s6CisJCWNhbGwtPnR5cGUgPSAmYWZzX1NSWENCQ2FsbEJhY2s7CisJCXJldHVybiB0cnVlOworCWNhc2UgQ0JJbml0Q2FsbEJhY2tTdGF0ZToKKwkJY2FsbC0+dHlwZSA9ICZhZnNfU1JYQ0JJbml0Q2FsbEJhY2tTdGF0ZTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBDQkluaXRDYWxsQmFja1N0YXRlMzoKKwkJY2FsbC0+dHlwZSA9ICZhZnNfU1JYQ0JJbml0Q2FsbEJhY2tTdGF0ZTM7CisJCXJldHVybiB0cnVlOworCWNhc2UgQ0JQcm9iZToKKwkJY2FsbC0+dHlwZSA9ICZhZnNfU1JYQ0JQcm9iZTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBDQkdldENhcGFiaWxpdGllczoKKwkJY2FsbC0+dHlwZSA9ICZhZnNfU1JYQ0JHZXRDYXBhYmlsaXRlczsKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOwogCX0KLSNlbmRpZgotfTsKK30KIAotc3RhdGljIHN0cnVjdCByeHJwY19zZXJ2aWNlIEFGU0NNX3NlcnZpY2UgPSB7Ci0JLm5hbWUJCT0gIkFGUy9DTSIsCi0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5saW5rCQk9IExJU1RfSEVBRF9JTklUKEFGU0NNX3NlcnZpY2UubGluayksCi0JLm5ld19jYWxsCT0gYWZzY21fbmV3X2NhbGwsCi0JLnNlcnZpY2VfaWQJPSAxLAotCS5hdHRuX2Z1bmMJPSBhZnNjbV9hdHRlbnRpb24sCi0JLmVycm9yX2Z1bmMJPSBhZnNjbV9lcnJvciwKLQkuYWVtYXBfZnVuYwk9IGFmc2NtX2FlbWFwLAotCS5vcHNfYmVnaW4JPSAmQUZTQ01fb3BzWzBdLAotCS5vcHNfZW5kCT0gJkFGU0NNX29wc1tBUlJBWV9TSVpFKEFGU0NNX29wcyldLAotfTsKLQotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzY21kX2FsaXZlKTsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2Fmc2NtZF9kZWFkKTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChrYWZzY21kX3NsZWVwcSk7Ci1zdGF0aWMgTElTVF9IRUFEKGthZnNjbWRfYXR0ZW50aW9uX2xpc3QpOwotc3RhdGljIExJU1RfSEVBRChhZnNjbV9jYWxscyk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFmc2NtX2NhbGxzX2xvY2spOwotc3RhdGljIERFRklORV9TUElOTE9DSyhrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKLXN0YXRpYyBpbnQga2Fmc2NtZF9kaWU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBBRlMgQ2FjaGUgTWFuYWdlciBrZXJuZWwgdGhyZWFkCisgKiBjbGVhbiB1cCBhIGNhY2hlIG1hbmFnZXIgY2FsbAogICovCi1zdGF0aWMgaW50IGthZnNjbWQodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgYWZzX2NtX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICpjYWxsKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJX2VudGVyKCIiKTsKIAotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCV9TUlhBRlNDTV94eHh4X3QgZnVuYzsKLQlpbnQgZGllOworCWFmc19wdXRfc2VydmVyKGNhbGwtPnNlcnZlcik7CisJY2FsbC0+c2VydmVyID0gTlVMTDsKKwlrZnJlZShjYWxsLT5idWZmZXIpOworCWNhbGwtPmJ1ZmZlciA9IE5VTEw7Cit9CiAKLQlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBTdGFydGVkIGthZnNjbWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImthZnNjbWQiKTsKLQotCWNvbXBsZXRlKCZrYWZzY21kX2FsaXZlKTsKLQotCS8qIGxvb3AgYXJvdW5kIGxvb2tpbmcgZm9yIHRoaW5ncyB0byBhdHRlbmQgdG8gKi8KLQlkbyB7Ci0JCWlmIChsaXN0X2VtcHR5KCZrYWZzY21kX2F0dGVudGlvbl9saXN0KSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCWFkZF93YWl0X3F1ZXVlKCZrYWZzY21kX3NsZWVwcSwgJm15c2VsZik7Ci0KLQkJCWZvciAoOzspIHsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCWlmICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkgfHwKLQkJCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKLQkJCQkgICAga2Fmc2NtZF9kaWUpCi0JCQkJCWJyZWFrOwotCi0JCQkJc2NoZWR1bGUoKTsKLQkJCX0KLQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmthZnNjbWRfc2xlZXBxLCAmbXlzZWxmKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCX0KLQotCQlkaWUgPSBrYWZzY21kX2RpZTsKLQotCQkvKiBkZXF1ZXVlIHRoZSBuZXh0IGNhbGwgcmVxdWlyaW5nIGF0dGVudGlvbiAqLwotCQljYWxsID0gTlVMTDsKLQkJc3Bpbl9sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKLQotCQlpZiAoIWxpc3RfZW1wdHkoJmthZnNjbWRfYXR0ZW50aW9uX2xpc3QpKSB7Ci0JCQljYWxsID0gbGlzdF9lbnRyeShrYWZzY21kX2F0dGVudGlvbl9saXN0Lm5leHQsCi0JCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCi0JCQkJCSAgYXBwX2F0dG5fbGluayk7Ci0JCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfYXR0bl9saW5rKTsKLQkJCWRpZSA9IDA7Ci0JCX0KLQotCQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0KLQkJaWYgKGNhbGwpIHsKLQkJCS8qIGFjdCB1cG9uIGl0ICovCi0JCQlfZGVidWcoIkBAQCBCZWdpbiBBdHRlbmQgQ2FsbCAlcCIsIGNhbGwpOwotCi0JCQlmdW5jID0gY2FsbC0+YXBwX3VzZXI7Ci0JCQlpZiAoZnVuYykKLQkJCQlmdW5jKGNhbGwpOwotCi0JCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCQkJX2RlYnVnKCJAQEAgRW5kIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7Ci0JCX0KLQotCX0gd2hpbGUoIWRpZSk7Ci0KLQkvKiBhbmQgdGhhdCdzIGFsbCAqLwotCWNvbXBsZXRlX2FuZF9leGl0KCZrYWZzY21kX2RlYWQsIDApOwotCi19IC8qIGVuZCBrYWZzY21kKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGhhbmRsZSBhIGNhbGwgY29taW5nIGluIHRvIHRoZSBjYWNoZSBtYW5hZ2VyCi0gKiAtIGlmIEkgd2FudCB0byBrZWVwIHRoZSBjYWxsLCBJIG11c3QgaW5jcmVtZW50IGl0cyB1c2FnZSBjb3VudAotICogLSB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgbmVnYXRlZCBhbmQgcGFzc2VkIGJhY2sgaW4gYW4gYWJvcnQgcGFja2V0IGlmCi0gKiAgIG5vbi16ZXJvCi0gKiAtIHNlcmlhbGlzZWQgYnkgdmlydHVlIG9mIHRoZXJlIG9ubHkgYmVpbmcgb25lIGtyeGlvZAorICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gc2VlIGlmIHRoZSBjYWNoZSBtYW5hZ2VyIGlzIHN0aWxsIGFsaXZlCiAgKi8KLXN0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JX2VudGVyKCIlcHtjaWQ9JXUgdT0lZH0iLAotCSAgICAgICBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CiAKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwlfZW50ZXIoIiIpOwogCi0JLyogYWRkIHRvIG15IGN1cnJlbnQgY2FsbCBsaXN0ICovCi0Jc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQlsaXN0X2FkZCgmY2FsbC0+YXBwX2xpbmssJmFmc2NtX2NhbGxzKTsKLQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisJLyogYmUgc3VyZSB0byBzZW5kIHRoZSByZXBseSAqYmVmb3JlKiBhdHRlbXB0aW5nIHRvIHNwYW0gdGhlIEFGUyBzZXJ2ZXIKKwkgKiB3aXRoIEZTRmV0Y2hTdGF0dXMgcmVxdWVzdHMgb24gdGhlIHZub2RlcyB3aXRoIGJyb2tlbiBjYWxsYmFja3MgbGVzdAorCSAqIHRoZSBBRlMgc2VydmVyIGdldCBpbnRvIGEgdmljaW91cyBjeWNsZSBvZiB0cnlpbmcgdG8gYnJlYWsgZnVydGhlcgorCSAqIGNhbGxiYWNrcyBiZWNhdXNlIGl0IGhhZG4ndCByZWNlaXZlZCBjb21wbGV0aW9uIG9mIHRoZSBDQkNhbGxCYWNrIG9wCisJICogeWV0ICovCisJYWZzX3NlbmRfZW1wdHlfcmVwbHkoY2FsbCk7CiAKLQlfbGVhdmUoIiA9IDAiKTsKKwlhZnNfYnJlYWtfY2FsbGJhY2tzKGNhbGwtPnNlcnZlciwgY2FsbC0+Y291bnQsIGNhbGwtPnJlcXVlc3QpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkNhbGxCYWNrIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwlfX2JlMzIgKmJwOworCXUzMiB0bXA7CisJaW50IHJldCwgbG9vcDsKKworCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCisJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CisJY2FzZSAwOgorCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJLyogZXh0cmFjdCB0aGUgRklEIGFycmF5IGFuZCBpdHMgY291bnQgaW4gdHdvIHN0ZXBzICovCisJY2FzZSAxOgorCQlfZGVidWcoImV4dHJhY3QgRklEIGNvdW50Iik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CisJCV9kZWJ1ZygiRklEIGNvdW50OiAldSIsIGNhbGwtPmNvdW50KTsKKwkJaWYgKGNhbGwtPmNvdW50ID4gQUZTQ0JNQVgpCisJCQlyZXR1cm4gLUVCQURNU0c7CisKKwkJY2FsbC0+YnVmZmVyID0ga21hbGxvYyhjYWxsLT5jb3VudCAqIDMgKiA0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjYWxsLT5idWZmZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSAyOgorCQlfZGVidWcoImV4dHJhY3QgRklEIGFycmF5Iik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQlicmVhazsKKwkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKKwkJZGVmYXVsdDoJcmV0dXJuIHJldDsKKwkJfQorCisJCV9kZWJ1ZygidW5tYXJzaGFsbCBGSUQgYXJyYXkiKTsKKwkJY2FsbC0+cmVxdWVzdCA9IGtjYWxsb2MoY2FsbC0+Y291bnQsCisJCQkJCXNpemVvZihzdHJ1Y3QgYWZzX2NhbGxiYWNrKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghY2FsbC0+cmVxdWVzdCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNiID0gY2FsbC0+cmVxdWVzdDsKKwkJYnAgPSBjYWxsLT5idWZmZXI7CisJCWZvciAobG9vcCA9IGNhbGwtPmNvdW50OyBsb29wID4gMDsgbG9vcC0tLCBjYisrKSB7CisJCQljYi0+ZmlkLnZpZAk9IG50b2hsKCpicCsrKTsKKwkJCWNiLT5maWQudm5vZGUJPSBudG9obCgqYnArKyk7CisJCQljYi0+ZmlkLnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwkJCWNiLT50eXBlCT0gQUZTQ01fQ0JfVU5UWVBFRDsKKwkJfQorCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSBjYWxsYmFjayBhcnJheSBhbmQgaXRzIGNvdW50IGluIHR3byBzdGVwcyAqLworCWNhc2UgMzoKKwkJX2RlYnVnKCJleHRyYWN0IENCIGNvdW50Iik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQl0bXAgPSBudG9obChjYWxsLT50bXApOworCQlfZGVidWcoIkNCIGNvdW50OiAldSIsIHRtcCk7CisJCWlmICh0bXAgIT0gY2FsbC0+Y291bnQgJiYgdG1wICE9IDApCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKwkJaWYgKHRtcCA9PSAwKQorCQkJZ290byBlbXB0eV9jYl9hcnJheTsKKworCWNhc2UgNDoKKwkJX2RlYnVnKCJleHRyYWN0IENCIGFycmF5Iik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXF1ZXN0LAorCQkJCSAgICAgICBjYWxsLT5jb3VudCAqIDMgKiA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQlfZGVidWcoInVubWFyc2hhbGwgQ0IgYXJyYXkiKTsKKwkJY2IgPSBjYWxsLT5yZXF1ZXN0OworCQlicCA9IGNhbGwtPmJ1ZmZlcjsKKwkJZm9yIChsb29wID0gY2FsbC0+Y291bnQ7IGxvb3AgPiAwOyBsb29wLS0sIGNiKyspIHsKKwkJCWNiLT52ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCQkJY2ItPmV4cGlyeQk9IG50b2hsKCpicCsrKTsKKwkJCWNiLT50eXBlCT0gbnRvaGwoKmJwKyspOworCQl9CisKKwllbXB0eV9jYl9hcnJheToKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSA1OgorCQlfZGVidWcoInRyYWlsZXIiKTsKKwkJaWYgKHNrYi0+bGVuICE9IDApCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWJyZWFrOworCX0KKworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCisJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLworCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlpZiAoIXNlcnZlcikKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwljYWxsLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKwlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX0NhbGxCYWNrKTsKKwlzY2hlZHVsZV93b3JrKCZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKK30KIAotfSAvKiBlbmQgYWZzY21fbmV3X2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogcXVldWUgb24gdGhlIGthZnNjbWQgcXVldWUgZm9yIGF0dGVudGlvbgorICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gcmVxdWVzdCBjYWxsYmFjayBzdGF0ZSAocmUtKWluaXRpYWxpc2F0aW9uCiAgKi8KLXN0YXRpYyB2b2lkIGFmc2NtX2F0dGVudGlvbihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIFNSWEFGU0NCX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlfZW50ZXIoIiVwe2NpZD0ldSB1PSVkfSIsCi0JICAgICAgIGNhbGwsIG50b2hsKGNhbGwtPmNhbGxfaWQpLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKIAotCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisJX2VudGVyKCJ7JXB9IiwgY2FsbC0+c2VydmVyKTsKIAotCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5hcHBfYXR0bl9saW5rKSkgewotCQlsaXN0X2FkZF90YWlsKCZjYWxsLT5hcHBfYXR0bl9saW5rLCAma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCX0KKwlhZnNfaW5pdF9jYWxsYmFja19zdGF0ZShjYWxsLT5zZXJ2ZXIpOworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOworCV9sZWF2ZSgiIik7Cit9CiAKLQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0KLQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiB7dT0lZH0iLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKLX0gLyogZW5kIGFmc2NtX2F0dGVudGlvbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBoYW5kbGUgbXkgY2FsbCBiZWluZyBhYm9ydGVkCi0gKiAtIGNsZWFuIHVwLCBkZXF1ZXVlIGFuZCBwdXQgbXkgcmVmIHRvIHRoZSBjYWxsCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkluaXRDYWxsQmFja1N0YXRlIGNhbGwKICAqLwotc3RhdGljIHZvaWQgYWZzY21fZXJyb3Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2luaXRfY2FsbF9iYWNrX3N0YXRlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgICBib29sIGxhc3QpCiB7Ci0JaW50IHJlbW92ZWQ7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOwogCi0JX2VudGVyKCIlcHtlc3Q9JXMgYWM9JXUgZXI9JWR9IiwKLQkgICAgICAgY2FsbCwKLQkgICAgICAgcnhycGNfY2FsbF9lcnJvcl9zdGF0ZXNbY2FsbC0+YXBwX2Vycl9zdGF0ZV0sCi0JICAgICAgIGNhbGwtPmFwcF9hYm9ydF9jb2RlLAotCSAgICAgICBjYWxsLT5hcHBfZXJybm8pOworCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CiAKLQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCWlmIChza2ItPmxlbiA+IDApCisJCXJldHVybiAtRUJBRE1TRzsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOwogCi0JaWYgKGxpc3RfZW1wdHkoJmNhbGwtPmFwcF9hdHRuX2xpbmspKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFwcF9hdHRuX2xpbmssICZrYWZzY21kX2F0dGVudGlvbl9saXN0KTsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7CisKKwkvKiB3ZSdsbCBuZWVkIHRoZSBmaWxlIHNlcnZlciByZWNvcmQgYXMgdGhhdCB0ZWxscyB1cyB3aGljaCBzZXQgb2YKKwkgKiB2bm9kZXMgdG8gb3BlcmF0ZSB1cG9uICovCisJbWVtY3B5KCZhZGRyLCAmaXBfaGRyKHNrYiktPnNhZGRyLCA0KTsKKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJmFkZHIpOworCWlmICghc2VydmVyKQorCQlyZXR1cm4gLUVOT1RDT05OOworCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKKworCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfSW5pdENhbGxCYWNrU3RhdGUpOworCXNjaGVkdWxlX3dvcmsoJmNhbGwtPndvcmspOworCXJldHVybiAwOworfQorCisvKgorICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Jbml0Q2FsbEJhY2tTdGF0ZTMgY2FsbAorICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2luaXRfY2FsbF9iYWNrX3N0YXRlMyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKworCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CisKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7CisKKwkvKiB3ZSdsbCBuZWVkIHRoZSBmaWxlIHNlcnZlciByZWNvcmQgYXMgdGhhdCB0ZWxscyB1cyB3aGljaCBzZXQgb2YKKwkgKiB2bm9kZXMgdG8gb3BlcmF0ZSB1cG9uICovCisJbWVtY3B5KCZhZGRyLCAmaXBfaGRyKHNrYiktPnNhZGRyLCA0KTsKKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJmFkZHIpOworCWlmICghc2VydmVyKQorCQlyZXR1cm4gLUVOT1RDT05OOworCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKKworCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfSW5pdENhbGxCYWNrU3RhdGUpOworCXNjaGVkdWxlX3dvcmsoJmNhbGwtPndvcmspOworCXJldHVybiAwOworfQorCisvKgorICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gc2VlIGlmIHRoZSBjYWNoZSBtYW5hZ2VyIGlzIHN0aWxsIGFsaXZlCisgKi8KK3N0YXRpYyB2b2lkIFNSWEFGU0NCX1Byb2JlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKKworCV9lbnRlcigiIik7CisJYWZzX3NlbmRfZW1wdHlfcmVwbHkoY2FsbCk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmUgY2FsbAorICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlib29sIGxhc3QpCit7CisJX2VudGVyKCIseyV1fSwlZCIsIHNrYi0+bGVuLCBsYXN0KTsKKworCWlmIChza2ItPmxlbiA+IDApCisJCXJldHVybiAtRUJBRE1TRzsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7CisKKwlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX1Byb2JlKTsKKwlzY2hlZHVsZV93b3JrKCZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIGFzayBhYm91dCB0aGUgY2FjaGUgbWFuYWdlcidzIGNhcGFiaWxpdGllcworICovCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9HZXRDYXBhYmlsaXRpZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfaW50ZXJmYWNlICppZnM7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CisJaW50IGxvb3AsIG5pZnM7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgLyogSW50ZXJmYWNlQWRkciAqLyB7CisJCQlfX2JlMzIgbmlmczsKKwkJCV9fYmUzMiB1dWlkWzExXTsKKwkJCV9fYmUzMiBpZmFkZHJbMzJdOworCQkJX19iZTMyIG5ldG1hc2tbMzJdOworCQkJX19iZTMyIG10dVszMl07CisJCX0gaWE7CisJCXN0cnVjdCAvKiBDYXBhYmlsaXRpZXMgKi8geworCQkJX19iZTMyIGNhcGNvdW50OworCQkJX19iZTMyIGNhcHNbMV07CisJCX0gY2FwOworCX0gcmVwbHk7CisKKwlfZW50ZXIoIiIpOworCisJbmlmcyA9IDA7CisJaWZzID0ga2NhbGxvYygzMiwgc2l6ZW9mKCppZnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWZzKSB7CisJCW5pZnMgPSBhZnNfZ2V0X2lwdjRfaW50ZXJmYWNlcyhpZnMsIDMyLCBmYWxzZSk7CisJCWlmIChuaWZzIDwgMCkgeworCQkJa2ZyZWUoaWZzKTsKKwkJCWlmcyA9IE5VTEw7CisJCQluaWZzID0gMDsKKwkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKwltZW1zZXQoJnJlcGx5LCAwLCBzaXplb2YocmVwbHkpKTsKKwlyZXBseS5pYS5uaWZzID0gaHRvbmwobmlmcyk7CiAKLQlyZW1vdmVkID0gMDsKLQlzcGluX2xvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX2xpbmspKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKLQkJcmVtb3ZlZCA9IDE7CisJcmVwbHkuaWEudXVpZFswXSA9IGh0b25sKGFmc191dWlkLnRpbWVfbG93KTsKKwlyZXBseS5pYS51dWlkWzFdID0gaHRvbmwoYWZzX3V1aWQudGltZV9taWQpOworCXJlcGx5LmlhLnV1aWRbMl0gPSBodG9ubChhZnNfdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uKTsKKwlyZXBseS5pYS51dWlkWzNdID0gaHRvbmwoKHM4KSBhZnNfdXVpZC5jbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkKTsKKwlyZXBseS5pYS51dWlkWzRdID0gaHRvbmwoKHM4KSBhZnNfdXVpZC5jbG9ja19zZXFfbG93KTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjsgbG9vcCsrKQorCQlyZXBseS5pYS51dWlkW2xvb3AgKyA1XSA9IGh0b25sKChzOCkgYWZzX3V1aWQubm9kZVtsb29wXSk7CisKKwlpZiAoaWZzKSB7CisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuaWZzOyBsb29wKyspIHsKKwkJCXJlcGx5LmlhLmlmYWRkcltsb29wXSA9IGlmc1tsb29wXS5hZGRyZXNzLnNfYWRkcjsKKwkJCXJlcGx5LmlhLm5ldG1hc2tbbG9vcF0gPSBpZnNbbG9vcF0ubmV0bWFzay5zX2FkZHI7CisJCQlyZXBseS5pYS5tdHVbbG9vcF0gPSBodG9ubChpZnNbbG9vcF0ubXR1KTsKKwkJfQogCX0KLQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CiAKLQlpZiAocmVtb3ZlZCkKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0KLQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisJcmVwbHkuY2FwLmNhcGNvdW50ID0gaHRvbmwoMSk7CisJcmVwbHkuY2FwLmNhcHNbMF0gPSBodG9ubChBRlNfQ0FQX0VSUk9SX1RSQU5TTEFUSU9OKTsKKwlhZnNfc2VuZF9zaW1wbGVfcmVwbHkoY2FsbCwgJnJlcGx5LCBzaXplb2YocmVwbHkpKTsKIAogCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNjbV9lcnJvcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBtYXAgYWZzIGFib3J0IGNvZGVzIHRvL2Zyb20gTGludXggZXJyb3IgY29kZXMKLSAqIC0gY2FsbGVkIHdpdGggY2FsbC0+bG9jayBoZWxkCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkdldENhcGFiaWxpdGllcyBjYWxsCiAgKi8KLXN0YXRpYyB2b2lkIGFmc2NtX2FlbWFwKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9nZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQogewotCXN3aXRjaCAoY2FsbC0+YXBwX2Vycl9zdGF0ZSkgewotCWNhc2UgUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JUOgotCQljYWxsLT5hcHBfYWJvcnRfY29kZSA9IC1jYWxsLT5hcHBfZXJybm87Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQ6Ci0JCWNhbGwtPmFwcF9lcnJubyA9IC1FQ09OTkFCT1JURUQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0gLyogZW5kIGFmc2NtX2FlbWFwKCkgKi8KKwlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RhcnQgdGhlIGNhY2hlIG1hbmFnZXIgc2VydmljZSBpZiBub3QgYWxyZWFkeSBzdGFydGVkCi0gKi8KLWludCBhZnNjbV9zdGFydCh2b2lkKQotewotCWludCByZXQ7CisJaWYgKHNrYi0+bGVuID4gMCkKKwkJcmV0dXJuIC1FQkFETVNHOworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CiAKLQlkb3duX3dyaXRlKCZhZnNjbV9zZW0pOwotCWlmICghYWZzY21fdXNhZ2UpIHsKLQkJcmV0ID0ga2VybmVsX3RocmVhZChrYWZzY21kLCBOVUxMLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKKwkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzY21kX2FsaXZlKTsKLQotCQlyZXQgPSByeHJwY19hZGRfc2VydmljZShhZnNfdHJhbnNwb3J0LCAmQUZTQ01fc2VydmljZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBraWxsOwotCi0JCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLAotCQkJCQlhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7Ci0JfQotCi0JYWZzY21fdXNhZ2UrKzsKLQl1cF93cml0ZSgmYWZzY21fc2VtKTsKLQorCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfR2V0Q2FwYWJpbGl0aWVzKTsKKwlzY2hlZHVsZV93b3JrKCZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKLQotIGtpbGw6Ci0Ja2Fmc2NtZF9kaWUgPSAxOwotCXdha2VfdXAoJmthZnNjbWRfc2xlZXBxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzY21kX2RlYWQpOwotCi0gb3V0OgotCXVwX3dyaXRlKCZhZnNjbV9zZW0pOwotCXJldHVybiByZXQ7Ci0KLX0gLyogZW5kIGFmc2NtX3N0YXJ0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0b3AgdGhlIGNhY2hlIG1hbmFnZXIgc2VydmljZQotICovCi12b2lkIGFmc2NtX3N0b3Aodm9pZCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQotCWRvd25fd3JpdGUoJmFmc2NtX3NlbSk7Ci0KLQlCVUdfT04oYWZzY21fdXNhZ2UgPT0gMCk7Ci0JYWZzY21fdXNhZ2UtLTsKLQotCWlmIChhZnNjbV91c2FnZSA9PSAwKSB7Ci0JCS8qIGRvbid0IHdhbnQgbW9yZSBpbmNvbWluZyBjYWxscyAqLwotCQlyeHJwY19kZWxfc2VydmljZShhZnNfdHJhbnNwb3J0LCAmQUZTQ01fc2VydmljZSk7Ci0KLQkJLyogYWJvcnQgYW55IGNhbGxzIEkndmUgc3RpbGwgZ290IG9wZW4gKHRoZSBhZnNjbV9lcnJvcigpIHdpbGwKLQkJICogZGVxdWV1ZSB0aGVtKSAqLwotCQlzcGluX2xvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmFmc2NtX2NhbGxzKSkgewotCQkJY2FsbCA9IGxpc3RfZW50cnkoYWZzY21fY2FsbHMubmV4dCwKLQkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKLQkJCQkJICBhcHBfbGluayk7Ci0KLQkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQkJc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCi0JCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FU1JDSCk7IC8qIGFib3J0LCBkZXF1ZXVlIGFuZAotCQkJCQkJCSAqIHB1dCAqLwotCi0JCQlfZGVidWcoIm51a2luZyBhY3RpdmUgY2FsbCAlMDh4LiVkIiwKLQkJCSAgICAgICBudG9obChjYWxsLT5jb25uLT5jb25uX2lkKSwKLQkJCSAgICAgICBudG9obChjYWxsLT5jYWxsX2lkKSk7Ci0JCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCi0JCQlzcGluX2xvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQotCQkvKiBnZXQgcmlkIG9mIG15IGRhZW1vbiAqLwotCQlrYWZzY21kX2RpZSA9IDE7Ci0JCXdha2VfdXAoJmthZnNjbWRfc2xlZXBxKTsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2NtZF9kZWFkKTsKLQotCQkvKiBkaXNwb3NlIG9mIGFueSBjYWxscyB3YWl0aW5nIGZvciBhdHRlbnRpb24gKi8KLQkJc3Bpbl9sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZrYWZzY21kX2F0dGVudGlvbl9saXN0KSkgewotCQkJY2FsbCA9IGxpc3RfZW50cnkoa2Fmc2NtZF9hdHRlbnRpb25fbGlzdC5uZXh0LAotCQkJCQkgIHN0cnVjdCByeHJwY19jYWxsLAotCQkJCQkgIGFwcF9hdHRuX2xpbmspOwotCi0JCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfYXR0bl9saW5rKTsKLQkJCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKLQotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0KLQkJCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOwotCi0JCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyKTsKLQl9Ci0KLQl1cF93cml0ZSgmYWZzY21fc2VtKTsKLQotfSAvKiBlbmQgYWZzY21fc3RvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgdGhlIGZpbGVzZXJ2ZXIgYnJlYWtpbmcgYSBzZXQgb2YgY2FsbGJhY2tzCi0gKi8KLXN0YXRpYyB2b2lkIF9TUlhBRlNDTV9DYWxsQmFjayhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXNpemVfdCBjb3VudCwgcXR5LCB0bXA7Ci0JaW50IHJldCA9IDAsIHJlbW92ZWQ7Ci0KLQlfZW50ZXIoIiVwe2Fjcz0lc30iLCBjYWxsLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0pOwotCi0Jc2VydmVyID0gYWZzX3NlcnZlcl9nZXRfZnJvbV9wZWVyKGNhbGwtPmNvbm4tPnBlZXIpOwotCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCQkvKiB3ZSd2ZSByZWNlaXZlZCB0aGUgbGFzdCBwYWNrZXQKLQkJICogLSBkcmFpbiBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgY2FsbCBhbmQgc2VuZCB0aGUgcmVwbHkKLQkJICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKLQkJcmV0ID0gLUVCQURNU0c7Ci0JCXF0eSA9IGNhbGwtPmFwcF9yZWFkeV9xdHk7Ci0JCWlmIChxdHkgPCA4IHx8IHF0eSA+IDUwICogKDYgKiA0KSArIDgpCi0JCQlicmVhazsKLQotCQl7Ci0JCQlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYiwgKnBjYjsKLQkJCWludCBsb29wOwotCQkJX19iZTMyICpmcCwgKmJwOwotCi0JCQlmcCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCBxdHkpOwotCi0JCQkvKiBkcmFnIHRoZSBlbnRpcmUgYXJndW1lbnQgYmxvY2sgb3V0IHRvIHRoZSBzY3JhdGNoCi0JCQkgKiBzcGFjZSAqLwotCQkJcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgZnAsIHF0eSwgMCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlicmVhazsKLQotCQkJLyogYW5kIHVubWFyc2hhbGwgdGhlIHBhcmFtZXRlciBibG9jayAqLwotCQkJcmV0ID0gLUVCQURNU0c7Ci0JCQljb3VudCA9IG50b2hsKCpmcCsrKTsKLQkJCWlmIChjb3VudD5BRlNDQk1BWCB8fAotCQkJICAgIChjb3VudCAqICgzICogNCkgKyA4ICE9IHF0eSAmJgotCQkJICAgICBjb3VudCAqICg2ICogNCkgKyA4ICE9IHF0eSkpCi0JCQkJYnJlYWs7Ci0KLQkJCWJwID0gZnAgKyBjb3VudCozOwotCQkJdG1wID0gbnRvaGwoKmJwKyspOwotCQkJaWYgKHRtcCA+IDAgJiYgdG1wICE9IGNvdW50KQotCQkJCWJyZWFrOwotCQkJaWYgKHRtcCA9PSAwKQotCQkJCWJwID0gTlVMTDsKLQotCQkJcGNiID0gY2IgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2hfcygKLQkJCQljYWxsLCBzdHJ1Y3QgYWZzX2NhbGxiYWNrKTsKLQotCQkJZm9yIChsb29wID0gY291bnQgLSAxOyBsb29wID49IDA7IGxvb3AtLSkgewotCQkJCXBjYi0+ZmlkLnZpZAk9IG50b2hsKCpmcCsrKTsKLQkJCQlwY2ItPmZpZC52bm9kZQk9IG50b2hsKCpmcCsrKTsKLQkJCQlwY2ItPmZpZC51bmlxdWUJPSBudG9obCgqZnArKyk7Ci0JCQkJaWYgKGJwKSB7Ci0JCQkJCXBjYi0+dmVyc2lvbgk9IG50b2hsKCpicCsrKTsKLQkJCQkJcGNiLT5leHBpcnkJPSBudG9obCgqYnArKyk7Ci0JCQkJCXBjYi0+dHlwZQk9IG50b2hsKCpicCsrKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBjYi0+dmVyc2lvbgk9IDA7Ci0JCQkJCXBjYi0+ZXhwaXJ5CT0gMDsKLQkJCQkJcGNiLT50eXBlCT0gQUZTQ01fQ0JfVU5UWVBFRDsKLQkJCQl9Ci0JCQkJcGNiKys7Ci0JCQl9Ci0KLQkJCS8qIGludm9rZSB0aGUgYWN0dWFsIHNlcnZpY2Ugcm91dGluZSAqLwotCQkJcmV0ID0gU1JYQUZTQ01fQ2FsbEJhY2soc2VydmVyLCBjb3VudCwgY2IpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBzZW5kIHRoZSByZXBseSAqLwotCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCi0JCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKLQkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOwotCQlyZW1vdmVkID0gMDsKLQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKLQkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKLQkJCXJlbW92ZWQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQotCQlpZiAocmVtb3ZlZCkKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQotfSAvKiBlbmQgX1NSWEFGU0NNX0NhbGxCYWNrKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGhhbmRsZSB0aGUgZmlsZXNlcnZlciBhc2tpbmcgdXMgdG8gaW5pdGlhbGlzZSBvdXIgY2FsbGJhY2sgc3RhdGUKLSAqLwotc3RhdGljIHZvaWQgX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc2l6ZV90IGNvdW50OwotCWludCByZXQgPSAwLCByZW1vdmVkOwotCi0JX2VudGVyKCIlcHthY3M9JXN9IiwgY2FsbCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQotCXNlcnZlciA9IGFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihjYWxsLT5jb25uLT5wZWVyKTsKLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQkJLyogd2UndmUgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0IC0gZHJhaW4gYWxsIHRoZSBkYXRhIGZyb20gdGhlCi0JCSAqIGNhbGwgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTOgotCQkvKiBzaG91bGRuJ3QgYmUgYW55IGFyZ3MgKi8KLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWJyZWFrOwotCi0JCS8qIHNlbmQgdGhlIHJlcGx5IHdoZW4gYXNrZWQgZm9yIGl0ICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9TTkRfUkVQTFk6Ci0JCS8qIGludm9rZSB0aGUgYWN0dWFsIHNlcnZpY2Ugcm91dGluZSAqLwotCQlyZXQgPSBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzZXJ2ZXIpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAwLCBOVUxMLCBSWFJQQ19MQVNUX1BBQ0tFVCwKLQkJCQkJICAgIEdGUF9LRVJORUwsIDAsICZjb3VudCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7Ci0JCWJyZWFrOwotCi0JCS8qIG9wZXJhdGlvbiBjb21wbGV0ZSAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgotCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7Ci0JCXJlbW92ZWQgPSAwOwotCQlzcGluX2xvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9saW5rKSkgewotCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2xpbmspOwotCQkJcmVtb3ZlZCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCi0JCWlmIChyZW1vdmVkKQotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCWJyZWFrOwotCi0JCS8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIG9uIGVycm9yICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCWNhbGwtPmFwcF91c2VyID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCi0JYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCi19IC8qIGVuZCBfU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaGFuZGxlIGEgcHJvYmUgZnJvbSBhIGZpbGVzZXJ2ZXIKLSAqLwotc3RhdGljIHZvaWQgX1NSWEFGU0NNX1Byb2JlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc2l6ZV90IGNvdW50OwotCWludCByZXQgPSAwLCByZW1vdmVkOwotCi0JX2VudGVyKCIlcHthY3M9JXN9IiwgY2FsbCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQotCXNlcnZlciA9IGFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihjYWxsLT5jb25uLT5wZWVyKTsKLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQkJLyogd2UndmUgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0IC0gZHJhaW4gYWxsIHRoZSBkYXRhIGZyb20gdGhlCi0JCSAqIGNhbGwgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTOgotCQkvKiBzaG91bGRuJ3QgYmUgYW55IGFyZ3MgKi8KLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWJyZWFrOwotCi0JCS8qIHNlbmQgdGhlIHJlcGx5IHdoZW4gYXNrZWQgZm9yIGl0ICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9TTkRfUkVQTFk6Ci0JCS8qIGludm9rZSB0aGUgYWN0dWFsIHNlcnZpY2Ugcm91dGluZSAqLwotCQlyZXQgPSBTUlhBRlNDTV9Qcm9iZShzZXJ2ZXIpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAwLCBOVUxMLCBSWFJQQ19MQVNUX1BBQ0tFVCwKLQkJCQkJICAgIEdGUF9LRVJORUwsIDAsICZjb3VudCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7Ci0JCWJyZWFrOwotCi0JCS8qIG9wZXJhdGlvbiBjb21wbGV0ZSAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgotCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7Ci0JCXJlbW92ZWQgPSAwOwotCQlzcGluX2xvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9saW5rKSkgewotCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2xpbmspOwotCQkJcmVtb3ZlZCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOwotCi0JCWlmIChyZW1vdmVkKQotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCWJyZWFrOwotCi0JCS8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIG9uIGVycm9yICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCWNhbGwtPmFwcF91c2VyID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCi0JYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCi19IC8qIGVuZCBfU1JYQUZTQ01fUHJvYmUoKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Ntc2VydmljZS5oIGIvZnMvYWZzL2Ntc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhkNGQ2Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9jbXNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIGNtc2VydmljZS5oOiBBRlMgQ2FjaGUgTWFuYWdlciBTZXJ2aWNlIGRlY2xhcmF0aW9ucwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19DTVNFUlZJQ0VfSAotCi0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSAidHlwZXMuaCIKLQotLyogY2FjaGUgbWFuYWdlciBzdGFydC9zdG9wICovCi1leHRlcm4gaW50IGFmc2NtX3N0YXJ0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYWZzY21fc3RvcCh2b2lkKTsKLQotLyogY2FjaGUgbWFuYWdlciBzZXJ2ZXIgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpOwotZXh0ZXJuIGludCBTUlhBRlNDTV9DYWxsQmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJICAgICBzaXplX3QgY291bnQsCi0JCQkgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgY2FsbGJhY2tzW10pOwotZXh0ZXJuIGludCBTUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwppbmRleCBiNmRjMmViLi5kYWM1Yjk5IDEwMDY0NAotLS0gYS9mcy9hZnMvZGlyLmMKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC0xNSw0NSArMTUsNTMgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlICJ2bm9kZS5oIgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19kaXJfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiBzdGF0aWMgaW50IGFmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGFmc19kaXJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CitzdGF0aWMgaW50IGFmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKIHN0YXRpYyBpbnQgYWZzX2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIHN0YXRpYyBpbnQgYWZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7Ci1zdGF0aWMgaW50IGFmc19kaXJfbG9va3VwX2ZpbGxkaXIodm9pZCAqX2Nvb2tpZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgdm9pZCBhZnNfZF9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitzdGF0aWMgaW50IGFmc19sb29rdXBfZmlsbGRpcih2b2lkICpfY29va2llLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmxlbiwKIAkJCQkgIGxvZmZfdCBmcG9zLCB1NjQgaW5vLCB1bnNpZ25lZCBkdHlwZSk7CitzdGF0aWMgaW50IGFmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgYWZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgYWZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworc3RhdGljIGludCBhZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworc3RhdGljIGludCBhZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpmcm9tLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitzdGF0aWMgaW50IGFmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBjb25zdCBjaGFyICpjb250ZW50KTsKK3N0YXRpYyBpbnQgYWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX2Rpcl9maWxlX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gYWZzX2Rpcl9vcGVuLAotCS5yZWFkZGlyCT0gYWZzX2Rpcl9yZWFkZGlyLAorCS5yZWxlYXNlCT0gYWZzX3JlbGVhc2UsCisJLnJlYWRkaXIJPSBhZnNfcmVhZGRpciwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKLQkubG9va3VwCQk9IGFmc19kaXJfbG9va3VwLAorCS5jcmVhdGUJCT0gYWZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGFmc19sb29rdXAsCisJLmxpbmsJCT0gYWZzX2xpbmssCisJLnVubGluawkJPSBhZnNfdW5saW5rLAorCS5zeW1saW5rCT0gYWZzX3N5bWxpbmssCisJLm1rZGlyCQk9IGFmc19ta2RpciwKKwkucm1kaXIJCT0gYWZzX3JtZGlyLAorCS5yZW5hbWUJCT0gYWZzX3JlbmFtZSwKKwkucGVybWlzc2lvbgk9IGFmc19wZXJtaXNzaW9uLAogCS5nZXRhdHRyCT0gYWZzX2lub2RlX2dldGF0dHIsCi0jaWYgMCAvKiBUT0RPICovCi0JLmNyZWF0ZQkJPSBhZnNfZGlyX2NyZWF0ZSwKLQkubGluawkJPSBhZnNfZGlyX2xpbmssCi0JLnVubGluawkJPSBhZnNfZGlyX3VubGluaywKLQkuc3ltbGluawk9IGFmc19kaXJfc3ltbGluaywKLQkubWtkaXIJCT0gYWZzX2Rpcl9ta2RpciwKLQkucm1kaXIJCT0gYWZzX2Rpcl9ybWRpciwKLQkubWtub2QJCT0gYWZzX2Rpcl9ta25vZCwKLQkucmVuYW1lCQk9IGFmc19kaXJfcmVuYW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFmc19mc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKIAkuZF9yZXZhbGlkYXRlCT0gYWZzX2RfcmV2YWxpZGF0ZSwKIAkuZF9kZWxldGUJPSBhZnNfZF9kZWxldGUsCisJLmRfcmVsZWFzZQk9IGFmc19kX3JlbGVhc2UsCiB9OwogCiAjZGVmaW5lIEFGU19ESVJfSEFTSFRCTF9TSVpFCTEyOApAQCAtMTA1LDE0ICsxMTMsMTMgQEAKIAl1bmlvbiBhZnNfZGlyX2Jsb2NrIGJsb2Nrc1tQQUdFX1NJWkUgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayldOwogfTsKIAotc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSB7CitzdHJ1Y3QgYWZzX2xvb2t1cF9jb29raWUgewogCXN0cnVjdCBhZnNfZmlkCWZpZDsKIAljb25zdCBjaGFyCSpuYW1lOwogCXNpemVfdAkJbmxlbjsKIAlpbnQJCWZvdW5kOwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgcGFnZSBpcyB2YWxpZAogICovCkBAIC0xMjgsOSArMTM1LDEwIEBACiAJaWYgKHF0eSA9PSAwKQogCQlnb3RvIGVycm9yOwogCi0JaWYgKHBhZ2UtPmluZGV4PT0wICYmIHF0eSE9bnRvaHMoZGJ1Zi0+YmxvY2tzWzBdLnBhZ2VoZHIubnBhZ2VzKSkgeworCWlmIChwYWdlLT5pbmRleCA9PSAwICYmIHF0eSAhPSBudG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKSB7CiAJCXByaW50aygia0FGUzogJXMoJWx1KTogd3JvbmcgbnVtYmVyIG9mIGRpciBibG9ja3MgJWQhPSVodVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyxkaXItPmlfaW5vLHF0eSxudG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKTsKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZGlyLT5pX2lubywgcXR5LAorCQkgICAgICAgbnRvaHMoZGJ1Zi0+YmxvY2tzWzBdLnBhZ2VoZHIubnBhZ2VzKSk7CiAJCWdvdG8gZXJyb3I7CiAJfQogI2VuZGlmCkBAIC0xNTcsMTMgKzE2NSwxMSBAQAogCVNldFBhZ2VDaGVja2VkKHBhZ2UpOwogCXJldHVybjsKIAotIGVycm9yOgorZXJyb3I6CiAJU2V0UGFnZUNoZWNrZWQocGFnZSk7CiAJU2V0UGFnZUVycm9yKHBhZ2UpOworfQogCi19IC8qIGVuZCBhZnNfZGlyX2NoZWNrX3BhZ2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGlzY2FyZCBhIHBhZ2UgY2FjaGVkIGluIHRoZSBwYWdlY2FjaGUKICAqLwpAQCAtMTcxLDIwICsxNzcsMjIgQEAKIHsKIAlrdW5tYXAocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQogCi19IC8qIGVuZCBhZnNfZGlyX3B1dF9wYWdlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGdldCBhIHBhZ2UgaW50byB0aGUgcGFnZWNhY2hlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWZzX2Rpcl9nZXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgbG9uZyBpbmRleCkKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqYWZzX2Rpcl9nZXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgbG9uZyBpbmRleCwKKwkJCQkgICAgIHN0cnVjdCBrZXkgKmtleSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgZmlsZSBmaWxlID0geworCQkucHJpdmF0ZV9kYXRhID0ga2V5LAorCX07CiAKIAlfZW50ZXIoInslbHV9LCVsdSIsIGRpci0+aV9pbm8sIGluZGV4KTsKIAotCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShkaXItPmlfbWFwcGluZywgaW5kZXgsIE5VTEwpOworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShkaXItPmlfbWFwcGluZywgaW5kZXgsICZmaWxlKTsKIAlpZiAoIUlTX0VSUihwYWdlKSkgewogCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwogCQlrbWFwKHBhZ2UpOwpAQCAtMTk3LDEyICsyMDUsMTIgQEAKIAl9CiAJcmV0dXJuIHBhZ2U7CiAKLSBmYWlsOgorZmFpbDoKIAlhZnNfZGlyX3B1dF9wYWdlKHBhZ2UpOworCV9sZWF2ZSgiID0gLUVJTyIpOwogCXJldHVybiBFUlJfUFRSKC1FSU8pOwotfSAvKiBlbmQgYWZzX2Rpcl9nZXRfcGFnZSgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBvcGVuIGFuIEFGUyBkaXJlY3RvcnkgZmlsZQogICovCkBAIC0yMTMsMTUgKzIyMSwxMiBAQAogCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7CiAJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CiAKLQlpZiAoQUZTX0ZTX0koaW5vZGUpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKQorCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJkFGU19GU19JKGlub2RlKS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCV9sZWF2ZSgiID0gMCIpOwotCXJldHVybiAwOworCXJldHVybiBhZnNfb3Blbihpbm9kZSwgZmlsZSk7Cit9CiAKLX0gLyogZW5kIGFmc19kaXJfb3BlbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkZWFsIHdpdGggb25lIGJsb2NrIGluIGFuIEFGUyBkaXJlY3RvcnkKICAqLwpAQCAtMjUwLDcgKzI1NSw3IEBACiAJCS8qIHNraXAgZW50cmllcyBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAgKi8KIAkJaWYgKCEoYmxvY2stPnBhZ2VoZHIuYml0bWFwW29mZnNldCAvIDhdICYKIAkJICAgICAgKDEgPDwgKG9mZnNldCAlIDgpKSkpIHsKLQkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IHVudXNlZFxuIiwKKwkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IHVudXNlZCIsCiAJCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLCBvZmZzZXQpOwogCQkJaWYgKG9mZnNldCA+PSBjdXJyKQogCQkJCSpmcG9zID0gYmxrb2ZmICsKQEAgLTI2NCw3ICsyNjksNyBAQAogCQkJICAgICAgIHNpemVvZigqYmxvY2spIC0KIAkJCSAgICAgICBvZmZzZXQgKiBzaXplb2YodW5pb24gYWZzX2RpcmVudCkpOwogCi0JCV9kZWJ1ZygiRU5UWyVadS4ldV06ICVzICVadSBcIiVzXCJcbiIsCisJCV9kZWJ1ZygiRU5UWyVadS4ldV06ICVzICVadSBcIiVzXCIiLAogCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLCBvZmZzZXQsCiAJCSAgICAgICAob2Zmc2V0IDwgY3VyciA/ICJza2lwIiA6ICJmaWxsIiksCiAJCSAgICAgICBubGVuLCBkaXJlLT51Lm5hbWUpOwpAQCAtMjc0LDcgKzI3OSw3IEBACiAJCQlpZiAobmV4dCA+PSBBRlNfRElSRU5UX1BFUl9CTE9DSykgewogCQkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IgogCQkJCSAgICAgICAiICV1IHRyYXZlbGxlZCBiZXlvbmQgZW5kIGRpciBibG9jayIKLQkJCQkgICAgICAgIiAobGVuICV1LyVadSlcbiIsCisJCQkJICAgICAgICIgKGxlbiAldS8lWnUpIiwKIAkJCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLAogCQkJCSAgICAgICBvZmZzZXQsIG5leHQsIHRtcCwgbmxlbik7CiAJCQkJcmV0dXJuIC1FSU87CkBAIC0yODIsMTMgKzI4NywxMyBAQAogCQkJaWYgKCEoYmxvY2stPnBhZ2VoZHIuYml0bWFwW25leHQgLyA4XSAmCiAJCQkgICAgICAoMSA8PCAobmV4dCAlIDgpKSkpIHsKIAkJCQlfZGVidWcoIkVOVFslWnUuJXVdOiIKLQkJCQkgICAgICAgIiAldSB1bm1hcmtlZCBleHRlbnNpb24gKGxlbiAldS8lWnUpXG4iLAorCQkJCSAgICAgICAiICV1IHVubWFya2VkIGV4dGVuc2lvbiAobGVuICV1LyVadSkiLAogCQkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCiAJCQkJICAgICAgIG9mZnNldCwgbmV4dCwgdG1wLCBubGVuKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAotCQkJX2RlYnVnKCJFTlRbJVp1LiV1XTogZXh0ICV1LyVadVxuIiwKKwkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IGV4dCAldS8lWnUiLAogCQkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwKIAkJCSAgICAgICBuZXh0LCB0bXAsIG5sZW4pOwogCQkJbmV4dCsrOwpAQCAtMzA0LDcgKzMwOSw3IEBACiAJCQkgICAgICBubGVuLAogCQkJICAgICAgYmxrb2ZmICsgb2Zmc2V0ICogc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpLAogCQkJICAgICAgbnRvaGwoZGlyZS0+dS52bm9kZSksCi0JCQkgICAgICBmaWxsZGlyID09IGFmc19kaXJfbG9va3VwX2ZpbGxkaXIgPworCQkJICAgICAgZmlsbGRpciA9PSBhZnNfbG9va3VwX2ZpbGxkaXIgPwogCQkJICAgICAgbnRvaGwoZGlyZS0+dS51bmlxdWUpIDogRFRfVU5LTk9XTik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlfbGVhdmUoIiA9IDAgW2Z1bGxdIik7CkBAIC0zMTYsMTYgKzMyMSwxNSBAQAogCiAJX2xlYXZlKCIgPSAxIFttb3JlXSIpOwogCXJldHVybiAxOwotfSAvKiBlbmQgYWZzX2Rpcl9pdGVyYXRlX2Jsb2NrKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHJlYWQgYW4gQUZTIGRpcmVjdG9yeQorICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBkYXRhIGJsb2IgdGhhdCBsaXN0cyB0aGUgY29udGVudHMgb2YgYW4gQUZTIGRpcmVjdG9yeQogICovCiBzdGF0aWMgaW50IGFmc19kaXJfaXRlcmF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgKmZwb3MsIHZvaWQgKmNvb2tpZSwKLQkJCSAgIGZpbGxkaXJfdCBmaWxsZGlyKQorCQkJICAgZmlsbGRpcl90IGZpbGxkaXIsIHN0cnVjdCBrZXkgKmtleSkKIHsKLQl1bmlvbiBhZnNfZGlyX2Jsb2NrCSpkYmxvY2s7CisJdW5pb24gYWZzX2Rpcl9ibG9jayAqZGJsb2NrOwogCXN0cnVjdCBhZnNfZGlyX3BhZ2UgKmRidWY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgYmxrb2ZmLCBsaW1pdDsKQEAgLTMzMyw3ICszMzcsNyBAQAogCiAJX2VudGVyKCJ7JWx1fSwldSwsIiwgZGlyLT5pX2lubywgKmZwb3MpOwogCi0JaWYgKEFGU19GU19JKGRpciktPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpIHsKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZBRlNfRlNfSShkaXIpLT5mbGFncykpIHsKIAkJX2xlYXZlKCIgPSAtRVNUQUxFIik7CiAJCXJldHVybiAtRVNUQUxFOwogCX0KQEAgLTM0OCw3ICszNTIsNyBAQAogCQlibGtvZmYgPSAqZnBvcyAmIH4oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spIC0gMSk7CiAKIAkJLyogZmV0Y2ggdGhlIGFwcHJvcHJpYXRlIHBhZ2UgZnJvbSB0aGUgZGlyZWN0b3J5ICovCi0JCXBhZ2UgPSBhZnNfZGlyX2dldF9wYWdlKGRpciwgYmxrb2ZmIC8gUEFHRV9TSVpFKTsKKwkJcGFnZSA9IGFmc19kaXJfZ2V0X3BhZ2UoZGlyLCBibGtvZmYgLyBQQUdFX1NJWkUsIGtleSk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiAJCQlicmVhazsKQEAgLTM3Nyw0MyArMzgxLDUwIEBACiAJCXJldCA9IDA7CiAJfQogCi0gb3V0Ogorb3V0OgogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfZGlyX2l0ZXJhdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcmVhZCBhbiBBRlMgZGlyZWN0b3J5CiAgKi8KLXN0YXRpYyBpbnQgYWZzX2Rpcl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpjb29raWUsIGZpbGxkaXJfdCBmaWxsZGlyKQorc3RhdGljIGludCBhZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqY29va2llLCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAl1bnNpZ25lZCBmcG9zOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInslTGQseyVsdX19IiwgZmlsZS0+Zl9wb3MsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwlfZW50ZXIoInslTGQseyVsdX19IiwKKwkgICAgICAgZmlsZS0+Zl9wb3MsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKworCUFTU0VSVChmaWxlLT5wcml2YXRlX2RhdGEgIT0gTlVMTCk7CiAKIAlmcG9zID0gZmlsZS0+Zl9wb3M7Ci0JcmV0ID0gYWZzX2Rpcl9pdGVyYXRlKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICZmcG9zLCBjb29raWUsIGZpbGxkaXIpOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmZnBvcywKKwkJCSAgICAgIGNvb2tpZSwgZmlsbGRpciwgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAlmaWxlLT5mX3BvcyA9IGZwb3M7CiAKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2Rpcl9yZWFkZGlyKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciBhIG5hbWUKICAqIC0gaWYgYWZzX2Rpcl9pdGVyYXRlX2Jsb2NrKCkgc3BvdHMgdGhpcyBmdW5jdGlvbiwgaXQnbGwgcGFzcyB0aGUgRklECiAgKiAgIHVuaXF1aWZpZXIgdGhyb3VnaCBkdHlwZQogICovCi1zdGF0aWMgaW50IGFmc19kaXJfbG9va3VwX2ZpbGxkaXIodm9pZCAqX2Nvb2tpZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5sZW4sCi0JCQkJICBsb2ZmX3QgZnBvcywgdTY0IGlubywgdW5zaWduZWQgZHR5cGUpCitzdGF0aWMgaW50IGFmc19sb29rdXBfZmlsbGRpcih2b2lkICpfY29va2llLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmxlbiwKKwkJCSAgICAgIGxvZmZfdCBmcG9zLCB1NjQgaW5vLCB1bnNpZ25lZCBkdHlwZSkKIHsKLQlzdHJ1Y3QgYWZzX2Rpcl9sb29rdXBfY29va2llICpjb29raWUgPSBfY29va2llOworCXN0cnVjdCBhZnNfbG9va3VwX2Nvb2tpZSAqY29va2llID0gX2Nvb2tpZTsKIAotCV9lbnRlcigieyVzLCVadX0sJXMsJXUsLCVsdSwldSIsCi0JICAgICAgIGNvb2tpZS0+bmFtZSwgY29va2llLT5ubGVuLCBuYW1lLCBubGVuLCBpbm8sIGR0eXBlKTsKKwlfZW50ZXIoInslcywlWnV9LCVzLCV1LCwlbGx1LCV1IiwKKwkgICAgICAgY29va2llLT5uYW1lLCBjb29raWUtPm5sZW4sIG5hbWUsIG5sZW4sCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlubywgZHR5cGUpOworCisJLyogaW5zYW5pdHkgY2hlY2tzIGZpcnN0ICovCisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSAhPSAyMDQ4KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpICE9IDMyKTsKIAogCWlmIChjb29raWUtPm5sZW4gIT0gbmxlbiB8fCBtZW1jbXAoY29va2llLT5uYW1lLCBuYW1lLCBubGVuKSAhPSAwKSB7CiAJCV9sZWF2ZSgiID0gMCBbbm9dIik7CkBAIC00MjYsMzggKzQzNywyMSBAQAogCiAJX2xlYXZlKCIgPSAtMSBbZm91bmRdIik7CiAJcmV0dXJuIC0xOwotfSAvKiBlbmQgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBsb29rIHVwIGFuIGVudHJ5IGluIGEgZGlyZWN0b3J5CisgKiBkbyBhIGxvb2t1cCBpbiBhIGRpcmVjdG9yeQorICogLSBqdXN0IHJldHVybnMgdGhlIEZJRCB0aGUgZGVudHJ5IG5hbWUgbWFwcyB0byBpZiBmb3VuZAogICovCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYWZzX2Rpcl9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIGludCBhZnNfZG9fbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgc3RydWN0IGFmc19maWQgKmZpZCwgc3RydWN0IGtleSAqa2V5KQogewotCXN0cnVjdCBhZnNfZGlyX2xvb2t1cF9jb29raWUgY29va2llOworCXN0cnVjdCBhZnNfbG9va3VwX2Nvb2tpZSBjb29raWU7CiAJc3RydWN0IGFmc19zdXBlcl9pbmZvICphczsKLQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXVuc2lnbmVkIGZwb3M7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyVsdX0sJXB7JXN9IiwgZGlyLT5pX2lubywgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQotCS8qIGluc2FuaXR5IGNoZWNrcyBmaXJzdCAqLwotCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7Ci0JQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7Ci0KLQlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KSB7Ci0JCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKLQl9Ci0KLQl2bm9kZSA9IEFGU19GU19JKGRpcik7Ci0JaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7Ci0JCV9sZWF2ZSgiID0gLUVTVEFMRSIpOwotCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKLQl9CisJX2VudGVyKCJ7JWx1fSwlcHslc30sIiwgZGlyLT5pX2lubywgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCWFzID0gZGlyLT5pX3NiLT5zX2ZzX2luZm87CiAKQEAgLTQ2OCwxNzQgKzQ2MiwyMjkgQEAKIAljb29raWUuZm91bmQJPSAwOwogCiAJZnBvcyA9IDA7Ci0JcmV0ID0gYWZzX2Rpcl9pdGVyYXRlKGRpciwgJmZwb3MsICZjb29raWUsIGFmc19kaXJfbG9va3VwX2ZpbGxkaXIpOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShkaXIsICZmcG9zLCAmY29va2llLCBhZnNfbG9va3VwX2ZpbGxkaXIsCisJCQkgICAgICBrZXkpOwogCWlmIChyZXQgPCAwKSB7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQlfbGVhdmUoIiA9ICVkIFtpdGVyXSIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gLUVOT0VOVDsKIAlpZiAoIWNvb2tpZS5mb3VuZCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJX2xlYXZlKCIgPSAtRU5PRU5UIFtub3QgZm91bmRdIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCSpmaWQgPSBjb29raWUuZmlkOworCV9sZWF2ZSgiID0gMCB7IHZuPSV1IHU9JXUgfSIsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvb2sgdXAgYW4gZW50cnkgaW4gYSBkaXJlY3RvcnkKKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IGFmc19maWQgZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwl2bm9kZSA9IEFGU19GU19JKGRpcik7CisKKwlfZW50ZXIoInsleDolZH0sJXB7JXN9LCIsCisJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJQVNTRVJUQ01QKGRlbnRyeS0+ZF9pbm9kZSwgPT0sIE5VTEwpOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkgeworCQlfbGVhdmUoIiA9IC1FTkFNRVRPT0xPTkciKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJfQorCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkgeworCQlfbGVhdmUoIiA9IC1FU1RBTEUiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJfQorCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlfbGVhdmUoIiA9ICVsZCBba2V5XSIsIFBUUl9FUlIoa2V5KSk7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoa2V5KSk7CisJfQorCisJcmV0ID0gYWZzX3ZhbGlkYXRlKHZub2RlLCBrZXkpOworCWlmIChyZXQgPCAwKSB7CisJCWtleV9wdXQoa2V5KTsKKwkJX2xlYXZlKCIgPSAlZCBbdmFsXSIsIHJldCk7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCi0JLyogaW5zdGFudGlhdGUgdGhlIGRlbnRyeSAqLwotCXJldCA9IGFmc19pZ2V0KGRpci0+aV9zYiwgJmNvb2tpZS5maWQsICZpbm9kZSk7CisJcmV0ID0gYWZzX2RvX2xvb2t1cChkaXIsIGRlbnRyeSwgJmZpZCwga2V5KTsKIAlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJa2V5X3B1dChrZXkpOworCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCQlfbGVhdmUoIiA9IE5VTEwgW25lZ2F0aXZlXSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJX2xlYXZlKCIgPSAlZCBbZG9dIiwgcmV0KTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CisJZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpIHZub2RlLT5zdGF0dXMuZGF0YV92ZXJzaW9uOworCisJLyogaW5zdGFudGlhdGUgdGhlIGRlbnRyeSAqLworCWlub2RlID0gYWZzX2lnZXQoZGlyLT5pX3NiLCBrZXksICZmaWQsIE5VTEwsIE5VTEwpOworCWtleV9wdXQoa2V5KTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoaW5vZGUpKTsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCX0KIAogCWRlbnRyeS0+ZF9vcCA9ICZhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnM7Ci0JZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CiAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JWx1IH0iLAotCSAgICAgICBjb29raWUuZmlkLnZub2RlLAotCSAgICAgICBjb29raWUuZmlkLnVuaXF1ZSwKKwkgICAgICAgZmlkLnZub2RlLAorCSAgICAgICBmaWQudW5pcXVlLAogCSAgICAgICBkZW50cnktPmRfaW5vZGUtPmlfaW5vLAogCSAgICAgICBkZW50cnktPmRfaW5vZGUtPmlfdmVyc2lvbik7CiAKIAlyZXR1cm4gTlVMTDsKLX0gLyogZW5kIGFmc19kaXJfbG9va3VwKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNoZWNrIHRoYXQgYSBkZW50cnkgbG9va3VwIGhpdCBoYXMgZm91bmQgYSB2YWxpZCBlbnRyeQogICogLSBOT1RFISB0aGUgaGl0IGNhbiBiZSBhIG5lZ2F0aXZlIGhpdCB0b28sIHNvIHdlIGNhbid0IGFzc3VtZSB3ZSBoYXZlIGFuCiAgKiAgIGlub2RlCi0gKiAoZGVyaXZlZCBmcm9tIG5mc19sb29rdXBfcmV2YWxpZGF0ZSkKICAqLwogc3RhdGljIGludCBhZnNfZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0Jc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSBjb29raWU7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUsICpkaXI7CisJc3RydWN0IGFmc19maWQgZmlkOwogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyOwotCXVuc2lnbmVkIGZwb3M7CisJc3RydWN0IGtleSAqa2V5OworCXZvaWQgKmRpcl92ZXJzaW9uOwogCWludCByZXQ7CiAKLQlfZW50ZXIoIntzYj0lcCBuPSVzfSwiLCBkZW50cnktPmRfc2IsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXZub2RlID0gQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKTsKKworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCV9lbnRlcigie3Y9eyV4OiV1fSBuPSVzIGZsPSVseH0sIiwKKwkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkgICAgICAgdm5vZGUtPmZsYWdzKTsKKwllbHNlCisJCV9lbnRlcigie25lZyBuPSVzfSIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KEFGU19GU19TKGRlbnRyeS0+ZF9zYiktPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKQorCQlrZXkgPSBOVUxMOwogCiAJLyogbG9jayBkb3duIHRoZSBwYXJlbnQgZGVudHJ5IHNvIHdlIGNhbiBwZWVyIGF0IGl0ICovCi0JcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5LT5kX3BhcmVudCk7Ci0KLQlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7Ci0JaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0KLQkvKiBoYW5kbGUgYSBuZWdhdGl2ZSBkZW50cnkgKi8KLQlpZiAoIWlub2RlKQorCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJaWYgKCFwYXJlbnQtPmRfaW5vZGUpCiAJCWdvdG8gb3V0X2JhZDsKIAotCS8qIGhhbmRsZSBhIGJhZCBpbm9kZSAqLwotCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7Ci0JCXByaW50aygia0FGUzogYWZzX2RfcmV2YWxpZGF0ZTogJXMvJXMgaGFzIGJhZCBpbm9kZVxuIiwKLQkJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJZ290byBvdXRfYmFkOwotCX0KKwlkaXIgPSBBRlNfRlNfSShwYXJlbnQtPmRfaW5vZGUpOwogCi0JLyogZm9yY2UgYSBmdWxsIGxvb2sgdXAgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgY2hhbmdlZCBzaW5jZSBsYXN0IHRoZQotCSAqIHNlcnZlciB3YXMgY29uc3VsdGVkCi0JICogLSBvdGhlcndpc2UgdGhpcyBpbm9kZSBtdXN0IHN0aWxsIGV4aXN0LCBldmVuIGlmIHRoZSBpbm9kZSBkZXRhaWxzCi0JICogICB0aGVtc2VsdmVzIGhhdmUgY2hhbmdlZAotCSAqLwotCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9DSEFOR0VEKQotCQlhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKEFGU19GU19JKGRpcikpOworCS8qIHZhbGlkYXRlIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9NT0RJRklFRCwgJmRpci0+ZmxhZ3MpKQorCQlhZnNfdmFsaWRhdGUoZGlyLCBrZXkpOwogCi0JaWYgKEFGU19GU19JKGRpciktPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpIHsKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZkaXItPmZsYWdzKSkgewogCQlfZGVidWcoIiVzOiBwYXJlbnQgZGlyIGRlbGV0ZWQiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAkJZ290byBvdXRfYmFkOwogCX0KIAotCWlmIChBRlNfRlNfSShpbm9kZSktPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpIHsKLQkJX2RlYnVnKCIlczogZmlsZSBhbHJlYWR5IGRlbGV0ZWQiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJZ290byBvdXRfYmFkOwotCX0KKwlkaXJfdmVyc2lvbiA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSBkaXItPnN0YXR1cy5kYXRhX3ZlcnNpb247CisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEgPT0gZGlyX3ZlcnNpb24pCisJCWdvdG8gb3V0X3ZhbGlkOyAvKiB0aGUgZGlyIGNvbnRlbnRzIGFyZSB1bmNoYW5nZWQgKi8KIAotCWlmICgodW5zaWduZWQgbG9uZykgZGVudHJ5LT5kX2ZzZGF0YSAhPQotCSAgICAodW5zaWduZWQgbG9uZykgQUZTX0ZTX0koZGlyKS0+c3RhdHVzLnZlcnNpb24pIHsKLQkJX2RlYnVnKCIlczogcGFyZW50IGNoYW5nZWQgJWx1IC0+ICV1IiwKLQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVudHJ5LT5kX2ZzZGF0YSwKLQkJICAgICAgICh1bnNpZ25lZCkgQUZTX0ZTX0koZGlyKS0+c3RhdHVzLnZlcnNpb24pOworCV9kZWJ1ZygiZGlyIG1vZGlmaWVkIik7CiAKLQkJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgdm5vZGUgKi8KLQkJY29va2llLm5hbWUJPSBkZW50cnktPmRfbmFtZS5uYW1lOwotCQljb29raWUubmxlbgk9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKLQkJY29va2llLmZpZC52aWQJPSBBRlNfRlNfSShpbm9kZSktPnZvbHVtZS0+dmlkOwotCQljb29raWUuZm91bmQJPSAwOwotCi0JCWZwb3MgPSAwOwotCQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZGlyLCAmZnBvcywgJmNvb2tpZSwKLQkJCQkgICAgICBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCV9kZWJ1ZygiZmFpbGVkIHRvIGl0ZXJhdGUgZGlyICVzOiAlZCIsCi0JCQkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgcmV0KTsKKwkvKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhpcyB2bm9kZSAqLworCXJldCA9IGFmc19kb19sb29rdXAoJmRpci0+dmZzX2lub2RlLCBkZW50cnksICZmaWQsIGtleSk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCS8qIHRoZSBmaWxlbmFtZSBtYXBzIHRvIHNvbWV0aGluZyAqLworCQlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKIAkJCWdvdG8gb3V0X2JhZDsKLQkJfQotCi0JCWlmICghY29va2llLmZvdW5kKSB7Ci0JCQlfZGVidWcoIiVzOiBkaXJlbnQgbm90IGZvdW5kIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCQlnb3RvIG5vdF9mb3VuZDsKKwkJaWYgKGlzX2JhZF9pbm9kZShkZW50cnktPmRfaW5vZGUpKSB7CisJCQlwcmludGsoImtBRlM6IGFmc19kX3JldmFsaWRhdGU6ICVzLyVzIGhhcyBiYWQgaW5vZGVcbiIsCisJCQkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlnb3RvIG91dF9iYWQ7CiAJCX0KIAogCQkvKiBpZiB0aGUgdm5vZGUgSUQgaGFzIGNoYW5nZWQsIHRoZW4gdGhlIGRpcmVudCBwb2ludHMgdG8gYQogCQkgKiBkaWZmZXJlbnQgZmlsZSAqLwotCQlpZiAoY29va2llLmZpZC52bm9kZSAhPSBBRlNfRlNfSShpbm9kZSktPmZpZC52bm9kZSkgewotCQkJX2RlYnVnKCIlczogZGlyZW50IGNoYW5nZWQiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJaWYgKGZpZC52bm9kZSAhPSB2bm9kZS0+ZmlkLnZub2RlKSB7CisJCQlfZGVidWcoIiVzOiBkaXJlbnQgY2hhbmdlZCBbJXUgIT0gJXVdIiwKKwkJCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBmaWQudm5vZGUsCisJCQkgICAgICAgdm5vZGUtPmZpZC52bm9kZSk7CiAJCQlnb3RvIG5vdF9mb3VuZDsKIAkJfQogCiAJCS8qIGlmIHRoZSB2bm9kZSBJRCB1bmlxaWZpZXIgaGFzIGNoYW5nZWQsIHRoZW4gdGhlIGZpbGUgaGFzCi0JCSAqIGJlZW4gZGVsZXRlZCAqLwotCQlpZiAoY29va2llLmZpZC51bmlxdWUgIT0gQUZTX0ZTX0koaW5vZGUpLT5maWQudW5pcXVlKSB7CisJCSAqIGJlZW4gZGVsZXRlZCBhbmQgcmVwbGFjZWQsIGFuZCB0aGUgb3JpZ2luYWwgdm5vZGUgSUQgaGFzCisJCSAqIGJlZW4gcmV1c2VkICovCisJCWlmIChmaWQudW5pcXVlICE9IHZub2RlLT5maWQudW5pcXVlKSB7CiAJCQlfZGVidWcoIiVzOiBmaWxlIGRlbGV0ZWQgKHVxICV1IC0+ICV1IEk6JWx1KSIsCi0JCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCSAgICAgICBjb29raWUuZmlkLnVuaXF1ZSwKLQkJCSAgICAgICBBRlNfRlNfSShpbm9kZSktPmZpZC51bmlxdWUsCi0JCQkgICAgICAgaW5vZGUtPmlfdmVyc2lvbik7Ci0JCQlzcGluX2xvY2soJkFGU19GU19JKGlub2RlKS0+bG9jayk7Ci0JCQlBRlNfRlNfSShpbm9kZSktPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOwotCQkJc3Bpbl91bmxvY2soJkFGU19GU19JKGlub2RlKS0+bG9jayk7Ci0JCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7Ci0JCQlnb3RvIG91dF9iYWQ7CisJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgZmlkLnVuaXF1ZSwKKwkJCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwgZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOworCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQlzZXRfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQlnb3RvIG5vdF9mb3VuZDsKIAkJfQorCQlnb3RvIG91dF92YWxpZDsKIAotCQlkZW50cnktPmRfZnNkYXRhID0KLQkJCSh2b2lkICopICh1bnNpZ25lZCBsb25nKSBBRlNfRlNfSShkaXIpLT5zdGF0dXMudmVyc2lvbjsKKwljYXNlIC1FTk9FTlQ6CisJCS8qIHRoZSBmaWxlbmFtZSBpcyB1bmtub3duICovCisJCV9kZWJ1ZygiJXM6IGRpcmVudCBub3QgZm91bmQiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJCWdvdG8gbm90X2ZvdW5kOworCQlnb3RvIG91dF92YWxpZDsKKworCWRlZmF1bHQ6CisJCV9kZWJ1ZygiZmFpbGVkIHRvIGl0ZXJhdGUgZGlyICVzOiAlZCIsCisJCSAgICAgICBwYXJlbnQtPmRfbmFtZS5uYW1lLCByZXQpOworCQlnb3RvIG91dF9iYWQ7CiAJfQogCi0gb3V0X3ZhbGlkOgorb3V0X3ZhbGlkOgorCWRlbnRyeS0+ZF9mc2RhdGEgPSBkaXJfdmVyc2lvbjsKK291dF9za2lwOgogCWRwdXQocGFyZW50KTsKKwlrZXlfcHV0KGtleSk7CiAJX2xlYXZlKCIgPSAxIFt2YWxpZF0iKTsKIAlyZXR1cm4gMTsKIAogCS8qIHRoZSBkaXJlbnQsIGlmIGl0IGV4aXN0cywgbm93IHBvaW50cyB0byBhIGRpZmZlcmVudCB2bm9kZSAqLwotIG5vdF9mb3VuZDoKK25vdF9mb3VuZDoKIAlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX05GU0ZTX1JFTkFNRUQ7CiAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAotIG91dF9iYWQ6Ci0JaWYgKGlub2RlKSB7CitvdXRfYmFkOgorCWlmIChkZW50cnktPmRfaW5vZGUpIHsKIAkJLyogZG9uJ3QgdW5oYXNoIGlmIHdlIGhhdmUgc3VibW91bnRzICovCiAJCWlmIChoYXZlX3N1Ym1vdW50cyhkZW50cnkpKQotCQkJZ290byBvdXRfdmFsaWQ7CisJCQlnb3RvIG91dF9za2lwOwogCX0KIAotCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7Ci0KIAlfZGVidWcoImRyb3BwaW5nIGRlbnRyeSAlcy8lcyIsCi0JICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGVudHJ5KTsKIAlkX2Ryb3AoZGVudHJ5KTsKLQogCWRwdXQocGFyZW50KTsKKwlrZXlfcHV0KGtleSk7CiAKIAlfbGVhdmUoIiA9IDAgW2JhZF0iKTsKIAlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19kX3JldmFsaWRhdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogYWxsb3cgdGhlIFZGUyB0byBlbnF1aXJlIGFzIHRvIHdoZXRoZXIgYSBkZW50cnkgc2hvdWxkIGJlIHVuaGFzaGVkIChtdXN0bid0CiAgKiBzbGVlcCkKQEAgLTY0OSwxNSArNjk4LDQ0NCBAQAogCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkZTRlNfUkVOQU1FRCkKIAkJZ290byB6YXA7CiAKLQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7Ci0JCWlmIChBRlNfRlNfSShkZW50cnktPmRfaW5vZGUpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKQorCWlmIChkZW50cnktPmRfaW5vZGUgJiYKKwkgICAgdGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZBRlNfRlNfSShkZW50cnktPmRfaW5vZGUpLT5mbGFncykpCiAJCQlnb3RvIHphcDsKLQl9CiAKIAlfbGVhdmUoIiA9IDAgW2tlZXBdIik7CiAJcmV0dXJuIDA7CiAKLSB6YXA6Cit6YXA6CiAJX2xlYXZlKCIgPSAxIFt6YXBdIik7CiAJcmV0dXJuIDE7Ci19IC8qIGVuZCBhZnNfZF9kZWxldGUoKSAqLworfQorCisvKgorICogaGFuZGxlIGRlbnRyeSByZWxlYXNlCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kX3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCV9lbnRlcigiJXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKK30KKworLyoKKyAqIGNyZWF0ZSBhIGRpcmVjdG9yeSBvbiBhbiBBRlMgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50IGFmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNiOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCAqdm5vZGU7CisJc3RydWN0IGFmc19maWQgZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlkdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHslc30sJW8iLAorCSAgICAgICBkdm5vZGUtPmZpZC52aWQsIGR2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLCBtb2RlKTsKKworCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwkJZ290byBlcnJvcjsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltb2RlIHw9IFNfSUZESVI7CisJcmV0ID0gYWZzX3Zub2RlX2NyZWF0ZShkdm5vZGUsIGtleSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBtb2RlLCAmZmlkLCAmc3RhdHVzLCAmY2IsICZzZXJ2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG1rZGlyX2Vycm9yOworCisJaW5vZGUgPSBhZnNfaWdldChkaXItPmlfc2IsIGtleSwgJmZpZCwgJnN0YXR1cywgJmNiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkvKiBFTk9NRU0gYXQgYSByZWFsbHkgaW5jb252ZW5pZW50IHRpbWUgLSBqdXN0IGFiYW5kb24gdGhlIG5ldworCQkgKiBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLworCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBpZ2V0X2Vycm9yOworCX0KKworCS8qIGFwcGx5IHRoZSBzdGF0dXMgcmVwb3J0IHdlJ3ZlIGdvdCBmb3IgdGhlIG5ldyB2bm9kZSAqLworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250Kys7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoZF91bmhhc2hlZChkZW50cnkpKSB7CisJCV9kZWJ1Zygibm90IGhhc2hlZCIpOworCQlkX3JlaGFzaChkZW50cnkpOworCX0KKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK2lnZXRfZXJyb3I6CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKK21rZGlyX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCWRfZHJvcChkZW50cnkpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZW1vdmUgYSBkaXJlY3RvcnkgZnJvbSBhbiBBRlMgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50IGFmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgKnZub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJZHZub2RlID0gQUZTX0ZTX0koZGlyKTsKKworCV9lbnRlcigieyV4OiVkfSx7JXN9IiwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXQgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gYWZzX3Zub2RlX3JlbW92ZShkdm5vZGUsIGtleSwgZGVudHJ5LT5kX25hbWUubmFtZSwgdHJ1ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcm1kaXJfZXJyb3I7CisKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCXZub2RlID0gQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKTsKKwkJY2xlYXJfbmxpbmsoJnZub2RlLT52ZnNfaW5vZGUpOworCQlzZXRfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKTsKKwkJYWZzX2Rpc2NhcmRfY2FsbGJhY2tfb25fZGVsZXRlKHZub2RlKTsKKwl9CisKKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK3JtZGlyX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZW1vdmUgYSBmaWxlIGZyb20gYW4gQUZTIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludCBhZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCAqdm5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlkdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHslc30iLAorCSAgICAgICBkdm5vZGUtPmZpZC52aWQsIGR2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwkJZ290byBlcnJvcjsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCXZub2RlID0gQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKTsKKworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNhbGxiYWNrIHByb21pc2Ugb24gdGhlIHZpY3RpbSAqLworCQlyZXQgPSBhZnNfdmFsaWRhdGUodm5vZGUsIGtleSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBhZnNfdm5vZGVfcmVtb3ZlKGR2bm9kZSwga2V5LCBkZW50cnktPmRfbmFtZS5uYW1lLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVtb3ZlX2Vycm9yOworCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQkvKiBpZiB0aGUgZmlsZSB3YXNuJ3QgZGVsZXRlZCBkdWUgdG8gZXhjZXNzIGhhcmQgbGlua3MsIHRoZQorCQkgKiBmaWxlc2VydmVyIHdpbGwgYnJlYWsgdGhlIGNhbGxiYWNrIHByb21pc2Ugb24gdGhlIGZpbGUgLSBpZgorCQkgKiBpdCBoYWQgb25lIC0gYmVmb3JlIGl0IHJldHVybnMgdG8gdXMsIGFuZCBpZiBpdCB3YXMgZGVsZXRlZCwKKwkJICogaXQgd29uJ3QKKwkJICoKKwkJICogaG93ZXZlciwgaWYgd2UgZGlkbid0IGhhdmUgYSBjYWxsYmFjayBwcm9taXNlIG91dHN0YW5kaW5nLAorCQkgKiBvciBpdCB3YXMgb3V0c3RhbmRpbmcgb24gYSBkaWZmZXJlbnQgc2VydmVyLCB0aGVuIGl0IHdvbid0CisJCSAqIGJyZWFrIGl0IGVpdGhlci4uLgorCQkgKi8KKwkJdm5vZGUgPSBBRlNfRlNfSShkZW50cnktPmRfaW5vZGUpOworCQlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJX2RlYnVnKCJBRlNfVk5PREVfREVMRVRFRCIpOworCQlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykpCisJCQlfZGVidWcoIkFGU19WTk9ERV9DQl9CUk9LRU4iKTsKKwkJc2V0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKTsKKwkJcmV0ID0gYWZzX3ZhbGlkYXRlKHZub2RlLCBrZXkpOworCQlfZGVidWcoIm5saW5rICVkIFt2YWwgJWRdIiwgdm5vZGUtPnZmc19pbm9kZS5pX25saW5rLCByZXQpOworCX0KKworCWtleV9wdXQoa2V5KTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworcmVtb3ZlX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBjcmVhdGUgYSByZWd1bGFyIGZpbGUgb24gYW4gQUZTIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludCBhZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNiOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCAqdm5vZGU7CisJc3RydWN0IGFmc19maWQgZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlkdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHslc30sJW8sIiwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CisKKwlyZXQgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbW9kZSB8PSBTX0lGUkVHOworCXJldCA9IGFmc192bm9kZV9jcmVhdGUoZHZub2RlLCBrZXksIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgbW9kZSwgJmZpZCwgJnN0YXR1cywgJmNiLCAmc2VydmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjcmVhdGVfZXJyb3I7CisKKwlpbm9kZSA9IGFmc19pZ2V0KGRpci0+aV9zYiwga2V5LCAmZmlkLCAmc3RhdHVzLCAmY2IpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCS8qIEVOT01FTSBhdCBhIHJlYWxseSBpbmNvbnZlbmllbnQgdGltZSAtIGp1c3QgYWJhbmRvbiB0aGUgbmV3CisJCSAqIGRpcmVjdG9yeSBvbiB0aGUgc2VydmVyICovCisJCXJldCA9IFBUUl9FUlIoaW5vZGUpOworCQlnb3RvIGlnZXRfZXJyb3I7CisJfQorCisJLyogYXBwbHkgdGhlIHN0YXR1cyByZXBvcnQgd2UndmUgZ290IGZvciB0aGUgbmV3IHZub2RlICovCisJdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHZub2RlLCBzZXJ2ZXIpOworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWlmIChkX3VuaGFzaGVkKGRlbnRyeSkpIHsKKwkJX2RlYnVnKCJub3QgaGFzaGVkIik7CisJCWRfcmVoYXNoKGRlbnRyeSk7CisJfQorCWtleV9wdXQoa2V5KTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworaWdldF9lcnJvcjoKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworY3JlYXRlX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCWRfZHJvcChkZW50cnkpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBoYXJkIGxpbmsgYmV0d2VlbiBmaWxlcyBpbiBhbiBBRlMgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50IGFmc19saW5rKHN0cnVjdCBkZW50cnkgKmZyb20sIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgKnZub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJdm5vZGUgPSBBRlNfRlNfSShmcm9tLT5kX2lub2RlKTsKKwlkdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHsleDolZH0seyVzfSIsCisJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICBkdm5vZGUtPmZpZC52aWQsIGR2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwkJZ290byBlcnJvcjsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBhZnNfdm5vZGVfbGluayhkdm5vZGUsIHZub2RlLCBrZXksIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGxpbmtfZXJyb3I7CisKKwlhdG9taWNfaW5jKCZ2bm9kZS0+dmZzX2lub2RlLmlfY291bnQpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCAmdm5vZGUtPnZmc19pbm9kZSk7CisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitsaW5rX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCWRfZHJvcChkZW50cnkpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBzeW1saW5rIGluIGFuIEFGUyBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgYWZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQpCit7CisJc3RydWN0IGFmc19maWxlX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsICp2bm9kZTsKKwlzdHJ1Y3QgYWZzX2ZpZCBmaWQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCWR2bm9kZSA9IEFGU19GU19JKGRpcik7CisKKwlfZW50ZXIoInsleDolZH0seyVzfSwlcyIsCisJICAgICAgIGR2bm9kZS0+ZmlkLnZpZCwgZHZub2RlLT5maWQudm5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJICAgICAgIGNvbnRlbnQpOworCisJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc3RybGVuKGNvbnRlbnQpID4gMTAyMykKKwkJZ290byBlcnJvcjsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBhZnNfdm5vZGVfc3ltbGluayhkdm5vZGUsIGtleSwgZGVudHJ5LT5kX25hbWUubmFtZSwgY29udGVudCwKKwkJCQkmZmlkLCAmc3RhdHVzLCAmc2VydmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjcmVhdGVfZXJyb3I7CisKKwlpbm9kZSA9IGFmc19pZ2V0KGRpci0+aV9zYiwga2V5LCAmZmlkLCAmc3RhdHVzLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkvKiBFTk9NRU0gYXQgYSByZWFsbHkgaW5jb252ZW5pZW50IHRpbWUgLSBqdXN0IGFiYW5kb24gdGhlIG5ldworCQkgKiBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLworCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBpZ2V0X2Vycm9yOworCX0KKworCS8qIGFwcGx5IHRoZSBzdGF0dXMgcmVwb3J0IHdlJ3ZlIGdvdCBmb3IgdGhlIG5ldyB2bm9kZSAqLworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250Kys7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoZF91bmhhc2hlZChkZW50cnkpKSB7CisJCV9kZWJ1Zygibm90IGhhc2hlZCIpOworCQlkX3JlaGFzaChkZW50cnkpOworCX0KKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK2lnZXRfZXJyb3I6CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKK2NyZWF0ZV9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcmVuYW1lIGEgZmlsZSBpbiBhbiBBRlMgZmlsZXN5c3RlbSBhbmQvb3IgbW92ZSBpdCBiZXR3ZWVuIGRpcmVjdG9yaWVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICpvcmlnX2R2bm9kZSwgKm5ld19kdm5vZGUsICp2bm9kZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCXZub2RlID0gQUZTX0ZTX0kob2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisJb3JpZ19kdm5vZGUgPSBBRlNfRlNfSShvbGRfZGlyKTsKKwluZXdfZHZub2RlID0gQUZTX0ZTX0kobmV3X2Rpcik7CisKKwlfZW50ZXIoInsleDolZH0seyV4OiVkfSx7JXg6JWR9LHslc30iLAorCSAgICAgICBvcmlnX2R2bm9kZS0+ZmlkLnZpZCwgb3JpZ19kdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIG5ld19kdm5vZGUtPmZpZC52aWQsIG5ld19kdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAobmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwkJZ290byBlcnJvcjsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShvcmlnX2R2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJcmV0ID0gUFRSX0VSUihrZXkpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGFmc192bm9kZV9yZW5hbWUob3JpZ19kdm5vZGUsIG5ld19kdm5vZGUsIGtleSwKKwkJCSAgICAgICBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVuYW1lX2Vycm9yOworCWtleV9wdXQoa2V5KTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworcmVuYW1lX2Vycm9yOgorCWtleV9wdXQoa2V5KTsKK2Vycm9yOgorCWRfZHJvcChuZXdfZGVudHJ5KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Vycm9ycy5oIGIvZnMvYWZzL2Vycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRkOTRhLi4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9lcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIGVycm9ycy5oOiBBRlMgYWJvcnQvZXJyb3IgY29kZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX0VSUk9SU19ICi0jZGVmaW5lIF9MSU5VWF9BRlNfRVJST1JTX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qIGZpbGUgc2VydmVyIGFib3J0IGNvZGVzICovCi10eXBlZGVmIGVudW0gewotCVZTQUxWQUdFCT0gMTAxLAkvKiB2b2x1bWUgbmVlZHMgc2FsdmFnaW5nICovCi0JVk5PVk5PREUJPSAxMDIsCS8qIG5vIHN1Y2ggZmlsZS9kaXIgKHZub2RlKSAqLwotCVZOT1ZPTAkJPSAxMDMsCS8qIG5vIHN1Y2ggdm9sdW1lIG9yIHZvbHVtZSB1bmF2YWlsYWJsZSAqLwotCVZWT0xFWElTVFMJPSAxMDQsCS8qIHZvbHVtZSBuYW1lIGFscmVhZHkgZXhpc3RzICovCi0JVk5PU0VSVklDRQk9IDEwNSwJLyogdm9sdW1lIG5vdCBjdXJyZW50bHkgaW4gc2VydmljZSAqLwotCVZPRkZMSU5FCT0gMTA2LAkvKiB2b2x1bWUgaXMgY3VycmVudGx5IG9mZmxpbmUgKG1vcmUgaW5mbyBhdmFpbGFibGUgW1ZWTC1zcGVjXSkgKi8KLQlWT05MSU5FCQk9IDEwNywJLyogdm9sdW1lIGlzIGFscmVhZHkgb25saW5lICovCi0JVkRJU0tGVUxMCT0gMTA4LAkvKiBkaXNrIHBhcnRpdGlvbiBpcyBmdWxsICovCi0JVk9WRVJRVU9UQQk9IDEwOSwJLyogdm9sdW1lJ3MgbWF4aW11bSBxdW90YSBleGNlZWRlZCAqLwotCVZCVVNZCQk9IDExMCwJLyogdm9sdW1lIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlICovCi0JVk1PVkVECQk9IDExMSwJLyogdm9sdW1lIG1vdmVkIHRvIG5ldyBzZXJ2ZXIgLSBhc2sgdGhpcyBGUyB3aGVyZSAqLwotfSBhZnNfcnhmc19hYm9ydF90OwotCi1leHRlcm4gaW50IGFmc19hYm9ydF90b19lcnJvcihpbnQgYWJvcnRjb2RlKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfRVJST1JTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9maWxlLmMgYi9mcy9hZnMvZmlsZS5jCmluZGV4IGIxNzYzNDUuLmFlMjU2NDkgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9maWxlLmMKKysrIGIvZnMvYWZzL2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKLS8qIGZpbGUuYzogQUZTIGZpbGVzeXN0ZW0gZmlsZSBoYW5kbGluZworLyogQUZTIGZpbGVzeXN0ZW0gZmlsZSBoYW5kbGluZwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE1LDIyICsxNSwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJ2bm9kZS5oIgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jaWYgMAotc3RhdGljIGludCBhZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgYWZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci0jZW5kaWYKLQogc3RhdGljIGludCBhZnNfZmlsZV9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogc3RhdGljIHZvaWQgYWZzX2ZpbGVfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKIHN0YXRpYyBpbnQgYWZzX2ZpbGVfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcF9mbGFncyk7CiAKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhZnNfb3BlbiwKKwkucmVsZWFzZQk9IGFmc19yZWxlYXNlLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmdldGF0dHIJPSBhZnNfaW5vZGVfZ2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IGFmc19wZXJtaXNzaW9uLAogfTsKIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhZnNfZnNfYW9wcyA9IHsKQEAgLTQwLDcgKzQzLDQ4IEBACiAJLmludmFsaWRhdGVwYWdlCT0gYWZzX2ZpbGVfaW52YWxpZGF0ZXBhZ2UsCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogb3BlbiBhbiBBRlMgZmlsZSBvciBkaXJlY3RvcnkgYW5kIGF0dGFjaCBhIGtleSB0byBpdAorICovCitpbnQgYWZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoleH0sIiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOworCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlfbGVhdmUoIiA9ICVsZCBba2V5XSIsIFBUUl9FUlIoa2V5KSk7CisJCXJldHVybiBQVFJfRVJSKGtleSk7CisJfQorCisJcmV0ID0gYWZzX3ZhbGlkYXRlKHZub2RlLCBrZXkpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQgW3ZhbF0iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGtleTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlbGVhc2UgYW4gQUZTIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCBkaXNjYXJkIGl0cyBrZXkKKyAqLworaW50IGFmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCisJX2VudGVyKCJ7JXg6JXh9LCIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKworCWtleV9wdXQoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHJlYWQgZnJvbSB0aGUgY2FjaGUKICAqLwpAQCAtNTgsMTAgKzEwMiw5IEBACiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAotfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2VfcmVhZF9jb21wbGV0ZSgpICovCit9CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHdyaXR0ZW4gdG8gdGhlIGNhY2hlCiAgKi8KQEAgLTc0LDQxICsxMTcsMzggQEAKIAlfZW50ZXIoIiVwLCVwLCVwLCVkIiwgY29va2llX2RhdGEsIHBhZ2UsIGRhdGEsIGVycm9yKTsKIAogCXVubG9ja19wYWdlKHBhZ2UpOwotCi19IC8qIGVuZCBhZnNfZmlsZV9yZWFkcGFnZV93cml0ZV9jb21wbGV0ZSgpICovCit9CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIEFGUyByZWFkIHBhZ2UgZnJvbSBmaWxlIChvciBzeW1saW5rKQogICovCiBzdGF0aWMgaW50IGFmc19maWxlX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciBkZXNjOwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQlzdHJ1Y3QgY2FjaGVmc19wYWdlICpwYWdlaW87Ci0jZW5kaWYKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlzaXplX3QgbGVuOworCW9mZl90IG9mZnNldDsKIAlpbnQgcmV0OwogCiAJaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCi0JX2VudGVyKCJ7JWx1fSx7JWx1fSIsIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOworCUFTU0VSVChmaWxlICE9IE5VTEwpOworCWtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlBU1NFUlQoa2V5ICE9IE5VTEwpOworCisJX2VudGVyKCJ7JXh9LHslbHV9LHslbHV9Iiwga2V5X3NlcmlhbChrZXkpLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAogCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOwogCiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAogCXJldCA9IC1FU1RBTEU7Ci0JaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKQorCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncykpCiAJCWdvdG8gZXJyb3I7CiAKICNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0JcmV0ID0gY2FjaGVmc19wYWdlX2dldF9wcml2YXRlKHBhZ2UsICZwYWdlaW8sIEdGUF9OT0lPKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQogCS8qIGlzIGl0IGNhY2hlZD8gKi8KIAlyZXQgPSBjYWNoZWZzX3JlYWRfb3JfYWxsb2NfcGFnZSh2bm9kZS0+Y2FjaGUsCiAJCQkJCSBwYWdlLApAQCAtMTMyLDI2ICsxNzIsMTkgQEAKIAljYXNlIC1FTk9CVUZTOgogCWNhc2UgLUVOT0RBVEE6CiAJZGVmYXVsdDoKLQkJZGVzYy5maWQJPSB2bm9kZS0+ZmlkOwotCQlkZXNjLm9mZnNldAk9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCWRlc2Muc2l6ZQk9IG1pbigoc2l6ZV90KSAoaW5vZGUtPmlfc2l6ZSAtIGRlc2Mub2Zmc2V0KSwKLQkJCQkgICAgICAoc2l6ZV90KSBQQUdFX1NJWkUpOwotCQlkZXNjLmJ1ZmZlcgk9IGttYXAocGFnZSk7Ci0KLQkJY2xlYXJfcGFnZShkZXNjLmJ1ZmZlcik7CisJCW9mZnNldCA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgaV9zaXplX3JlYWQoaW5vZGUpIC0gb2Zmc2V0LCBQQUdFX1NJWkUpOwogCiAJCS8qIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGZyb20gdGhlIHNlcnZlciBpbnRvIHRoZQogCQkgKiBwYWdlICovCi0JCXJldCA9IGFmc192bm9kZV9mZXRjaF9kYXRhKHZub2RlLCAmZGVzYyk7Ci0JCWt1bm1hcChwYWdlKTsKKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX2RhdGEodm5vZGUsIGtleSwgb2Zmc2V0LCBsZW4sIHBhZ2UpOwogCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKHJldD09LUVOT0VOVCkgeworCQkJaWYgKHJldCA9PSAtRU5PRU5UKSB7CiAJCQkJX2RlYnVnKCJnb3QgTk9FTlQgZnJvbSBzZXJ2ZXIiCiAJCQkJICAgICAgICIgLSBtYXJraW5nIGZpbGUgZGVsZXRlZCBhbmQgc3RhbGUiKTsKLQkJCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0RFTEVURUQ7CisJCQkJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CiAJCQkJcmV0ID0gLUVTVEFMRTsKIAkJCX0KLQogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIAkJCWNhY2hlZnNfdW5jYWNoZV9wYWdlKHZub2RlLT5jYWNoZSwgcGFnZSk7CiAjZW5kaWYKQEAgLTE3OCwxNiArMjExLDEzIEBACiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcjoKK2Vycm9yOgogCVNldFBhZ2VFcnJvcihwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKLQogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc19maWxlX3JlYWRwYWdlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGdldCBhIHBhZ2UgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UKICAqLwpAQCAtMjAyLDEwICsyMzIsOSBAQAogCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoKSAqLworfQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbnZhbGlkYXRlIHBhcnQgb3IgYWxsIG9mIGEgcGFnZQogICovCkBAIC0yNDAsOSArMjY5LDggQEAKIAl9CiAKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLX0gLyogZW5kIGFmc19maWxlX2ludmFsaWRhdGVwYWdlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlbGVhc2UgYSBwYWdlIGFuZCBjbGVhbnVwIGl0cyBwcml2YXRlIGRhdGEKICAqLwpAQCAtMjY3LDQgKzI5NSw0IEBACiAKIAlfbGVhdmUoIiA9IDAiKTsKIAlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19maWxlX3JlbGVhc2VwYWdlKCkgKi8KK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5jIGIvZnMvYWZzL2ZzY2xpZW50LmMKaW5kZXggNjFiYzM3MS4uMjM5M2QyYSAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZzY2xpZW50LmMKKysrIGIvZnMvYWZzL2ZzY2xpZW50LmMKQEAgLTEsNiArMSw2IEBACi0vKiBmc2NsaWVudC5jOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWJzCisvKiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWJzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTEsODI3ICsxMSw5MjcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJmc2NsaWVudC5oIgotI2luY2x1ZGUgImNtc2VydmljZS5oIgotI2luY2x1ZGUgInZub2RlLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFmc19mcy5oIgogCi0jZGVmaW5lIEZTRkVUQ0hTVEFUVVMJCTEzMgkvKiBBRlMgRmV0Y2ggZmlsZSBzdGF0dXMgKi8KLSNkZWZpbmUgRlNGRVRDSERBVEEJCTEzMAkvKiBBRlMgRmV0Y2ggZmlsZSBkYXRhICovCi0jZGVmaW5lIEZTR0lWRVVQQ0FMTEJBQ0tTCTE0NwkvKiBBRlMgRGlzY2FyZCBjYWxsYmFjayBwcm9taXNlcyAqLwotI2RlZmluZSBGU0dFVFZPTFVNRUlORk8JCTE0OAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEZTR0VUUk9PVFZPTFVNRQkJMTUxCS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgbmFtZSAqLwotI2RlZmluZSBGU0xPT0tVUAkJMTYxCS8qIEFGUyBsb29rdXAgZmlsZSBpbiBkaXJlY3RvcnkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIG1hcCBhZnMgYWJvcnQgY29kZXMgdG8vZnJvbSBMaW51eCBlcnJvciBjb2RlcwotICogLSBjYWxsZWQgd2l0aCBjYWxsLT5sb2NrIGhlbGQKKyAqIGRlY29kZSBhbiBBRlNGaWQgYmxvY2sKICAqLwotc3RhdGljIHZvaWQgYWZzX3J4ZnNfYWVtYXAoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCB4ZHJfZGVjb2RlX0FGU0ZpZChjb25zdCBfX2JlMzIgKipfYnAsIHN0cnVjdCBhZnNfZmlkICpmaWQpCiB7Ci0Jc3dpdGNoIChjYWxsLT5hcHBfZXJyX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19FU1RBVEVfTE9DQUxfQUJPUlQ6Ci0JCWNhbGwtPmFwcF9hYm9ydF9jb2RlID0gLWNhbGwtPmFwcF9lcnJubzsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19FU1RBVEVfUEVFUl9BQk9SVDoKLQkJY2FsbC0+YXBwX2Vycm5vID0gYWZzX2Fib3J0X3RvX2Vycm9yKGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfSAvKiBlbmQgYWZzX3J4ZnNfYWVtYXAoKSAqLworCWNvbnN0IF9fYmUzMiAqYnAgPSAqX2JwOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJZmlkLT52aWQJCT0gbnRvaGwoKmJwKyspOworCWZpZC0+dm5vZGUJCT0gbnRvaGwoKmJwKyspOworCWZpZC0+dW5pcXVlCQk9IG50b2hsKCpicCsrKTsKKwkqX2JwID0gYnA7Cit9CisKIC8qCi0gKiBnZXQgdGhlIHJvb3Qgdm9sdW1lIG5hbWUgZnJvbSBhIGZpbGVzZXJ2ZXIKLSAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKiBkZWNvZGUgYW4gQUZTRmV0Y2hTdGF0dXMgYmxvY2sKICAqLwotI2lmIDAKLWludCBhZnNfcnhmc19nZXRfcm9vdF92b2x1bWUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgY2hhciAqYnVmLCBzaXplX3QgKmJ1ZmxlbikKK3N0YXRpYyB2b2lkIHhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoY29uc3QgX19iZTMyICoqX2JwLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKnN0YXR1cywKKwkJCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzJdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JdTMyIHBhcmFtWzFdOworCWNvbnN0IF9fYmUzMiAqYnAgPSAqX2JwOworCXVtb2RlX3QgbW9kZTsKKwl1NjQgZGF0YV92ZXJzaW9uLCBzaXplOworCXUzMiBjaGFuZ2VkID0gMDsgLyogYmVjb21lcyBub24temVybyBpZiBjdGltZS10eXBlIGNoYW5nZXMgc2VlbiAqLwogCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKyNkZWZpbmUgRVhUUkFDVChEU1QpCQkJCVwKKwlkbyB7CQkJCQlcCisJCXUzMiB4ID0gbnRvaGwoKmJwKyspOwkJXAorCQljaGFuZ2VkIHw9IERTVCAtIHg7CQlcCisJCURTVCA9IHg7CQkJXAorCX0gd2hpbGUgKDApCiAKLQlrZW50ZXIoIiVwLCVwLCV1IixzZXJ2ZXIsIGJ1ZiwgKmJ1Zmxlbik7CisJc3RhdHVzLT5pZl92ZXJzaW9uID0gbnRvaGwoKmJwKyspOworCUVYVFJBQ1Qoc3RhdHVzLT50eXBlKTsKKwlFWFRSQUNUKHN0YXR1cy0+bmxpbmspOworCXNpemUgPSBudG9obCgqYnArKyk7CisJZGF0YV92ZXJzaW9uID0gbnRvaGwoKmJwKyspOworCUVYVFJBQ1Qoc3RhdHVzLT5hdXRob3IpOworCUVYVFJBQ1Qoc3RhdHVzLT5vd25lcik7CisJRVhUUkFDVChzdGF0dXMtPmNhbGxlcl9hY2Nlc3MpOyAvKiBjYWxsIHRpY2tldCBkZXBlbmRlbnQgKi8KKwlFWFRSQUNUKHN0YXR1cy0+YW5vbl9hY2Nlc3MpOworCUVYVFJBQ1Qoc3RhdHVzLT5tb2RlKTsKKwlFWFRSQUNUKHN0YXR1cy0+cGFyZW50LnZub2RlKTsKKwlFWFRSQUNUKHN0YXR1cy0+cGFyZW50LnVuaXF1ZSk7CisJYnArKzsgLyogc2VnIHNpemUgKi8KKwlzdGF0dXMtPm10aW1lX2NsaWVudCA9IG50b2hsKCpicCsrKTsKKwlzdGF0dXMtPm10aW1lX3NlcnZlciA9IG50b2hsKCpicCsrKTsKKwlFWFRSQUNUKHN0YXR1cy0+Z3JvdXApOworCWJwKys7IC8qIHN5bmMgY291bnRlciAqLworCWRhdGFfdmVyc2lvbiB8PSAodTY0KSBudG9obCgqYnArKykgPDwgMzI7CisJYnArKzsgLyogbG9jayBjb3VudCAqLworCXNpemUgfD0gKHU2NCkgbnRvaGwoKmJwKyspIDw8IDMyOworCWJwKys7IC8qIHNwYXJlIDQgKi8KKwkqX2JwID0gYnA7CiAKLQkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47CisJaWYgKHNpemUgIT0gc3RhdHVzLT5zaXplKSB7CisJCXN0YXR1cy0+c2l6ZSA9IHNpemU7CisJCWNoYW5nZWQgfD0gdHJ1ZTsKIAl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTR0VUUk9PVFZPTFVNRTsKKwlzdGF0dXMtPm1vZGUgJj0gU19JQUxMVUdPOwogCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlfZGVidWcoInZub2RlIHRpbWUgJWx4LCAlbHgiLAorCSAgICAgICBzdGF0dXMtPm10aW1lX2NsaWVudCwgc3RhdHVzLT5tdGltZV9zZXJ2ZXIpOwogCi0JLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlwYXJhbVswXSA9IGh0b25sKEZTR0VUUk9PVFZPTFVNRSk7CisJaWYgKHZub2RlKSB7CisJCXN0YXR1cy0+cGFyZW50LnZpZCA9IHZub2RlLT5maWQudmlkOworCQlpZiAoY2hhbmdlZCAmJiAhdGVzdF9iaXQoQUZTX1ZOT0RFX1VOU0VULCAmdm5vZGUtPmZsYWdzKSkgeworCQkJX2RlYnVnKCJ2bm9kZSBjaGFuZ2VkIik7CisJCQlpX3NpemVfd3JpdGUoJnZub2RlLT52ZnNfaW5vZGUsIHNpemUpOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX3VpZCA9IHN0YXR1cy0+b3duZXI7CisJCQl2bm9kZS0+dmZzX2lub2RlLmlfZ2lkID0gc3RhdHVzLT5ncm91cDsKKwkJCXZub2RlLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gdm5vZGUtPmZpZC51bmlxdWU7CisJCQl2bm9kZS0+dmZzX2lub2RlLmlfbmxpbmsgPSBzdGF0dXMtPm5saW5rOwogCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlmb3IgKDs7KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSAhPSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFkgfHwKLQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlyZXQgPSAtRUlOVFI7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlnb3RvIGFib3J0OwotCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87Ci0JCWtkZWJ1ZygiR290IEVycm9yOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfR09UX1JFUExZOgotCQkvKiByZWFkIHRoZSByZXBseSAqLwotCQlrZGVidWcoIkdvdCBSZXBseTogcXR5PSVkIiwgY2FsbC0+YXBwX3JlYWR5X3F0eSk7Ci0KLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWlmIChjYWxsLT5hcHBfcmVhZHlfcXR5IDw9IDQpCi0JCQlnb3RvIGFib3J0OwotCi0JCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIE5VTEwsIGNhbGwtPmFwcF9yZWFkeV9xdHksIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gYWJvcnQ7Ci0KLSNpZiAwCi0JCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCi0JCWJwID0gYnVmZmVyOwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjU7IGxvb3ArKykKLQkJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCQllbnRyeS0+bmFtZVs2NF0gPSAwOwotCi0JCWVudHJ5LT50eXBlID0gbnRvaGwoKmJwKyspOwotCQllbnRyeS0+bnVtX3NlcnZlcnMgPSBudG9obCgqYnArKyk7Ci0KLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0KLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnBhcnRpdGlvbiA9IG50b2hsKCpicCsrKTsKLQotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQotCQkJZW50cnktPnNlcnZlcnNbbG9vcF0uZmxhZ3MgPSBudG9obCgqYnArKyk7Ci0KLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDM7IGxvb3ArKykKLQkJCWVudHJ5LT52b2x1bWVfaWRzW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCi0JCWVudHJ5LT5jbG9uZV9pZCA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPmZsYWdzID0gbnRvaGwoKmJwKTsKLSNlbmRpZgotCi0JCS8qIHN1Y2Nlc3MgKi8KLQkJcmV0ID0gMDsKLQkJZ290byBvdXRfdW53YWl0OwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfZnNjb25uKHNlcnZlciwgY29ubik7Ci0gb3V0OgotCWtsZWF2ZSgiIik7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19yeGZzX2dldF9yb290X3ZvbHVtZSgpICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHZvbHVtZQotICovCi0jaWYgMAotaW50IGFmc19yeGZzX2dldF92b2x1bWVfaW5mbyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBzdHJ1Y3QgYWZzX3ZvbHVtZV9pbmZvICp2aW5mbykKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzNdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JdTMyIHBhcmFtWzJdLCAqYnAsIHplcm87Ci0KLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwotCi0JX2VudGVyKCIlcCwlcywlcCIsIHNlcnZlciwgbmFtZSwgdmluZm8pOwotCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X2ZzY29ubihzZXJ2ZXIsICZjb25uKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCi0JcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4ZnNfYWVtYXAsICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOwotCX0KLQljYWxsLT5hcHBfb3Bjb2RlID0gRlNHRVRWT0xVTUVJTkZPOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGlvdlsxXS5pb3ZfbGVuID0gc3RybGVuKG5hbWUpOwotCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSBuYW1lOwotCi0JemVybyA9IDA7Ci0JcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKLQlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87Ci0KLQlwYXJhbVswXSA9IGh0b25sKEZTR0VUVk9MVU1FSU5GTyk7Ci0JcGFyYW1bMV0gPSBodG9ubChwaW92WzFdLmlvdl9sZW4pOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMywgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCA2NCk7Ci0KLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgNjQsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJCWdvdG8gb3V0X3Vud2FpdDsKKwkJCW1vZGUgPSB2bm9kZS0+dmZzX2lub2RlLmlfbW9kZTsKKwkJCW1vZGUgJj0gflNfSUFMTFVHTzsKKwkJCW1vZGUgfD0gc3RhdHVzLT5tb2RlOworCQkJYmFycmllcigpOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX21vZGUgPSBtb2RlOwogCQl9Ci0JCWdvdG8gYWJvcnQ7CisKKwkJdm5vZGUtPnZmc19pbm9kZS5pX2N0aW1lLnR2X3NlYwk9IHN0YXR1cy0+bXRpbWVfc2VydmVyOworCQl2bm9kZS0+dmZzX2lub2RlLmlfbXRpbWUJPSB2bm9kZS0+dmZzX2lub2RlLmlfY3RpbWU7CisJCXZub2RlLT52ZnNfaW5vZGUuaV9hdGltZQk9IHZub2RlLT52ZnNfaW5vZGUuaV9jdGltZTsKIAl9CiAKLQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCXZpbmZvLT52aWQgPSBudG9obCgqYnArKyk7Ci0JdmluZm8tPnR5cGUgPSBudG9obCgqYnArKyk7CisJaWYgKHN0YXR1cy0+ZGF0YV92ZXJzaW9uICE9IGRhdGFfdmVyc2lvbikgeworCQlzdGF0dXMtPmRhdGFfdmVyc2lvbiA9IGRhdGFfdmVyc2lvbjsKKwkJaWYgKHZub2RlICYmICF0ZXN0X2JpdChBRlNfVk5PREVfVU5TRVQsICZ2bm9kZS0+ZmxhZ3MpKSB7CisJCQlfZGVidWcoInZub2RlIG1vZGlmaWVkICVsbHggb24geyV4OiV1fSIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGF0YV92ZXJzaW9uLAorCQkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKwkJCXNldF9iaXQoQUZTX1ZOT0RFX01PRElGSUVELCAmdm5vZGUtPmZsYWdzKTsKKwkJCXNldF9iaXQoQUZTX1ZOT0RFX1pBUF9EQVRBLCAmdm5vZGUtPmZsYWdzKTsKKwkJfQorCX0KK30KIAotCXZpbmZvLT50eXBlX3ZpZHNbMF0gPSBudG9obCgqYnArKyk7Ci0JdmluZm8tPnR5cGVfdmlkc1sxXSA9IG50b2hsKCpicCsrKTsKLQl2aW5mby0+dHlwZV92aWRzWzJdID0gbnRvaGwoKmJwKyspOwotCXZpbmZvLT50eXBlX3ZpZHNbM10gPSBudG9obCgqYnArKyk7Ci0JdmluZm8tPnR5cGVfdmlkc1s0XSA9IG50b2hsKCpicCsrKTsKKy8qCisgKiBkZWNvZGUgYW4gQUZTQ2FsbEJhY2sgYmxvY2sKKyAqLworc3RhdGljIHZvaWQgeGRyX2RlY29kZV9BRlNDYWxsQmFjayhjb25zdCBfX2JlMzIgKipfYnAsIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCWNvbnN0IF9fYmUzMiAqYnAgPSAqX2JwOwogCi0JdmluZm8tPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOwotCXZpbmZvLT5zZXJ2ZXJzWzBdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0JdmluZm8tPnNlcnZlcnNbMV0uYWRkci5zX2FkZHIgPSAqYnArKzsKLQl2aW5mby0+c2VydmVyc1syXS5hZGRyLnNfYWRkciA9ICpicCsrOwotCXZpbmZvLT5zZXJ2ZXJzWzNdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0JdmluZm8tPnNlcnZlcnNbNF0uYWRkci5zX2FkZHIgPSAqYnArKzsKLQl2aW5mby0+c2VydmVyc1s1XS5hZGRyLnNfYWRkciA9ICpicCsrOwotCXZpbmZvLT5zZXJ2ZXJzWzZdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0JdmluZm8tPnNlcnZlcnNbN10uYWRkci5zX2FkZHIgPSAqYnArKzsKKwl2bm9kZS0+Y2JfdmVyc2lvbgk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+Y2JfZXhwaXJ5CT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl90eXBlCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+Y2JfZXhwaXJlcwk9IHZub2RlLT5jYl9leHBpcnkgKyBnZXRfc2Vjb25kcygpOworCSpfYnAgPSBicDsKK30KIAotCXJldCA9IC1FQkFETVNHOwotCWlmICh2aW5mby0+bnNlcnZlcnMgPiA4KQotCQlnb3RvIGFib3J0Oworc3RhdGljIHZvaWQgeGRyX2RlY29kZV9BRlNDYWxsQmFja19yYXcoY29uc3QgX19iZTMyICoqX2JwLAorCQkJCSAgICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYikKK3sKKwljb25zdCBfX2JlMzIgKmJwID0gKl9icDsKIAotCS8qIHN1Y2Nlc3MgKi8KLQlyZXQgPSAwOworCWNiLT52ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCWNiLT5leHBpcnkJPSBudG9obCgqYnArKyk7CisJY2ItPnR5cGUJPSBudG9obCgqYnArKyk7CisJKl9icCA9IGJwOworfQogCi0gb3V0X3Vud2FpdDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCWFmc19zZXJ2ZXJfcmVsZWFzZV9mc2Nvbm4oc2VydmVyLCBjb25uKTsKLSBvdXQ6Ci0JX2xlYXZlKCIiKTsKLQlyZXR1cm4gcmV0OworLyoKKyAqIGRlY29kZSBhbiBBRlNWb2xTeW5jIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIHhkcl9kZWNvZGVfQUZTVm9sU3luYyhjb25zdCBfX2JlMzIgKipfYnAsCisJCQkJICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpCit7CisJY29uc3QgX19iZTMyICpicCA9ICpfYnA7CiAKLSBhYm9ydDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCXNjaGVkdWxlKCk7Ci0JZ290byBvdXRfdW53YWl0OworCXZvbHN5bmMtPmNyZWF0aW9uID0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCWJwKys7IC8qIHNwYXJlNSAqLworCWJwKys7IC8qIHNwYXJlNiAqLworCSpfYnAgPSBicDsKK30KIAotfSAvKiBlbmQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKCkgKi8KLSNlbmRpZgorLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaFN0YXR1cworICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OworCWNvbnN0IF9fYmUzMiAqYnA7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlfZW50ZXIoIiwsJXUiLCBsYXN0KTsKKworCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpCisJCXJldHVybiAtRUJBRE1TRzsKKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSk7CisJeGRyX2RlY29kZV9BRlNDYWxsQmFjaygmYnAsIHZub2RlKTsKKwlpZiAoY2FsbC0+cmVwbHkyKQorCQl4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseTIpOworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuRmV0Y2hTdGF0dXMgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTRmV0Y2hTdGF0dXMgPSB7CisJLm5hbWUJCT0gIkZTLkZldGNoU3RhdHVzIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX2ZldGNoX3N0YXR1cywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCiAvKgogICogZmV0Y2ggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlCiAgKi8KLWludCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJICAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkJICAgICAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYykKK2ludCBhZnNfZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgc3RydWN0IGtleSAqa2V5LAorCQkJICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCSAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQogewotCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBrdmVjIHBpb3ZbMV07Ci0Jc2l6ZV90IHNlbnQ7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CiAJX19iZTMyICpicDsKIAotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJX2VudGVyKCIsJXgseyV4OiVkfSwsIiwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CiAKLQlfZW50ZXIoIiVwLHsldSwldSwldX0iLAotCSAgICAgICBzZXJ2ZXIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTRmV0Y2hTdGF0dXMsIDE2LCAoMjEgKyAzICsgNikgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOwogCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNhbGxzbG90LmNvbm4sIE5VTEwsIE5VTEwsIGFmc19yeGZzX2FlbWFwLAotCQkJCSZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOwotCX0KLQljYWxsLT5hcHBfb3Bjb2RlID0gRlNGRVRDSFNUQVRVUzsKLQotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+cmVwbHkyID0gdm9sc3luYzsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOwogCiAJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAxNik7CisJYnAgPSBjYWxsLT5yZXF1ZXN0OwogCWJwWzBdID0gaHRvbmwoRlNGRVRDSFNUQVRVUyk7CiAJYnBbMV0gPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CiAJYnBbMl0gPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKIAlicFszXSA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKIAotCXBpb3ZbMF0uaW92X2xlbiA9IDE2OwotCXBpb3ZbMF0uaW92X2Jhc2UgPSBicDsKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KIAotCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLwotCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCi0JCQkJICAgIDAsICZzZW50KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBhYm9ydDsKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuRmV0Y2hEYXRhCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKKwljb25zdCBfX2JlMzIgKmJwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKmJ1ZmZlcjsKKwlpbnQgcmV0OwogCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMTIwKTsKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKIAotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAxMjAsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJCWdvdG8gb3V0X3Vud2FpdDsKKwlzd2l0Y2ggKGNhbGwtPnVubWFyc2hhbGwpIHsKKwljYXNlIDA6CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGxlbmd0aCAqLworCWNhc2UgMToKKwkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CiAJCX0KLQkJZ290byBhYm9ydDsKKworCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CisJCV9kZWJ1ZygiREFUQSBsZW5ndGg6ICV1IiwgY2FsbC0+Y291bnQpOworCQlpZiAoY2FsbC0+Y291bnQgPiBQQUdFX1NJWkUpCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQlpZiAoY2FsbC0+Y291bnQgPCBQQUdFX1NJWkUpIHsKKwkJCWJ1ZmZlciA9IGttYXBfYXRvbWljKGNhbGwtPnJlcGx5MywgS01fVVNFUjApOworCQkJbWVtc2V0KGJ1ZmZlciArIFBBR0VfU0laRSAtIGNhbGwtPmNvdW50LCAwLAorCQkJICAgICAgIGNhbGwtPmNvdW50KTsKKwkJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9VU0VSMCk7CisJCX0KKworCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhICovCisJY2FzZSAyOgorCQlfZGVidWcoImV4dHJhY3QgZGF0YSIpOworCQlwYWdlID0gY2FsbC0+cmVwbHkzOworCQlidWZmZXIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBidWZmZXIsIGNhbGwtPmNvdW50KTsKKwkJa3VubWFwX2F0b21pYyhidWZmZXIsIEtNX1VTRVIwKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJLyogZXh0cmFjdCB0aGUgbWV0YWRhdGEgKi8KKwljYXNlIDM6CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgICgyMSArIDMgKyA2KSAqIDQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQlicmVhazsKKwkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKKwkJZGVmYXVsdDoJcmV0dXJuIHJldDsKKwkJfQorCisJCWJwID0gY2FsbC0+YnVmZmVyOworCQl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgJnZub2RlLT5zdGF0dXMsIHZub2RlKTsKKwkJeGRyX2RlY29kZV9BRlNDYWxsQmFjaygmYnAsIHZub2RlKTsKKwkJaWYgKGNhbGwtPnJlcGx5MikKKwkJCXhkcl9kZWNvZGVfQUZTVm9sU3luYygmYnAsIGNhbGwtPnJlcGx5Mik7CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSA0OgorCQlfZGVidWcoInRyYWlsZXIiKTsKKwkJaWYgKHNrYi0+bGVuICE9IDApCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWJyZWFrOwogCX0KIAotCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCi0Jdm5vZGUtPnN0YXR1cy5pZl92ZXJzaW9uCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnZpZAk9IHZub2RlLT5maWQudmlkOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKLQlicCsrOyAvKiBzZWcgc2l6ZSAqLwotCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIGdyb3VwICovCi0JYnArKzsgLyogc3luYyBjb3VudGVyICovCi0Jdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOwotCWJwKys7IC8qIHNwYXJlMiAqLwotCWJwKys7IC8qIHNwYXJlMyAqLwotCWJwKys7IC8qIHNwYXJlNCAqLworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CiAKLQl2bm9kZS0+Y2JfdmVyc2lvbgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPmNiX2V4cGlyeQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPmNiX3R5cGUJCQk9IG50b2hsKCpicCsrKTsKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CiAKLQlpZiAodm9sc3luYykgewotCQl2b2xzeW5jLT5jcmVhdGlvbgk9IG50b2hsKCpicCsrKTsKLQkJYnArKzsgLyogc3BhcmUyICovCi0JCWJwKys7IC8qIHNwYXJlMyAqLwotCQlicCsrOyAvKiBzcGFyZTQgKi8KLQkJYnArKzsgLyogc3BhcmU1ICovCi0JCWJwKys7IC8qIHNwYXJlNiAqLwotCX0KLQotCS8qIHN1Y2Nlc3MgKi8KLQlyZXQgPSAwOwotCi0gb3V0X3Vud2FpdDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCWFmc19zZXJ2ZXJfcmVsZWFzZV9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Ci0gb3V0OgotCV9sZWF2ZSgiIik7Ci0JcmV0dXJuIHJldDsKLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQlnb3RvIG91dF91bndhaXQ7Ci19IC8qIGVuZCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cygpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBmZXRjaCB0aGUgY29udGVudHMgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeQorICogRlMuRmV0Y2hEYXRhIG9wZXJhdGlvbiB0eXBlCiAgKi8KLWludCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkgICAgIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjLAotCQkJICAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNGZXRjaERhdGEgPSB7CisJLm5hbWUJCT0gIkZTLkZldGNoRGF0YSIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19mZXRjaF9kYXRhLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBmZXRjaCBkYXRhIGZyb20gYSBmaWxlCisgKi8KK2ludCBhZnNfZnNfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICAgICBvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgsCisJCSAgICAgIHN0cnVjdCBwYWdlICpidWZmZXIsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCiB7Ci0Jc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgY2FsbHNsb3Q7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IGt2ZWMgcGlvdlsxXTsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0OworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKIAlfX2JlMzIgKmJwOwogCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKwlfZW50ZXIoIiIpOwogCi0JX2VudGVyKCIlcCx7ZmlkPXsldSwldSwldX0sc3o9JVp1LG9mPSVsdX0iLAotCSAgICAgICBzZXJ2ZXIsCi0JICAgICAgIGRlc2MtPmZpZC52aWQsCi0JICAgICAgIGRlc2MtPmZpZC52bm9kZSwKLQkgICAgICAgZGVzYy0+ZmlkLnVuaXF1ZSwKLQkgICAgICAgZGVzYy0+c2l6ZSwKLQkgICAgICAgZGVzYy0+b2Zmc2V0KTsKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNGZXRjaERhdGEsIDI0LCAoMjEgKyAzICsgNikgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOwogCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNhbGxzbG90LmNvbm4sIE5VTEwsIE5VTEwsIGFmc19yeGZzX2FlbWFwLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9wdXRfY29ubjsKLQl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTRkVUQ0hEQVRBOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5yZXBseTIgPSBOVUxMOyAvKiB2b2xzeW5jICovCisJY2FsbC0+cmVwbHkzID0gYnVmZmVyOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CiAKIAkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLwotCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDI0KTsKKwlicCA9IGNhbGwtPnJlcXVlc3Q7CiAJYnBbMF0gPSBodG9ubChGU0ZFVENIREFUQSk7Ci0JYnBbMV0gPSBodG9ubChkZXNjLT5maWQudmlkKTsKLQlicFsyXSA9IGh0b25sKGRlc2MtPmZpZC52bm9kZSk7Ci0JYnBbM10gPSBodG9ubChkZXNjLT5maWQudW5pcXVlKTsKLQlicFs0XSA9IGh0b25sKGRlc2MtPm9mZnNldCk7Ci0JYnBbNV0gPSBodG9ubChkZXNjLT5zaXplKTsKKwlicFsxXSA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwlicFsyXSA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCWJwWzNdID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCWJwWzRdID0gaHRvbmwob2Zmc2V0KTsKKwlicFs1XSA9IGh0b25sKGxlbmd0aCk7CiAKLQlwaW92WzBdLmlvdl9sZW4gPSAyNDsKLQlwaW92WzBdLmlvdl9iYXNlID0gYnA7CisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CiAKLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgZGF0YSBjb3VudCB0byBhcnJpdmUgKi8KLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgNCwgUlhSUENfQ0FMTF9SRUFEX0JMT0NLKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByZWFkX2ZhaWxlZDsKLQotCWRlc2MtPmFjdHVhbCA9IG50b2hsKGJwWzBdKTsKLQlpZiAoZGVzYy0+YWN0dWFsICE9IGRlc2MtPnNpemUpIHsKLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWdvdG8gYWJvcnQ7Ci0JfQotCi0JLyogY2FsbCB0aGUgYXBwIHRvIHJlYWQgdGhlIGFjdHVhbCBkYXRhICovCi0JcnhycGNfY2FsbF9yZXNldF9zY3JhdGNoKGNhbGwpOwotCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgZGVzYy0+YnVmZmVyLCBkZXNjLT5hY3R1YWwsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByZWFkX2ZhaWxlZDsKLQotCS8qIHdhaXQgZm9yIHRoZSByZXN0IG9mIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLwotCXJ4cnBjX2NhbGxfcmVzZXRfc2NyYXRjaChjYWxsKTsKLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAxMjApOwotCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDEyMCwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHJlYWRfZmFpbGVkOwotCi0JLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KLQl2bm9kZS0+c3RhdHVzLmlmX3ZlcnNpb24JPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm5saW5rCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnNpemUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5hdXRob3IJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMub3duZXIJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudmlkCT0gZGVzYy0+ZmlkLnZpZDsKLQl2bm9kZS0+c3RhdHVzLnBhcmVudC52bm9kZQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnBhcmVudC51bmlxdWUJPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogc2VnIHNpemUgKi8KLQl2bm9kZS0+c3RhdHVzLm10aW1lX2NsaWVudAk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm10aW1lX3NlcnZlcgk9IG50b2hsKCpicCsrKTsKLQlicCsrOyAvKiBncm91cCAqLwotCWJwKys7IC8qIHN5bmMgY291bnRlciAqLwotCXZub2RlLT5zdGF0dXMudmVyc2lvbiB8PSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgbnRvaGwoKmJwKyspKSA8PCAzMjsKLQlicCsrOyAvKiBzcGFyZTIgKi8KLQlicCsrOyAvKiBzcGFyZTMgKi8KLQlicCsrOyAvKiBzcGFyZTQgKi8KLQotCXZub2RlLT5jYl92ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+Y2JfZXhwaXJ5CQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+Y2JfdHlwZQkJCT0gbnRvaGwoKmJwKyspOwotCi0JaWYgKHZvbHN5bmMpIHsKLQkJdm9sc3luYy0+Y3JlYXRpb24JPSBudG9obCgqYnArKyk7Ci0JCWJwKys7IC8qIHNwYXJlMiAqLwotCQlicCsrOyAvKiBzcGFyZTMgKi8KLQkJYnArKzsgLyogc3BhcmU0ICovCi0JCWJwKys7IC8qIHNwYXJlNSAqLwotCQlicCsrOyAvKiBzcGFyZTYgKi8KLQl9Ci0KLQkvKiBzdWNjZXNzICovCi0JcmV0ID0gMDsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCWFmc19zZXJ2ZXJfcmVsZWFzZV9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Ci0gb3V0OgotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLSByZWFkX2ZhaWxlZDoKLQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQlnb3RvIG91dF91bndhaXQ7Ci0JfQotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKLQotfSAvKiBlbmQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGFzayB0aGUgQUZTIGZpbGVzZXJ2ZXIgdG8gZGlzY2FyZCBhIGNhbGxiYWNrIHJlcXVlc3Qgb24gYSBmaWxlCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuR2l2ZVVwQ2FsbEJhY2tzCiAgKi8KLWludCBhZnNfcnhmc19naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZ2l2ZV91cF9jYWxsYmFja3Moc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQogewotCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBrdmVjIHBpb3ZbMV07Ci0Jc2l6ZV90IHNlbnQ7Ci0JaW50IHJldDsKLQlfX2JlMzIgKmJwOworCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CiAKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCWlmIChza2ItPmxlbiA+IDApCisJCXJldHVybiAtRUJBRE1TRzsgLyogc2hvdWxkbid0IGJlIGFueSByZXBseSBkYXRhICovCisJcmV0dXJuIDA7Cit9CiAKLQlfZW50ZXIoIiVwLHsldSwldSwldX0iLAotCSAgICAgICBzZXJ2ZXIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CisvKgorICogRlMuR2l2ZVVwQ2FsbEJhY2tzIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU0dpdmVVcENhbGxCYWNrcyA9IHsKKwkubmFtZQkJPSAiRlMuR2l2ZVVwQ2FsbEJhY2tzIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX2dpdmVfdXBfY2FsbGJhY2tzLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CiAKLQkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisvKgorICogZ2l2ZSB1cCBhIHNldCBvZiBjYWxsYmFja3MKKyAqIC0gdGhlIGNhbGxiYWNrcyBhcmUgaGVsZCBpbiB0aGUgc2VydmVyLT5jYl9icmVhayByaW5nCisgKi8KK2ludCBhZnNfZnNfZ2l2ZV91cF9jYWxsYmFja3Moc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJc2l6ZV90IG5jYWxsYmFja3M7CisJX19iZTMyICpicCwgKnRwOworCWludCBsb29wOwogCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNhbGxzbG90LmNvbm4sIE5VTEwsIE5VTEwsIGFmc19yeGZzX2FlbWFwLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9wdXRfY29ubjsKLQl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTR0lWRVVQQ0FMTEJBQ0tTOworCW5jYWxsYmFja3MgPSBDSVJDX0NOVChzZXJ2ZXItPmNiX2JyZWFrX2hlYWQsIHNlcnZlci0+Y2JfYnJlYWtfdGFpbCwKKwkJCSAgICAgIEFSUkFZX1NJWkUoc2VydmVyLT5jYl9icmVhaykpOwogCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlfZW50ZXIoInslenV9LCIsIG5jYWxsYmFja3MpOworCisJaWYgKG5jYWxsYmFja3MgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG5jYWxsYmFja3MgPiBBRlNDQk1BWCkKKwkJbmNhbGxiYWNrcyA9IEFGU0NCTUFYOworCisJX2RlYnVnKCJicmVhayAlenUgY2FsbGJhY2tzIiwgbmNhbGxiYWNrcyk7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNHaXZlVXBDYWxsQmFja3MsCisJCQkJICAgMTIgKyBuY2FsbGJhY2tzICogNiAqIDQsIDApOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOwogCiAJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAoMSArIDQgKyA0KSAqIDQpOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gKDEgKyA0ICsgNCkgKiA0OwotCXBpb3ZbMF0uaW92X2Jhc2UgPSBicDsKLQorCWJwID0gY2FsbC0+cmVxdWVzdDsKKwl0cCA9IGJwICsgMiArIG5jYWxsYmFja3MgKiAzOwogCSpicCsrID0gaHRvbmwoRlNHSVZFVVBDQUxMQkFDS1MpOwotCSpicCsrID0gaHRvbmwoMSk7CisJKmJwKysgPSBodG9ubChuY2FsbGJhY2tzKTsKKwkqdHArKyA9IGh0b25sKG5jYWxsYmFja3MpOworCisJYXRvbWljX3N1YihuY2FsbGJhY2tzLCAmc2VydmVyLT5jYl9icmVha19uKTsKKwlmb3IgKGxvb3AgPSBuY2FsbGJhY2tzOyBsb29wID4gMDsgbG9vcC0tKSB7CisJCXN0cnVjdCBhZnNfY2FsbGJhY2sgKmNiID0KKwkJCSZzZXJ2ZXItPmNiX2JyZWFrW3NlcnZlci0+Y2JfYnJlYWtfdGFpbF07CisKKwkJKmJwKysgPSBodG9ubChjYi0+ZmlkLnZpZCk7CisJCSpicCsrID0gaHRvbmwoY2ItPmZpZC52bm9kZSk7CisJCSpicCsrID0gaHRvbmwoY2ItPmZpZC51bmlxdWUpOworCQkqdHArKyA9IGh0b25sKGNiLT52ZXJzaW9uKTsKKwkJKnRwKysgPSBodG9ubChjYi0+ZXhwaXJ5KTsKKwkJKnRwKysgPSBodG9ubChjYi0+dHlwZSk7CisJCXNtcF9tYigpOworCQlzZXJ2ZXItPmNiX2JyZWFrX3RhaWwgPQorCQkJKHNlcnZlci0+Y2JfYnJlYWtfdGFpbCArIDEpICYKKwkJCShBUlJBWV9TSVpFKHNlcnZlci0+Y2JfYnJlYWspIC0gMSk7CisJfQorCisJQVNTRVJUKG5jYWxsYmFja3MgPiAwKTsKKwl3YWtlX3VwX25yKCZzZXJ2ZXItPmNiX2JyZWFrX3dhaXRxLCBuY2FsbGJhY2tzKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkNyZWF0ZUZpbGUgb3IgYW4gRlMuTWFrZURpcgorICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2NyZWF0ZV92bm9kZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OworCWNvbnN0IF9fYmUzMiAqYnA7CisKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKworCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpCisJCXJldHVybiAtRUJBRE1TRzsKKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJeGRyX2RlY29kZV9BRlNGaWQoJmJwLCBjYWxsLT5yZXBseTIpOworCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCBjYWxsLT5yZXBseTMsIE5VTEwpOworCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCAmdm5vZGUtPnN0YXR1cywgdm5vZGUpOworCXhkcl9kZWNvZGVfQUZTQ2FsbEJhY2tfcmF3KCZicCwgY2FsbC0+cmVwbHk0KTsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuQ3JlYXRlRmlsZSBhbmQgRlMuTWFrZURpciBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNDcmVhdGVYWFhYID0geworCS5uYW1lCQk9ICJGUy5DcmVhdGVYWFhYIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX2NyZWF0ZV92bm9kZSwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogY3JlYXRlIGEgZmlsZSBvciBtYWtlIGEgZGlyZWN0b3J5CisgKi8KK2ludCBhZnNfZnNfY3JlYXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgc3RydWN0IGtleSAqa2V5LAorCQkgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgdW1vZGVfdCBtb2RlLAorCQkgIHN0cnVjdCBhZnNfZmlkICpuZXdmaWQsCisJCSAgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqbmV3c3RhdHVzLAorCQkgIHN0cnVjdCBhZnNfY2FsbGJhY2sgKm5ld2NiLAorCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCBuYW1lc3osIHJlcXN6LCBwYWRzejsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCW5hbWVzeiA9IHN0cmxlbihuYW1lKTsKKwlwYWRzeiA9ICg0IC0gKG5hbWVzeiAmIDMpKSAmIDM7CisJcmVxc3ogPSAoNSAqIDQpICsgbmFtZXN6ICsgcGFkc3ogKyAoNiAqIDQpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTQ3JlYXRlWFhYWCwgcmVxc3osCisJCQkJICAgKDMgKyAyMSArIDIxICsgMyArIDYpICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnJlcGx5MiA9IG5ld2ZpZDsKKwljYWxsLT5yZXBseTMgPSBuZXdzdGF0dXM7CisJY2FsbC0+cmVwbHk0ID0gbmV3Y2I7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoU19JU0RJUihtb2RlKSA/IEZTTUFLRURJUiA6IEZTQ1JFQVRFRklMRSk7CiAJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CiAJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKIAkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKLQkqYnArKyA9IGh0b25sKDEpOwotCSpicCsrID0gaHRvbmwodm5vZGUtPmNiX3ZlcnNpb24pOwotCSpicCsrID0gaHRvbmwodm5vZGUtPmNiX2V4cGlyeSk7Ci0JKmJwKysgPSBodG9ubCh2bm9kZS0+Y2JfdHlwZSk7Ci0KLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlmb3IgKDs7KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSAhPSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFkgfHwKLQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0JCXNjaGVkdWxlKCk7CisJKmJwKysgPSBodG9ubChuYW1lc3opOworCW1lbWNweShicCwgbmFtZSwgbmFtZXN6KTsKKwlicCA9ICh2b2lkICopIGJwICsgbmFtZXN6OworCWlmIChwYWRzeiA+IDApIHsKKwkJbWVtc2V0KGJwLCAwLCBwYWRzeik7CisJCWJwID0gKHZvaWQgKikgYnAgKyBwYWRzejsKIAl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkqYnArKyA9IGh0b25sKEFGU19TRVRfTU9ERSk7CisJKmJwKysgPSAwOyAvKiBtdGltZSAqLworCSpicCsrID0gMDsgLyogb3duZXIgKi8KKwkqYnArKyA9IDA7IC8qIGdyb3VwICovCisJKmJwKysgPSBodG9ubChtb2RlICYgU19JQUxMVUdPKTsgLyogdW5peCBtb2RlICovCisJKmJwKysgPSAwOyAvKiBzZWdtZW50IHNpemUgKi8KIAotCXJldCA9IC1FSU5UUjsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWdvdG8gYWJvcnQ7CisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CiAKLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJZ290byBvdXRfdW53YWl0OwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOwotIG91dDoKLQlfbGVhdmUoIiIpOwotCXJldHVybiByZXQ7Ci0KLSBhYm9ydDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCXNjaGVkdWxlKCk7Ci0JZ290byBvdXRfdW53YWl0OwotfSAvKiBlbmQgYWZzX3J4ZnNfZ2l2ZV91cF9jYWxsYmFjaygpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBsb29rIGEgZmlsZW5hbWUgdXAgaW4gYSBkaXJlY3RvcnkKLSAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuUmVtb3ZlRmlsZSBvciBGUy5SZW1vdmVEaXIKICAqLwotI2lmIDAKLWludCBhZnNfcnhmc19sb29rdXAoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKmRpciwKLQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCSAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzNdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JdTMyICpicCwgemVybzsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OworCWNvbnN0IF9fYmUzMiAqYnA7CiAKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOwogCi0Ja2VudGVyKCIlcCx7JXUsJXUsJXV9LCVzIiwKLQkgICAgICAgc2VydmVyLCBmaWQtPnZpZCwgZmlkLT52bm9kZSwgZmlkLT51bmlxdWUsIGZpbGVuYW1lKTsKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOwogCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X2ZzY29ubihzZXJ2ZXIsICZjb25uKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CiAKLQkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCi0JcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4ZnNfYWVtYXAsICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOwotCX0KLQljYWxsLT5hcHBfb3Bjb2RlID0gRlNMT09LVVA7CisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KKwlicCA9IGNhbGwtPmJ1ZmZlcjsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgJnZub2RlLT5zdGF0dXMsIHZub2RlKTsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLwogCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCZteXNlbGYpOworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLlJlbW92ZURpci9GUy5SZW1vdmVGaWxlIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU1JlbW92ZVhYWFggPSB7CisJLm5hbWUJCT0gIkZTLlJlbW92ZVhYWFgiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfcmVtb3ZlLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiByZW1vdmUgYSBmaWxlIG9yIGRpcmVjdG9yeQorICovCitpbnQgYWZzX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgIHN0cnVjdCBrZXkgKmtleSwKKwkJICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICBjb25zdCBjaGFyICpuYW1lLAorCQkgIGJvb2wgaXNkaXIsCisJCSAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJc2l6ZV90IG5hbWVzeiwgcmVxc3osIHBhZHN6OworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJbmFtZXN6ID0gc3RybGVuKG5hbWUpOworCXBhZHN6ID0gKDQgLSAobmFtZXN6ICYgMykpICYgMzsKKwlyZXFzeiA9ICg1ICogNCkgKyBuYW1lc3ogKyBwYWRzejsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU1JlbW92ZVhYWFgsIHJlcXN6LCAoMjEgKyA2KSAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOwogCiAJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAyMCk7Ci0KLQl6ZXJvID0gMDsKLQotCXBpb3ZbMF0uaW92X2xlbiA9IDIwOwotCXBpb3ZbMF0uaW92X2Jhc2UgPSBicDsKLQlwaW92WzFdLmlvdl9sZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSBmaWxlbmFtZTsKLQlwaW92WzJdLmlvdl9sZW4gPSAoNCAtIChwaW92WzFdLmlvdl9sZW4gJiAzKSkgJiAzOwotCXBpb3ZbMl0uaW92X2Jhc2UgPSAmemVybzsKLQotCSpicCsrID0gaHRvbmwoRlNMT09LVVApOwotCSpicCsrID0gaHRvbmwoZGlyZmlkLT52aWQpOwotCSpicCsrID0gaHRvbmwoZGlyZmlkLT52bm9kZSk7Ci0JKmJwKysgPSBodG9ubChkaXJmaWQtPnVuaXF1ZSk7Ci0JKmJwKysgPSBodG9ubChwaW92WzFdLmlvdl9sZW4pOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMjIwKTsKLQotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAyMjAsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJCWdvdG8gb3V0X3Vud2FpdDsKLQkJfQotCQlnb3RvIGFib3J0OworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKGlzZGlyID8gRlNSRU1PVkVESVIgOiBGU1JFTU9WRUZJTEUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubChuYW1lc3opOworCW1lbWNweShicCwgbmFtZSwgbmFtZXN6KTsKKwlicCA9ICh2b2lkICopIGJwICsgbmFtZXN6OworCWlmIChwYWRzeiA+IDApIHsKKwkJbWVtc2V0KGJwLCAwLCBwYWRzeik7CisJCWJwID0gKHZvaWQgKikgYnAgKyBwYWRzejsKIAl9CiAKLQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCWZpZC0+dmlkCQk9IG50b2hsKCpicCsrKTsKLQlmaWQtPnZub2RlCQk9IG50b2hsKCpicCsrKTsKLQlmaWQtPnVuaXF1ZQkJPSBudG9obCgqYnArKyk7CisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CiAKLQl2bm9kZS0+c3RhdHVzLmlmX3ZlcnNpb24JPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm5saW5rCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnNpemUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5hdXRob3IJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMub3duZXIJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudmlkCT0gZGlyZmlkLT52aWQ7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudW5pcXVlCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIHNlZyBzaXplICovCi0Jdm5vZGUtPnN0YXR1cy5tdGltZV9jbGllbnQJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogZ3JvdXAgKi8KLQlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KLQl2bm9kZS0+c3RhdHVzLnZlcnNpb24gfD0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG50b2hsKCpicCsrKSkgPDwgMzI7Ci0JYnArKzsgLyogc3BhcmUyICovCi0JYnArKzsgLyogc3BhcmUzICovCi0JYnArKzsgLyogc3BhcmU0ICovCisvKgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkxpbmsKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19saW5rKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqZHZub2RlID0gY2FsbC0+cmVwbHksICp2bm9kZSA9IGNhbGwtPnJlcGx5MjsKKwljb25zdCBfX2JlMzIgKmJwOwogCi0JZGlyLT5zdGF0dXMuaWZfdmVyc2lvbgkJPSBudG9obCgqYnArKyk7Ci0JZGlyLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7Ci0JZGlyLT5zdGF0dXMubmxpbmsJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLnNpemUJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLmF1dGhvcgkJPSBudG9obCgqYnArKyk7Ci0JZGlyLT5zdGF0dXMub3duZXIJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7Ci0JZGlyLT5zdGF0dXMuYW5vbl9hY2Nlc3MJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLnBhcmVudC52aWQJCT0gZGlyZmlkLT52aWQ7Ci0JZGlyLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLnBhcmVudC51bmlxdWUJPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogc2VnIHNpemUgKi8KLQlkaXItPnN0YXR1cy5tdGltZV9jbGllbnQJPSBudG9obCgqYnArKyk7Ci0JZGlyLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIGdyb3VwICovCi0JYnArKzsgLyogc3luYyBjb3VudGVyICovCi0JZGlyLT5zdGF0dXMudmVyc2lvbiB8PSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgbnRvaGwoKmJwKyspKSA8PCAzMjsKLQlicCsrOyAvKiBzcGFyZTIgKi8KLQlicCsrOyAvKiBzcGFyZTMgKi8KLQlicCsrOyAvKiBzcGFyZTQgKi8KKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKIAotCWNhbGxiYWNrLT5maWQJCT0gKmZpZDsKLQljYWxsYmFjay0+dmVyc2lvbgk9IG50b2hsKCpicCsrKTsKLQljYWxsYmFjay0+ZXhwaXJ5CT0gbnRvaGwoKmJwKyspOwotCWNhbGxiYWNrLT50eXBlCQk9IG50b2hsKCpicCsrKTsKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOwogCi0JaWYgKHZvbHN5bmMpIHsKLQkJdm9sc3luYy0+Y3JlYXRpb24JPSBudG9obCgqYnArKyk7Ci0JCWJwKys7IC8qIHNwYXJlMiAqLwotCQlicCsrOyAvKiBzcGFyZTMgKi8KLQkJYnArKzsgLyogc3BhcmU0ICovCi0JCWJwKys7IC8qIHNwYXJlNSAqLwotCQlicCsrOyAvKiBzcGFyZTYgKi8KKwlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpCisJCXJldHVybiAtRUJBRE1TRzsKKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSk7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZkdm5vZGUtPnN0YXR1cywgZHZub2RlKTsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuTGluayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNMaW5rID0geworCS5uYW1lCQk9ICJGUy5MaW5rIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX2xpbmssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIG1ha2UgYSBoYXJkIGxpbmsKKyAqLworaW50IGFmc19mc19saW5rKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCXN0cnVjdCBrZXkgKmtleSwKKwkJc3RydWN0IGFmc192bm9kZSAqZHZub2RlLAorCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJc2l6ZV90IG5hbWVzeiwgcmVxc3osIHBhZHN6OworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJbmFtZXN6ID0gc3RybGVuKG5hbWUpOworCXBhZHN6ID0gKDQgLSAobmFtZXN6ICYgMykpICYgMzsKKwlyZXFzeiA9ICg1ICogNCkgKyBuYW1lc3ogKyBwYWRzeiArICgzICogNCk7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNMaW5rLCByZXFzeiwgKDIxICsgMjEgKyA2KSAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSBkdm5vZGU7CisJY2FsbC0+cmVwbHkyID0gdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoRlNMSU5LKTsKKwkqYnArKyA9IGh0b25sKGR2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubChkdm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubChkdm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwobmFtZXN6KTsKKwltZW1jcHkoYnAsIG5hbWUsIG5hbWVzeik7CisJYnAgPSAodm9pZCAqKSBicCArIG5hbWVzejsKKwlpZiAocGFkc3ogPiAwKSB7CisJCW1lbXNldChicCwgMCwgcGFkc3opOworCQlicCA9ICh2b2lkICopIGJwICsgcGFkc3o7CisJfQorCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TeW1saW5rCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3ltbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKKwljb25zdCBfX2JlMzIgKmJwOworCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCXhkcl9kZWNvZGVfQUZTRmlkKCZicCwgY2FsbC0+cmVwbHkyKTsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgY2FsbC0+cmVwbHkzLCBOVUxMKTsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgJnZub2RlLT5zdGF0dXMsIHZub2RlKTsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuU3ltbGluayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNTeW1saW5rID0geworCS5uYW1lCQk9ICJGUy5TeW1saW5rIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3N5bWxpbmssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsKKyAqLworaW50IGFmc19mc19zeW1saW5rKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgIGNvbnN0IGNoYXIgKmNvbnRlbnRzLAorCQkgICBzdHJ1Y3QgYWZzX2ZpZCAqbmV3ZmlkLAorCQkgICBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICpuZXdzdGF0dXMsCisJCSAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCBuYW1lc3osIHJlcXN6LCBwYWRzeiwgY19uYW1lc3osIGNfcGFkc3o7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwluYW1lc3ogPSBzdHJsZW4obmFtZSk7CisJcGFkc3ogPSAoNCAtIChuYW1lc3ogJiAzKSkgJiAzOworCisJY19uYW1lc3ogPSBzdHJsZW4oY29udGVudHMpOworCWNfcGFkc3ogPSAoNCAtIChjX25hbWVzeiAmIDMpKSAmIDM7CisKKwlyZXFzeiA9ICg2ICogNCkgKyBuYW1lc3ogKyBwYWRzeiArIGNfbmFtZXN6ICsgY19wYWRzeiArICg2ICogNCk7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNTeW1saW5rLCByZXFzeiwKKwkJCQkgICAoMyArIDIxICsgMjEgKyA2KSAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5yZXBseTIgPSBuZXdmaWQ7CisJY2FsbC0+cmVwbHkzID0gbmV3c3RhdHVzOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTU1lNTElOSyk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKwkqYnArKyA9IGh0b25sKG5hbWVzeik7CisJbWVtY3B5KGJwLCBuYW1lLCBuYW1lc3opOworCWJwID0gKHZvaWQgKikgYnAgKyBuYW1lc3o7CisJaWYgKHBhZHN6ID4gMCkgeworCQltZW1zZXQoYnAsIDAsIHBhZHN6KTsKKwkJYnAgPSAodm9pZCAqKSBicCArIHBhZHN6OworCX0KKwkqYnArKyA9IGh0b25sKGNfbmFtZXN6KTsKKwltZW1jcHkoYnAsIGNvbnRlbnRzLCBjX25hbWVzeik7CisJYnAgPSAodm9pZCAqKSBicCArIGNfbmFtZXN6OworCWlmIChjX3BhZHN6ID4gMCkgeworCQltZW1zZXQoYnAsIDAsIGNfcGFkc3opOworCQlicCA9ICh2b2lkICopIGJwICsgY19wYWRzejsKKwl9CisJKmJwKysgPSBodG9ubChBRlNfU0VUX01PREUpOworCSpicCsrID0gMDsgLyogbXRpbWUgKi8KKwkqYnArKyA9IDA7IC8qIG93bmVyICovCisJKmJwKysgPSAwOyAvKiBncm91cCAqLworCSpicCsrID0gaHRvbmwoU19JUldYVUdPKTsgLyogdW5peCBtb2RlICovCisJKmJwKysgPSAwOyAvKiBzZWdtZW50IHNpemUgKi8KKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlJlbmFtZQorICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqb3JpZ19kdm5vZGUgPSBjYWxsLT5yZXBseSwgKm5ld19kdm5vZGUgPSBjYWxsLT5yZXBseTI7CisJY29uc3QgX19iZTMyICpicDsKKworCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKKworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOworCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KKwlicCA9IGNhbGwtPmJ1ZmZlcjsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgJm9yaWdfZHZub2RlLT5zdGF0dXMsIG9yaWdfZHZub2RlKTsKKwlpZiAobmV3X2R2bm9kZSAhPSBvcmlnX2R2bm9kZSkKKwkJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZuZXdfZHZub2RlLT5zdGF0dXMsIG5ld19kdm5vZGUpOworCS8qIHhkcl9kZWNvZGVfQUZTVm9sU3luYygmYnAsIGNhbGwtPnJlcGx5WCk7ICovCisKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGUy5SZW5hbWUgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTUmVuYW1lID0geworCS5uYW1lCQk9ICJGUy5SZW5hbWUiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfcmVuYW1lLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rCisgKi8KK2ludCBhZnNfZnNfcmVuYW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgc3RydWN0IGtleSAqa2V5LAorCQkgIHN0cnVjdCBhZnNfdm5vZGUgKm9yaWdfZHZub2RlLAorCQkgIGNvbnN0IGNoYXIgKm9yaWdfbmFtZSwKKwkJICBzdHJ1Y3QgYWZzX3Zub2RlICpuZXdfZHZub2RlLAorCQkgIGNvbnN0IGNoYXIgKm5ld19uYW1lLAorCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCByZXFzeiwgb19uYW1lc3osIG9fcGFkc3osIG5fbmFtZXN6LCBuX3BhZHN6OworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJb19uYW1lc3ogPSBzdHJsZW4ob3JpZ19uYW1lKTsKKwlvX3BhZHN6ID0gKDQgLSAob19uYW1lc3ogJiAzKSkgJiAzOworCisJbl9uYW1lc3ogPSBzdHJsZW4obmV3X25hbWUpOworCW5fcGFkc3ogPSAoNCAtIChuX25hbWVzeiAmIDMpKSAmIDM7CisKKwlyZXFzeiA9ICg0ICogNCkgKworCQk0ICsgb19uYW1lc3ogKyBvX3BhZHN6ICsKKwkJKDMgKiA0KSArCisJCTQgKyBuX25hbWVzeiArIG5fcGFkc3o7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNSZW5hbWUsIHJlcXN6LCAoMjEgKyAyMSArIDYpICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IG9yaWdfZHZub2RlOworCWNhbGwtPnJlcGx5MiA9IG5ld19kdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoRlNSRU5BTUUpOworCSpicCsrID0gaHRvbmwob3JpZ19kdm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwob3JpZ19kdm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubChvcmlnX2R2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubChvX25hbWVzeik7CisJbWVtY3B5KGJwLCBvcmlnX25hbWUsIG9fbmFtZXN6KTsKKwlicCA9ICh2b2lkICopIGJwICsgb19uYW1lc3o7CisJaWYgKG9fcGFkc3ogPiAwKSB7CisJCW1lbXNldChicCwgMCwgb19wYWRzeik7CisJCWJwID0gKHZvaWQgKikgYnAgKyBvX3BhZHN6OwogCX0KIAotCS8qIHN1Y2Nlc3MgKi8KLQlyZXQgPSAwOworCSpicCsrID0gaHRvbmwobmV3X2R2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubChuZXdfZHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwobmV3X2R2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubChuX25hbWVzeik7CisJbWVtY3B5KGJwLCBuZXdfbmFtZSwgbl9uYW1lc3opOworCWJwID0gKHZvaWQgKikgYnAgKyBuX25hbWVzejsKKwlpZiAobl9wYWRzeiA+IDApIHsKKwkJbWVtc2V0KGJwLCAwLCBuX3BhZHN6KTsKKwkJYnAgPSAodm9pZCAqKSBicCArIG5fcGFkc3o7CisJfQogCi0gb3V0X3Vud2FpdDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCWFmc19zZXJ2ZXJfcmVsZWFzZV9mc2Nvbm4oc2VydmVyLCBjb25uKTsKLSBvdXQ6Ci0Ja2xlYXZlKCIiKTsKLQlyZXR1cm4gcmV0OwotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKLX0gLyogZW5kIGFmc19yeGZzX2xvb2t1cCgpICovCi0jZW5kaWYKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5oIGIvZnMvYWZzL2ZzY2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTNlNzQuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL2ZzY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBmc2NsaWVudC5oOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWIgZGVjbGFyYXRpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19GU0NMSUVOVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfRlNDTElFTlRfSAotCi0jaW5jbHVkZSAic2VydmVyLmgiCi0KLWV4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgIHN0cnVjdCBhZnNfdm9sdW1lX2luZm8gKnZpbmZvKTsKLQotZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkJCSAgICAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7Ci0KLXN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yIHsKLQlzdHJ1Y3QgYWZzX2ZpZAlmaWQ7CQkvKiBmaWxlIElEIHRvIGZldGNoICovCi0Jc2l6ZV90CQlzaXplOwkJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGZldGNoICovCi0Jb2ZmX3QJCW9mZnNldDsJCS8qIG9mZnNldCBpbiBmaWxlIHRvIHN0YXJ0IGZyb20gKi8KLQl2b2lkCQkqYnVmZmVyOwkvKiByZWFkIGJ1ZmZlciAqLwotCXNpemVfdAkJYWN0dWFsOwkJLyogYWN0dWFsIHNpemUgc2VudCBiYWNrIGJ5IHNlcnZlciAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkJICAgIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjLAotCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpOwotCi1leHRlcm4gaW50IGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKLQotLyogdGhpcyBkb2Vzbid0IGFwcGVhciB0byB3b3JrIGluIE9wZW5BRlMgc2VydmVyICovCi1leHRlcm4gaW50IGFmc19yeGZzX2xvb2t1cChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJICAgc3RydWN0IGFmc192bm9kZSAqZGlyLAotCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKLQkJCSAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7Ci0KLS8qIHRoaXMgaXMgYXBwYXJlbnRseSBtaXMtaW1wbGVtZW50ZWQgaW4gT3BlbkFGUyBzZXJ2ZXIgKi8KLWV4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICAgIGNoYXIgKmJ1ZiwKLQkJCQkgICAgc2l6ZV90ICpidWZsZW4pOwotCi0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0ZTQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbm9kZS5jIGIvZnMvYWZzL2lub2RlLmMKaW5kZXggOWQ5YmNhNi4uYzE4NGE0ZSAxMDA2NDQKLS0tIGEvZnMvYWZzL2lub2RlLmMKKysrIGIvZnMvYWZzL2lub2RlLmMKQEAgLTE5LDkgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAidm5vZGUuaCIKLSNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0cnVjdCBhZnNfaWdldF9kYXRhIHsKQEAgLTI5LDI2ICsyNiwyNSBAQAogCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7CS8qIHZvbHVtZSBvbiB3aGljaCByZXNpZGVzICovCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbWFwIHRoZSBBRlMgZmlsZSBzdGF0dXMgdG8gdGhlIGlub2RlIG1lbWJlciB2YXJpYWJsZXMKICAqLwotc3RhdGljIGludCBhZnNfaW5vZGVfbWFwX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3N0YXRpYyBpbnQgYWZzX2lub2RlX21hcF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gQUZTX1ZOT0RFX1RPX0kodm5vZGUpOwogCi0JX2RlYnVnKCJGUzogZnQ9JWQgbGs9JWQgc3o9JVp1IHZlcj0lTHUgbW9kPSVodSIsCisJX2RlYnVnKCJGUzogZnQ9JWQgbGs9JWQgc3o9JWxsdSB2ZXI9JUx1IG1vZD0laHUiLAogCSAgICAgICB2bm9kZS0+c3RhdHVzLnR5cGUsCiAJICAgICAgIHZub2RlLT5zdGF0dXMubmxpbmssCi0JICAgICAgIHZub2RlLT5zdGF0dXMuc2l6ZSwKLQkgICAgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB2bm9kZS0+c3RhdHVzLnNpemUsCisJICAgICAgIHZub2RlLT5zdGF0dXMuZGF0YV92ZXJzaW9uLAogCSAgICAgICB2bm9kZS0+c3RhdHVzLm1vZGUpOwogCiAJc3dpdGNoICh2bm9kZS0+c3RhdHVzLnR5cGUpIHsKIAljYXNlIEFGU19GVFlQRV9GSUxFOgogCQlpbm9kZS0+aV9tb2RlCT0gU19JRlJFRyB8IHZub2RlLT5zdGF0dXMubW9kZTsKIAkJaW5vZGUtPmlfb3AJPSAmYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfZm9wCT0gJmdlbmVyaWNfcm9fZm9wczsKKwkJaW5vZGUtPmlfZm9wCT0gJmFmc19maWxlX29wZXJhdGlvbnM7CiAJCWJyZWFrOwogCWNhc2UgQUZTX0ZUWVBFX0RJUjoKIAkJaW5vZGUtPmlfbW9kZQk9IFNfSUZESVIgfCB2bm9kZS0+c3RhdHVzLm1vZGU7CkBAIC03Nyw5ICs3Myw5IEBACiAKIAkvKiBjaGVjayB0byBzZWUgd2hldGhlciBhIHN5bWJvbGljIGxpbmsgaXMgcmVhbGx5IGEgbW91bnRwb2ludCAqLwogCWlmICh2bm9kZS0+c3RhdHVzLnR5cGUgPT0gQUZTX0ZUWVBFX1NZTUxJTkspIHsKLQkJYWZzX21udHB0X2NoZWNrX3N5bWxpbmsodm5vZGUpOworCQlhZnNfbW50cHRfY2hlY2tfc3ltbGluayh2bm9kZSwga2V5KTsKIAotCQlpZiAodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX01PVU5UUE9JTlQpIHsKKwkJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9NT1VOVFBPSU5ULCAmdm5vZGUtPmZsYWdzKSkgewogCQkJaW5vZGUtPmlfbW9kZQk9IFNfSUZESVIgfCB2bm9kZS0+c3RhdHVzLm1vZGU7CiAJCQlpbm9kZS0+aV9vcAk9ICZhZnNfbW50cHRfaW5vZGVfb3BlcmF0aW9uczsKIAkJCWlub2RlLT5pX2ZvcAk9ICZhZnNfbW50cHRfZmlsZV9vcGVyYXRpb25zOwpAQCAtODcsMzAgKzgzLDggQEAKIAl9CiAKIAlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19pbm9kZV9tYXBfc3RhdHVzKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGF0dGVtcHQgdG8gZmV0Y2ggdGhlIHN0YXR1cyBvZiBhbiBpbm9kZSwgY29lbGVzY2luZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMKLSAqIGZldGNoZXMKLSAqLwotc3RhdGljIGludCBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGFmc192bm9kZSAqdm5vZGU7Ci0JaW50IHJldDsKLQotCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOwotCi0JcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSk7Ci0KLQlpZiAocmV0ID09IDApCi0JCXJldCA9IGFmc19pbm9kZV9tYXBfc3RhdHVzKHZub2RlKTsKLQotCXJldHVybiByZXQ7Ci0KLX0gLyogZW5kIGFmc19pbm9kZV9mZXRjaF9zdGF0dXMoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaWdldDUoKSBjb21wYXJhdG9yCiAgKi8KQEAgLTEyMCw5ICs5NCw4IEBACiAKIAlyZXR1cm4gaW5vZGUtPmlfaW5vID09IGRhdGEtPmZpZC52bm9kZSAmJgogCQlpbm9kZS0+aV92ZXJzaW9uID09IGRhdGEtPmZpZC51bmlxdWU7Ci19IC8qIGVuZCBhZnNfaWdldDVfdGVzdCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpZ2V0NSgpIGlub2RlIGluaXRpYWxpc2VyCiAgKi8KQEAgLTEzNywxNCArMTEwLDE0IEBACiAJdm5vZGUtPnZvbHVtZSA9IGRhdGEtPnZvbHVtZTsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX2lnZXQ1X3NldCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbm9kZSByZXRyaWV2YWwKICAqLwotaW5saW5lIGludCBhZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYWZzX2ZpZCAqZmlkLAotCQkgICAgc3RydWN0IGlub2RlICoqX2lub2RlKQorc3RydWN0IGlub2RlICphZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgICBzdHJ1Y3QgYWZzX2ZpZCAqZmlkLCBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICpzdGF0dXMsCisJCSAgICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSBkYXRhID0geyAuZmlkID0gKmZpZCB9OwogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXM7CkBAIC0xNjEsMjAgKzEzNCwxOCBAQAogCQkJICAgICAmZGF0YSk7CiAJaWYgKCFpbm9kZSkgewogCQlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAorCV9kZWJ1ZygiR09UIElOT0RFICVwIHsgdmw9JXggdm49JXgsIHU9JXggfSIsCisJICAgICAgIGlub2RlLCBmaWQtPnZpZCwgZmlkLT52bm9kZSwgZmlkLT51bmlxdWUpOworCiAJdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CiAKIAkvKiBkZWFsIHdpdGggYW4gZXhpc3RpbmcgaW5vZGUgKi8KIAlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgewotCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlKTsKLQkJaWYgKHJldD09MCkKLQkJCSpfaW5vZGUgPSBpbm9kZTsKLQkJZWxzZQotCQkJaXB1dChpbm9kZSk7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQlfbGVhdmUoIiA9ICVwIiwgaW5vZGUpOworCQlyZXR1cm4gaW5vZGU7CiAJfQogCiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVApAQCAtMTg2LDEwMCArMTU3LDE4NSBAQAogCQkJICAgICAgICZ2bm9kZS0+Y2FjaGUpOwogI2VuZGlmCiAKLQkvKiBva2F5Li4uIGl0J3MgYSBuZXcgaW5vZGUgKi8KLQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7Ci0Jdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9DSEFOR0VEOwotCXJldCA9IGFmc19pbm9kZV9mZXRjaF9zdGF0dXMoaW5vZGUpOwotCWlmIChyZXQ8MCkKKwlpZiAoIXN0YXR1cykgeworCQkvKiBpdCdzIGEgcmVtb3RlbHkgZXh0YW50IGlub2RlICovCisJCXNldF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncyk7CisJCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUsIE5VTEwsIGtleSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBiYWRfaW5vZGU7CisJfSBlbHNlIHsKKwkJLyogaXQncyBhbiBpbm9kZSB3ZSBqdXN0IGNyZWF0ZWQgKi8KKwkJbWVtY3B5KCZ2bm9kZS0+c3RhdHVzLCBzdGF0dXMsIHNpemVvZih2bm9kZS0+c3RhdHVzKSk7CisKKwkJaWYgKCFjYikgeworCQkJLyogaXQncyBhIHN5bWxpbmsgd2UganVzdCBjcmVhdGVkICh0aGUgZmlsZXNlcnZlcgorCQkJICogZGlkbid0IGdpdmUgdXMgYSBjYWxsYmFjaykgKi8KKwkJCXZub2RlLT5jYl92ZXJzaW9uID0gMDsKKwkJCXZub2RlLT5jYl9leHBpcnkgPSAwOworCQkJdm5vZGUtPmNiX3R5cGUgPSAwOworCQkJdm5vZGUtPmNiX2V4cGlyZXMgPSBnZXRfc2Vjb25kcygpOworCQl9IGVsc2UgeworCQkJdm5vZGUtPmNiX3ZlcnNpb24gPSBjYi0+dmVyc2lvbjsKKwkJCXZub2RlLT5jYl9leHBpcnkgPSBjYi0+ZXhwaXJ5OworCQkJdm5vZGUtPmNiX3R5cGUgPSBjYi0+dHlwZTsKKwkJCXZub2RlLT5jYl9leHBpcmVzID0gdm5vZGUtPmNiX2V4cGlyeSArIGdldF9zZWNvbmRzKCk7CisJCX0KKwl9CisKKwlyZXQgPSBhZnNfaW5vZGVfbWFwX3N0YXR1cyh2bm9kZSwga2V5KTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBiYWRfaW5vZGU7CiAKIAkvKiBzdWNjZXNzICovCisJY2xlYXJfYml0KEFGU19WTk9ERV9VTlNFVCwgJnZub2RlLT5mbGFncyk7CisJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCi0JKl9pbm9kZSA9IGlub2RlOwotCV9sZWF2ZSgiID0gMCBbQ0IgeyB2PSV1IHg9JWx1IHQ9JXUgfV0iLAotCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKLQkgICAgICAgdm5vZGUtPmNiX3RpbWVvdXQudGltb19qaWYsCi0JICAgICAgIHZub2RlLT5jYl90eXBlKTsKLQlyZXR1cm4gMDsKKwlfbGVhdmUoIiA9ICVwIFtDQiB7IHY9JXUgdD0ldSB9XSIsIGlub2RlLCB2bm9kZS0+Y2JfdmVyc2lvbiwgdm5vZGUtPmNiX3R5cGUpOworCXJldHVybiBpbm9kZTsKIAogCS8qIGZhaWx1cmUgKi8KLSBiYWRfaW5vZGU6CitiYWRfaW5vZGU6CiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogCiAJX2xlYXZlKCIgPSAlZCBbYmFkXSIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19pZ2V0KCkgKi8KKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdmFsaWRhdGUgYSB2bm9kZS9pbm9kZQorICogLSB0aGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3Mgd2UgbmVlZCB0byBjaGVjaworICogICAtIHBhcmVudCBkaXIgZGF0YSBjaGFuZ2VzIChybSwgcm1kaXIsIHJlbmFtZSwgbWtkaXIsIGNyZWF0ZSwgbGluaywKKyAqICAgICBzeW1saW5rKQorICogICAtIHBhcmVudCBkaXIgbWV0YWRhdGEgY2hhbmdlZCAoc2VjdXJpdHkgY2hhbmdlcykKKyAqICAgLSBkZW50cnkgZGF0YSBjaGFuZ2VkICh3cml0ZSwgdHJ1bmNhdGUpCisgKiAgIC0gZGVudHJ5IG1ldGFkYXRhIGNoYW5nZWQgKHNlY3VyaXR5IGNoYW5nZXMpCisgKi8KK2ludCBhZnNfdmFsaWRhdGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKK3sKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7dj17JXg6JXV9IGZsPSVseH0sJXgiLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZsYWdzLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOworCisJaWYgKHZub2RlLT5jYl9wcm9taXNlZCAmJgorCSAgICAhdGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykgJiYKKwkgICAgIXRlc3RfYml0KEFGU19WTk9ERV9NT0RJRklFRCwgJnZub2RlLT5mbGFncykgJiYKKwkgICAgIXRlc3RfYml0KEFGU19WTk9ERV9aQVBfREFUQSwgJnZub2RlLT5mbGFncykpIHsKKwkJaWYgKHZub2RlLT5jYl9leHBpcmVzIDwgZ2V0X3NlY29uZHMoKSArIDEwKSB7CisJCQlfZGVidWcoImNhbGxiYWNrIGV4cGlyZWQiKTsKKwkJCXNldF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncyk7CisJCX0gZWxzZSB7CisJCQlnb3RvIHZhbGlkOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkKKwkJZ290byB2YWxpZDsKKworCW11dGV4X2xvY2soJnZub2RlLT52YWxpZGF0ZV9sb2NrKTsKKworCS8qIGlmIHRoZSBwcm9taXNlIGhhcyBleHBpcmVkLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgYWdhaW4gdG8gZ2V0CisJICogYSBuZXcgcHJvbWlzZSAtIG5vdGUgdGhhdCBpZiB0aGUgKHBhcmVudCkgZGlyZWN0b3J5J3MgbWV0YWRhdGEgd2FzCisJICogY2hhbmdlZCB0aGVuIHRoZSBzZWN1cml0eSBtYXkgYmUgZGlmZmVyZW50IGFuZCB3ZSBtYXkgbm8gbG9uZ2VyIGhhdmUKKwkgKiBhY2Nlc3MgKi8KKwlpZiAoIXZub2RlLT5jYl9wcm9taXNlZCB8fAorCSAgICB0ZXN0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoIm5vdCBwcm9taXNlZCIpOworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3JfdW5sb2NrOworCQlfZGVidWcoIm5ldyBwcm9taXNlIFtmbD0lbHhdIiwgdm5vZGUtPmZsYWdzKTsKKwl9CisKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKSB7CisJCV9kZWJ1ZygiZmlsZSBhbHJlYWR5IGRlbGV0ZWQiKTsKKwkJcmV0ID0gLUVTVEFMRTsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJLyogaWYgdGhlIHZub2RlJ3MgZGF0YSB2ZXJzaW9uIG51bWJlciBjaGFuZ2VkIHRoZW4gaXRzIGNvbnRlbnRzIGFyZQorCSAqIGRpZmZlcmVudCAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUZTX1ZOT0RFX1pBUF9EQVRBLCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoInphcCBkYXRhIHsleDolZH0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKCZ2bm9kZS0+dmZzX2lub2RlKTsKKwl9CisKKwljbGVhcl9iaXQoQUZTX1ZOT0RFX01PRElGSUVELCAmdm5vZGUtPmZsYWdzKTsKKwltdXRleF91bmxvY2soJnZub2RlLT52YWxpZGF0ZV9sb2NrKTsKK3ZhbGlkOgorCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitlcnJvcl91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+dmFsaWRhdGVfbG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIHJlYWQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gaW5vZGUKICAqLwogaW50IGFmc19pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCSAgICAgIHN0cnVjdCBrc3RhdCAqc3RhdCkKIHsKLQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCWludCByZXQ7CiAKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCV9lbnRlcigieyBpbm89JWx1IHY9JWx1IH0iLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX3ZlcnNpb24pOwogCi0Jdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7Ci0KLQlyZXQgPSBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKGlub2RlKTsKLQlpZiAocmV0ID09IC1FTk9FTlQpIHsKLQkJX2xlYXZlKCIgPSAlZCBbJWQgJXBdIiwKLQkJICAgICAgIHJldCwgYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCksIGRlbnRyeS0+ZF9pbm9kZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWVsc2UgaWYgKHJldCA8IDApIHsKLQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiB0cmFuc2ZlciBhdHRyaWJ1dGVzIGZyb20gdGhlIGlub2RlIHN0cnVjdHVyZSB0byB0aGUgc3RhdAotCSAqIHN0cnVjdHVyZSAqLwogCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOwotCi0JX2xlYXZlKCIgPSAwIENCIHsgdj0ldSB4PSV1IHQ9JXUgfSIsCi0JICAgICAgIHZub2RlLT5jYl92ZXJzaW9uLAotCSAgICAgICB2bm9kZS0+Y2JfZXhwaXJ5LAotCSAgICAgICB2bm9kZS0+Y2JfdHlwZSk7Ci0KIAlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19pbm9kZV9nZXRhdHRyKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNsZWFyIGFuIEFGUyBpbm9kZQogICovCiB2b2lkIGFmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXN0cnVjdCBhZnNfcGVybWl0cyAqcGVybWl0czsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKIAogCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOwogCi0JX2VudGVyKCJpbm89JWx1IHsgdm49JTA4eCB2PSV1IHg9JXUgdD0ldSB9IiwKLQkgICAgICAgaW5vZGUtPmlfaW5vLAorCV9lbnRlcigieyV4OiVkLiVkfSB2PSV1IHg9JXUgdD0ldSB9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCiAJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAogCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKIAkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKLQkgICAgICAgdm5vZGUtPmNiX3R5cGUKLQkgICAgICAgKTsKKwkgICAgICAgdm5vZGUtPmNiX3R5cGUpOwogCi0JQlVHX09OKGlub2RlLT5pX2lubyAhPSB2bm9kZS0+ZmlkLnZub2RlKTsKKwlfZGVidWcoIkNMRUFSIElOT0RFICVwIiwgaW5vZGUpOwogCi0JYWZzX3Zub2RlX2dpdmVfdXBfY2FsbGJhY2sodm5vZGUpOworCUFTU0VSVENNUChpbm9kZS0+aV9pbm8sID09LCB2bm9kZS0+ZmlkLnZub2RlKTsKKworCWFmc19naXZlX3VwX2NhbGxiYWNrKHZub2RlKTsKKworCWlmICh2bm9kZS0+c2VydmVyKSB7CisJCXNwaW5fbG9jaygmdm5vZGUtPnNlcnZlci0+ZnNfbG9jayk7CisJCXJiX2VyYXNlKCZ2bm9kZS0+c2VydmVyX3JiLCAmdm5vZGUtPnNlcnZlci0+ZnNfdm5vZGVzKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5zZXJ2ZXItPmZzX2xvY2spOworCQlhZnNfcHV0X3NlcnZlcih2bm9kZS0+c2VydmVyKTsKKwkJdm5vZGUtPnNlcnZlciA9IE5VTEw7CisJfQorCisJQVNTRVJUKCF2bm9kZS0+Y2JfcHJvbWlzZWQpOwogCiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAogCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodm5vZGUtPmNhY2hlLCAwKTsKIAl2bm9kZS0+Y2FjaGUgPSBOVUxMOwogI2VuZGlmCiAKKwltdXRleF9sb2NrKCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwlwZXJtaXRzID0gdm5vZGUtPnBlcm1pdHM7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHZub2RlLT5wZXJtaXRzLCBOVUxMKTsKKwltdXRleF91bmxvY2soJnZub2RlLT5wZXJtaXRzX2xvY2spOworCWlmIChwZXJtaXRzKQorCQljYWxsX3JjdSgmcGVybWl0cy0+cmN1LCBhZnNfemFwX3Blcm1pdHMpOworCiAJX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc19jbGVhcl9pbm9kZSgpICovCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDUxNTFkNWRhLi42ZGQzMTk3IDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtMSw2ICsxLDYgQEAKLS8qIGludGVybmFsLmg6IGludGVybmFsIEFGUyBzdHVmZgorLyogaW50ZXJuYWwgQUZTIHN0dWZmCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOSw0NyArOSwzOTAgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBBRlNfSU5URVJOQUxfSAotI2RlZmluZSBBRlNfSU5URVJOQUxfSAotCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9yeHJwYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgImFmcy5oIgorI2luY2x1ZGUgImFmc192bC5oIgorCisjZGVmaW5lIEFGU19DRUxMX01BWF9BRERSUyAxNQorCitzdHJ1Y3QgYWZzX2NhbGw7CisKK3R5cGVkZWYgZW51bSB7CisJQUZTX1ZMX05FVywJCQkvKiBuZXcsIHVuaW5pdGlhbGlzZWQgcmVjb3JkICovCisJQUZTX1ZMX0NSRUFUSU5HLAkJLyogY3JlYXRpbmcgcmVjb3JkICovCisJQUZTX1ZMX1ZBTElELAkJCS8qIHJlY29yZCBpcyBwZW5kaW5nICovCisJQUZTX1ZMX05PX1ZPTFVNRSwJCS8qIG5vIHN1Y2ggdm9sdW1lIGF2YWlsYWJsZSAqLworCUFGU19WTF9VUERBVElORywJCS8qIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLworCUFGU19WTF9WT0xVTUVfREVMRVRFRCwJCS8qIHZvbHVtZSB3YXMgZGVsZXRlZCAqLworCUFGU19WTF9VTkNFUlRBSU4sCQkvKiB1bmNlcnRhaW4gc3RhdGUgKHVwZGF0ZSBmYWlsZWQpICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192bG9jYXRpb25fc3RhdGVfdDsKKworc3RydWN0IGFmc19tb3VudF9wYXJhbXMgeworCWJvb2wJCQlyd3BhdGg7CQkvKiBUIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgUi9XICovCisJYm9vbAkJCWZvcmNlOwkJLyogVCB0byBmb3JjZSBjZWxsIHR5cGUgKi8KKwlhZnNfdm9sdHlwZV90CQl0eXBlOwkJLyogdHlwZSBvZiB2b2x1bWUgcmVxdWVzdGVkICovCisJaW50CQkJdm9sbmFtZXN6OwkvKiBzaXplIG9mIHZvbHVtZSBuYW1lICovCisJY29uc3QgY2hhcgkJKnZvbG5hbWU7CS8qIG5hbWUgb2Ygdm9sdW1lIHRvIG1vdW50ICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggdG8gZmluZCB2b2x1bWUgKi8KKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCisJc3RydWN0IGtleQkJKmtleTsJCS8qIGtleSB0byB1c2UgZm9yIHNlY3VyZSBtb3VudGluZyAqLworfTsKIAogLyoKLSAqIGRlYnVnIHRyYWNpbmcKKyAqIGRlZmluaXRpb24gb2YgaG93IHRvIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbgogICovCi0jZGVmaW5lIGtlbnRlcihGTVQsIGEuLi4pCXByaW50aygiPT0+ICVzKCJGTVQiKVxuIixfX0ZVTkNUSU9OX18gLCAjIyBhKQotI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyMgYSkKLSNkZWZpbmUga2RlYnVnKEZNVCwgYS4uLikJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQotI2RlZmluZSBrcHJvdG8oRk1ULCBhLi4uKQlwcmludGsoIiMjIyAiRk1UIlxuIiAsICMjIGEpCi0jZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorc3RydWN0IGFmc193YWl0X21vZGUgeworCS8qIFJ4UlBDIHJlY2VpdmVkIG1lc3NhZ2Ugbm90aWZpY2F0aW9uICovCisJdm9pZCAoKnJ4X3dha2V1cCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKIAotI2lmZGVmIF9fS0RFQlVHCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWtlbnRlcihGTVQgLCAjIyBhKQotI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlrbGVhdmUoRk1UICwgIyMgYSkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJa2RlYnVnKEZNVCAsICMjIGEpCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWtwcm90byhGTVQgLCAjIyBhKQotI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWtuZXQoRk1UICwgIyMgYSkKLSNlbHNlCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWRvIHsgfSB3aGlsZSgwKQorCS8qIHN5bmNocm9ub3VzIGNhbGwgd2FpdGVyIGFuZCBjYWxsIGRpc3BhdGNoZWQgbm90aWZpY2F0aW9uICovCisJaW50ICgqd2FpdCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKKworCS8qIGFzeW5jaHJvbm91cyBjYWxsIGNvbXBsZXRpb24gKi8KKwl2b2lkICgqYXN5bmNfY29tcGxldGUpKHZvaWQgKnJlcGx5LCBpbnQgZXJyb3IpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19zeW5jX2NhbGw7CitleHRlcm4gY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX2FzeW5jX2NhbGw7CisKKy8qCisgKiBhIHJlY29yZCBvZiBhbiBpbi1wcm9ncmVzcyBSeFJQQyBjYWxsCisgKi8KK3N0cnVjdCBhZnNfY2FsbCB7CisJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLworCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAlhc3luY193b3JrOwkvKiBhc3luY2hyb25vdXMgd29yayBwcm9jZXNzb3IgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsJCS8qIGFjdHVhbCB3b3JrIHByb2Nlc3NvciAqLworCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIHBhY2tldHMgKi8KKwlzdHJ1Y3QgcnhycGNfY2FsbAkqcnhjYWxsOwkvKiBSeFJQQyBjYWxsIGhhbmRsZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBjYWxsICovCisJc3RydWN0IGFmc19zZXJ2ZXIJKnNlcnZlcjsJLyogc2VydmVyIGFmZmVjdGVkIGJ5IGluY29taW5nIENNIGNhbGwgKi8KKwl2b2lkCQkJKnJlcXVlc3Q7CS8qIHJlcXVlc3QgZGF0YSAoZmlyc3QgcGFydCkgKi8KKwl2b2lkCQkJKnJlcXVlc3QyOwkvKiByZXF1ZXN0IGRhdGEgKHNlY29uZCBwYXJ0KSAqLworCXZvaWQJCQkqYnVmZmVyOwkvKiByZXBseSByZWNlaXZlIGJ1ZmZlciAqLworCXZvaWQJCQkqcmVwbHk7CQkvKiByZXBseSBidWZmZXIgKGZpcnN0IHBhcnQpICovCisJdm9pZAkJCSpyZXBseTI7CS8qIHJlcGx5IGJ1ZmZlciAoc2Vjb25kIHBhcnQpICovCisJdm9pZAkJCSpyZXBseTM7CS8qIHJlcGx5IGJ1ZmZlciAodGhpcmQgcGFydCkgKi8KKwl2b2lkCQkJKnJlcGx5NDsJLyogcmVwbHkgYnVmZmVyIChmb3VydGggcGFydCkgKi8KKwllbnVtIHsJCQkJCS8qIGNhbGwgc3RhdGUgKi8KKwkJQUZTX0NBTExfUkVRVUVTVElORywJLyogcmVxdWVzdCBpcyBiZWluZyBzZW50IGZvciBvdXRnb2luZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX1JFUExZLAkvKiBhd2FpdGluZyByZXBseSB0byBvdXRnb2luZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX09QX0lELAkvKiBhd2FpdGluZyBvcCBJRCBvbiBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX1JFUVVFU1QsCS8qIGF3YWl0aW5nIHJlcXVlc3QgZGF0YSBvbiBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX1JFUExZSU5HLAkvKiByZXBseWluZyB0byBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX0FDSywJLyogYXdhaXRpbmcgZmluYWwgQUNLIG9mIGluY29taW5nIGNhbGwgKi8KKwkJQUZTX0NBTExfQ09NUExFVEUsCS8qIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KKwkJQUZTX0NBTExfQlVTWSwJCS8qIHNlcnZlciB3YXMgYnVzeSAqLworCQlBRlNfQ0FMTF9BQk9SVEVELAkvKiBjYWxsIHdhcyBhYm9ydGVkICovCisJCUFGU19DQUxMX0VSUk9SLAkJLyogY2FsbCBmYWlsZWQgZHVlIHRvIGVycm9yICovCisJfQkJCXN0YXRlOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgY29kZSAqLworCXVuc2lnbmVkCQlyZXF1ZXN0X3NpemU7CS8qIHNpemUgb2YgcmVxdWVzdCBkYXRhICovCisJdW5zaWduZWQJCXJlcGx5X21heDsJLyogbWF4aW11bSBzaXplIG9mIHJlcGx5ICovCisJdW5zaWduZWQJCXJlcGx5X3NpemU7CS8qIGN1cnJlbnQgc2l6ZSBvZiByZXBseSAqLworCXVuc2lnbmVkIHNob3J0CQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byByZWNlaXZlZCBkYXRhIHN0b3JlICovCisJdW5zaWduZWQgY2hhcgkJdW5tYXJzaGFsbDsJLyogdW5tYXJzaGFsbGluZyBwaGFzZSAqLworCWJvb2wJCQlpbmNvbWluZzsJLyogVCBpZiBpbmNvbWluZyBjYWxsICovCisJdTE2CQkJc2VydmljZV9pZDsJLyogUnhSUEMgc2VydmljZSBJRCB0byBjYWxsICovCisJX19iZTE2CQkJcG9ydDsJCS8qIHRhcmdldCBVRFAgcG9ydCAqLworCV9fYmUzMgkJCW9wZXJhdGlvbl9JRDsJLyogb3BlcmF0aW9uIElEIGZvciBhbiBpbmNvbWluZyBjYWxsICovCisJdTMyCQkJY291bnQ7CQkvKiBjb3VudCBmb3IgdXNlIGluIHVubWFyc2hhbGxpbmcgKi8KKwlfX2JlMzIJCQl0bXA7CQkvKiBwbGFjZSB0byBleHRyYWN0IHRlbXBvcmFyeSBkYXRhICovCit9OworCitzdHJ1Y3QgYWZzX2NhbGxfdHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGRlbGl2ZXIgcmVxdWVzdCBvciByZXBseSBkYXRhIHRvIGFuIGNhbGwKKwkgKiAtIHJldHVybmluZyBhbiBlcnJvciB3aWxsIGNhdXNlIHRoZSBjYWxsIHRvIGJlIGFib3J0ZWQKKwkgKi8KKwlpbnQgKCpkZWxpdmVyKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBib29sIGxhc3QpOworCisJLyogbWFwIGFuIGFib3J0IGNvZGUgdG8gYW4gZXJyb3IgbnVtYmVyICovCisJaW50ICgqYWJvcnRfdG9fZXJyb3IpKHUzMiBhYm9ydF9jb2RlKTsKKworCS8qIGNsZWFuIHVwIGEgY2FsbCAqLworCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpOworfTsKKworLyoKKyAqIEFGUyBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YQorICogLSB0aGVyZSdzIG9uZSBzdXBlcmJsb2NrIHBlciB2b2x1bWUKKyAqLworc3RydWN0IGFmc19zdXBlcl9pbmZvIHsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCisJY2hhcgkJCXJ3cGFyZW50OwkvKiBUIGlmIHBhcmVudCBpcyBSL1cgQUZTIHZvbHVtZSAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKkFGU19GU19TKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZTsKKworLyoKKyAqIGVudHJ5IGluIHRoZSBjYWNoZWQgY2VsbCBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV9jZWxsIHsKKwljaGFyCQluYW1lW0FGU19NQVhDRUxMTkFNRV07CS8qIGNlbGwgbmFtZSAocGFkZGVkIHdpdGggTlVMcykgKi8KKwlzdHJ1Y3QgaW5fYWRkcgl2bF9zZXJ2ZXJzWzE1XTsJCS8qIGNhY2hlZCBjZWxsIFZMIHNlcnZlcnMgKi8KK307CisKKy8qCisgKiBBRlMgY2VsbCByZWNvcmQKKyAqLworc3RydWN0IGFmc19jZWxsIHsKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbWFpbiBjZWxsIGxpc3QgbGluayAqLworCXN0cnVjdCBrZXkJCSphbm9ueW1vdXNfa2V5OwkvKiBhbm9ueW1vdXMgdXNlciBrZXkgZm9yIHRoaXMgY2VsbCAqLworCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiAvcHJvYyBjZWxsIGxpc3QgbGluayAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19kaXI7CS8qIC9wcm9jIGRpciBmb3IgdGhpcyBjZWxsICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLwogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZnNfZGlzY2FyZF9teV9zaWduYWxzKHZvaWQpCi17Ci0Jd2hpbGUgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCXNpZ2luZm9fdCBzaW5mbzsKKwkvKiBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQgKi8KKwlyd2xvY2tfdAkJc2VydmVyc19sb2NrOwkvKiBhY3RpdmUgc2VydmVyIGxpc3QgbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2VydmVyczsJLyogYWN0aXZlIHNlcnZlciBsaXN0ICovCiAKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWRlcXVldWVfc2lnbmFsKGN1cnJlbnQsJmN1cnJlbnQtPmJsb2NrZWQsICZzaW5mbyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotfQorCS8qIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgbWFuYWdlbWVudCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJdmxfc2VtOwkJLyogdm9sdW1lIG1hbmFnZW1lbnQgc2VyaWFsaXNhdGlvbiBzZW1hcGhvcmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2xpc3Q7CS8qIGNlbGwncyBhY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KKwlzcGlubG9ja190CQl2bF9sb2NrOwkvKiB2bF9saXN0IGxvY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdmxfbmFkZHJzOwkvKiBudW1iZXIgb2YgVkwgc2VydmVycyBpbiBhZGRyIGxpc3QgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdmxfY3Vycl9zdml4OwkvKiBjdXJyZW50IHNlcnZlciBpbmRleCAqLworCXN0cnVjdCBpbl9hZGRyCQl2bF9hZGRyc1tBRlNfQ0VMTF9NQVhfQUREUlNdOwkvKiBjZWxsIFZMIHNlcnZlciBhZGRyZXNzZXMgKi8KKworCWNoYXIJCQluYW1lWzBdOwkvKiBjZWxsIG5hbWUgLSBtdXN0IGdvIGxhc3QgKi8KK307CisKKy8qCisgKiBlbnRyeSBpbiB0aGUgY2FjaGVkIHZvbHVtZSBsb2NhdGlvbiBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24geworCS8qIHZvbHVtZSBuYW1lIChsb3dlcmNhc2UsIHBhZGRlZCB3aXRoIE5VTHMpICovCisJdWludDhfdAkJCW5hbWVbQUZTX01BWFZPTE5BTUUgKyAxXTsKKworCXVpbnQ4X3QJCQluc2VydmVyczsJLyogbnVtYmVyIG9mIGVudHJpZXMgdXNlZCBpbiBzZXJ2ZXJzW10gKi8KKwl1aW50OF90CQkJdmlkbWFzazsJLyogdm9sdHlwZSBtYXNrIGZvciB2aWRbXSAqLworCXVpbnQ4X3QJCQlzcnZ0bWFza1s4XTsJLyogdm9sdHlwZSBtYXNrcyBmb3Igc2VydmVyc1tdICovCisjZGVmaW5lIEFGU19WT0xfVlRNX1JXCTB4MDEgLyogUi9XIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworI2RlZmluZSBBRlNfVk9MX1ZUTV9STwkweDAyIC8qIFIvTyB2ZXJzaW9uIG9mIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlIChvbiB0aGlzIHNlcnZlcikgKi8KKyNkZWZpbmUgQUZTX1ZPTF9WVE1fQkFLCTB4MDQgLyogYmFja3VwIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworCisJYWZzX3ZvbGlkX3QJCXZpZFszXTsJCS8qIHZvbHVtZSBJRHMgZm9yIFIvVywgUi9PIGFuZCBCYWsgdm9sdW1lcyAqLworCXN0cnVjdCBpbl9hZGRyCQlzZXJ2ZXJzWzhdOwkvKiBmaWxlc2VydmVyIGFkZHJlc3NlcyAqLworCXRpbWVfdAkJCXJ0aW1lOwkJLyogbGFzdCByZXRyaWV2YWwgdGltZSAqLworfTsKKworLyoKKyAqIHZvbHVtZSAtPiB2bm9kZSBoYXNoIHRhYmxlIGVudHJ5CisgKi8KK3N0cnVjdCBhZnNfY2FjaGVfdmhhc2ggeworCWFmc192b2x0eXBlX3QJCXZ0eXBlOwkJLyogd2hpY2ggdm9sdW1lIHZhcmlhdGlvbiAqLworCXVpbnQ4X3QJCQloYXNoX2J1Y2tldDsJLyogd2hpY2ggaGFzaCBidWNrZXQgdGhpcyByZXByZXNlbnRzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogQUZTIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RydWN0IGFmc192bG9jYXRpb24geworCWF0b21pY190CQl1c2FnZTsKKwl0aW1lX3QJCQl0aW1lX29mX2RlYXRoOwkvKiB0aW1lIGF0IHdoaWNoIHB1dCByZWR1Y2VkIHVzYWdlIHRvIDAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwgdm9sdW1lIGxvY2F0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWdyYXZlOwkJLyogbGluayBpbiBtYXN0ZXIgZ3JhdmV5YXJkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXVwZGF0ZTsJCS8qIGxpbmsgaW4gbWFzdGVyIHVwZGF0ZSBsaXN0ICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggdm9sdW1lIGJlbG9uZ3MgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOwkvKiB2b2x1bWUgaW5mb3JtYXRpb24gREIgcmVjb3JkICovCisJc3RydWN0IGFmc192b2x1bWUJKnZvbHNbM107CS8qIHZvbHVtZSBhY2Nlc3MgcmVjb3JkIHBvaW50ZXIgKGluZGV4IGJ5IHR5cGUpICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBzdGF0dXMgY2hhbmdlIHdhaXRxdWV1ZSAqLworCXRpbWVfdAkJCXVwZGF0ZV9hdDsJLyogdGltZSBhdCB3aGljaCByZWNvcmQgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlhZnNfdmxvY2F0aW9uX3N0YXRlX3QJc3RhdGU7CQkvKiB2b2x1bWUgbG9jYXRpb24gc3RhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX3Jlal9jbnQ7CS8qIEVOT01FRElVTSBjb3VudCBkdXJpbmcgdXBkYXRlICovCisJdW5zaWduZWQgc2hvcnQJCXVwZF9idXN5X2NudDsJLyogRUJVU1kgY291bnQgZHVyaW5nIHVwZGF0ZSAqLworCWJvb2wJCQl2YWxpZDsJCS8qIFQgaWYgdmFsaWQgKi8KK307CisKKy8qCisgKiBBRlMgZmlsZXNlcnZlciByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXIgeworCWF0b21pY190CQl1c2FnZTsKKwl0aW1lX3QJCQl0aW1lX29mX2RlYXRoOwkvKiB0aW1lIGF0IHdoaWNoIHB1dCByZWR1Y2VkIHVzYWdlIHRvIDAgKi8KKwlzdHJ1Y3QgaW5fYWRkcgkJYWRkcjsJCS8qIHNlcnZlciBhZGRyZXNzICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggc2VydmVyIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwncyBzZXJ2ZXIgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJZ3JhdmU7CQkvKiBsaW5rIGluIG1hc3RlciBncmF2ZXlhcmQgbGlzdCAqLworCXN0cnVjdCByYl9ub2RlCQltYXN0ZXJfcmI7CS8qIGxpbmsgaW4gbWFzdGVyIGJ5LWFkZHIgdHJlZSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJc2VtOwkJLyogYWNjZXNzIGxvY2sgKi8KKworCS8qIGZpbGUgc2VydmljZSBhY2Nlc3MgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJZnNfdm5vZGVzOwkvKiB2bm9kZXMgYmFja2VkIGJ5IHRoaXMgc2VydmVyIChvcmRlcmVkIGJ5IEZJRCkgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19hY3RfamlmOwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgYWN0aXZpdHkgb2NjdXJyZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19kZWFkX2ppZjsJLyogdGltZSBhdCB3aGljaCBubyBsb25nZXIgdG8gYmUgY29uc2lkZXJlZCBkZWFkICovCisJc3BpbmxvY2tfdAkJZnNfbG9jazsJLyogYWNjZXNzIGxvY2sgKi8KKwlpbnQJCQlmc19zdGF0ZTsgICAgICAJLyogMCBvciByZWFzb24gRlMgY3VycmVudGx5IG1hcmtlZCBkZWFkICgtZXJybm8pICovCisKKwkvKiBjYWxsYmFjayBwcm9taXNlIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2JfcHJvbWlzZXM7CS8qIHZub2RlIGV4cGlyYXRpb24gbGlzdCAob3JkZXJlZCBlYXJsaWVzdCBmaXJzdCkgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNiX3VwZGF0ZXI7CS8qIGNhbGxiYWNrIHVwZGF0ZXIgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNiX2JyZWFrX3dvcms7CS8qIGNvbGxlY3RlZCBicmVhayBkaXNwYXRjaGVyICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY2JfYnJlYWtfd2FpdHE7CS8qIHNwYWNlIGF2YWlsYWJsZSBpbiBjYl9icmVhayB3YWl0cXVldWUgKi8KKwlzcGlubG9ja190CQljYl9sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLworCXN0cnVjdCBhZnNfY2FsbGJhY2sJY2JfYnJlYWtbNjRdOwkvKiByaW5nIG9mIGNhbGxiYWNrcyBhd2FpdGluZyBicmVha2luZyAqLworCWF0b21pY190CQljYl9icmVha19uOwkvKiBudW1iZXIgb2YgcGVuZGluZyBicmVha3MgKi8KKwl1OAkJCWNiX2JyZWFrX2hlYWQ7CS8qIGhlYWQgb2YgY2FsbGJhY2sgYnJlYWtpbmcgcmluZyAqLworCXU4CQkJY2JfYnJlYWtfdGFpbDsJLyogdGFpbCBvZiBjYWxsYmFjayBicmVha2luZyByaW5nICovCit9OworCisvKgorICogQUZTIHZvbHVtZSBhY2Nlc3MgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdm9sdW1lIHsKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggYmVsb25ncyAodW5yZWZkIHB0cikgKi8KKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbgkqdmxvY2F0aW9uOwkvKiB2b2x1bWUgbG9jYXRpb24gKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKwlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCisJYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCisJY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLworCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyc1s4XTsJLyogc2VydmVycyBvbiB3aGljaCB2b2x1bWUgcmVzaWRlcyAob3JkZXJlZCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlcnZlcl9zZW07CS8qIGxvY2sgZm9yIGFjY2Vzc2luZyBjdXJyZW50IHNlcnZlciAqLworfTsKKworLyoKKyAqIHZub2RlIGNhdGFsb2d1ZSBlbnRyeQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlIHsKKwlhZnNfdm5vZGVpZF90CQl2bm9kZV9pZDsJLyogdm5vZGUgSUQgKi8KKwl1bnNpZ25lZAkJdm5vZGVfdW5pcXVlOwkvKiB2bm9kZSBJRCB1bmlxdWlmaWVyICovCisJYWZzX2RhdGF2ZXJzaW9uX3QJZGF0YV92ZXJzaW9uOwkvKiBkYXRhIHZlcnNpb24gKi8KK307CisKKy8qCisgKiBBRlMgaW5vZGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBhZnNfdm5vZGUgeworCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOwkvKiB0aGUgVkZTJ3MgaW5vZGUgcmVjb3JkICovCisKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggdm5vZGUgcmVzaWRlcyAqLworCXN0cnVjdCBhZnNfc2VydmVyCSpzZXJ2ZXI7CS8qIHNlcnZlciBjdXJyZW50bHkgc3VwcGx5aW5nIHRoaXMgZmlsZSAqLworCXN0cnVjdCBhZnNfZmlkCQlmaWQ7CQkvKiB0aGUgZmlsZSBpZGVudGlmaWVyIGZvciB0aGlzIGlub2RlICovCisJc3RydWN0IGFmc19maWxlX3N0YXR1cwlzdGF0dXM7CQkvKiBBRlMgc3RhdHVzIGluZm8gZm9yIHRoaXMgZmlsZSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCXN0cnVjdCBhZnNfcGVybWl0cwkqcGVybWl0czsJLyogY2FjaGUgb2YgcGVybWl0cyBzbyBmYXIgb2J0YWluZWQgKi8KKwlzdHJ1Y3QgbXV0ZXgJCXBlcm1pdHNfbG9jazsJLyogbG9jayBmb3IgYWx0ZXJpbmcgcGVybWl0cyBsaXN0ICovCisJc3RydWN0IG11dGV4CQl2YWxpZGF0ZV9sb2NrOwkvKiBsb2NrIGZvciB2YWxpZGF0aW5nIHRoaXMgdm5vZGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl1cGRhdGVfd2FpdHE7CS8qIHN0YXR1cyBmZXRjaCB3YWl0cXVldWUgKi8KKwlpbnQJCQl1cGRhdGVfY250OwkvKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCB1cGRhdGUgdGhlCisJCQkJCQkgKiBzdGF0dXMgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogd2FpdHF1ZXVlL2ZsYWdzIGxvY2sgKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyNkZWZpbmUgQUZTX1ZOT0RFX0NCX0JST0tFTgkwCQkvKiBzZXQgaWYgdm5vZGUncyBjYWxsYmFjayB3YXMgYnJva2VuICovCisjZGVmaW5lIEFGU19WTk9ERV9VTlNFVAkJMQkJLyogc2V0IGlmIHZub2RlIGF0dHJpYnV0ZXMgbm90IHlldCBzZXQgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX01PRElGSUVECTIJCS8qIHNldCBpZiB2bm9kZSdzIGRhdGEgbW9kaWZpZWQgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1pBUF9EQVRBCTMJCS8qIHNldCBpZiB2bm9kZSdzIGRhdGEgc2hvdWxkIGJlIGludmFsaWRhdGVkICovCisjZGVmaW5lIEFGU19WTk9ERV9ERUxFVEVECTQJCS8qIHNldCBpZiB2bm9kZSBkZWxldGVkIG9uIHNlcnZlciAqLworI2RlZmluZSBBRlNfVk5PREVfTU9VTlRQT0lOVAk1CQkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KKworCWxvbmcJCQlhY2xfb3JkZXI7CS8qIEFDTCBjaGVjayBjb3VudCAoY2FsbGJhY2sgYnJlYWsgY291bnQpICovCisKKwkvKiBvdXRzdGFuZGluZyBjYWxsYmFjayBub3RpZmljYXRpb24gb24gdGhpcyBmaWxlICovCisJc3RydWN0IHJiX25vZGUJCXNlcnZlcl9yYjsJLyogbGluayBpbiBzZXJ2ZXItPmZzX3Zub2RlcyAqLworCXN0cnVjdCByYl9ub2RlCQljYl9wcm9taXNlOwkvKiBsaW5rIGluIHNlcnZlci0+Y2JfcHJvbWlzZXMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2JfYnJva2VuX3dvcms7CS8qIHdvcmsgdG8gYmUgZG9uZSBvbiBjYWxsYmFjayBicmVhayAqLworCXRpbWVfdAkJCWNiX2V4cGlyZXM7CS8qIHRpbWUgYXQgd2hpY2ggY2FsbGJhY2sgZXhwaXJlcyAqLworCXRpbWVfdAkJCWNiX2V4cGlyZXNfYXQ7CS8qIHRpbWUgdXNlZCB0byBvcmRlciBjYl9wcm9taXNlICovCisJdW5zaWduZWQJCWNiX3ZlcnNpb247CS8qIGNhbGxiYWNrIHZlcnNpb24gKi8KKwl1bnNpZ25lZAkJY2JfZXhwaXJ5OwkvKiBjYWxsYmFjayBleHBpcnkgdGltZSAqLworCWFmc19jYWxsYmFja190eXBlX3QJY2JfdHlwZTsJLyogdHlwZSBvZiBjYWxsYmFjayAqLworCWJvb2wJCQljYl9wcm9taXNlZDsJLyogdHJ1ZSBpZiBwcm9taXNlIHN0aWxsIGhvbGRzICovCit9OworCisvKgorICogY2FjaGVkIHNlY3VyaXR5IHJlY29yZCBmb3Igb25lIHVzZXIncyBhdHRlbXB0IHRvIGFjY2VzcyBhIHZub2RlCisgKi8KK3N0cnVjdCBhZnNfcGVybWl0IHsKKwlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogUnhSUEMgdGlja2V0IGhvbGRpbmcgYSBzZWN1cml0eSBjb250ZXh0ICovCisJYWZzX2FjY2Vzc190CQlhY2Nlc3NfbWFzazsJLyogYWNjZXNzIG1hc2sgZm9yIHRoaXMga2V5ICovCit9OworCisvKgorICogY2FjaGUgb2Ygc2VjdXJpdHkgcmVjb3JkcyBmcm9tIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHZub2RlCisgKi8KK3N0cnVjdCBhZnNfcGVybWl0cyB7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CQkvKiBkaXNwb3NhbCBwcm9jZWR1cmUgKi8KKwlpbnQJCQljb3VudDsJCS8qIG51bWJlciBvZiByZWNvcmRzICovCisJc3RydWN0IGFmc19wZXJtaXQJcGVybWl0c1swXTsJLyogdGhlIHBlcm1pdHMgc28gZmFyIGV4YW1pbmVkICovCit9OworCisvKgorICogcmVjb3JkIG9mIG9uZSBvZiBhIHN5c3RlbSdzIHNldCBvZiBuZXR3b3JrIGludGVyZmFjZXMKKyAqLworc3RydWN0IGFmc19pbnRlcmZhY2UgeworCXVuc2lnbmVkCWluZGV4OwkJLyogaW50ZXJmYWNlIGluZGV4ICovCisJc3RydWN0IGluX2FkZHIJYWRkcmVzczsJLyogSVB2NCBhZGRyZXNzIGJvdW5kIHRvIGludGVyZmFjZSAqLworCXN0cnVjdCBpbl9hZGRyCW5ldG1hc2s7CS8qIG5ldG1hc2sgYXBwbGllZCB0byBhZGRyZXNzICovCisJdW5zaWduZWQJbXR1OwkJLyogTVRVIG9mIGludGVyZmFjZSAqLworfTsKKworLyoKKyAqIFVVSUQgZGVmaW5pdGlvbiBbaW50ZXJuZXQgZHJhZnRdCisgKiAtIHRoZSB0aW1lc3RhbXAgaXMgYSA2MC1iaXQgdmFsdWUsIHNwbGl0IDMyLzE2LzEyLCBhbmQgZ29lcyBpbiAxMDBucworICogICBpbmNyZW1lbnRzIHNpbmNlIG1pZG5pZ2h0IDE1dGggT2N0b2JlciAxNTgyCisgKiAgIC0gYWRkIEFGU19VVUlEX1RPX1VOSVhfVElNRSB0byBjb252ZXJ0IHVuaXggdGltZSBpbiAxMDBucyB1bml0cyB0byBVVUlECisgKiAgICAgdGltZQorICogLSB0aGUgY2xvY2sgc2VxdWVuY2UgaXMgYSAxNC1iaXQgY291bnRlciB0byBhdm9pZCBkdXBsaWNhdGUgdGltZXMKKyAqLworc3RydWN0IGFmc191dWlkIHsKKwl1MzIJCXRpbWVfbG93OwkJCS8qIGxvdyBwYXJ0IG9mIHRpbWVzdGFtcCAqLworCXUxNgkJdGltZV9taWQ7CQkJLyogbWlkIHBhcnQgb2YgdGltZXN0YW1wICovCisJdTE2CQl0aW1lX2hpX2FuZF92ZXJzaW9uOwkJLyogaGlnaCBwYXJ0IG9mIHRpbWVzdGFtcCBhbmQgdmVyc2lvbiAgKi8KKyNkZWZpbmUgQUZTX1VVSURfVE9fVU5JWF9USU1FCTB4MDFiMjFkZDIxMzgxNDAwMAorI2RlZmluZSBBRlNfVVVJRF9USU1FSElfTUFTSwkweDBmZmYKKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9USU1FCTB4MTAwMAkvKiB0aW1lLWJhc2VkIFVVSUQgKi8KKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9OQU1FCTB4MzAwMAkvKiBuYW1lLWJhc2VkIFVVSUQgKi8KKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9SQU5ET00JMHg0MDAwCS8qIChwc2V1ZG8tKXJhbmRvbSBnZW5lcmF0ZWQgVVVJRCAqLworCXU4CQljbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkOwkvKiBjbG9jayBzZXEgaGkgYW5kIHZhcmlhbnQgKi8KKyNkZWZpbmUgQUZTX1VVSURfQ0xPQ0tISV9NQVNLCTB4M2YKKyNkZWZpbmUgQUZTX1VVSURfVkFSSUFOVF9TVEQJMHg4MAorCXU4CQljbG9ja19zZXFfbG93OwkJCS8qIGNsb2NrIHNlcSBsb3cgKi8KKwl1OAkJbm9kZVs2XTsJCQkvKiBzcGF0aWFsbHkgdW5pcXVlIG5vZGUgSUQgKE1BQyBhZGRyKSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNhbGxiYWNrLmMKKyAqLworZXh0ZXJuIHZvaWQgYWZzX2luaXRfY2FsbGJhY2tfc3RhdGUoc3RydWN0IGFmc19zZXJ2ZXIgKik7CitleHRlcm4gdm9pZCBhZnNfYnJva2VuX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgYWZzX2JyZWFrX2NhbGxiYWNrcyhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzaXplX3QsCisJCQkJc3RydWN0IGFmc19jYWxsYmFja1tdKTsKK2V4dGVybiB2b2lkIGFmc19kaXNjYXJkX2NhbGxiYWNrX29uX2RlbGV0ZShzdHJ1Y3QgYWZzX3Zub2RlICopOworZXh0ZXJuIHZvaWQgYWZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc192bm9kZSAqKTsKK2V4dGVybiB2b2lkIGFmc19kaXNwYXRjaF9naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBhZnNfZmx1c2hfY2FsbGJhY2tfYnJlYWtzKHN0cnVjdCBhZnNfc2VydmVyICopOworZXh0ZXJuIGludCBfX2luaXQgYWZzX2NhbGxiYWNrX3VwZGF0ZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGFmc19jYWxsYmFja191cGRhdGVfa2lsbCh2b2lkKTsKIAogLyoKICAqIGNlbGwuYwpAQCAtNjAsNTcgKzQwMywxNTYgQEAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX2NhY2hlX2NlbGxfaW5kZXhfZGVmOwogI2VuZGlmCiAKKyNkZWZpbmUgYWZzX2dldF9jZWxsKEMpIGRvIHsgYXRvbWljX2luYygmKEMpLT51c2FnZSk7IH0gd2hpbGUoMCkKK2V4dGVybiBpbnQgYWZzX2NlbGxfaW5pdChjaGFyICopOworZXh0ZXJuIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfY3JlYXRlKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19jZWxsX2xvb2t1cChjb25zdCBjaGFyICosIHVuc2lnbmVkKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19ncmFiX2NlbGwoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIHZvaWQgYWZzX3B1dF9jZWxsKHN0cnVjdCBhZnNfY2VsbCAqKTsKK2V4dGVybiB2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpOworCisvKgorICogY21zZXJ2aWNlLmMKKyAqLworZXh0ZXJuIGJvb2wgYWZzX2NtX2luY29taW5nX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworCiAvKgogICogZGlyLmMKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19kaXJfZmlsZV9vcGVyYXRpb25zOwogCitleHRlcm4gaW50IGFmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CisKIC8qCiAgKiBmaWxlLmMKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZzX2ZzX2FvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19maWxlX29wZXJhdGlvbnM7CisKK2V4dGVybiBpbnQgYWZzX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCBhZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAKICNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1leHRlcm4gaW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKTsKK2V4dGVybiBpbnQgYWZzX2NhY2hlX2dldF9wYWdlX2Nvb2tpZShzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqKTsKICNlbmRpZgogCiAvKgorICogZnNjbGllbnQuYworICovCitleHRlcm4gaW50IGFmc19mc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGFmc192b2xzeW5jICosCisJCQkJICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfZ2l2ZV91cF9jYWxsYmFja3Moc3RydWN0IGFmc19zZXJ2ZXIgKiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19mZXRjaF9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgc3RydWN0IGFmc192bm9kZSAqLCBvZmZfdCwgc2l6ZV90LCBzdHJ1Y3QgcGFnZSAqLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX2NyZWF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosIHVtb2RlX3QsCisJCQkgc3RydWN0IGFmc19maWQgKiwgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqLAorCQkJIHN0cnVjdCBhZnNfY2FsbGJhY2sgKiwKKwkJCSBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosIGJvb2wsCisJCQkgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19saW5rKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwgc3RydWN0IGFmc192bm9kZSAqLAorCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAorCQkJICBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICBzdHJ1Y3QgYWZzX2ZpZCAqLCBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICosCisJCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfcmVuYW1lKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwKKwkJCSBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwKKwkJCSBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKKworLyoKICAqIGlub2RlLmMKICAqLwotZXh0ZXJuIGludCBhZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYWZzX2ZpZCAqZmlkLAotCQkgICAgc3RydWN0IGlub2RlICoqX2lub2RlKTsKLWV4dGVybiBpbnQgYWZzX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCSAgICAgc3RydWN0IGtzdGF0ICpzdGF0KTsKLWV4dGVybiB2b2lkIGFmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotLyoKLSAqIGtleV9hZnMuYwotICovCi0jaWZkZWYgQ09ORklHX0tFWVMKLWV4dGVybiBpbnQgYWZzX2tleV9yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiB2b2lkIGFmc19rZXlfdW5yZWdpc3Rlcih2b2lkKTsKLSNlbmRpZgorZXh0ZXJuIHN0cnVjdCBpbm9kZSAqYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgIHN0cnVjdCBhZnNfZmlkICosIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwKKwkJCSAgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgKik7CitleHRlcm4gaW50IGFmc192YWxpZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKik7CitleHRlcm4gaW50IGFmc19pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosCisJCQkgICAgIHN0cnVjdCBrc3RhdCAqKTsKK2V4dGVybiB2b2lkIGFmc196YXBfcGVybWl0cyhzdHJ1Y3QgcmN1X2hlYWQgKik7CitleHRlcm4gdm9pZCBhZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogCiAvKgogICogbWFpbi5jCiAgKi8KK2V4dGVybiBzdHJ1Y3QgYWZzX3V1aWQgYWZzX3V1aWQ7CiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAogZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX25ldGZzIGFmc19jYWNoZV9uZXRmczsKICNlbmRpZgogCiAvKgorICogbWlzYy5jCisgKi8KK2V4dGVybiBpbnQgYWZzX2Fib3J0X3RvX2Vycm9yKHUzMik7CisKKy8qCiAgKiBtbnRwdC5jCiAgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfbW50cHRfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19tbnRwdF9maWxlX29wZXJhdGlvbnM7Ci1leHRlcm4gc3RydWN0IGFmc190aW1lciBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyOwotZXh0ZXJuIHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc19tbnRwdF9leHBpcnlfdGltZXJfb3BzOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0OwogCi1leHRlcm4gaW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKK2V4dGVybiBpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICopOworZXh0ZXJuIHZvaWQgYWZzX21udHB0X2tpbGxfdGltZXIodm9pZCk7CitleHRlcm4gdm9pZCBhZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqLCBpbnQpOworCisvKgorICogcHJvYy5jCisgKi8KK2V4dGVybiBpbnQgYWZzX3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGFmc19wcm9jX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IGFmc19wcm9jX2NlbGxfc2V0dXAoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoc3RydWN0IGFmc19jZWxsICopOworCisvKgorICogcnhycGMuYworICovCitleHRlcm4gaW50IGFmc19vcGVuX3NvY2tldCh2b2lkKTsKK2V4dGVybiB2b2lkIGFmc19jbG9zZV9zb2NrZXQodm9pZCk7CitleHRlcm4gaW50IGFmc19tYWtlX2NhbGwoc3RydWN0IGluX2FkZHIgKiwgc3RydWN0IGFmc19jYWxsICosIGdmcF90LAorCQkJIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqLAorCQkJCQkgICAgc2l6ZV90LCBzaXplX3QpOworZXh0ZXJuIHZvaWQgYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yKHN0cnVjdCBhZnNfY2FsbCAqKTsKK2V4dGVybiB2b2lkIGFmc190cmFuc2Zlcl9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gdm9pZCBhZnNfc2VuZF9lbXB0eV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKik7CitleHRlcm4gdm9pZCBhZnNfc2VuZF9zaW1wbGVfcmVwbHkoc3RydWN0IGFmc19jYWxsICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCwgdm9pZCAqLAorCQkJICAgIHNpemVfdCk7CisKKy8qCisgKiBzZWN1cml0eS5jCisgKi8KK2V4dGVybiB2b2lkIGFmc19jbGVhcl9wZXJtaXRzKHN0cnVjdCBhZnNfdm5vZGUgKik7CitleHRlcm4gdm9pZCBhZnNfY2FjaGVfcGVybWl0KHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLCBsb25nKTsKK2V4dGVybiBzdHJ1Y3Qga2V5ICphZnNfcmVxdWVzdF9rZXkoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIGludCBhZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCisvKgorICogc2VydmVyLmMKKyAqLworZXh0ZXJuIHNwaW5sb2NrX3QgYWZzX3NlcnZlcl9wZWVyX2xvY2s7CisKKyNkZWZpbmUgYWZzX2dldF9zZXJ2ZXIoUykJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlfZGVidWcoIkdFVCBTRVJWRVIgJWQiLCBhdG9taWNfcmVhZCgmKFMpLT51c2FnZSkpOwlcCisJYXRvbWljX2luYygmKFMpLT51c2FnZSk7CQkJCVwKK30gd2hpbGUoMCkKKworZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBhZnNfcHVyZ2Vfc2VydmVycyh2b2lkKTsKIAogLyoKICAqIHN1cGVyLmMKQEAgLTExOCwyMiArNTYwLDIxMSBAQAogZXh0ZXJuIGludCBhZnNfZnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGFmc19mc19leGl0KHZvaWQpOwogCi0jZGVmaW5lIEFGU19DQl9IQVNIX0NPVU5UIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFmc19jYl9oYXNoX3RibFtdOwotZXh0ZXJuIHNwaW5sb2NrX3QgYWZzX2NiX2hhc2hfbG9jazsKLQotI2RlZmluZSBhZnNfY2JfaGFzaChTUlYsRklEKSBcCi0JYWZzX2NiX2hhc2hfdGJsWygodW5zaWduZWQgbG9uZykoU1JWKSArIFwKLQkJCShGSUQpLT52aWQgKyAoRklEKS0+dm5vZGUgKyAoRklEKS0+dW5pcXVlKSAlIFwKLQkJCUFGU19DQl9IQVNIX0NPVU5UXQorLyoKKyAqIHVzZS1ydG5ldGxpbmsuYworICovCitleHRlcm4gaW50IGFmc19nZXRfaXB2NF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfaW50ZXJmYWNlICosIHNpemVfdCwgYm9vbCk7CitleHRlcm4gaW50IGFmc19nZXRfTUFDX2FkZHJlc3ModTggWzZdKTsKIAogLyoKLSAqIHByb2MuYworICogdmxjbGllbnQuYwogICovCi1leHRlcm4gaW50IGFmc19wcm9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBhZnNfcHJvY19jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIGludCBhZnNfcHJvY19jZWxsX3NldHVwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCk7Ci1leHRlcm4gdm9pZCBhZnNfcHJvY19jZWxsX3JlbW92ZShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zsb2NhdGlvbl9jYWNoZV9pbmRleF9kZWY7CisjZW5kaWYKIAotI2VuZGlmIC8qIEFGU19JTlRFUk5BTF9IICovCitleHRlcm4gaW50IGFmc192bF9nZXRfZW50cnlfYnlfbmFtZShzdHJ1Y3QgaW5fYWRkciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkJICAgIGNvbnN0IGNoYXIgKiwgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc192bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGluX2FkZHIgKiwgc3RydWN0IGtleSAqLAorCQkJCSAgYWZzX3ZvbGlkX3QsIGFmc192b2x0eXBlX3QsCisJCQkJICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqLAorCQkJCSAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CisKKy8qCisgKiB2bG9jYXRpb24uYworICovCisjZGVmaW5lIGFmc19nZXRfdmxvY2F0aW9uKFYpIGRvIHsgYXRvbWljX2luYygmKFYpLT51c2FnZSk7IH0gd2hpbGUoMCkKKworZXh0ZXJuIGludCBfX2luaXQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfaW5pdCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICosCisJCQkJCQkgIHN0cnVjdCBrZXkgKiwKKwkJCQkJCSAgY29uc3QgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgYWZzX3B1dF92bG9jYXRpb24oc3RydWN0IGFmc192bG9jYXRpb24gKik7CitleHRlcm4gdm9pZCBfX2V4aXQgYWZzX3Zsb2NhdGlvbl9wdXJnZSh2b2lkKTsKKworLyoKKyAqIHZub2RlLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zub2RlX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFmc192bm9kZSAqQUZTX0ZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgYWZzX3Zub2RlLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqQUZTX1ZOT0RFX1RPX0koc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJcmV0dXJuICZ2bm9kZS0+dmZzX2lub2RlOworfQorCitleHRlcm4gdm9pZCBhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkJCSAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKik7CitleHRlcm4gaW50IGFmc192bm9kZV9mZXRjaF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkJICBzdHJ1Y3Qga2V5ICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwKKwkJCQlvZmZfdCwgc2l6ZV90LCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2NyZWF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIHVtb2RlX3QsIHN0cnVjdCBhZnNfZmlkICosIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwKKwkJCSAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICosIHN0cnVjdCBhZnNfc2VydmVyICoqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3JlbW92ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIGJvb2wpOworZXh0ZXJuIGludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLAorCQkJICBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfc3ltbGluayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgICBjb25zdCBjaGFyICosIHN0cnVjdCBhZnNfZmlkICosCisJCQkgICAgIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwgc3RydWN0IGFmc19zZXJ2ZXIgKiopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfcmVuYW1lKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGFmc192bm9kZSAqLAorCQkJICAgIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKgorICogdm9sdW1lLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3ZvbHVtZV9jYWNoZV9pbmRleF9kZWY7CisjZW5kaWYKKworI2RlZmluZSBhZnNfZ2V0X3ZvbHVtZShWKSBkbyB7IGF0b21pY19pbmMoJihWKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiB2b2lkIGFmc19wdXRfdm9sdW1lKHN0cnVjdCBhZnNfdm9sdW1lICopOworZXh0ZXJuIHN0cnVjdCBhZnNfdm9sdW1lICphZnNfdm9sdW1lX2xvb2t1cChzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192bm9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192bm9kZSAqLAorCQkJCQkgc3RydWN0IGFmc19zZXJ2ZXIgKiwgaW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYnVnIHRyYWNpbmcKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGFmc19kZWJ1ZzsKKworI2RlZmluZSBkYmdwcmludGsoRk1ULC4uLikgXAorCXByaW50aygiWyV4JS02LjZzXSAiRk1UIlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tICwjI19fVkFfQVJHU19fKQorCisvKiBtYWtlIHN1cmUgd2UgbWFpbnRhaW4gdGhlIGZvcm1hdCBzdHJpbmdzLCBldmVuIHdoZW4gZGVidWdnaW5nIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpCit2b2lkIF9kYnByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKK30KKworI2RlZmluZSBrZW50ZXIoRk1ULC4uLikJZGJncHJpbnRrKCI9PT4gJXMoIkZNVCIpIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtsZWF2ZShGTVQsLi4uKQlkYmdwcmludGsoIjw9PSAlcygpIkZNVCIiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUga2RlYnVnKEZNVCwuLi4pCWRiZ3ByaW50aygiICAgICJGTVQgLCMjX19WQV9BUkdTX18pCisKKworI2lmIGRlZmluZWQoX19LREVCVUcpCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9sZWF2ZShGTVQsLi4uKQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FGU19ERUJVRykKKyNkZWZpbmUgQUZTX0RFQlVHX0tFTlRFUgkweDAxCisjZGVmaW5lIEFGU19ERUJVR19LTEVBVkUJMHgwMgorI2RlZmluZSBBRlNfREVCVUdfS0RFQlVHCTB4MDQKKworI2RlZmluZSBfZW50ZXIoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0VOVEVSKSkJXAorCQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0xFQVZFKSkJXAorCQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfZGVidWcoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0RFQlVHKSkJXAorCQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgX2VudGVyKEZNVCwuLi4pCV9kYnByaW50aygiPT0+ICVzKCJGTVQiKSIsX19GVU5DVElPTl9fICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJX2RicHJpbnRrKCI8PT0gJXMoKSJGTVQiIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlfZGJwcmludGsoIiAgICAiRk1UICwjI19fVkFfQVJHU19fKQorI2VuZGlmCisKKy8qCisgKiBkZWJ1ZyBhc3NlcnRpb24gY2hlY2tpbmcKKyAqLworI2lmIDEgLy8gZGVmaW5lZChfX0tERUJVR0FMTCkKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KCEoWCkpKSB7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiXG4iKTsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIkFGUzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVENNUChYLCBPUCwgWSkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKChYKSBPUCAoWSkpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoKEMpICYmICEoWCkpKSB7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJXAorCQlCVUcoKTsJCQkJCQlcCisJfQkJCQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgQVNTRVJUSUZDTVAoQywgWCwgT1AsIFkpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoQykgJiYgISgoWCkgT1AgKFkpKSkpIHsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2Vsc2UKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQlcCitkbyB7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmIC8qIF9fS0RFQlVHQUxMICovCmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1ZGYyNC4uMDAwMDAwMAotLS0gYS9mcy9hZnMva2Fmc2FzeW5jZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qIGthZnNhc3luY2QuYzogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCi0gKiBUaGUgQUZTIGFzeW5jIGRhZW1vbiBpcyB1c2VkIHRvIHRoZSBmb2xsb3dpbmc6Ci0gKiAtIHByb2JlICJkZWFkIiBzZXJ2ZXJzIHRvIHNlZSB3aGV0aGVyIHRoZXkndmUgY29tZSBiYWNrIHRvIGxpZmUgeWV0LgotICogLSBwcm9iZSAibGl2ZSIgc2VydmVycyB0aGF0IHdlIGhhdmVuJ3QgdGFsa2VkIHRvIGZvciBhIHdoaWxlIHRvIHNlZSBpZiB0aGV5IGFyZSBiZXR0ZXIKLSAqICAgY2FuZGlkYXRlcyBmb3Igc2VydmluZyB0aGFuIHdoYXQgd2UncmUgY3VycmVudGx5IHVzaW5nCi0gKiAtIHBvbGwgdm9sdW1lIGxvY2F0aW9uIHNlcnZlcnMgdG8ga2VlcCB1cCB0byBkYXRlIHZvbHVtZSBsb2NhdGlvbiBsaXN0cwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJrYWZzYXN5bmNkLmgiCi0jaW5jbHVkZSAia2Fmc3RpbW9kLmgiCi0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2Fmc2FzeW5jZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNhc3luY2RfZGVhZCk7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa2Fmc2FzeW5jZF9zbGVlcHEpOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2Fmc2FzeW5jZF90YXNrOwotc3RhdGljIGludCBrYWZzYXN5bmNkX2RpZTsKLQotc3RhdGljIGludCBrYWZzYXN5bmNkKHZvaWQgKmFyZyk7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoa2Fmc2FzeW5jZF9hc3luY19hdHRucSk7Ci1zdGF0aWMgTElTVF9IRUFEKGthZnNhc3luY2RfYXN5bmNfYnVzeXEpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi1zdGF0aWMgdm9pZCBrYWZzYXN5bmNkX251bGxfY2FsbF9hdHRuX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGthZnNhc3luY2RfbnVsbF9jYWxsX2Vycm9yX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzdGFydCB0aGUgYXN5bmMgZGFlbW9uCi0gKi8KLWludCBhZnNfa2Fmc2FzeW5jZF9zdGFydCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnNhc3luY2QsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2FzeW5jZF9hbGl2ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2thZnNhc3luY2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgYXN5bmMgZGFlbW9uCi0gKi8KLXZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKQotewotCS8qIGdldCByaWQgb2YgbXkgZGFlbW9uICovCi0Ja2Fmc2FzeW5jZF9kaWUgPSAxOwotCXdha2VfdXAoJmthZnNhc3luY2Rfc2xlZXBxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzYXN5bmNkX2RlYWQpOwotCi19IC8qIGVuZCBhZnNfa2Fmc2FzeW5jZF9zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHByb2JpbmcgZGFlbW9uCi0gKi8KLXN0YXRpYyBpbnQga2Fmc2FzeW5jZCh2b2lkICphcmcpCi17Ci0Jc3RydWN0IGFmc19hc3luY19vcCAqb3A7Ci0JaW50IGRpZTsKLQotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlrYWZzYXN5bmNkX3Rhc2sgPSBjdXJyZW50OwotCi0JcHJpbnRrKCJrQUZTOiBTdGFydGVkIGthZnNhc3luY2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImthZnNhc3luY2QiKTsKLQotCWNvbXBsZXRlKCZrYWZzYXN5bmNkX2FsaXZlKTsKLQotCS8qIGxvb3AgYXJvdW5kIGxvb2tpbmcgZm9yIHRoaW5ncyB0byBhdHRlbmQgdG8gKi8KLQlkbyB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZrYWZzYXN5bmNkX3NsZWVwcSwgJm15c2VsZik7Ci0KLQkJZm9yICg7OykgewotCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSB8fAotCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8Ci0JCQkgICAga2Fmc2FzeW5jZF9kaWUpCi0JCQkJYnJlYWs7Ci0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQl9Ci0KLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmthZnNhc3luY2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KLQkJYWZzX2Rpc2NhcmRfbXlfc2lnbmFscygpOwotCi0JCWRpZSA9IGthZnNhc3luY2RfZGllOwotCi0JCS8qIGRlYWwgd2l0aCB0aGUgbmV4dCBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlcXVpcmluZwotCQkgKiBhdHRlbnRpb24gKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgewotCQkJc3RydWN0IGFmc19hc3luY19vcCAqb3A7Ci0KLQkJCV9kZWJ1ZygiQEBAIEJlZ2luIEFzeW5jaHJvbm91cyBPcGVyYXRpb24iKTsKLQotCQkJb3AgPSBOVUxMOwotCQkJc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JCQlpZiAoIWxpc3RfZW1wdHkoJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpKSB7Ci0JCQkJb3AgPSBsaXN0X2VudHJ5KGthZnNhc3luY2RfYXN5bmNfYXR0bnEubmV4dCwKLQkJCQkJCXN0cnVjdCBhZnNfYXN5bmNfb3AsIGxpbmspOwotCQkJCWxpc3RfbW92ZV90YWlsKCZvcC0+bGluaywKLQkJCQkJICAgICAgJmthZnNhc3luY2RfYXN5bmNfYnVzeXEpOwotCQkJfQotCi0JCQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCQkJX2RlYnVnKCJAQEAgT3BlcmF0aW9uICVwIHslcH1cbiIsCi0JCQkgICAgICAgb3AsIG9wID8gb3AtPm9wcyA6IE5VTEwpOwotCi0JCQlpZiAob3ApCi0JCQkJb3AtPm9wcy0+YXR0ZW5kKG9wKTsKLQotCQkJX2RlYnVnKCJAQEAgRW5kIEFzeW5jaHJvbm91cyBPcGVyYXRpb24iKTsKLQkJfQotCi0JfSB3aGlsZSghZGllKTsKLQotCS8qIG5lZWQgdG8ga2lsbCBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYmVmb3JlCi0JICogZXhpdGluZyAqLwotCWthZnNhc3luY2RfdGFzayA9IE5VTEw7Ci0Jc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JLyogZm9sZCB0aGUgYnVzeSBhbmQgYXR0ZW50aW9uIHF1ZXVlcyB0b2dldGhlciAqLwotCWxpc3Rfc3BsaWNlX2luaXQoJmthZnNhc3luY2RfYXN5bmNfYnVzeXEsCi0JCQkgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpOwotCi0JLyogZGVxdWV1ZSBrYWZzYXN5bmNkIGZyb20gYWxsIHRoZWlyIHdhaXQgcXVldWVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvcCwgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEsIGxpbmspIHsKLQkJb3AtPmNhbGwtPmFwcF9hdHRuX2Z1bmMgPSBrYWZzYXN5bmNkX251bGxfY2FsbF9hdHRuX2Z1bmM7Ci0JCW9wLT5jYWxsLT5hcHBfZXJyb3JfZnVuYyA9IGthZnNhc3luY2RfbnVsbF9jYWxsX2Vycm9yX2Z1bmM7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKLQl9Ci0KLQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCS8qIGFib3J0IGFsbCB0aGUgb3BlcmF0aW9ucyAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkpIHsKLQkJb3AgPSBsaXN0X2VudHJ5KGthZnNhc3luY2RfYXN5bmNfYXR0bnEubmV4dCwgc3RydWN0IGFmc19hc3luY19vcCwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm9wLT5saW5rKTsKLQotCQlyeHJwY19jYWxsX2Fib3J0KG9wLT5jYWxsLCAtRUlPKTsKLQkJcnhycGNfcHV0X2NhbGwob3AtPmNhbGwpOwotCQlvcC0+Y2FsbCA9IE5VTEw7Ci0KLQkJb3AtPm9wcy0+ZGlzY2FyZChvcCk7Ci0JfQotCi0JLyogYW5kIHRoYXQncyBhbGwgKi8KLQlfbGVhdmUoIiIpOwotCWNvbXBsZXRlX2FuZF9leGl0KCZrYWZzYXN5bmNkX2RlYWQsIDApOwotCi19IC8qIGVuZCBrYWZzYXN5bmNkKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGJlZ2luIGFuIG9wZXJhdGlvbgotICogLSBwbGFjZSBvcGVyYXRpb24gb24gYnVzeSBxdWV1ZQotICovCi12b2lkIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKQotewotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmb3AtPndhaXRlciwga2Fmc2FzeW5jZF90YXNrKTsKLQlhZGRfd2FpdF9xdWV1ZSgmb3AtPmNhbGwtPndhaXRxLCAmb3AtPndhaXRlcik7Ci0KLQlsaXN0X21vdmVfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKLQotCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlcXVlc3QgYXR0ZW50aW9uIGZvciBhbiBvcGVyYXRpb24KLSAqIC0gbW92ZSB0byBhdHRlbnRpb24gcXVldWUKLSAqLwotdm9pZCBhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCi17Ci0JX2VudGVyKCIiKTsKLQotCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCWxpc3RfbW92ZV90YWlsKCZvcC0+bGluaywgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpOwotCi0Jc3Bpbl91bmxvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRlcm1pbmF0ZSBhbiBvcGVyYXRpb24KLSAqIC0gcmVtb3ZlIGZyb20gZWl0aGVyIHF1ZXVlCi0gKi8KLXZvaWQgYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKQotewotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJm9wLT5saW5rKSkgewotCQlsaXN0X2RlbF9pbml0KCZvcC0+bGluayk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKLQl9Ci0KLQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCXdha2VfdXAoJmthZnNhc3luY2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfa2Fmc2FzeW5jZF90ZXJtaW5hdGVfb3AoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnNhc3luY2QuaCBiL2ZzL2Fmcy9rYWZzYXN5bmNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTgwM2YuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL2thZnNhc3luY2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGthZnNhc3luY2QuaDogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXN0cnVjdCBhZnNfYXN5bmNfb3A7Ci0KLXN0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIHsKLQl2b2lkICgqYXR0ZW5kKShzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7Ci0Jdm9pZCAoKmRpc2NhcmQpKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlY29yZAotICovCi1zdHJ1Y3QgYWZzX2FzeW5jX29wCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGluazsKLQlzdHJ1Y3QgYWZzX3NlcnZlcgkJKnNlcnZlcjsJLyogc2VydmVyIGJlaW5nIGNvbnRhY3RlZCAqLwotCXN0cnVjdCByeHJwY19jYWxsCQkqY2FsbDsJCS8qIFJ4UlBDIGNhbGwgcGVyZm9ybWluZyBvcCAqLwotCXdhaXRfcXVldWVfdAkJCXdhaXRlcjsJCS8qIHdhaXQgcXVldWUgZm9yIGthZnNhc3luY2QgKi8KLQljb25zdCBzdHJ1Y3QgYWZzX2FzeW5jX29wX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyAqLwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGFmc19hc3luY19vcF9pbml0KHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgKm9wcykKLXsKLQlJTklUX0xJU1RfSEVBRCgmb3AtPmxpbmspOwotCW9wLT5jYWxsID0gTlVMTDsKLQlvcC0+b3BzID0gb3BzOwotfQotCi1leHRlcm4gaW50IGFmc19rYWZzYXN5bmNkX3N0YXJ0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOwotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLWV4dGVybiB2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0tBRlNBU1lOQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5jIGIvZnMvYWZzL2thZnN0aW1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzNDRlLi4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9rYWZzdGltb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBrYWZzdGltb2QuYzogQUZTIHRpbWVvdXQgZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnN0aW1vZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnN0aW1vZF9kZWFkKTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChrYWZzdGltb2Rfc2xlZXBxKTsKLXN0YXRpYyBpbnQga2Fmc3RpbW9kX2RpZTsKLQotc3RhdGljIExJU1RfSEVBRChrYWZzdGltb2RfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGthZnN0aW1vZF9sb2NrKTsKLQotc3RhdGljIGludCBrYWZzdGltb2Qodm9pZCAqYXJnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbgotICovCi1pbnQgYWZzX2thZnN0aW1vZF9zdGFydCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnN0aW1vZCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzdGltb2RfYWxpdmUpOwotCi0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19rYWZzdGltb2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgdGltZW91dCBkYWVtb24KLSAqLwotdm9pZCBhZnNfa2Fmc3RpbW9kX3N0b3Aodm9pZCkKLXsKLQkvKiBnZXQgcmlkIG9mIG15IGRhZW1vbiAqLwotCWthZnN0aW1vZF9kaWUgPSAxOwotCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnN0aW1vZF9kZWFkKTsKLQotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRpbWVvdXQgcHJvY2Vzc2luZyBkYWVtb24KLSAqLwotc3RhdGljIGludCBrYWZzdGltb2Qodm9pZCAqYXJnKQotewotCXN0cnVjdCBhZnNfdGltZXIgKnRpbWVyOwotCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCXByaW50aygia0FGUzogU3RhcnRlZCBrYWZzdGltb2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImthZnN0aW1vZCIpOwotCi0JY29tcGxldGUoJmthZnN0aW1vZF9hbGl2ZSk7Ci0KLQkvKiBsb29wIGFyb3VuZCBsb29raW5nIGZvciB0aGluZ3MgdG8gYXR0ZW5kIHRvICovCi0gbG9vcDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZrYWZzdGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgbG9uZyBqaWY7Ci0JCXNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQkJLyogZGVhbCB3aXRoIHRoZSBzZXJ2ZXIgYmVpbmcgYXNrZWQgdG8gZGllICovCi0JCWlmIChrYWZzdGltb2RfZGllKSB7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJY29tcGxldGVfYW5kX2V4aXQoJmthZnN0aW1vZF9kZWFkLCAwKTsKLQkJfQotCi0JCXRyeV90b19mcmVlemUoKTsKLQotCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLwotCQlhZnNfZGlzY2FyZF9teV9zaWduYWxzKCk7Ci0KLQkJLyogd29yayBvdXQgdGhlIHRpbWUgdG8gZWxhcHNlIGJlZm9yZSB0aGUgbmV4dCBldmVudCAqLwotCQlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmthZnN0aW1vZF9saXN0KSkgewotCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCQl9Ci0JCWVsc2UgewotCQkJdGltZXIgPSBsaXN0X2VudHJ5KGthZnN0aW1vZF9saXN0Lm5leHQsCi0JCQkJCSAgIHN0cnVjdCBhZnNfdGltZXIsIGxpbmspOwotCQkJdGltZW91dCA9IHRpbWVyLT50aW1vX2ppZjsKLQkJCWppZiA9IGppZmZpZXM7Ci0KLQkJCWlmICh0aW1lX2JlZm9yZV9lcSgodW5zaWduZWQgbG9uZykgdGltZW91dCwgamlmKSkKLQkJCQlnb3RvIGltbWVkaWF0ZTsKLQotCQkJZWxzZSB7Ci0JCQkJdGltZW91dCA9IChsb25nKSB0aW1lb3V0IC0gKGxvbmcpIGppZmZpZXM7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKLQotCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JfQotCi0JLyogdGhlIHRoaW5nIG9uIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgbmVlZHMgcHJvY2Vzc2luZwotCSAqIC0gd2UgY29tZSBoZXJlIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgdGltZXIgcG9pbnRpbmcgdG8gdGhlIGV4cGlyZWQKLQkgKiAgIGVudHJ5Ci0JICovCi0gaW1tZWRpYXRlOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZrYWZzdGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JX2RlYnVnKCJAQEAgQmVnaW4gVGltZW91dCBvZiAlcCIsIHRpbWVyKTsKLQotCS8qIGRlcXVldWUgdGhlIHRpbWVyICovCi0JbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOwotCXNwaW5fdW5sb2NrKCZrYWZzdGltb2RfbG9jayk7Ci0KLQkvKiBjYWxsIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCi0JdGltZXItPm9wcy0+dGltZWRfb3V0KHRpbWVyKTsKLQotCV9kZWJ1ZygiQEBAIEVuZCBUaW1lb3V0Iik7Ci0JZ290byBsb29wOwotCi19IC8qIGVuZCBrYWZzdGltb2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogKHJlLSlxdWV1ZSBhIHRpbWVyCi0gKi8KLXZvaWQgYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQlzdHJ1Y3QgYWZzX3RpbWVyICpwdGltZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQlfZW50ZXIoIiVwLCVsdSIsIHRpbWVyLCB0aW1lb3V0KTsKLQotCXNwaW5fbG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0JbGlzdF9kZWwoJnRpbWVyLT5saW5rKTsKLQotCS8qIHRoZSB0aW1lciB3YXMgZGVmZXJyZWQgb3IgcmVzZXQgLSBwdXQgaXQgYmFjayBpbiB0aGUgcXVldWUgYXQgdGhlCi0JICogcmlnaHQgcGxhY2UgKi8KLQl0aW1lci0+dGltb19qaWYgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCWxpc3RfZm9yX2VhY2goX3AsICZrYWZzdGltb2RfbGlzdCkgewotCQlwdGltZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgYWZzX3RpbWVyLCBsaW5rKTsKLQkJaWYgKHRpbWVfYmVmb3JlKHRpbWVyLT50aW1vX2ppZiwgcHRpbWVyLT50aW1vX2ppZikpCi0JCQlicmVhazsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+bGluaywgX3ApOyAvKiBpbnNlcnQgYmVmb3JlIHN0b3BwaW5nIHBvaW50ICovCi0KLQlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma2Fmc3RpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGVxdWV1ZSBhIHRpbWVyCi0gKiAtIHJldHVybnMgMCBpZiB0aGUgdGltZXIgd2FzIGRlbGV0ZWQgb3IgLUVOT0VOVCBpZiBpdCB3YXNuJ3QgcXVldWVkCi0gKi8KLWludCBhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAiLCB0aW1lcik7Ci0KLQlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKLQotCWlmIChsaXN0X2VtcHR5KCZ0aW1lci0+bGluaykpCi0JCXJldCA9IC1FTk9FTlQ7Ci0JZWxzZQotCQlsaXN0X2RlbF9pbml0KCZ0aW1lci0+bGluayk7Ci0KLQlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma2Fmc3RpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5oIGIvZnMvYWZzL2thZnN0aW1vZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzEyZjFhLi4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9rYWZzdGltb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGthZnN0aW1vZC5oOiBBRlMgdGltZW91dCBkYWVtb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX0tBRlNUSU1PRF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfS0FGU1RJTU9EX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXN0cnVjdCBhZnNfdGltZXI7Ci0KLXN0cnVjdCBhZnNfdGltZXJfb3BzIHsKLQkvKiBjYWxsZWQgd2hlbiB0aGUgZnJvbnQgb2YgdGhlIHRpbWVyIHF1ZXVlIGhhcyB0aW1lZCBvdXQgKi8KLQl2b2lkICgqdGltZWRfb3V0KShzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcik7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHRpbWVyL3RpbWVvdXQgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfdGltZXIKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlsaW5rOwkJLyogbGluayBpbiB0aW1lciBxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcJCQl0aW1vX2ppZjsJLyogdGltZW91dCB0aW1lICovCi0JY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWZzX3RpbWVyX2luaXQoc3RydWN0IGFmc190aW1lciAqdGltZXIsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyAqb3BzKQotewotCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7Ci0JdGltZXItPm9wcyA9IG9wczsKLX0KLQotZXh0ZXJuIGludCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpOwotCi1leHRlcm4gdm9pZCBhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lciwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLWV4dGVybiBpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19LQUZTVElNT0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggZjI3MDRiYS4uNDBjMjcwNCAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xLDQgKzEsNCBAQAotLyogbWFpbi5jOiBBRlMgY2xpZW50IGZpbGUgc3lzdGVtCisvKiBBRlMgY2xpZW50IGZpbGUgc3lzdGVtCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKQEAgLTEzLDQzICsxMywyMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSAiY2FjaGUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJrYWZzYXN5bmNkLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqYWZzX3RyYW5zcG9ydDsKLQotc3RhdGljIGludCBhZnNfYWRkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotc3RhdGljIHZvaWQgYWZzX2Rpc2NhcmRpbmdfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLQogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRlMgQ2xpZW50IEZpbGUgU3lzdGVtIik7CiBNT0RVTEVfQVVUSE9SKCJSZWQgSGF0LCBJbmMuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3Vuc2lnbmVkIGFmc19kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYWZzX2RlYnVnLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGFmc19kZWJ1ZywgIkFGUyBkZWJ1Z2dpbmcgbWFzayIpOworCiBzdGF0aWMgY2hhciAqcm9vdGNlbGw7CiAKIG1vZHVsZV9wYXJhbShyb290Y2VsbCwgY2hhcnAsIDApOwogTU9EVUxFX1BBUk1fREVTQyhyb290Y2VsbCwgInJvb3QgQUZTIGNlbGwgbmFtZSBhbmQgVkwgc2VydmVyIElQIGFkZHIgbGlzdCIpOwogCi0KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlcl9vcHMgYWZzX3BlZXJfb3BzID0gewotCS5hZGRpbmcJCT0gYWZzX2FkZGluZ19wZWVyLAotCS5kaXNjYXJkaW5nCT0gYWZzX2Rpc2NhcmRpbmdfcGVlciwKLX07Ci0KLXN0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW0FGU19DQl9IQVNIX0NPVU5UXTsKLURFRklORV9TUElOTE9DSyhhZnNfY2JfaGFzaF9sb2NrKTsKLQogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVmc19uZXRmc19vcGVyYXRpb25zIGFmc19jYWNoZV9vcHMgPSB7CiAJLmdldF9wYWdlX2Nvb2tpZQk9IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUsCkBAIC02MiwyMCArNDAsNjMgQEAKIH07CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFmc191dWlkIGFmc191dWlkOworCisvKgorICogZ2V0IGEgY2xpZW50IFVVSUQKKyAqLworc3RhdGljIGludCBfX2luaXQgYWZzX2dldF9jbGllbnRfVVVJRCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwl1NjQgdXVpZHRpbWU7CisJdTE2IGNsb2Nrc2VxOworCWludCByZXQ7CisKKwkvKiByZWFkIHRoZSBNQUMgYWRkcmVzcyBvZiBvbmUgb2YgdGhlIGV4dGVybmFsIGludGVyZmFjZXMgYW5kIGNvbnN0cnVjdAorCSAqIGEgVVVJRCBmcm9tIGl0ICovCisJcmV0ID0gYWZzX2dldF9NQUNfYWRkcmVzcyhhZnNfdXVpZC5ub2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWdldG5zdGltZW9mZGF5KCZ0cyk7CisJdXVpZHRpbWUgPSAodTY0KSB0cy50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwOworCXV1aWR0aW1lICs9IHRzLnR2X25zZWMgLyAxMDA7CisJdXVpZHRpbWUgKz0gQUZTX1VVSURfVE9fVU5JWF9USU1FOworCWFmc191dWlkLnRpbWVfbG93ID0gdXVpZHRpbWU7CisJYWZzX3V1aWQudGltZV9taWQgPSB1dWlkdGltZSA+PiAzMjsKKwlhZnNfdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uID0gKHV1aWR0aW1lID4+IDQ4KSAmIEFGU19VVUlEX1RJTUVISV9NQVNLOworCWFmc191dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24gPSBBRlNfVVVJRF9WRVJTSU9OX1RJTUU7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZjbG9ja3NlcSwgMik7CisJYWZzX3V1aWQuY2xvY2tfc2VxX2xvdyA9IGNsb2Nrc2VxOworCWFmc191dWlkLmNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgPQorCQkoY2xvY2tzZXEgPj4gOCkgJiBBRlNfVVVJRF9DTE9DS0hJX01BU0s7CisJYWZzX3V1aWQuY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZCA9IEFGU19VVUlEX1ZBUklBTlRfU1REOworCisJX2RlYnVnKCJBRlMgVVVJRDogJTA4eC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkgICAgICAgYWZzX3V1aWQudGltZV9sb3csCisJICAgICAgIGFmc191dWlkLnRpbWVfbWlkLAorCSAgICAgICBhZnNfdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uLAorCSAgICAgICBhZnNfdXVpZC5jbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkLAorCSAgICAgICBhZnNfdXVpZC5jbG9ja19zZXFfbG93LAorCSAgICAgICBhZnNfdXVpZC5ub2RlWzBdLCBhZnNfdXVpZC5ub2RlWzFdLCBhZnNfdXVpZC5ub2RlWzJdLAorCSAgICAgICBhZnNfdXVpZC5ub2RlWzNdLCBhZnNfdXVpZC5ub2RlWzRdLCBhZnNfdXVpZC5ub2RlWzVdKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogaW5pdGlhbGlzZSB0aGUgQUZTIGNsaWVudCBGUyBtb2R1bGUKICAqLwogc3RhdGljIGludCBfX2luaXQgYWZzX2luaXQodm9pZCkKIHsKLQlpbnQgbG9vcCwgcmV0OworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSByZWdpc3RlcmluZy5cbiIpOwogCi0JLyogaW5pdGlhbGlzZSB0aGUgY2FsbGJhY2sgaGFzaCB0YWJsZSAqLwotCXNwaW5fbG9ja19pbml0KCZhZnNfY2JfaGFzaF9sb2NrKTsKLQlmb3IgKGxvb3AgPSBBRlNfQ0JfSEFTSF9DT1VOVCAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQotCQlJTklUX0xJU1RfSEVBRCgmYWZzX2NiX2hhc2hfdGJsW2xvb3BdKTsKKwlyZXQgPSBhZnNfZ2V0X2NsaWVudF9VVUlEKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiByZWdpc3RlciB0aGUgL3Byb2Mgc3R1ZmYgKi8KIAlyZXQgPSBhZnNfcHJvY19pbml0KCk7CkBAIC04Nyw3MCArMTA4LDU2IEBACiAJcmV0ID0gY2FjaGVmc19yZWdpc3Rlcl9uZXRmcygmYWZzX2NhY2hlX25ldGZzLAogCQkJCSAgICAgJmFmc19jYWNoZV9jZWxsX2luZGV4X2RlZik7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19LRVlTX1RVUk5FRF9PRkYKLQlyZXQgPSBhZnNfa2V5X3JlZ2lzdGVyKCk7Ci0JaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfY2FjaGU7CiAjZW5kaWYKIAogCS8qIGluaXRpYWxpc2UgdGhlIGNlbGwgREIgKi8KIAlyZXQgPSBhZnNfY2VsbF9pbml0KHJvb3RjZWxsKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rZXlzOworCQlnb3RvIGVycm9yX2NlbGxfaW5pdDsKIAotCS8qIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbiAqLwotCXJldCA9IGFmc19rYWZzdGltb2Rfc3RhcnQoKTsKKwkvKiBpbml0aWFsaXNlIHRoZSBWTCB1cGRhdGUgcHJvY2VzcyAqLworCXJldCA9IGFmc192bG9jYXRpb25fdXBkYXRlX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rZXlzOworCQlnb3RvIGVycm9yX3ZsX3VwZGF0ZV9pbml0OwogCi0JLyogc3RhcnQgdGhlIGFzeW5jIG9wZXJhdGlvbiBkYWVtb24gKi8KLQlyZXQgPSBhZnNfa2Fmc2FzeW5jZF9zdGFydCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2thZnN0aW1vZDsKKwkvKiBpbml0aWFsaXNlIHRoZSBjYWxsYmFjayB1cGRhdGUgcHJvY2VzcyAqLworCXJldCA9IGFmc19jYWxsYmFja191cGRhdGVfaW5pdCgpOwogCiAJLyogY3JlYXRlIHRoZSBSeFJQQyB0cmFuc3BvcnQgKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfdHJhbnNwb3J0KDcwMDEsICZhZnNfdHJhbnNwb3J0KTsKKwlyZXQgPSBhZnNfb3Blbl9zb2NrZXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rYWZzYXN5bmNkOwotCi0JYWZzX3RyYW5zcG9ydC0+cGVlcl9vcHMgPSAmYWZzX3BlZXJfb3BzOworCQlnb3RvIGVycm9yX29wZW5fc29ja2V0OwogCiAJLyogcmVnaXN0ZXIgdGhlIGZpbGVzeXN0ZW1zICovCiAJcmV0ID0gYWZzX2ZzX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl90cmFuc3BvcnQ7CisJCWdvdG8gZXJyb3JfZnM7CiAKIAlyZXR1cm4gcmV0OwogCi0gZXJyb3JfdHJhbnNwb3J0OgotCXJ4cnBjX3B1dF90cmFuc3BvcnQoYWZzX3RyYW5zcG9ydCk7Ci0gZXJyb3Jfa2Fmc2FzeW5jZDoKLQlhZnNfa2Fmc2FzeW5jZF9zdG9wKCk7Ci0gZXJyb3Jfa2Fmc3RpbW9kOgotCWFmc19rYWZzdGltb2Rfc3RvcCgpOwotIGVycm9yX2tleXM6Ci0jaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgotCWFmc19rZXlfdW5yZWdpc3RlcigpOwotIGVycm9yX2NhY2hlOgotI2VuZGlmCitlcnJvcl9mczoKKwlhZnNfY2xvc2Vfc29ja2V0KCk7CitlcnJvcl9vcGVuX3NvY2tldDoKK2Vycm9yX3ZsX3VwZGF0ZV9pbml0OgorZXJyb3JfY2VsbF9pbml0OgogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIAljYWNoZWZzX3VucmVnaXN0ZXJfbmV0ZnMoJmFmc19jYWNoZV9uZXRmcyk7Ci0gZXJyb3I6CitlcnJvcl9jYWNoZToKICNlbmRpZgorCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOworCWFmc192bG9jYXRpb25fcHVyZ2UoKTsKIAlhZnNfY2VsbF9wdXJnZSgpOwogCWFmc19wcm9jX2NsZWFudXAoKTsKIAlwcmludGsoS0VSTl9FUlIgImtBRlM6IGZhaWxlZCB0byByZWdpc3RlcjogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19pbml0KCkgKi8KK30KIAogLyogWFhYIGxhdGVfaW5pdGNhbGwgaXMga2x1ZGd5LCBidXQgdGhlIG9ubHkgYWx0ZXJuYXRpdmUgc2VlbXMgdG8gY3JlYXRlCiAgKiBhIHRyYW5zcG9ydCB1cG9uIHRoZSBmaXJzdCBtb3VudCwgd2hpY2ggaXMgd29yc2UuIE9yIGlzIGl0PwogICovCiBsYXRlX2luaXRjYWxsKGFmc19pbml0KTsJLyogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbmV0LyB0byBjcmVhdGUgc29ja2V0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qCiAgKiBjbGVhbiB1cCBvbiBtb2R1bGUgcmVtb3ZhbAogICovCkBAIC0xNTksMTI3ICsxNjYsMTYgQEAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSB1bnJlZ2lzdGVyaW5nLlxuIik7CiAKIAlhZnNfZnNfZXhpdCgpOwotCXJ4cnBjX3B1dF90cmFuc3BvcnQoYWZzX3RyYW5zcG9ydCk7Ci0JYWZzX2thZnN0aW1vZF9zdG9wKCk7Ci0JYWZzX2thZnNhc3luY2Rfc3RvcCgpOworCWFmc19jbG9zZV9zb2NrZXQoKTsKKwlhZnNfcHVyZ2Vfc2VydmVycygpOworCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOworCWFmc192bG9jYXRpb25fcHVyZ2UoKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWFmc19jZWxsX3B1cmdlKCk7Ci0jaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgotCWFmc19rZXlfdW5yZWdpc3RlcigpOwotI2VuZGlmCiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAogCWNhY2hlZnNfdW5yZWdpc3Rlcl9uZXRmcygmYWZzX2NhY2hlX25ldGZzKTsKICNlbmRpZgogCWFmc19wcm9jX2NsZWFudXAoKTsKLQotfSAvKiBlbmQgYWZzX2V4aXQoKSAqLworfQogCiBtb2R1bGVfZXhpdChhZnNfZXhpdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RpZmljYXRpb24gdGhhdCBuZXcgcGVlciByZWNvcmQgaXMgYmVpbmcgYWRkZWQKLSAqIC0gY2FsbGVkIGZyb20ga3J4c2VjZAotICogLSByZXR1cm4gYW4gZXJyb3IgdG8gaW5kdWNlIGFuIGFib3J0Ci0gKiAtIG11c3RuJ3Qgc2xlZXAgKGNhbGxlciBob2xkcyBhbiByd2xvY2spCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2FkZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0JaW50IHJldDsKLQotCV9kZWJ1Zygia0FGUzogQWRkaW5nIG5ldyBwZWVyICUwOHhcbiIsIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7Ci0KLQkvKiBkZXRlcm1pbmUgd2hpY2ggc2VydmVyIHRoZSBwZWVyIHJlc2lkZXMgaW4gKGlmIGFueSkgKi8KLQlyZXQgPSBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcihwZWVyLCAmc2VydmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsgLyogbm9uZSB0aGF0IHdlIHJlY29nbmlzZSwgc28gYWJvcnQgKi8KLQotCV9kZWJ1ZygiU2VydmVyICVwe3U9JWR9XG4iLCBzZXJ2ZXIsIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSk7Ci0KLQlfZGVidWcoIkNlbGwgJXB7dT0lZH1cbiIsCi0JICAgICAgIHNlcnZlci0+Y2VsbCwgYXRvbWljX3JlYWQoJnNlcnZlci0+Y2VsbC0+dXNhZ2UpKTsKLQotCS8qIGNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KLQlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQlwZWVyLT51c2VyID0gc2VydmVyOwotCXNlcnZlci0+cGVlciA9IHBlZXI7Ci0Jc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19hZGRpbmdfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RpZmljYXRpb24gdGhhdCBhIHBlZXIgcmVjb3JkIGlzIGJlaW5nIGRpc2NhcmRlZAotICogLSBjYWxsZWQgZnJvbSBrcnhpb2Qgb3Iga3J4c2VjZAotICovCi1zdGF0aWMgdm9pZCBhZnNfZGlzY2FyZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0KLQlfZW50ZXIoIiVwIixwZWVyKTsKLQotCV9kZWJ1ZygiRGlzY2FyZGluZyBwZWVyICUwOHggKHJ0dD0lbHUuJWx1bVMpXG4iLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkciksCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0IC8gMTAwMCksCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0ICUgMTAwMCkpOwotCi0JLyogdW5jcm9zcy1wb2ludCB0aGUgc3RydWN0cyB1bmRlciBhIGdsb2JhbCBsb2NrICovCi0Jc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7Ci0Jc2VydmVyID0gcGVlci0+dXNlcjsKLQlpZiAoc2VydmVyKSB7Ci0JCXBlZXItPnVzZXIgPSBOVUxMOwotCQlzZXJ2ZXItPnBlZXIgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgYWZzX2Rpc2NhcmRpbmdfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhciB0aGUgZGVhZCBzcGFjZSBiZXR3ZWVuIHRhc2tfc3RydWN0IGFuZCBrZXJuZWwgc3RhY2sKLSAqIC0gY2FsbGVkIGJ5IHN1cHBseWluZyAtZmluc3RydW1lbnQtZnVuY3Rpb25zIHRvIGdjYwotICovCi0jaWYgMAotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZW50ZXIgKHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLV9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKTsKLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZW50ZXIgKHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLXsKLSAgICAgICBhc20gdm9sYXRpbGUoIiAgbW92bCAgICAlJWVzcCwlJWVkaSAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAlJWVzcCwlJWVjeCAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAkMHhlZGVkZWRlZCwlJWVheCAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogImkiKH4oVEhSRUFEX1NJWkUgLSAxKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgotICAgICAgICAgICAgICAgICAgICApOwotfQotCi12b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0KHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLV9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKTsKLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdCh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi17Ci0gICAgICAgYXNtIHZvbGF0aWxlKCIgIG1vdmwgICAgJSVlc3AsJSVlZGkgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBhbmRsICAgICUwLCUlZWRpICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgYWRkbCAgICAlMSwlJWVkaSAgICAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJSVlc3AsJSVlY3ggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBzdWJsICAgICUlZWRpLCUlZWN4ICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgc2hybCAgICAkMiwlJWVjeCAgICAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJDB4ZGFkYWRhZGEsJSVlYXggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICByZXAgc3Rvc2wgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6ICJpIih+KFRIUkVBRF9TSVpFIC0gMSkpLCAiaSIoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpCi0gICAgICAgICAgICAgICAgICAgIDogImVheCIsICJlY3giLCAiZWRpIiwgIm1lbW9yeSIsICJjYyIKLSAgICAgICAgICAgICAgICAgICAgKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYWZzL21pc2MuYyBiL2ZzL2Fmcy9taXNjLmMKaW5kZXggZTRmY2U2Ni4uY2RiOTc5MiAxMDA2NDQKLS0tIGEvZnMvYWZzL21pc2MuYworKysgYi9mcy9hZnMvbWlzYy5jCkBAIC0xLDYgKzEsNiBAQAotLyogbWlzYy5jOiBtaXNjZWxsYW5lb3VzIGJpdHMKKy8qIG1pc2NlbGxhbmVvdXMgYml0cwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEyLDE5ICsxMiwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSAiZXJyb3JzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZnNfZnMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNvbnZlcnQgYW4gQUZTIGFib3J0IGNvZGUgdG8gYSBMaW51eCBlcnJvciBudW1iZXIKICAqLwotaW50IGFmc19hYm9ydF90b19lcnJvcihpbnQgYWJvcnRjb2RlKQoraW50IGFmc19hYm9ydF90b19lcnJvcih1MzIgYWJvcnRfY29kZSkKIHsKLQlzd2l0Y2ggKGFib3J0Y29kZSkgeworCXN3aXRjaCAoYWJvcnRfY29kZSkgeworCWNhc2UgMTM6CQlyZXR1cm4gLUVBQ0NFUzsKKwljYXNlIDMwOgkJcmV0dXJuIC1FUk9GUzsKIAljYXNlIFZTQUxWQUdFOgkJcmV0dXJuIC1FSU87CiAJY2FzZSBWTk9WTk9ERToJCXJldHVybiAtRU5PRU5UOwotCWNhc2UgVk5PVk9MOgkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIFZOT1ZPTDoJCXJldHVybiAtRU5PTUVESVVNOwogCWNhc2UgVlZPTEVYSVNUUzoJcmV0dXJuIC1FRVhJU1Q7CiAJY2FzZSBWTk9TRVJWSUNFOglyZXR1cm4gLUVJTzsKIAljYXNlIFZPRkZMSU5FOgkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0zMyw3ICszNCwyNCBAQAogCWNhc2UgVk9WRVJRVU9UQToJcmV0dXJuIC1FRFFVT1Q7CiAJY2FzZSBWQlVTWToJCXJldHVybiAtRUJVU1k7CiAJY2FzZSBWTU9WRUQ6CQlyZXR1cm4gLUVOWElPOwotCWRlZmF1bHQ6CQlyZXR1cm4gLUVJTzsKKwljYXNlIDB4MmY2ZGYwYzoJCXJldHVybiAtRUFDQ0VTOworCWNhc2UgMHgyZjZkZjBmOgkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIDB4MmY2ZGYxMDoJCXJldHVybiAtRUVYSVNUOworCWNhc2UgMHgyZjZkZjExOgkJcmV0dXJuIC1FWERFVjsKKwljYXNlIDB4MmY2ZGYxMzoJCXJldHVybiAtRU5PVERJUjsKKwljYXNlIDB4MmY2ZGYxNDoJCXJldHVybiAtRUlTRElSOworCWNhc2UgMHgyZjZkZjE1OgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAweDJmNmRmMWE6CQlyZXR1cm4gLUVGQklHOworCWNhc2UgMHgyZjZkZjFiOgkJcmV0dXJuIC1FTk9TUEM7CisJY2FzZSAweDJmNmRmMWQ6CQlyZXR1cm4gLUVST0ZTOworCWNhc2UgMHgyZjZkZjFlOgkJcmV0dXJuIC1FTUxJTks7CisJY2FzZSAweDJmNmRmMjA6CQlyZXR1cm4gLUVET007CisJY2FzZSAweDJmNmRmMjE6CQlyZXR1cm4gLUVSQU5HRTsKKwljYXNlIDB4MmY2ZGYyMjoJCXJldHVybiAtRURFQURMSzsKKwljYXNlIDB4MmY2ZGYyMzoJCXJldHVybiAtRU5BTUVUT09MT05HOworCWNhc2UgMHgyZjZkZjI0OgkJcmV0dXJuIC1FTk9MQ0s7CisJY2FzZSAweDJmNmRmMjY6CQlyZXR1cm4gLUVOT1RFTVBUWTsKKwljYXNlIDB4MmY2ZGY3ODoJCXJldHVybiAtRURRVU9UOworCWRlZmF1bHQ6CQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9Ci0KLX0gLyogZW5kIGFmc19hYm9ydF90b19lcnJvcigpICovCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvbW50cHQuYyBiL2ZzL2Fmcy9tbnRwdC5jCmluZGV4IDY4NDk1ZjAuLmI5MDVhZTMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9tbnRwdC5jCisrKyBiL2ZzL2Fmcy9tbnRwdC5jCkBAIC0xLDQgKzEsNCBAQAotLyogbW50cHQuYzogbW91bnRwb2ludCBtYW5hZ2VtZW50CisvKiBtb3VudHBvaW50IG1hbmFnZW1lbnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMTgsMTAgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgotI2luY2x1ZGUgInN1cGVyLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgInZub2RlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCkBAIC0zMCw2ICsyNiw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIHN0YXRpYyBpbnQgYWZzX21udHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHZvaWQgKmFmc19tbnRwdF9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyB2b2lkIGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBhZnNfbW50cHRfb3BlbiwKQEAgLTQzLDI0ICs0MCwxOSBAQAogfTsKIAogc3RhdGljIExJU1RfSEVBRChhZnNfdmZzbW91bnRzKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dCk7CiAKLXN0YXRpYyB2b2lkIGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKTsKK3Vuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0ID0gMTAgKiA2MDsKIAotc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX21udHB0X2V4cGlyeV90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0LAotfTsKLQotc3RydWN0IGFmc190aW1lciBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyOwotCi11bnNpZ25lZCBsb25nIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCA9IDIwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2hlY2sgYSBzeW1ib2xpYyBsaW5rIHRvIHNlZSB3aGV0aGVyIGl0IGFjdHVhbGx5IGVuY29kZXMgYSBtb3VudHBvaW50CiAgKiAtIHNldHMgdGhlIEFGU19WTk9ERV9NT1VOVFBPSU5UIGZsYWcgb24gdGhlIHZub2RlIGFwcHJvcHJpYXRlbHkKICAqLwotaW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoraW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCiB7CisJc3RydWN0IGZpbGUgZmlsZSA9IHsKKwkJLnByaXZhdGVfZGF0YSA9IGtleSwKKwl9OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXNpemVfdCBzaXplOwogCWNoYXIgKmJ1ZjsKQEAgLTY5LDcgKzYxLDcgQEAKIAlfZW50ZXIoInsldSwldX0iLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CiAKIAkvKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc3ltbGluayBpbnRvIHRoZSBwYWdlY2FjaGUgKi8KLQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UoQUZTX1ZOT0RFX1RPX0kodm5vZGUpLT5pX21hcHBpbmcsIDAsIE5VTEwpOworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZywgMCwgJmZpbGUpOwogCWlmIChJU19FUlIocGFnZSkpIHsKIAkJcmV0ID0gUFRSX0VSUihwYWdlKTsKIAkJZ290byBvdXQ7CkBAIC04NSw3ICs3Nyw3IEBACiAKIAkvKiBleGFtaW5lIHRoZSBzeW1saW5rJ3MgY29udGVudHMgKi8KIAlzaXplID0gdm5vZGUtPnN0YXR1cy5zaXplOwotCV9kZWJ1Zygic3ltbGluayB0byAlKi4qcyIsIHNpemUsIChpbnQpIHNpemUsIGJ1Zik7CisJX2RlYnVnKCJzeW1saW5rIHRvICUqLipzIiwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwgYnVmKTsKIAogCWlmIChzaXplID4gMiAmJgogCSAgICAoYnVmWzBdID09ICclJyB8fCBidWZbMF0gPT0gJyMnKSAmJgpAQCAtOTMsMjIgKzg1LDIwIEBACiAJICAgICkgewogCQlfZGVidWcoInN5bWxpbmsgaXMgYSBtb3VudHBvaW50Iik7CiAJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX01PVU5UUE9JTlQ7CisJCXNldF9iaXQoQUZTX1ZOT0RFX01PVU5UUE9JTlQsICZ2bm9kZS0+ZmxhZ3MpOwogCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCX0KIAogCXJldCA9IDA7CiAKLSBvdXRfZnJlZToKK291dF9mcmVlOgogCWt1bm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0gb3V0Ogorb3V0OgogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc19tbnRwdF9jaGVja19zeW1saW5rKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG5vIHZhbGlkIGxvb2t1cCBwcm9jZWR1cmUgb24gdGhpcyBzb3J0IG9mIGRpcgogICovCkBAIC0xMTYsNyArMTA2LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlrZW50ZXIoIiVwLCVweyVweyVzfSwlc30iLAorCV9lbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCiAJICAgICAgIGRpciwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBkZW50cnktPmRfcGFyZW50LApAQCAtMTI1LDE1ICsxMTUsMTQgQEAKIAkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlyZXR1cm4gRVJSX1BUUigtRVJFTU9URSk7Ci19IC8qIGVuZCBhZnNfbW50cHRfbG9va3VwKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG5vIHZhbGlkIG9wZW4gcHJvY2VkdXJlIG9uIHRoaXMgc29ydCBvZiBkaXIKICAqLwogc3RhdGljIGludCBhZnNfbW50cHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlrZW50ZXIoIiVwLCVweyVweyVzfSwlc30iLAorCV9lbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCiAJICAgICAgIGlub2RlLCBmaWxlLAogCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCwKIAkgICAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQgPwpAQCAtMTQyLDkgKzEzMSw4IEBACiAJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCXJldHVybiAtRVJFTU9URTsKLX0gLyogZW5kIGFmc19tbnRwdF9vcGVuKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNyZWF0ZSBhIHZmc21vdW50IHRvIGJlIGF1dG9tb3VudGVkCiAgKi8KQEAgLTE1Nyw3ICsxNDUsNyBAQAogCWNoYXIgKmJ1ZiwgKmRldm5hbWUgPSBOVUxMLCAqb3B0aW9ucyA9IE5VTEw7CiAJaW50IHJldDsKIAotCWtlbnRlcigieyVzfSIsIG1udHB0LT5kX25hbWUubmFtZSk7CisJX2VudGVyKCJ7JXN9IiwgbW50cHQtPmRfbmFtZS5uYW1lKTsKIAogCUJVR19PTighbW50cHQtPmRfaW5vZGUpOwogCkBAIC0yMDEsNzkgKzE4OSwxMDggQEAKIAkJc3RyY2F0KG9wdGlvbnMsICIscndwYXRoIik7CiAKIAkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLwotCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7CisJX2RlYnVnKCItLS0gYXR0ZW1wdGluZyBtb3VudCAlcyAtbyAlcyAtLS0iLCBkZXZuYW1lLCBvcHRpb25zKTsKIAltbnQgPSB2ZnNfa2Vybl9tb3VudCgmYWZzX2ZzX3R5cGUsIDAsIGRldm5hbWUsIG9wdGlvbnMpOwotCWtkZWJ1ZygiLS0tIG1vdW50IHJlc3VsdCAlcCAtLS0iLCBtbnQpOworCV9kZWJ1ZygiLS0tIG1vdW50IHJlc3VsdCAlcCAtLS0iLCBtbnQpOwogCiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBkZXZuYW1lKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG9wdGlvbnMpOwotCWtsZWF2ZSgiID0gJXAiLCBtbnQpOworCV9sZWF2ZSgiID0gJXAiLCBtbnQpOwogCXJldHVybiBtbnQ7CiAKLSBlcnJvcjoKK2Vycm9yOgogCWlmIChwYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJaWYgKGRldm5hbWUpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CiAJaWYgKG9wdGlvbnMpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7Ci0Ja2xlYXZlKCIgPSAlZCIsIHJldCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKLX0gLyogZW5kIGFmc19tbnRwdF9kb19hdXRvbW91bnQoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZm9sbG93IGEgbGluayBmcm9tIGEgbW91bnRwb2ludCBkaXJlY3RvcnksIHRodXMgY2F1c2luZyBpdCB0byBiZSBtb3VudGVkCiAgKi8KIHN0YXRpYyB2b2lkICphZnNfbW50cHRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm5ld21udDsKLQlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5OwogCWludCBlcnI7CiAKLQlrZW50ZXIoIiVweyVzfSx7JXM6JXB7JXN9fSIsCisJX2VudGVyKCIlcHslc30seyVzOiVweyVzfSx9IiwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAogCSAgICAgICBuZC0+bW50LT5tbnRfZGV2bmFtZSwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBuZC0+ZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQluZXdtbnQgPSBhZnNfbW50cHRfZG9fYXV0b21vdW50KGRlbnRyeSk7CisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCisJbmV3bW50ID0gYWZzX21udHB0X2RvX2F1dG9tb3VudChuZC0+ZGVudHJ5KTsKIAlpZiAoSVNfRVJSKG5ld21udCkpIHsKIAkJcGF0aF9yZWxlYXNlKG5kKTsKIAkJcmV0dXJuICh2b2lkICopbmV3bW50OwogCX0KIAotCW9sZF9kZW50cnkgPSBuZC0+ZGVudHJ5OwotCW5kLT5kZW50cnkgPSBkZW50cnk7Ci0JZXJyID0gZG9fYWRkX21vdW50KG5ld21udCwgbmQsIDAsICZhZnNfdmZzbW91bnRzKTsKLQluZC0+ZGVudHJ5ID0gb2xkX2RlbnRyeTsKLQotCXBhdGhfcmVsZWFzZShuZCk7Ci0KLQlpZiAoIWVycikgewotCQltbnRnZXQobmV3bW50KTsKKwltbnRnZXQobmV3bW50KTsKKwllcnIgPSBkb19hZGRfbW91bnQobmV3bW50LCBuZCwgTU5UX1NIUklOS0FCTEUsICZhZnNfdmZzbW91bnRzKTsKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgMDoKKwkJbW50cHV0KG5kLT5tbnQpOworCQlkcHV0KG5kLT5kZW50cnkpOwogCQluZC0+bW50ID0gbmV3bW50OwotCQlkZ2V0KG5ld21udC0+bW50X3Jvb3QpOwotCQluZC0+ZGVudHJ5ID0gbmV3bW50LT5tbnRfcm9vdDsKKwkJbmQtPmRlbnRyeSA9IGRnZXQobmV3bW50LT5tbnRfcm9vdCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX21udHB0X2V4cGlyeV90aW1lciwKKwkJCQkgICAgICBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJCWJyZWFrOworCWNhc2UgLUVCVVNZOgorCQkvKiBzb21lb25lIGVsc2UgbWFkZSBhIG1vdW50IGhlcmUgd2hpbHN0IHdlIHdlcmUgYnVzeSAqLworCQl3aGlsZSAoZF9tb3VudHBvaW50KG5kLT5kZW50cnkpICYmCisJCSAgICAgICBmb2xsb3dfZG93bigmbmQtPm1udCwgJm5kLT5kZW50cnkpKQorCQkJOworCQllcnIgPSAwOworCWRlZmF1bHQ6CisJCW1udHB1dChuZXdtbnQpOworCQlicmVhazsKIAl9CiAKLQlrbGVhdmUoIiA9ICVkIiwgZXJyKTsKKwlfbGVhdmUoIiA9ICVkIiwgZXJyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwotfSAvKiBlbmQgYWZzX21udHB0X2ZvbGxvd19saW5rKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGhhbmRsZSBtb3VudHBvaW50IGV4cGlyeSB0aW1lciBnb2luZyBvZmYKICAqLwotc3RhdGljIHZvaWQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCitzdGF0aWMgdm9pZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Ja2VudGVyKCIiKTsKKwlfZW50ZXIoIiIpOwogCi0JbWFya19tb3VudHNfZm9yX2V4cGlyeSgmYWZzX3Zmc21vdW50cyk7CisJaWYgKCFsaXN0X2VtcHR5KCZhZnNfdmZzbW91bnRzKSkgeworCQltYXJrX21vdW50c19mb3JfZXhwaXJ5KCZhZnNfdmZzbW91bnRzKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLAorCQkJCSAgICAgIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKKwl9CiAKLQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lciwKLQkJCQlhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJX2xlYXZlKCIiKTsKK30KIAotCWtsZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dCgpICovCisvKgorICoga2lsbCB0aGUgQUZTIG1vdW50cG9pbnQgdGltZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgKi8KK3ZvaWQgYWZzX21udHB0X2tpbGxfdGltZXIodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKGxpc3RfZW1wdHkoJmFmc192ZnNtb3VudHMpKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisvKgorICogYmVnaW4gdW5tb3VudCBieSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhbGwgYXV0b21vdW50ZWQgbW91bnRwb2ludHMgd2UgYWRkZWQKKyAqLwordm9pZCBhZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCit7CisJc2hyaW5rX3N1Ym1vdW50cyh2ZnNtbnQsICZhZnNfdmZzbW91bnRzKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tb3VudC5oIGIvZnMvYWZzL21vdW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmY0NmUuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL21vdW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBtb3VudC5oOiBtb3VudCBwYXJhbWV0ZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19NT1VOVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfTU9VTlRfSAotCi1zdHJ1Y3QgYWZzX21vdW50ZGF0YSB7Ci0JY29uc3QgY2hhcgkJKnZvbHVtZTsJLyogbmFtZSBvZiB2b2x1bWUgKi8KLQljb25zdCBjaGFyCQkqY2VsbDsJCS8qIG5hbWUgb2YgY2VsbCBjb250YWluaW5nIHZvbHVtZSAqLwotCWNvbnN0IGNoYXIJCSpjYWNoZTsJCS8qIG5hbWUgb2YgY2FjaGUgYmxvY2sgZGV2aWNlICovCi0Jc2l6ZV90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBzZXJ2ZXIgYWRkcmVzc2VzIGxpc3RlZCAqLwotCXVpbnQzMl90CQlzZXJ2ZXJzWzEwXTsJLyogSVAgYWRkcmVzc2VzIG9mIHNlcnZlcnMgaW4gdGhpcyBjZWxsICovCi19OwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19NT1VOVF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvcHJvYy5jIGIvZnMvYWZzL3Byb2MuYwppbmRleCBhZTZiODViLi5kNTYwMWY2IDEwMDY0NAotLS0gYS9mcy9hZnMvcHJvYy5jCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTEsNCArMSw0IEBACi0vKiBwcm9jLmM6IC9wcm9jIGludGVyZmFjZSBmb3IgQUZTCisvKiAvcHJvYyBpbnRlcmZhY2UgZm9yIEFGUwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCkBAIC0xMyw4ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInZvbHVtZS5oIgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTMwLDcgKzEyOCw2IEBACiAJLnJlbGVhc2UJPSBhZnNfcHJvY19jZWxsX3NlcnZlcnNfcmVsZWFzZSwKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbml0aWFsaXNlIHRoZSAvcHJvYy9mcy9hZnMvIGRpcmVjdG9yeQogICovCkBAIC0xNDIsNDcgKzEzOSw0MyBAQAogCiAJcHJvY19hZnMgPSBwcm9jX21rZGlyKCJmcy9hZnMiLCBOVUxMKTsKIAlpZiAoIXByb2NfYWZzKQotCQlnb3RvIGVycm9yOworCQlnb3RvIGVycm9yX2RpcjsKIAlwcm9jX2Fmcy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY2VsbHMiLCAwLCBwcm9jX2Fmcyk7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX3Byb2M7CisJCWdvdG8gZXJyb3JfY2VsbHM7CiAJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgicm9vdGNlbGwiLCAwLCBwcm9jX2Fmcyk7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX2NlbGxzOworCQlnb3RvIGVycm9yX3Jvb3RjZWxsOwogCXAtPnByb2NfZm9wcyA9ICZhZnNfcHJvY19yb290Y2VsbF9mb3BzOwogCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKIAlfbGVhdmUoIiA9IDAiKTsKIAlyZXR1cm4gMDsKIAotIGVycm9yX2NlbGxzOgorZXJyb3Jfcm9vdGNlbGw6CiAgCXJlbW92ZV9wcm9jX2VudHJ5KCJjZWxscyIsIHByb2NfYWZzKTsKLSBlcnJvcl9wcm9jOgorZXJyb3JfY2VsbHM6CiAJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOwotIGVycm9yOgorZXJyb3JfZGlyOgogCV9sZWF2ZSgiID0gLUVOT01FTSIpOwogCXJldHVybiAtRU5PTUVNOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19pbml0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNsZWFuIHVwIHRoZSAvcHJvYy9mcy9hZnMvIGRpcmVjdG9yeQogICovCiB2b2lkIGFmc19wcm9jX2NsZWFudXAodm9pZCkKIHsKKwlyZW1vdmVfcHJvY19lbnRyeSgicm9vdGNlbGwiLCBwcm9jX2Fmcyk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImNlbGxzIiwgcHJvY19hZnMpOwotCiAJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jbGVhbnVwKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy9jZWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjZWxscwogICovCkBAIC0xOTksOSArMTkyLDggQEAKIAltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfb3BlbigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQogICogZmlyc3QgaXRlbQpAQCAtMjI1LDkgKzIxNyw4IEBACiAJCQlicmVhazsKIAogCXJldHVybiBfcCAhPSAmYWZzX3Byb2NfY2VsbHMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsc19zdGFydCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CiAgKi8KQEAgLTI0MSwxOSArMjMyLDE2IEBACiAJX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7CiAKIAlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfbmV4dCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKICAqLwogc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCiB7CiAJdXBfcmVhZCgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKK30KIAotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNlbGwgbGluZXMKICAqLwpAQCAtMjYxLDE5ICsyNDksMTggQEAKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfY2VsbCwgcHJvY19saW5rKTsKIAotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwogCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJCXNlcV9wdXRzKG0sICJVU0UgTkFNRVxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwgIiUzZCAlc1xuIiwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7Ci0KKwlzZXFfcHJpbnRmKG0sICIlM2QgJXNcbiIsCisJCSAgIGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSksIGNlbGwtPm5hbWUpOwogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc2hvdygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9jZWxscwogICogLSB0byBhZGQgY2VsbHM6IGVjaG8gImFkZCA8Y2VsbG5hbWU+IDxJUD5bOjxJUD5dWzo8SVA+XSIKQEAgLTMyNiwzMCArMzEzLDMyIEBACiAKIAlpZiAoc3RyY21wKGtidWYsICJhZGQiKSA9PSAwKSB7CiAJCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQkJcmV0ID0gYWZzX2NlbGxfY3JlYXRlKG5hbWUsIGFyZ3MsICZjZWxsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGRvbmU7CiAKKwkJY2VsbCA9IGFmc19jZWxsX2NyZWF0ZShuYW1lLCBhcmdzKTsKKwkJaWYgKElTX0VSUihjZWxsKSkgeworCQkJcmV0ID0gUFRSX0VSUihjZWxsKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWFmc19wdXRfY2VsbChjZWxsKTsKIAkJcHJpbnRrKCJrQUZTOiBBZGRlZCBuZXcgY2VsbCAnJXMnXG4iLCBuYW1lKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJZ290byBpbnZhbDsKIAl9CiAKIAlyZXQgPSBzaXplOwogCi0gZG9uZToKK2RvbmU6CiAJa2ZyZWUoa2J1Zik7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIAotIGludmFsOgoraW52YWw6CiAJcmV0ID0gLUVJTlZBTDsKIAlwcmludGsoImtBRlM6IEludmFsaWQgQ29tbWFuZCBvbiAvcHJvYy9mcy9hZnMvY2VsbHMgZmlsZVxuIik7CiAJZ290byBkb25lOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfd3JpdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogU3R1YnMgZm9yIC9wcm9jL2ZzL2Fmcy9yb290Y2VsbAogICovCkBAIC0zNjksNyArMzU4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGhhbmRsZSB3cml0ZXMgdG8gL3Byb2MvZnMvYWZzL3Jvb3RjZWxsCiAgKiAtIHRvIGluaXRpYWxpemUgcm9vdGNlbGw6IGVjaG8gImNlbGwubmFtZToxOTIuMTY4LjIzMS4xNCIKQEAgLTQwNywxNCArMzk1LDEzIEBACiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSBzaXplOwkvKiBjb25zdW1lIGV2ZXJ5dGhpbmcsIGFsd2F5cyAqLwogCi0gaW5mYXVsdDoKK2luZmF1bHQ6CiAJa2ZyZWUoa2J1Zik7Ci0gbm9tZW06Citub21lbToKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Byb2Nfcm9vdGNlbGxfd3JpdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW5pdGlhbGlzZSAvcHJvYy9mcy9hZnMvPGNlbGw+LwogICovCkBAIC00MjYsMjUgKzQxMywyNSBAQAogCiAJY2VsbC0+cHJvY19kaXIgPSBwcm9jX21rZGlyKGNlbGwtPm5hbWUsIHByb2NfYWZzKTsKIAlpZiAoIWNlbGwtPnByb2NfZGlyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kaXI7CiAKIAlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNlcnZlcnMiLCAwLCBjZWxsLT5wcm9jX2Rpcik7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX3Byb2M7CisJCWdvdG8gZXJyb3Jfc2VydmVyczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwLT5kYXRhID0gY2VsbDsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgidmxzZXJ2ZXJzIiwgMCwgY2VsbC0+cHJvY19kaXIpOwogCWlmICghcCkKLQkJZ290byBlcnJvcl9zZXJ2ZXJzOworCQlnb3RvIGVycm9yX3Zsc2VydmVyczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfZm9wczsKIAlwLT5vd25lciA9IFRISVNfTU9EVUxFOwogCXAtPmRhdGEgPSBjZWxsOwogCiAJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ2b2x1bWVzIiwgMCwgY2VsbC0+cHJvY19kaXIpOwogCWlmICghcCkKLQkJZ290byBlcnJvcl92bHNlcnZlcnM7CisJCWdvdG8gZXJyb3Jfdm9sdW1lczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92b2x1bWVzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwLT5kYXRhID0gY2VsbDsKQEAgLTQ1MiwxNyArNDM5LDE3IEBACiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcl92bHNlcnZlcnM6CitlcnJvcl92b2x1bWVzOgogCXJlbW92ZV9wcm9jX2VudHJ5KCJ2bHNlcnZlcnMiLCBjZWxsLT5wcm9jX2Rpcik7Ci0gZXJyb3Jfc2VydmVyczoKK2Vycm9yX3Zsc2VydmVyczoKIAlyZW1vdmVfcHJvY19lbnRyeSgic2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKLSBlcnJvcl9wcm9jOgorZXJyb3Jfc2VydmVyczoKIAlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CitlcnJvcl9kaXI6CiAJX2xlYXZlKCIgPSAtRU5PTUVNIik7CiAJcmV0dXJuIC1FTk9NRU07Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NldHVwKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlbW92ZSAvcHJvYy9mcy9hZnMvPGNlbGw+LwogICovCkBAIC00NzYsOSArNDYzLDggQEAKIAlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CiAKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogb3BlbiAiL3Byb2MvZnMvYWZzLzxjZWxsPi92b2x1bWVzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IGNlbGxzCiAgKi8KQEAgLTQ4OCw3ICs0NzQsNyBAQAogCXN0cnVjdCBzZXFfZmlsZSAqbTsKIAlpbnQgcmV0OwogCi0JY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsICoqKSAmUERFKGlub2RlKS0+ZGF0YSk7CisJY2VsbCA9IFBERShpbm9kZSktPmRhdGE7CiAJaWYgKCFjZWxsKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtNTAwLDI1ICs0ODYsMTYgQEAKIAltLT5wcml2YXRlID0gY2VsbDsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX29wZW4oKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IFBERShpbm9kZSktPmRhdGE7Ci0JaW50IHJldDsKKwlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworfQogCi0JcmV0ID0gc2VxX3JlbGVhc2UoaW5vZGUsZmlsZSk7Ci0KLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3JlbGVhc2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKICAqIGZpcnN0IGl0ZW0KQEAgLTU0NSw5ICs1MjIsOCBAQAogCQkJYnJlYWs7CiAKIAlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RhcnQoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAogICovCkBAIC01NjIsMTIgKzUzOCwxMSBAQAogCSgqX3BvcykrKzsKIAogCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnZsX2xpc3QubmV4dCA6IF9wLT5uZXh0OworCV9wID0gKHYgPT0gKHZvaWQgKikgMSkgPyBjZWxsLT52bF9saXN0Lm5leHQgOiBfcC0+bmV4dDsKIAotCXJldHVybiBfcCAhPSAmY2VsbC0+dmxfbGlzdCA/IF9wIDogTlVMTDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0KCkgKi8KKwlyZXR1cm4gKF9wICE9ICZjZWxsLT52bF9saXN0KSA/IF9wIDogTlVMTDsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdAogICovCkBAIC01NzYsMTAgKzU1MSwxOCBAQAogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RvcCgpICovCitjb25zdCBjaGFyIGFmc192bG9jYXRpb25fc3RhdGVzW11bNF0gPSB7CisJW0FGU19WTF9ORVddCQkJPSAiTmV3IiwKKwlbQUZTX1ZMX0NSRUFUSU5HXQkJPSAiQ3J0IiwKKwlbQUZTX1ZMX1ZBTElEXQkJCT0gIlZhbCIsCisJW0FGU19WTF9OT19WT0xVTUVdCQk9ICJOb1YiLAorCVtBRlNfVkxfVVBEQVRJTkddCQk9ICJVcGQiLAorCVtBRlNfVkxfVk9MVU1FX0RFTEVURURdCQk9ICJEZWwiLAorCVtBRlNfVkxfVU5DRVJUQUlOXQkJPSAiVW5jIiwKK307CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIHZvbHVtZSBsaW5lcwogICovCkBAIC01OTAsMjMgKzU3MywyMiBAQAogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJaWYgKHYgPT0gKHZvaWQgKikgMSkgewotCQlzZXFfcHV0cyhtLCAiVVNFIFZMSURbMF0gIFZMSURbMV0gIFZMSURbMl0gIE5BTUVcbiIpOworCQlzZXFfcHV0cyhtLCAiVVNFIFNUVCBWTElEWzBdICBWTElEWzFdICBWTElEWzJdICBOQU1FXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogZGlzcGxheSBvbmUgY2VsbCBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCi0Jc2VxX3ByaW50ZihtLCAiJTNkICUwOHggJTA4eCAlMDh4ICVzXG4iLAorCXNlcV9wcmludGYobSwgIiUzZCAlcyAlMDh4ICUwOHggJTA4eCAlc1xuIiwKIAkJICAgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpLAorCQkgICBhZnNfdmxvY2F0aW9uX3N0YXRlc1t2bG9jYXRpb24tPnN0YXRlXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFswXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFsxXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFsyXSwKLQkJICAgdmxvY2F0aW9uLT52bGRiLm5hbWUKLQkJICAgKTsKKwkJICAgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwogCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3Zsc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBsaXN0IG9mIHZvbHVtZQogICogbG9jYXRpb24gc2VydmVyCkBAIC02MTcsMTEgKzU5OSwxMSBAQAogCXN0cnVjdCBzZXFfZmlsZSAqbTsKIAlpbnQgcmV0OwogCi0JY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsKiopJlBERShpbm9kZSktPmRhdGEpOworCWNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwogCWlmICghY2VsbCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlyZXQgPSBzZXFfb3BlbihmaWxlLCZhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMpOworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMpOwogCWlmIChyZXQ8MCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjI5LDI2ICs2MTEsMTcgQEAKIAltLT5wcml2YXRlID0gY2VsbDsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbG9zZSB0aGUgZmlsZSBhbmQgcmVsZWFzZSB0aGUgcmVmIHRvIHRoZSBjZWxsCiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwotCWludCByZXQ7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KIAotCXJldCA9IHNlcV9yZWxlYXNlKGlub2RlLGZpbGUpOwotCi0JYWZzX3B1dF9jZWxsKGNlbGwpOwotCi0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3JlbGVhc2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKICAqIGZpcnN0IGl0ZW0KQEAgLTY3Miw5ICs2NDUsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiAmY2VsbC0+dmxfYWRkcnNbcG9zXTsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3N0YXJ0KCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG1vdmUgdG8gbmV4dCBjZWxsIGluIGNlbGxzIGxpc3QKICAqLwpAQCAtNjkyLDkgKzY2NCw4IEBACiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuICZjZWxsLT52bF9hZGRyc1twb3NdOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfbmV4dCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKICAqLwpAQCAtNzAzLDEwICs2NzQsOCBAQAogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2Ygdm9sdW1lIGxpbmVzCiAgKi8KQEAgLTcyMiwxMSArNjkxLDkgQEAKIAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwogCXNlcV9wcmludGYobSwgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGFkZHItPnNfYWRkcikpOwotCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zaG93KCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy88Y2VsbD4vc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGFjdGl2ZQogICogc2VydmVycwpAQCAtNzM3LDcgKzcwNCw3IEBACiAJc3RydWN0IHNlcV9maWxlICptOwogCWludCByZXQ7CiAKLQljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwgKiopICZQREUoaW5vZGUpLT5kYXRhKTsKKwljZWxsID0gUERFKGlub2RlKS0+ZGF0YTsKIAlpZiAoIWNlbGwpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC03NDcsMzQgKzcxNCwyNCBAQAogCiAJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAltLT5wcml2YXRlID0gY2VsbDsKLQogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX29wZW4oKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwotCWludCByZXQ7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KIAotCXJldCA9IHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKLQotCWFmc19wdXRfY2VsbChjZWxsKTsKLQotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfcmVsZWFzZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQogICogZmlyc3QgaXRlbQogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQotCV9fYWNxdWlyZXMobS0+cHJpdmF0ZS0+c3ZfbG9jaykKKwlfX2FjcXVpcmVzKG0tPnByaXZhdGUtPnNlcnZlcnNfbG9jaykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwpAQCAtNzgzLDcgKzc0MCw3IEBACiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CiAKIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JcmVhZF9sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX2xvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CiAKIAkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCiAJaWYgKCFwb3MpCkBAIC03OTEsMTQgKzc0OCwxMyBAQAogCXBvcy0tOwogCiAJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnN2X2xpc3QpCisJbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnNlcnZlcnMpCiAJCWlmICghcG9zLS0pCiAJCQlicmVhazsKIAotCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCgpICovCisJcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAogICovCkBAIC04MTMsMjUgKzc2OSwyMiBAQAogCSgqX3BvcykrKzsKIAogCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnN2X2xpc3QubmV4dCA6IF9wLT5uZXh0OworCV9wID0gdiA9PSAodm9pZCAqKSAxID8gY2VsbC0+c2VydmVycy5uZXh0IDogX3AtPm5leHQ7CiAKLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnN2X2xpc3QgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfbmV4dCgpICovCisJcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0CiAgKi8KIHN0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLQlfX3JlbGVhc2VzKHAtPnByaXZhdGUtPnN2X2xvY2spCisJX19yZWxlYXNlcyhwLT5wcml2YXRlLT5zZXJ2ZXJzX2xvY2spCiB7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKIAotCXJlYWRfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX3VubG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKK30KIAotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiB2b2x1bWUgbGluZXMKICAqLwpAQCAtODQ5LDEwICs4MDIsNyBAQAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwogCXNwcmludGYoaXBhZGRyLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKHNlcnZlci0+YWRkcikpOwogCXNlcV9wcmludGYobSwgIiUzZCAlLTE1LjE1cyAlNWRcbiIsCi0JCSAgIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwKLQkJICAgaXBhZGRyLAotCQkgICBzZXJ2ZXItPmZzX3N0YXRlCi0JCSAgICk7CisJCSAgIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwgaXBhZGRyLCBzZXJ2ZXItPmZzX3N0YXRlKTsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IwNDczCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3J4cnBjLmMKQEAgLTAsMCArMSw3ODIgQEAKKy8qIE1haW50YWluIGFuIFJ4UlBDIHNlcnZlciBzb2NrZXQgdG8gZG8gQUZTIGNvbW11bmljYXRpb25zIHRocm91Z2gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMvcGFja2V0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZnNfY20uaCIKKworc3RhdGljIHN0cnVjdCBzb2NrZXQgKmFmc19zb2NrZXQ7IC8qIG15IFJ4UlBDIHNvY2tldCAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfYXN5bmNfY2FsbHM7CitzdGF0aWMgYXRvbWljX3QgYWZzX291dHN0YW5kaW5nX2NhbGxzOworc3RhdGljIGF0b21pY190IGFmc19vdXRzdGFuZGluZ19za2JzOworCitzdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZG9udF93YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOworc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jbV9vcF9pZChzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7CisKKy8qIHN5bmNocm9ub3VzIGNhbGwgbWFuYWdlbWVudCAqLworY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX3N5bmNfY2FsbCA9IHsKKwkucnhfd2FrZXVwCT0gYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIsCisJLndhaXQJCT0gYWZzX3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUsCit9OworCisvKiBhc3luY2hyb25vdXMgY2FsbCBtYW5hZ2VtZW50ICovCitjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSBhZnNfYXN5bmNfY2FsbCA9IHsKKwkucnhfd2FrZXVwCT0gYWZzX3dha2VfdXBfYXN5bmNfY2FsbCwKKwkud2FpdAkJPSBhZnNfZG9udF93YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlLAorfTsKKworLyogYXN5bmNocm9ub3VzIGluY29taW5nIGNhbGwgbWFuYWdlbWVudCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19hc3luY19pbmNvbWluZ19jYWxsID0geworCS5yeF93YWtldXAJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAorfTsKKworLyogYXN5bmNocm9ub3VzIGluY29taW5nIGNhbGwgaW5pdGlhbCBwcm9jZXNzaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYQ014eHh4ID0geworCS5uYW1lCQk9ICJDQi54eHh4IiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NtX29wX2lkLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKK307CisKK3N0YXRpYyB2b2lkIGFmc19jb2xsZWN0X2luY29taW5nX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBhZnNfaW5jb21pbmdfY2FsbHM7CitzdGF0aWMgREVDTEFSRV9XT1JLKGFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yaywgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbCk7CisKKy8qCisgKiBvcGVuIGFuIFJ4UlBDIHNvY2tldCBhbmQgYmluZCBpdCB0byBiZSBhIHNlcnZlciBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9ucworICogLSB0aGUgc29ja2V0IGlzIGxlZnQgaW4gYmxvY2tpbmcgbW9kZSBhbmQgbm9uLWJsb2NraW5nIG9wcyB1c2UgTVNHX0RPTlRXQUlUCisgKi8KK2ludCBhZnNfb3Blbl9zb2NrZXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OworCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFmc19pbmNvbWluZ19jYWxscyk7CisKKwlhZnNfYXN5bmNfY2FsbHMgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc2QiKTsKKwlpZiAoIWFmc19hc3luY19jYWxscykgeworCQlfbGVhdmUoIiA9IC1FTk9NRU0gW3dxXSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKEFGX1JYUlBDLCBTT0NLX0RHUkFNLCBQRl9JTkVULCAmc29ja2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShhZnNfYXN5bmNfY2FsbHMpOworCQlfbGVhdmUoIiA9ICVkIFtzb2NrZXRdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7CisKKwkvKiBiaW5kIHRoZSBjYWxsYmFjayBtYW5hZ2VyJ3MgYWRkcmVzcyB0byBtYWtlIHRoaXMgYSBzZXJ2ZXIgc29ja2V0ICovCisJc3J4LnNyeF9mYW1pbHkJCQk9IEFGX1JYUlBDOworCXNyeC5zcnhfc2VydmljZQkJCT0gQ01fU0VSVklDRTsKKwlzcngudHJhbnNwb3J0X3R5cGUJCT0gU09DS19ER1JBTTsKKwlzcngudHJhbnNwb3J0X2xlbgkJPSBzaXplb2Yoc3J4LnRyYW5zcG9ydC5zaW4pOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9mYW1pbHkJPSBBRl9JTkVUOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0CT0gaHRvbnMoQUZTX0NNX1BPUlQpOworCW1lbXNldCgmc3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsIDAsCisJICAgICAgIHNpemVvZihzcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkcikpOworCisJcmV0ID0ga2VybmVsX2JpbmQoc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopICZzcngsIHNpemVvZihzcngpKTsKKwlpZiAocmV0IDwgMCkgeworCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKKwkJX2xlYXZlKCIgPSAlZCBbYmluZF0iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc29ja2V0LCBhZnNfcnhfaW50ZXJjZXB0b3IpOworCisJYWZzX3NvY2tldCA9IHNvY2tldDsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb3NlIHRoZSBSeFJQQyBzb2NrZXQgQUZTIHdhcyB1c2luZworICovCit2b2lkIGFmc19jbG9zZV9zb2NrZXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJc29ja19yZWxlYXNlKGFmc19zb2NrZXQpOworCisJX2RlYnVnKCJkZXdvcmsiKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShhZnNfYXN5bmNfY2FsbHMpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticyksID09LCAwKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscyksID09LCAwKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogbm90ZSB0aGF0IHRoZSBkYXRhIGluIGEgc29ja2V0IGJ1ZmZlciBpcyBub3cgZGVsaXZlcmVkIGFuZCB0aGF0IHRoZSBidWZmZXIKKyAqIHNob3VsZCBiZSBmcmVlZAorICovCitzdGF0aWMgdm9pZCBhZnNfZGF0YV9kZWxpdmVyZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIXNrYikgeworCQlfZGVidWcoIkRMVlIgTlVMTCBbJWRdIiwgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7CisJCWR1bXBfc3RhY2soKTsKKwl9IGVsc2UgeworCQlfZGVidWcoIkRMVlIgJXB7JXV9IFslZF0iLAorCQkgICAgICAgc2tiLCBza2ItPm1hcmssIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticykpOworCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmFmc19vdXRzdGFuZGluZ19za2JzKSA9PSAtMSkKKwkJCUJVRygpOworCQlyeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoc2tiKTsKKwl9Cit9CisKKy8qCisgKiBmcmVlIGEgc29ja2V0IGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBhZnNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIXNrYikgeworCQlfZGVidWcoIkZSRUUgTlVMTCBbJWRdIiwgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7CisJCWR1bXBfc3RhY2soKTsKKwl9IGVsc2UgeworCQlfZGVidWcoIkZSRUUgJXB7JXV9IFslZF0iLAorCQkgICAgICAgc2tiLCBza2ItPm1hcmssIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticykpOworCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmFmc19vdXRzdGFuZGluZ19za2JzKSA9PSAtMSkKKwkJCUJVRygpOworCQlyeHJwY19rZXJuZWxfZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKKy8qCisgKiBmcmVlIGEgY2FsbAorICovCitzdGF0aWMgdm9pZCBhZnNfZnJlZV9jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlfZGVidWcoIkRPTkUgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpID09IC0xKQorCQlCVUcoKTsKKworCUFTU0VSVENNUChjYWxsLT5yeGNhbGwsID09LCBOVUxMKTsKKwlBU1NFUlQoIXdvcmtfcGVuZGluZygmY2FsbC0+YXN5bmNfd29yaykpOworCUFTU0VSVChza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X3F1ZXVlKSk7CisJQVNTRVJUKGNhbGwtPnR5cGUtPm5hbWUgIT0gTlVMTCk7CisKKwlrZnJlZShjYWxsLT5yZXF1ZXN0KTsKKwlrZnJlZShjYWxsKTsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgY2FsbCB3aXRoIGZsYXQgcmVxdWVzdCBhbmQgcmVwbHkgYnVmZmVycworICovCitzdHJ1Y3QgYWZzX2NhbGwgKmFmc19hbGxvY19mbGF0X2NhbGwoY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGUsCisJCQkJICAgICBzaXplX3QgcmVxdWVzdF9zaXplLCBzaXplX3QgcmVwbHlfc2l6ZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisKKwljYWxsID0ga3phbGxvYyhzaXplb2YoKmNhbGwpLCBHRlBfTk9GUyk7CisJaWYgKCFjYWxsKQorCQlnb3RvIG5vbWVtX2NhbGw7CisKKwlfZGVidWcoIkNBTEwgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCB0eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKKworCWNhbGwtPnR5cGUgPSB0eXBlOworCWNhbGwtPnJlcXVlc3Rfc2l6ZSA9IHJlcXVlc3Rfc2l6ZTsKKwljYWxsLT5yZXBseV9tYXggPSByZXBseV9zaXplOworCisJaWYgKHJlcXVlc3Rfc2l6ZSkgeworCQljYWxsLT5yZXF1ZXN0ID0ga21hbGxvYyhyZXF1ZXN0X3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKCFjYWxsLT5yZXF1ZXN0KQorCQkJZ290byBub21lbV9mcmVlOworCX0KKworCWlmIChyZXBseV9zaXplKSB7CisJCWNhbGwtPmJ1ZmZlciA9IGttYWxsb2MocmVwbHlfc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWNhbGwtPmJ1ZmZlcikKKwkJCWdvdG8gbm9tZW1fZnJlZTsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCXJldHVybiBjYWxsOworCitub21lbV9mcmVlOgorCWFmc19mcmVlX2NhbGwoY2FsbCk7Citub21lbV9jYWxsOgorCXJldHVybiBOVUxMOworfQorCisvKgorICogY2xlYW4gdXAgYSBjYWxsIHdpdGggZmxhdCBidWZmZXIKKyAqLwordm9pZCBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCV9lbnRlcigiIik7CisKKwlrZnJlZShjYWxsLT5yZXF1ZXN0KTsKKwljYWxsLT5yZXF1ZXN0ID0gTlVMTDsKKwlrZnJlZShjYWxsLT5idWZmZXIpOworCWNhbGwtPmJ1ZmZlciA9IE5VTEw7Cit9CisKKy8qCisgKiBpbml0aWF0ZSBhIGNhbGwKKyAqLworaW50IGFmc19tYWtlX2NhbGwoc3RydWN0IGluX2FkZHIgKmFkZHIsIHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgZ2ZwX3QgZ2ZwLAorCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIleCx7JWR9LCIsIGFkZHItPnNfYWRkciwgbnRvaHMoY2FsbC0+cG9ydCkpOworCisJQVNTRVJUKGNhbGwtPnR5cGUgIT0gTlVMTCk7CisJQVNTRVJUKGNhbGwtPnR5cGUtPm5hbWUgIT0gTlVMTCk7CisKKwlfZGVidWcoIk1BS0UgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisKKwljYWxsLT53YWl0X21vZGUgPSB3YWl0X21vZGU7CisJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKworCW1lbXNldCgmc3J4LCAwLCBzaXplb2Yoc3J4KSk7CisJc3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwlzcnguc3J4X3NlcnZpY2UgPSBjYWxsLT5zZXJ2aWNlX2lkOworCXNyeC50cmFuc3BvcnRfdHlwZSA9IFNPQ0tfREdSQU07CisJc3J4LnRyYW5zcG9ydF9sZW4gPSBzaXplb2Yoc3J4LnRyYW5zcG9ydC5zaW4pOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0ID0gY2FsbC0+cG9ydDsKKwltZW1jcHkoJnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLCBhZGRyLCA0KTsKKworCS8qIGNyZWF0ZSBhIGNhbGwgKi8KKwlyeGNhbGwgPSByeHJwY19rZXJuZWxfYmVnaW5fY2FsbChhZnNfc29ja2V0LCAmc3J4LCBjYWxsLT5rZXksCisJCQkJCSAodW5zaWduZWQgbG9uZykgY2FsbCwgZ2ZwKTsKKwljYWxsLT5rZXkgPSBOVUxMOworCWlmIChJU19FUlIocnhjYWxsKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ4Y2FsbCk7CisJCWdvdG8gZXJyb3Jfa2lsbF9jYWxsOworCX0KKworCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKKworCS8qIHNlbmQgdGhlIHJlcXVlc3QgKi8KKwlpb3ZbMF0uaW92X2Jhc2UJPSBjYWxsLT5yZXF1ZXN0OworCWlvdlswXS5pb3ZfbGVuCT0gY2FsbC0+cmVxdWVzdF9zaXplOworCisJbXNnLm1zZ19uYW1lCQk9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuCQk9IDA7CisJbXNnLm1zZ19pb3YJCT0gKHN0cnVjdCBpb3ZlYyAqKSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4JCT0gMTsKKwltc2cubXNnX2NvbnRyb2wJCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4JPSAwOworCW1zZy5tc2dfZmxhZ3MJCT0gMDsKKworCS8qIGhhdmUgdG8gY2hhbmdlIHRoZSBzdGF0ZSAqYmVmb3JlKiBzZW5kaW5nIHRoZSBsYXN0IHBhY2tldCBhcyBSeFJQQworCSAqIG1pZ2h0IGdpdmUgdXMgdGhlIHJlcGx5IGJlZm9yZSBpdCByZXR1cm5zIGZyb20gc2VuZGluZyB0aGUKKwkgKiByZXF1ZXN0ICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9SRVBMWTsKKwlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHJ4Y2FsbCwgJm1zZywgY2FsbC0+cmVxdWVzdF9zaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9kb19hYm9ydDsKKworCS8qIGF0IHRoaXMgcG9pbnQsIGFuIGFzeW5jIGNhbGwgbWF5IG5vIGxvbmdlciBleGlzdCBhcyBpdCBtYXkgaGF2ZQorCSAqIGFscmVhZHkgY29tcGxldGVkICovCisJcmV0dXJuIHdhaXRfbW9kZS0+d2FpdChjYWxsKTsKKworZXJyb3JfZG9fYWJvcnQ6CisJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwocnhjYWxsLCBSWF9VU0VSX0FCT1JUKTsKKwlyeHJwY19rZXJuZWxfZW5kX2NhbGwocnhjYWxsKTsKKwljYWxsLT5yeGNhbGwgPSBOVUxMOworZXJyb3Jfa2lsbF9jYWxsOgorCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJYWZzX2ZyZWVfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaGFuZGxlcyBpbnRlcmNlcHRlZCBtZXNzYWdlcyB0aGF0IHdlcmUgYXJyaXZpbmcgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlCisgKiAtIGNhbGxlZCB3aXRoIHRoZSBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSBsb2NrIGhlbGQgdG8gZW5zdXJlIG1lc3NhZ2Ugb3JkZXJpbmcKKyAqIC0gY2FsbGVkIHdpdGggc29mdGlycXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopIHVzZXJfY2FsbF9JRDsKKworCV9lbnRlcigiJXAsLCV1IiwgY2FsbCwgc2tiLT5tYXJrKTsKKworCV9kZWJ1ZygiSUNQVCAlcHsldX0gWyVkXSIsCisJICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKKworCUFTU0VSVENNUChzaywgPT0sIGFmc19zb2NrZXQtPnNrKTsKKwlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfc2ticyk7CisKKwlpZiAoIWNhbGwpIHsKKwkJLyogaXRzIGFuIGluY29taW5nIGNhbGwgZm9yIG91ciBjYWxsYmFjayBzZXJ2aWNlICovCisJCXNrYl9xdWV1ZV90YWlsKCZhZnNfaW5jb21pbmdfY2FsbHMsIHNrYik7CisJCXNjaGVkdWxlX3dvcmsoJmFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yayk7CisJfSBlbHNlIHsKKwkJLyogcm91dGUgdGhlIG1lc3NhZ2VzIGRpcmVjdGx5IHRvIHRoZSBhcHByb3ByaWF0ZSBjYWxsICovCisJCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKKwkJY2FsbC0+d2FpdF9tb2RlLT5yeF93YWtldXAoY2FsbCk7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgbWVzc2FnZXMgdG8gYSBjYWxsCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kZWxpdmVyX3RvX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCBsYXN0OworCXUzMiBhYm9ydF9jb2RlOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJd2hpbGUgKChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAorCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAorCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8CisJCWNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgJiYKKwkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKSB7CisJCXN3aXRjaCAoc2tiLT5tYXJrKSB7CisJCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKKwkJCV9kZWJ1ZygiUmN2IERBVEEiKTsKKwkJCWxhc3QgPSByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHNrYik7CisJCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwsIHNrYiwgbGFzdCk7CisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSAwOgorCQkJCWlmIChsYXN0ICYmCisJCQkJICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCQkJCWJyZWFrOworCQkJY2FzZSAtRU5PVENPTk46CisJCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCQlnb3RvIGRvX2Fib3J0OworCQkJY2FzZSAtRU5PVFNVUFA6CisJCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCQkJCWdvdG8gZG9fYWJvcnQ7CisJCQlkZWZhdWx0OgorCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9DQ19VTk1BUlNIQUw7CisJCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCQlhYm9ydF9jb2RlID0gUlhHRU5fU1NfVU5NQVJTSEFMOworCQkJZG9fYWJvcnQ6CisJCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLAorCQkJCQkJCWFib3J0X2NvZGUpOworCQkJCWNhbGwtPmVycm9yID0gcmV0OworCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhZnNfZGF0YV9kZWxpdmVyZWQoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6CisJCQlfZGVidWcoIlJjdiBBQ0siKTsKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19CVVNZOgorCQkJX2RlYnVnKCJSY3YgQlVTWSIpOworCQkJY2FsbC0+ZXJyb3IgPSAtRUJVU1k7CisJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0JVU1k7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6CisJCQlhYm9ydF9jb2RlID0gcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHNrYik7CisJCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGFib3J0X2NvZGUpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BQk9SVEVEOworCQkJX2RlYnVnKCJSY3YgQUJPUlQgJXUgLT4gJWQiLCBhYm9ydF9jb2RlLCBjYWxsLT5lcnJvcik7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I6CisJCQljYWxsLT5lcnJvciA9IC1yeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihza2IpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9FUlJPUjsKKwkJCV9kZWJ1ZygiUmN2IE5FVCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOgorCQkJY2FsbC0+ZXJyb3IgPSAtcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc2tiKTsKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7CisJCQlfZGVidWcoIlJjdiBMT0NBTCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCisJCWFmc19mcmVlX3NrYihza2IpOworCX0KKworCS8qIG1ha2Ugc3VyZSB0aGUgcXVldWUgaXMgZW1wdHkgaWYgdGhlIGNhbGwgaXMgZG9uZSB3aXRoICh3ZSBtaWdodCBoYXZlCisJICogYWJvcnRlZCB0aGUgY2FsbCBlYXJseSBiZWNhdXNlIG9mIGFuIHVubWFyc2hhbGxpbmcgZXJyb3IpICovCisJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFKSB7CisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCisJCQlhZnNfZnJlZV9za2Ioc2tiKTsKKwkJaWYgKGNhbGwtPmluY29taW5nKSB7CisJCQlyeHJwY19rZXJuZWxfZW5kX2NhbGwoY2FsbC0+cnhjYWxsKTsKKwkJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCQljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCQkJYWZzX2ZyZWVfY2FsbChjYWxsKTsKKwkJfQorCX0KKworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiB3YWl0IHN5bmNocm9ub3VzbHkgZm9yIGEgY2FsbCB0byBjb21wbGV0ZQorICovCitzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXQ7CisKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJX2VudGVyKCIiKTsKKworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCS8qIGRlbGl2ZXIgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXQgPSBjYWxsLT5lcnJvcjsKKwkJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXJldCA9IC1FSU5UUjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkvKiBraWxsIHRoZSBjYWxsICovCisJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUpIHsKKwkJX2RlYnVnKCJjYWxsIGluY29tcGxldGUiKTsKKwkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLCBSWF9DQUxMX0RFQUQpOworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKQorCQkJYWZzX2ZyZWVfc2tiKHNrYik7CisJfQorCisJX2RlYnVnKCJjYWxsIGNvbXBsZXRlIik7CisJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJY2FsbC0+cnhjYWxsID0gTlVMTDsKKwljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdha2UgdXAgYSB3YWl0aW5nIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKK30KKworLyoKKyAqIHdha2UgdXAgYW4gYXN5bmNocm9ub3VzIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJX2VudGVyKCIiKTsKKwlxdWV1ZV93b3JrKGFmc19hc3luY19jYWxscywgJmNhbGwtPmFzeW5jX3dvcmspOworfQorCisvKgorICogcHV0IGEgY2FsbCBpbnRvIGFzeW5jaHJvbm91cyBtb2RlCisgKiAtIG11c3RuJ3QgdG91Y2ggdGhlIGNhbGwgZGVzY3JpcHRvciBhcyB0aGUgY2FsbCBteSBoYXZlIGNvbXBsZXRlZCBieSB0aGUKKyAqICAgdGltZSB3ZSBnZXQgaGVyZQorICovCitzdGF0aWMgaW50IGFmc19kb250X3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCV9lbnRlcigiIik7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworLyoKKyAqIGRlbGV0ZSBhbiBhc3luY2hyb25vdXMgY2FsbAorICovCitzdGF0aWMgdm9pZCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCisJX2VudGVyKCIiKTsKKworCWFmc19mcmVlX2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcGVyZm9ybSBwcm9jZXNzaW5nIG9uIGFuIGFzeW5jaHJvbm91cyBjYWxsCisgKiAtIG9uIGEgbXVsdGlwbGUtdGhyZWFkIHdvcmtxdWV1ZSB0aGlzIHdvcmsgaXRlbSBtYXkgdHJ5IHRvIHJ1biBvbiBzZXZlcmFsCisgKiAgIENQVXMgYXQgdGhlIHNhbWUgdGltZQorICovCitzdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCBhc3luY193b3JrKTsKKworCV9lbnRlcigiIik7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKQorCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOworCisJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPndhaXRfbW9kZSkgeworCQlpZiAoY2FsbC0+d2FpdF9tb2RlLT5hc3luY19jb21wbGV0ZSkKKwkJCWNhbGwtPndhaXRfbW9kZS0+YXN5bmNfY29tcGxldGUoY2FsbC0+cmVwbHksCisJCQkJCQkJY2FsbC0+ZXJyb3IpOworCQljYWxsLT5yZXBseSA9IE5VTEw7CisKKwkJLyoga2lsbCB0aGUgY2FsbCAqLworCQlyeHJwY19rZXJuZWxfZW5kX2NhbGwoY2FsbC0+cnhjYWxsKTsKKwkJY2FsbC0+cnhjYWxsID0gTlVMTDsKKwkJaWYgKGNhbGwtPnR5cGUtPmRlc3RydWN0b3IpCisJCQljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCisJCS8qIHdlIGNhbid0IGp1c3QgZGVsZXRlIHRoZSBjYWxsIGJlY2F1c2UgdGhlIHdvcmsgaXRlbSBtYXkgYmUKKwkJICogcXVldWVkICovCisJCVBSRVBBUkVfV09SSygmY2FsbC0+YXN5bmNfd29yaywgYWZzX2RlbGV0ZV9hc3luY19jYWxsKTsKKwkJcXVldWVfd29yayhhZnNfYXN5bmNfY2FsbHMsICZjYWxsLT5hc3luY193b3JrKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZW1wdHkgYSBzb2NrZXQgYnVmZmVyIGludG8gYSBmbGF0IHJlcGx5IGJ1ZmZlcgorICovCit2b2lkIGFmc190cmFuc2Zlcl9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2l6ZV90IGxlbiA9IHNrYi0+bGVuOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBjYWxsLT5idWZmZXIgKyBjYWxsLT5yZXBseV9zaXplLCBsZW4pIDwgMCkKKwkJQlVHKCk7CisJY2FsbC0+cmVwbHlfc2l6ZSArPSBsZW47Cit9CisKKy8qCisgKiBhY2NlcHQgdGhlIGJhY2tsb2cgb2YgaW5jb21pbmcgY2FsbHMKKyAqLworc3RhdGljIHZvaWQgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKnJ4Y2FsbDsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhZnNfaW5jb21pbmdfY2FsbHMpKSkgeworCQlfZGVidWcoIm5ldyBjYWxsIik7CisKKwkJLyogZG9uJ3QgbmVlZCB0aGUgbm90aWZpY2F0aW9uICovCisJCWFmc19mcmVlX3NrYihza2IpOworCisJCWlmICghY2FsbCkgeworCQkJY2FsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2FsbCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFjYWxsKSB7CisJCQkJcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKGFmc19zb2NrZXQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKwkJCWNhbGwtPndhaXRfbW9kZSA9ICZhZnNfYXN5bmNfaW5jb21pbmdfY2FsbDsKKwkJCWNhbGwtPnR5cGUgPSAmYWZzX1JYQ014eHh4OworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+d2FpdHEpOworCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9PUF9JRDsKKworCQkJX2RlYnVnKCJDQUxMICVweyVzfSBbJWRdIiwKKwkJCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpKTsKKwkJCWF0b21pY19pbmMoJmFmc19vdXRzdGFuZGluZ19jYWxscyk7CisJCX0KKworCQlyeGNhbGwgPSByeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoYWZzX3NvY2tldCwKKwkJCQkJCSAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOworCQlpZiAoIUlTX0VSUihyeGNhbGwpKSB7CisJCQljYWxsLT5yeGNhbGwgPSByeGNhbGw7CisJCQljYWxsID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChjYWxsKQorCQlhZnNfZnJlZV9jYWxsKGNhbGwpOworfQorCisvKgorICogZ3JhYiB0aGUgb3BlcmF0aW9uIElEIGZyb20gYW4gaW5jb21pbmcgY2FjaGUgbWFuYWdlciBjYWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCWJvb2wgbGFzdCkKK3sKKwlzaXplX3QgbGVuID0gc2tiLT5sZW47CisJdm9pZCAqb2lidWYgPSAodm9pZCAqKSAmY2FsbC0+b3BlcmF0aW9uX0lEOworCisJX2VudGVyKCJ7JXV9LHslenV9LCVkIiwgY2FsbC0+b2Zmc2V0LCBsZW4sIGxhc3QpOworCisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPCwgNCk7CisKKwkvKiB0aGUgb3BlcmF0aW9uIElEIGZvcm1zIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGRhdGEgKi8KKwlsZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgNCAtIGNhbGwtPm9mZnNldCk7CisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBvaWJ1ZiArIGNhbGwtPm9mZnNldCwgbGVuKSA8IDApCisJCUJVRygpOworCWlmICghcHNrYl9wdWxsKHNrYiwgbGVuKSkKKwkJQlVHKCk7CisJY2FsbC0+b2Zmc2V0ICs9IGxlbjsKKworCWlmIChjYWxsLT5vZmZzZXQgPCA0KSB7CisJCWlmIChsYXN0KSB7CisJCQlfbGVhdmUoIiA9IC1FQkFETVNHIFtvcCBJRCBzaG9ydF0iKTsKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJfQorCQlfbGVhdmUoIiA9IDAgW2luY29tcGxldGVdIik7CisJCXJldHVybiAwOworCX0KKworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVRVUVTVDsKKworCS8qIGFzayB0aGUgY2FjaGUgbWFuYWdlciB0byByb3V0ZSB0aGUgY2FsbCAoaXQnbGwgY2hhbmdlIHRoZSBjYWxsIHR5cGUKKwkgKiBpZiBzdWNjZXNzZnVsKSAqLworCWlmICghYWZzX2NtX2luY29taW5nX2NhbGwoY2FsbCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwkvKiBwYXNzIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgcmVtYWluZXIgb2YgdGhpcyBtZXNzYWdlIG9mZiB0byB0aGUKKwkgKiBjYWNoZSBtYW5hZ2VyIG9wICovCisJcmV0dXJuIGNhbGwtPnR5cGUtPmRlbGl2ZXIoY2FsbCwgc2tiLCBsYXN0KTsKK30KKworLyoKKyAqIHNlbmQgYW4gZW1wdHkgcmVwbHkKKyAqLwordm9pZCBhZnNfc2VuZF9lbXB0eV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKworCV9lbnRlcigiIik7CisKKwlpb3ZbMF0uaW92X2Jhc2UJCT0gTlVMTDsKKwlpb3ZbMF0uaW92X2xlbgkJPSAwOworCW1zZy5tc2dfbmFtZQkJPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbgkJPSAwOworCW1zZy5tc2dfaW92CQk9IGlvdjsKKwltc2cubXNnX2lvdmxlbgkJPSAwOworCW1zZy5tc2dfY29udHJvbAkJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbgk9IDA7CisJbXNnLm1zZ19mbGFncwkJPSAwOworCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9BQ0s7CisJc3dpdGNoIChyeHJwY19rZXJuZWxfc2VuZF9kYXRhKGNhbGwtPnJ4Y2FsbCwgJm1zZywgMCkpIHsKKwljYXNlIDA6CisJCV9sZWF2ZSgiIFtyZXBsaWVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRU06CisJCV9kZWJ1Zygib29tIik7CisJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCk7CisJZGVmYXVsdDoKKwkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJCV9sZWF2ZSgiIFtlcnJvcl0iKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIHNlbmQgYSBzaW1wbGUgcmVwbHkKKyAqLwordm9pZCBhZnNfc2VuZF9zaW1wbGVfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKworCV9lbnRlcigiIik7CisKKwlpb3ZbMF0uaW92X2Jhc2UJCT0gKHZvaWQgKikgYnVmOworCWlvdlswXS5pb3ZfbGVuCQk9IGxlbjsKKwltc2cubXNnX25hbWUJCT0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4JCT0gMDsKKwltc2cubXNnX2lvdgkJPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4JCT0gMTsKKwltc2cubXNnX2NvbnRyb2wJCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4JPSAwOworCW1zZy5tc2dfZmxhZ3MJCT0gMDsKKworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfQUNLOworCXN3aXRjaCAocnhycGNfa2VybmVsX3NlbmRfZGF0YShjYWxsLT5yeGNhbGwsICZtc2csIGxlbikpIHsKKwljYXNlIDA6CisJCV9sZWF2ZSgiIFtyZXBsaWVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRU06CisJCV9kZWJ1Zygib29tIik7CisJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCk7CisJZGVmYXVsdDoKKwkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJCV9sZWF2ZSgiIFtlcnJvcl0iKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIGV4dHJhY3QgYSBwaWVjZSBvZiBkYXRhIGZyb20gdGhlIHJlY2VpdmVkIGRhdGEgc29ja2V0IGJ1ZmZlcnMKKyAqLworaW50IGFmc19leHRyYWN0X2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIGJvb2wgbGFzdCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbiA9IHNrYi0+bGVuOworCisJX2VudGVyKCJ7JXV9LHslenV9LCVkLCwlenUiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCwgY291bnQpOworCisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPCwgY291bnQpOworCisJbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIGNvdW50IC0gY2FsbC0+b2Zmc2V0KTsKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIGJ1ZiArIGNhbGwtPm9mZnNldCwgbGVuKSA8IDAgfHwKKwkgICAgIXBza2JfcHVsbChza2IsIGxlbikpCisJCUJVRygpOworCWNhbGwtPm9mZnNldCArPSBsZW47CisKKwlpZiAoY2FsbC0+b2Zmc2V0IDwgY291bnQpIHsKKwkJaWYgKGxhc3QpIHsKKwkJCV9sZWF2ZSgiID0gLUVCQURNU0cgWyVkIDwgJWx1XSIsIGNhbGwtPm9mZnNldCwgY291bnQpOworCQkJcmV0dXJuIC1FQkFETVNHOworCQl9CisJCV9sZWF2ZSgiID0gLUVBR0FJTiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvc2VjdXJpdHkuYyBiL2ZzL2Fmcy9zZWN1cml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZjQyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvc2VjdXJpdHkuYwpAQCAtMCwwICsxLDM1NiBAQAorLyogQUZTIHNlY3VyaXR5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxrZXlzL3J4cnBjLXR5cGUuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogZ2V0IGEga2V5CisgKi8KK3N0cnVjdCBrZXkgKmFmc19yZXF1ZXN0X2tleShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJc3RydWN0IGtleSAqa2V5OworCisJX2VudGVyKCJ7JXh9Iiwga2V5X3NlcmlhbChjZWxsLT5hbm9ueW1vdXNfa2V5KSk7CisKKwlfZGVidWcoImtleSAlcyIsIGNlbGwtPmFub255bW91c19rZXktPmRlc2NyaXB0aW9uKTsKKwlrZXkgPSByZXF1ZXN0X2tleSgma2V5X3R5cGVfcnhycGMsIGNlbGwtPmFub255bW91c19rZXktPmRlc2NyaXB0aW9uLAorCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJaWYgKFBUUl9FUlIoa2V5KSAhPSAtRU5PS0VZKSB7CisJCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoa2V5KSk7CisJCQlyZXR1cm4ga2V5OworCQl9CisKKwkJLyogYWN0IGFzIGFub255bW91cyB1c2VyICovCisJCV9sZWF2ZSgiID0geyV4fSBbYW5vbl0iLCBrZXlfc2VyaWFsKGNlbGwtPmFub255bW91c19rZXkpKTsKKwkJcmV0dXJuIGtleV9nZXQoY2VsbC0+YW5vbnltb3VzX2tleSk7CisJfSBlbHNlIHsKKwkJLyogYWN0IGFzIGF1dGhvcmlzZWQgdXNlciAqLworCQlfbGVhdmUoIiA9IHsleH0gW2F1dGhdIiwga2V5X3NlcmlhbChrZXkpKTsKKwkJcmV0dXJuIGtleTsKKwl9Cit9CisKKy8qCisgKiBkaXNwb3NlIG9mIGEgcGVybWl0cyBsaXN0CisgKi8KK3ZvaWQgYWZzX3phcF9wZXJtaXRzKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBhZnNfcGVybWl0cyAqcGVybWl0cyA9CisJCWNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBhZnNfcGVybWl0cywgcmN1KTsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigieyVkfSIsIHBlcm1pdHMtPmNvdW50KTsKKworCWZvciAobG9vcCA9IHBlcm1pdHMtPmNvdW50IC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCisJCWtleV9wdXQocGVybWl0cy0+cGVybWl0c1tsb29wXS5rZXkpOworCWtmcmVlKHBlcm1pdHMpOworfQorCisvKgorICogZGlzcG9zZSBvZiBhIHBlcm1pdHMgbGlzdCBpbiB3aGljaCBhbGwgdGhlIGtleSBwb2ludGVycyBoYXZlIGJlZW4gY29waWVkCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kaXNwb3NlX29mX3Blcm1pdHMoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzID0KKwkJY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGFmc19wZXJtaXRzLCByY3UpOworCisJX2VudGVyKCJ7JWR9IiwgcGVybWl0cy0+Y291bnQpOworCisJa2ZyZWUocGVybWl0cyk7Cit9CisKKy8qCisgKiBnZXQgdGhlIGF1dGhvcmlzaW5nIHZub2RlIC0gdGhpcyBpcyB0aGUgc3BlY2lmaWVkIGlub2RlIGl0c2VsZiBpZiBpdCdzIGEKKyAqIGRpcmVjdG9yeSBvciBpdCdzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlmIHRoZSBzcGVjaWZpZWQgaW5vZGUgaXMgYSBmaWxlIG9yCisgKiBzeW1saW5rCisgKiAtIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZWYgb24gdGhlIGlub2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWZzX3Zub2RlICphZnNfZ2V0X2F1dGhfaW5vZGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJCSAgICBzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IGFmc192bm9kZSAqYXV0aF92bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmF1dGhfaW5vZGU7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKFNfSVNESVIodm5vZGUtPnZmc19pbm9kZS5pX21vZGUpKSB7CisJCWF1dGhfaW5vZGUgPSBpZ3JhYigmdm5vZGUtPnZmc19pbm9kZSk7CisJCUFTU0VSVChhdXRoX2lub2RlICE9IE5VTEwpOworCX0gZWxzZSB7CisJCWF1dGhfaW5vZGUgPSBhZnNfaWdldCh2bm9kZS0+dmZzX2lub2RlLmlfc2IsIGtleSwKKwkJCQkgICAgICAmdm5vZGUtPnN0YXR1cy5wYXJlbnQsIE5VTEwsIE5VTEwpOworCQlpZiAoSVNfRVJSKGF1dGhfaW5vZGUpKQorCQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhdXRoX2lub2RlKSk7CisJfQorCisJYXV0aF92bm9kZSA9IEFGU19GU19JKGF1dGhfaW5vZGUpOworCV9sZWF2ZSgiID0geyV4fSIsIGF1dGhfdm5vZGUtPmZpZC52bm9kZSk7CisJcmV0dXJuIGF1dGhfdm5vZGU7Cit9CisKKy8qCisgKiBjbGVhciB0aGUgcGVybWl0IGNhY2hlIG9uIGEgZGlyZWN0b3J5IHZub2RlCisgKi8KK3ZvaWQgYWZzX2NsZWFyX3Blcm1pdHMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzOworCisJX2VudGVyKCJ7JXh9Iiwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwltdXRleF9sb2NrKCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwlwZXJtaXRzID0gdm5vZGUtPnBlcm1pdHM7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHZub2RlLT5wZXJtaXRzLCBOVUxMKTsKKwltdXRleF91bmxvY2soJnZub2RlLT5wZXJtaXRzX2xvY2spOworCisJaWYgKHBlcm1pdHMpCisJCWNhbGxfcmN1KCZwZXJtaXRzLT5yY3UsIGFmc196YXBfcGVybWl0cyk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGFkZCB0aGUgcmVzdWx0IG9idGFpbmVkIGZvciBhIHZub2RlIHRvIGl0cyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSdzIGNhY2hlCisgKiBmb3IgdGhlIGtleSB1c2VkIHRvIGFjY2VzcyBpdAorICovCit2b2lkIGFmc19jYWNoZV9wZXJtaXQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwgbG9uZyBhY2xfb3JkZXIpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzLCAqeHBlcm1pdHM7CisJc3RydWN0IGFmc19wZXJtaXQgKnBlcm1pdDsKKwlzdHJ1Y3QgYWZzX3Zub2RlICphdXRoX3Zub2RlOworCWludCBjb3VudCwgbG9vcDsKKworCV9lbnRlcigieyV4fSwleCwlbHgiLCB2bm9kZS0+ZmlkLnZub2RlLCBrZXlfc2VyaWFsKGtleSksIGFjbF9vcmRlcik7CisKKwlhdXRoX3Zub2RlID0gYWZzX2dldF9hdXRoX2lub2RlKHZub2RlLCBrZXkpOworCWlmIChJU19FUlIoYXV0aF92bm9kZSkpIHsKKwkJX2xlYXZlKCIgW2dldCBlcnJvciAlbGRdIiwgUFRSX0VSUihhdXRoX3Zub2RlKSk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZhdXRoX3Zub2RlLT5wZXJtaXRzX2xvY2spOworCisJLyogZ3VhcmQgYWdhaW5zdCBhIHJlbmFtZSBiZWluZyBkZXRlY3RlZCB3aGlsc3Qgd2Ugd2FpdGVkIGZvciB0aGUKKwkgKiBsb2NrICovCisJaWYgKG1lbWNtcCgmYXV0aF92bm9kZS0+ZmlkLCAmdm5vZGUtPnN0YXR1cy5wYXJlbnQsCisJCSAgIHNpemVvZihzdHJ1Y3QgYWZzX2ZpZCkpICE9IDApIHsKKwkJX2RlYnVnKCJyZW5hbWVkIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBoYXZlIHRvIGJlIGNhcmVmdWwgYXMgdGhlIGRpcmVjdG9yeSdzIGNhbGxiYWNrIG1heSBiZSBicm9rZW4gYmV0d2VlbgorCSAqIHVzIHJlY2VpdmluZyB0aGUgc3RhdHVzIHdlJ3JlIHRyeWluZyB0byBjYWNoZSBhbmQgdXMgZ2V0dGluZyB0aGUKKwkgKiBsb2NrIHRvIHVwZGF0ZSB0aGUgY2FjaGUgZm9yIHRoZSBzdGF0dXMgKi8KKwlpZiAoYXV0aF92bm9kZS0+YWNsX29yZGVyIC0gYWNsX29yZGVyID4gMCkgeworCQlfZGVidWcoIkFDTCBjaGFuZ2VkPyIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogYWx3YXlzIHVwZGF0ZSB0aGUgYW5vbnltb3VzIG1hc2sgKi8KKwlfZGVidWcoImFub24gYWNjZXNzICV4Iiwgdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcyk7CisJYXV0aF92bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzID0gdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2VzczsKKwlpZiAoa2V5ID09IHZub2RlLT52b2x1bWUtPmNlbGwtPmFub255bW91c19rZXkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXhwZXJtaXRzID0gYXV0aF92bm9kZS0+cGVybWl0czsKKwljb3VudCA9IDA7CisJaWYgKHhwZXJtaXRzKSB7CisJCS8qIHNlZSBpZiB0aGUgcGVybWl0IGlzIGFscmVhZHkgaW4gdGhlIGxpc3QKKwkJICogLSBpZiBpdCBpcyB0aGVuIHdlIGp1c3QgYW1lbmQgdGhlIGxpc3QKKwkJICovCisJCWNvdW50ID0geHBlcm1pdHMtPmNvdW50OworCQlwZXJtaXQgPSB4cGVybWl0cy0+cGVybWl0czsKKwkJZm9yIChsb29wID0gY291bnQ7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJCWlmIChwZXJtaXQtPmtleSA9PSBrZXkpIHsKKwkJCQlwZXJtaXQtPmFjY2Vzc19tYXNrID0KKwkJCQkJdm5vZGUtPnN0YXR1cy5jYWxsZXJfYWNjZXNzOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKwkJCXBlcm1pdCsrOworCQl9CisJfQorCisJcGVybWl0cyA9IGttYWxsb2Moc2l6ZW9mKCpwZXJtaXRzKSArIHNpemVvZigqcGVybWl0KSAqIChjb3VudCArIDEpLAorCQkJICBHRlBfTk9GUyk7CisJaWYgKCFwZXJtaXRzKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwltZW1jcHkocGVybWl0cy0+cGVybWl0cywgeHBlcm1pdHMtPnBlcm1pdHMsCisJICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBhZnNfcGVybWl0KSk7CisKKwlfZGVidWcoImtleSAleCBhY2Nlc3MgJXgiLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksIHZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcyk7CisJcGVybWl0cy0+cGVybWl0c1tjb3VudF0uYWNjZXNzX21hc2sgPSB2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3M7CisJcGVybWl0cy0+cGVybWl0c1tjb3VudF0ua2V5ID0ga2V5X2dldChrZXkpOworCXBlcm1pdHMtPmNvdW50ID0gY291bnQgKyAxOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGF1dGhfdm5vZGUtPnBlcm1pdHMsIHBlcm1pdHMpOworCWlmICh4cGVybWl0cykKKwkJY2FsbF9yY3UoJnhwZXJtaXRzLT5yY3UsIGFmc19kaXNwb3NlX29mX3Blcm1pdHMpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYXV0aF92bm9kZS0+cGVybWl0c19sb2NrKTsKKwlpcHV0KCZhdXRoX3Zub2RlLT52ZnNfaW5vZGUpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBjaGVjayB3aXRoIHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgZGlyZWN0b3J5IG9yIHBhcmVudCBkaXJlY3RvcnkgaXMKKyAqIHBlcm1pdHRlZCB0byBiZSBhY2Nlc3NlZCB3aXRoIHRoaXMgYXV0aG9yaXNhdGlvbiwgYW5kIGlmIHNvLCB3aGF0IGFjY2VzcyBpdAorICogaXMgZ3JhbnRlZAorICovCitzdGF0aWMgaW50IGFmc19jaGVja19wZXJtaXQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKKwkJCSAgICBhZnNfYWNjZXNzX3QgKl9hY2Nlc3MpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzOworCXN0cnVjdCBhZnNfcGVybWl0ICpwZXJtaXQ7CisJc3RydWN0IGFmc192bm9kZSAqYXV0aF92bm9kZTsKKwlib29sIHZhbGlkOworCWludCBsb29wLCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJYXV0aF92bm9kZSA9IGFmc19nZXRfYXV0aF9pbm9kZSh2bm9kZSwga2V5KTsKKwlpZiAoSVNfRVJSKGF1dGhfdm5vZGUpKSB7CisJCSpfYWNjZXNzID0gMDsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGF1dGhfdm5vZGUpKTsKKwkJcmV0dXJuIFBUUl9FUlIoYXV0aF92bm9kZSk7CisJfQorCisJQVNTRVJUKFNfSVNESVIoYXV0aF92bm9kZS0+dmZzX2lub2RlLmlfbW9kZSkpOworCisJLyogY2hlY2sgdGhlIHBlcm1pdHMgdG8gc2VlIGlmIHdlJ3ZlIGdvdCBvbmUgeWV0ICovCisJaWYgKGtleSA9PSBhdXRoX3Zub2RlLT52b2x1bWUtPmNlbGwtPmFub255bW91c19rZXkpIHsKKwkJX2RlYnVnKCJhbm9uIik7CisJCSpfYWNjZXNzID0gYXV0aF92bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzOworCQl2YWxpZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJdmFsaWQgPSBmYWxzZTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlwZXJtaXRzID0gcmN1X2RlcmVmZXJlbmNlKGF1dGhfdm5vZGUtPnBlcm1pdHMpOworCQlpZiAocGVybWl0cykgeworCQkJcGVybWl0ID0gcGVybWl0cy0+cGVybWl0czsKKwkJCWZvciAobG9vcCA9IHBlcm1pdHMtPmNvdW50OyBsb29wID4gMDsgbG9vcC0tKSB7CisJCQkJaWYgKHBlcm1pdC0+a2V5ID09IGtleSkgeworCQkJCQlfZGVidWcoImZvdW5kIGluIGNhY2hlIik7CisJCQkJCSpfYWNjZXNzID0gcGVybWl0LT5hY2Nlc3NfbWFzazsKKwkJCQkJdmFsaWQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcGVybWl0Kys7CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisJaWYgKCF2YWxpZCkgeworCQkvKiBjaGVjayB0aGUgc3RhdHVzIG9uIHRoZSBmaWxlIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4KKwkJICogKHRoZSBwb3N0LXByb2Nlc3Npbmcgd2lsbCBjYWNoZSB0aGUgcmVzdWx0IG9uIGF1dGhfdm5vZGUpICovCisJCV9kZWJ1Zygibm8gdmFsaWQgcGVybWl0Iik7CisKKwkJc2V0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKTsKKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgYXV0aF92bm9kZSwga2V5KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlwdXQoJmF1dGhfdm5vZGUtPnZmc19pbm9kZSk7CisJCQkqX2FjY2VzcyA9IDA7CisJCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkqX2FjY2VzcyA9IHZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2VzczsKKwlpcHV0KCZhdXRoX3Zub2RlLT52ZnNfaW5vZGUpOworCV9sZWF2ZSgiID0gMCBbYWNjZXNzICV4XSIsICpfYWNjZXNzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNoZWNrIHRoZSBwZXJtaXNzaW9ucyBvbiBhbiBBRlMgZmlsZQorICogLSBBRlMgQUNMcyBhcmUgYXR0YWNoZWQgdG8gZGlyZWN0b3JpZXMgb25seSwgYW5kIGEgZmlsZSBpcyBjb250cm9sbGVkIGJ5IGl0cworICogICBwYXJlbnQgZGlyZWN0b3J5J3MgQUNMCisgKi8KK2ludCBhZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisJYWZzX2FjY2Vzc190IGFjY2VzczsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCV9lbnRlcigie3sleDoleH0sJWx4fSwleCwiLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZsYWdzLCBtYXNrKTsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleSh2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQgW2tleV0iLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gUFRSX0VSUihrZXkpOworCX0KKworCS8qIGlmIHRoZSBwcm9taXNlIGhhcyBleHBpcmVkLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgYWdhaW4gKi8KKwlpZiAoIXZub2RlLT5jYl9wcm9taXNlZCkgeworCQlfZGVidWcoIm5vdCBwcm9taXNlZCIpOworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCV9kZWJ1ZygibmV3IHByb21pc2UgW2ZsPSVseF0iLCB2bm9kZS0+ZmxhZ3MpOworCX0KKworCS8qIGNoZWNrIHRoZSBwZXJtaXRzIHRvIHNlZSBpZiB3ZSd2ZSBnb3Qgb25lIHlldCAqLworCXJldCA9IGFmc19jaGVja19wZXJtaXQodm5vZGUsIGtleSwgJmFjY2Vzcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnRlcnByZXQgdGhlIGFjY2VzcyBtYXNrICovCisJX2RlYnVnKCJSRVEgJXggQUNDICV4IG9uICVzIiwKKwkgICAgICAgbWFzaywgYWNjZXNzLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gImRpciIgOiAiZmlsZSIpOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG1hc2sgJiBNQVlfRVhFQykgeworCQkJaWYgKCEoYWNjZXNzICYgQUZTX0FDRV9MT09LVVApKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9SRUFEKSB7CisJCQlpZiAoIShhY2Nlc3MgJiBBRlNfQUNFX1JFQUQpKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9XUklURSkgeworCQkJaWYgKCEoYWNjZXNzICYgKEFGU19BQ0VfREVMRVRFIHwgLyogcm1kaXIsIHVubGluaywgcmVuYW1lIGZyb20gKi8KKwkJCQkJQUZTX0FDRV9JTlNFUlQgfCAvKiBjcmVhdGUsIG1rZGlyLCBzeW1saW5rLCByZW5hbWUgdG8gKi8KKwkJCQkJQUZTX0FDRV9XUklURSkpKSAvKiBjaG1vZCAqLworCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKGFjY2VzcyAmIEFGU19BQ0VfTE9PS1VQKSkKKwkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCWlmIChtYXNrICYgKE1BWV9FWEVDIHwgTUFZX1JFQUQpKSB7CisJCQlpZiAoIShhY2Nlc3MgJiBBRlNfQUNFX1JFQUQpKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9XUklURSkgeworCQkJaWYgKCEoYWNjZXNzICYgQUZTX0FDRV9XUklURSkpCisJCQkJZ290byBwZXJtaXNzaW9uX2RlbmllZDsKKwkJfQorCX0KKworCWtleV9wdXQoa2V5KTsKKwlyZXQgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK3Blcm1pc3Npb25fZGVuaWVkOgorCXJldCA9IC1FQUNDRVM7CitlcnJvcjoKKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuYyBiL2ZzL2Fmcy9zZXJ2ZXIuYwppbmRleCA0NGFmZjgxLi45NmJiMjNiIDEwMDY0NAotLS0gYS9mcy9hZnMvc2VydmVyLmMKKysrIGIvZnMvYWZzL3NlcnZlci5jCkBAIC0xLDYgKzEsNiBAQAotLyogc2VydmVyLmM6IEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKy8qIEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xMSw0ODkgKzExLDMxNCBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1ERUZJTkVfU1BJTkxPQ0soYWZzX3NlcnZlcl9wZWVyX2xvY2spOwordW5zaWduZWQgYWZzX3NlcnZlcl90aW1lb3V0ID0gMTA7CS8qIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMgKi8KIAotI2RlZmluZSBGU19TRVJWSUNFX0lECQkxCS8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBJRCAqLwotI2RlZmluZSBWTF9TRVJWSUNFX0lECQk1MgkvKiBBRlMgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgSUQgKi8KK3N0YXRpYyB2b2lkIGFmc19yZWFwX3NlcnZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKLXN0YXRpYyB2b2lkIF9fYWZzX3NlcnZlcl90aW1lb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQorLyogdHJlZSBvZiBhbGwgdGhlIHNlcnZlcnMsIGluZGV4ZWQgYnkgSVAgYWRkcmVzcyAqLworc3RhdGljIHN0cnVjdCByYl9yb290IGFmc19zZXJ2ZXJzID0gUkJfUk9PVDsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGFmc19zZXJ2ZXJzX2xvY2spOworCisvKiBMUlUgbGlzdCBvZiBhbGwgdGhlIHNlcnZlcnMgbm90IGN1cnJlbnRseSBpbiB1c2UgKi8KK3N0YXRpYyBMSVNUX0hFQUQoYWZzX3NlcnZlcl9ncmF2ZXlhcmQpOworc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfc2VydmVyX3JlYXBlciwgYWZzX3JlYXBfc2VydmVyKTsKKworLyoKKyAqIGluc3RhbGwgYSBzZXJ2ZXIgcmVjb3JkIGluIHRoZSBtYXN0ZXIgdHJlZQorICovCitzdGF0aWMgaW50IGFmc19pbnN0YWxsX3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQogewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgYWZzX3NlcnZlciwgdGltZW91dCk7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnhzZXJ2ZXI7CisJc3RydWN0IHJiX25vZGUgKipwcCwgKnA7CisJaW50IHJldDsKIAotCV9kZWJ1ZygiU0VSVkVSIFRJTUVPVVQgWyVwe3U9JWR9XSIsCi0JICAgICAgIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKwlfZW50ZXIoIiVwIiwgc2VydmVyKTsKIAotCWFmc19zZXJ2ZXJfZG9fdGltZW91dChzZXJ2ZXIpOworCXdyaXRlX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOworCisJcmV0ID0gLUVFWElTVDsKKwlwcCA9ICZhZnNfc2VydmVycy5yYl9ub2RlOworCXAgPSBOVUxMOworCXdoaWxlICgqcHApIHsKKwkJcCA9ICpwcDsKKwkJX2RlYnVnKCItIGNvbnNpZGVyICVwIiwgcCk7CisJCXhzZXJ2ZXIgPSByYl9lbnRyeShwLCBzdHJ1Y3QgYWZzX3NlcnZlciwgbWFzdGVyX3JiKTsKKwkJaWYgKHNlcnZlci0+YWRkci5zX2FkZHIgPCB4c2VydmVyLT5hZGRyLnNfYWRkcikKKwkJCXBwID0gJigqcHApLT5yYl9sZWZ0OworCQllbHNlIGlmIChzZXJ2ZXItPmFkZHIuc19hZGRyID4geHNlcnZlci0+YWRkci5zX2FkZHIpCisJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmJfbGlua19ub2RlKCZzZXJ2ZXItPm1hc3Rlcl9yYiwgcCwgcHApOworCXJiX2luc2VydF9jb2xvcigmc2VydmVyLT5tYXN0ZXJfcmIsICZhZnNfc2VydmVycyk7CisJcmV0ID0gMDsKKworZXJyb3I6CisJd3JpdGVfdW5sb2NrKCZhZnNfc2VydmVyc19sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3NlcnZlcl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fYWZzX3NlcnZlcl90aW1lb3V0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGxvb2t1cCBhIHNlcnZlciByZWNvcmQgaW4gYSBjZWxsCi0gKiAtIFRPRE86IHNlYXJjaCB0aGUgY2VsbCdzIHNlcnZlciBsaXN0CisgKiBhbGxvY2F0ZSBhIG5ldyBzZXJ2ZXIgcmVjb3JkCiAgKi8KLWludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCitzdGF0aWMgc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19hbGxvY19zZXJ2ZXIoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLCAqYWN0aXZlLCAqem9tYmllOwotCWludCBsb29wOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAKLQlfZW50ZXIoIiVwLCUwOHgsIiwgY2VsbCwgbnRvaGwoYWRkci0+c19hZGRyKSk7CisJX2VudGVyKCIiKTsKIAotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgc2VydmVyIHJlY29yZCAqLwogCXNlcnZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXJ2ZXIpIHsKKwlpZiAoc2VydmVyKSB7CisJCWF0b21pY19zZXQoJnNlcnZlci0+dXNhZ2UsIDEpOworCQlzZXJ2ZXItPmNlbGwgPSBjZWxsOworCisJCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmxpbmspOworCQlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5ncmF2ZSk7CisJCWluaXRfcndzZW0oJnNlcnZlci0+c2VtKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+ZnNfbG9jayk7CisJCXNlcnZlci0+ZnNfdm5vZGVzID0gUkJfUk9PVDsKKwkJc2VydmVyLT5jYl9wcm9taXNlcyA9IFJCX1JPT1Q7CisJCXNwaW5fbG9ja19pbml0KCZzZXJ2ZXItPmNiX2xvY2spOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJ2ZXItPmNiX2JyZWFrX3dhaXRxKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnNlcnZlci0+Y2JfYnJlYWtfd29yaywKKwkJCQkgIGFmc19kaXNwYXRjaF9naXZlX3VwX2NhbGxiYWNrcyk7CisKKwkJbWVtY3B5KCZzZXJ2ZXItPmFkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOworCX0KKworCV9sZWF2ZSgiID0gJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOworCXJldHVybiBzZXJ2ZXI7Cit9CisKKy8qCisgKiBnZXQgYW4gRlMtc2VydmVyIHJlY29yZCBmb3IgYSBjZWxsCisgKi8KK3N0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLCAqY2FuZGlkYXRlOworCisJX2VudGVyKCIlcCwiTklQUVVBRF9GTVQsIGNlbGwsIE5JUFFVQUQoYWRkci0+c19hZGRyKSk7CisKKwkvKiBxdWljayBzY2FuIG9mIHRoZSBsaXN0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNlcnZlciAqLworCXJlYWRfbG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c2VydmVycywgbGluaykgeworCQlpZiAoc2VydmVyLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCisJCQlnb3RvIGZvdW5kX3NlcnZlcl9xdWlja2x5OworCX0KKwlyZWFkX3VubG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKKworCWNhbmRpZGF0ZSA9IGFmc19hbGxvY19zZXJ2ZXIoY2VsbCwgYWRkcik7CisJaWYgKCFjYW5kaWRhdGUpIHsKIAkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlhdG9taWNfc2V0KCZzZXJ2ZXItPnVzYWdlLCAxKTsKKwl3cml0ZV9sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOwogCi0JSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bGluayk7Ci0JaW5pdF9yd3NlbSgmc2VydmVyLT5zZW0pOwotCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmZzX2NhbGxxKTsKLQlzcGluX2xvY2tfaW5pdCgmc2VydmVyLT5mc19sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5jYl9wcm9taXNlcyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+Y2JfbG9jayk7Ci0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRTsgbG9vcCsrKQotCQlzZXJ2ZXItPmZzX2Nvbm5fY250W2xvb3BdID0gNDsKLQotCW1lbWNweSgmc2VydmVyLT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOwotCi0JYWZzX3RpbWVyX2luaXQoJnNlcnZlci0+dGltZW91dCwgJmFmc19zZXJ2ZXJfdGltZXJfb3BzKTsKLQotCS8qIGFkZCB0byB0aGUgY2VsbCAqLwotCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOwotCi0JLyogY2hlY2sgdGhlIGFjdGl2ZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShhY3RpdmUsICZjZWxsLT5zdl9saXN0LCBsaW5rKSB7Ci0JCWlmIChhY3RpdmUtPmFkZHIuc19hZGRyID09IGFkZHItPnNfYWRkcikKLQkJCWdvdG8gdXNlX2FjdGl2ZV9zZXJ2ZXI7CisJLyogY2hlY2sgdGhlIGNlbGwncyBzZXJ2ZXIgbGlzdCBhZ2FpbiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c2VydmVycywgbGluaykgeworCQlpZiAoc2VydmVyLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCisJCQlnb3RvIGZvdW5kX3NlcnZlcjsKIAl9CiAKLQkvKiBjaGVjayB0aGUgaW5hY3RpdmUgbGlzdCAqLwotCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHpvbWJpZSwgJmNlbGwtPnN2X2dyYXZleWFyZCwgbGluaykgewotCQlpZiAoem9tYmllLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCi0JCQlnb3RvIHJlc3VycmVjdF9zZXJ2ZXI7Ci0JfQotCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCV9kZWJ1ZygibmV3Iik7CisJc2VydmVyID0gY2FuZGlkYXRlOworCWlmIChhZnNfaW5zdGFsbF9zZXJ2ZXIoc2VydmVyKSA8IDApCisJCWdvdG8gc2VydmVyX2luX3R3b19jZWxsczsKIAogCWFmc19nZXRfY2VsbChjZWxsKTsKLQlzZXJ2ZXItPmNlbGwgPSBjZWxsOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnNlcnZlcnMpOwogCi0Jd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwl3cml0ZV91bmxvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CisJX2xlYXZlKCIgPSAlcHslZH0iLCBzZXJ2ZXIsIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSk7CisJcmV0dXJuIHNlcnZlcjsKIAotCSpfc2VydmVyID0gc2VydmVyOwotCV9sZWF2ZSgiID0gMCAoJXApIiwgc2VydmVyKTsKLQlyZXR1cm4gMDsKKwkvKiBmb3VuZCBhIG1hdGNoaW5nIHNlcnZlciBxdWlja2x5ICovCitmb3VuZF9zZXJ2ZXJfcXVpY2tseToKKwlfZGVidWcoImZvdW5kIHF1aWNrbHkiKTsKKwlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCXJlYWRfdW5sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOworbm9fbG9uZ2VyX3VudXNlZDoKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+Z3JhdmUpKSB7CisJCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+Z3JhdmUpOworCQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJfQorCV9sZWF2ZSgiID0gJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOworCXJldHVybiBzZXJ2ZXI7CiAKLQkvKiBmb3VuZCBhIG1hdGNoaW5nIGFjdGl2ZSBzZXJ2ZXIgKi8KLSB1c2VfYWN0aXZlX3NlcnZlcjoKLQlfZGVidWcoImFjdGl2ZSBzZXJ2ZXIiKTsKLQlhZnNfZ2V0X3NlcnZlcihhY3RpdmUpOwotCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisJLyogZm91bmQgYSBtYXRjaGluZyBzZXJ2ZXIgb24gdGhlIHNlY29uZCBwYXNzICovCitmb3VuZF9zZXJ2ZXI6CisJX2RlYnVnKCJmb3VuZCIpOworCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBub19sb25nZXJfdW51c2VkOwogCi0Ja2ZyZWUoc2VydmVyKTsKKwkvKiBmb3VuZCBhIHNlcnZlciB0aGF0IHNlZW1zIHRvIGJlIGluIHR3byBjZWxscyAqLworc2VydmVyX2luX3R3b19jZWxsczoKKwl3cml0ZV91bmxvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CisJa2ZyZWUoY2FuZGlkYXRlKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCSAgICAgICAiIFNlcnZlciAiTklQUVVBRF9GTVQiIGFwcGVhcnMgdG8gYmUgaW4gdHdvIGNlbGxzXG4iLAorCSAgICAgICBOSVBRVUFEKCphZGRyKSk7CisJX2xlYXZlKCIgPSAtRUVYSVNUIik7CisJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7Cit9CiAKLQkqX3NlcnZlciA9IGFjdGl2ZTsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGFjdGl2ZSk7Ci0JcmV0dXJuIDA7CisvKgorICogbG9vayB1cCBhIHNlcnZlciBieSBpdHMgSVAgYWRkcmVzcworICovCitzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX2ZpbmRfc2VydmVyKGNvbnN0IHN0cnVjdCBpbl9hZGRyICpfYWRkcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0gKl9hZGRyOwogCi0JLyogZm91bmQgYSBtYXRjaGluZyBzZXJ2ZXIgaW4gdGhlIGdyYXZleWFyZCwgc28gcmVzdXJyZWN0IGl0IGFuZAotCSAqIGRpc3Bvc2Ugb2YgdGhlIG5ldyByZWNvcmQgKi8KLSByZXN1cnJlY3Rfc2VydmVyOgotCV9kZWJ1ZygicmVzdXJyZWN0aW5nIHNlcnZlciIpOworCV9lbnRlcihOSVBRVUFEX0ZNVCwgTklQUVVBRChhZGRyLnNfYWRkcikpOwogCi0JbGlzdF9tb3ZlX3RhaWwoJnpvbWJpZS0+bGluaywgJmNlbGwtPnN2X2xpc3QpOwotCWFmc19nZXRfc2VydmVyKHpvbWJpZSk7Ci0JYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnpvbWJpZS0+dGltZW91dCk7Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0Jd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOwogCi0Ja2ZyZWUoc2VydmVyKTsKKwlwID0gYWZzX3NlcnZlcnMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQlzZXJ2ZXIgPSByYl9lbnRyeShwLCBzdHJ1Y3QgYWZzX3NlcnZlciwgbWFzdGVyX3JiKTsKIAotCSpfc2VydmVyID0gem9tYmllOwotCV9sZWF2ZSgiID0gMCAoJXApIiwgem9tYmllKTsKLQlyZXR1cm4gMDsKKwkJX2RlYnVnKCItIGNvbnNpZGVyICVwIiwgcCk7CiAKLX0gLyogZW5kIGFmc19zZXJ2ZXJfbG9va3VwKCkgKi8KKwkJaWYgKGFkZHIuc19hZGRyIDwgc2VydmVyLT5hZGRyLnNfYWRkcikgeworCQkJcCA9IHAtPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoYWRkci5zX2FkZHIgPiBzZXJ2ZXItPmFkZHIuc19hZGRyKSB7CisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXNlcnZlciA9IE5VTEw7Citmb3VuZDoKKwlyZWFkX3VubG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJQVNTRVJUSUZDTVAoc2VydmVyLCBzZXJ2ZXItPmFkZHIuc19hZGRyLCA9PSwgYWRkci5zX2FkZHIpOworCV9sZWF2ZSgiID0gJXAiLCBzZXJ2ZXIpOworCXJldHVybiBzZXJ2ZXI7Cit9CisKIC8qCiAgKiBkZXN0cm95IGEgc2VydmVyIHJlY29yZAogICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwgbGlzdAogICovCiB2b2lkIGFmc19wdXRfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCiB7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsOwotCiAJaWYgKCFzZXJ2ZXIpCiAJCXJldHVybjsKIAotCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCV9lbnRlcigiJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOwogCi0JY2VsbCA9IHNlcnZlci0+Y2VsbDsKKwlfZGVidWcoIlBVVCBTRVJWRVIgJWQiLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOwogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JQlVHX09OKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA8PSAwKTsKLQotCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5Ci0JICogYXRvbWljICovCi0Jd3JpdGVfbG9jaygmY2VsbC0+c3ZfbG9jayk7CisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwgPiwgMCk7CiAKIAlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXJ2ZXItPnVzYWdlKSkpIHsKLQkJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKIAkJX2xlYXZlKCIiKTsKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQlsaXN0X21vdmVfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfZ3JhdmV5YXJkKTsKKwlhZnNfZmx1c2hfY2FsbGJhY2tfYnJlYWtzKHNlcnZlcik7CiAKLQkvKiB0aW1lIG91dCBpbiAxMCBzZWNzICovCi0JYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnNlcnZlci0+dGltZW91dCwgMTAgKiBIWik7CisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpID09IDApIHsKKwkJbGlzdF9tb3ZlX3RhaWwoJnNlcnZlci0+Z3JhdmUsICZhZnNfc2VydmVyX2dyYXZleWFyZCk7CisJCXNlcnZlci0+dGltZV9vZl9kZWF0aCA9IGdldF9zZWNvbmRzKCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3NlcnZlcl9yZWFwZXIsCisJCQkJICAgICAgYWZzX3NlcnZlcl90aW1lb3V0ICogSFopOworCX0KKwlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJX2xlYXZlKCIgW2RlYWRdIik7Cit9CiAKLQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQl3cml0ZV91bmxvY2soJmNlbGwtPnN2X2xvY2spOwotCi0JX2xlYXZlKCIgW2tpbGxlZF0iKTsKLX0gLyogZW5kIGFmc19wdXRfc2VydmVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHRpbWVvdXQgc2VydmVyIHJlY29yZAotICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwncyBncmF2ZXlhcmQgaWYgdGhlIHVzYWdlIGNvdW50IGlzIHplcm8KKyAqIGRlc3Ryb3kgYSBkZWFkIHNlcnZlcgogICovCi12b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQorc3RhdGljIHZvaWQgYWZzX2Rlc3Ryb3lfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCiB7Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsOwotCWludCBsb29wOwotCiAJX2VudGVyKCIlcCIsIHNlcnZlcik7CiAKLQljZWxsID0gc2VydmVyLT5jZWxsOworCUFTU0VSVENNUChzZXJ2ZXItPmZzX3Zub2Rlcy5yYl9ub2RlLCA9PSwgTlVMTCk7CisJQVNTRVJUQ01QKHNlcnZlci0+Y2JfcHJvbWlzZXMucmJfbm9kZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChzZXJ2ZXItPmNiX2JyZWFrX2hlYWQsID09LCBzZXJ2ZXItPmNiX2JyZWFrX3RhaWwpOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmc2VydmVyLT5jYl9icmVha19uKSwgPT0sIDApOwogCi0JQlVHX09OKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA8IDApOwotCi0JLyogcmVtb3ZlIGZyb20gZ3JhdmV5YXJkIGlmIHN0aWxsIGRlYWQgKi8KLQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA9PSAwKQotCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmxpbmspOwotCWVsc2UKLQkJc2VydmVyID0gTlVMTDsKLQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCWlmICghc2VydmVyKSB7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsgLyogcmVzdXJyZWN0ZWQgKi8KLQl9Ci0KLQkvKiB3ZSBjYW4gbm93IGRlc3Ryb3kgaXQgcHJvcGVybHkgKi8KLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQkvKiB1bmNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KLQlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQlwZWVyID0gc2VydmVyLT5wZWVyOwotCWlmIChwZWVyKSB7Ci0JCXNlcnZlci0+cGVlciA9IE5VTEw7Ci0JCXBlZXItPnVzZXIgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSBzZXJ2ZXIgKi8KLQlmb3IgKGxvb3AgPSBBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCi0JCWlmIChzZXJ2ZXItPmZzX2Nvbm5bbG9vcF0pCi0JCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPmZzX2Nvbm5bbG9vcF0pOwotCi0JaWYgKHNlcnZlci0+dmxzZXJ2ZXIpCi0JCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHNlcnZlci0+dmxzZXJ2ZXIpOwotCisJYWZzX3B1dF9jZWxsKHNlcnZlci0+Y2VsbCk7CiAJa2ZyZWUoc2VydmVyKTsKK30KIAotCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Ci19IC8qIGVuZCBhZnNfc2VydmVyX2RvX3RpbWVvdXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogZ2V0IGEgY2FsbHNsb3Qgb24gYSBjb25uZWN0aW9uIHRvIHRoZSBmaWxlc2VydmVyIG9uIHRoZSBzcGVjaWZpZWQgc2VydmVyCisgKiByZWFwIGRlYWQgc2VydmVyIHJlY29yZHMKICAqLwotaW50IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCkKK3N0YXRpYyB2b2lkIGFmc19yZWFwX3NlcnZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKnBjYWxsc2xvdDsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgbmNvbm4sIHJldDsKKwlMSVNUX0hFQUQoY29ycHNlcyk7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwl1bnNpZ25lZCBsb25nIGRlbGF5LCBleHBpcnk7CisJdGltZV90IG5vdzsKIAotCV9lbnRlcigiJXAsIixzZXJ2ZXIpOworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZjYWxsc2xvdC0+bGluayk7Ci0JY2FsbHNsb3QtPnRhc2sgPSBjdXJyZW50OwotCWNhbGxzbG90LT5jb25uID0gTlVMTDsKLQljYWxsc2xvdC0+bmNvbm4gPSAtMTsKLQljYWxsc2xvdC0+cmVhZHkgPSAwOworCXdoaWxlICghbGlzdF9lbXB0eSgmYWZzX3NlcnZlcl9ncmF2ZXlhcmQpKSB7CisJCXNlcnZlciA9IGxpc3RfZW50cnkoYWZzX3NlcnZlcl9ncmF2ZXlhcmQubmV4dCwKKwkJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIsIGdyYXZlKTsKIAotCXJldCA9IDA7Ci0JY29ubiA9IE5VTEw7Ci0KLQkvKiBnZXQgaG9sZCBvZiBhIGNhbGxzbG90IGZpcnN0ICovCi0Jc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCi0JLyogcmVzdXJyZWN0IHRoZSBzZXJ2ZXIgaWYgaXQncyBkZWF0aCB0aW1lb3V0IGhhcyBleHBpcmVkICovCi0JaWYgKHNlcnZlci0+ZnNfc3RhdGUpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHNlcnZlci0+ZnNfZGVhZF9qaWYpKSB7Ci0JCQlyZXQgPSBzZXJ2ZXItPmZzX3N0YXRlOwotCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JCQlfbGVhdmUoIiA9ICVkIFtzdGlsbCBkZWFkXSIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OworCQkvKiB0aGUgcXVldWUgaXMgb3JkZXJlZCBtb3N0IGRlYWQgZmlyc3QgKi8KKwkJZXhwaXJ5ID0gc2VydmVyLT50aW1lX29mX2RlYXRoICsgYWZzX3NlcnZlcl90aW1lb3V0OworCQlpZiAoZXhwaXJ5ID4gbm93KSB7CisJCQlkZWxheSA9IChleHBpcnkgLSBub3cpICogSFo7CisJCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3NlcnZlcl9yZWFwZXIsIGRlbGF5KSkgeworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLAorCQkJCQkJICAgICAgZGVsYXkpOworCQkJfQorCQkJYnJlYWs7CiAJCX0KIAotCQlzZXJ2ZXItPmZzX3N0YXRlID0gMDsKLQl9Ci0KLQkvKiB0cnkgYW5kIGZpbmQgYSBjb25uZWN0aW9uIHRoYXQgaGFzIHNwYXJlIGNhbGxzbG90cyAqLwotCWZvciAobmNvbm4gPSAwOyBuY29ubiA8IEFGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkU7IG5jb25uKyspIHsKLQkJaWYgKHNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dID4gMCkgewotCQkJc2VydmVyLT5mc19jb25uX2NudFtuY29ubl0tLTsKLQkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCQkJY2FsbHNsb3QtPm5jb25uID0gbmNvbm47Ci0JCQlnb3RvIG9idGFpbmVkX3Nsb3Q7CisJCXdyaXRlX2xvY2soJnNlcnZlci0+Y2VsbC0+c2VydmVyc19sb2NrKTsKKwkJd3JpdGVfbG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJCWlmIChhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPiAwKSB7CisJCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmdyYXZlKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZzZXJ2ZXItPmdyYXZlLCAmY29ycHNlcyk7CisJCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmxpbmspOworCQkJcmJfZXJhc2UoJnNlcnZlci0+bWFzdGVyX3JiLCAmYWZzX3NlcnZlcnMpOwogCQl9CisJCXdyaXRlX3VubG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJCXdyaXRlX3VubG9jaygmc2VydmVyLT5jZWxsLT5zZXJ2ZXJzX2xvY2spOwogCX0KIAotCS8qIG5vbmUgd2VyZSBhdmFpbGFibGUgLSB3YWl0IGludGVycnVwdGlibHkgZm9yIG9uZSB0byBiZWNvbWUKLQkgKiBhdmFpbGFibGUgKi8KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWxpc3RfYWRkX3RhaWwoJmNhbGxzbG90LT5saW5rLCAmc2VydmVyLT5mc19jYWxscSk7Ci0Jc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfZ3JhdmV5YXJkX2xvY2spOwogCi0Jd2hpbGUgKCFjYWxsc2xvdC0+cmVhZHkgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJLyogbm93IHJlYXAgdGhlIGNvcnBzZXMgd2UndmUgZXh0cmFjdGVkICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb3Jwc2VzKSkgeworCQlzZXJ2ZXIgPSBsaXN0X2VudHJ5KGNvcnBzZXMubmV4dCwgc3RydWN0IGFmc19zZXJ2ZXIsIGdyYXZlKTsKKwkJbGlzdF9kZWwoJnNlcnZlci0+Z3JhdmUpOworCQlhZnNfZGVzdHJveV9zZXJ2ZXIoc2VydmVyKTsKIAl9Cit9CiAKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JLyogZXZlbiBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIHdlIG1heSBzdGlsbCBiZSBxdWV1ZWQgKi8KLQlpZiAoIWNhbGxzbG90LT5yZWFkeSkgewotCQlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJmNhbGxzbG90LT5saW5rKTsKLQkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JfQotCi0JbmNvbm4gPSBjYWxsc2xvdC0+bmNvbm47Ci0KLQkvKiBpZiBpbnRlcnJ1cHRlZCwgd2UgbXVzdCByZWxlYXNlIGFueSBzbG90IHdlIGFsc28gZ290IGJlZm9yZQotCSAqIHJldHVybmluZyBhbiBlcnJvciAqLwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlyZXQgPSAtRUlOVFI7Ci0JCWdvdG8gZXJyb3JfcmVsZWFzZTsKLQl9Ci0KLQkvKiBpZiB3ZSB3ZXJlIHdva2VuIHVwIHdpdGggYW4gZXJyb3IsIHRoZW4gcGFzcyB0aGF0IGVycm9yIGJhY2sgdG8gdGhlCi0JICogY2FsbGVkICovCi0JaWYgKG5jb25uIDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgY2FsbHNsb3QtPmVycm5vKTsKLQkJcmV0dXJuIGNhbGxzbG90LT5lcnJubzsKLQl9Ci0KLQkvKiB3ZXJlIHdlIGdpdmVuIGEgY29ubmVjdGlvbiBkaXJlY3RseT8gKi8KLQlpZiAoY2FsbHNsb3QtPmNvbm4pIHsKLQkJLyogeWVzIC0gdXNlIGl0ICovCi0JCV9sZWF2ZSgiID0gMCAobmM9JWQpIiwgbmNvbm4pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBnb3QgYSBjYWxsc2xvdCwgYnV0IG5vIGNvbm5lY3Rpb24gKi8KLSBvYnRhaW5lZF9zbG90OgotCi0JLyogbmVlZCB0byBnZXQgaG9sZCBvZiB0aGUgUnhSUEMgY29ubmVjdGlvbiAqLwotCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKLQotCS8qIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIGVycm9yICovCi0JcmV0ID0gc2VydmVyLT5mc19zdGF0ZTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JlbGVhc2VfdXB3OwotCi0JaWYgKHNlcnZlci0+ZnNfY29ubltuY29ubl0pIHsKLQkJLyogcmV1c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiAqLwotCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKTsKLQkJY2FsbHNsb3QtPmNvbm4gPSBzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dOwotCX0KLQllbHNlIHsKLQkJLyogY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gKi8KLQkJcmV0ID0gcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24oYWZzX3RyYW5zcG9ydCwKLQkJCQkJICAgICAgaHRvbnMoNzAwMCksCi0JCQkJCSAgICAgIHNlcnZlci0+YWRkci5zX2FkZHIsCi0JCQkJCSAgICAgIEZTX1NFUlZJQ0VfSUQsCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgICZzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKTsKLQotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmVsZWFzZV91cHc7Ci0KLQkJY2FsbHNsb3QtPmNvbm4gPSBzZXJ2ZXItPmZzX2Nvbm5bMF07Ci0JCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKLQl9Ci0KLQl1cF93cml0ZSgmc2VydmVyLT5zZW0pOwotCi0gCV9sZWF2ZSgiID0gMCIpOwotCXJldHVybiAwOwotCi0JLyogaGFuZGxlIGFuIGVycm9yIG9jY3VycmluZyAqLwotIGVycm9yX3JlbGVhc2VfdXB3OgotCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0KLSBlcnJvcl9yZWxlYXNlOgotCS8qIGVpdGhlciByZWxlYXNlIHRoZSBjYWxsc2xvdCBvciBwYXNzIGl0IGFsb25nIHRvIGFub3RoZXIgZGVzZXJ2aW5nCi0JICogdGFzayAqLwotCXNwaW5fbG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQotCWlmIChuY29ubiA8IDApIHsKLQkJLyogbm8gY2FsbHNsb3QgYWxsb2NhdGVkICovCi0JfQotCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7Ci0JCS8qIG5vIG9uZSB3YWl0aW5nICovCi0JCXNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dKys7Ci0JCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCX0KLQllbHNlIHsKLQkJLyogc29tZW9uZSdzIHdhaXRpbmcgLSBkZXF1ZXVlIHRoZW0gYW5kIHdha2UgdGhlbSB1cCAqLwotCQlwY2FsbHNsb3QgPSBsaXN0X2VudHJ5KHNlcnZlci0+ZnNfY2FsbHEubmV4dCwKLQkJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QsIGxpbmspOwotCQlsaXN0X2RlbF9pbml0KCZwY2FsbHNsb3QtPmxpbmspOwotCi0JCXBjYWxsc2xvdC0+ZXJybm8gPSBzZXJ2ZXItPmZzX3N0YXRlOwotCQlpZiAoIXBjYWxsc2xvdC0+ZXJybm8pIHsKLQkJCS8qIHBhc3MgdGhlbSBvdXQgY2FsbHNsb3QgZGV0YWlscyAqLwotCQkJY2FsbHNsb3QtPmNvbm4gPSB4Y2hnKCZwY2FsbHNsb3QtPmNvbm4sCi0JCQkJCSAgICAgIGNhbGxzbG90LT5jb25uKTsKLQkJCXBjYWxsc2xvdC0+bmNvbm4gPSBuY29ubjsKLQkJCWNhbGxzbG90LT5uY29ubiA9IG5jb25uID0gLTE7Ci0JCX0KLQkJcGNhbGxzbG90LT5yZWFkeSA9IDE7Ci0JCXdha2VfdXBfcHJvY2VzcyhwY2FsbHNsb3QtPnRhc2spOwotCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQl9Ci0KLQlyeHJwY19wdXRfY29ubmVjdGlvbihjYWxsc2xvdC0+Y29ubik7Ci0JY2FsbHNsb3QtPmNvbm4gPSBOVUxMOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotfSAvKiBlbmQgYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHJlbGVhc2UgYSBjYWxsc2xvdCBiYWNrIHRvIHRoZSBzZXJ2ZXIKLSAqIC0gdHJhbnNmZXJzIHRoZSBSeFJQQyBjb25uZWN0aW9uIHRvIHRoZSBuZXh0IHBlbmRpbmcgY2FsbHNsb3QgaWYgcG9zc2libGUKKyAqIGRpc2NhcmQgYWxsIHRoZSBzZXJ2ZXIgcmVjb3JkcyBmb3Igcm1tb2QKICAqLwotdm9pZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KQordm9pZCBfX2V4aXQgYWZzX3B1cmdlX3NlcnZlcnModm9pZCkKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqcGNhbGxzbG90OwotCi0JX2VudGVyKCJ7YWQ9JTA4eCxjbnQ9JXV9LHslZH0iLAotCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSwKLQkgICAgICAgc2VydmVyLT5mc19jb25uX2NudFtjYWxsc2xvdC0+bmNvbm5dLAotCSAgICAgICBjYWxsc2xvdC0+bmNvbm4pOwotCi0JQlVHX09OKGNhbGxzbG90LT5uY29ubiA8IDApOwotCi0Jc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCi0JaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7Ci0JCS8qIG5vIG9uZSB3YWl0aW5nICovCi0JCXNlcnZlci0+ZnNfY29ubl9jbnRbY2FsbHNsb3QtPm5jb25uXSsrOwotCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KLQkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCi0JCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKLQkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKLQotCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKLQkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7Ci0JCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KLQkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLCBjYWxsc2xvdC0+Y29ubik7Ci0JCQlwY2FsbHNsb3QtPm5jb25uID0gY2FsbHNsb3QtPm5jb25uOwotCQkJY2FsbHNsb3QtPm5jb25uID0gLTE7Ci0JCX0KLQotCQlwY2FsbHNsb3QtPnJlYWR5ID0gMTsKLQkJd2FrZV91cF9wcm9jZXNzKHBjYWxsc2xvdC0+dGFzayk7Ci0JCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCX0KLQotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZ2V0IGEgaGFuZGxlIHRvIGEgY29ubmVjdGlvbiB0byB0aGUgdmxzZXJ2ZXIgKHZvbHVtZSBsb2NhdGlvbikgb24gdGhlCi0gKiBzcGVjaWZpZWQgc2VydmVyCi0gKi8KLWludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcCwiLCBzZXJ2ZXIpOwotCi0JcmV0ID0gMDsKLQljb25uID0gTlVMTDsKLQlkb3duX3JlYWQoJnNlcnZlci0+c2VtKTsKLQotCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7Ci0JCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KLQkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7Ci0JCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOwotCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7Ci0JfQotCWVsc2UgewotCQkvKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiAqLwotCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7Ci0JCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKLQkJaWYgKCFzZXJ2ZXItPnZsc2VydmVyKSB7Ci0JCQlyZXQgPSByeHJwY19jcmVhdGVfY29ubmVjdGlvbihhZnNfdHJhbnNwb3J0LAotCQkJCQkJICAgICAgaHRvbnMoNzAwMyksCi0JCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAotCQkJCQkJICAgICAgVkxfU0VSVklDRV9JRCwKLQkJCQkJCSAgICAgIE5VTEwsCi0JCQkJCQkgICAgICAmc2VydmVyLT52bHNlcnZlcik7Ci0JCX0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKLQkJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOwotCQl9Ci0JCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JfQotCi0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3NlcnZlcl9nZXRfdmxjb25uKCkgKi8KKwlhZnNfc2VydmVyX3RpbWVvdXQgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuaCBiL2ZzL2Fmcy9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkMjQxMS4uMDAwMDAwMAotLS0gYS9mcy9hZnMvc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogc2VydmVyLmg6IEFGUyBzZXJ2ZXIgcmVjb3JkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19TRVJWRVJfSAotI2RlZmluZSBfTElOVVhfQUZTX1NFUlZFUl9ICi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImthZnN0aW1vZC5oIgotI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgotCi1leHRlcm4gc3BpbmxvY2tfdCBhZnNfc2VydmVyX3BlZXJfbG9jazsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBzZXJ2ZXIgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfc2VydmVyCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBhZnNfY2VsbAkJKmNlbGw7CQkvKiBjZWxsIGluIHdoaWNoIHNlcnZlciByZXNpZGVzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBjZWxsJ3Mgc2VydmVyIGxpc3QgKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlbTsJCS8qIGFjY2VzcyBsb2NrICovCi0Jc3RydWN0IGFmc190aW1lcgl0aW1lb3V0OwkvKiBncmF2ZXlhcmQgdGltZW91dCAqLwotCXN0cnVjdCBpbl9hZGRyCQlhZGRyOwkJLyogc2VydmVyIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcjsJCS8qIHBlZXIgcmVjb3JkIGZvciB0aGlzIHNlcnZlciAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSp2bHNlcnZlcjsJLyogY29ubmVjdGlvbiB0byB0aGUgdm9sdW1lIGxvY2F0aW9uIHNlcnZpY2UgKi8KLQotCS8qIGZpbGUgc2VydmljZSBhY2Nlc3MgKi8KLSNkZWZpbmUgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRSAyCi0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKmZzX2Nvbm5bQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRV07IC8qIEZTIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQJCWZzX2Nvbm5fY250W0FGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkVdOwkvKiBwZXIgY29ubiBjYWxsIGNvdW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlmc19jYWxscTsJLyogcXVldWUgb2YgcHJvY2Vzc2VzIHdhaXRpbmcgdG8gbWFrZSBhIGNhbGwgKi8KLQlzcGlubG9ja190CQlmc19sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLwotCWludAkJCWZzX3N0YXRlOyAgICAgIAkvKiAwIG9yIHJlYXNvbiBGUyBjdXJyZW50bHkgbWFya2VkIGRlYWQgKC1lcnJubykgKi8KLQl1bnNpZ25lZAkJZnNfcnR0OwkJLyogRlMgcm91bmQgdHJpcCB0aW1lICovCi0JdW5zaWduZWQgbG9uZwkJZnNfYWN0X2ppZjsJLyogdGltZSBhdCB3aGljaCBsYXN0IGFjdGl2aXR5IG9jY3VycmVkICovCi0JdW5zaWduZWQgbG9uZwkJZnNfZGVhZF9qaWY7CS8qIHRpbWUgYXQgd2hpY2ggbm8gbG9uZ2VyIHRvIGJlIGNvbnNpZGVyZWQgZGVhZCAqLwotCi0JLyogY2FsbGJhY2sgcHJvbWlzZSBtYW5hZ2VtZW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAljYl9wcm9taXNlczsJLyogYXMgeWV0IHVuYnJva2VuIHByb21pc2VzIGZyb20gdGhpcyBzZXJ2ZXIgKi8KLQlzcGlubG9ja190CQljYl9sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotCQkJICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpOwotCi0jZGVmaW5lIGFmc19nZXRfc2VydmVyKFMpIGRvIHsgYXRvbWljX2luYygmKFMpLT51c2FnZSk7IH0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgYWZzX3B1dF9zZXJ2ZXIoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcik7Ci1leHRlcm4gdm9pZCBhZnNfc2VydmVyX2RvX3RpbWVvdXQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcik7Ci0KLWV4dGVybiBpbnQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoY29uc3Qgc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkJICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubik7Ci0KLXN0YXRpYyBpbmxpbmUKLXN0cnVjdCBhZnNfc2VydmVyICphZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQotCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCXNlcnZlciA9IHBlZXItPnVzZXI7Ci0JaWYgKHNlcnZlcikKLQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JcmV0dXJuIHNlcnZlcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBzZXJ2ZXIgY2FsbHNsb3QgZ3JhbnQgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90Ci17Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBzZXJ2ZXIncyBsaXN0ICovCi0Jc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogcHJvY2VzcyB3YWl0aW5nIHRvIG1ha2UgY2FsbCAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiB0byB1c2UgKG9yIE5VTEwgb24gZXJyb3IpICovCi0Jc2hvcnQJCQluY29ubjsJCS8qIGNvbm5lY3Rpb24gc2xvdCBudW1iZXIgKC0xIG9uIGVycm9yKSAqLwotCWNoYXIJCQlyZWFkeTsJCS8qIFQgd2hlbiByZWFkeSAqLwotCWludAkJCWVycm5vOwkJLyogZXJyb3IgbnVtYmVyIGlmIG5jb25uPT0tMSAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KTsKLQotZXh0ZXJuIHZvaWQgYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IGViN2UzMjMuLmNlYmQwM2MgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0xLDUgKzEsNiBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBBRlMgc3VwZXJibG9jayBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCkBAIC05LDcgKzEwLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKICAqIEF1dGhvcnM6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+Ci0gKiAgICAgICAgICBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICogICAgICAgICAgRGF2aWQgV29vZGhvdXNlIDxkd213MkByZWRoYXQuY29tPgogICoKICAqLwogCkBAIC0xOSwyMiArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm5vZGUuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAiY21zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgQUZTX0ZTX01BR0lDIDB4NkI0MTQ2NTMgLyogJ2tBRlMnICovCiAKLXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zIHsKLQlpbnQJCQlyd3BhdGg7Ci0Jc3RydWN0IGFmc19jZWxsCQkqZGVmYXVsdF9jZWxsOwotCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7Ci19OwotCiBzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCkBAIC02MiwxMyArNTEsMTMgQEAKIAkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gYWZzX2Rlc3Ryb3lfaW5vZGUsCiAJLmNsZWFyX2lub2RlCT0gYWZzX2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBhZnNfdW1vdW50X2JlZ2luLAogCS5wdXRfc3VwZXIJPSBhZnNfcHV0X3N1cGVyLAogfTsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICphZnNfaW5vZGVfY2FjaGVwOwogc3RhdGljIGF0b21pY190IGFmc19jb3VudF9hY3RpdmVfaW5vZGVzOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW5pdGlhbGlzZSB0aGUgZmlsZXN5c3RlbQogICovCkBAIC03OCw4ICs2Nyw2IEBACiAKIAlfZW50ZXIoIiIpOwogCi0JYWZzX3RpbWVyX2luaXQoJmFmc19tbnRwdF9leHBpcnlfdGltZXIsICZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyX29wcyk7Ci0KIAkvKiBjcmVhdGUgb3Vyc2VsdmVzIGFuIGlub2RlIGNhY2hlICovCiAJYXRvbWljX3NldCgmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMsIDApOwogCkBAIC05OSwyMCArODYsMjIgQEAKIAlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZhZnNfZnNfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGFmc19pbm9kZV9jYWNoZXApOwotCQlrbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0Ja2xlYXZlKCIgPSAwIik7CisJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfZnNfaW5pdCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCB0aGUgZmlsZXN5c3RlbQogICovCiB2b2lkIF9fZXhpdCBhZnNfZnNfZXhpdCh2b2lkKQogeworCV9lbnRlcigiIik7CisKKwlhZnNfbW50cHRfa2lsbF90aW1lcigpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYWZzX2ZzX3R5cGUpOwogCiAJaWYgKGF0b21pY19yZWFkKCZhZnNfY291bnRfYWN0aXZlX2lub2RlcykgIT0gMCkgewpAQCAtMTIyLDEwICsxMTEsOSBAQAogCX0KIAogCWttZW1fY2FjaGVfZGVzdHJveShhZnNfaW5vZGVfY2FjaGVwKTsKKwlfbGVhdmUoIiIpOworfQogCi19IC8qIGVuZCBhZnNfZnNfZXhpdCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IGFuIGFyZ3VtZW50IGhhcyBhIHZhbHVlCiAgKi8KQEAgLTEzNiw5ICsxMjQsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7Ci19IC8qIGVuZCB3YW50X2FyZygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IHRoZXJlJ3Mgbm8gc3Vic2VxdWVudCB2YWx1ZQogICovCkBAIC0xNTAsMTggKzEzNywxNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7Ci19IC8qIGVuZCB3YW50X25vX3ZhbHVlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHBhcnNlIHRoZSBtb3VudCBvcHRpb25zCiAgKiAtIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc2hhbWVsZXNzbHkgYWRhcHRlZCBmcm9tIHRoZSBleHQzIGZzIHdoaWNoCiAgKiAgIHNoYW1lbGVzc2x5IGFkYXB0ZWQgaXQgZnJvbSB0aGUgbXNkb3MgZnMKICAqLwotc3RhdGljIGludCBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgIGNoYXIgKm9wdGlvbnMsCi0JCQkJICAgY29uc3QgY2hhciAqKmRldm5hbWUpCitzdGF0aWMgaW50IGFmc19wYXJzZV9vcHRpb25zKHN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIGNoYXIgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKipkZXZuYW1lKQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKIAljaGFyICprZXksICp2YWx1ZTsKIAlpbnQgcmV0OwogCkBAIC0xNzAsNTEgKzE1NiwxMzUgQEAKIAlvcHRpb25zW1BBR0VfU0laRSAtIDFdID0gMDsKIAogCXJldCA9IDA7Ci0Jd2hpbGUgKChrZXkgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IDApCi0JeworCXdoaWxlICgoa2V5ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSkgewogCQl2YWx1ZSA9IHN0cmNocihrZXksICc9Jyk7CiAJCWlmICh2YWx1ZSkKIAkJCSp2YWx1ZSsrID0gMDsKIAotCQlwcmludGsoImtBRlM6IEtFWTogJXMsIFZBTDolc1xuIiwga2V5LCB2YWx1ZSA/OiAiLSIpOworCQlfZGVidWcoImtBRlM6IEtFWTogJXMsIFZBTDolcyIsIGtleSwgdmFsdWUgPzogIi0iKTsKIAogCQlpZiAoc3RyY21wKGtleSwgInJ3cGF0aCIpID09IDApIHsKIAkJCWlmICghd2FudF9ub192YWx1ZSgmdmFsdWUsICJyd3BhdGgiKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXBhcmFtcy0+cndwYXRoID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChrZXksICJ2b2wiKSA9PSAwKSB7CisJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgInZvbCIpID09IDApIHsKIAkJCWlmICghd2FudF9hcmcoJnZhbHVlLCAidm9sIikpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkqZGV2bmFtZSA9IHZhbHVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGtleSwgImNlbGwiKSA9PSAwKSB7CisJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgImNlbGwiKSA9PSAwKSB7CiAJCQlpZiAoIXdhbnRfYXJnKCZ2YWx1ZSwgImNlbGwiKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWFmc19wdXRfY2VsbChwYXJhbXMtPmRlZmF1bHRfY2VsbCk7Ci0JCQlyZXQgPSBhZnNfY2VsbF9sb29rdXAodmFsdWUsCi0JCQkJCSAgICAgIHN0cmxlbih2YWx1ZSksCi0JCQkJCSAgICAgICZwYXJhbXMtPmRlZmF1bHRfY2VsbCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWNvbnRpbnVlOworCQkJY2VsbCA9IGFmc19jZWxsX2xvb2t1cCh2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQlpZiAoSVNfRVJSKGNlbGwpKQorCQkJCXJldHVybiBQVFJfRVJSKGNlbGwpOworCQkJYWZzX3B1dF9jZWxsKHBhcmFtcy0+Y2VsbCk7CisJCQlwYXJhbXMtPmNlbGwgPSBjZWxsOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJrQUZTOiBVbmtub3duIG1vdW50IG9wdGlvbjogJyVzJ1xuIiwgIGtleSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKIAkJfQotCi0JCXByaW50aygia0FGUzogVW5rbm93biBtb3VudCBvcHRpb246ICclcydcbiIsICBrZXkpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOwogCX0KIAogCXJldCA9IDA7Ci0KLSBlcnJvcjoKK2Vycm9yOgogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwYXJzZSBhIGRldmljZSBuYW1lIHRvIGdldCBjZWxsIG5hbWUsIHZvbHVtZSBuYW1lLCB2b2x1bWUgdHlwZSBhbmQgUi9XCisgKiBzZWxlY3RvcgorICogLSB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCSIlW2NlbGw6XXZvbHVtZVsuXSIJCVIvVyB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZVsuXSIJCVIvTyBvciBSL1cgdm9sdW1lIChyd3BhdGg9MCksCisgKgkJCQkJIG9yIFIvVyAocndwYXRoPTEpIHZvbHVtZQorICoJIiVbY2VsbDpddm9sdW1lLnJlYWRvbmx5IglSL08gdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWUucmVhZG9ubHkiCVIvTyB2b2x1bWUKKyAqCSIlW2NlbGw6XXZvbHVtZS5iYWNrdXAiCQlCYWNrdXAgdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWUuYmFja3VwIgkJQmFja3VwIHZvbHVtZQorICovCitzdGF0aWMgaW50IGFmc19wYXJzZV9kZXZpY2VfbmFtZShzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zLAorCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwljb25zdCBjaGFyICpjZWxsbmFtZSwgKnN1ZmZpeDsKKwlpbnQgY2VsbG5hbWVzejsKKworCV9lbnRlcigiLCVzIiwgbmFtZSk7CisKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBubyB2b2x1bWUgbmFtZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKG5hbWVbMF0gIT0gJyUnICYmIG5hbWVbMF0gIT0gJyMnKSB8fCAhbmFtZVsxXSkgeworCQlwcmludGsoS0VSTl9FUlIgImtBRlM6IHVucGFyc2FibGUgdm9sdW1lIG5hbWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBkZXRlcm1pbmUgdGhlIHR5cGUgb2Ygdm9sdW1lIHdlJ3JlIGxvb2tpbmcgZm9yICovCisJcGFyYW1zLT50eXBlID0gQUZTVkxfUk9WT0w7CisJcGFyYW1zLT5mb3JjZSA9IGZhbHNlOworCWlmIChwYXJhbXMtPnJ3cGF0aCB8fCBuYW1lWzBdID09ICclJykgeworCQlwYXJhbXMtPnR5cGUgPSBBRlNWTF9SV1ZPTDsKKwkJcGFyYW1zLT5mb3JjZSA9IHRydWU7CisJfQorCW5hbWUrKzsKKworCS8qIHNwbGl0IHRoZSBjZWxsIG5hbWUgb3V0IGlmIHRoZXJlIGlzIG9uZSAqLworCXBhcmFtcy0+dm9sbmFtZSA9IHN0cmNocihuYW1lLCAnOicpOworCWlmIChwYXJhbXMtPnZvbG5hbWUpIHsKKwkJY2VsbG5hbWUgPSBuYW1lOworCQljZWxsbmFtZXN6ID0gcGFyYW1zLT52b2xuYW1lIC0gbmFtZTsKKwkJcGFyYW1zLT52b2xuYW1lKys7CisJfSBlbHNlIHsKKwkJcGFyYW1zLT52b2xuYW1lID0gbmFtZTsKKwkJY2VsbG5hbWUgPSBOVUxMOworCQljZWxsbmFtZXN6ID0gMDsKKwl9CisKKwkvKiB0aGUgdm9sdW1lIHR5cGUgaXMgZnVydGhlciBhZmZlY3RlZCBieSBhIHBvc3NpYmxlIHN1ZmZpeCAqLworCXN1ZmZpeCA9IHN0cnJjaHIocGFyYW1zLT52b2xuYW1lLCAnLicpOworCWlmIChzdWZmaXgpIHsKKwkJaWYgKHN0cmNtcChzdWZmaXgsICIucmVhZG9ubHkiKSA9PSAwKSB7CisJCQlwYXJhbXMtPnR5cGUgPSBBRlNWTF9ST1ZPTDsKKwkJCXBhcmFtcy0+Zm9yY2UgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcChzdWZmaXgsICIuYmFja3VwIikgPT0gMCkgeworCQkJcGFyYW1zLT50eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwkJCXBhcmFtcy0+Zm9yY2UgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAwKSB7CisJCX0gZWxzZSB7CisJCQlzdWZmaXggPSBOVUxMOworCQl9CisJfQorCisJcGFyYW1zLT52b2xuYW1lc3ogPSBzdWZmaXggPworCQlzdWZmaXggLSBwYXJhbXMtPnZvbG5hbWUgOiBzdHJsZW4ocGFyYW1zLT52b2xuYW1lKTsKKworCV9kZWJ1ZygiY2VsbCAlKi4qcyBbJXBdIiwKKwkgICAgICAgY2VsbG5hbWVzeiwgY2VsbG5hbWVzeiwgY2VsbG5hbWUgPzogIiIsIHBhcmFtcy0+Y2VsbCk7CisKKwkvKiBsb29rdXAgdGhlIGNlbGwgcmVjb3JkICovCisJaWYgKGNlbGxuYW1lIHx8ICFwYXJhbXMtPmNlbGwpIHsKKwkJY2VsbCA9IGFmc19jZWxsX2xvb2t1cChjZWxsbmFtZSwgY2VsbG5hbWVzeik7CisJCWlmIChJU19FUlIoY2VsbCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAia0FGUzogdW5hYmxlIHRvIGxvb2t1cCBjZWxsICclcydcbiIsCisJCQkgICAgICAgY2VsbG5hbWUgPzogIiIpOworCQkJcmV0dXJuIFBUUl9FUlIoY2VsbCk7CisJCX0KKwkJYWZzX3B1dF9jZWxsKHBhcmFtcy0+Y2VsbCk7CisJCXBhcmFtcy0+Y2VsbCA9IGNlbGw7CisJfQorCisJX2RlYnVnKCJDRUxMOiVzIFslcF0gVk9MVU1FOiUqLipzIFNVRkZJWDolcyBUWVBFOiVkJXMiLAorCSAgICAgICBwYXJhbXMtPmNlbGwtPm5hbWUsIHBhcmFtcy0+Y2VsbCwKKwkgICAgICAgcGFyYW1zLT52b2xuYW1lc3osIHBhcmFtcy0+dm9sbmFtZXN6LCBwYXJhbXMtPnZvbG5hbWUsCisJICAgICAgIHN1ZmZpeCA/OiAiLSIsIHBhcmFtcy0+dHlwZSwgcGFyYW1zLT5mb3JjZSA/ICIgRk9SQ0UiIDogIiIpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBjaGVjayBhIHN1cGVyYmxvY2sgdG8gc2VlIGlmIGl0J3MgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvcgogICovCkBAIC0yMjQsMTMgKzI5NCwxMiBAQAogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOwogCiAJcmV0dXJuIGFzLT52b2x1bWUgPT0gcGFyYW1zLT52b2x1bWU7Ci19IC8qIGVuZCBhZnNfdGVzdF9zdXBlcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBmaWxsIGluIHRoZSBzdXBlcmJsb2NrCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3N0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKIAlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gTlVMTDsKQEAgLTIzOSw3ICszMDgsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWludCByZXQ7CiAKLQlrZW50ZXIoIiIpOworCV9lbnRlcigiIik7CiAKIAkvKiBhbGxvY2F0ZSBhIHN1cGVyYmxvY2sgaW5mbyByZWNvcmQgKi8KIAlhcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMjYyLDkgKzMzMSw5IEBACiAJZmlkLnZpZAkJPSBhcy0+dm9sdW1lLT52aWQ7CiAJZmlkLnZub2RlCT0gMTsKIAlmaWQudW5pcXVlCT0gMTsKLQlyZXQgPSBhZnNfaWdldChzYiwgJmZpZCwgJmlub2RlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKKwlpbm9kZSA9IGFmc19pZ2V0KHNiLCBwYXJhbXMtPmtleSwgJmZpZCwgTlVMTCwgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gZXJyb3JfaW5vZGU7CiAKIAlyZXQgPSAtRU5PTUVNOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwpAQCAtMjczLDIxICszNDIsMjMgQEAKIAogCXNiLT5zX3Jvb3QgPSByb290OwogCi0Ja2xlYXZlKCIgPSAwIik7CisJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcjoKK2Vycm9yX2lub2RlOgorCXJldCA9IFBUUl9FUlIoaW5vZGUpOworCWlub2RlID0gTlVMTDsKK2Vycm9yOgogCWlwdXQoaW5vZGUpOwogCWFmc19wdXRfdm9sdW1lKGFzLT52b2x1bWUpOwogCWtmcmVlKGFzKTsKIAogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCi0Ja2xlYXZlKCIgPSAlZCIsIHJldCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19maWxsX3N1cGVyKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGdldCBhbiBBRlMgc3VwZXJibG9jawogICogLSBUT0RPOiBkb24ndCB1c2UgZ2V0X3NiX25vZGV2KCksIGJ1dCByYXRoZXIgY2FsbCBzZ2V0KCkgZGlyZWN0bHkKQEAgLTMwMCw2OSArMzcxLDgwIEBACiB7CiAJc3RydWN0IGFmc19tb3VudF9wYXJhbXMgcGFyYW1zOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3Qga2V5ICprZXk7CiAJaW50IHJldDsKIAogCV9lbnRlcigiLCwlcywlcCIsIGRldl9uYW1lLCBvcHRpb25zKTsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CiAKLQkvKiBzdGFydCB0aGUgY2FjaGUgbWFuYWdlciAqLwotCXJldCA9IGFmc2NtX3N0YXJ0KCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogcGFyc2UgdGhlIG9wdGlvbnMgKi8KKwkvKiBwYXJzZSB0aGUgb3B0aW9ucyBhbmQgZGV2aWNlIG5hbWUgKi8KIAlpZiAob3B0aW9ucykgewotCQlyZXQgPSBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucygmcGFyYW1zLCBvcHRpb25zLCAmZGV2X25hbWUpOworCQlyZXQgPSBhZnNfcGFyc2Vfb3B0aW9ucygmcGFyYW1zLCBvcHRpb25zLCAmZGV2X25hbWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyb3I7Ci0JCWlmICghZGV2X25hbWUpIHsKLQkJCXByaW50aygia0FGUzogbm8gdm9sdW1lIG5hbWUgc3BlY2lmaWVkXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycm9yOwotCQl9CiAJfQogCi0JLyogcGFyc2UgdGhlIGRldmljZSBuYW1lICovCi0JcmV0ID0gYWZzX3ZvbHVtZV9sb29rdXAoZGV2X25hbWUsCi0JCQkJcGFyYW1zLmRlZmF1bHRfY2VsbCwKLQkJCQlwYXJhbXMucndwYXRoLAotCQkJCSZwYXJhbXMudm9sdW1lKTsKKworCXJldCA9IGFmc19wYXJzZV9kZXZpY2VfbmFtZSgmcGFyYW1zLCBkZXZfbmFtZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQkvKiBhbGxvY2F0ZSBhIGRldmljZWxlc3Mgc3VwZXJibG9jayAqLwotCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZwYXJhbXMpOwotCWlmIChJU19FUlIoc2IpKQotCQlnb3RvIGVycm9yOwotCi0Jc2ItPnNfZmxhZ3MgPSBmbGFnczsKLQotCXJldCA9IGFmc19maWxsX3N1cGVyKHNiLCAmcGFyYW1zLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAocmV0IDwgMCkgewotCQl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKLQkJZGVhY3RpdmF0ZV9zdXBlcihzYik7CisJLyogdHJ5IGFuZCBkbyB0aGUgbW91bnQgc2VjdXJlbHkgKi8KKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkocGFyYW1zLmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlfbGVhdmUoIiA9ICVsZCBba2V5XSIsIFBUUl9FUlIoa2V5KSk7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjsKIAl9Ci0Jc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOworCXBhcmFtcy5rZXkgPSBrZXk7CiAKKwkvKiBwYXJzZSB0aGUgZGV2aWNlIG5hbWUgKi8KKwl2b2wgPSBhZnNfdm9sdW1lX2xvb2t1cCgmcGFyYW1zKTsKKwlpZiAoSVNfRVJSKHZvbCkpIHsKKwkJcmV0ID0gUFRSX0VSUih2b2wpOworCQlnb3RvIGVycm9yOworCX0KKwlwYXJhbXMudm9sdW1lID0gdm9sOworCisJLyogYWxsb2NhdGUgYSBkZXZpY2VsZXNzIHN1cGVyYmxvY2sgKi8KKwlzYiA9IHNnZXQoZnNfdHlwZSwgYWZzX3Rlc3Rfc3VwZXIsIHNldF9hbm9uX3N1cGVyLCAmcGFyYW1zKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJLyogaW5pdGlhbCBzdXBlcmJsb2NrL3Jvb3QgY3JlYXRpb24gKi8KKwkJX2RlYnVnKCJjcmVhdGUiKTsKKwkJc2ItPnNfZmxhZ3MgPSBmbGFnczsKKwkJcmV0ID0gYWZzX2ZpbGxfc3VwZXIoc2IsICZwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCX0gZWxzZSB7CisJCV9kZWJ1ZygicmV1c2UiKTsKKwkJQVNTRVJUQ01QKHNiLT5zX2ZsYWdzLCAmLCBNU19BQ1RJVkUpOworCX0KKworCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCWFmc19wdXRfdm9sdW1lKHBhcmFtcy52b2x1bWUpOwotCWFmc19wdXRfY2VsbChwYXJhbXMuZGVmYXVsdF9jZWxsKTsKLQlfbGVhdmUoIiA9IDAgWyVwXSIsIDAsIHNiKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmNlbGwpOworCV9sZWF2ZSgiID0gMCBbJXBdIiwgc2IpOwogCXJldHVybiAwOwogCi0gZXJyb3I6CitlcnJvcjoKIAlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKLQlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7Ci0JYWZzY21fc3RvcCgpOworCWFmc19wdXRfY2VsbChwYXJhbXMuY2VsbCk7CisJa2V5X3B1dChwYXJhbXMua2V5KTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2dldF9zYigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBmaW5pc2ggdGhlIHVubW91bnRpbmcgcHJvY2VzcyBvbiB0aGUgc3VwZXJibG9jawogICovCkBAIC0zNzMsMzUgKzQ1NSwzMCBAQAogCV9lbnRlcigiIik7CiAKIAlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKLQlhZnNjbV9zdG9wKCk7CiAKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX3B1dF9zdXBlcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbml0aWFsaXNlIGFuIGlub2RlIGNhY2hlIHNsYWIgZWxlbWVudCBwcmlvciB0byBhbnkgdXNlCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpfdm5vZGUsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopIF92bm9kZTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IF92bm9kZTsKIAogCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQogCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKIAkJbWVtc2V0KHZub2RlLCAwLCBzaXplb2YoKnZub2RlKSk7CiAJCWlub2RlX2luaXRfb25jZSgmdm5vZGUtPnZmc19pbm9kZSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZub2RlLT51cGRhdGVfd2FpdHEpOworCQltdXRleF9pbml0KCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwkJbXV0ZXhfaW5pdCgmdm5vZGUtPnZhbGlkYXRlX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmdm5vZGUtPmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPmNiX2xpbmspOwotCQlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPmNiX2hhc2hfbGluayk7Ci0JCWFmc190aW1lcl9pbml0KCZ2bm9kZS0+Y2JfdGltZW91dCwKLQkJCSAgICAgICAmYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHMpOworCQlJTklUX1dPUksoJnZub2RlLT5jYl9icm9rZW5fd29yaywgYWZzX2Jyb2tlbl9jYWxsYmFja193b3JrKTsKIAl9Cit9CiAKLX0gLyogZW5kIGFmc19pX2luaXRfb25jZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBhbGxvY2F0ZSBhbiBBRlMgaW5vZGUgc3RydWN0IGZyb20gb3VyIHNsYWIgY2FjaGUKICAqLwpAQCAtNDA5LDggKzQ4Niw3IEBACiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CiAKLQl2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopCi0JCWttZW1fY2FjaGVfYWxsb2MoYWZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJdm5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGFmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghdm5vZGUpCiAJCXJldHVybiBOVUxMOwogCkBAIC00MjEsMjEgKzQ5NywyNSBAQAogCiAJdm5vZGUtPnZvbHVtZQkJPSBOVUxMOwogCXZub2RlLT51cGRhdGVfY250CT0gMDsKLQl2bm9kZS0+ZmxhZ3MJCT0gMDsKKwl2bm9kZS0+ZmxhZ3MJCT0gMSA8PCBBRlNfVk5PREVfVU5TRVQ7CisJdm5vZGUtPmNiX3Byb21pc2VkCT0gZmFsc2U7CiAKIAlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Ci19IC8qIGVuZCBhZnNfYWxsb2NfaW5vZGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGVzdHJveSBhbiBBRlMgaW5vZGUgc3RydWN0CiAgKi8KIHN0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisKIAlfZW50ZXIoInslbHV9IiwgaW5vZGUtPmlfaW5vKTsKIAotCWttZW1fY2FjaGVfZnJlZShhZnNfaW5vZGVfY2FjaGVwLCBBRlNfRlNfSShpbm9kZSkpOworCV9kZWJ1ZygiREVTVFJPWSBJTk9ERSAlcCIsIGlub2RlKTsKIAorCUFTU0VSVENNUCh2bm9kZS0+c2VydmVyLCA9PSwgTlVMTCk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYWZzX2lub2RlX2NhY2hlcCwgdm5vZGUpOwogCWF0b21pY19kZWMoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKTsKLQotfSAvKiBlbmQgYWZzX2Rlc3Ryb3lfaW5vZGUoKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZThjYy4uMDAwMDAwMAotLS0gYS9mcy9hZnMvc3VwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHN1cGVyLmg6IEFGUyBmaWxlc3lzdGVtIGludGVybmFsIHByaXZhdGUgZGF0YQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBBdXRob3JzOiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgotICogICAgICAgICAgRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1NVUEVSX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19TVVBFUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgInNlcnZlci5oIgotCi0jaWZkZWYgX19LRVJORUxfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHN1cGVyYmxvY2sgcHJpdmF0ZSBkYXRhCi0gKiAtIHRoZXJlJ3Mgb25lIHN1cGVyYmxvY2sgcGVyIHZvbHVtZQotICovCi1zdHJ1Y3QgYWZzX3N1cGVyX2luZm8KLXsKLQlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCi0JY2hhcgkJCXJ3cGFyZW50OwkvKiBUIGlmIHBhcmVudCBpcyBSL1cgQUZTIHZvbHVtZSAqLwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKkFGU19GU19TKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JcmV0dXJuIHNiLT5zX2ZzX2luZm87Ci19Ci0KLWV4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3RyYW5zcG9ydC5oIGIvZnMvYWZzL3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDEzYWU2Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIHRyYW5zcG9ydC5oOiBBRlMgdHJhbnNwb3J0IG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0KLS8qIHRoZSBjYWNoZSBtYW5hZ2VyIHRyYW5zcG9ydCBlbmRwb2ludCAqLwotZXh0ZXJuIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKmFmc190cmFuc3BvcnQ7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdHlwZXMuaCBiL2ZzL2Fmcy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWEyMzY3Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIHR5cGVzLmg6IEFGUyB0eXBlcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9BRlNfVFlQRVNfSAotI2RlZmluZSBfTElOVVhfQUZTX1RZUEVTX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192b2xpZF90OwotdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192bm9kZWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwkJYWZzX2RhdGF2ZXJzaW9uX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQUZTVkxfUldWT0wsCQkJLyogcmVhZC93cml0ZSB2b2x1bWUgKi8KLQlBRlNWTF9ST1ZPTCwJCQkvKiByZWFkLW9ubHkgdm9sdW1lICovCi0JQUZTVkxfQkFDS1ZPTCwJCQkvKiBiYWNrdXAgdm9sdW1lICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192b2x0eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQUZTX0ZUWVBFX0lOVkFMSUQJPSAwLAotCUFGU19GVFlQRV9GSUxFCQk9IDEsCi0JQUZTX0ZUWVBFX0RJUgkJPSAyLAotCUFGU19GVFlQRV9TWU1MSU5LCT0gMywKLX0gYWZzX2ZpbGVfdHlwZV90OwotCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdHJ1Y3QgYWZzX2NlbGw7Ci1zdHJ1Y3QgYWZzX3Zub2RlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIGZpbGUgaWRlbnRpZmllcgotICovCi1zdHJ1Y3QgYWZzX2ZpZAotewotCWFmc192b2xpZF90CXZpZDsJCS8qIHZvbHVtZSBJRCAqLwotCWFmc192bm9kZWlkX3QJdm5vZGU7CQkvKiBmaWxlIGluZGV4IHdpdGhpbiB2b2x1bWUgKi8KLQl1bnNpZ25lZAl1bmlxdWU7CQkvKiB1bmlxdWUgSUQgbnVtYmVyIChmaWxlIGluZGV4IHZlcnNpb24pICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIGNhbGxiYWNrIG5vdGlmaWNhdGlvbgotICovCi10eXBlZGVmIGVudW0gewotCUFGU0NNX0NCX1VOVFlQRUQJPSAwLAkvKiBubyB0eXBlIHNldCBvbiBDQiBicmVhayAqLwotCUFGU0NNX0NCX0VYQ0xVU0lWRQk9IDEsCS8qIENCIGV4Y2x1c2l2ZSB0byBDTSBbbm90IGltcGxlbWVudGVkXSAqLwotCUFGU0NNX0NCX1NIQVJFRAkJPSAyLAkvKiBDQiBzaGFyZWQgYnkgb3RoZXIgQ00ncyAqLwotCUFGU0NNX0NCX0RST1BQRUQJPSAzLAkvKiBDQiBwcm9taXNlIGNhbmNlbGxlZCBieSBmaWxlIHNlcnZlciAqLwotfSBhZnNfY2FsbGJhY2tfdHlwZV90OwotCi1zdHJ1Y3QgYWZzX2NhbGxiYWNrCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIJKnNlcnZlcjsJLyogc2VydmVyIHRoYXQgbWFkZSB0aGUgcHJvbWlzZSAqLwotCXN0cnVjdCBhZnNfZmlkCQlmaWQ7CQkvKiBmaWxlIGlkZW50aWZpZXIgKi8KLQl1bnNpZ25lZAkJdmVyc2lvbjsJLyogY2FsbGJhY2sgdmVyc2lvbiAqLwotCXVuc2lnbmVkCQlleHBpcnk7CQkvKiB0aW1lIGF0IHdoaWNoIGV4cGlyZXMgKi8KLQlhZnNfY2FsbGJhY2tfdHlwZV90CXR5cGU7CQkvKiB0eXBlIG9mIGNhbGxiYWNrICovCi19OwotCi0jZGVmaW5lIEFGU0NCTUFYIDUwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgdm9sdW1lIGluZm9ybWF0aW9uCi0gKi8KLXN0cnVjdCBhZnNfdm9sdW1lX2luZm8KLXsKLQlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCi0JYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2YgdGhpcyB2b2x1bWUgKi8KLQlhZnNfdm9saWRfdAkJdHlwZV92aWRzWzVdOwkvKiB2b2x1bWUgSUQncyBmb3IgcG9zc2libGUgdHlwZXMgZm9yIHRoaXMgdm9sICovCi0JCi0JLyogbGlzdCBvZiBmaWxlc2VydmVycyBzZXJ2aW5nIHRoaXMgdm9sdW1lICovCi0Jc2l6ZV90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIHVzZWQgaW4gc2VydmVyc1tdICovCi0Jc3RydWN0IHsKLQkJc3RydWN0IGluX2FkZHIJYWRkcjsJCS8qIGZpbGVzZXJ2ZXIgYWRkcmVzcyAqLwotCX0gc2VydmVyc1s4XTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgZmlsZSBzdGF0dXMgaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGFmc19maWxlX3N0YXR1cwotewotCXVuc2lnbmVkCQlpZl92ZXJzaW9uOwkvKiBpbnRlcmZhY2UgdmVyc2lvbiAqLwotI2RlZmluZSBBRlNfRlNUQVRVU19WRVJTSU9OCTEKLQotCWFmc19maWxlX3R5cGVfdAkJdHlwZTsJCS8qIGZpbGUgdHlwZSAqLwotCXVuc2lnbmVkCQlubGluazsJCS8qIGxpbmsgY291bnQgKi8KLQlzaXplX3QJCQlzaXplOwkJLyogZmlsZSBzaXplICovCi0JYWZzX2RhdGF2ZXJzaW9uX3QJdmVyc2lvbjsJLyogY3VycmVudCBkYXRhIHZlcnNpb24gKi8KLQl1bnNpZ25lZAkJYXV0aG9yOwkJLyogYXV0aG9yIElEICovCi0JdW5zaWduZWQJCW93bmVyOwkJLyogb3duZXIgSUQgKi8KLQl1bnNpZ25lZAkJY2FsbGVyX2FjY2VzczsJLyogYWNjZXNzIHJpZ2h0cyBmb3IgYXV0aGVudGljYXRlZCBjYWxsZXIgKi8KLQl1bnNpZ25lZAkJYW5vbl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIHVuYXV0aGVudGljYXRlZCBjYWxsZXIgKi8KLQl1bW9kZV90CQkJbW9kZTsJCS8qIFVOSVggbW9kZSAqLwotCXN0cnVjdCBhZnNfZmlkCQlwYXJlbnQ7CQkvKiBwYXJlbnQgZmlsZSBJRCAqLwotCXRpbWVfdAkJCW10aW1lX2NsaWVudDsJLyogbGFzdCB0aW1lIGNsaWVudCBjaGFuZ2VkIGRhdGEgKi8KLQl0aW1lX3QJCQltdGltZV9zZXJ2ZXI7CS8qIGxhc3QgdGltZSBzZXJ2ZXIgY2hhbmdlZCBkYXRhICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHZvbHVtZSBzeW5jaHJvbmlzYXRpb24gaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGFmc192b2xzeW5jCi17Ci0JdGltZV90CQkJY3JlYXRpb247CS8qIHZvbHVtZSBjcmVhdGlvbiB0aW1lICovCi19OwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19UWVBFU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdXNlLXJ0bmV0bGluay5jIGIvZnMvYWZzL3VzZS1ydG5ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmYwZGFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3VzZS1ydG5ldGxpbmsuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyogUlRORVRMSU5LIGNsaWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RydWN0IGFmc19ydG1fZGVzYyB7CisJc3RydWN0IHNvY2tldAkJKm5sc29jazsKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZQkqYnVmczsKKwl1OAkJCSptYWM7CisJc2l6ZV90CQkJbmJ1ZnM7CisJc2l6ZV90CQkJbWF4YnVmczsKKwl2b2lkCQkJKmRhdGE7CisJc3NpemVfdAkJCWRhdGFsZW47CisJc2l6ZV90CQkJZGF0YW1heDsKKwlpbnQJCQltc2dfc2VxOworCXVuc2lnbmVkCQltYWNfaW5kZXg7CisJYm9vbAkJCXdhbnRsb29wYmFjazsKKwlpbnQgKCpwYXJzZSkoc3RydWN0IGFmc19ydG1fZGVzYyAqLCBzdHJ1Y3Qgbmxtc2doZHIgKik7Cit9OworCisvKgorICogcGFyc2UgYW4gUlRNX0dFVEFERFIgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGFkZHJfcGFyc2Uoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYywKKwkJCQkgc3RydWN0IG5sbXNnaGRyICpubGhkcikKK3sKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZSAqdGhpczsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZmE7CisJc3RydWN0IHJ0YXR0ciAqcnRhdHRyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IGxlbjsKKworCWlmYSA9IChzdHJ1Y3QgaWZhZGRybXNnICopIE5MTVNHX0RBVEEobmxoZHIpOworCisJX2VudGVyKCJ7aXg9JWQsYWY9JWR9IiwgaWZhLT5pZmFfaW5kZXgsIGlmYS0+aWZhX2ZhbWlseSk7CisKKwlpZiAoaWZhLT5pZmFfZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJX2xlYXZlKCIgPSAwIFtmYW1pbHkgJWRdIiwgaWZhLT5pZmFfZmFtaWx5KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkZXNjLT5uYnVmcyA+PSBkZXNjLT5tYXhidWZzKSB7CisJCV9sZWF2ZSgiID0gMCBbbWF4ICV6dS8lenVdIiwgZGVzYy0+bmJ1ZnMsIGRlc2MtPm1heGJ1ZnMpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aGlzID0gJmRlc2MtPmJ1ZnNbZGVzYy0+bmJ1ZnNdOworCisJdGhpcy0+aW5kZXggPSBpZmEtPmlmYV9pbmRleDsKKwl0aGlzLT5uZXRtYXNrLnNfYWRkciA9IGluZXRfbWFrZV9tYXNrKGlmYS0+aWZhX3ByZWZpeGxlbik7CisJdGhpcy0+bXR1ID0gMDsKKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKTsKKwlsZW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgbGVuKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCBsZW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGQV9BRERSRVNTOgorCQkJbWVtY3B5KCZ0aGlzLT5hZGRyZXNzLCBSVEFfREFUQShydGF0dHIpLCA0KTsKKwkJCWJyZWFrOworCQljYXNlIElGQV9MQUJFTDoKKwkJCW5hbWUgPSBSVEFfREFUQShydGF0dHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlfZGVidWcoIiVzOiAiTklQUVVBRF9GTVQiLyJOSVBRVUFEX0ZNVCwKKwkgICAgICAgbmFtZSwgTklQUVVBRCh0aGlzLT5hZGRyZXNzKSwgTklQUVVBRCh0aGlzLT5uZXRtYXNrKSk7CisKKwlkZXNjLT5uYnVmcysrOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogcGFyc2UgYW4gUlRNX0dFVExJTksgcmVzcG9uc2UgZm9yIE1UVXMKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmtfaWZfcGFyc2Uoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYywKKwkJCQkgICAgc3RydWN0IG5sbXNnaGRyICpubGhkcikKK3sKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZSAqdGhpczsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmk7CisJc3RydWN0IHJ0YXR0ciAqcnRhdHRyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IGxlbiwgbG9vcDsKKworCWlmaSA9IChzdHJ1Y3QgaWZpbmZvbXNnICopIE5MTVNHX0RBVEEobmxoZHIpOworCisJX2VudGVyKCJ7aXg9JWR9IiwgaWZpLT5pZmlfaW5kZXgpOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IGRlc2MtPm5idWZzOyBsb29wKyspIHsKKwkJdGhpcyA9ICZkZXNjLT5idWZzW2xvb3BdOworCQlpZiAodGhpcy0+aW5kZXggPT0gaWZpLT5pZmlfaW5kZXgpCisJCQlnb3RvIGZvdW5kOworCX0KKworCV9sZWF2ZSgiID0gMCBbbm8gbWF0Y2hdIik7CisJcmV0dXJuIDA7CisKK2ZvdW5kOgorCWlmIChpZmktPmlmaV90eXBlID09IEFSUEhSRF9MT09QQkFDSyAmJiAhZGVzYy0+d2FudGxvb3BiYWNrKSB7CisJCV9sZWF2ZSgiID0gMCBbbG9vcGJhY2tdIik7CisJCXJldHVybiAwOworCX0KKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlsZW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgbGVuKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCBsZW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGTEFfTVRVOgorCQkJbWVtY3B5KCZ0aGlzLT5tdHUsIFJUQV9EQVRBKHJ0YXR0ciksIDQpOworCQkJYnJlYWs7CisJCWNhc2UgSUZMQV9JRk5BTUU6CisJCQluYW1lID0gUlRBX0RBVEEocnRhdHRyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJX2RlYnVnKCIlczogIk5JUFFVQURfRk1UIi8iTklQUVVBRF9GTVQiIG10dSAldSIsCisJICAgICAgIG5hbWUsIE5JUFFVQUQodGhpcy0+YWRkcmVzcyksIE5JUFFVQUQodGhpcy0+bmV0bWFzayksCisJICAgICAgIHRoaXMtPm10dSk7CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhcnNlIGFuIFJUTV9HRVRMSU5LIHJlc3BvbnNlIGZvciB0aGUgTUFDIGFkZHJlc3MgYmVsb25naW5nIHRvIHRoZSBsb3dlc3QKKyAqIG5vbi1pbnRlcm5hbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmtfbWFjX3BhcnNlKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MsCisJCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saGRyKQoreworCXN0cnVjdCBpZmluZm9tc2cgKmlmaTsKKwlzdHJ1Y3QgcnRhdHRyICpydGF0dHI7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3QgcmVtYWluLCBsZW47CisJYm9vbCBzZXQ7CisKKwlpZmkgPSAoc3RydWN0IGlmaW5mb21zZyAqKSBOTE1TR19EQVRBKG5saGRyKTsKKworCV9lbnRlcigie2l4PSVkfSIsIGlmaS0+aWZpX2luZGV4KTsKKworCWlmIChpZmktPmlmaV9pbmRleCA+PSBkZXNjLT5tYWNfaW5kZXgpIHsKKwkJX2xlYXZlKCIgPSAwIFtoaWdoXSIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlmaS0+aWZpX3R5cGUgPT0gQVJQSFJEX0xPT1BCQUNLKSB7CisJCV9sZWF2ZSgiID0gMCBbbG9vcGJhY2tdIik7CisJCXJldHVybiAwOworCX0KKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZW1haW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlzZXQgPSBmYWxzZTsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgcmVtYWluKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCByZW1haW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGTEFfQUREUkVTUzoKKwkJCWxlbiA9IFJUQV9QQVlMT0FEKHJ0YXR0cik7CisJCQltZW1jcHkoZGVzYy0+bWFjLCBSVEFfREFUQShydGF0dHIpLAorCQkJICAgICAgIG1pbl90KHNpemVfdCwgbGVuLCA2KSk7CisJCQlkZXNjLT5tYWNfaW5kZXggPSBpZmktPmlmaV9pbmRleDsKKwkJCXNldCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJRkxBX0lGTkFNRToKKwkJCW5hbWUgPSBSVEFfREFUQShydGF0dHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2V0KQorCQlfZGVidWcoIiVzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICAgICBuYW1lLAorCQkgICAgICAgZGVzYy0+bWFjWzBdLCBkZXNjLT5tYWNbMV0sIGRlc2MtPm1hY1syXSwKKwkJICAgICAgIGRlc2MtPm1hY1szXSwgZGVzYy0+bWFjWzRdLCBkZXNjLT5tYWNbNV0pOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkIHRoZSBydG5ldGxpbmsgcmVzcG9uc2UgYW5kIHBhc3MgdG8gcGFyc2luZyByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgYWZzX3JlYWRfcnRtKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGhkciwgdG1waGRyOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwl2b2lkICpkYXRhOworCWJvb2wgbGFzdCA9IGZhbHNlOworCWludCBsZW4sIHJldCwgcmVtYWluOworCisJX2VudGVyKCIiKTsKKworCWRvIHsKKwkJLyogZmlyc3Qgb2YgYWxsIHBlZWsgdG8gc2VlIGhvdyBiaWcgdGhlIHBhY2tldCBpcyAqLworCQltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCQlpb3ZbMF0uaW92X2Jhc2UgPSAmdG1waGRyOworCQlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZih0bXBoZHIpOworCQlsZW4gPSBrZXJuZWxfcmVjdm1zZyhkZXNjLT5ubHNvY2ssICZtc2csIGlvdiwgMSwKKwkJCQkgICAgIHNpemVvZih0bXBoZHIpLCBNU0dfUEVFSyB8IE1TR19UUlVOQyk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlfbGVhdmUoIiA9ICVkIFtwZWVrXSIsIGxlbik7CisJCQlyZXR1cm4gbGVuOworCQl9CisJCWlmIChsZW4gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGVuIDwgc2l6ZW9mKHRtcGhkcikgfHwgbGVuIDwgTkxNU0dfUEFZTE9BRCgmdG1waGRyLCAwKSkgeworCQkJX2xlYXZlKCIgPSAtRU1TR1NJWkUiKTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKworCQlpZiAoZGVzYy0+ZGF0YW1heCA8IGxlbikgeworCQkJa2ZyZWUoZGVzYy0+ZGF0YSk7CisJCQlkZXNjLT5kYXRhID0gTlVMTDsKKwkJCWRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRhdGEpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlkZXNjLT5kYXRhID0gZGF0YTsKKwkJfQorCQlkZXNjLT5kYXRhbWF4ID0gbGVuOworCisJCS8qIHJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhpcyBwYWNrZXQgKi8KKwkJaW92WzBdLmlvdl9iYXNlID0gZGVzYy0+ZGF0YTsKKwkJaW92WzBdLmlvdl9sZW4gPSBkZXNjLT5kYXRhbWF4OworCQlkZXNjLT5kYXRhbGVuID0ga2VybmVsX3JlY3Ztc2coZGVzYy0+bmxzb2NrLCAmbXNnLCBpb3YsIDEsCisJCQkJCSAgICAgICBkZXNjLT5kYXRhbWF4LCAwKTsKKwkJaWYgKGRlc2MtPmRhdGFsZW4gPCAwKSB7CisJCQlfbGVhdmUoIiA9ICVsZCBbcmVjdl0iLCBkZXNjLT5kYXRhbGVuKTsKKwkJCXJldHVybiBkZXNjLT5kYXRhbGVuOworCQl9CisKKwkJbmxoZHIgPSBkZXNjLT5kYXRhOworCisJCS8qIGNoZWNrIGlmIHRoZSBoZWFkZXIgaXMgdmFsaWQgKi8KKwkJaWYgKCFOTE1TR19PSyhubGhkciwgZGVzYy0+ZGF0YWxlbikgfHwKKwkJICAgIG5saGRyLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQlfbGVhdmUoIiA9IC1FSU8iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSAqLworCQlpZiAobmxoZHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSB8fAorCQkgICAgIShubGhkci0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9NVUxUSSkpCisJCQlsYXN0ID0gdHJ1ZTsKKworCQkvKiBwYXJzZSB0aGUgYml0cyB3ZSBnb3QgdGhpcyB0aW1lICovCisJCW5sbXNnX2Zvcl9lYWNoX21zZyhubGhkciwgZGVzYy0+ZGF0YSwgZGVzYy0+ZGF0YWxlbiwgcmVtYWluKSB7CisJCQlyZXQgPSBkZXNjLT5wYXJzZShkZXNjLCBubGhkcik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCV9sZWF2ZSgiID0gJWQgW3BhcnNlXSIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCisJfSB3aGlsZSAoIWxhc3QpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaXN0IHRoZSBpbnRlcmZhY2UgYm91bmQgYWRkcmVzc2VzIHRvIGdldCB0aGUgYWRkcmVzcyBhbmQgbmV0bWFzaworICovCitzdGF0aWMgaW50IGFmc19ydG1fZ2V0YWRkcihzdHJ1Y3QgYWZzX3J0bV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlpbnQgcmV0OworCisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5sX21zZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKE5MTVNHX0FMSUdOVE8pKSk7CisJCXN0cnVjdCBpZmFkZHJtc2cgYWRkcl9tc2cgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChOTE1TR19BTElHTlRPKSkpOworCX0gcmVxdWVzdDsKKworCV9lbnRlcigiIik7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKTsKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ190eXBlID0gUlRNX0dFVEFERFI7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfRFVNUDsKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ19zZXEgPSBkZXNjLT5tc2dfc2VxKys7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfcGlkID0gMDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJaW92WzBdLmlvdl9iYXNlID0gJnJlcXVlc3Q7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocmVxdWVzdCk7CisKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhkZXNjLT5ubHNvY2ssICZtc2csIGlvdiwgMSwgaW92WzBdLmlvdl9sZW4pOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBsaXN0IHRoZSBpbnRlcmZhY2UgbGluayBzdGF0dXNlcyB0byBnZXQgdGhlIE1UVXMKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmsoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubF9tc2cgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChOTE1TR19BTElHTlRPKSkpOworCQlzdHJ1Y3QgaWZpbmZvbXNnIGxpbmtfbXNnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoTkxNU0dfQUxJR05UTykpKTsKKwl9IHJlcXVlc3Q7CisKKwlfZW50ZXIoIiIpOworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCisJcmVxdWVzdC5ubF9tc2cubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCXJlcXVlc3QubmxfbXNnLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX1JPT1Q7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfc2VxID0gZGVzYy0+bXNnX3NlcSsrOworCXJlcXVlc3QubmxfbXNnLm5sbXNnX3BpZCA9IDA7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCWlvdlswXS5pb3ZfYmFzZSA9ICZyZXF1ZXN0OworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHJlcXVlc3QpOworCisJcmV0ID0ga2VybmVsX3NlbmRtc2coZGVzYy0+bmxzb2NrLCAmbXNnLCBpb3YsIDEsIGlvdlswXS5pb3ZfbGVuKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3VsbCBhbnkgaW50ZXJmYWNlIHJlY29yZHMgZm9yIHdoaWNoIHRoZXJlIGlzbid0IGFuIE1UVSB2YWx1ZQorICovCitzdGF0aWMgdm9pZCBhZnNfY3VsbF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGFmc19pbnRlcmZhY2UgKmJ1ZnMgPSBkZXNjLT5idWZzOworCXNpemVfdCBuYnVmcyA9IGRlc2MtPm5idWZzOworCWludCBsb29wLCBwb2ludCA9IDA7CisKKwlfZW50ZXIoInslenV9IiwgbmJ1ZnMpOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IG5idWZzOyBsb29wKyspIHsKKwkJaWYgKGRlc2MtPmJ1ZnNbbG9vcF0ubXR1ICE9IDApIHsKKwkJCWlmIChsb29wICE9IHBvaW50KSB7CisJCQkJQVNTRVJUQ01QKGxvb3AsID4sIHBvaW50KTsKKwkJCQlidWZzW3BvaW50XSA9IGJ1ZnNbbG9vcF07CisJCQl9CisJCQlwb2ludCsrOworCQl9CisJfQorCisJZGVzYy0+bmJ1ZnMgPSBwb2ludDsKKwlfbGVhdmUoIiBbJXp1LyV6dV0iLCBkZXNjLT5uYnVmcywgbmJ1ZnMpOworfQorCisvKgorICogZ2V0IGEgbGlzdCBvZiB0aGlzIHN5c3RlbSdzIGludGVyZmFjZSBJUHY0IGFkZHJlc3NlcywgbmV0bWFza3MgYW5kIE1UVXMKKyAqIC0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGludGVyZmFjZSByZWNvcmRzIGluIHRoZSBidWZmZXIKKyAqLworaW50IGFmc19nZXRfaXB2NF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfaW50ZXJmYWNlICpidWZzLCBzaXplX3QgbWF4YnVmcywKKwkJCSAgICBib29sIHdhbnRsb29wYmFjaykKK3sKKwlzdHJ1Y3QgYWZzX3J0bV9kZXNjIGRlc2M7CisJaW50IHJldCwgbG9vcDsKKworCV9lbnRlcigiIik7CisKKwltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJZGVzYy5idWZzID0gYnVmczsKKwlkZXNjLm1heGJ1ZnMgPSBtYXhidWZzOworCWRlc2Mud2FudGxvb3BiYWNrID0gd2FudGxvb3BiYWNrOworCisJcmV0ID0gc29ja19jcmVhdGVfa2VybihBRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCBORVRMSU5LX1JPVVRFLAorCQkJICAgICAgICZkZXNjLm5sc29jayk7CisJaWYgKHJldCA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCBbc29ja10iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGlzc3VlIFJUTV9HRVRBRERSICovCisJZGVzYy5wYXJzZSA9IGFmc19ydG1fZ2V0YWRkcl9wYXJzZTsKKwlyZXQgPSBhZnNfcnRtX2dldGFkZHIoJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmc19yZWFkX3J0bSgmZGVzYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpc3N1ZSBSVE1fR0VUTElOSyAqLworCWRlc2MucGFyc2UgPSBhZnNfcnRtX2dldGxpbmtfaWZfcGFyc2U7CisJcmV0ID0gYWZzX3J0bV9nZXRsaW5rKCZkZXNjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBhZnNfcmVhZF9ydG0oJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJYWZzX2N1bGxfaW50ZXJmYWNlcygmZGVzYyk7CisJcmV0ID0gZGVzYy5uYnVmczsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCByZXQ7IGxvb3ArKykKKwkJX2RlYnVnKCJbJWRdICJOSVBRVUFEX0ZNVCIvIk5JUFFVQURfRk1UIiBtdHUgJXUiLAorCQkgICAgICAgYnVmc1tsb29wXS5pbmRleCwKKwkJICAgICAgIE5JUFFVQUQoYnVmc1tsb29wXS5hZGRyZXNzKSwKKwkJICAgICAgIE5JUFFVQUQoYnVmc1tsb29wXS5uZXRtYXNrKSwKKwkJICAgICAgIGJ1ZnNbbG9vcF0ubXR1KTsKKworZXJyb3I6CisJa2ZyZWUoZGVzYy5kYXRhKTsKKwlzb2NrX3JlbGVhc2UoZGVzYy5ubHNvY2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBnZXQgYSBNQUMgYWRkcmVzcyBmcm9tIGEgcmFuZG9tIGV0aGVybmV0IGludGVyZmFjZSB0aGF0IGhhcyBhIHJlYWwgb25lCisgKiAtIHRoZSBidWZmZXIgc2hvdWxkIGJlIDYgYnl0ZXMgaW4gc2l6ZQorICovCitpbnQgYWZzX2dldF9NQUNfYWRkcmVzcyh1OCBtYWNbNl0pCit7CisJc3RydWN0IGFmc19ydG1fZGVzYyBkZXNjOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWRlc2MubWFjID0gbWFjOworCWRlc2MubWFjX2luZGV4ID0gVUlOVF9NQVg7CisKKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKEFGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfUk9VVEUsCisJCQkgICAgICAgJmRlc2Mubmxzb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtzb2NrXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaXNzdWUgUlRNX0dFVExJTksgKi8KKwlkZXNjLnBhcnNlID0gYWZzX3J0bV9nZXRsaW5rX21hY19wYXJzZTsKKwlyZXQgPSBhZnNfcnRtX2dldGxpbmsoJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmc19yZWFkX3J0bSgmZGVzYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoZGVzYy5tYWNfaW5kZXggPCBVSU5UX01BWCkgeworCQkvKiBnb3QgYSBNQUMgYWRkcmVzcyAqLworCQlfZGVidWcoIlslZF0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkgICAgICAgZGVzYy5tYWNfaW5kZXgsCisJCSAgICAgICBtYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PTkVUOworCX0KKworZXJyb3I6CisJc29ja19yZWxlYXNlKGRlc2Mubmxzb2NrKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmMgYi9mcy9hZnMvdmxjbGllbnQuYwppbmRleCA3YjBlMzE5Li4zNmMxMzA2IDEwMDY0NAotLS0gYS9mcy9hZnMvdmxjbGllbnQuYworKysgYi9mcy9hZnMvdmxjbGllbnQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIHZsY2xpZW50LmM6IEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKKy8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMTEsNjg1ICsxMSwyMDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJ2bGNsaWVudC5oIgotI2luY2x1ZGUgImthZnNhc3luY2QuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJlcnJvcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFZMR0VURU5UUllCWUlECQk1MDMJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBJRCBvcGVyYXRpb24gSUQgKi8KLSNkZWZpbmUgVkxHRVRFTlRSWUJZTkFNRQk1MDQJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBOYW1lIG9wZXJhdGlvbiBJRCAqLwotI2RlZmluZSBWTFBST0JFCQkJNTE0CS8qIEFGUyBQcm9iZSBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBvcGVyYXRpb24gSUQgKi8KLQotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIG1hcCBhZnMgVkwgYWJvcnQgY29kZXMgdG8vZnJvbSBMaW51eCBlcnJvciBjb2RlcwotICogLSBjYWxsZWQgd2l0aCBjYWxsLT5sb2NrIGhlbGQKKyAqIG1hcCB2b2x1bWUgbG9jYXRvciBhYm9ydCBjb2RlcyB0byBlcnJvciBjb2RlcwogICovCi1zdGF0aWMgdm9pZCBhZnNfcnh2bF9hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3N0YXRpYyBpbnQgYWZzX3ZsX2Fib3J0X3RvX2Vycm9yKHUzMiBhYm9ydF9jb2RlKQogewotCWludCBlcnI7CisJX2VudGVyKCIldSIsIGFib3J0X2NvZGUpOwogCi0JX2VudGVyKCJ7JXUsJXUsJWR9IiwKLQkgICAgICAgY2FsbC0+YXBwX2Vycl9zdGF0ZSwgY2FsbC0+YXBwX2Fib3J0X2NvZGUsIGNhbGwtPmFwcF9lcnJubyk7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKLQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOwotCQlyZXR1cm47Ci0KLQljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgotCQlzd2l0Y2ggKGNhbGwtPmFwcF9hYm9ydF9jb2RlKSB7Ci0JCWNhc2UgQUZTVkxfSURFWElTVDoJCWVyciA9IC1FRVhJU1Q7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9JTzoJCQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKLQkJY2FzZSBBRlNWTF9OQU1FRVhJU1Q6CQllcnIgPSAtRUVYSVNUOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQ1JFQVRFRkFJTDoJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOwotCQljYXNlIEFGU1ZMX05PRU5UOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfRU1QVFk6CQllcnIgPSAtRU5PTUVESVVNOwlicmVhazsKLQkJY2FzZSBBRlNWTF9FTlRERUxFVEVEOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFETkFNRToJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURJTkRFWDoJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURWT0xUWVBFOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX0JBRFNFUlZFUjoJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURQQVJUSVRJT046CWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9SRVBTRlVMTDoJCWVyciA9IC1FRkJJRzsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX05PUkVQU0VSVkVSOgkJZXJyID0gLUVOT0VOVDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX0RVUFJFUFNFUlZFUjoJZXJyID0gLUVFWElTVDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX1JXTk9URk9VTkQ6CQllcnIgPSAtRU5PRU5UOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFEUkVGQ09VTlQ6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfU0laRUVYQ0VFREVEOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFERU5UUlk6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFEVk9MSURCVU1QOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfSURBTFJFQURZSEFTSEVEOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfRU5UUllMT0NLRUQ6CQllcnIgPSAtRUJVU1k7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURWT0xPUEVSOgkJZXJyID0gLUVCQURSUUM7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURSRUxMT0NLVFlQRToJZXJyID0gLUVJTlZBTDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX1JFUkVMRUFTRToJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOwotCQljYXNlIEFGU1ZMX0JBRFNFUlZFUkZMQUc6CWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9QRVJNOgkJZXJyID0gLUVBQ0NFUzsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX05PTUVNOgkJZXJyID0gLUVSRU1PVEVJTzsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSBhZnNfYWJvcnRfdG9fZXJyb3IoY2FsbC0+YXBwX2Fib3J0X2NvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FsbC0+YXBwX2Vycm5vID0gZXJyOwotCQlyZXR1cm47Ci0KKwlzd2l0Y2ggKGFib3J0X2NvZGUpIHsKKwljYXNlIEFGU1ZMX0lERVhJU1Q6CQlyZXR1cm4gLUVFWElTVDsKKwljYXNlIEFGU1ZMX0lPOgkJCXJldHVybiAtRVJFTU9URUlPOworCWNhc2UgQUZTVkxfTkFNRUVYSVNUOgkJcmV0dXJuIC1FRVhJU1Q7CisJY2FzZSBBRlNWTF9DUkVBVEVGQUlMOgkJcmV0dXJuIC1FUkVNT1RFSU87CisJY2FzZSBBRlNWTF9OT0VOVDoJCXJldHVybiAtRU5PTUVESVVNOworCWNhc2UgQUZTVkxfRU1QVFk6CQlyZXR1cm4gLUVOT01FRElVTTsKKwljYXNlIEFGU1ZMX0VOVERFTEVURUQ6CQlyZXR1cm4gLUVOT01FRElVTTsKKwljYXNlIEFGU1ZMX0JBRE5BTUU6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRElOREVYOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9CQURWT0xUWVBFOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9CQURTRVJWRVI6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRFBBUlRJVElPTjoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9SRVBTRlVMTDoJCXJldHVybiAtRUZCSUc7CisJY2FzZSBBRlNWTF9OT1JFUFNFUlZFUjoJCXJldHVybiAtRU5PRU5UOworCWNhc2UgQUZTVkxfRFVQUkVQU0VSVkVSOglyZXR1cm4gLUVFWElTVDsKKwljYXNlIEFGU1ZMX1JXTk9URk9VTkQ6CQlyZXR1cm4gLUVOT0VOVDsKKwljYXNlIEFGU1ZMX0JBRFJFRkNPVU5UOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9TSVpFRVhDRUVERUQ6CXJldHVybiAtRUlOVkFMOworCWNhc2UgQUZTVkxfQkFERU5UUlk6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRFZPTElEQlVNUDoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9JREFMUkVBRFlIQVNIRUQ6CXJldHVybiAtRUlOVkFMOworCWNhc2UgQUZTVkxfRU5UUllMT0NLRUQ6CQlyZXR1cm4gLUVCVVNZOworCWNhc2UgQUZTVkxfQkFEVk9MT1BFUjoJCXJldHVybiAtRUJBRFJRQzsKKwljYXNlIEFGU1ZMX0JBRFJFTExPQ0tUWVBFOglyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX1JFUkVMRUFTRToJCXJldHVybiAtRVJFTU9URUlPOworCWNhc2UgQUZTVkxfQkFEU0VSVkVSRkxBRzoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9QRVJNOgkJcmV0dXJuIC1FQUNDRVM7CisJY2FzZSBBRlNWTF9OT01FTToJCXJldHVybiAtRVJFTU9URUlPOwogCWRlZmF1bHQ6Ci0JCXJldHVybjsKKwkJcmV0dXJuIGFmc19hYm9ydF90b19lcnJvcihhYm9ydF9jb2RlKTsKIAl9Ci19IC8qIGVuZCBhZnNfcnh2bF9hZW1hcCgpICovCit9CiAKLSNpZiAwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogcHJvYmUgYSB2b2x1bWUgbG9jYXRpb24gc2VydmVyIHRvIHNlZSBpZiBpdCBpcyBzdGlsbCBhbGl2ZSAtLSB1bnVzZWQKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhIFZMLkdldEVudHJ5QnlYWFggY2FsbAogICovCi1zdGF0aWMgaW50IGFmc19yeHZsX3Byb2JlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsIGludCBhbGxvY19mbGFncykKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JX19iZTMyIHBhcmFtWzFdOwotCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBWTFBST0JFOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGFyYW1bMF0gPSBodG9ubChWTFBST0JFKTsKLQlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOwotCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKLQotCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLwotCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwKLQkJCQkgICAgYWxsb2NfZmxhZ3MsIDAsICZzZW50KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBhYm9ydDsKLQotCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLwotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAotCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQkJc2NoZWR1bGUoKTsKLQl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCXJldCA9IC1FSU5UUjsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWdvdG8gYWJvcnQ7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJZ290byBvdXRfdW53YWl0OwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLSBvdXQ6Ci0JcmV0dXJuIHJldDsKLQotfSAvKiBlbmQgYWZzX3J4dmxfcHJvYmUoKSAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUKLSAqLwotaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9uYW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKLQkJCSAgICAgICB1bnNpZ25lZCB2b2xuYW1lc3osCi0JCQkgICAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzNdOwotCXVuc2lnbmVkIHRtcDsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0LCBsb29wOwotCV9fYmUzMiAqYnAsIHBhcmFtWzJdLCB6ZXJvOwotCi0JX2VudGVyKCIsJSouKnMsJXUsIiwgdm9sbmFtZXN6LCB2b2xuYW1lc3osIHZvbG5hbWUsIHZvbG5hbWVzeik7Ci0KLQltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKLQotCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBWTEdFVEVOVFJZQllOQU1FOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGlvdlsxXS5pb3ZfbGVuID0gdm9sbmFtZXN6OwotCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSB2b2xuYW1lOwotCi0JemVybyA9IDA7Ci0JcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKLQlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87Ci0KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWU5BTUUpOwotCXBhcmFtWzFdID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKLQotCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7Ci0JcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMzg0KTsKLQotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAzODQsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJCWdvdG8gb3V0X3Vud2FpdDsKLQkJfQotCQlnb3RvIGFib3J0OwotCX0KLQotCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDY0OyBsb29wKyspCi0JCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIGZpbmFsIE5VTCAqLwotCi0JYnArKzsgLyogdHlwZSAqLwotCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKLQotCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOwotCi0JYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLwotCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgewotCQl0bXAgPSBudG9obCgqYnArKyk7Ci0JCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKLQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJaWYgKHRtcCAmIEFGU19WTFNGX1JPVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOwotCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKLQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9CQUs7Ci0JfQotCi0JZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKLQllbnRyeS0+dmlkWzFdID0gbnRvaGwoKmJwKyspOwotCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7Ci0KLQlicCsrOyAvKiBjbG9uZSBJRCAqLwotCi0JdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLwotCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKLQlpZiAodG1wICYgQUZTX1ZMRl9ST0VYSVNUUykKLQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87Ci0JaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKLQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fQkFLOwotCi0JcmV0ID0gLUVOT01FRElVTTsKLQlpZiAoIWVudHJ5LT52aWRtYXNrKQotCQlnb3RvIGFib3J0OwotCi0JLyogc3VjY2VzcyAqLwotCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JcmV0ID0gMDsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLSBvdXQ6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQlnb3RvIG91dF91bndhaXQ7Ci19IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElECi0gKi8KLWludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgYWZzX3ZvbGlkX3Qgdm9saWQsCi0JCQkgICAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKLQkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXVuc2lnbmVkIHRtcDsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0LCBsb29wOwotCV9fYmUzMiAqYnAsIHBhcmFtWzNdOwotCi0JX2VudGVyKCIsJXgsJWQsIiwgdm9saWQsIHZvbHR5cGUpOwotCi0JbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7Ci0KLQkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzZXJ2ZXIsICZjb25uKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCi0JcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4dmxfYWVtYXAsICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOwotCX0KLQljYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7Ci0KLQkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KLQlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCi0JLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKLQlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKLQlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAzODQpOwotCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDM4NCwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgewotCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQkJZ290byBvdXRfdW53YWl0OwotCQl9Ci0JCWdvdG8gYWJvcnQ7Ci0JfQotCi0JLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKLQkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogZmluYWwgTlVMICovCi0KLQlicCsrOyAvKiB0eXBlICovCi0JZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOwotCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7Ci0KLQlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCi0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7Ci0JCXRtcCA9IG50b2hsKCpicCsrKTsKLQkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JXOwotCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCi0JCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87Ci0JCWlmICh0bXAgJiBBRlNfVkxTRl9CQUNLVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKLQl9Ci0KLQllbnRyeS0+dmlkWzBdID0gbnRvaGwoKmJwKyspOwotCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7Ci0JZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKLQotCWJwKys7IC8qIGNsb25lIElEICovCi0KLQl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCi0JaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCi0JCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JXOwotCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKLQlpZiAodG1wICYgQUZTX1ZMRl9CQUNLRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7Ci0KLQlyZXQgPSAtRU5PTUVESVVNOwotCWlmICghZW50cnktPnZpZG1hc2spCi0JCWdvdG8gYWJvcnQ7Ci0KLSNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLwotCWVudHJ5LT5uc2VydmVycyA9IDM7Ci0JZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7Ci0JZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7Ci0JZW50cnktPnNlcnZlcnNbMl0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI1YiAvKjB4YWMxMDEyNWIqLyk7Ci0KLQllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKLQllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKLQllbnRyeS0+c3J2dG1hc2tbMl0gPSBBRlNfVk9MX1ZUTV9STyB8IEFGU19WT0xfVlRNX1JXOwotI2VuZGlmCi0KLQkvKiBzdWNjZXNzICovCi0JZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlyZXQgPSAwOwotCi0gb3V0X3Vud2FpdDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOwotIG91dDoKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKLX0gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEIGFzeW5jaHJvbm91c2x5Ci0gKi8KLWludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCi0JCQkJICAgYWZzX3ZvbGlkX3Qgdm9saWQsCi0JCQkJICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlKQotewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBrdmVjIHBpb3ZbMV07Ci0Jc2l6ZV90IHNlbnQ7Ci0JaW50IHJldDsKLQlfX2JlMzIgcGFyYW1bM107Ci0KLQlfZW50ZXIoIiwleCwlZCwiLCB2b2xpZCwgdm9sdHlwZSk7Ci0KLQkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihvcC0+c2VydmVyLCAmY29ubik7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sCi0JCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4sCi0JCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yLAotCQkJCWFmc19yeHZsX2FlbWFwLAotCQkJCSZvcC0+Y2FsbCk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW9wLT5jYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7Ci0Jb3AtPmNhbGwtPmFwcF91c2VyID0gb3A7Ci0KLQljYWxsID0gb3AtPmNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkvKiBzZW5kIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCB0byBrYWZzYXN5bmNkICovCi0JYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aob3ApOwotCi0JLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKLQlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKLQlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBhbGxvY2F0ZSByZXN1bHQgcmVhZCBidWZmZXIgaW4gc2NyYXRjaCBzcGFjZSAqLwotCWNhbGwtPmFwcF9zY3JfcHRyID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKG9wLT5jYWxsLCAzODQpOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsgLyogaGFuZGxlIGZyb20ga2Fmc2FzeW5jZCAqLwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBjYWxsLT5hcHBfc2NyX3B0ciwgMzg0LCAwKTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoKLQljYXNlIC1FQUdBSU46Ci0JY2FzZSAtRUNPTk5BQk9SVEVEOgotCQlyZXQgPSAwOwotCQlicmVhazsJLyogYWxsIGhhbmRsZWQgYnkga2Fmc2FzeW5jZCAqLwotCi0JZGVmYXVsdDoKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOyAvKiBtYWtlIGthZnNhc3luY2QgaGFuZGxlIGl0ICovCi0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotIG91dDoKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYXR0ZW5kIHRvIHRoZSBhc3luY2hyb25vdXMgZ2V0IFZMREIgZW50cnkgYnkgSUQKLSAqLwotaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCi0JCQkJICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSkKLXsKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnk7CiAJX19iZTMyICpicDsKLQlfX3UzMiB0bXA7Ci0JaW50IGxvb3AsIHJldDsKKwl1MzIgdG1wOworCWludCBsb29wOwogCi0JX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCV9lbnRlcigiLCwldSIsIGxhc3QpOwogCi0JbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKIAotCWlmIChvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0NPTVBMRVRFKSB7Ci0JCS8qIG9wZXJhdGlvbiBmaW5pc2hlZCAqLwotCQlhZnNfa2Fmc2FzeW5jZF90ZXJtaW5hdGVfb3Aob3ApOworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOwogCi0JCWJwID0gb3AtPmNhbGwtPmFwcF9zY3JfcHRyOworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJZW50cnkgPSBjYWxsLT5yZXBseTsKKwlicCA9IGNhbGwtPmJ1ZmZlcjsKIAotCQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKLQkJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCQlicCsrOyAvKiBmaW5hbCBOVUwgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJZW50cnktPm5hbWVbbG9vcF0gPSAwOworCWJwKys7IC8qIGZpbmFsIE5VTCAqLwogCi0JCWJwKys7IC8qIHR5cGUgKi8KLQkJZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIHR5cGUgKi8KKwllbnRyeS0+bnNlcnZlcnMgPSBudG9obCgqYnArKyk7CiAKLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOwogCi0JCWJwICs9IDg7IC8qIHBhcnRpdGlvbiBJRHMgKi8KKwlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCiAKLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgewotCQkJdG1wID0gbnRvaGwoKmJwKyspOwotCQkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQotCQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJCWlmICh0bXAgJiBBRlNfVkxTRl9ST1ZPTCkKLQkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87Ci0JCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKLQkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fQkFLOwotCQl9Ci0KLQkJZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPnZpZFsxXSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKLQotCQlicCsrOyAvKiBjbG9uZSBJRCAqLwotCi0JCXRtcCA9IG50b2hsKCpicCsrKTsgLyogZmxhZ3MgKi8KLQkJaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCi0JCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJaWYgKHRtcCAmIEFGU19WTEZfUk9FWElTVFMpCi0JCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKLQkJaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKLQkJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX0JBSzsKLQotCQlyZXQgPSAtRU5PTUVESVVNOwotCQlpZiAoIWVudHJ5LT52aWRtYXNrKSB7Ci0JCQlyeHJwY19jYWxsX2Fib3J0KG9wLT5jYWxsLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLSNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLwotCQllbnRyeS0+bnNlcnZlcnMgPSAzOwotCQllbnRyeS0+c2VydmVyc1swXS5zX2FkZHIgPSBodG9ubCgweGFjMTAxMjQ5KTsKLQkJZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7Ci0JCWVudHJ5LT5zZXJ2ZXJzWzJdLnNfYWRkciA9IGh0b25sKDB4YWMxMDEyNWIgLyoweGFjMTAxMjViKi8pOwotCi0JCWVudHJ5LT5zcnZ0bWFza1swXSA9IEFGU19WT0xfVlRNX1JPOwotCQllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKLQkJZW50cnktPnNydnRtYXNrWzJdID0gQUZTX1ZPTF9WVE1fUk8gfCBBRlNfVk9MX1ZUTV9SVzsKLSNlbmRpZgotCi0JCS8qIHN1Y2Nlc3MgKi8KLQkJZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKLQkJcmV0ID0gMDsKLQkJZ290byBkb25lOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJdG1wID0gbnRvaGwoKmJwKyspOworCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gPSAwOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfUldWT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUlc7CisJCWlmICh0bXAgJiBBRlNfVkxTRl9ST1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9STzsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX0JBQ0tWT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fQkFLOwogCX0KIAotCWlmIChvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7Ci0JCS8qIG9wZXJhdGlvbiBlcnJvciAqLwotCQlyZXQgPSBvcC0+Y2FsbC0+YXBwX2Vycm5vOwotCQlnb3RvIGRvbmU7Ci0JfQorCWVudHJ5LT52aWRbMF0gPSBudG9obCgqYnArKyk7CisJZW50cnktPnZpZFsxXSA9IG50b2hsKCpicCsrKTsKKwllbnRyeS0+dmlkWzJdID0gbnRvaGwoKmJwKyspOwogCi0JX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JcmV0dXJuIC1FQUdBSU47CisJYnArKzsgLyogY2xvbmUgSUQgKi8KIAotIGRvbmU6Ci0JcnhycGNfcHV0X2NhbGwob3AtPmNhbGwpOwotCW9wLT5jYWxsID0gTlVMTDsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2FzeW5jMigpICovCisJdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLworCWVudHJ5LT52aWRtYXNrID0gMDsKKwlpZiAodG1wICYgQUZTX1ZMRl9SV0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUlc7CisJaWYgKHRtcCAmIEFGU19WTEZfUk9FWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JPOworCWlmICh0bXAgJiBBRlNfVkxGX0JBQ0tFWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX0JBSzsKKwlpZiAoIWVudHJ5LT52aWRtYXNrKQorCQlyZXR1cm4gLUVCQURNU0c7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKIC8qCi0gKiBoYW5kbGUgYXR0ZW50aW9uIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKLSAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKiBWTC5HZXRFbnRyeUJ5TmFtZSBvcGVyYXRpb24gdHlwZQogICovCi1zdGF0aWMgdm9pZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXR0bihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCA9IGNhbGwtPmFwcF91c2VyOworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWFZMR2V0RW50cnlCeU5hbWUgPSB7CisJLm5hbWUJCT0gIlZMLkdldEVudHJ5QnlOYW1lIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX3ZsX2dldF9lbnRyeV9ieV94eHgsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX3ZsX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKIAotCV9lbnRlcigie29wPSVwIGNzdD0ldX0iLCBvcCwgY2FsbC0+YXBwX2NhbGxfc3RhdGUpOwotCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgotCQlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOwotCQlicmVhazsKLQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKLQkJaWYgKGNhbGwtPmFwcF9hc3luY19yZWFkKQotCQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6Ci0JCWlmIChjYWxsLT5hcHBfcmVhZF9jb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0JCXByaW50aygia0FGUzogUmVwbHkgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQiCi0JCSAgICAgICAiIHtjc3Q9JXUgYXN5bj0lZCBtYXJrPSVadSByZHk9JVp1IHByPSV1JXN9IiwKLQkJICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLAotCQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsCi0JCSAgICAgICBjYWxsLT5hcHBfbWFyaywKLQkJICAgICAgIGNhbGwtPmFwcF9yZWFkeV9xdHksCi0JCSAgICAgICBjYWxsLT5wa3RfcmN2X2NvdW50LAotCQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0IiA6ICIiKTsKLQotCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogaGFuZGxlIGVycm9yIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKLSAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKiBWTC5HZXRFbnRyeUJ5SWQgb3BlcmF0aW9uIHR5cGUKICAqLwotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWFZMR2V0RW50cnlCeUlkID0geworCS5uYW1lCQk9ICJWTC5HZXRFbnRyeUJ5SWQiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eCwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfdmxfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogZGlzcGF0Y2ggYSBnZXQgdm9sdW1lIGVudHJ5IGJ5IG5hbWUgb3BlcmF0aW9uCisgKi8KK2ludCBhZnNfdmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJCSAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQogewotCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wID0gY2FsbC0+YXBwX3VzZXI7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCB2b2xuYW1lc3osIHJlcXN6LCBwYWRzejsKKwlfX2JlMzIgKmJwOwogCi0JX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7CisJX2VudGVyKCIiKTsKIAotCWFmc19rYWZzYXN5bmNkX2F0dGVuZF9vcChvcCk7CisJdm9sbmFtZXN6ID0gc3RybGVuKHZvbG5hbWUpOworCXBhZHN6ID0gKDQgLSAodm9sbmFtZXN6ICYgMykpICYgMzsKKwlyZXFzeiA9IDggKyB2b2xuYW1lc3ogKyBwYWRzejsKIAotCV9sZWF2ZSgiIik7CisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWFZMR2V0RW50cnlCeU5hbWUsIHJlcXN6LCAzODQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLX0gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9lcnJvcigpICovCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gZW50cnk7CisJY2FsbC0+c2VydmljZV9pZCA9IFZMX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19WTF9QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoVkxHRVRFTlRSWUJZTkFNRSk7CisJKmJwKysgPSBodG9ubCh2b2xuYW1lc3opOworCW1lbWNweShicCwgdm9sbmFtZSwgdm9sbmFtZXN6KTsKKwlpZiAocGFkc3ogPiAwKQorCQltZW1zZXQoKHZvaWQgKikgYnAgKyB2b2xuYW1lc3osIDAsIHBhZHN6KTsKKworCS8qIGluaXRpYXRlIHRoZSBjYWxsICovCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoYWRkciwgY2FsbCwgR0ZQX0tFUk5FTCwgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGRpc3BhdGNoIGEgZ2V0IHZvbHVtZSBlbnRyeSBieSBJRCBvcGVyYXRpb24KKyAqLworaW50IGFmc192bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkgICBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCSAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWFZMR2V0RW50cnlCeUlkLCAxMiwgMzg0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gZW50cnk7CisJY2FsbC0+c2VydmljZV9pZCA9IFZMX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19WTF9QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoVkxHRVRFTlRSWUJZSUQpOworCSpicCsrID0gaHRvbmwodm9saWQpOworCSpicCAgID0gaHRvbmwodm9sdHlwZSk7CisKKwkvKiBpbml0aWF0ZSB0aGUgY2FsbCAqLworCXJldHVybiBhZnNfbWFrZV9jYWxsKGFkZHIsIGNhbGwsIEdGUF9LRVJORUwsIHdhaXRfbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvdmxvY2F0aW9uLmMgYi9mcy9hZnMvdmxvY2F0aW9uLmMKaW5kZXggNzgyZWU3Yy4uNzRjY2UxNyAxMDA2NDQKLS0tIGEvZnMvYWZzL3Zsb2NhdGlvbi5jCisrKyBiL2ZzL2Fmcy92bG9jYXRpb24uYwpAQCAtMSw2ICsxLDYgQEAKLS8qIHZsb2NhdGlvbi5jOiB2b2x1bWUgbG9jYXRpb24gbWFuYWdlbWVudAorLyogQUZTIHZvbHVtZSBsb2NhdGlvbiBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTIsMTMxICsxMiw2MSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgImNtc2VydmljZS5oIgotI2luY2x1ZGUgImZzY2xpZW50LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBBRlNfVkxEQl9USU1FT1VUIEhaKjEwMDAKK3Vuc2lnbmVkIGFmc192bG9jYXRpb25fdGltZW91dCA9IDEwOwkvKiB2b2x1bWUgbG9jYXRpb24gdGltZW91dCBpbiBzZWNvbmRzICovCit1bnNpZ25lZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lb3V0ID0gMTAgKiA2MDsKIAotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOwotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOwotc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fcmVhcGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKLXN0YXRpYyB2b2lkIF9fYWZzX3Zsb2NhdGlvbl90aW1lb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQotewotCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdGltZW91dCk7CitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fdXBkYXRlcyk7CitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fZ3JhdmV5YXJkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfdmxvY2F0aW9uX2dyYXZleWFyZF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfdmxvY2F0aW9uX3JlYXAsIGFmc192bG9jYXRpb25fcmVhcGVyKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfdmxvY2F0aW9uX3VwZGF0ZSwgYWZzX3Zsb2NhdGlvbl91cGRhdGVyKTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyOwogCi0JX2RlYnVnKCJWTCBUSU1FT1VUIFslc3t1PSVkfV0iLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSwgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpKTsKLQotCWFmc192bG9jYXRpb25fZG9fdGltZW91dCh2bG9jYXRpb24pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zsb2NhdGlvbl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fYWZzX3Zsb2NhdGlvbl90aW1lb3V0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVyX29wcyA9IHsKLQkudGltZWRfb3V0CT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgYWZzX3Zsb2NhdGlvbl91cGRhdGVfb3Bfb3BzID0gewotCS5hdHRlbmQJCT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kLAotCS5kaXNjYXJkCT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfZGlzY2FyZCwKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOwkvKiBxdWV1ZSBvZiBWTHMgYXdhaXRpbmcgdXBkYXRlICovCi1zdGF0aWMgc3RydWN0IGFmc192bG9jYXRpb24gKmFmc192bG9jYXRpb25fdXBkYXRlOwkvKiBWTCBjdXJyZW50bHkgYmVpbmcgdXBkYXRlZCAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsgLyogbG9jayBndWFyZGluZyB1cGRhdGUgcXVldWUgKi8KLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJICAgICBjb25zdCB2b2lkICplbnRyeSk7Ci1zdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKLQotc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192bG9jYXRpb25fY2FjaGVfaW5kZXhfZGVmID0gewotCS5uYW1lCQk9ICJ2bGRiIiwKLQkuZGF0YV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uKSwKLQkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0FTQ0lJWiwgNjQgfSwKLQkubWF0Y2gJCT0gYWZzX3Zsb2NhdGlvbl9jYWNoZV9tYXRjaCwKLQkudXBkYXRlCQk9IGFmc192bG9jYXRpb25fY2FjaGVfdXBkYXRlLAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZwogICogYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZsX3NlbSB3cml0ZS1sb2NrZWQKICAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9uYW1lKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCi0JCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgIHVuc2lnbmVkIG5hbWVzeiwKK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZShzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwsCisJCQkJCSAgIHN0cnVjdCBrZXkgKmtleSwKIAkJCQkJICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKnZsZGIpCiB7Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IE5VTEw7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsID0gdmxvY2F0aW9uLT5jZWxsOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsLT5jZWxsOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CiAJaW50IGNvdW50LCByZXQ7CiAKLQlfZW50ZXIoIiVzLCUqLipzLCV1IiwgY2VsbC0+bmFtZSwgbmFtZXN6LCBuYW1lc3osIG5hbWUsIG5hbWVzeik7CisJX2VudGVyKCIlcywlcyIsIGNlbGwtPm5hbWUsIHZsLT52bGRiLm5hbWUpOwogCisJZG93bl93cml0ZSgmdmwtPmNlbGwtPnZsX3NlbSk7CiAJcmV0ID0gLUVOT01FRElVTTsKIAlmb3IgKGNvdW50ID0gY2VsbC0+dmxfbmFkZHJzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwKLQkJICAgICAgIGNlbGwtPnZsX2N1cnJfc3ZpeCwKLQkJICAgICAgIGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0uc19hZGRyKTsKKwkJYWRkciA9IGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF07CiAKLQkJLyogdHJ5IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgKi8KLQkJcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoY2VsbCwKLQkJCQkJJmNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0sCi0JCQkJCSZzZXJ2ZXIpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAtRU5PTUVNOgotCQljYXNlIC1FTk9ORVQ6Ci0JCQlnb3RvIG91dDsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gcm90YXRlOwotCQl9CisJCV9kZWJ1ZygiQ2VsbFNlcnZbJWh1XTogJTA4eCIsIGNlbGwtPnZsX2N1cnJfc3ZpeCwgYWRkci5zX2FkZHIpOwogCiAJCS8qIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSBWTCBzZXJ2ZXIgKi8KLQkJcmV0ID0gYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc2VydmVyLCBuYW1lLCBuYW1lc3osIHZsZGIpOworCQlyZXQgPSBhZnNfdmxfZ2V0X2VudHJ5X2J5X25hbWUoJmFkZHIsIGtleSwgdmwtPnZsZGIubmFtZSwgdmxkYiwKKwkJCQkJICAgICAgICZhZnNfc3luY19jYWxsKTsKIAkJc3dpdGNoIChyZXQpIHsKIAkJY2FzZSAwOgotCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIC1FTk9NRU06CiAJCWNhc2UgLUVOT05FVDoKIAkJY2FzZSAtRU5FVFVOUkVBQ0g6CiAJCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAkJY2FzZSAtRUNPTk5SRUZVU0VEOgotCQkJZG93bl93cml0ZSgmc2VydmVyLT5zZW0pOwotCQkJaWYgKHNlcnZlci0+dmxzZXJ2ZXIpIHsKLQkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKLQkJCQlzZXJ2ZXItPnZsc2VydmVyID0gTlVMTDsKLQkJCX0KLQkJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwogCQkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PTkVUKQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByb3RhdGU7CiAJCWNhc2UgLUVOT01FRElVTToKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CiAJCQlnb3RvIG91dDsKIAkJZGVmYXVsdDoKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0JCQlyZXQgPSAtRU5PTUVESVVNOworCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gcm90YXRlOwogCQl9CiAKQEAgLTE0Niw3NiArNzYsNjYgQEAKIAkJY2VsbC0+dmxfY3Vycl9zdml4ICU9IGNlbGwtPnZsX25hZGRyczsKIAl9CiAKLSBvdXQ6CitvdXQ6CisJdXBfd3JpdGUoJnZsLT5jZWxsLT52bF9zZW0pOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X25hbWUoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZwogICogYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZsX3NlbSB3cml0ZS1sb2NrZWQKICAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZChzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uLAorc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZChzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwsCisJCQkJCSBzdHJ1Y3Qga2V5ICprZXksCiAJCQkJCSBhZnNfdm9saWRfdCB2b2xpZCwKIAkJCQkJIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKIAkJCQkJIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQogewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOwotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB2bC0+Y2VsbDsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOwogCWludCBjb3VudCwgcmV0OwogCiAJX2VudGVyKCIlcywleCwlZCwiLCBjZWxsLT5uYW1lLCB2b2xpZCwgdm9sdHlwZSk7CiAKKwlkb3duX3dyaXRlKCZ2bC0+Y2VsbC0+dmxfc2VtKTsKIAlyZXQgPSAtRU5PTUVESVVNOwogCWZvciAoY291bnQgPSBjZWxsLT52bF9uYWRkcnM7IGNvdW50ID4gMDsgY291bnQtLSkgewotCQlfZGVidWcoIkNlbGxTZXJ2WyVodV06ICUwOHgiLAotCQkgICAgICAgY2VsbC0+dmxfY3Vycl9zdml4LAotCQkgICAgICAgY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XS5zX2FkZHIpOworCQlhZGRyID0gY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XTsKIAotCQkvKiB0cnkgYW5kIGNyZWF0ZSBhIHNlcnZlciAqLwotCQlyZXQgPSBhZnNfc2VydmVyX2xvb2t1cChjZWxsLAotCQkJCQkmY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XSwKLQkJCQkJJnNlcnZlcik7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIC1FTk9NRU06Ci0JCWNhc2UgLUVOT05FVDoKLQkJCWdvdG8gb3V0OwotCQlkZWZhdWx0OgotCQkJZ290byByb3RhdGU7Ci0JCX0KKwkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwgY2VsbC0+dmxfY3Vycl9zdml4LCBhZGRyLnNfYWRkcik7CiAKIAkJLyogYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIFZMIHNlcnZlciAqLwotCQlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc2VydmVyLCB2b2xpZCwgdm9sdHlwZSwgdmxkYik7CisJCXJldCA9IGFmc192bF9nZXRfZW50cnlfYnlfaWQoJmFkZHIsIGtleSwgdm9saWQsIHZvbHR5cGUsIHZsZGIsCisJCQkJCSAgICAgJmFmc19zeW5jX2NhbGwpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIDA6Ci0JCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgLUVOT01FTToKIAkJY2FzZSAtRU5PTkVUOgogCQljYXNlIC1FTkVUVU5SRUFDSDoKIAkJY2FzZSAtRUhPU1RVTlJFQUNIOgogCQljYXNlIC1FQ09OTlJFRlVTRUQ6Ci0JCQlkb3duX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JCQlpZiAoc2VydmVyLT52bHNlcnZlcikgewotCQkJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHNlcnZlci0+dmxzZXJ2ZXIpOwotCQkJCXNlcnZlci0+dmxzZXJ2ZXIgPSBOVUxMOwotCQkJfQotCQkJdXBfd3JpdGUoJnNlcnZlci0+c2VtKTsKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CiAJCQlpZiAocmV0ID09IC1FTk9NRU0gfHwgcmV0ID09IC1FTk9ORVQpCiAJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJvdGF0ZTsKKwkJY2FzZSAtRUJVU1k6CisJCQl2bC0+dXBkX2J1c3lfY250Kys7CisJCQlpZiAodmwtPnVwZF9idXN5X2NudCA8PSAzKSB7CisJCQkJaWYgKHZsLT51cGRfYnVzeV9jbnQgPiAxKSB7CisJCQkJCS8qIHNlY29uZCsgQlVTWSAtIHNsZWVwIGEgbGl0dGxlIGJpdCAqLworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSAtRU5PTUVESVVNOgotCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQkJCWdvdG8gb3V0OworCQkJdmwtPnVwZF9yZWpfY250Kys7CisJCQlnb3RvIHJvdGF0ZTsKIAkJZGVmYXVsdDoKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0JCQlyZXQgPSAtRU5PTUVESVVNOworCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gcm90YXRlOwogCQl9CiAKQEAgLTIyMyw3MjkgKzE0Myw1ODAgQEAKIAlyb3RhdGU6CiAJCWNlbGwtPnZsX2N1cnJfc3ZpeCsrOwogCQljZWxsLT52bF9jdXJyX3N2aXggJT0gY2VsbC0+dmxfbmFkZHJzOworCQl2bC0+dXBkX2J1c3lfY250ID0gMDsKIAl9CiAKLSBvdXQ6CitvdXQ6CisJaWYgKHJldCA8IDAgJiYgdmwtPnVwZF9yZWpfY250ID4gMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCQkgICAgICAgIiBBY3RpdmUgdm9sdW1lIG5vIGxvbmdlciB2YWxpZCAnJXMnXG4iLAorCQkgICAgICAgdmwtPnZsZGIubmFtZSk7CisJCXZsLT52YWxpZCA9IDA7CisJCXJldCA9IC1FTk9NRURJVU07CisJfQorCisJdXBfd3JpdGUoJnZsLT5jZWxsLT52bF9zZW0pOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X2lkKCkgKi8KKy8qCisgKiBhbGxvY2F0ZSBhIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RhdGljIHN0cnVjdCBhZnNfdmxvY2F0aW9uICphZnNfdmxvY2F0aW9uX2FsbG9jKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKKwkJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJIHNpemVfdCBuYW1lc3opCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJdmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiksIEdGUF9LRVJORUwpOworCWlmICh2bCkgeworCQl2bC0+Y2VsbCA9IGNlbGw7CisJCXZsLT5zdGF0ZSA9IEFGU19WTF9ORVc7CisJCWF0b21pY19zZXQoJnZsLT51c2FnZSwgMSk7CisJCUlOSVRfTElTVF9IRUFEKCZ2bC0+bGluayk7CisJCUlOSVRfTElTVF9IRUFEKCZ2bC0+Z3JhdmUpOworCQlJTklUX0xJU1RfSEVBRCgmdmwtPnVwZGF0ZSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZsLT53YWl0cSk7CisJCXNwaW5fbG9ja19pbml0KCZ2bC0+bG9jayk7CisJCW1lbWNweSh2bC0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opOworCX0KKworCV9sZWF2ZSgiID0gJXAiLCB2bCk7CisJcmV0dXJuIHZsOworfQorCisvKgorICogdXBkYXRlIHJlY29yZCBpZiB3ZSBmb3VuZCBpdCBpbiB0aGUgY2FjaGUKKyAqLworc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9yZWNvcmQoc3RydWN0IGFmc192bG9jYXRpb24gKnZsLAorCQkJCSAgICAgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkJICAgICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKKwlhZnNfdm9saWRfdCB2aWQ7CisJaW50IHJldDsKKworCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KKwlfZGVidWcoIkxvY2FsbHkgQ2FjaGVkOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCisJICAgICAgIHZsLT52bGRiLm5hbWUsCisJICAgICAgIHZsLT52bGRiLnZpZG1hc2ssCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMF0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMV0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMV0sCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMl0pOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCisJICAgICAgIHZsLT52bGRiLnZpZFswXSwKKwkgICAgICAgdmwtPnZsZGIudmlkWzFdLAorCSAgICAgICB2bC0+dmxkYi52aWRbMl0pOworCisJaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl2aWQgPSB2bC0+dmxkYi52aWRbMF07CisJCXZvbHR5cGUgPSBBRlNWTF9SV1ZPTDsKKwl9IGVsc2UgaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9STykgeworCQl2aWQgPSB2bC0+dmxkYi52aWRbMV07CisJCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9IGVsc2UgaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKKwkJdmlkID0gdmwtPnZsZGIudmlkWzJdOworCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwkJdmlkID0gMDsKKwkJdm9sdHlwZSA9IDA7CisJfQorCisJLyogY29udGFjdCB0aGUgc2VydmVyIHRvIG1ha2Ugc3VyZSB0aGUgdm9sdW1lIGlzIHN0aWxsIGF2YWlsYWJsZQorCSAqIC0gVE9ETzogbmVlZCB0byBoYW5kbGUgZGlzY29ubmVjdGVkIG9wZXJhdGlvbiBoZXJlCisJICovCisJcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfaWQodmwsIGtleSwgdmlkLCB2b2x0eXBlLCB2bGRiKTsKKwlzd2l0Y2ggKHJldCkgeworCQkvKiBuZXQgZXJyb3IgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJrQUZTOiIKKwkJICAgICAgICIgZmFpbGVkIHRvIHVwZGF0ZSB2b2x1bWUgJyVzJyAoJXgpIHVwIGluICclcyc6ICVkXG4iLAorCQkgICAgICAgdmwtPnZsZGIubmFtZSwgdmlkLCB2bC0+Y2VsbC0+bmFtZSwgcmV0KTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisKKwkJLyogcHVsbGVkIGZyb20gbG9jYWwgY2FjaGUgaW50byBtZW1vcnkgKi8KKwljYXNlIDA6CisJCV9sZWF2ZSgiID0gMCIpOworCQlyZXR1cm4gMDsKKworCQkvKiB1aCBvaC4uLiBsb29rcyBsaWtlIHRoZSB2b2x1bWUgZ290IGRlbGV0ZWQgKi8KKwljYXNlIC1FTk9NRURJVU06CisJCXByaW50ayhLRVJOX0VSUiAia0FGUzoiCisJCSAgICAgICAiIHZvbHVtZSAnJXMnICgleCkgZG9lcyBub3QgZXhpc3QgJyVzJ1xuIiwKKwkJICAgICAgIHZsLT52bGRiLm5hbWUsIHZpZCwgdmwtPmNlbGwtPm5hbWUpOworCisJCS8qIFRPRE86IG1ha2UgZXhpc3RpbmcgcmVjb3JkIHVuYXZhaWxhYmxlICovCisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworLyoKKyAqIGFwcGx5IHRoZSB1cGRhdGUgdG8gYSBWTCByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9hcHBseV91cGRhdGUoc3RydWN0IGFmc192bG9jYXRpb24gKnZsLAorCQkJCSAgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYikKK3sKKwlfZGVidWcoIkRvbmUgVkwgTG9va3VwOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCisJICAgICAgIHZsZGItPm5hbWUsIHZsZGItPnZpZG1hc2ssCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMF0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMV0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMV0sCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMl0pOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCisJICAgICAgIHZsZGItPnZpZFswXSwgdmxkYi0+dmlkWzFdLCB2bGRiLT52aWRbMl0pOworCisJaWYgKHN0cmNtcCh2bGRiLT5uYW1lLCB2bC0+dmxkYi5uYW1lKSAhPSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCQkgICAgICAgIiBuYW1lIG9mIHZvbHVtZSAnJXMnIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCSAgICAgICB2bC0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lKTsKKworCXZsLT52bGRiID0gKnZsZGI7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJLyogdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLworCWNhY2hlZnNfdXBkYXRlX2Nvb2tpZSh2bC0+Y2FjaGUpOworI2VuZGlmCit9CisKKy8qCisgKiBmaWxsIGluIGEgdm9sdW1lIGxvY2F0aW9uIHJlY29yZCwgY29uc3VsdGluZyB0aGUgY2FjaGUgYW5kIHRoZSBWTCBzZXJ2ZXIKKyAqIGJvdGgKKyAqLworc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2ZpbGxfaW5fcmVjb3JkKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bCwKKwkJCQkJc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uIHZsZGI7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlBU1NFUlRDTVAodmwtPnZhbGlkLCA9PSwgMCk7CisKKwltZW1zZXQoJnZsZGIsIDAsIHNpemVvZih2bGRiKSk7CisKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhbiBpbi1jYWNoZSBjb3B5ICh3aWxsIHNldCB2bC0+dmFsaWQgaWYgdGhlcmUgaXMpICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCWNhY2hlZnNfYWNxdWlyZV9jb29raWUoY2VsbC0+Y2FjaGUsCisJCQkgICAgICAgJmFmc192b2x1bWVfY2FjaGVfaW5kZXhfZGVmLAorCQkJICAgICAgIHZsb2NhdGlvbiwKKwkJCSAgICAgICAmdmwtPmNhY2hlKTsKKyNlbmRpZgorCisJaWYgKHZsLT52YWxpZCkgeworCQkvKiB0cnkgdG8gdXBkYXRlIGEga25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieQorCQkgKiBJRCBhcyB0aGUgbmFtZSBtYXkgaGF2ZSBjaGFuZ2VkICovCisJCV9kZWJ1ZygiZm91bmQgaW4gY2FjaGUiKTsKKwkJcmV0ID0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfcmVjb3JkKHZsLCBrZXksICZ2bGRiKTsKKwl9IGVsc2UgeworCQkvKiB0cnkgdG8gbG9vayB1cCBhbiB1bmtub3duIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkKKwkJICogbmFtZSAqLworCQlyZXQgPSBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9uYW1lKHZsLCBrZXksICZ2bGRiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJXMnIGluIGNlbGwgJyVzJ1xuIiwKKwkJCSAgICAgICB2bC0+dmxkYi5uYW1lLCB2bC0+Y2VsbC0+bmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJYWZzX3Zsb2NhdGlvbl9hcHBseV91cGRhdGUodmwsICZ2bGRiKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHF1ZXVlIGEgdmxvY2F0aW9uIHJlY29yZCBmb3IgdXBkYXRlcworICovCit2b2lkIGFmc192bG9jYXRpb25fcXVldWVfZm9yX3VwZGF0ZXMoc3RydWN0IGFmc192bG9jYXRpb24gKnZsKQoreworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp4dmw7CisKKwkvKiB3YWl0IGF0IGxlYXN0IDEwIG1pbnV0ZXMgYmVmb3JlIHVwZGF0aW5nLi4uICovCisJdmwtPnVwZGF0ZV9hdCA9IGdldF9zZWNvbmRzKCkgKyBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lb3V0OworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmFmc192bG9jYXRpb25fdXBkYXRlcykpIHsKKwkJLyogLi4uIGJ1dCB3YWl0IGF0IGxlYXN0IDEgc2Vjb25kIG1vcmUgdGhhbiB0aGUgbmV3ZXN0IHJlY29yZAorCQkgKiBhbHJlYWR5IHF1ZXVlZCBzbyB0aGF0IHdlIGRvbid0IHNwYW0gdGhlIFZMIHNlcnZlciBzdWRkZW5seQorCQkgKiB3aXRoIGxvdHMgb2YgcmVxdWVzdHMKKwkJICovCisJCXh2bCA9IGxpc3RfZW50cnkoYWZzX3Zsb2NhdGlvbl91cGRhdGVzLnByZXYsCisJCQkJIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRhdGUpOworCQlpZiAodmwtPnVwZGF0ZV9hdCA8PSB4dmwtPnVwZGF0ZV9hdCkKKwkJCXZsLT51cGRhdGVfYXQgPSB4dmwtPnVwZGF0ZV9hdCArIDE7CisJfSBlbHNlIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciwKKwkJCQkgICAmYWZzX3Zsb2NhdGlvbl91cGRhdGUsCisJCQkJICAgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZW91dCAqIEhaKTsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZ2bC0+dXBkYXRlLCAmYWZzX3Zsb2NhdGlvbl91cGRhdGVzKTsKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworfQorCiAvKgogICogbG9va3VwIHZvbHVtZSBsb2NhdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZvbF9zZW0gd3JpdGUtbG9ja2VkCiAgKiAtIGl0ZXJhdGUgdGhyb3VnaCB0aGUgVkwgc2VydmVycyBpbiBhIGNlbGwgdW50aWwgb25lIG9mIHRoZW0gYWRtaXRzIGtub3dpbmcKICAqICAgYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgogICogLSBsb29rdXAgaW4gdGhlIGxvY2FsIGNhY2hlIGlmIG5vdCBhYmxlIHRvIGZpbmQgb24gdGhlIFZMIHNlcnZlcgogICogLSBpbnNlcnQvdXBkYXRlIGluIHRoZSBsb2NhbCBjYWNoZSBpZiBkaWQgZ2V0IGEgVkwgcmVzcG9uc2UKICAqLwotaW50IGFmc192bG9jYXRpb25fbG9va3VwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKLQkJCSBjb25zdCBjaGFyICpuYW1lLAotCQkJIHVuc2lnbmVkIG5hbWVzeiwKLQkJCSBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqKl92bG9jYXRpb24pCitzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJCQkgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHNpemVfdCBuYW1lc3opCiB7Ci0Jc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gdmxkYjsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uOwotCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKLQlhZnNfdm9saWRfdCB2aWQ7Ci0JaW50IGFjdGl2ZSA9IDAsIHJldDsKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmw7CisJaW50IHJldDsKIAotCV9lbnRlcigieyVzfSwlKi4qcywldSwiLCBjZWxsLT5uYW1lLCBuYW1lc3osIG5hbWVzeiwgbmFtZSwgbmFtZXN6KTsKKwlfZW50ZXIoInslc30seyV4fSwlKi4qcywlenUiLAorCSAgICAgICBjZWxsLT5uYW1lLCBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIChpbnQpIG5hbWVzeiwgKGludCkgbmFtZXN6LCBuYW1lLCBuYW1lc3opOwogCi0JaWYgKG5hbWVzeiA+IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkpIHsKKwlpZiAobmFtZXN6ID4gc2l6ZW9mKHZsLT52bGRiLm5hbWUpKSB7CiAJCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOwotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAJfQogCi0JLyogc2VhcmNoIHRoZSBjZWxsJ3MgYWN0aXZlIGxpc3QgZmlyc3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsb2NhdGlvbiwgJmNlbGwtPnZsX2xpc3QsIGxpbmspIHsKLQkJaWYgKG5hbWVzeiA8IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkgJiYKLQkJICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lW25hbWVzel0gIT0gJ1wwJykKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhbiBpbi1tZW1vcnkgY29weSBmaXJzdCAqLworCWRvd25fd3JpdGUoJmNlbGwtPnZsX3NlbSk7CisJc3Bpbl9sb2NrKCZjZWxsLT52bF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsLCAmY2VsbC0+dmxfbGlzdCwgbGluaykgeworCQlpZiAodmwtPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCiAJCQljb250aW51ZTsKLQotCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCisJCWlmIChtZW1jbXAodmwtPnZsZGIubmFtZSwgbmFtZSwgbmFtZXN6KSA9PSAwKQogCQkJZ290byBmb3VuZF9pbl9tZW1vcnk7CiAJfQotCi0JLyogc2VhcmNoIHRoZSBjZWxsJ3MgZ3JhdmV5YXJkIGxpc3Qgc2Vjb25kICovCi0Jc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodmxvY2F0aW9uLCAmY2VsbC0+dmxfZ3JhdmV5YXJkLCBsaW5rKSB7Ci0JCWlmIChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCi0JCSAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCi0JCQljb250aW51ZTsKLQotCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCi0JCQlnb3RvIGZvdW5kX2luX2dyYXZleWFyZDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2xvY2spOwogCiAJLyogbm90IGluIHRoZSBjZWxsJ3MgaW4tbWVtb3J5IGxpc3RzIC0gY3JlYXRlIGEgbmV3IHJlY29yZCAqLwotCXZsb2NhdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdmxvY2F0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2bG9jYXRpb24pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXRvbWljX3NldCgmdmxvY2F0aW9uLT51c2FnZSwgMSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnZsb2NhdGlvbi0+bGluayk7Ci0Jcndsb2NrX2luaXQoJnZsb2NhdGlvbi0+bG9jayk7Ci0JbWVtY3B5KHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opOwotCi0JYWZzX3RpbWVyX2luaXQoJnZsb2NhdGlvbi0+dGltZW91dCwgJmFmc192bG9jYXRpb25fdGltZXJfb3BzKTsKLQlhZnNfdGltZXJfaW5pdCgmdmxvY2F0aW9uLT51cGRfdGltZXIsICZhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lcl9vcHMpOwotCWFmc19hc3luY19vcF9pbml0KCZ2bG9jYXRpb24tPnVwZF9vcCwgJmFmc192bG9jYXRpb25fdXBkYXRlX29wX29wcyk7CisJdmwgPSBhZnNfdmxvY2F0aW9uX2FsbG9jKGNlbGwsIG5hbWUsIG5hbWVzeik7CisJaWYgKCF2bCkgeworCQl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJYWZzX2dldF9jZWxsKGNlbGwpOwotCXZsb2NhdGlvbi0+Y2VsbCA9IGNlbGw7CiAKLQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ2bC0+bGluaywgJmNlbGwtPnZsX2xpc3QpOworCXZsLT5zdGF0ZSA9IEFGU19WTF9DUkVBVElORzsKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKIAotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQkvKiB3ZSB3YW50IHRvIHN0b3JlIGl0IGluIHRoZSBjYWNoZSwgcGx1cyBpdCBtaWdodCBhbHJlYWR5IGJlCi0JICogZW5jYWNoZWQgKi8KLQljYWNoZWZzX2FjcXVpcmVfY29va2llKGNlbGwtPmNhY2hlLAotCQkJICAgICAgICZhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiwKLQkJCSAgICAgICB2bG9jYXRpb24sCi0JCQkgICAgICAgJnZsb2NhdGlvbi0+Y2FjaGUpOwotCi0JaWYgKHZsb2NhdGlvbi0+dmFsaWQpCi0JCWdvdG8gZm91bmRfaW5fY2FjaGU7Ci0jZW5kaWYKLQotCS8qIHRyeSB0byBsb29rIHVwIGFuIHVua25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBuYW1lICovCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSh2bG9jYXRpb24sIG5hbWUsIG5hbWVzeiwgJnZsZGIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJSouKnMnIGluIGNlbGwgJyVzJ1xuIiwKLQkJICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBjZWxsLT5uYW1lKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOwotCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCS8qIGZvdW5kIGluIHRoZSBncmF2ZXlhcmQgLSByZXN1cnJlY3QgKi8KLQlfZGVidWcoImZvdW5kIGluIGdyYXZleWFyZCIpOwotCWF0b21pY19pbmMoJnZsb2NhdGlvbi0+dXNhZ2UpOwotCWxpc3RfbW92ZV90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKLQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ2bG9jYXRpb24tPnRpbWVvdXQpOwotCWdvdG8gYWN0aXZlOwotCi0gZm91bmRfaW5fbWVtb3J5OgotCS8qIGZvdW5kIGluIG1lbW9yeSAtIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGFjdGl2ZSAqLwotCV9kZWJ1ZygiZm91bmQgaW4gbWVtb3J5Iik7Ci0JYXRvbWljX2luYygmdmxvY2F0aW9uLT51c2FnZSk7Ci0KLSBhY3RpdmU6Ci0JYWN0aXZlID0gMTsKLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLSBmb3VuZF9pbl9jYWNoZToKLSNlbmRpZgotCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KLQlfZGVidWcoImZvdW5kIGluIGNhY2hlIik7Ci0KLQlfZGVidWcoIkxvY2FsbHkgQ2FjaGVkOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIudmlkbWFzaywKLQkgICAgICAgbnRvaGwodmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbMF0uc19hZGRyKSwKLQkgICAgICAgdmxvY2F0aW9uLT52bGRiLnNydnRtYXNrWzBdLAotCSAgICAgICBudG9obCh2bG9jYXRpb24tPnZsZGIuc2VydmVyc1sxXS5zX2FkZHIpLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbMV0sCi0JICAgICAgIG50b2hsKHZsb2NhdGlvbi0+dmxkYi5zZXJ2ZXJzWzJdLnNfYWRkciksCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1syXQotCSAgICAgICApOwotCi0JX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMF0sCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMV0sCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMl0pOwotCi0JaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUlcpIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFswXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX1JXVk9MOwotCX0KLQllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX1JPKSB7Ci0JCXZpZCA9IHZsb2NhdGlvbi0+dmxkYi52aWRbMV07Ci0JCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKLQl9Ci0JZWxzZSBpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsyXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7Ci0JfQotCWVsc2UgewotCQlCVUcoKTsKLQkJdmlkID0gMDsKLQkJdm9sdHlwZSA9IDA7Ci0JfQotCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfaWQodmxvY2F0aW9uLCB2aWQsIHZvbHR5cGUsICZ2bGRiKTsKLQlzd2l0Y2ggKHJldCkgewotCQkvKiBuZXQgZXJyb3IgKi8KLQlkZWZhdWx0OgotCQlwcmludGsoImtBRlM6IGZhaWxlZCB0byB2b2x1bWUgJyUqLipzJyAoJXgpIHVwIGluICclcyc6ICVkXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZpZCwgY2VsbC0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQotCQkvKiBwdWxsZWQgZnJvbSBsb2NhbCBjYWNoZSBpbnRvIG1lbW9yeSAqLwotCWNhc2UgMDoKLQkJZ290byBmb3VuZF9vbl92bHNlcnZlcjsKLQotCQkvKiB1aCBvaC4uLiBsb29rcyBsaWtlIHRoZSB2b2x1bWUgZ290IGRlbGV0ZWQgKi8KLQljYXNlIC1FTk9NRURJVU06Ci0JCXByaW50aygia0FGUzogdm9sdW1lICclKi4qcycgKCV4KSBkb2VzIG5vdCBleGlzdCAnJXMnXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZpZCwgY2VsbC0+bmFtZSk7Ci0KLQkJLyogVE9ETzogbWFrZSBleGlzdGluZyByZWNvcmQgdW5hdmFpbGFibGUgKi8KLQkJZ290byBlcnJvcjsKLQl9Ci0KLSBmb3VuZF9vbl92bHNlcnZlcjoKLQlfZGVidWcoIkRvbmUgVkwgTG9va3VwOiAlKi4qcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCi0JICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLAotCSAgICAgICB2bGRiLnZpZG1hc2ssCi0JICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1swXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzBdLAotCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMV0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1sxXSwKLQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzJdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMl0KLQkgICAgICAgKTsKLQotCV9kZWJ1ZygiVmlkczogJTA4eCAlMDh4ICUwOHgiLCB2bGRiLnZpZFswXSwgdmxkYi52aWRbMV0sIHZsZGIudmlkWzJdKTsKLQotCWlmICgobmFtZXN6IDwgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYi5uYW1lKSAmJgotCSAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWVbbmFtZXN6XSAhPSAnXDAnKSB8fAotCSAgICBtZW1jbXAodmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opICE9IDApCi0JCXByaW50aygia0FGUzogbmFtZSBvZiB2b2x1bWUgJyUqLipzJyBjaGFuZ2VkIHRvICclcycgb24gc2VydmVyXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZsZGIubmFtZSk7Ci0KLQltZW1jcHkoJnZsb2NhdGlvbi0+dmxkYiwgJnZsZGIsIHNpemVvZih2bG9jYXRpb24tPnZsZGIpKTsKLQotCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwgMTAgKiBIWik7Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0JLyogdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLwotCWNhY2hlZnNfdXBkYXRlX2Nvb2tpZSh2bG9jYXRpb24tPmNhY2hlKTsKLSNlbmRpZgotCi0JKl92bG9jYXRpb24gPSB2bG9jYXRpb247Ci0JX2xlYXZlKCIgPSAwICglcCkiLHZsb2NhdGlvbik7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQlpZiAodmxvY2F0aW9uKSB7Ci0JCWlmIChhY3RpdmUpIHsKLQkJCV9fYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQkJCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodmxvY2F0aW9uLT5jYWNoZSwgMCk7Ci0jZW5kaWYKLQkJCWFmc19wdXRfY2VsbCh2bG9jYXRpb24tPmNlbGwpOwotCQkJa2ZyZWUodmxvY2F0aW9uKTsKLQkJfQotCX0KLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2xvb2t1cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCi0gKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dm9sX3NlbSB3cml0ZS1sb2NrZWQKLSAqLwotc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKQotewotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQotCWlmICghdmxvY2F0aW9uKQotCQlyZXR1cm47Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCUJVR19PTihhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPD0gMCk7Ci0KLQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmdmxvY2F0aW9uLT51c2FnZSkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCQlfbGVhdmUoIiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbW92ZSB0byBncmF2ZXlhcmQgcXVldWUgKi8KLQlsaXN0X21vdmVfdGFpbCgmdmxvY2F0aW9uLT5saW5rLCZjZWxsLT52bF9ncmF2ZXlhcmQpOwotCi0JLyogcmVtb3ZlIGZyb20gcGVuZGluZyB0aW1lb3V0IHF1ZXVlIChyZWZjb3VudGVkIGlmIGFjdHVhbGx5IGJlaW5nCi0JICogdXBkYXRlZCkgKi8KLQlsaXN0X2RlbF9pbml0KCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rKTsKLQotCS8qIHRpbWUgb3V0IGluIDEwIHNlY3MgKi8KLQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIpOwotCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnRpbWVvdXQsIDEwICogSFopOwotCi0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0KLQlfbGVhdmUoIiBba2lsbGVkXSIpOwotfSAvKiBlbmQgX19hZnNfcHV0X3Zsb2NhdGlvbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCi0gKi8KLXZvaWQgYWZzX3B1dF92bG9jYXRpb24oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKLXsKLQlpZiAodmxvY2F0aW9uKSB7Ci0JCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCQlkb3duX3dyaXRlKCZjZWxsLT52bF9zZW0pOwotCQlfX2Fmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOwotCX0KLX0gLyogZW5kIGFmc19wdXRfdmxvY2F0aW9uKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRpbWVvdXQgdmxvY2F0aW9uIHJlY29yZAotICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwncyBncmF2ZXlhcmQgaWYgdGhlIHVzYWdlIGNvdW50IGlzIHplcm8KLSAqLwotdm9pZCBhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQoc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKLXsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCUJVR19PTihhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPCAwKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCWlmIChhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPT0gMCkKLQkJbGlzdF9kZWxfaW5pdCgmdmxvY2F0aW9uLT5saW5rKTsKLQllbHNlCi0JCXZsb2NhdGlvbiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0KLQlpZiAoIXZsb2NhdGlvbikgewotCQlfbGVhdmUoIiIpOwotCQlyZXR1cm47IC8qIHJlc3VycmVjdGVkICovCi0JfQotCi0JLyogd2UgY2FuIG5vdyBkZXN0cm95IGl0IHByb3Blcmx5ICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodmxvY2F0aW9uLT5jYWNoZSwgMCk7Ci0jZW5kaWYKLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQlrZnJlZSh2bG9jYXRpb24pOwotCi0JX2xlYXZlKCIgW2Rlc3Ryb3llZF0iKTsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fZG9fdGltZW91dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGFuIHVwZGF0ZSBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXJ2ZXIKLSAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKQotewotCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKLQlhZnNfdm9saWRfdCB2aWQ7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJXN7dWZzPSV1IHVjcz0ldX0iLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSwKLQkgICAgICAgdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCwKLQkgICAgICAgdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4KTsKLQotCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KLQlpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgewotCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzBdOwotCQl2b2x0eXBlID0gQUZTVkxfUldWT0w7Ci0JfQotCWVsc2UgaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsxXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX1JPVk9MOwotCX0KLQllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX0JBSykgewotCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzJdOwotCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKLQl9Ci0JZWxzZSB7Ci0JCUJVRygpOwotCQl2aWQgPSAwOwotCQl2b2x0eXBlID0gMDsKLQl9Ci0KLQkvKiBjb250YWN0IHRoZSBjaG9zZW4gc2VydmVyICovCi0JcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoCi0JCXZsb2NhdGlvbi0+Y2VsbCwKLQkJJnZsb2NhdGlvbi0+Y2VsbC0+dmxfYWRkcnNbdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4XSwKLQkJJnZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7Ci0KLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PTUVNOgotCWNhc2UgLUVOT05FVDoKLQlkZWZhdWx0OgotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBpbml0aWF0ZSB0aGUgdXBkYXRlIG9wZXJhdGlvbiAqLwotCXJldCA9IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYygmdmxvY2F0aW9uLT51cGRfb3AsIHZpZCwgdm9sdHlwZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2JlZ2luKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFiYW5kb24gdXBkYXRpbmcgYSBWTCByZWNvcmQKLSAqIC0gZG9lcyBub3QgcmVzdGFydCB0aGUgdXBkYXRlIHRpbWVyCi0gKi8KLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiwKLQkJCQkJIGFmc192bG9jYXRpb25fdXBkX3Qgc3RhdGUsCi0JCQkJCSBpbnQgcmV0KQotewotCV9lbnRlcigiJXMsJXUiLCB2bG9jYXRpb24tPnZsZGIubmFtZSwgc3RhdGUpOwotCitmaWxsX2luX3JlY29yZDoKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2ZpbGxfaW5fcmVjb3JkKHZsLCBrZXkpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoImtBRlM6IEFiYW5kb25pbmcgVkwgdXBkYXRlICclcyc6ICVkXG4iLAotCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfYWJhbmRvbjsKKwlzcGluX2xvY2soJnZsLT5sb2NrKTsKKwl2bC0+c3RhdGUgPSBBRlNfVkxfVkFMSUQ7CisJd2FrZV91cCgmdmwtPndhaXRxKTsKKwlzcGluX3VubG9jaygmdmwtPmxvY2spOwogCi0JLyogZGlzY2FyZCB0aGUgc2VydmVyIHJlY29yZCAqLwotCWFmc19wdXRfc2VydmVyKHZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7Ci0JdmxvY2F0aW9uLT51cGRfb3Auc2VydmVyID0gTlVMTDsKKwkvKiBzY2hlZHVsZSBmb3IgcmVndWxhciB1cGRhdGVzICovCisJYWZzX3Zsb2NhdGlvbl9xdWV1ZV9mb3JfdXBkYXRlcyh2bCk7CisJZ290byBzdWNjZXNzOwogCi0Jc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsKLQlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IE5VTEw7Ci0JdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBzdGF0ZTsKK2ZvdW5kX2luX21lbW9yeToKKwkvKiBmb3VuZCBpbiBtZW1vcnkgKi8KKwlfZGVidWcoImZvdW5kIGluIG1lbW9yeSIpOworCWF0b21pY19pbmMoJnZsLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmdmwtPmdyYXZlKSkgeworCQlzcGluX2xvY2soJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZ2bC0+Z3JhdmUpOworCQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmRfbG9jayk7CisJfQorCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOwogCi0JLyogVE9ETzogc3RhcnQgdXBkYXRpbmcgbmV4dCBWTCByZWNvcmQgb24gcGVuZGluZyBsaXN0ICovCisJLyogc2VlIGlmIGl0IHdhcyBhbiBhYmFuZG9uZWQgcmVjb3JkIHRoYXQgd2UgbWlnaHQgdHJ5IGZpbGxpbmcgaW4gKi8KKwlzcGluX2xvY2soJnZsLT5sb2NrKTsKKwl3aGlsZSAodmwtPnN0YXRlICE9IEFGU19WTF9WQUxJRCkgeworCQlhZnNfdmxvY2F0aW9uX3N0YXRlX3Qgc3RhdGUgPSB2bC0+c3RhdGU7CiAKLQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7CisJCV9kZWJ1ZygiaW52YWxpZCBbc3RhdGUgJWRdIiwgc3RhdGUpOwogCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaGFuZGxlIHBlcmlvZGljIHVwZGF0ZSB0aW1lb3V0cyBhbmQgYnVzeSByZXRyeSB0aW1lb3V0cwotICogLSBjYWxsZWQgZnJvbSBrYWZzdGltb2QKLSAqLwotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCi17Ci0Jc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9Ci0JCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRfdGltZXIpOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JLyogb25seSB1cGRhdGUgaWYgbm90IGluIHRoZSBncmF2ZXlhcmQgKGRlZmVuZCBhZ2FpbnN0IHB1dHRpbmcgdG9vKSAqLwotCXNwaW5fbG9jaygmdmxvY2F0aW9uLT5jZWxsLT52bF9neWxvY2spOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkpCi0JCWdvdG8gb3V0X3VubG9jazE7Ci0KLQlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOwotCi0JLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCBkdWUgdG8gRUJVU1kgc2xlZXAgdGhlbiByZXN0YXJ0IGltbWVkaWF0ZWx5IGlmCi0JICogcG9zc2libGUgb3IgZWxzZSBqdW1wIHRvIGZyb250IG9mIHBlbmRpbmcgcXVldWUgKi8KLQlpZiAodmxvY2F0aW9uLT51cGRfc3RhdGUgPT0gQUZTX1ZMVVBEX0JVU1lTTEVFUCkgewotCQlpZiAoYWZzX3Zsb2NhdGlvbl91cGRhdGUpIHsKLQkJCWxpc3RfYWRkKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAotCQkJCSAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOworCQlpZiAoKHN0YXRlID09IEFGU19WTF9ORVcgfHwgc3RhdGUgPT0gQUZTX1ZMX05PX1ZPTFVNRSkpIHsKKwkJCXZsLT5zdGF0ZSA9IEFGU19WTF9DUkVBVElORzsKKwkJCXNwaW5fdW5sb2NrKCZ2bC0+bG9jayk7CisJCQlnb3RvIGZpbGxfaW5fcmVjb3JkOwogCQl9Ci0JCWVsc2UgewotCQkJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQkJCWFmc192bG9jYXRpb25fdXBkYXRlID0gdmxvY2F0aW9uOwotCQkJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBBRlNfVkxVUERfSU5QUk9HUkVTUzsKLQkJfQotCQlnb3RvIG91dF91bmxvY2syOwotCX0KIAotCS8qIHB1dCBvbiBwZW5kaW5nIHF1ZXVlIGlmIHRoZXJlJ3MgYWxyZWFkeSBhbm90aGVyIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLwotCWlmIChhZnNfdmxvY2F0aW9uX3VwZGF0ZSkgewotCQl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9QRU5ESU5HOwotCQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAotCQkJICAgICAgJmFmc192bG9jYXRpb25fdXBkYXRlX3BlbmRxKTsKLQkJZ290byBvdXRfdW5sb2NrMjsKLQl9CisJCS8qIG11c3Qgbm93IHdhaXQgZm9yIGNyZWF0aW9uIG9yIHVwZGF0ZSBieSBzb21lb25lIGVsc2UgdG8KKwkJICogY29tcGxldGUgKi8KKwkJX2RlYnVnKCJ3YWl0Iik7CiAKLQkvKiBob2xkIGEgcmVmIG9uIGl0IHdoaWxlIGFjdHVhbGx5IHVwZGF0aW5nICovCi0JYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IHZsb2NhdGlvbjsKLQl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9JTlBST0dSRVNTOwotCi0Jc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOwotCXNwaW5fdW5sb2NrKCZ2bG9jYXRpb24tPmNlbGwtPnZsX2d5bG9jayk7Ci0KLQkvKiBva2F5Li4uIHdlIGNhbiBzdGFydCB0aGUgdXBkYXRlICovCi0JX2RlYnVnKCJCRUdJTiBWTCBVUERBVEUgWyVzXSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKLQl2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXg7Ci0JdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ID0gdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeDsKLQl2bG9jYXRpb24tPnVwZF9yZWpfY250ID0gMDsKLQl2bG9jYXRpb24tPnVwZF9idXN5X2NudCA9IDA7Ci0KLQlyZXQgPSBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbih2bG9jYXRpb24pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIHJldCk7Ci0JCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwKLQkJCQkJQUZTX1ZMREJfVElNRU9VVCk7Ci0JCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQlyZXR1cm47Ci0KLSBvdXRfdW5sb2NrMjoKLQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7Ci0gb3V0X3VubG9jazE6Ci0Jc3Bpbl91bmxvY2soJnZsb2NhdGlvbi0+Y2VsbC0+dmxfZ3lsb2NrKTsKLQlfbGVhdmUoIiIpOwotCXJldHVybjsKLQotfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYXR0ZW5kIHRvIGFuIHVwZGF0ZSBvcGVyYXRpb24gdXBvbiB3aGljaCBhbiBldmVudCBoYXBwZW5lZAotICogLSBjYWxsZWQgaW4ga2Fmc2FzeW5jZCBjb250ZXh0Ci0gKi8KLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKLXsKLQlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOwotCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQotCQlsaXN0X2VudHJ5KG9wLCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkX29wKTsKLQl1bnNpZ25lZCB0bXA7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7Ci0KLQlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMyKG9wLCAmdmxkYik7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIC1FQUdBSU46Ci0JCV9sZWF2ZSgiIFt1bmZpbmlzaGVkXSIpOwotCQlyZXR1cm47Ci0KLQljYXNlIDA6Ci0JCV9kZWJ1ZygiRU5EIFZMIFVQREFURTogJWRcbiIsIHJldCk7Ci0JCXZsb2NhdGlvbi0+dmFsaWQgPSAxOwotCi0JCV9kZWJ1ZygiRG9uZSBWTCBMb29rdXA6ICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKLQkJICAgICAgIHZsZGIudmlkbWFzaywKLQkJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1swXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzBdLAotCQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzFdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMV0sCi0JCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1syXQotCQkgICAgICAgKTsKLQotCQlfZGVidWcoIlZpZHM6ICUwOHggJTA4eCAlMDh4IiwKLQkJICAgICAgIHZsZGIudmlkWzBdLCB2bGRiLnZpZFsxXSwgdmxkYi52aWRbMl0pOwotCi0JCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIDApOwotCi0JCWRvd25fd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKLQotCQkvKiBhY3R1YWxseSB1cGRhdGUgdGhlIGNhY2hlICovCi0JCWlmIChzdHJuY21wKHZsZGIubmFtZSwgdmxvY2F0aW9uLT52bGRiLm5hbWUsCi0JCQkgICAgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYi5uYW1lKSkgIT0gMCkKLQkJCXByaW50aygia0FGUzogbmFtZSBvZiB2b2x1bWUgJyVzJyIKLQkJCSAgICAgICAiIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCi0JCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHZsZGIubmFtZSk7Ci0KLQkJbWVtY3B5KCZ2bG9jYXRpb24tPnZsZGIsICZ2bGRiLCBzaXplb2YodmxvY2F0aW9uLT52bGRiKSk7Ci0KLSNpZiAwCi0JCS8qIFRPRE8gdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLwotI2VuZGlmCi0KLQkJdXBfd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKLQorCQlzcGluX3VubG9jaygmdmwtPmxvY2spOworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQl2bC0+d2FpdHEsCisJCQl2bC0+c3RhdGUgPT0gQUZTX1ZMX05FVyB8fAorCQkJdmwtPnN0YXRlID09IEFGU19WTF9WQUxJRCB8fAorCQkJdmwtPnN0YXRlID09IEFGU19WTF9OT19WT0xVTUUpOwogCQlpZiAocmV0IDwgMCkKLQkJCXByaW50aygia0FGUzogZmFpbGVkIHRvIHVwZGF0ZSBsb2NhbCBjYWNoZTogJWRcbiIsIHJldCk7Ci0KLQkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLAotCQkJCQlBRlNfVkxEQl9USU1FT1VUKTsKLQkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQkJX2xlYXZlKCIgW2ZvdW5kXSIpOwotCQlyZXR1cm47Ci0KLQljYXNlIC1FTk9NRURJVU06Ci0JCXZsb2NhdGlvbi0+dXBkX3Jlal9jbnQrKzsKLQkJZ290byB0cnlfbmV4dDsKLQotCQkvKiB0aGUgc2VydmVyIGlzIGxvY2tlZCAtIHJldHJ5IGluIGEgdmVyeSBzaG9ydCB3aGlsZSAqLwotCWNhc2UgLUVCVVNZOgotCQl2bG9jYXRpb24tPnVwZF9idXN5X2NudCsrOwotCQlpZiAodmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPiAzKQotCQkJZ290byB0cnlfbmV4dDsgLyogdG9vIG1hbnkgcmV0cmllcyAqLwotCi0JCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLAotCQkJCQkgICAgIEFGU19WTFVQRF9CVVNZU0xFRVAsIDApOwotCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsIEhaIC8gMik7Ci0JCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JCV9sZWF2ZSgiIFtidXN5XSIpOwotCQlyZXR1cm47Ci0KLQljYXNlIC1FTkVUVU5SRUFDSDoKLQljYXNlIC1FSE9TVFVOUkVBQ0g6Ci0JY2FzZSAtRUNPTk5SRUZVU0VEOgotCWNhc2UgLUVSRU1PVEVJTzoKLQkJLyogcmVjb3JkIGJhZCB2bHNlcnZlciBpbmZvIGluIHRoZSBjZWxsIHRvbwotCQkgKiAtIFRPRE86IHVzZSBkb3duX3dyaXRlX3RyeWxvY2soKSBpZiBhdmFpbGFibGUKLQkJICovCi0JCWlmICh2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggPT0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXgpCi0JCQl2bG9jYXRpb24tPmNlbGwtPnZsX2N1cnJfc3ZpeCA9Ci0JCQkJdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXggJQotCQkJCXZsb2NhdGlvbi0+Y2VsbC0+dmxfbmFkZHJzOwotCi0JY2FzZSAtRUJBRFJRQzoKLQljYXNlIC1FSU5WQUw6Ci0JY2FzZSAtRUFDQ0VTOgotCWNhc2UgLUVCQURNU0c6Ci0JCWdvdG8gdHJ5X25leHQ7Ci0KLQlkZWZhdWx0OgotCQlnb3RvIGFiYW5kb247CisJCQlnb3RvIGVycm9yOworCQlzcGluX2xvY2soJnZsLT5sb2NrKTsKIAl9CisJc3Bpbl91bmxvY2soJnZsLT5sb2NrKTsKIAotCS8qIHRyeSBjb250YWN0aW5nIHRoZSBuZXh0IHNlcnZlciAqLwotIHRyeV9uZXh0OgotCXZsb2NhdGlvbi0+dXBkX2J1c3lfY250ID0gMDsKK3N1Y2Nlc3M6CisJX2xlYXZlKCIgPSAlcCIsdmwpOworCXJldHVybiB2bDsKIAotCS8qIGRpc2NhcmQgdGhlIHNlcnZlciByZWNvcmQgKi8KLQlhZnNfcHV0X3NlcnZlcih2bG9jYXRpb24tPnVwZF9vcC5zZXJ2ZXIpOwotCXZsb2NhdGlvbi0+dXBkX29wLnNlcnZlciA9IE5VTEw7CitlcnJvcl9hYmFuZG9uOgorCXNwaW5fbG9jaygmdmwtPmxvY2spOworCXZsLT5zdGF0ZSA9IEFGU19WTF9ORVc7CisJd2FrZV91cCgmdmwtPndhaXRxKTsKKwlzcGluX3VubG9jaygmdmwtPmxvY2spOworZXJyb3I6CisJQVNTRVJUKHZsICE9IE5VTEwpOworCWFmc19wdXRfdmxvY2F0aW9uKHZsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQogCi0JdG1wID0gdmxvY2F0aW9uLT5jZWxsLT52bF9uYWRkcnM7Ci0JaWYgKHRtcCA9PSAwKQotCQlnb3RvIGFiYW5kb247Ci0KLQl2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXgrKzsKLQlpZiAodmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ID49IHRtcCkKLQkJdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ID0gMDsKLQlpZiAodmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCA+PSB0bXApCi0JCXZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXggPSB0bXAgLSAxOwotCi0JLyogbW92ZSB0byB0aGUgbmV4dCBzZXJ2ZXIgKi8KLQlpZiAodmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ICE9IHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXgpIHsKLQkJYWZzX3Zsb2NhdGlvbl91cGRhdGVfYmVnaW4odmxvY2F0aW9uKTsKLQkJX2xlYXZlKCIgW25leHRdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBydW4gb3V0IG9mIHNlcnZlcnMgdG8gdHJ5IC0gd2FzIHRoZSB2b2x1bWUgcmVqZWN0ZWQ/ICovCi0JaWYgKHZsb2NhdGlvbi0+dXBkX3Jlal9jbnQgPiAwKSB7Ci0JCXByaW50aygia0FGUzogQWN0aXZlIHZvbHVtZSBubyBsb25nZXIgdmFsaWQgJyVzJ1xuIiwKLQkJICAgICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKLQkJdmxvY2F0aW9uLT52YWxpZCA9IDA7Ci0JCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIDApOwotCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsCi0JCQkJCUFGU19WTERCX1RJTUVPVVQpOwotCQlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwotCQlfbGVhdmUoIiBbaW52YWxpZGF0ZWRdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBhYmFuZG9uIHRoZSB1cGRhdGUgKi8KLSBhYmFuZG9uOgotCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIHJldCk7Ci0JYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLCBIWiAqIDEwKTsKLQlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwotCV9sZWF2ZSgiIFthYmFuZG9uZWRdIik7Ci0KLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBkZWFsIHdpdGggYW4gdXBkYXRlIG9wZXJhdGlvbiBiZWluZyBkaXNjYXJkZWQKLSAqIC0gY2FsbGVkIGluIGthZnNhc3luY2QgY29udGV4dCB3aGVuIGl0J3MgZHlpbmcgZHVlIHRvIHJtbW9kCi0gKiAtIHRoZSBjYWxsIGhhcyBhbHJlYWR5IGJlZW4gYWJvcnRlZCBhbmQgcHV0KCknZAorICogZmluaXNoIHVzaW5nIGEgdm9sdW1lIGxvY2F0aW9uIHJlY29yZAogICovCi1zdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9kaXNjYXJkKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKQordm9pZCBhZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwpCiB7Ci0Jc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9Ci0JCWxpc3RfZW50cnkob3AsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRfb3ApOworCWlmICghdmwpCisJCXJldHVybjsKIAotCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisJX2VudGVyKCIlcyIsIHZsLT52bGRiLm5hbWUpOwogCi0JYWZzX3B1dF9zZXJ2ZXIob3AtPnNlcnZlcik7Ci0Jb3AtPnNlcnZlciA9IE5VTEw7CisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZ2bC0+dXNhZ2UpLCA+LCAwKTsKIAotCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmdmwtPnVzYWdlKSkpIHsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KIAotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9kaXNjYXJkKCkgKi8KKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkX2xvY2spOworCWlmIChhdG9taWNfcmVhZCgmdmwtPnVzYWdlKSA9PSAwKSB7CisJCV9kZWJ1ZygiYnVyaWVkIik7CisJCWxpc3RfbW92ZV90YWlsKCZ2bC0+Z3JhdmUsICZhZnNfdmxvY2F0aW9uX2dyYXZleWFyZCk7CisJCXZsLT50aW1lX29mX2RlYXRoID0gZ2V0X3NlY29uZHMoKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXAsCisJCQkJICAgICAgYWZzX3Zsb2NhdGlvbl90aW1lb3V0ICogSFopOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qIHN1c3BlbmQgdXBkYXRlcyBvbiB0aGlzIHJlY29yZCAqLworCQlpZiAoIWxpc3RfZW1wdHkoJnZsLT51cGRhdGUpKSB7CisJCQlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKwkJCWxpc3RfZGVsX2luaXQoJnZsLT51cGRhdGUpOworCQkJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmRfbG9jayk7CisJX2xlYXZlKCIgW2tpbGxlZD9dIik7Cit9CisKIC8qCi0gKiBtYXRjaCBhIFZMREIgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKLSAqIC0gbWF5IGFsc28gbG9hZCB0YXJnZXQgZnJvbSBlbnRyeQorICogZGVzdHJveSBhIGRlYWQgdm9sdW1lIGxvY2F0aW9uIHJlY29yZAogICovCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2Rlc3Ryb3koc3RydWN0IGFmc192bG9jYXRpb24gKnZsKQoreworCV9lbnRlcigiJXAiLCB2bCk7CisKICNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKLQkJCQkJCSAgICAgY29uc3Qgdm9pZCAqZW50cnkpCi17Ci0JY29uc3Qgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKnZsZGIgPSBlbnRyeTsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0gdGFyZ2V0OwotCi0JX2VudGVyKCJ7JXN9LHslc30iLCB2bG9jYXRpb24tPnZsZGIubmFtZSwgdmxkYi0+bmFtZSk7Ci0KLQlpZiAoc3RybmNtcCh2bG9jYXRpb24tPnZsZGIubmFtZSwgdmxkYi0+bmFtZSwgc2l6ZW9mKHZsZGItPm5hbWUpKSA9PSAwCi0JICAgICkgewotCQlpZiAoIXZsb2NhdGlvbi0+dmFsaWQgfHwKLQkJICAgIHZsb2NhdGlvbi0+dmxkYi5ydGltZSA9PSB2bGRiLT5ydGltZQotCQkgICAgKSB7Ci0JCQl2bG9jYXRpb24tPnZsZGIgPSAqdmxkYjsKLQkJCXZsb2NhdGlvbi0+dmFsaWQgPSAxOwotCQkJX2xlYXZlKCIgPSBTVUNDRVNTIFtjLT5tXSIpOwotCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKLQkJfQotCQkvKiBuZWVkIHRvIHVwZGF0ZSBjYWNoZSBpZiBjYWNoZWQgaW5mbyBkaWZmZXJzICovCi0JCWVsc2UgaWYgKG1lbWNtcCgmdmxvY2F0aW9uLT52bGRiLCB2bGRiLCBzaXplb2YoKnZsZGIpKSAhPSAwKSB7Ci0JCQkvKiBkZWxldGUgaWYgVklEcyBmb3IgdGhpcyBuYW1lIGRpZmZlciAqLwotCQkJaWYgKG1lbWNtcCgmdmxvY2F0aW9uLT52bGRiLnZpZCwKLQkJCQkgICAmdmxkYi0+dmlkLAotCQkJCSAgIHNpemVvZih2bGRiLT52aWQpKSAhPSAwKSB7Ci0JCQkJX2xlYXZlKCIgPSBERUxFVEUiKTsKLQkJCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTX0RFTEVURTsKLQkJCX0KLQotCQkJX2xlYXZlKCIgPSBVUERBVEUiKTsKLQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfVVBEQVRFOwotCQl9Ci0JCWVsc2UgewotCQkJX2xlYXZlKCIgPSBTVUNDRVNTIik7Ci0JCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOwotCQl9Ci0JfQotCi0JX2xlYXZlKCIgPSBGQUlMRUQiKTsKLQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Ci19IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKCkgKi8KKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZsLT5jYWNoZSwgMCk7CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWFmc19wdXRfY2VsbCh2bC0+Y2VsbCk7CisJa2ZyZWUodmwpOworfQorCiAvKgotICogdXBkYXRlIGEgVkxEQiByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICogcmVhcCBkZWFkIHZvbHVtZSBsb2NhdGlvbiByZWNvcmRzCiAgKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQorc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9yZWFwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiID0gZW50cnk7Ci0Jc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IHNvdXJjZTsKKwlMSVNUX0hFQUQoY29ycHNlcyk7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsOworCXVuc2lnbmVkIGxvbmcgZGVsYXksIGV4cGlyeTsKKwl0aW1lX3Qgbm93OwogCiAJX2VudGVyKCIiKTsKIAotCSp2bGRiID0gdmxvY2F0aW9uLT52bGRiOworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX2dyYXZleWFyZF9sb2NrKTsKIAotfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUoKSAqLwotI2VuZGlmCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNfdmxvY2F0aW9uX2dyYXZleWFyZCkpIHsKKwkJdmwgPSBsaXN0X2VudHJ5KGFmc192bG9jYXRpb25fZ3JhdmV5YXJkLm5leHQsCisJCQkJc3RydWN0IGFmc192bG9jYXRpb24sIGdyYXZlKTsKKworCQlfZGVidWcoImNoZWNrICVwIiwgdmwpOworCisJCS8qIHRoZSBxdWV1ZSBpcyBvcmRlcmVkIG1vc3QgZGVhZCBmaXJzdCAqLworCQlleHBpcnkgPSB2bC0+dGltZV9vZl9kZWF0aCArIGFmc192bG9jYXRpb25fdGltZW91dDsKKwkJaWYgKGV4cGlyeSA+IG5vdykgeworCQkJZGVsYXkgPSAoZXhwaXJ5IC0gbm93KSAqIEhaOworCQkJX2RlYnVnKCJkZWxheSAlbHUiLCBkZWxheSk7CisJCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3Zsb2NhdGlvbl9yZWFwLAorCQkJCQkJICAgZGVsYXkpKSB7CisJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWZzX3Zsb2NhdGlvbl9yZWFwKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCwKKwkJCQkJCSAgICAgIGRlbGF5KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrKCZ2bC0+Y2VsbC0+dmxfbG9jayk7CisJCWlmIChhdG9taWNfcmVhZCgmdmwtPnVzYWdlKSA+IDApIHsKKwkJCV9kZWJ1Zygibm8gcmVhcCIpOworCQkJbGlzdF9kZWxfaW5pdCgmdmwtPmdyYXZlKTsKKwkJfSBlbHNlIHsKKwkJCV9kZWJ1ZygicmVhcCIpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnZsLT5ncmF2ZSwgJmNvcnBzZXMpOworCQkJbGlzdF9kZWxfaW5pdCgmdmwtPmxpbmspOworCQl9CisJCXNwaW5fdW5sb2NrKCZ2bC0+Y2VsbC0+dmxfbG9jayk7CisJfQorCisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkX2xvY2spOworCisJLyogbm93IHJlYXAgdGhlIGNvcnBzZXMgd2UndmUgZXh0cmFjdGVkICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb3Jwc2VzKSkgeworCQl2bCA9IGxpc3RfZW50cnkoY29ycHNlcy5uZXh0LCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgZ3JhdmUpOworCQlsaXN0X2RlbCgmdmwtPmdyYXZlKTsKKwkJYWZzX3Zsb2NhdGlvbl9kZXN0cm95KHZsKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgVkwgdXBkYXRlIHByb2Nlc3MKKyAqLworaW50IF9faW5pdCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9pbml0KHZvaWQpCit7CisJYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfdmx1cGRhdGVkIik7CisJcmV0dXJuIGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciA/IDAgOiAtRU5PTUVNOworfQorCisvKgorICogZGlzY2FyZCBhbGwgdGhlIHZvbHVtZSBsb2NhdGlvbiByZWNvcmRzIGZvciBybW1vZAorICovCit2b2lkIF9fZXhpdCBhZnNfdmxvY2F0aW9uX3B1cmdlKHZvaWQpCit7CisJYWZzX3Zsb2NhdGlvbl90aW1lb3V0ID0gMDsKKworCXNwaW5fbG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCWxpc3RfZGVsX2luaXQoJmFmc192bG9jYXRpb25fdXBkYXRlcyk7CisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZSk7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciwKKwkJCSAgICZhZnNfdmxvY2F0aW9uX3VwZGF0ZSwgMCk7CisJZGVzdHJveV93b3JrcXVldWUoYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXAsIDApOworfQorCisvKgorICogdXBkYXRlIGEgdm9sdW1lIGxvY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gdmxkYjsKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwsICp4dmw7CisJdGltZV90IG5vdzsKKwlsb25nIHRpbWVvdXQ7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlub3cgPSBnZXRfc2Vjb25kcygpOworCisJLyogZmluZCBhIHJlY29yZCB0byB1cGRhdGUgKi8KKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKwlmb3IgKDs7KSB7CisJCWlmIChsaXN0X2VtcHR5KCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXMpKSB7CisJCQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCQkJX2xlYXZlKCIgW25vdGhpbmddIik7CisJCQlyZXR1cm47CisJCX0KKworCQl2bCA9IGxpc3RfZW50cnkoYWZzX3Zsb2NhdGlvbl91cGRhdGVzLm5leHQsCisJCQkJc3RydWN0IGFmc192bG9jYXRpb24sIHVwZGF0ZSk7CisJCWlmIChhdG9taWNfcmVhZCgmdmwtPnVzYWdlKSA+IDApCisJCQlicmVhazsKKwkJbGlzdF9kZWxfaW5pdCgmdmwtPnVwZGF0ZSk7CisJfQorCisJdGltZW91dCA9IHZsLT51cGRhdGVfYXQgLSBub3c7CisJaWYgKHRpbWVvdXQgPiAwKSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIsCisJCQkJICAgJmFmc192bG9jYXRpb25fdXBkYXRlLCB0aW1lb3V0ICogSFopOworCQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCQlfbGVhdmUoIiBbbm90aGluZ10iKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGVsX2luaXQoJnZsLT51cGRhdGUpOworCWF0b21pY19pbmMoJnZsLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKworCS8qIHdlIGNhbiBub3cgcGVyZm9ybSB0aGUgdXBkYXRlICovCisJX2RlYnVnKCJ1cGRhdGUgJXMiLCB2bC0+dmxkYi5uYW1lKTsKKwl2bC0+c3RhdGUgPSBBRlNfVkxfVVBEQVRJTkc7CisJdmwtPnVwZF9yZWpfY250ID0gMDsKKwl2bC0+dXBkX2J1c3lfY250ID0gMDsKKworCXJldCA9IGFmc192bG9jYXRpb25fdXBkYXRlX3JlY29yZCh2bCwgTlVMTCwgJnZsZGIpOworCXNwaW5fbG9jaygmdmwtPmxvY2spOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlhZnNfdmxvY2F0aW9uX2FwcGx5X3VwZGF0ZSh2bCwgJnZsZGIpOworCQl2bC0+c3RhdGUgPSBBRlNfVkxfVkFMSUQ7CisJCXdha2VfdXAoJnZsLT53YWl0cSk7CisJCWJyZWFrOworCWNhc2UgLUVOT01FRElVTToKKwkJdmwtPnN0YXRlID0gQUZTX1ZMX1ZPTFVNRV9ERUxFVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2bC0+c3RhdGUgPSBBRlNfVkxfVU5DRVJUQUlOOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnZsLT5sb2NrKTsKKworCS8qIGFuZCB0aGVuIHJlc2NoZWR1bGUgKi8KKwlfZGVidWcoInJlc2NoZWR1bGUiKTsKKwl2bC0+dXBkYXRlX2F0ID0gZ2V0X3NlY29uZHMoKSArIGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVvdXQ7CisKKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKworCWlmICghbGlzdF9lbXB0eSgmYWZzX3Zsb2NhdGlvbl91cGRhdGVzKSkgeworCQkvKiBuZXh0IHVwZGF0ZSBpbiAxMCBtaW51dGVzLCBidXQgd2FpdCBhdCBsZWFzdCAxIHNlY29uZCBtb3JlCisJCSAqIHRoYW4gdGhlIG5ld2VzdCByZWNvcmQgYWxyZWFkeSBxdWV1ZWQgc28gdGhhdCB3ZSBkb24ndCBzcGFtCisJCSAqIHRoZSBWTCBzZXJ2ZXIgc3VkZGVubHkgd2l0aCBsb3RzIG9mIHJlcXVlc3RzCisJCSAqLworCQl4dmwgPSBsaXN0X2VudHJ5KGFmc192bG9jYXRpb25fdXBkYXRlcy5wcmV2LAorCQkJCSBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkYXRlKTsKKwkJaWYgKHZsLT51cGRhdGVfYXQgPD0geHZsLT51cGRhdGVfYXQpCisJCQl2bC0+dXBkYXRlX2F0ID0geHZsLT51cGRhdGVfYXQgKyAxOworCQl4dmwgPSBsaXN0X2VudHJ5KGFmc192bG9jYXRpb25fdXBkYXRlcy5uZXh0LAorCQkJCSBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkYXRlKTsKKwkJdGltZW91dCA9IHh2bC0+dXBkYXRlX2F0IC0gbm93OworCQlpZiAodGltZW91dCA8IDApCisJCQl0aW1lb3V0ID0gMDsKKwl9IGVsc2UgeworCQl0aW1lb3V0ID0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZW91dDsKKwl9CisKKwlBU1NFUlQobGlzdF9lbXB0eSgmdmwtPnVwZGF0ZSkpOworCisJbGlzdF9hZGRfdGFpbCgmdmwtPnVwZGF0ZSwgJmFmc192bG9jYXRpb25fdXBkYXRlcyk7CisKKwlfZGVidWcoInRpbWVvdXQgJWxkIiwgdGltZW91dCk7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciwKKwkJCSAgICZhZnNfdmxvY2F0aW9uX3VwZGF0ZSwgdGltZW91dCAqIEhaKTsKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCWFmc19wdXRfdmxvY2F0aW9uKHZsKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bm9kZS5jIGIvZnMvYWZzL3Zub2RlLmMKaW5kZXggY2Y2MmRhNS4uYTE5MDRhYiAxMDA2NDQKLS0tIGEvZnMvYWZzL3Zub2RlLmMKKysrIGIvZnMvYWZzL3Zub2RlLmMKQEAgLTEsNiArMSw2IEBACi0vKiB2bm9kZS5jOiBBRlMgdm5vZGUgbWFuYWdlbWVudAorLyogQUZTIHZub2RlIG1hbmFnZW1lbnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xNCwxNDIgKzE0LDIzNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgImNtc2VydmljZS5oIgotI2luY2x1ZGUgImZzY2xpZW50LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJ2bm9kZS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXN0YXRpYyB2b2lkIGFmc192bm9kZV9jYl90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpOwotCi1zdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfdm5vZGVfY2JfdGltZWRfb3V0X29wcyA9IHsKLQkudGltZWRfb3V0CT0gYWZzX3Zub2RlX2NiX3RpbWVkX291dCwKLX07Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KTsKLXN0YXRpYyB2b2lkIGFmc192bm9kZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7Ci0KLXN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmID0gewotCS5uYW1lCQk9ICJ2bm9kZSIsCi0JLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlKSwKLQkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgNCB9LAotCS5tYXRjaAkJPSBhZnNfdm5vZGVfY2FjaGVfbWF0Y2gsCi0JLnVwZGF0ZQkJPSBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlLAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaGFuZGxlIGEgY2FsbGJhY2sgdGltaW5nIG91dAotICogVE9ETzogcmV0YWluIGEgcmVmIHRvIHZub2RlIHN0cnVjdCBmb3IgYW4gb3V0c3RhbmRpbmcgY2FsbGJhY2sgdGltZW91dAotICovCi1zdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQorI2lmIDAKK3N0YXRpYyBub2lubGluZSBib29sIGR1bXBfdHJlZV9hdXgoc3RydWN0IHJiX25vZGUgKm5vZGUsIHN0cnVjdCByYl9ub2RlICpwYXJlbnQsCisJCQkJICAgaW50IGRlcHRoLCBjaGFyIGxyKQogewotCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXI7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJYm9vbCBiYWQgPSBmYWxzZTsKIAotCXZub2RlID0gbGlzdF9lbnRyeSh0aW1lciwgc3RydWN0IGFmc192bm9kZSwgY2JfdGltZW91dCk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlfZW50ZXIoIiVwIiwgdm5vZGUpOworCWlmIChub2RlLT5yYl9sZWZ0KQorCQliYWQgPSBkdW1wX3RyZWVfYXV4KG5vZGUtPnJiX2xlZnQsIG5vZGUsIGRlcHRoICsgMiwgJy8nKTsKIAotCS8qIHNldCB0aGUgY2hhbmdlZCBmbGFnIGluIHRoZSB2bm9kZSBhbmQgcmVsZWFzZSB0aGUgc2VydmVyICovCi0Jc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0KLQlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBOVUxMKTsKLQlpZiAob2xkc2VydmVyKSB7Ci0JCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKLQotCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKLQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCi0JCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOwotCQlzcGluX3VubG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwl2bm9kZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3Byb21pc2UpOworCV9kZWJ1ZygiJWMgJSouKnMlYyVwIHslZH0iLAorCSAgICAgICByYl9pc19yZWQobm9kZSkgPyAnUicgOiAnQicsCisJICAgICAgIGRlcHRoLCBkZXB0aCwgIiIsIGxyLAorCSAgICAgICB2bm9kZSwgdm5vZGUtPmNiX2V4cGlyZXNfYXQpOworCWlmIChyYl9wYXJlbnQobm9kZSkgIT0gcGFyZW50KSB7CisJCXByaW50aygiQkFEOiAlcCAhPSAlcFxuIiwgcmJfcGFyZW50KG5vZGUpLCBwYXJlbnQpOworCQliYWQgPSB0cnVlOwogCX0KIAotCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJaWYgKG5vZGUtPnJiX3JpZ2h0KQorCQliYWQgfD0gZHVtcF90cmVlX2F1eChub2RlLT5yYl9yaWdodCwgbm9kZSwgZGVwdGggKyAyLCAnXFwnKTsKIAotCWFmc19wdXRfc2VydmVyKG9sZHNlcnZlcik7CisJcmV0dXJuIGJhZDsKK30KIAotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KCkgKi8KK3N0YXRpYyBub2lubGluZSB2b2lkIGR1bXBfdHJlZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQoreworCV9lbnRlcigiJXMiLCBuYW1lKTsKKwlpZiAoZHVtcF90cmVlX2F1eChzZXJ2ZXItPmNiX3Byb21pc2VzLnJiX25vZGUsIE5VTEwsIDAsICctJykpCisJCUJVRygpOworfQorI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBmaW5pc2ggb2ZmIHVwZGF0aW5nIHRoZSByZWNvcmRlZCBzdGF0dXMgb2YgYSBmaWxlCisgKiBpbnNlcnQgYSB2bm9kZSBpbnRvIHRoZSBiYWNraW5nIHNlcnZlcidzIHZub2RlIHRyZWUKKyAqLworc3RhdGljIHZvaWQgYWZzX2luc3RhbGxfdm5vZGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpvbGRfc2VydmVyID0gdm5vZGUtPnNlcnZlcjsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp4dm5vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCisJX2VudGVyKCIlcCwlcCIsIHZub2RlLCBzZXJ2ZXIpOworCisJaWYgKG9sZF9zZXJ2ZXIpIHsKKwkJc3Bpbl9sb2NrKCZvbGRfc2VydmVyLT5mc19sb2NrKTsKKwkJcmJfZXJhc2UoJnZub2RlLT5zZXJ2ZXJfcmIsICZvbGRfc2VydmVyLT5mc192bm9kZXMpOworCQlzcGluX3VubG9jaygmb2xkX3NlcnZlci0+ZnNfbG9jayk7CisJfQorCisJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKwl2bm9kZS0+c2VydmVyID0gc2VydmVyOworCWFmc19wdXRfc2VydmVyKG9sZF9zZXJ2ZXIpOworCisJLyogaW5zZXJ0IGludG8gdGhlIHNlcnZlcidzIHZub2RlIHRyZWUgaW4gRklEIG9yZGVyICovCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJnNlcnZlci0+ZnNfdm5vZGVzLnJiX25vZGU7CisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQl4dm5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBhZnNfdm5vZGUsIHNlcnZlcl9yYik7CisJCWlmICh2bm9kZS0+ZmlkLnZpZCA8IHh2bm9kZS0+ZmlkLnZpZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodm5vZGUtPmZpZC52aWQgPiB4dm5vZGUtPmZpZC52aWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmICh2bm9kZS0+ZmlkLnZub2RlIDwgeHZub2RlLT5maWQudm5vZGUpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHZub2RlLT5maWQudm5vZGUgPiB4dm5vZGUtPmZpZC52bm9kZSkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UgaWYgKHZub2RlLT5maWQudW5pcXVlIDwgeHZub2RlLT5maWQudW5pcXVlKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmICh2bm9kZS0+ZmlkLnVuaXF1ZSA+IHh2bm9kZS0+ZmlkLnVuaXF1ZSkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCUJVRygpOyAvKiBjYW4ndCBoYXBwZW4gdW5sZXNzIGFmc19pZ2V0KCkgbWFsZnVuY3Rpb25zICovCisJfQorCisJcmJfbGlua19ub2RlKCZ2bm9kZS0+c2VydmVyX3JiLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmdm5vZGUtPnNlcnZlcl9yYiwgJnNlcnZlci0+ZnNfdm5vZGVzKTsKKworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBpbnNlcnQgYSB2bm9kZSBpbnRvIHRoZSBwcm9taXNpbmcgc2VydmVyJ3MgdXBkYXRlL2V4cGlyYXRpb24gdHJlZQorICogLSBjYWxsZXIgbXVzdCBob2xkIHZub2RlLT5sb2NrCisgKi8KK3N0YXRpYyB2b2lkIGFmc192bm9kZV9ub3RlX3Byb21pc2Uoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJICAgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqb2xkX3NlcnZlcjsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp4dm5vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCisJX2VudGVyKCIlcCwlcCIsIHZub2RlLCBzZXJ2ZXIpOworCisJQVNTRVJUKHNlcnZlciAhPSBOVUxMKTsKKworCW9sZF9zZXJ2ZXIgPSB2bm9kZS0+c2VydmVyOworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJaWYgKHNlcnZlciA9PSBvbGRfc2VydmVyICYmCisJCSAgICB2bm9kZS0+Y2JfZXhwaXJlcyA9PSB2bm9kZS0+Y2JfZXhwaXJlc19hdCkgeworCQkJX2xlYXZlKCIgW25vIGNoYW5nZV0iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNwaW5fbG9jaygmb2xkX3NlcnZlci0+Y2JfbG9jayk7CisJCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJCV9kZWJ1ZygiZGVsZXRlIik7CisJCQlyYl9lcmFzZSgmdm5vZGUtPmNiX3Byb21pc2UsICZvbGRfc2VydmVyLT5jYl9wcm9taXNlcyk7CisJCQl2bm9kZS0+Y2JfcHJvbWlzZWQgPSBmYWxzZTsKKwkJfQorCQlzcGluX3VubG9jaygmb2xkX3NlcnZlci0+Y2JfbG9jayk7CisJfQorCisJaWYgKHZub2RlLT5zZXJ2ZXIgIT0gc2VydmVyKQorCQlhZnNfaW5zdGFsbF92bm9kZSh2bm9kZSwgc2VydmVyKTsKKworCXZub2RlLT5jYl9leHBpcmVzX2F0ID0gdm5vZGUtPmNiX2V4cGlyZXM7CisJX2RlYnVnKCJQUk9NSVNFIG9uICVwIHslbHV9IiwKKwkgICAgICAgdm5vZGUsICh1bnNpZ25lZCBsb25nKSB2bm9kZS0+Y2JfZXhwaXJlc19hdCk7CisKKwkvKiBhYnVzZSBhbiBSQi10cmVlIHRvIGhvbGQgdGhlIGV4cGlyYXRpb24gb3JkZXIgKHdlIG1heSBoYXZlIG11bHRpcGxlCisJICogaXRlbXMgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUpICovCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJnNlcnZlci0+Y2JfcHJvbWlzZXMucmJfbm9kZTsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXh2bm9kZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGFmc192bm9kZSwgY2JfcHJvbWlzZSk7CisJCWlmICh2bm9kZS0+Y2JfZXhwaXJlc19hdCA8IHh2bm9kZS0+Y2JfZXhwaXJlc19hdCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJnZub2RlLT5jYl9wcm9taXNlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmdm5vZGUtPmNiX3Byb21pc2UsICZzZXJ2ZXItPmNiX3Byb21pc2VzKTsKKwl2bm9kZS0+Y2JfcHJvbWlzZWQgPSB0cnVlOworCisJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGhhbmRsZSByZW1vdGUgZmlsZSBkZWxldGlvbiBieSBkaXNjYXJkaW5nIHRoZSBjYWxsYmFjayBwcm9taXNlCisgKi8KK3N0YXRpYyB2b2lkIGFmc192bm9kZV9kZWxldGVkX3JlbW90ZWx5KHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisKKwlzZXRfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKTsKKworCXNlcnZlciA9IHZub2RlLT5zZXJ2ZXI7CisJaWYgKHZub2RlLT5jYl9wcm9taXNlZCkgeworCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJCXJiX2VyYXNlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQkJdm5vZGUtPmNiX3Byb21pc2VkID0gZmFsc2U7CisJCX0KKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJfQorCisJc3Bpbl9sb2NrKCZ2bm9kZS0+c2VydmVyLT5mc19sb2NrKTsKKwlyYl9lcmFzZSgmdm5vZGUtPnNlcnZlcl9yYiwgJnZub2RlLT5zZXJ2ZXItPmZzX3Zub2Rlcyk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5zZXJ2ZXItPmZzX2xvY2spOworCisJdm5vZGUtPnNlcnZlciA9IE5VTEw7CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKK30KKworLyoKKyAqIGZpbmlzaCBvZmYgdXBkYXRpbmcgdGhlIHJlY29yZGVkIHN0YXR1cyBvZiBhIGZpbGUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisgKiBvcGVyYXRpb24gY29tcGxldGlvbgogICogLSBzdGFydHMgY2FsbGJhY2sgZXhwaXJ5IHRpbWVyCiAgKiAtIGFkZHMgdG8gc2VydmVyJ3MgY2FsbGJhY2sgbGlzdAogICovCi1zdGF0aWMgdm9pZCBhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKLQkJCQkJICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCQkgICAgIGludCByZXQpCit2b2lkIGFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCiB7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKm9sZHNlcnZlciA9IE5VTEw7CiAKLQlfZW50ZXIoIiVwLCVwLCVkIiwgdm5vZGUsIHNlcnZlciwgcmV0KTsKKwlfZW50ZXIoIiVwLCVwIiwgdm5vZGUsIHNlcnZlcik7CiAKIAlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKLQotCXZub2RlLT5mbGFncyAmPSB+QUZTX1ZOT0RFX0NIQU5HRUQ7Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJLyogYWRqdXN0IHRoZSBjYWxsYmFjayB0aW1lb3V0IGFwcHJvcHJpYXRlbHkgKi8KLQkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0LAotCQkJCQl2bm9kZS0+Y2JfZXhwaXJ5ICogSFopOwotCi0JCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7Ci0JCWxpc3RfbW92ZV90YWlsKCZ2bm9kZS0+Y2JfaGFzaF9saW5rLAotCQkJICAgICAgJmFmc19jYl9oYXNoKHNlcnZlciwgJnZub2RlLT5maWQpKTsKLQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCi0JCS8qIHN3YXAgcmVmIHRvIG9sZCBjYWxsYmFjayBzZXJ2ZXIgd2l0aCB0aGF0IGZvciBuZXcgY2FsbGJhY2sKLQkJICogc2VydmVyICovCi0JCW9sZHNlcnZlciA9IHhjaGcoJnZub2RlLT5jYl9zZXJ2ZXIsIHNlcnZlcik7Ci0JCWlmIChvbGRzZXJ2ZXIgIT0gc2VydmVyKSB7Ci0JCQlpZiAob2xkc2VydmVyKSB7Ci0JCQkJc3Bpbl9sb2NrKCZvbGRzZXJ2ZXItPmNiX2xvY2spOwotCQkJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9saW5rKTsKLQkJCQlzcGluX3VubG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKLQkJCX0KLQotCQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKLQkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnZub2RlLT5jYl9saW5rLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7Ci0JCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIHNhbWUgc2VydmVyICovCi0JCQlvbGRzZXJ2ZXIgPSBOVUxMOwotCQl9Ci0JfQotCWVsc2UgaWYgKHJldCA9PSAtRU5PRU5UKSB7Ci0JCS8qIHRoZSBmaWxlIHdhcyBkZWxldGVkIC0gY2xlYXIgdGhlIGNhbGxiYWNrIHRpbWVvdXQgKi8KLQkJb2xkc2VydmVyID0geGNoZygmdm5vZGUtPmNiX3NlcnZlciwgTlVMTCk7Ci0JCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ2bm9kZS0+Y2JfdGltZW91dCk7Ci0KLQkJX2RlYnVnKCJnb3QgTk9FTlQgZnJvbSBzZXJ2ZXIgLSBtYXJraW5nIGZpbGUgZGVsZXRlZCIpOwotCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0RFTEVURUQ7Ci0JfQotCisJY2xlYXJfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpOworCWFmc192bm9kZV9ub3RlX3Byb21pc2Uodm5vZGUsIHNlcnZlcik7CiAJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKLQorCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOwogCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CiAKIAl3YWtlX3VwX2FsbCgmdm5vZGUtPnVwZGF0ZV93YWl0cSk7Ci0KIAlhZnNfcHV0X3NlcnZlcihvbGRzZXJ2ZXIpOwotCiAJX2xlYXZlKCIiKTsKK30KIAotfSAvKiBlbmQgYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUoKSAqLworLyoKKyAqIGZpbmlzaCBvZmYgdXBkYXRpbmcgdGhlIHJlY29yZGVkIHN0YXR1cyBvZiBhIGZpbGUgYWZ0ZXIgYW4gb3BlcmF0aW9uIGZhaWxlZAorICovCitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIGludCByZXQpCit7CisJX2VudGVyKCIlcCwlZCIsIHZub2RlLCByZXQpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwljbGVhcl9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncyk7CisKKwlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJLyogdGhlIGZpbGUgd2FzIGRlbGV0ZWQgb24gdGhlIHNlcnZlciAqLworCQlfZGVidWcoImdvdCBOT0VOVCBmcm9tIHNlcnZlciAtIG1hcmtpbmcgZmlsZSBkZWxldGVkIik7CisJCWFmc192bm9kZV9kZWxldGVkX3JlbW90ZWx5KHZub2RlKTsKKwl9CisKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwl3YWtlX3VwX2FsbCgmdm5vZGUtPnVwZGF0ZV93YWl0cSk7CisJX2xlYXZlKCIiKTsKK30KKwogLyoKICAqIGZldGNoIGZpbGUgc3RhdHVzIGZyb20gdGhlIHZvbHVtZQogICogLSBkb24ndCBpc3N1ZSBhIGZldGNoIGlmOgpAQCAtMTU3LDkgKzI1MiwxMSBAQAogICogICAtIHRoZXJlIGFyZSBhbnkgb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCBmZXRjaCB0aGUgc3RhdHVzCiAgKiAtIFRPRE8gaW1wbGVtZW50IGxvY2FsIGNhY2hpbmcKICAqLwotaW50IGFmc192bm9kZV9mZXRjaF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCitpbnQgYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCSAgIHN0cnVjdCBhZnNfdm5vZGUgKmF1dGhfdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXVuc2lnbmVkIGxvbmcgYWNsX29yZGVyOwogCWludCByZXQ7CiAKIAlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwpAQCAtMTY4LDM4ICsyNjUsNDkgQEAKIAkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCiAJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CiAKLQlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkgJiYgdm5vZGUtPmNiX3NlcnZlcikgeworCWlmICghdGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykgJiYKKwkgICAgdm5vZGUtPmNiX3Byb21pc2VkKSB7CiAJCV9sZWF2ZSgiIFt1bmNoYW5nZWRdIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgeworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncykpIHsKIAkJX2xlYXZlKCIgW2RlbGV0ZWRdIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCWFjbF9vcmRlciA9IDA7CisJaWYgKGF1dGhfdm5vZGUpCisJCWFjbF9vcmRlciA9IGF1dGhfdm5vZGUtPmFjbF9vcmRlcjsKKwogCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwogCi0JaWYgKCEodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0NIQU5HRUQpKSB7CisJaWYgKCF0ZXN0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKSAmJgorCSAgICB2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKIAkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKIAkJX2xlYXZlKCIgW3VuY2hhbmdlZF0iKTsKIAkJcmV0dXJuIDA7CiAJfQogCisJQVNTRVJUQ01QKHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisKIAlpZiAodm5vZGUtPnVwZGF0ZV9jbnQgPiAwKSB7CiAJCS8qIHNvbWVvbmUgZWxzZSBzdGFydGVkIGEgZmV0Y2ggKi8KKwkJX2RlYnVnKCJ3YWl0IG9uIGZldGNoICVkIiwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJQVNTRVJUKG15c2VsZi5mdW5jICE9IE5VTEwpOwogCQlhZGRfd2FpdF9xdWV1ZSgmdm5vZGUtPnVwZGF0ZV93YWl0cSwgJm15c2VsZik7CiAKIAkJLyogd2FpdCBmb3IgdGhlIHN0YXR1cyB0byBiZSB1cGRhdGVkICovCiAJCWZvciAoOzspIHsKLQkJCWlmICghKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9DSEFOR0VEKSkKKwkJCWlmICghdGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykpCiAJCQkJYnJlYWs7Ci0JCQlpZiAodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpCisJCQlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKQogCQkJCWJyZWFrOwogCi0JCQkvKiBpdCBnb3QgdXBkYXRlZCBhbmQgaW52YWxpZGF0ZWQgYWxsIGJlZm9yZSB3ZSBzYXcKLQkJCSAqIGl0ICovCisJCQkvKiBjaGVjayB0byBzZWUgaWYgaXQgZ290IHVwZGF0ZWQgYW5kIGludmFsaWRhdGVkIGFsbAorCQkJICogYmVmb3JlIHdlIHNhdyBpdCAqLwogCQkJaWYgKHZub2RlLT51cGRhdGVfY250ID09IDApIHsKIAkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdm5vZGUtPnVwZGF0ZV93YWl0cSwKIAkJCQkJCSAgJm15c2VsZik7CkBAIC0yMTksMTAgKzMyNywxMSBAQAogCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0JCXJldHVybiB2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCA/IC1FTk9FTlQgOiAwOworCQlyZXR1cm4gdGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpID8KKwkJCS1FTk9FTlQgOiAwOwogCX0KIAotIGdldF9hbnl3YXk6CitnZXRfYW55d2F5OgogCS8qIG9rYXkuLi4gd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBpbml0aWF0ZSB0aGUgb3AgKi8KIAl2bm9kZS0+dXBkYXRlX2NudCsrOwogCkBAIC0yMzIsMzkgKzM0MSw2MCBAQAogCSAqIHZub2RlICovCiAJZG8gewogCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCi0JCXJldCA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlLT52b2x1bWUsICZzZXJ2ZXIpOwotCQlpZiAocmV0PDApCi0JCQlyZXR1cm4gcmV0OworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOwogCi0JCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlcHslMDh4fSIsCisJCSAgICAgICBzZXJ2ZXIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKIAotCQlyZXQgPSBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cyhzZXJ2ZXIsIHZub2RlLCBOVUxMKTsKKwkJcmV0ID0gYWZzX2ZzX2ZldGNoX2ZpbGVfc3RhdHVzKHNlcnZlciwga2V5LCB2bm9kZSwgTlVMTCwKKwkJCQkJICAgICAgICZhZnNfc3luY19jYWxsKTsKIAotCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCBzZXJ2ZXIsIHJldCkpOworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKIAogCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KLQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyLCByZXQpOworCWlmIChyZXQgPT0gMCkgeworCQlfZGVidWcoImFkanVzdCIpOworCQlpZiAoYXV0aF92bm9kZSkKKwkJCWFmc19jYWNoZV9wZXJtaXQodm5vZGUsIGtleSwgYWNsX29yZGVyKTsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJfSBlbHNlIHsKKwkJX2RlYnVnKCJmYWlsZWQgWyVkXSIsIHJldCk7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKKwl9CiAKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKworCV9sZWF2ZSgiID0gJWQgW2NudCAlZF0iLCByZXQsIHZub2RlLT51cGRhdGVfY250KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Zub2RlX2ZldGNoX3N0YXR1cygpICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCiAvKgogICogZmV0Y2ggZmlsZSBkYXRhIGZyb20gdGhlIHZvbHVtZQotICogLSBUT0RPIGltcGxlbWVudCBjYWNoaW5nIGFuZCBzZXJ2ZXIgZmFpbG92ZXIKKyAqIC0gVE9ETyBpbXBsZW1lbnQgY2FjaGluZwogICovCi1pbnQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkgc3RydWN0IGFmc19yeGZzX2ZldGNoX2Rlc2NyaXB0b3IgKmRlc2MpCitpbnQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKKwkJCSBvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAJaW50IHJldDsKIAotCV9lbnRlcigiJXMseyV1LCV1LCV1fSIsCisJX2VudGVyKCIlc3sldSwldSwldX0sJXgsLCwiLAogCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKIAkgICAgICAgdm5vZGUtPmZpZC52aWQsCiAJICAgICAgIHZub2RlLT5maWQudm5vZGUsCi0JICAgICAgIHZub2RlLT5maWQudW5pcXVlKTsKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSk7CiAKIAkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyAqLwogCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwpAQCAtMjc1LDEyMCArNDA1LDM1MSBAQAogCSAqIHZub2RlICovCiAJZG8gewogCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCi0JCXJldCA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlLT52b2x1bWUsICZzZXJ2ZXIpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CiAKIAkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKIAotCQlyZXQgPSBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoc2VydmVyLCB2bm9kZSwgZGVzYywgTlVMTCk7CisJCXJldCA9IGFmc19mc19mZXRjaF9kYXRhKHNlcnZlciwga2V5LCB2bm9kZSwgb2Zmc2V0LCBsZW5ndGgsCisJCQkJCXBhZ2UsICZhZnNfc3luY19jYWxsKTsKIAotCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCBzZXJ2ZXIsIHJldCkpOworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKIAogCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KLQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyLCByZXQpOworCWlmIChyZXQgPT0gMCkgeworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwl9IGVsc2UgeworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQodm5vZGUsIHJldCk7CisJfQogCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIAotfSAvKiBlbmQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoKSAqLworbm9fc2VydmVyOgorCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250LS07CisJQVNTRVJUQ01QKHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogYnJlYWsgYW55IG91dHN0YW5kaW5nIGNhbGxiYWNrIG9uIGEgdm5vZGUKLSAqIC0gb25seSByZWxldmVudCB0byBzZXJ2ZXIgdGhhdCBpc3N1ZWQgaXQKKyAqIG1ha2UgYSBmaWxlIG9yIGEgZGlyZWN0b3J5CiAgKi8KLWludCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK2ludCBhZnNfdm5vZGVfY3JlYXRlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLCBzdHJ1Y3QgYWZzX2ZpZCAqbmV3ZmlkLAorCQkgICAgIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKm5ld3N0YXR1cywKKwkJICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICpuZXdjYiwgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQogewogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAJaW50IHJldDsKIAotCV9lbnRlcigiJXMseyV1LCV1LCV1fSIsCisJX2VudGVyKCIlc3sldSwldSwldX0sJXgsJXMsLCIsCiAJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAogCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKIAkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKLQkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUpOworCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpLAorCSAgICAgICBuYW1lKTsKIAotCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7Ci0Jc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCi0JLyogc2V0IHRoZSBjaGFuZ2VkIGZsYWcgaW4gdGhlIHZub2RlIGFuZCByZWxlYXNlIHRoZSBzZXJ2ZXIgKi8KKwkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyBvbiB0aGUgZGlyZWN0b3J5IHdlJ3JlIGNyZWF0aW5nIGluICovCiAJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0KLQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOwotCi0Jc2VydmVyID0geGNoZygmdm5vZGUtPmNiX3NlcnZlciwgTlVMTCk7Ci0JaWYgKHNlcnZlcikgewotCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0NIQU5HRUQ7Ci0KLQkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwotCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7Ci0JCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwotCX0KLQorCXZub2RlLT51cGRhdGVfY250Kys7CiAJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKIAotCXJldCA9IDA7Ci0JaWYgKHNlcnZlcikgewotCQlyZXQgPSBhZnNfcnhmc19naXZlX3VwX2NhbGxiYWNrKHNlcnZlciwgdm5vZGUpOwotCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX2NyZWF0ZShzZXJ2ZXIsIGtleSwgdm5vZGUsIG5hbWUsIG1vZGUsIG5ld2ZpZCwKKwkJCQkgICAgbmV3c3RhdHVzLCBuZXdjYiwgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkgeworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwkJKl9zZXJ2ZXIgPSBzZXJ2ZXI7CisJfSBlbHNlIHsKKwkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOworCQkqX3NlcnZlciA9IE5VTEw7CiAJfQogCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJX2xlYXZlKCIgPSAlZCBbY250ICVkXSIsIHJldCwgdm5vZGUtPnVwZGF0ZV9jbnQpOwogCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjaygpICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCiAvKgotICogbWF0Y2ggYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICogcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkKICAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bm9kZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCi0JCQkJCQkgY29uc3Qgdm9pZCAqZW50cnkpCitpbnQgYWZzX3Zub2RlX3JlbW92ZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgIGJvb2wgaXNkaXIpCiB7Ci0JY29uc3Qgc3RydWN0IGFmc19jYWNoZV92bm9kZSAqY3Zub2RlID0gZW50cnk7Ci0Jc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSB0YXJnZXQ7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXgsJXgsJUx4fSx7JXgsJXgsJUx4fSIsCisJX2VudGVyKCIlc3sldSwldSwldX0sJXgsJXMiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCiAJICAgICAgIHZub2RlLT5maWQudm5vZGUsCiAJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAotCSAgICAgICB2bm9kZS0+c3RhdHVzLnZlcnNpb24sCi0JICAgICAgIGN2bm9kZS0+dm5vZGVfaWQsCi0JICAgICAgIGN2bm9kZS0+dm5vZGVfdW5pcXVlLAotCSAgICAgICBjdm5vZGUtPmRhdGFfdmVyc2lvbik7CisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwKKwkgICAgICAgbmFtZSk7CiAKLQlpZiAodm5vZGUtPmZpZC52bm9kZSAhPSBjdm5vZGUtPnZub2RlX2lkKSB7Ci0JCV9sZWF2ZSgiID0gRkFJTEVEIik7Ci0JCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKKwkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyBvbiB0aGUgZGlyZWN0b3J5IHdlJ3JlIHJlbW92aW5nIGZyb20gKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19yZW1vdmUoc2VydmVyLCBrZXksIHZub2RlLCBuYW1lLCBpc2RpciwKKwkJCQkgICAgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkgeworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwl9IGVsc2UgeworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQodm5vZGUsIHJldCk7CiAJfQogCi0JaWYgKHZub2RlLT5maWQudW5pcXVlICE9IGN2bm9kZS0+dm5vZGVfdW5pcXVlIHx8Ci0JICAgIHZub2RlLT5zdGF0dXMudmVyc2lvbiAhPSBjdm5vZGUtPmRhdGFfdmVyc2lvbikgewotCQlfbGVhdmUoIiA9IERFTEVURSIpOwotCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTX0RFTEVURTsKLQl9CisJX2xlYXZlKCIgPSAlZCBbY250ICVkXSIsIHJldCwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiByZXQ7CiAKLQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKLQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOwotfSAvKiBlbmQgYWZzX3Zub2RlX2NhY2hlX21hdGNoKCkgKi8KLSNlbmRpZgorbm9fc2VydmVyOgorCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250LS07CisJQVNTRVJUQ01QKHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiA9ICVsZCBbY250ICVkXSIsIFBUUl9FUlIoc2VydmVyKSwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiB1cGRhdGUgYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICogY3JlYXRlIGEgaGFyZCBsaW5rCiAgKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCitleHRlcm4gaW50IGFmc192bm9kZV9saW5rKHN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgIHN0cnVjdCBrZXkgKmtleSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlICpjdm5vZGUgPSBlbnRyeTsKLQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IHNvdXJjZTsKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CiAKLQlfZW50ZXIoIiIpOworCV9lbnRlcigiJXN7JXUsJXUsJXV9LCVzeyV1LCV1LCV1fSwleCwlcyIsCisJICAgICAgIGR2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLAorCSAgICAgICBkdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgZHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIG5hbWUpOwogCi0JY3Zub2RlLT52bm9kZV9pZAk9IHZub2RlLT5maWQudm5vZGU7Ci0JY3Zub2RlLT52bm9kZV91bmlxdWUJPSB2bm9kZS0+ZmlkLnVuaXF1ZTsKLQljdm5vZGUtPmRhdGFfdmVyc2lvbgk9IHZub2RlLT5zdGF0dXMudmVyc2lvbjsKKwkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyBvbiB0aGUgZGlyZWN0b3J5IHdlJ3JlIHJlbW92aW5nIGZyb20gKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJc3Bpbl9sb2NrKCZkdm5vZGUtPmxvY2spOworCWR2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZkdm5vZGUtPmxvY2spOwogCi19IC8qIGVuZCBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlKCkgKi8KLSNlbmRpZgorCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihkdm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19saW5rKHNlcnZlciwga2V5LCBkdm5vZGUsIHZub2RlLCBuYW1lLAorCQkJCSAgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKGR2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKGR2bm9kZSwgc2VydmVyKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwl9IGVsc2UgeworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQodm5vZGUsIHJldCk7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZChkdm5vZGUsIHJldCk7CisJfQorCisJX2xlYXZlKCIgPSAlZCBbY250ICVkXSIsIHJldCwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJc3Bpbl9sb2NrKCZkdm5vZGUtPmxvY2spOworCWR2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUChkdm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmZHZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiA9ICVsZCBbY250ICVkXSIsIFBUUl9FUlIoc2VydmVyKSwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rCisgKi8KK2ludCBhZnNfdm5vZGVfc3ltbGluayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpjb250ZW50LAorCQkgICAgICBzdHJ1Y3QgYWZzX2ZpZCAqbmV3ZmlkLAorCQkgICAgICBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICpuZXdzdGF0dXMsCisJCSAgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV1LCV1LCV1fSwleCwlcywlcywsLCIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwKKwkgICAgICAgbmFtZSwgY29udGVudCk7CisKKwkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyBvbiB0aGUgZGlyZWN0b3J5IHdlJ3JlIGNyZWF0aW5nIGluICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfc3ltbGluayhzZXJ2ZXIsIGtleSwgdm5vZGUsIG5hbWUsIGNvbnRlbnQsCisJCQkJICAgICBuZXdmaWQsIG5ld3N0YXR1cywgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkgeworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwkJKl9zZXJ2ZXIgPSBzZXJ2ZXI7CisJfSBlbHNlIHsKKwkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOworCQkqX3NlcnZlciA9IE5VTEw7CisJfQorCisJX2xlYXZlKCIgPSAlZCBbY250ICVkXSIsIHJldCwgdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCisvKgorICogcmVuYW1lIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX3JlbmFtZShzdHJ1Y3QgYWZzX3Zub2RlICpvcmlnX2R2bm9kZSwKKwkJICAgICBzdHJ1Y3QgYWZzX3Zub2RlICpuZXdfZHZub2RlLAorCQkgICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgICBjb25zdCBjaGFyICpvcmlnX25hbWUsCisJCSAgICAgY29uc3QgY2hhciAqbmV3X25hbWUpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlc3sldSwldSwldX0sJXN7JXUsJXUsJXV9LCV4LCVzLCVzIiwKKwkgICAgICAgb3JpZ19kdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIG9yaWdfZHZub2RlLT5maWQudmlkLAorCSAgICAgICBvcmlnX2R2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICBvcmlnX2R2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAgbmV3X2R2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgbmV3X2R2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgbmV3X2R2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICBuZXdfZHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIG9yaWdfbmFtZSwKKwkgICAgICAgbmV3X25hbWUpOworCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgb24gYm90aCB0aGUgZGlyZWN0b3JpZXMgd2UncmUgZGVhbGluZworCSAqIHdpdGggKi8KKwlzcGluX2xvY2soJm9yaWdfZHZub2RlLT5sb2NrKTsKKwlvcmlnX2R2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZvcmlnX2R2bm9kZS0+bG9jayk7CisJaWYgKG5ld19kdm5vZGUgIT0gb3JpZ19kdm5vZGUpIHsKKwkJc3Bpbl9sb2NrKCZuZXdfZHZub2RlLT5sb2NrKTsKKwkJbmV3X2R2bm9kZS0+dXBkYXRlX2NudCsrOworCQlzcGluX3VubG9jaygmbmV3X2R2bm9kZS0+bG9jayk7CisJfQorCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKG9yaWdfZHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfcmVuYW1lKHNlcnZlciwga2V5LCBvcmlnX2R2bm9kZSwgb3JpZ19uYW1lLAorCQkJCSAgICBuZXdfZHZub2RlLCBuZXdfbmFtZSwgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKG9yaWdfZHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkgeworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShvcmlnX2R2bm9kZSwgc2VydmVyKTsKKwkJaWYgKG5ld19kdm5vZGUgIT0gb3JpZ19kdm5vZGUpCisJCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShuZXdfZHZub2RlLCBzZXJ2ZXIpOworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCX0gZWxzZSB7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZChvcmlnX2R2bm9kZSwgcmV0KTsKKwkJaWYgKG5ld19kdm5vZGUgIT0gb3JpZ19kdm5vZGUpCisJCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQobmV3X2R2bm9kZSwgcmV0KTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIFtjbnQgJWRdIiwgcmV0LCBvcmlnX2R2bm9kZS0+dXBkYXRlX2NudCk7CisJcmV0dXJuIHJldDsKKworbm9fc2VydmVyOgorCXNwaW5fbG9jaygmb3JpZ19kdm5vZGUtPmxvY2spOworCW9yaWdfZHZub2RlLT51cGRhdGVfY250LS07CisJQVNTRVJUQ01QKG9yaWdfZHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisJc3Bpbl91bmxvY2soJm9yaWdfZHZub2RlLT5sb2NrKTsKKwlpZiAobmV3X2R2bm9kZSAhPSBvcmlnX2R2bm9kZSkgeworCQlzcGluX2xvY2soJm5ld19kdm5vZGUtPmxvY2spOworCQluZXdfZHZub2RlLT51cGRhdGVfY250LS07CisJCUFTU0VSVENNUChuZXdfZHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisJCXNwaW5fdW5sb2NrKCZuZXdfZHZub2RlLT5sb2NrKTsKKwl9CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIG9yaWdfZHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Zub2RlLmggYi9mcy9hZnMvdm5vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2YTk3MS4uMDAwMDAwMAotLS0gYS9mcy9hZnMvdm5vZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qIHZub2RlLmg6IEFGUyB2bm9kZSByZWNvcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1ZOT0RFX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19WTk9ERV9ICi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgInNlcnZlci5oIgotI2luY2x1ZGUgImthZnN0aW1vZC5oIgotI2luY2x1ZGUgImNhY2hlLmgiCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLXN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdm5vZGUgY2F0YWxvZ3VlIGVudHJ5Ci0gKi8KLXN0cnVjdCBhZnNfY2FjaGVfdm5vZGUKLXsKLQlhZnNfdm5vZGVpZF90CQl2bm9kZV9pZDsJLyogdm5vZGUgSUQgKi8KLQl1bnNpZ25lZAkJdm5vZGVfdW5pcXVlOwkvKiB2bm9kZSBJRCB1bmlxdWlmaWVyICovCi0JYWZzX2RhdGF2ZXJzaW9uX3QJZGF0YV92ZXJzaW9uOwkvKiBkYXRhIHZlcnNpb24gKi8KLX07Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1leHRlcm4gc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192bm9kZV9jYWNoZV9pbmRleF9kZWY7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBpbm9kZSBwcml2YXRlIGRhdGEKLSAqLwotc3RydWN0IGFmc192bm9kZQotewotCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOwkvKiB0aGUgVkZTJ3MgaW5vZGUgcmVjb3JkICovCi0KLQlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggdm5vZGUgcmVzaWRlcyAqLwotCXN0cnVjdCBhZnNfZmlkCQlmaWQ7CQkvKiB0aGUgZmlsZSBpZGVudGlmaWVyIGZvciB0aGlzIGlub2RlICovCi0Jc3RydWN0IGFmc19maWxlX3N0YXR1cwlzdGF0dXM7CQkvKiBBRlMgc3RhdHVzIGluZm8gZm9yIHRoaXMgZmlsZSAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJdXBkYXRlX3dhaXRxOwkvKiBzdGF0dXMgZmV0Y2ggd2FpdHF1ZXVlICovCi0JdW5zaWduZWQJCXVwZGF0ZV9jbnQ7CS8qIG51bWJlciBvZiBvdXRzdGFuZGluZyBvcHMgdGhhdCB3aWxsIHVwZGF0ZSB0aGUKLQkJCQkJCSAqIHN0YXR1cyAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiB3YWl0cXVldWUvZmxhZ3MgbG9jayAqLwotCXVuc2lnbmVkCQlmbGFnczsKLSNkZWZpbmUgQUZTX1ZOT0RFX0NIQU5HRUQJMHgwMDAwMDAwMQkvKiBzZXQgaWYgdm5vZGUgcmVwb3J0ZWQgY2hhbmdlZCBieSBjYWxsYmFjayAqLwotI2RlZmluZSBBRlNfVk5PREVfREVMRVRFRAkweDAwMDAwMDAyCS8qIHNldCBpZiB2bm9kZSBkZWxldGVkIG9uIHNlcnZlciAqLwotI2RlZmluZSBBRlNfVk5PREVfTU9VTlRQT0lOVAkweDAwMDAwMDA0CS8qIHNldCBpZiB2bm9kZSBpcyBhIG1vdW50cG9pbnQgc3ltbGluayAqLwotCi0JLyogb3V0c3RhbmRpbmcgY2FsbGJhY2sgbm90aWZpY2F0aW9uIG9uIHRoaXMgZmlsZSAqLwotCXN0cnVjdCBhZnNfc2VydmVyCSpjYl9zZXJ2ZXI7CS8qIHNlcnZlciB0aGF0IG1hZGUgdGhlIGN1cnJlbnQgcHJvbWlzZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY2JfbGluazsJLyogbGluayBpbiBzZXJ2ZXIncyBwcm9taXNlcyBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAljYl9oYXNoX2xpbms7CS8qIGxpbmsgaW4gbWFzdGVyIGNhbGxiYWNrIGhhc2ggKi8KLQlzdHJ1Y3QgYWZzX3RpbWVyCWNiX3RpbWVvdXQ7CS8qIHRpbWVvdXQgb24gcHJvbWlzZSAqLwotCXVuc2lnbmVkCQljYl92ZXJzaW9uOwkvKiBjYWxsYmFjayB2ZXJzaW9uICovCi0JdW5zaWduZWQJCWNiX2V4cGlyeTsJLyogY2FsbGJhY2sgZXhwaXJ5IHRpbWUgKi8KLQlhZnNfY2FsbGJhY2tfdHlwZV90CWNiX3R5cGU7CS8qIHR5cGUgb2YgY2FsbGJhY2sgKi8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGFmc192bm9kZSAqQUZTX0ZTX0koc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLHN0cnVjdCBhZnNfdm5vZGUsdmZzX2lub2RlKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKkFGU19WTk9ERV9UT19JKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQotewotCXJldHVybiAmdm5vZGUtPnZmc19pbm9kZTsKLX0KLQotZXh0ZXJuIGludCBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKLQotZXh0ZXJuIGludCBhZnNfdm5vZGVfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKLQkJCQlzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciAqZGVzYyk7Ci0KLWV4dGVybiBpbnQgYWZzX3Zub2RlX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUpOwotCi1leHRlcm4gc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHM7Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1ZOT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92b2x1bWUuYyBiL2ZzL2Fmcy92b2x1bWUuYwppbmRleCA3NjhjNmRiLi5kZDE2MGNhIDEwMDY0NAotLS0gYS9mcy9hZnMvdm9sdW1lLmMKKysrIGIvZnMvYWZzL3ZvbHVtZS5jCkBAIC0xLDYgKzEsNiBAQAotLyogdm9sdW1lLmM6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAorLyogQUZTIHZvbHVtZSBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTUsMzUgKzE1LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgInZub2RlLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgImNhY2hlLmgiCi0jaW5jbHVkZSAiY21zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJ2bGNsaWVudC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLSNpZmRlZiBfX0tERUJVRwogc3RhdGljIGNvbnN0IGNoYXIgKmFmc192b2x0eXBlc1tdID0geyAiUi9XIiwgIlIvTyIsICJCQUsiIH07Ci0jZW5kaWYKIAotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192b2x1bWVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJICBjb25zdCB2b2lkICplbnRyeSk7Ci1zdGF0aWMgdm9pZCBhZnNfdm9sdW1lX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKLQotc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192b2x1bWVfY2FjaGVfaW5kZXhfZGVmID0gewotCS5uYW1lCQk9ICJ2b2x1bWUiLAotCS5kYXRhX3NpemUJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV92aGFzaCksCi0JLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDEgfSwKLQkua2V5c1sxXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgMSB9LAotCS5tYXRjaAkJPSBhZnNfdm9sdW1lX2NhY2hlX21hdGNoLAotCS51cGRhdGUJCT0gYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUsCi19OwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBsb29rdXAgYSB2b2x1bWUgYnkgbmFtZQogICogLSB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKQEAgLTY2LDExOCArNDEsNTIgQEAKICAqIC0gUnVsZSAzOiBJZiBwYXJlbnQgdm9sdW1lIGlzIFIvVywgdGhlbiBvbmx5IG1vdW50IFIvVyB2b2x1bWUgdW5sZXNzCiAgKiAgICAgICAgICAgZXhwbGljaXRseSB0b2xkIG90aGVyd2lzZQogICovCi1pbnQgYWZzX3ZvbHVtZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFmc19jZWxsICpjZWxsLCBpbnQgcndwYXRoLAotCQkgICAgICBzdHJ1Y3QgYWZzX3ZvbHVtZSAqKl92b2x1bWUpCitzdHJ1Y3QgYWZzX3ZvbHVtZSAqYWZzX3ZvbHVtZV9sb29rdXAoc3RydWN0IGFmc19tb3VudF9wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0gTlVMTDsKIAlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gTlVMTDsKLQlhZnNfdm9sdHlwZV90IHR5cGU7Ci0JY29uc3QgY2hhciAqY2VsbG5hbWUsICp2b2xuYW1lLCAqc3VmZml4OworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOwogCWNoYXIgc3J2dG1hc2s7Ci0JaW50IGZvcmNlLCByZXQsIGxvb3AsIGNlbGxuYW1lc3osIHZvbG5hbWVzejsKKwlpbnQgcmV0LCBsb29wOwogCi0JX2VudGVyKCIlcywsJWQsIiwgbmFtZSwgcndwYXRoKTsKLQotCWlmICghbmFtZSB8fCAobmFtZVswXSAhPSAnJScgJiYgbmFtZVswXSAhPSAnIycpIHx8ICFuYW1lWzFdKSB7Ci0JCXByaW50aygia0FGUzogdW5wYXJzYWJsZSB2b2x1bWUgbmFtZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGRldGVybWluZSB0aGUgdHlwZSBvZiB2b2x1bWUgd2UncmUgbG9va2luZyBmb3IgKi8KLQlmb3JjZSA9IDA7Ci0JdHlwZSA9IEFGU1ZMX1JPVk9MOwotCi0JaWYgKHJ3cGF0aCB8fCBuYW1lWzBdID09ICclJykgewotCQl0eXBlID0gQUZTVkxfUldWT0w7Ci0JCWZvcmNlID0gMTsKLQl9Ci0KLQlzdWZmaXggPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JaWYgKHN1ZmZpeCkgewotCQlpZiAoc3RyY21wKHN1ZmZpeCwgIi5yZWFkb25seSIpID09IDApIHsKLQkJCXR5cGUgPSBBRlNWTF9ST1ZPTDsKLQkJCWZvcmNlID0gMTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoc3VmZml4LCAiLmJhY2t1cCIpID09IDApIHsKLQkJCXR5cGUgPSBBRlNWTF9CQUNLVk9MOwotCQkJZm9yY2UgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAwKSB7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdWZmaXggPSBOVUxMOwotCQl9Ci0JfQotCi0JLyogc3BsaXQgdGhlIGNlbGwgYW5kIHZvbHVtZSBuYW1lcyAqLwotCW5hbWUrKzsKLQl2b2xuYW1lID0gc3RyY2hyKG5hbWUsICc6Jyk7Ci0JaWYgKHZvbG5hbWUpIHsKLQkJY2VsbG5hbWUgPSBuYW1lOwotCQljZWxsbmFtZXN6ID0gdm9sbmFtZSAtIG5hbWU7Ci0JCXZvbG5hbWUrKzsKLQl9Ci0JZWxzZSB7Ci0JCXZvbG5hbWUgPSBuYW1lOwotCQljZWxsbmFtZSA9IE5VTEw7Ci0JCWNlbGxuYW1lc3ogPSAwOwotCX0KLQotCXZvbG5hbWVzeiA9IHN1ZmZpeCA/IHN1ZmZpeCAtIHZvbG5hbWUgOiBzdHJsZW4odm9sbmFtZSk7Ci0KLQlfZGVidWcoIkNFTEw6JSouKnMgWyVwXSBWT0xVTUU6JSouKnMgU1VGRklYOiVzIFRZUEU6JWQlcyIsCi0JICAgICAgIGNlbGxuYW1lc3osIGNlbGxuYW1lc3osIGNlbGxuYW1lID86ICIiLCBjZWxsLAotCSAgICAgICB2b2xuYW1lc3osIHZvbG5hbWVzeiwgdm9sbmFtZSwgc3VmZml4ID86ICItIiwKLQkgICAgICAgdHlwZSwKLQkgICAgICAgZm9yY2UgPyAiIEZPUkNFIiA6ICIiKTsKLQotCS8qIGxvb2t1cCB0aGUgY2VsbCByZWNvcmQgKi8KLQlpZiAoY2VsbG5hbWUgfHwgIWNlbGwpIHsKLQkJcmV0ID0gYWZzX2NlbGxfbG9va3VwKGNlbGxuYW1lLCBjZWxsbmFtZXN6LCAmY2VsbCk7Ci0JCWlmIChyZXQ8MCkgewotCQkJcHJpbnRrKCJrQUZTOiB1bmFibGUgdG8gbG9va3VwIGNlbGwgJyVzJ1xuIiwKLQkJCSAgICAgICBjZWxsbmFtZSA/OiAiIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCWVsc2UgewotCQlhZnNfZ2V0X2NlbGwoY2VsbCk7Ci0JfQorCV9lbnRlcigieyUqLipzLCVkfSIsCisJICAgICAgIHBhcmFtcy0+dm9sbmFtZXN6LCBwYXJhbXMtPnZvbG5hbWVzeiwgcGFyYW1zLT52b2xuYW1lLCBwYXJhbXMtPnJ3cGF0aCk7CiAKIAkvKiBsb29rdXAgdGhlIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgKi8KLQlyZXQgPSBhZnNfdmxvY2F0aW9uX2xvb2t1cChjZWxsLCB2b2xuYW1lLCB2b2xuYW1lc3osICZ2bG9jYXRpb24pOwotCWlmIChyZXQgPCAwKQorCXZsb2NhdGlvbiA9IGFmc192bG9jYXRpb25fbG9va3VwKHBhcmFtcy0+Y2VsbCwgcGFyYW1zLT5rZXksCisJCQkJCSBwYXJhbXMtPnZvbG5hbWUsIHBhcmFtcy0+dm9sbmFtZXN6KTsKKwlpZiAoSVNfRVJSKHZsb2NhdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUih2bG9jYXRpb24pOworCQl2bG9jYXRpb24gPSBOVUxMOwogCQlnb3RvIGVycm9yOworCX0KIAogCS8qIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uIG9uIHRoZSB0eXBlIHdlIHdhbnQgKi8KIAlyZXQgPSAtRU5PTUVESVVNOwotCWlmIChmb3JjZSAmJiAhKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgKDEgPDwgdHlwZSkpKQorCWlmIChwYXJhbXMtPmZvcmNlICYmICEodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiAoMSA8PCBwYXJhbXMtPnR5cGUpKSkKIAkJZ290byBlcnJvcjsKIAogCXNydnRtYXNrID0gMDsKIAlmb3IgKGxvb3AgPSAwOyBsb29wIDwgdmxvY2F0aW9uLT52bGRiLm5zZXJ2ZXJzOyBsb29wKyspCiAJCXNydnRtYXNrIHw9IHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1tsb29wXTsKIAotCWlmIChmb3JjZSkgewotCQlpZiAoIShzcnZ0bWFzayAmICgxIDw8IHR5cGUpKSkKKwlpZiAocGFyYW1zLT5mb3JjZSkgeworCQlpZiAoIShzcnZ0bWFzayAmICgxIDw8IHBhcmFtcy0+dHlwZSkpKQogCQkJZ290byBlcnJvcjsKLQl9Ci0JZWxzZSBpZiAoc3J2dG1hc2sgJiBBRlNfVk9MX1ZUTV9STykgewotCQl0eXBlID0gQUZTVkxfUk9WT0w7Ci0JfQotCWVsc2UgaWYgKHNydnRtYXNrICYgQUZTX1ZPTF9WVE1fUlcpIHsKLQkJdHlwZSA9IEFGU1ZMX1JXVk9MOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgaWYgKHNydnRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKKwkJcGFyYW1zLT50eXBlID0gQUZTVkxfUk9WT0w7CisJfSBlbHNlIGlmIChzcnZ0bWFzayAmIEFGU19WT0xfVlRNX1JXKSB7CisJCXBhcmFtcy0+dHlwZSA9IEFGU1ZMX1JXVk9MOworCX0gZWxzZSB7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JZG93bl93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwlkb3duX3dyaXRlKCZwYXJhbXMtPmNlbGwtPnZsX3NlbSk7CiAKIAkvKiBpcyB0aGUgdm9sdW1lIGFscmVhZHkgYWN0aXZlPyAqLwotCWlmICh2bG9jYXRpb24tPnZvbHNbdHlwZV0pIHsKKwlpZiAodmxvY2F0aW9uLT52b2xzW3BhcmFtcy0+dHlwZV0pIHsKIAkJLyogeWVzIC0gcmUtdXNlIGl0ICovCi0JCXZvbHVtZSA9IHZsb2NhdGlvbi0+dm9sc1t0eXBlXTsKKwkJdm9sdW1lID0gdmxvY2F0aW9uLT52b2xzW3BhcmFtcy0+dHlwZV07CiAJCWFmc19nZXRfdm9sdW1lKHZvbHVtZSk7CiAJCWdvdG8gc3VjY2VzczsKIAl9CkBAIC0xOTEsMjMgKzEwMCwyNCBAQAogCQlnb3RvIGVycm9yX3VwOwogCiAJYXRvbWljX3NldCgmdm9sdW1lLT51c2FnZSwgMSk7Ci0Jdm9sdW1lLT50eXBlCQk9IHR5cGU7Ci0Jdm9sdW1lLT50eXBlX2ZvcmNlCT0gZm9yY2U7Ci0Jdm9sdW1lLT5jZWxsCQk9IGNlbGw7Ci0Jdm9sdW1lLT52aWQJCT0gdmxvY2F0aW9uLT52bGRiLnZpZFt0eXBlXTsKKwl2b2x1bWUtPnR5cGUJCT0gcGFyYW1zLT50eXBlOworCXZvbHVtZS0+dHlwZV9mb3JjZQk9IHBhcmFtcy0+Zm9yY2U7CisJdm9sdW1lLT5jZWxsCQk9IHBhcmFtcy0+Y2VsbDsKKwl2b2x1bWUtPnZpZAkJPSB2bG9jYXRpb24tPnZsZGIudmlkW3BhcmFtcy0+dHlwZV07CiAKIAlpbml0X3J3c2VtKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOwogCiAJLyogbG9vayB1cCBhbGwgdGhlIGFwcGxpY2FibGUgc2VydmVyIHJlY29yZHMgKi8KIAlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7CiAJCWlmICh2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbbG9vcF0gJiAoMSA8PCB2b2x1bWUtPnR5cGUpKSB7Ci0JCQlyZXQgPSBhZnNfc2VydmVyX2xvb2t1cCgKLQkJCQl2b2x1bWUtPmNlbGwsCi0JCQkJJnZsb2NhdGlvbi0+dmxkYi5zZXJ2ZXJzW2xvb3BdLAotCQkJCSZ2b2x1bWUtPnNlcnZlcnNbdm9sdW1lLT5uc2VydmVyc10pOwotCQkJaWYgKHJldCA8IDApCisJCQlzZXJ2ZXIgPSBhZnNfbG9va3VwX3NlcnZlcigKKwkJCSAgICAgICB2b2x1bWUtPmNlbGwsICZ2bG9jYXRpb24tPnZsZGIuc2VydmVyc1tsb29wXSk7CisJCQlpZiAoSVNfRVJSKHNlcnZlcikpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKHNlcnZlcik7CiAJCQkJZ290byBlcnJvcl9kaXNjYXJkOworCQkJfQogCisJCQl2b2x1bWUtPnNlcnZlcnNbdm9sdW1lLT5uc2VydmVyc10gPSBzZXJ2ZXI7CiAJCQl2b2x1bWUtPm5zZXJ2ZXJzKys7CiAJCX0KIAl9CkBAIC0yMjMsMzUgKzEzMywzNCBAQAogCWFmc19nZXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CiAJdm9sdW1lLT52bG9jYXRpb24gPSB2bG9jYXRpb247CiAKLQl2bG9jYXRpb24tPnZvbHNbdHlwZV0gPSB2b2x1bWU7CisJdmxvY2F0aW9uLT52b2xzW3ZvbHVtZS0+dHlwZV0gPSB2b2x1bWU7CiAKLSBzdWNjZXNzOgorc3VjY2VzczoKIAlfZGVidWcoImtBRlMgc2VsZWN0ZWQgJXMgdm9sdW1lICUwOHgiLAogCSAgICAgICBhZnNfdm9sdHlwZXNbdm9sdW1lLT50eXBlXSwgdm9sdW1lLT52aWQpOwotCSpfdm9sdW1lID0gdm9sdW1lOwotCXJldCA9IDA7CisJdXBfd3JpdGUoJnBhcmFtcy0+Y2VsbC0+dmxfc2VtKTsKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCV9sZWF2ZSgiID0gJXAiLCB2b2x1bWUpOworCXJldHVybiB2b2x1bWU7CiAKIAkvKiBjbGVhbiB1cCAqLwotIGVycm9yX3VwOgotCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOwotIGVycm9yOgorZXJyb3JfdXA6CisJdXBfd3JpdGUoJnBhcmFtcy0+Y2VsbC0+dmxfc2VtKTsKK2Vycm9yOgogCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JYWZzX3B1dF9jZWxsKGNlbGwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiAKLQlfbGVhdmUoIiA9ICVkICglcCkiLCByZXQsIHZvbHVtZSk7Ci0JcmV0dXJuIHJldDsKLQotIGVycm9yX2Rpc2NhcmQ6Ci0JdXBfd3JpdGUoJmNlbGwtPnZsX3NlbSk7CitlcnJvcl9kaXNjYXJkOgorCXVwX3dyaXRlKCZwYXJhbXMtPmNlbGwtPnZsX3NlbSk7CiAKIAlmb3IgKGxvb3AgPSB2b2x1bWUtPm5zZXJ2ZXJzIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCiAJCWFmc19wdXRfc2VydmVyKHZvbHVtZS0+c2VydmVyc1tsb29wXSk7CiAKIAlrZnJlZSh2b2x1bWUpOwogCWdvdG8gZXJyb3I7Ci19IC8qIGVuZCBhZnNfdm9sdW1lX2xvb2t1cCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkZXN0cm95IGEgdm9sdW1lIHJlY29yZAogICovCkBAIC0yNjUsMTAgKzE3NCw5IEBACiAKIAlfZW50ZXIoIiVwIiwgdm9sdW1lKTsKIAotCXZsb2NhdGlvbiA9IHZvbHVtZS0+dmxvY2F0aW9uOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmdm9sdW1lLT51c2FnZSksID4sIDApOwogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JQlVHX09OKGF0b21pY19yZWFkKCZ2b2x1bWUtPnVzYWdlKSA8PSAwKTsKKwl2bG9jYXRpb24gPSB2b2x1bWUtPnZsb2NhdGlvbjsKIAogCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5CiAJICogYXRvbWljICovCkBAIC0yOTYsMjEgKzIwNCwyNyBAQAogCWtmcmVlKHZvbHVtZSk7CiAKIAlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOwotfSAvKiBlbmQgYWZzX3B1dF92b2x1bWUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcGljayBhIHNlcnZlciB0byB1c2UgdG8gdHJ5IGFjY2Vzc2luZyB0aGlzIHZvbHVtZQogICogLSByZXR1cm5zIHdpdGggYW4gZWxldmF0ZWQgdXNhZ2UgY291bnQgb24gdGhlIHNlcnZlciBjaG9zZW4KICAqLwotaW50IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCi0JCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQorc3RydWN0IGFmc19zZXJ2ZXIgKmFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQogeworCXN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUgPSB2bm9kZS0+dm9sdW1lOwogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAJaW50IHJldCwgc3RhdGUsIGxvb3A7CiAKIAlfZW50ZXIoIiVzIiwgdm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSk7CiAKKwkvKiBzdGljayB3aXRoIHRoZSBzZXJ2ZXIgd2UncmUgYWxyZWFkeSB1c2luZyBpZiB3ZSBjYW4gKi8KKwlpZiAodm5vZGUtPnNlcnZlciAmJiB2bm9kZS0+c2VydmVyLT5mc19zdGF0ZSA9PSAwKSB7CisJCWFmc19nZXRfc2VydmVyKHZub2RlLT5zZXJ2ZXIpOworCQlfbGVhdmUoIiA9ICVwIFtjdXJyZW50XSIsIHZub2RlLT5zZXJ2ZXIpOworCQlyZXR1cm4gdm5vZGUtPnNlcnZlcjsKKwl9CisKIAlkb3duX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CiAKIAkvKiBoYW5kbGUgdGhlIG5vLXNlcnZlciBjYXNlICovCkBAIC0zMTgsNyArMjMyLDcgQEAKIAkJcmV0ID0gdm9sdW1lLT5yanNlcnZlcnMgPyAtRU5PTUVESVVNIDogLUVTVEFMRTsKIAkJdXBfcmVhZCgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKIAkJX2xlYXZlKCIgPSAlZCBbbm8gc2VydmVyc10iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAogCS8qIGJhc2ljYWxseSwganVzdCBzZWFyY2ggdGhlIGxpc3QgZm9yIHRoZSBmaXJzdCBsaXZlIHNlcnZlciBhbmQgdXNlCkBAIC0zMjgsMTUgKzI0MiwxNiBAQAogCQlzZXJ2ZXIgPSB2b2x1bWUtPnNlcnZlcnNbbG9vcF07CiAJCXN0YXRlID0gc2VydmVyLT5mc19zdGF0ZTsKIAorCQlfZGVidWcoImNvbnNpZGVyICVkIFslZF0iLCBsb29wLCBzdGF0ZSk7CisKIAkJc3dpdGNoIChzdGF0ZSkgewogCQkJLyogZm91bmQgYW4gYXBwYXJlbnRseSBoZWFsdGh5IHNlcnZlciAqLwogCQljYXNlIDA6CiAJCQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOwogCQkJdXBfcmVhZCgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKLQkJCSpfc2VydmVyID0gc2VydmVyOwotCQkJX2xlYXZlKCIgPSAwIChwaWNrZWQgJTA4eCkiLAotCQkJICAgICAgIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKLQkJCXJldHVybiAwOworCQkJX2xlYXZlKCIgPSAlcCAocGlja2VkICUwOHgpIiwKKwkJCSAgICAgICBzZXJ2ZXIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKwkJCXJldHVybiBzZXJ2ZXI7CiAKIAkJY2FzZSAtRU5FVFVOUkVBQ0g6CiAJCQlpZiAocmV0ID09IDApCkBAIC0zNzIsMjAgKzI4NywyMSBAQAogCSAqLwogCXVwX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKCkgKi8KKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcmVsZWFzZSBhIHNlcnZlciBhZnRlciB1c2UKICAqIC0gcmVsZWFzZXMgdGhlIHJlZiBvbiB0aGUgc2VydmVyIHN0cnVjdCB0aGF0IHdhcyBhY3F1aXJlZCBieSBwaWNraW5nCiAgKiAtIHJlY29yZHMgcmVzdWx0IG9mIHVzaW5nIGEgcGFydGljdWxhciBzZXJ2ZXIgdG8gYWNjZXNzIGEgdm9sdW1lCiAgKiAtIHJldHVybiAwIHRvIHRyeSBhZ2FpbiwgMSBpZiBva2F5IG9yIHRvIGlzc3VlIGVycm9yCisgKiAtIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBzZXJ2ZXIgc3RydWN0IGlmIHJlc3VsdCB3YXMgMAogICovCi1pbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSwKK2ludCBhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKIAkJCQkgIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCiAJCQkJICBpbnQgcmVzdWx0KQogeworCXN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUgPSB2bm9kZS0+dm9sdW1lOwogCXVuc2lnbmVkIGxvb3A7CiAKIAlfZW50ZXIoIiVzLCUwOHgsJWQiLApAQCAtMzk2LDE0ICszMTIsMTYgQEAKIAkJLyogc3VjY2VzcyAqLwogCWNhc2UgMDoKIAkJc2VydmVyLT5mc19hY3RfamlmID0gamlmZmllczsKLQkJYnJlYWs7CisJCXNlcnZlci0+ZnNfc3RhdGUgPSAwOworCQlfbGVhdmUoIiIpOworCQlyZXR1cm4gMTsKIAogCQkvKiB0aGUgZmlsZXNlcnZlciBkZW5pZWQgYWxsIGtub3dsZWRnZSBvZiB0aGUgdm9sdW1lICovCiAJY2FzZSAtRU5PTUVESVVNOgogCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOwogCQlkb3duX3dyaXRlKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOwogCi0JCS8qIGZpcnN0LCBmaW5kIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIGFjdGl2ZSBsaXN0IChpZiBpdAorCQkvKiBmaXJzdGx5LCBmaW5kIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIGFjdGl2ZSBsaXN0IChpZiBpdAogCQkgKiBpcykgKi8KIAkJZm9yIChsb29wID0gMDsgbG9vcCA8IHZvbHVtZS0+bnNlcnZlcnM7IGxvb3ArKykKIAkJCWlmICh2b2x1bWUtPnNlcnZlcnNbbG9vcF0gPT0gc2VydmVyKQpAQCAtNDQxLDYgKzM1OSw3IEBACiAJY2FzZSAtRU5FVFVOUkVBQ0g6CiAJY2FzZSAtRUhPU1RVTlJFQUNIOgogCWNhc2UgLUVDT05OUkVGVVNFRDoKKwljYXNlIC1FVElNRToKIAljYXNlIC1FVElNRURPVVQ6CiAJY2FzZSAtRVJFTU9URUlPOgogCQkvKiBtYXJrIHRoZSBzZXJ2ZXIgYXMgZGVhZApAQCAtNDYwLDYwICszNzksMTcgQEAKIAkJc2VydmVyLT5mc19hY3RfamlmID0gamlmZmllczsKIAljYXNlIC1FTk9NRU06CiAJY2FzZSAtRU5PTkVUOgotCQlicmVhazsKKwkJLyogdGVsbCB0aGUgY2FsbGVyIHRvIGFjY2VwdCB0aGUgcmVzdWx0ICovCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCV9sZWF2ZSgiIFtsb2NhbCBmYWlsdXJlXSIpOworCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiB0ZWxsIHRoZSBjYWxsZXIgdG8gYWNjZXB0IHRoZSByZXN1bHQgKi8KLQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCV9sZWF2ZSgiIik7Ci0JcmV0dXJuIDE7Ci0KIAkvKiB0ZWxsIHRoZSBjYWxsZXIgdG8gbG9vcCBhcm91bmQgYW5kIHRyeSB0aGUgbmV4dCBzZXJ2ZXIgKi8KLSB0cnlfbmV4dF9zZXJ2ZXJfdXB3OgordHJ5X25leHRfc2VydmVyX3VwdzoKIAl1cF93cml0ZSgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKLSB0cnlfbmV4dF9zZXJ2ZXI6Cit0cnlfbmV4dF9zZXJ2ZXI6CiAJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKIAlfbGVhdmUoIiBbdHJ5IG5leHQgc2VydmVyXSIpOwogCXJldHVybiAwOwotCi19IC8qIGVuZCBhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBtYXRjaCBhIHZvbHVtZSBoYXNoIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCi0gKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKLQkJCQkJCSAgY29uc3Qgdm9pZCAqZW50cnkpCi17Ci0JY29uc3Qgc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKLQlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gdGFyZ2V0OwotCi0JX2VudGVyKCJ7JXV9LHsldX0iLCB2b2x1bWUtPnR5cGUsIHZoYXNoLT52dHlwZSk7Ci0KLQlpZiAodm9sdW1lLT50eXBlID09IHZoYXNoLT52dHlwZSkgewotCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKLQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKLQl9Ci0KLQlfbGVhdmUoIiA9IEZBSUxFRCIpOwotCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKLX0gLyogZW5kIGFmc192b2x1bWVfY2FjaGVfbWF0Y2goKSAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiB1cGRhdGUgYSB2b2x1bWUgaGFzaCByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQotICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIHZvaWQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSkKLXsKLQlzdHJ1Y3QgYWZzX2NhY2hlX3ZoYXNoICp2aGFzaCA9IGVudHJ5OwotCXN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUgPSBzb3VyY2U7Ci0KLQlfZW50ZXIoIiIpOwotCi0Jdmhhc2gtPnZ0eXBlID0gdm9sdW1lLT50eXBlOwotCi19IC8qIGVuZCBhZnNfdm9sdW1lX2NhY2hlX3VwZGF0ZSgpICovCi0jZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92b2x1bWUuaCBiL2ZzL2Fmcy92b2x1bWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkY2YxOS4uMDAwMDAwMAotLS0gYS9mcy9hZnMvdm9sdW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogdm9sdW1lLmg6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9BRlNfVk9MVU1FX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19WT0xVTUVfSAotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJmc2NsaWVudC5oIgotI2luY2x1ZGUgImthZnN0aW1vZC5oIgotI2luY2x1ZGUgImthZnNhc3luY2QuaCIKLSNpbmNsdWRlICJjYWNoZS5oIgotCi10eXBlZGVmIGVudW0gewotCUFGU19WTFVQRF9TTEVFUCwJCS8qIHNsZWVwaW5nIHdhaXRpbmcgZm9yIHVwZGF0ZSB0aW1lciB0byBmaXJlICovCi0JQUZTX1ZMVVBEX1BFTkRJTkcsCQkvKiBvbiBwZW5kaW5nIHF1ZXVlICovCi0JQUZTX1ZMVVBEX0lOUFJPR1JFU1MsCQkvKiBvcCBpbiBwcm9ncmVzcyAqLwotCUFGU19WTFVQRF9CVVNZU0xFRVAsCQkvKiBzbGVlcGluZyBiZWNhdXNlIHNlcnZlciByZXR1cm5lZCBFQlVTWSAqLwotCQotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhZnNfdmxvY2F0aW9uX3VwZF90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZW50cnkgaW4gdGhlIGNhY2hlZCB2b2x1bWUgbG9jYXRpb24gY2F0YWxvZ3VlCi0gKi8KLXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uCi17Ci0JdWludDhfdAkJCW5hbWVbNjRdOwkvKiB2b2x1bWUgbmFtZSAobG93ZXJjYXNlLCBwYWRkZWQgd2l0aCBOVUxzKSAqLwotCXVpbnQ4X3QJCQluc2VydmVyczsJLyogbnVtYmVyIG9mIGVudHJpZXMgdXNlZCBpbiBzZXJ2ZXJzW10gKi8KLQl1aW50OF90CQkJdmlkbWFzazsJLyogdm9sdHlwZSBtYXNrIGZvciB2aWRbXSAqLwotCXVpbnQ4X3QJCQlzcnZ0bWFza1s4XTsJLyogdm9sdHlwZSBtYXNrcyBmb3Igc2VydmVyc1tdICovCi0jZGVmaW5lIEFGU19WT0xfVlRNX1JXCTB4MDEgLyogUi9XIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLwotI2RlZmluZSBBRlNfVk9MX1ZUTV9STwkweDAyIC8qIFIvTyB2ZXJzaW9uIG9mIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlIChvbiB0aGlzIHNlcnZlcikgKi8KLSNkZWZpbmUgQUZTX1ZPTF9WVE1fQkFLCTB4MDQgLyogYmFja3VwIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLwotCi0JYWZzX3ZvbGlkX3QJCXZpZFszXTsJCS8qIHZvbHVtZSBJRHMgZm9yIFIvVywgUi9PIGFuZCBCYWsgdm9sdW1lcyAqLwotCXN0cnVjdCBpbl9hZGRyCQlzZXJ2ZXJzWzhdOwkvKiBmaWxlc2VydmVyIGFkZHJlc3NlcyAqLwotCXRpbWVfdAkJCXJ0aW1lOwkJLyogbGFzdCByZXRyaWV2YWwgdGltZSAqLwotfTsKLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLWV4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zsb2NhdGlvbl9jYWNoZV9pbmRleF9kZWY7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHZvbHVtZSAtPiB2bm9kZSBoYXNoIHRhYmxlIGVudHJ5Ci0gKi8KLXN0cnVjdCBhZnNfY2FjaGVfdmhhc2gKLXsKLQlhZnNfdm9sdHlwZV90CQl2dHlwZTsJCS8qIHdoaWNoIHZvbHVtZSB2YXJpYXRpb24gKi8KLQl1aW50OF90CQkJaGFzaF9idWNrZXQ7CS8qIHdoaWNoIGhhc2ggYnVja2V0IHRoaXMgcmVwcmVzZW50cyAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLWV4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3ZvbHVtZV9jYWNoZV9pbmRleF9kZWY7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfdmxvY2F0aW9uCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gY2VsbCB2b2x1bWUgbG9jYXRpb24gbGlzdCAqLwotCXN0cnVjdCBhZnNfdGltZXIJdGltZW91dDsJLyogZGVjYWNoaW5nIHRpbWVyICovCi0Jc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggdm9sdW1lIGJlbG9uZ3MgKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0Jc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCi0jZW5kaWYKLQlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOwkvKiB2b2x1bWUgaW5mb3JtYXRpb24gREIgcmVjb3JkICovCi0Jc3RydWN0IGFmc192b2x1bWUJKnZvbHNbM107CS8qIHZvbHVtZSBhY2Nlc3MgcmVjb3JkIHBvaW50ZXIgKGluZGV4IGJ5IHR5cGUpICovCi0Jcndsb2NrX3QJCWxvY2s7CQkvKiBhY2Nlc3MgbG9jayAqLwotCXVuc2lnbmVkIGxvbmcJCXJlYWRfamlmOwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgcmVhZCBmcm9tIHZsc2VydmVyICovCi0Jc3RydWN0IGFmc190aW1lcgl1cGRfdGltZXI7CS8qIHVwZGF0ZSB0aW1lciAqLwotCXN0cnVjdCBhZnNfYXN5bmNfb3AJdXBkX29wOwkJLyogdXBkYXRlIG9wZXJhdGlvbiAqLwotCWFmc192bG9jYXRpb25fdXBkX3QJdXBkX3N0YXRlOwkvKiB1cGRhdGUgc3RhdGUgKi8KLQl1bnNpZ25lZCBzaG9ydAkJdXBkX2ZpcnN0X3N2aXg7CS8qIGZpcnN0IHNlcnZlciBpbmRleCBkdXJpbmcgdXBkYXRlICovCi0JdW5zaWduZWQgc2hvcnQJCXVwZF9jdXJyX3N2aXg7CS8qIGN1cnJlbnQgc2VydmVyIGluZGV4IGR1cmluZyB1cGRhdGUgKi8KLQl1bnNpZ25lZCBzaG9ydAkJdXBkX3Jlal9jbnQ7CS8qIEVOT01FRElVTSBjb3VudCBkdXJpbmcgdXBkYXRlICovCi0JdW5zaWduZWQgc2hvcnQJCXVwZF9idXN5X2NudDsJLyogRUJVU1kgY291bnQgZHVyaW5nIHVwZGF0ZSAqLwotCXVuc2lnbmVkIHNob3J0CQl2YWxpZDsJCS8qIFQgaWYgdmFsaWQgKi8KLX07Ci0KLWV4dGVybiBpbnQgYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICpjZWxsLAotCQkJCWNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJdW5zaWduZWQgbmFtZXN6LAotCQkJCXN0cnVjdCBhZnNfdmxvY2F0aW9uICoqX3Zsb2NhdGlvbik7Ci0KLSNkZWZpbmUgYWZzX2dldF92bG9jYXRpb24oVikgZG8geyBhdG9taWNfaW5jKCYoViktPnVzYWdlKTsgfSB3aGlsZSgwKQotCi1leHRlcm4gdm9pZCBhZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKLWV4dGVybiB2b2lkIGFmc192bG9jYXRpb25fZG9fdGltZW91dChzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyB2b2x1bWUgYWNjZXNzIHJlY29yZAotICovCi1zdHJ1Y3QgYWZzX3ZvbHVtZQotewotCWF0b21pY190CQl1c2FnZTsKLQlzdHJ1Y3QgYWZzX2NlbGwJCSpjZWxsOwkJLyogY2VsbCB0byB3aGljaCBiZWxvbmdzICh1bnJlZmQgcHRyKSAqLwotCXN0cnVjdCBhZnNfdmxvY2F0aW9uCSp2bG9jYXRpb247CS8qIHZvbHVtZSBsb2NhdGlvbiAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KLSNlbmRpZgotCWFmc192b2xpZF90CQl2aWQ7CQkvKiB2b2x1bWUgSUQgKi8KLQlhZnNfdm9sdHlwZV90CQl0eXBlOwkJLyogdHlwZSBvZiB2b2x1bWUgKi8KLQljaGFyCQkJdHlwZV9mb3JjZTsJLyogZm9yY2Ugdm9sdW1lIHR5cGUgKHN1cHByZXNzIFIvTyAtPiBSL1cpICovCi0JdW5zaWduZWQgc2hvcnQJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVyIHNsb3RzIGZpbGxlZCAqLwotCXVuc2lnbmVkIHNob3J0CQlyanNlcnZlcnM7CS8qIG51bWJlciBvZiBzZXJ2ZXJzIGRpc2NhcmRlZCBkdWUgdG8gLUVOT01FRElVTSAqLwotCXN0cnVjdCBhZnNfc2VydmVyCSpzZXJ2ZXJzWzhdOwkvKiBzZXJ2ZXJzIG9uIHdoaWNoIHZvbHVtZSByZXNpZGVzIChvcmRlcmVkKSAqLwotCXN0cnVjdCByd19zZW1hcGhvcmUJc2VydmVyX3NlbTsJLyogbG9jayBmb3IgYWNjZXNzaW5nIGN1cnJlbnQgc2VydmVyICovCi19OwotCi1leHRlcm4gaW50IGFmc192b2x1bWVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKLQkJCSAgICAgaW50IHJ3cGF0aCwKLQkJCSAgICAgc3RydWN0IGFmc192b2x1bWUgKipfdm9sdW1lKTsKLQotI2RlZmluZSBhZnNfZ2V0X3ZvbHVtZShWKSBkbyB7IGF0b21pY19pbmMoJihWKS0+dXNhZ2UpOyB9IHdoaWxlKDApCi0KLWV4dGVybiB2b2lkIGFmc19wdXRfdm9sdW1lKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUpOwotCi1leHRlcm4gaW50IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCi0JCQkJICAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKTsKLQotZXh0ZXJuIGludCBhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lLAotCQkJCQkgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkJIGludCByZXN1bHQpOwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19WT0xVTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA4YjFjNWQ4Li5jNjhiMDU1IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMjY2LDYgKzI2NiwyMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZG9fc2lvY2dzdGFtcG5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCB0aW1lc3BlYyBrdHM7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmt0cyk7CisJc2V0X2ZzKG9sZF9mcyk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcHV0X3VzZXIoa3RzLnR2X3NlYywgJnVwLT50dl9zZWMpOworCQllcnIgfD0gX19wdXRfdXNlcihrdHMudHZfbnNlYywgJnVwLT50dl9uc2VjKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKwogc3RydWN0IGlmbWFwMzIgewogCWNvbXBhdF91bG9uZ190IG1lbV9zdGFydDsKIAljb21wYXRfdWxvbmdfdCBtZW1fZW5kOwpAQCAtMjQzNyw2ICsyNDU0LDcgQEAKIC8qIE5vdGUgU0lPQ1JUTVNHIGlzIG5vIGxvbmdlciwgc28gdGhpcyBpcyBzYWZlIGFuZCAqIHRoZSB1c2VyIHdvdWxkIGhhdmUgc2VlbiBqdXN0IGFuIC1FSU5WQUwgYW55d2F5cy4gKi8KIEhBTkRMRV9JT0NUTChTSU9DUlRNU0csIHJldF9laW52YWwpCiBIQU5ETEVfSU9DVEwoU0lPQ0dTVEFNUCwgZG9fc2lvY2dzdGFtcCkKK0hBTkRMRV9JT0NUTChTSU9DR1NUQU1QTlMsIGRvX3Npb2Nnc3RhbXBucykKICNlbmRpZgogI2lmZGVmIENPTkZJR19CTE9DSwogSEFORExFX0lPQ1RMKEhESU9fR0VUR0VPLCBoZGlvX2dldGdlbykKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL25ldGxpbmsuYyBiL2ZzL2VjcnlwdGZzL25ldGxpbmsuYwppbmRleCBlM2FhMjI1Li5mZTkxODYzIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9uZXRsaW5rLmMKKysrIGIvZnMvZWNyeXB0ZnMvbmV0bGluay5jCkBAIC05Nyw3ICs5Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZWNyeXB0ZnNfcHJvY2Vzc19ubF9yZXNwb25zZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciopc2tiLT5kYXRhOworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UgKm1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAlpbnQgcmM7CiAKQEAgLTE4MSw3ICsxODEsNyBAQAogCQkJCSJyYyA9IFslZF1cbiIsIHJjKTsKIAkJcmV0dXJuOwogCX0KLQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5saCA9IG5sbXNnX2hkcihza2IpOwogCWlmICghTkxNU0dfT0sobmxoLCBza2ItPmxlbikpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiUmVjZWl2ZWQgY29ycnVwdCBuZXRsaW5rICIKIAkJCQkibWVzc2FnZVxuIik7CkBAIC0yMjksNyArMjI5LDcgQEAKIAogCWVjcnlwdGZzX25sX3NvY2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19FQ1JZUFRGUywgMCwKIAkJCQkJCSBlY3J5cHRmc19yZWNlaXZlX25sX21lc3NhZ2UsCi0JCQkJCQkgVEhJU19NT0RVTEUpOworCQkJCQkJIE5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoIWVjcnlwdGZzX25sX3NvY2spIHsKIAkJcmMgPSAtRUlPOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0XG4iKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tYWxwaGEvc29ja2V0LmgKaW5kZXggZDIyYWI5Ny4uMWZlZGU3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvc29ja2V0LmgKQEAgLTUyLDYgKzUyLDggQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMAogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAvKiBTZWN1cml0eSBsZXZlbHMgLSBhcyBwZXIgTlJMIElQdjYgLSBkb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyAqLwogI2RlZmluZSBTT19TRUNVUklUWV9BVVRIRU5USUNBVElPTgkJMTkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tpb3MuaAppbmRleCBlNDk2MWE3Li43OTMyYzdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvc29ja2lvcy5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIFNJT0NTUEdSUAlfSU9XKCdzJywgOCwgcGlkX3QpCiAjZGVmaW5lIFNJT0NHUEdSUAlfSU9SKCdzJywgOSwgcGlkX3QpCiAKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAtIGxpbnV4LXNwZWNpZmljICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfQVNNX0FMUEhBX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaAppbmRleCAzN2UwYTk2Li4wYjVmODgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BU01fQVJNX0RJVjY0CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoKICAqIFRoZSBzZW1hbnRpY3Mgb2YgZG9fZGl2KCkgYXJlOgpAQCAtMjIzLDQgKzIyNCw2IEBACiAKICNlbmRpZgogCitleHRlcm4gdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWFybS9zb2NrZXQuaAppbmRleCAxOWY3ZGY3Li42NWExYTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1hcm0vc29ja2lvcy5oCmluZGV4IDc3YzM0MDguLmEyNTg4YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tldC5oCmluZGV4IDE5ZjdkZjcuLjY1YTFhNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tpb3MuaAppbmRleCA3N2MzNDA4Li5hMjU4OGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2lvLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTllNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9pby5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19BU01fQVZSMzJfQVJDSF9BVDMyQVBfSU9fSAorI2RlZmluZSBfX0FTTV9BVlIzMl9BUkNIX0FUMzJBUF9JT19ICisKKy8qIEZvciAiYml6YXJyZSIgaGFsZndvcmQgc3dhcHBpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYmIuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0FQNzAwMF8zMl9CSVRfU01DKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfYihhZGRyKQkoYWRkciBeIDNVTCkKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX3coYWRkcikJKGFkZHIgXiAyVUwpCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl9sKGFkZHIpCShhZGRyKQorIyBkZWZpbmUgaW9zd2FiYihhLCB4KQkJKHgpCisjIGRlZmluZSBpb3N3YWJ3KGEsIHgpCQkoeCkKKyMgZGVmaW5lIGlvc3dhYmwoYSwgeCkJCSh4KQorIyBkZWZpbmUgX19tZW1faW9zd2FiYihhLCB4KQkoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYncoYSwgeCkJc3dhYjE2KHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJsKGEsIHgpCXN3YWIzMih4KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVA3MDAwXzE2X0JJVF9TTUMpCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl9iKGFkZHIpCShhZGRyIF4gMVVMKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfdyhhZGRyKQkoYWRkcikKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2woYWRkcikJKGFkZHIpCisjIGRlZmluZSBpb3N3YWJiKGEsIHgpCQkoeCkKKyMgZGVmaW5lIGlvc3dhYncoYSwgeCkJCSh4KQorIyBkZWZpbmUgaW9zd2FibChhLCB4KQkJc3dhaHczMih4KQorIyBkZWZpbmUgX19tZW1faW9zd2FiYihhLCB4KQkoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYncoYSwgeCkJc3dhYjE2KHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJsKGEsIHgpCXN3YWhiMzIoeCkKKyNlbHNlCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl9iKGFkZHIpCShhZGRyKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfdyhhZGRyKQkoYWRkcikKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2woYWRkcikJKGFkZHIpCisjIGRlZmluZSBpb3N3YWJiKGEsIHgpCQkoeCkKKyMgZGVmaW5lIGlvc3dhYncoYSwgeCkJCXN3YWIxNih4KQorIyBkZWZpbmUgaW9zd2FibChhLCB4KQkJc3dhYjMyKHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJiKGEsIHgpCSh4KQorIyBkZWZpbmUgX19tZW1faW9zd2FidyhhLCB4KQkoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYmwoYSwgeCkJKHgpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0FSQ0hfQVQzMkFQX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3NtYy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvc21jLmgKaW5kZXggMzczMmIzMi4uMDcxNTJiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvc21jLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvc21jLmgKQEAgLTQ4LDEwICs0OCwzMiBAQAogCXVuc2lnbmVkIGludAlud2VfY29udHJvbGxlZDoxOwogCiAJLyoKKwkgKiAwOiBOV0FJVCBpcyBkaXNhYmxlZAorCSAqIDE6IFJlc2VydmVkCisJICogMjogTldBSVQgaXMgZnJvemVuIG1vZGUKKwkgKiAzOiBOV0FJVCBpbiByZWFkeSBtb2RlCisJICovCisJdW5zaWduZWQgaW50CW53YWl0X21vZGU6MjsKKworCS8qCiAJICogMDogQnl0ZSBzZWxlY3QgYWNjZXNzIHR5cGUKIAkgKiAxOiBCeXRlIHdyaXRlIGFjY2VzcyB0eXBlCiAJICovCiAJdW5zaWduZWQgaW50CWJ5dGVfd3JpdGU6MTsKKworCS8qCisJICogTnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBiZWZvcmUgZGF0YSBpcyByZWxlYXNlZCBhZnRlcgorCSAqIHRoZSByaXNpbmcgZWRnZSBvZiB0aGUgcmVhZCBjb250cm9sbGluZyBzaWduYWwKKwkgKgorCSAqIFRvdGFsIGN5Y2xlcyBmcm9tIFNNQyBpcyB0ZGZfY3ljbGVzICsgMQorCSAqLworCXVuc2lnbmVkIGludAl0ZGZfY3ljbGVzOjQ7CisKKwkvKgorCSAqIDA6IFRERiBvcHRpbWl6YXRpb24gZGlzYWJsZWQKKwkgKiAxOiBUREYgb3B0aW1pemF0aW9uIGVuYWJsZWQKKwkgKi8KKwl1bnNpZ25lZCBpbnQJdGRmX21vZGU6MTsKIH07CiAKIGV4dGVybiBpbnQgc21jX3NldF9jb25maWd1cmF0aW9uKGludCBjcywgY29uc3Qgc3RydWN0IHNtY19jb25maWcgKmNvbmZpZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC90aW1lLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4YTQzNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3RpbWUuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0FWUjMyX0FSQ0hfQVQzMkFQX1RJTUVfSAorI2RlZmluZSBfQVNNX0FWUjMyX0FSQ0hfQVQzMkFQX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK2V4dGVybiBzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyX2lycWFjdGlvbjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0MzJfc3lzdGMwX2RldmljZTsKK2V4dGVybiB2b2lkIGxvY2FsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisjZGVmaW5lIFRJTUVSX0JDUgkJCQkJMHgwMDAwMDBjMAorI2RlZmluZSBUSU1FUl9CQ1JfU1lOQwkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX0JNUgkJCQkJMHgwMDAwMDBjNAorI2RlZmluZSBUSU1FUl9CTVJfVEMwWEMwUwkJCQkJIDAKKyNkZWZpbmUgVElNRVJfQk1SX1RDMVhDMVMJCQkJCSAyCisjZGVmaW5lIFRJTUVSX0JNUl9UQzJYQzJTCQkJCQkgNAorI2RlZmluZSBUSU1FUl9DQ1IJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVElNRVJfQ0NSX0NMS0RJUwkJCQkJIDEKKyNkZWZpbmUgVElNRVJfQ0NSX0NMS0VOCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfQ0NSX1NXVFJHCQkJCQkJIDIKKyNkZWZpbmUgVElNRVJfQ01SCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFRJTUVSX0NNUl9BQkVUUkcJCQkJCTEwCisjZGVmaW5lIFRJTUVSX0NNUl9BQ1BBCQkJCQkJMTYKKyNkZWZpbmUgVElNRVJfQ01SX0FDUEMJCQkJCQkxOAorI2RlZmluZSBUSU1FUl9DTVJfQUVFVlQJCQkJCQkyMAorI2RlZmluZSBUSU1FUl9DTVJfQVNXVFJHCQkJCQkyMgorI2RlZmluZSBUSU1FUl9DTVJfQkNQQgkJCQkJCTI0CisjZGVmaW5lIFRJTUVSX0NNUl9CQ1BDCQkJCQkJMjYKKyNkZWZpbmUgVElNRVJfQ01SX0JFRVZUCQkJCQkJMjgKKyNkZWZpbmUgVElNRVJfQ01SX0JTV1RSRwkJCQkJMzAKKyNkZWZpbmUgVElNRVJfQ01SX0JVUlNUCQkJCQkJIDQKKyNkZWZpbmUgVElNRVJfQ01SX0NMS0kJCQkJCQkgMworI2RlZmluZSBUSU1FUl9DTVJfQ1BDRElTCQkJCQkgNworI2RlZmluZSBUSU1FUl9DTVJfQ1BDU1RPUAkJCQkJIDYKKyNkZWZpbmUgVElNRVJfQ01SX0NQQ1RSRwkJCQkJMTQKKyNkZWZpbmUgVElNRVJfQ01SX0VFVlQJCQkJCQkxMAorI2RlZmluZSBUSU1FUl9DTVJfRUVWVEVERwkJCQkJIDgKKyNkZWZpbmUgVElNRVJfQ01SX0VORVRSRwkJCQkJMTIKKyNkZWZpbmUgVElNRVJfQ01SX0VUUkdFREcJCQkJCSA4CisjZGVmaW5lIFRJTUVSX0NNUl9MREJESVMJCQkJCSA3CisjZGVmaW5lIFRJTUVSX0NNUl9MREJTVE9QCQkJCQkgNgorI2RlZmluZSBUSU1FUl9DTVJfTERSQQkJCQkJCTE2CisjZGVmaW5lIFRJTUVSX0NNUl9MRFJCCQkJCQkJMTgKKyNkZWZpbmUgVElNRVJfQ01SX1RDQ0xLUwkJCQkJIDAKKyNkZWZpbmUgVElNRVJfQ01SX1dBVkUJCQkJCQkxNQorI2RlZmluZSBUSU1FUl9DTVJfV0FWU0VMCQkJCQkxMworI2RlZmluZSBUSU1FUl9DVgkJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBUSU1FUl9DVl9DVgkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX0lEUgkJCQkJMHgwMDAwMDAyOAorI2RlZmluZSBUSU1FUl9JRFJfQ09WRlMJCQkJCQkgMAorI2RlZmluZSBUSU1FUl9JRFJfQ1BBUwkJCQkJCSAyCisjZGVmaW5lIFRJTUVSX0lEUl9DUEJTCQkJCQkJIDMKKyNkZWZpbmUgVElNRVJfSURSX0NQQ1MJCQkJCQkgNAorI2RlZmluZSBUSU1FUl9JRFJfRVRSR1MJCQkJCQkgNworI2RlZmluZSBUSU1FUl9JRFJfTERSQVMJCQkJCQkgNQorI2RlZmluZSBUSU1FUl9JRFJfTERSQlMJCQkJCQkgNgorI2RlZmluZSBUSU1FUl9JRFJfTE9WUlMJCQkJCQkgMQorI2RlZmluZSBUSU1FUl9JRVIJCQkJCTB4MDAwMDAwMjQKKyNkZWZpbmUgVElNRVJfSUVSX0NPVkZTCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfSUVSX0NQQVMJCQkJCQkgMgorI2RlZmluZSBUSU1FUl9JRVJfQ1BCUwkJCQkJCSAzCisjZGVmaW5lIFRJTUVSX0lFUl9DUENTCQkJCQkJIDQKKyNkZWZpbmUgVElNRVJfSUVSX0VUUkdTCQkJCQkJIDcKKyNkZWZpbmUgVElNRVJfSUVSX0xEUkFTCQkJCQkJIDUKKyNkZWZpbmUgVElNRVJfSUVSX0xEUkJTCQkJCQkJIDYKKyNkZWZpbmUgVElNRVJfSUVSX0xPVlJTCQkJCQkJIDEKKyNkZWZpbmUgVElNRVJfSU1SCQkJCQkweDAwMDAwMDJjCisjZGVmaW5lIFRJTUVSX0lNUl9DT1ZGUwkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX0lNUl9DUEFTCQkJCQkJIDIKKyNkZWZpbmUgVElNRVJfSU1SX0NQQlMJCQkJCQkgMworI2RlZmluZSBUSU1FUl9JTVJfQ1BDUwkJCQkJCSA0CisjZGVmaW5lIFRJTUVSX0lNUl9FVFJHUwkJCQkJCSA3CisjZGVmaW5lIFRJTUVSX0lNUl9MRFJBUwkJCQkJCSA1CisjZGVmaW5lIFRJTUVSX0lNUl9MRFJCUwkJCQkJCSA2CisjZGVmaW5lIFRJTUVSX0lNUl9MT1ZSUwkJCQkJCSAxCisjZGVmaW5lIFRJTUVSX1JBCQkJCQkweDAwMDAwMDE0CisjZGVmaW5lIFRJTUVSX1JBX1JBCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfUkIJCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgVElNRVJfUkJfUkIJCQkJCQkgMAorI2RlZmluZSBUSU1FUl9SQwkJCQkJMHgwMDAwMDAxYworI2RlZmluZSBUSU1FUl9SQ19SQwkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX1NSCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIFRJTUVSX1NSX0NMS1NUQQkJCQkJCTE2CisjZGVmaW5lIFRJTUVSX1NSX0NPVkZTCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfU1JfQ1BBUwkJCQkJCSAyCisjZGVmaW5lIFRJTUVSX1NSX0NQQlMJCQkJCQkgMworI2RlZmluZSBUSU1FUl9TUl9DUENTCQkJCQkJIDQKKyNkZWZpbmUgVElNRVJfU1JfRVRSR1MJCQkJCQkgNworI2RlZmluZSBUSU1FUl9TUl9MRFJBUwkJCQkJCSA1CisjZGVmaW5lIFRJTUVSX1NSX0xEUkJTCQkJCQkJIDYKKyNkZWZpbmUgVElNRVJfU1JfTE9WUlMJCQkJCQkgMQorI2RlZmluZSBUSU1FUl9TUl9NVElPQQkJCQkJCTE3CisjZGVmaW5lIFRJTUVSX1NSX01USU9CCQkJCQkJMTgKKworLyogQml0IG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgVElNRVJfQklUKG5hbWUpCQkoMSA8PCBUSU1FUl8jI25hbWUpCisjZGVmaW5lIFRJTUVSX0JGKG5hbWUsdmFsdWUpCSgodmFsdWUpIDw8IFRJTUVSXyMjbmFtZSkKKworLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSB0aW1lcl9yZWFkKHBvcnQsaW5zdGFuY2UscmVnKSBcCisJX19yYXdfcmVhZGwocG9ydCArICgweDQwICogaW5zdGFuY2UpICsgVElNRVJfIyNyZWcpCisjZGVmaW5lIHRpbWVyX3dyaXRlKHBvcnQsaW5zdGFuY2UscmVnLHZhbHVlKSBcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIHBvcnQgKyAoMHg0MCAqIGluc3RhbmNlKSArIFRJTUVSXyMjcmVnKQorCisjZW5kaWYgLyogX0FTTV9BVlIzMl9BUkNIX0FUMzJBUF9USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXRvbWljLmgKaW5kZXggYzQwYjYwMy4uYjljMjU0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXRvbWljLmgKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiAjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykJKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQotI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKQkoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQorI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKQkoY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKIAogI2RlZmluZSBhdG9taWNfc3ViKGksIHYpCSh2b2lkKWF0b21pY19zdWJfcmV0dXJuKGksIHYpCiAjZGVmaW5lIGF0b21pY19hZGQoaSwgdikJKHZvaWQpYXRvbWljX2FkZF9yZXR1cm4oaSwgdikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2J1Zy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYnVnLmgKaW5kZXggNTIxNzY2Yi4uYWZkY2Q3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYnVnLmgKQEAgLTE4LDI3ICsxOCw1MyBAQAogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKIAotI2RlZmluZSBCVUcoKQkJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlKCIuaHdvcmQJJTBcblx0IgkJCQlcCi0JCQkgICAgICIuaHdvcmQJJTFcblx0IgkJCQlcCi0JCQkgICAgICIubG9uZwklMiIJCQkJXAotCQkJICAgICA6CQkJCQkJXAotCQkJICAgICA6ICJuIihBVlIzMl9CVUdfT1BDT0RFKSwJCQlcCi0JCQkgICAgICAgImkiKF9fTElORV9fKSwgIlgiKF9fRklMRV9fKSk7CQlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgX0JVR19PUl9XQVJOKGZsYWdzKQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoCQkJCQkJCVwKKwkJIjE6CS5od29yZAklMFxuIgkJCQkJXAorCQkiCS5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiLEBwcm9nYml0c1xuIgkJXAorCQkiMjoJLmxvbmcJMWJcbiIJCQkJCVwKKwkJIgkubG9uZwklMVxuIgkJCQkJXAorCQkiCS5zaG9ydAklMlxuIgkJCQkJXAorCQkiCS5zaG9ydAklM1xuIgkJCQkJXAorCQkiCS5vcmcJMmIgKyAlNFxuIgkJCQlcCisJCSIJLnByZXZpb3VzIgkJCQkJXAorCQk6CQkJCQkJCVwKKwkJOiAiaSIoQVZSMzJfQlVHX09QQ09ERSksICJpIihfX0ZJTEVfXyksCQkJXAorCQkgICJpIihfX0xJTkVfXyksICJpIihmbGFncyksCQkJCVwKKwkJICAiaSIoc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpKSkKIAogI2Vsc2UKIAotI2RlZmluZSBCVUcoKQkJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlKCIuaHdvcmQJJTBcblx0IgkJCQlcCi0JCQkgICAgIDogOiAibiIoQVZSMzJfQlVHX09QQ09ERSkpOwkJXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIF9CVUdfT1JfV0FSTihmbGFncykJCQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCisJCSIxOgkuaHdvcmQJJTBcbiIJCQkJCVwKKwkJIgkuc2VjdGlvbiBfX2J1Z190YWJsZSxcImFcIixAcHJvZ2JpdHNcbiIJCVwKKwkJIjI6CS5sb25nCTFiXG4iCQkJCQlcCisJCSIJLnNob3J0CSUxXG4iCQkJCQlcCisJCSIJLm9yZwkyYiArICUyXG4iCQkJCVwKKwkJIgkucHJldmlvdXMiCQkJCQlcCisJCToJCQkJCQkJXAorCQk6ICJpIihBVlIzMl9CVUdfT1BDT0RFKSwgImkiKGZsYWdzKSwJCQlcCisJCSAgImkiKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpCiAKICNlbmRpZiAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLwogCisjZGVmaW5lIEJVRygpCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlfQlVHX09SX1dBUk4oMCk7CQkJCQlcCisJCWZvciAoOzspOwkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFdBUk5fT04oY29uZGl0aW9uKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdHlwZW9mKGNvbmRpdGlvbikgX19yZXRfd2Fybl9vbiA9IChjb25kaXRpb24pOwkJXAorCQlpZiAodW5saWtlbHkoX19yZXRfd2Fybl9vbikpCQkJCVwKKwkJCV9CVUdfT1JfV0FSTihCVUdGTEFHX1dBUk5JTkcpOwkJCVwKKwkJdW5saWtlbHkoX19yZXRfd2Fybl9vbik7CQkJCVwKKwl9KQorCiAjZGVmaW5lIEhBVkVfQVJDSF9CVUcKKyNkZWZpbmUgSEFWRV9BUkNIX1dBUk5fT04KIAogI2VuZGlmIC8qIENPTkZJR19CVUcgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvaW8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKaW5kZXggYzA4ZTgxMC4uZTMwZDRiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCkBAIC0xLDEzICsxLDE1IEBACiAjaWZuZGVmIF9fQVNNX0FWUjMyX0lPX0gKICNkZWZpbmUgX19BU01fQVZSMzJfSU9fSAogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgorCiAvKiB2aXJ0X3RvX3BoeXMgd2lsbCBvbmx5IHdvcmsgd2hlbiBhZGRyZXNzIGlzIGluIFAxIG9yIFAyICovCiBzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICphZGRyZXNzKQogewpAQCAtMzYsMTA0ICszOCwyMTUgQEAKIGV4dGVybiB2b2lkIF9fcmF3X3JlYWRzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKIGV4dGVybiB2b2lkIF9fcmF3X3JlYWRzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlYih1bnNpZ25lZCBjaGFyIGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZWIodTggdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2ZvcmNlICopYWRkciA9IGI7CisJKih2b2xhdGlsZSB1OCBfX2ZvcmNlICopYWRkciA9IHY7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGV3KHVuc2lnbmVkIHNob3J0IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXcodTE2IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyID0gYjsKKwkqKHZvbGF0aWxlIHUxNiBfX2ZvcmNlICopYWRkciA9IHY7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVsKHVuc2lnbmVkIGludCBiLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVsKHUzMiB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHIgPSBiOworCSoodm9sYXRpbGUgdTMyIF9fZm9yY2UgKilhZGRyID0gdjsKIH0KLSNkZWZpbmUgX19yYXdfd3JpdGViIHdyaXRlYgotI2RlZmluZSBfX3Jhd193cml0ZXcgd3JpdGV3Ci0jZGVmaW5lIF9fcmF3X3dyaXRlbCB3cml0ZWwKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdTggX19yYXdfcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKWFkZHI7CisJcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdTggX19mb3JjZSAqKWFkZHI7CiB9Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdTE2IF9fcmF3X3JlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2ZvcmNlICopYWRkcjsKKwlyZXR1cm4gKihjb25zdCB2b2xhdGlsZSB1MTYgX19mb3JjZSAqKWFkZHI7CiB9Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgaW5saW5lIHUzMiBfX3Jhd19yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHUzMiBfX2ZvcmNlICopYWRkcjsKIH0KLSNkZWZpbmUgX19yYXdfcmVhZGIgcmVhZGIKLSNkZWZpbmUgX19yYXdfcmVhZHcgcmVhZHcKLSNkZWZpbmUgX19yYXdfcmVhZGwgcmVhZGwKIAotI2RlZmluZSB3cml0ZXNiKHAsIGQsIGwpCV9fcmF3X3dyaXRlc2IoKHVuc2lnbmVkIGludClwLCBkLCBsKQotI2RlZmluZSB3cml0ZXN3KHAsIGQsIGwpCV9fcmF3X3dyaXRlc3coKHVuc2lnbmVkIGludClwLCBkLCBsKQotI2RlZmluZSB3cml0ZXNsKHAsIGQsIGwpCV9fcmF3X3dyaXRlc2woKHVuc2lnbmVkIGludClwLCBkLCBsKQorLyogQ29udmVydCBJL08gcG9ydCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyAqLworI2lmbmRlZiBfX2lvCisjIGRlZmluZSBfX2lvKHApCSgodm9pZCAqKXBoeXNfdG9fdW5jYWNoZWQocCkpCisjZW5kaWYKIAotI2RlZmluZSByZWFkc2IocCwgZCwgbCkJCV9fcmF3X3JlYWRzYigodW5zaWduZWQgaW50KXAsIGQsIGwpCi0jZGVmaW5lIHJlYWRzdyhwLCBkLCBsKQkJX19yYXdfcmVhZHN3KCh1bnNpZ25lZCBpbnQpcCwgZCwgbCkKLSNkZWZpbmUgcmVhZHNsKHAsIGQsIGwpCQlfX3Jhd19yZWFkc2woKHVuc2lnbmVkIGludClwLCBkLCBsKQorLyoKKyAqIE5vdCByZWFsbHkgc3VyZSBhYm91dCB0aGUgYmVzdCB3YXkgdG8gc2xvdyBkb3duIEkvTyBvbgorICogQVZSMzIuIERlZmluaW5nIGl0IGFzIGEgbm8tb3AgdW50aWwgd2UgaGF2ZSBhbiBhY3R1YWwgdGVzdCBjYXNlLgorICovCisjZGVmaW5lIFNMT1dfRE9XTl9JTwlkbyB7IH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgX19CVUlMRF9NRU1PUllfU0lOR0xFKHBmeCwgYndsLCB0eXBlKQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQJCQkJCQkJXAorcGZ4IyN3cml0ZSMjYndsKHR5cGUgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCQkJXAorewkJCQkJCQkJCVwKKwl2b2xhdGlsZSB0eXBlICpfX2FkZHI7CQkJCQkJXAorCXR5cGUgX192YWw7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FkZHIgPSAodm9pZCAqKV9fc3dpenpsZV9hZGRyXyMjYndsKCh1bnNpZ25lZCBsb25nKShhZGRyKSk7CVwKKwlfX3ZhbCA9IHBmeCMjaW9zd2FiIyNid2woX19hZGRyLCB2YWwpOwkJCQlcCisJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZih0eXBlKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CQlcCisJCQkJCQkJCQlcCisJKl9fYWRkciA9IF9fdmFsOwkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHR5cGUgcGZ4IyNyZWFkIyNid2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQlcCit7CQkJCQkJCQkJXAorCXZvbGF0aWxlIHR5cGUgKl9fYWRkcjsJCQkJCQlcCisJdHlwZSBfX3ZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYWRkciA9ICh2b2lkICopX19zd2l6emxlX2FkZHJfIyNid2woKHVuc2lnbmVkIGxvbmcpKGFkZHIpKTsJXAorCQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YodHlwZSkgPiBzaXplb2YodW5zaWduZWQgbG9uZykpOwkJXAorCQkJCQkJCQkJXAorCV9fdmFsID0gKl9fYWRkcjsJCQkJCQlcCisJcmV0dXJuIHBmeCMjaW9zd2FiIyNid2woX19hZGRyLCBfX3ZhbCk7CQkJCVwKK30KKworI2RlZmluZSBfX0JVSUxEX0lPUE9SVF9TSU5HTEUocGZ4LCBid2wsIHR5cGUsIHAsIHNsb3cpCQkJXAorc3RhdGljIGlubGluZSB2b2lkIHBmeCMjb3V0IyNid2wjI3AodHlwZSB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCkJXAorewkJCQkJCQkJCVwKKwl2b2xhdGlsZSB0eXBlICpfX2FkZHI7CQkJCQkJXAorCXR5cGUgX192YWw7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FkZHIgPSBfX2lvKF9fc3dpenpsZV9hZGRyXyMjYndsKHBvcnQpKTsJCQlcCisJX192YWwgPSBwZngjI2lvc3dhYiMjYndsKF9fYWRkciwgdmFsKTsJCQkJXAorCQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YodHlwZSkgPiBzaXplb2YodW5zaWduZWQgbG9uZykpOwkJXAorCQkJCQkJCQkJXAorCSpfX2FkZHIgPSBfX3ZhbDsJCQkJCQlcCisJc2xvdzsJCQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHR5cGUgcGZ4IyNpbiMjYndsIyNwKHVuc2lnbmVkIGxvbmcgcG9ydCkJCQlcCit7CQkJCQkJCQkJXAorCXZvbGF0aWxlIHR5cGUgKl9fYWRkcjsJCQkJCQlcCisJdHlwZSBfX3ZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYWRkciA9IF9faW8oX19zd2l6emxlX2FkZHJfIyNid2wocG9ydCkpOwkJCVwKKwkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHR5cGUpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsJCVwKKwkJCQkJCQkJCVwKKwlfX3ZhbCA9ICpfX2FkZHI7CQkJCQkJXAorCXNsb3c7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHBmeCMjaW9zd2FiIyNid2woX19hZGRyLCBfX3ZhbCk7CQkJCVwKK30KKworI2RlZmluZSBfX0JVSUxEX01FTU9SWV9QRlgoYnVzLCBid2wsIHR5cGUpCQkJCVwKKwlfX0JVSUxEX01FTU9SWV9TSU5HTEUoYnVzLCBid2wsIHR5cGUpCisKKyNkZWZpbmUgQlVJTERJT19NRU0oYndsLCB0eXBlKQkJCQkJCVwKKwlfX0JVSUxEX01FTU9SWV9QRlgoLCBid2wsIHR5cGUpCQkJCQlcCisJX19CVUlMRF9NRU1PUllfUEZYKF9fbWVtXywgYndsLCB0eXBlKQorCisjZGVmaW5lIF9fQlVJTERfSU9QT1JUX1BGWChidXMsIGJ3bCwgdHlwZSkJCQkJXAorCV9fQlVJTERfSU9QT1JUX1NJTkdMRShidXMsIGJ3bCwgdHlwZSwgLCkJCQlcCisJX19CVUlMRF9JT1BPUlRfU0lOR0xFKGJ1cywgYndsLCB0eXBlLCBfcCwgU0xPV19ET1dOX0lPKQorCisjZGVmaW5lIEJVSUxESU9fSU9QT1JUKGJ3bCwgdHlwZSkJCQkJCVwKKwlfX0JVSUxEX0lPUE9SVF9QRlgoLCBid2wsIHR5cGUpCQkJCQlcCisJX19CVUlMRF9JT1BPUlRfUEZYKF9fbWVtXywgYndsLCB0eXBlKQorCitCVUlMRElPX01FTShiLCB1OCkKK0JVSUxESU9fTUVNKHcsIHUxNikKK0JVSUxESU9fTUVNKGwsIHUzMikKKworQlVJTERJT19JT1BPUlQoYiwgdTgpCitCVUlMRElPX0lPUE9SVCh3LCB1MTYpCitCVUlMRElPX0lPUE9SVChsLCB1MzIpCisKKyNkZWZpbmUgcmVhZGJfcmVsYXhlZAkJCXJlYWRiCisjZGVmaW5lIHJlYWR3X3JlbGF4ZWQJCQlyZWFkdworI2RlZmluZSByZWFkbF9yZWxheGVkCQkJcmVhZGwKKworI2RlZmluZSBfX0JVSUxEX01FTU9SWV9TVFJJTkcoYndsLCB0eXBlKQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzIyNid2wodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLAkJXAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwljb25zdCB0eXBlICpfX2RhdGEgPSBkYXRhOwkJCQkJXAorCQkJCQkJCQkJXAorCXdoaWxlIChjb3VudC0tKQkJCQkJCQlcCisJCV9fbWVtX3dyaXRlIyNid2woKl9fZGF0YSsrLCBhZGRyKTsJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIHJlYWRzIyNid2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLAlcCisJCQkgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXR5cGUgKl9fZGF0YSA9IGRhdGE7CQkJCQkJXAorCQkJCQkJCQkJXAorCXdoaWxlIChjb3VudC0tKQkJCQkJCQlcCisJCSpfX2RhdGErKyA9IF9fbWVtX3JlYWQjI2J3bChhZGRyKTsJCQlcCit9CisKKyNkZWZpbmUgX19CVUlMRF9JT1BPUlRfU1RSSU5HKGJ3bCwgdHlwZSkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG91dHMjI2J3bCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmRhdGEsCVwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KQkJCVwKK3sJCQkJCQkJCQlcCisJY29uc3QgdHlwZSAqX19kYXRhID0gZGF0YTsJCQkJCVwKKwkJCQkJCQkJCVwKKwl3aGlsZSAoY291bnQtLSkJCQkJCQkJXAorCQlfX21lbV9vdXQjI2J3bCgqX19kYXRhKyssIHBvcnQpOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zIyNid2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkYXRhLAkJXAorCQkJICAgdW5zaWduZWQgaW50IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCXR5cGUgKl9fZGF0YSA9IGRhdGE7CQkJCQkJXAorCQkJCQkJCQkJXAorCXdoaWxlIChjb3VudC0tKQkJCQkJCQlcCisJCSpfX2RhdGErKyA9IF9fbWVtX2luIyNid2wocG9ydCk7CQkJXAorfQorCisjZGVmaW5lIEJVSUxEU1RSSU5HKGJ3bCwgdHlwZSkJCQkJCQlcCisJX19CVUlMRF9NRU1PUllfU1RSSU5HKGJ3bCwgdHlwZSkJCQkJXAorCV9fQlVJTERfSU9QT1JUX1NUUklORyhid2wsIHR5cGUpCisKK0JVSUxEU1RSSU5HKGIsIHU4KQorQlVJTERTVFJJTkcodywgdTE2KQorQlVJTERTVFJJTkcobCwgdTMyKQogCiAvKgogICogaW97cmVhZCx3cml0ZX17OCwxNiwzMn0gbWFjcm9zIGluIGJvdGggbGUgKGZvciBQQ0kgc3R5bGUgY29uc3VtZXJzKSBhbmQgbmF0aXZlIGJlCiAgKi8KICNpZm5kZWYgaW9yZWFkOAogCi0jZGVmaW5lIGlvcmVhZDgocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKHApOyBfX3Y7IH0pCisjZGVmaW5lIGlvcmVhZDgocCkJCSgodW5zaWduZWQgaW50KXJlYWRiKHApKQogCi0jZGVmaW5lIGlvcmVhZDE2KHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhwKSk7IF9fdjsgfSkKLSNkZWZpbmUgaW9yZWFkMTZiZShwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gYmUxNl90b19jcHUoX19yYXdfcmVhZHcocCkpOyBfX3Y7IH0pCisjZGVmaW5lIGlvcmVhZDE2KHApCQkoKHVuc2lnbmVkIGludClyZWFkdyhwKSkKKyNkZWZpbmUgaW9yZWFkMTZiZShwKQkJKCh1bnNpZ25lZCBpbnQpX19yYXdfcmVhZHcocCkpCiAKLSNkZWZpbmUgaW9yZWFkMzIocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKHApKTsgX192OyB9KQotI2RlZmluZSBpb3JlYWQzMmJlKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBiZTMyX3RvX2NwdShfX3Jhd19yZWFkbChwKSk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkMzIocCkJCSgodW5zaWduZWQgaW50KXJlYWRsKHApKQorI2RlZmluZSBpb3JlYWQzMmJlKHApCQkoKHVuc2lnbmVkIGludClfX3Jhd19yZWFkbChwKSkKIAotI2RlZmluZSBpb3dyaXRlOCh2LHApCV9fcmF3X3dyaXRlYih2LCBwKQorI2RlZmluZSBpb3dyaXRlOCh2LHApCQl3cml0ZWIodiwgcCkKIAotI2RlZmluZSBpb3dyaXRlMTYodixwKQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksIHApCi0jZGVmaW5lIGlvd3JpdGUxNmJlKHYscCkJX19yYXdfd3JpdGV3KGNwdV90b19iZTE2KHYpLCBwKQorI2RlZmluZSBpb3dyaXRlMTYodixwKQkJd3JpdGV3KHYsIHApCisjZGVmaW5lIGlvd3JpdGUxNmJlKHYscCkJX19yYXdfd3JpdGV3KHYsIHApCiAKLSNkZWZpbmUgaW93cml0ZTMyKHYscCkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHYpLCBwKQotI2RlZmluZSBpb3dyaXRlMzJiZSh2LHApCV9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMih2KSwgcCkKKyNkZWZpbmUgaW93cml0ZTMyKHYscCkJCXdyaXRlbCh2LCBwKQorI2RlZmluZSBpb3dyaXRlMzJiZSh2LHApCV9fcmF3X3dyaXRlbCh2LCBwKQogCi0jZGVmaW5lIGlvcmVhZDhfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc2IocCxkLGMpCi0jZGVmaW5lIGlvcmVhZDE2X3JlcChwLGQsYykJX19yYXdfcmVhZHN3KHAsZCxjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAocCxkLGMpCV9fcmF3X3JlYWRzbChwLGQsYykKKyNkZWZpbmUgaW9yZWFkOF9yZXAocCxkLGMpCXJlYWRzYihwLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKHAsZCxjKQlyZWFkc3cocCxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChwLGQsYykJcmVhZHNsKHAsZCxjKQogCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChwLHMsYykJX19yYXdfd3JpdGVzYihwLHMsYykKLSNkZWZpbmUgaW93cml0ZTE2X3JlcChwLHMsYykJX19yYXdfd3JpdGVzdyhwLHMsYykKLSNkZWZpbmUgaW93cml0ZTMyX3JlcChwLHMsYykJX19yYXdfd3JpdGVzbChwLHMsYykKKyNkZWZpbmUgaW93cml0ZThfcmVwKHAscyxjKQl3cml0ZXNiKHAscyxjKQorI2RlZmluZSBpb3dyaXRlMTZfcmVwKHAscyxjKQl3cml0ZXN3KHAscyxjKQorI2RlZmluZSBpb3dyaXRlMzJfcmVwKHAscyxjKQl3cml0ZXNsKHAscyxjKQogCiAjZW5kaWYKIAotCi0vKgotICogVGhlc2UgdHdvIGFyZSBvbmx5IGhlcmUgYmVjYXVzZSBBTFNBIF90aGlua3NfIGl0IG5lZWRzIHRoZW0uLi4KLSAqLwogc3RhdGljIGlubGluZSB2b2lkIG1lbWNweV9mcm9taW8odm9pZCAqIHRvLCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmZyb20sCiAJCQkJIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JY2hhciAqcCA9IHRvOwotCXdoaWxlIChjb3VudCkgewotCQljb3VudC0tOwotCQkqcCA9IHJlYWRiKGZyb20pOwotCQlwKys7Ci0JCWZyb20rKzsKLQl9CisJbWVtY3B5KHRvLCAoY29uc3Qgdm9pZCBfX2ZvcmNlICopZnJvbSwgY291bnQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgIG1lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG8sIGNvbnN0IHZvaWQgKiBmcm9tLAogCQkJCXVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JY29uc3QgY2hhciAqcCA9IGZyb207Ci0Jd2hpbGUgKGNvdW50KSB7Ci0JCWNvdW50LS07Ci0JCXdyaXRlYigqcCwgdG8pOwotCQlwKys7Ci0JCXRvKys7Ci0JfQorCW1lbWNweSgodm9pZCBfX2ZvcmNlICopdG8sIGZyb20sIGNvdW50KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsLApAQCAtMTQyLDk5ICsyNTUsOCBAQAogCW1lbXNldCgodm9pZCBfX2ZvcmNlICopYWRkciwgdmFsLCBjb3VudCk7CiB9CiAKLS8qCi0gKiBCYWQgcmVhZC93cml0ZSBhY2Nlc3Nlcy4uLgotICovCi1leHRlcm4gdm9pZCBfX3JlYWR3cml0ZV9idWcoY29uc3QgY2hhciAqZm4pOwotCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCTB4ZmZmZmZmZmYKIAotLyogQ29udmVydCBJL08gcG9ydCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyAqLwotI2RlZmluZSBfX2lvKHApCQkoKHZvaWQgX19pb21lbSAqKXBoeXNfdG9fdW5jYWNoZWQocCkpCi0KLS8qCi0gKiAgSU8gcG9ydCBhY2Nlc3MgcHJpbWl0aXZlcwotICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBUaGUgQVZSMzIgZG9lc24ndCBoYXZlIHNwZWNpYWwgSU8gYWNjZXNzIGluc3RydWN0aW9uczsgYWxsIElPIGlzIG1lbW9yeQotICogbWFwcGVkLiBOb3RlIHRoYXQgdGhlc2UgYXJlIGRlZmluZWQgdG8gcGVyZm9ybSBsaXR0bGUgZW5kaWFuIGFjY2Vzc2VzCi0gKiBvbmx5LiBUaGVpciBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gYWNjZXNzIFBDSSBhbmQgSVNBIHBlcmlwaGVyYWxzLgotICoKLSAqIE5vdGUgdGhhdCBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmUsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGJpZyBlbmRpYW4gbW9kZSBjb25uZWN0aXZpdHkgaXMgaW4gcGxhY2UuCi0gKgotICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgaW8uaCBpbmNsdWRlIGRlZmluZXMgX19pbyB0byB0cmFuc2xhdGUgYW4gIklPIgotICogYWRkcmVzcyB0byBhIG1lbW9yeSBhZGRyZXNzLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBwcmV2ZW50IEdDQyByZS1vcmRlcmluZyBvciBjYWNoaW5nIHZhbHVlcyBpbiBleHByZXNzaW9ucwotICogYnkgaW50cm9kdWNpbmcgc2VxdWVuY2UgcG9pbnRzIGludG8gdGhlIGluKigpIGRlZmluaXRpb25zLiAgTm90ZSB0aGF0Ci0gKiBfX3Jhd18qIGRvIG5vdCBndWFyYW50ZWUgdGhpcyBiZWhhdmlvdXIuCi0gKgotICogVGhlIHtpbixvdXR9W2J3bF0gbWFjcm9zIGFyZSBmb3IgZW11bGF0aW5nIHg4Ni1zdHlsZSBQQ0kvSVNBIElPIHNwYWNlLgotICovCi0jZGVmaW5lIG91dGIodiwgcCkJCV9fcmF3X3dyaXRlYih2LCBfX2lvKHApKQotI2RlZmluZSBvdXR3KHYsIHApCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksIF9faW8ocCkpCi0jZGVmaW5lIG91dGwodiwgcCkJCV9fcmF3X3dyaXRlbChjcHVfdG9fbGUzMih2KSwgX19pbyhwKSkKLQotI2RlZmluZSBpbmIocCkJCQlfX3Jhd19yZWFkYihfX2lvKHApKQotI2RlZmluZSBpbncocCkJCQlsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhfX2lvKHApKSkKLSNkZWZpbmUgaW5sKHApCQkJbGUzMl90b19jcHUoX19yYXdfcmVhZGwoX19pbyhwKSkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tKSB7Ci0JCW91dGIoKih1OCAqKWFkZHIsIHBvcnQpOwotCQlhZGRyKys7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tKSB7Ci0JCSoodTggKilhZGRyID0gaW5iKHBvcnQpOwotCQlhZGRyKys7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSkgewotCQlvdXR3KCoodTE2ICopYWRkciwgcG9ydCk7Ci0JCWFkZHIgKz0gMjsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJKih1MTYgKilhZGRyID0gaW53KHBvcnQpOwotCQlhZGRyICs9IDI7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSkgewotCQlvdXRsKCoodTMyICopYWRkciwgcG9ydCk7Ci0JCWFkZHIgKz0gNDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJKih1MzIgKilhZGRyID0gaW5sKHBvcnQpOwotCQlhZGRyICs9IDQ7Ci0JfQotfQotCi0jZGVmaW5lIG91dHNiKHBvcnQsIGFkZHIsIGNvdW50KQlfX291dHNiKHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBpbnNiKHBvcnQsIGFkZHIsIGNvdW50KQkJX19pbnNiKHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBvdXRzdyhwb3J0LCBhZGRyLCBjb3VudCkJX19vdXRzdyhwb3J0LCBhZGRyLCBjb3VudCkKLSNkZWZpbmUgaW5zdyhwb3J0LCBhZGRyLCBjb3VudCkJCV9faW5zdyhwb3J0LCBhZGRyLCBjb3VudCkKLSNkZWZpbmUgb3V0c2wocG9ydCwgYWRkciwgY291bnQpCV9fb3V0c2wocG9ydCwgYWRkciwgY291bnQpCi0jZGVmaW5lIGluc2wocG9ydCwgYWRkciwgY291bnQpCQlfX2luc2wocG9ydCwgYWRkciwgY291bnQpCi0KIGV4dGVybiB2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKTsKQEAgLTI5Miw2ICszMTQsNCBAQAogICovCiAjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKSAgIHAKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tYXZyMzIvcHJvY2Vzc29yLmgKaW5kZXggZjY5MTM3Ny4uNmE2NDgzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvcHJvY2Vzc29yLmgKQEAgLTQwLDYgKzQwLDE0IEBACiAJVExCX0lOVkFMSUQKIH07CiAKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9STVcJKDEgPDwgMCkKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9EU1AJKDEgPDwgMSkKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9TSU1ECSgxIDw8IDIpCisjZGVmaW5lIEFWUjMyX0ZFQVRVUkVfT0NECSgxIDw8IDMpCisjZGVmaW5lIEFWUjMyX0ZFQVRVUkVfUENUUgkoMSA8PCA0KQorI2RlZmluZSBBVlIzMl9GRUFUVVJFX0pBVkEJKDEgPDwgNSkKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9GUFUJKDEgPDwgNikKKwogc3RydWN0IGF2cjMyX2NwdWluZm8gewogCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKQEAgLTQ4LDYgKzU2LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBhcmNoX3JldmlzaW9uOwogCXVuc2lnbmVkIHNob3J0IGNwdV9yZXZpc2lvbjsKIAllbnVtIHRsYl9jb25maWcgdGxiX2NvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZlYXR1cmVzOwogCiAJc3RydWN0IGNhY2hlX2luZm8gaWNhY2hlOwogCXN0cnVjdCBjYWNoZV9pbmZvIGRjYWNoZTsKQEAgLTEyNSwxMCArMTM0LDEwIEBACiAjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spICAgICgodHNrKS0+dGhyZWFkLmNwdV9jb250ZXh0LnBjKQogCiBzdHJ1Y3QgcHRfcmVnczsKLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgc2hvd19yZWdzX2xvZ19sdmwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKmxvZ19sdmwpOworZXh0ZXJuIHZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIHNwLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpsb2dfbHZsKTsKIAogI2RlZmluZSBLU1RLX0VJUCh0c2spCSgodHNrKS0+dGhyZWFkLmNwdV9jb250ZXh0LnBjKQogI2RlZmluZSBLU1RLX0VTUCh0c2spCSgodHNrKS0+dGhyZWFkLmNwdV9jb250ZXh0LmtzcCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3NldHVwLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9zZXR1cC5oCmluZGV4IDBhNTIyNDIuLjFmZjFhMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc2V0dXAuaApAQCAtMTI0LDE5ICsxMjQsMTIgQEAKICNkZWZpbmUgZm9yX2VhY2hfdGFnKHQsYmFzZSkJCQkJCQlcCiAJZm9yICh0ID0gYmFzZTsgdC0+aGRyLnNpemU7IHQgPSB0YWdfbmV4dCh0KSkKIAotZXh0ZXJuIHN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcGh5czsKLWV4dGVybiBzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqbWVtX3Jlc2VydmVkOwotZXh0ZXJuIHN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcmFtZGlzazsKLQogZXh0ZXJuIHN0cnVjdCB0YWcgKmJvb3Rsb2FkZXJfdGFnczsKIAotZXh0ZXJuIHZvaWQgc2V0dXBfYm9vdG1lbSh2b2lkKTsKLWV4dGVybiB2b2lkIHNldHVwX3Byb2Nlc3Nvcih2b2lkKTsKLWV4dGVybiB2b2lkIGJvYXJkX3NldHVwX2ZibWVtKHVuc2lnbmVkIGxvbmcgZmJtZW1fc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGZibWVtX3NpemUpOworZXh0ZXJuIHJlc291cmNlX3NpemVfdCBmYm1lbV9zdGFydDsKK2V4dGVybiByZXNvdXJjZV9zaXplX3QgZmJtZW1fc2l6ZTsKIAotLyogQ2hpcC1zcGVjaWZpYyBob29rIHRvIGVuYWJsZSB0aGUgdXNlIG9mIFNEUkFNICovCi12b2lkIGNoaXBfZW5hYmxlX3NkcmFtKHZvaWQpOwordm9pZCBzZXR1cF9wcm9jZXNzb3Iodm9pZCk7CiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvc29ja2V0LmgKaW5kZXggNTQzMjI5ZC4uYTBkMDUwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX19BU01fQVZSMzJfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3NvY2tpb3MuaAppbmRleCA4NGYzZDY1Li4wODAyZDc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogX19BU01fQVZSMzJfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9zeXNyZWcuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3N5c3JlZy5oCmluZGV4IGY5MTk3NWYuLmMwMmJjODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3N5c3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3N5c3JlZy5oCkBAIC03LDMyNiArNywyODEgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2lmbmRlZiBfX0FTTV9BVlIzMl9TWVNSRUdfSF9fCi0jZGVmaW5lIF9fQVNNX0FWUjMyX1NZU1JFR19IX18KKyNpZm5kZWYgX19BU01fQVZSMzJfU1lTUkVHX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfU1lTUkVHX0gKIAogLyogc3lzcmVnIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgU1lTUkVHX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBTWVNSRUdfRVZCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFNZU1JFR19BQ0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgU1lTUkVHX0NQVUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYwotI2RlZmluZSBTWVNSRUdfRUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFNZU1JFR19SU1JfU1VQICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQKLSNkZWZpbmUgU1lTUkVHX1JTUl9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxOAotI2RlZmluZSBTWVNSRUdfUlNSX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFjCi0jZGVmaW5lIFNZU1JFR19SU1JfSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgU1lTUkVHX1JTUl9JTlQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyNAotI2RlZmluZSBTWVNSRUdfUlNSX0VYICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4Ci0jZGVmaW5lIFNZU1JFR19SU1JfTk1JICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmMKLSNkZWZpbmUgU1lTUkVHX1JTUl9EQkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMAotI2RlZmluZSBTWVNSRUdfUkFSX1NVUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM0Ci0jZGVmaW5lIFNZU1JFR19SQVJfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzgKLSNkZWZpbmUgU1lTUkVHX1JBUl9JTlQxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzYwotI2RlZmluZSBTWVNSRUdfUkFSX0lOVDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIFNZU1JFR19SQVJfSU5UMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDQKLSNkZWZpbmUgU1lTUkVHX1JBUl9FWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0OAotI2RlZmluZSBTWVNSRUdfUkFSX05NSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRjCi0jZGVmaW5lIFNZU1JFR19SQVJfREJHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTAKLSNkZWZpbmUgU1lTUkVHX0pFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NAotI2RlZmluZSBTWVNSRUdfSk9TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU4Ci0jZGVmaW5lIFNZU1JFR19KQVZBX0xWMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNWMKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFYxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MAotI2RlZmluZSBTWVNSRUdfSkFWQV9MVjIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY0Ci0jZGVmaW5lIFNZU1JFR19KQVZBX0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjgKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFY0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YwotI2RlZmluZSBTWVNSRUdfSkFWQV9MVjUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcwCi0jZGVmaW5lIFNZU1JFR19KQVZBX0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzQKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFY3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OAotI2RlZmluZSBTWVNSRUdfSlRCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdjCi0jZGVmaW5lIFNZU1JFR19KQkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgU1lTUkVHX0NPTkZJRzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBTWVNSRUdfQ09ORklHMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIFNZU1JFR19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKLSNkZWZpbmUgU1lTUkVHX0NPTVBBUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwYwotI2RlZmluZSBTWVNSRUdfVExCRUhJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTEwCi0jZGVmaW5lIFNZU1JFR19UTEJFTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTQKLSNkZWZpbmUgU1lTUkVHX1BUQlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExOAotI2RlZmluZSBTWVNSRUdfVExCRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFjCi0jZGVmaW5lIFNZU1JFR19NTVVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjAKLSNkZWZpbmUgU1lTUkVHX1RMQkFSTE8gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNAotI2RlZmluZSBTWVNSRUdfVExCQVJISSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIFNZU1JFR19QQ0NOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMmMKLSNkZWZpbmUgU1lTUkVHX1BDTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEzMAotI2RlZmluZSBTWVNSRUdfUENOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTM0Ci0jZGVmaW5lIFNZU1JFR19QQ0NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMzgKLSNkZWZpbmUgU1lTUkVHX0JFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEzYworI2RlZmluZSBTWVNSRUdfU1IJCQkJMHgwMDAwCisjZGVmaW5lIFNZU1JFR19FVkJBCQkJCTB4MDAwNAorI2RlZmluZSBTWVNSRUdfQUNCQQkJCQkweDAwMDgKKyNkZWZpbmUgU1lTUkVHX0NQVUNSCQkJCTB4MDAwYworI2RlZmluZSBTWVNSRUdfRUNSCQkJCTB4MDAxMAorI2RlZmluZSBTWVNSRUdfUlNSX1NVUAkJCQkweDAwMTQKKyNkZWZpbmUgU1lTUkVHX1JTUl9JTlQwCQkJCTB4MDAxOAorI2RlZmluZSBTWVNSRUdfUlNSX0lOVDEJCQkJMHgwMDFjCisjZGVmaW5lIFNZU1JFR19SU1JfSU5UMgkJCQkweDAwMjAKKyNkZWZpbmUgU1lTUkVHX1JTUl9JTlQzCQkJCTB4MDAyNAorI2RlZmluZSBTWVNSRUdfUlNSX0VYCQkJCTB4MDAyOAorI2RlZmluZSBTWVNSRUdfUlNSX05NSQkJCQkweDAwMmMKKyNkZWZpbmUgU1lTUkVHX1JTUl9EQkcJCQkJMHgwMDMwCisjZGVmaW5lIFNZU1JFR19SQVJfU1VQCQkJCTB4MDAzNAorI2RlZmluZSBTWVNSRUdfUkFSX0lOVDAJCQkJMHgwMDM4CisjZGVmaW5lIFNZU1JFR19SQVJfSU5UMQkJCQkweDAwM2MKKyNkZWZpbmUgU1lTUkVHX1JBUl9JTlQyCQkJCTB4MDA0MAorI2RlZmluZSBTWVNSRUdfUkFSX0lOVDMJCQkJMHgwMDQ0CisjZGVmaW5lIFNZU1JFR19SQVJfRVgJCQkJMHgwMDQ4CisjZGVmaW5lIFNZU1JFR19SQVJfTk1JCQkJCTB4MDA0YworI2RlZmluZSBTWVNSRUdfUkFSX0RCRwkJCQkweDAwNTAKKyNkZWZpbmUgU1lTUkVHX0pFQ1IJCQkJMHgwMDU0CisjZGVmaW5lIFNZU1JFR19KT1NQCQkJCTB4MDA1OAorI2RlZmluZSBTWVNSRUdfSkFWQV9MVjAJCQkJMHgwMDVjCisjZGVmaW5lIFNZU1JFR19KQVZBX0xWMQkJCQkweDAwNjAKKyNkZWZpbmUgU1lTUkVHX0pBVkFfTFYyCQkJCTB4MDA2NAorI2RlZmluZSBTWVNSRUdfSkFWQV9MVjMJCQkJMHgwMDY4CisjZGVmaW5lIFNZU1JFR19KQVZBX0xWNAkJCQkweDAwNmMKKyNkZWZpbmUgU1lTUkVHX0pBVkFfTFY1CQkJCTB4MDA3MAorI2RlZmluZSBTWVNSRUdfSkFWQV9MVjYJCQkJMHgwMDc0CisjZGVmaW5lIFNZU1JFR19KQVZBX0xWNwkJCQkweDAwNzgKKyNkZWZpbmUgU1lTUkVHX0pUQkEJCQkJMHgwMDdjCisjZGVmaW5lIFNZU1JFR19KQkNSCQkJCTB4MDA4MAorI2RlZmluZSBTWVNSRUdfQ09ORklHMAkJCQkweDAxMDAKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzEJCQkJMHgwMTA0CisjZGVmaW5lIFNZU1JFR19DT1VOVAkJCQkweDAxMDgKKyNkZWZpbmUgU1lTUkVHX0NPTVBBUkUJCQkJMHgwMTBjCisjZGVmaW5lIFNZU1JFR19UTEJFSEkJCQkJMHgwMTEwCisjZGVmaW5lIFNZU1JFR19UTEJFTE8JCQkJMHgwMTE0CisjZGVmaW5lIFNZU1JFR19QVEJSCQkJCTB4MDExOAorI2RlZmluZSBTWVNSRUdfVExCRUFSCQkJCTB4MDExYworI2RlZmluZSBTWVNSRUdfTU1VQ1IJCQkJMHgwMTIwCisjZGVmaW5lIFNZU1JFR19UTEJBUkxPCQkJCTB4MDEyNAorI2RlZmluZSBTWVNSRUdfVExCQVJISQkJCQkweDAxMjgKKyNkZWZpbmUgU1lTUkVHX1BDQ05UCQkJCTB4MDEyYworI2RlZmluZSBTWVNSRUdfUENOVDAJCQkJMHgwMTMwCisjZGVmaW5lIFNZU1JFR19QQ05UMQkJCQkweDAxMzQKKyNkZWZpbmUgU1lTUkVHX1BDQ1IJCQkJMHgwMTM4CisjZGVmaW5lIFNZU1JFR19CRUFSCQkJCTB4MDEzYworI2RlZmluZSBTWVNSRUdfU0FCQUwJCQkJMHgwMzAwCisjZGVmaW5lIFNZU1JFR19TQUJBSAkJCQkweDAzMDQKKyNkZWZpbmUgU1lTUkVHX1NBQkQJCQkJMHgwMzA4CiAKIC8qIEJpdGZpZWxkcyBpbiBTUiAqLwotI2RlZmluZSBTWVNSRUdfU1JfQ19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTWVNSRUdfU1JfQ19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfWl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfWl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfU1JfTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfU1JfTl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfU1JfVl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfU1JfVl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfUV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfR01fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgU1lTUkVHX0dNX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0kwTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFNZU1JFR19JME1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19JMU1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBTWVNSRUdfSTFNX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSTJNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgU1lTUkVHX0kyTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0kzTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFNZU1JFR19JM01fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19FTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBTWVNSRUdfRU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTTBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgU1lTUkVHX00wX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX00xX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDIzCi0jZGVmaW5lIFNZU1JFR19NMV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NMl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBTWVNSRUdfTTJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfU1JfRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMjYKLSNkZWZpbmUgU1lTUkVHX1NSX0RfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0RNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDI3Ci0jZGVmaW5lIFNZU1JFR19ETV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19TUl9KX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAyOAotI2RlZmluZSBTWVNSRUdfU1JfSl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMjkKLSNkZWZpbmUgU1lTUkVHX1JfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0hfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDMwCi0jZGVmaW5lIFNZU1JFR19IX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLS8qIEJpdGZpZWxkcyBpbiBFVkJBICovCi0KLS8qIEJpdGZpZWxkcyBpbiBBQ0JBICovCisjZGVmaW5lIFNZU1JFR19TUl9DX09GRlNFVAkJCTAKKyNkZWZpbmUgU1lTUkVHX1NSX0NfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1pfT0ZGU0VUCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1pfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19TUl9OX09GRlNFVAkJCTIKKyNkZWZpbmUgU1lTUkVHX1NSX05fU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1NSX1ZfT0ZGU0VUCQkJMworI2RlZmluZSBTWVNSRUdfU1JfVl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfUV9PRkZTRVQJCQkJNAorI2RlZmluZSBTWVNSRUdfUV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0xfT0ZGU0VUCQkJCTUKKyNkZWZpbmUgU1lTUkVHX0xfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19UX09GRlNFVAkJCQkxNAorI2RlZmluZSBTWVNSRUdfVF9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1NSX1JfT0ZGU0VUCQkJMTUKKyNkZWZpbmUgU1lTUkVHX1NSX1JfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0dNX09GRlNFVAkJCTE2CisjZGVmaW5lIFNZU1JFR19HTV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0kwTV9PRkZTRVQJCQkxNworI2RlZmluZSBTWVNSRUdfSTBNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfSTFNX09GRlNFVAkJCTE4CisjZGVmaW5lIFNZU1JFR19JMU1fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19JMk1fT0ZGU0VUCQkJMTkKKyNkZWZpbmUgU1lTUkVHX0kyTV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0kzTV9PRkZTRVQJCQkyMAorI2RlZmluZSBTWVNSRUdfSTNNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfRU1fT0ZGU0VUCQkJMjEKKyNkZWZpbmUgU1lTUkVHX0VNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfTTBfT0ZGU0VUCQkJMjIKKyNkZWZpbmUgU1lTUkVHX00wX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfTTFfT0ZGU0VUCQkJMjMKKyNkZWZpbmUgU1lTUkVHX00xX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfTTJfT0ZGU0VUCQkJMjQKKyNkZWZpbmUgU1lTUkVHX00yX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfU1JfRF9PRkZTRVQJCQkyNgorI2RlZmluZSBTWVNSRUdfU1JfRF9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfRE1fT0ZGU0VUCQkJMjcKKyNkZWZpbmUgU1lTUkVHX0RNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfU1JfSl9PRkZTRVQJCQkyOAorI2RlZmluZSBTWVNSRUdfU1JfSl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfSF9PRkZTRVQJCQkJMjkKKyNkZWZpbmUgU1lTUkVHX0hfU0laRQkJCQkxCiAKIC8qIEJpdGZpZWxkcyBpbiBDUFVDUiAqLwotI2RlZmluZSBTWVNSRUdfQklfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTWVNSRUdfQklfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfQkVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfQkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfRkVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfRkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfUkVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSUJFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfSUJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSUVFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBTWVNSRUdfSUVFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMQotCi0vKiBCaXRmaWVsZHMgaW4gRUNSICovCi0jZGVmaW5lIFNZU1JFR19FQ1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNZU1JFR19FQ1JfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAzMgotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX1NVUCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX0lOVDAgKi8KLQotLyogQml0ZmllbGRzIGluIFJTUl9JTlQxICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfSU5UMiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX0lOVDMgKi8KLQotLyogQml0ZmllbGRzIGluIFJTUl9FWCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX05NSSAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX0RCRyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX1NVUCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX0lOVDAgKi8KLQotLyogQml0ZmllbGRzIGluIFJBUl9JTlQxICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfSU5UMiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX0lOVDMgKi8KLQotLyogQml0ZmllbGRzIGluIFJBUl9FWCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX05NSSAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX0RCRyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkVDUiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSk9TUCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjAgKi8KLQotLyogQml0ZmllbGRzIGluIEpBVkFfTFYxICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQVZBX0xWMiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjMgKi8KLQotLyogQml0ZmllbGRzIGluIEpBVkFfTFY0ICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQVZBX0xWNSAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjYgKi8KLQotLyogQml0ZmllbGRzIGluIEpBVkFfTFY3ICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKVEJBICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQkNSICovCisjZGVmaW5lIFNZU1JFR19CSV9PRkZTRVQJCQkwCisjZGVmaW5lIFNZU1JFR19CSV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0JFX09GRlNFVAkJCTEKKyNkZWZpbmUgU1lTUkVHX0JFX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfRkVfT0ZGU0VUCQkJMgorI2RlZmluZSBTWVNSRUdfRkVfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19SRV9PRkZTRVQJCQkzCisjZGVmaW5lIFNZU1JFR19SRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0lCRV9PRkZTRVQJCQk0CisjZGVmaW5lIFNZU1JFR19JQkVfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19JRUVfT0ZGU0VUCQkJNQorI2RlZmluZSBTWVNSRUdfSUVFX1NJWkUJCQkJMQogCiAvKiBCaXRmaWVsZHMgaW4gQ09ORklHMCAqLwotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9EX09GRlNFVCAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9EX1NJWkUgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9TX09GRlNFVCAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9TX1NJWkUgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfT19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfT19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfUF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9KX09GRlNFVCAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBTWVNSRUdfQ09ORklHMF9KX1NJWkUgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfRl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBTWVNSRUdfRl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTU1VVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBTWVNSRUdfTU1VVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfQVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgU1lTUkVHX0FSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX0FUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNZU1JFR19BVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JSRVZJU0lPTl9PRkZTRVQgICAgICAgICAxNgotI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SUkVWSVNJT05fU0laRSAgICAgICAgICAgOAotI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SSURfT0ZGU0VUICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgU1lTUkVHX1BST0NFU1NPUklEX1NJWkUgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfUl9PRkZTRVQJCQkwCisjZGVmaW5lIFNZU1JFR19DT05GSUcwX1JfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfRF9PRkZTRVQJCQkxCisjZGVmaW5lIFNZU1JFR19DT05GSUcwX0RfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfU19PRkZTRVQJCQkyCisjZGVmaW5lIFNZU1JFR19DT05GSUcwX1NfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfT19PRkZTRVQJCQkzCisjZGVmaW5lIFNZU1JFR19DT05GSUcwX09fU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfUF9PRkZTRVQJCQk0CisjZGVmaW5lIFNZU1JFR19DT05GSUcwX1BfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfSl9PRkZTRVQJCQk1CisjZGVmaW5lIFNZU1JFR19DT05GSUcwX0pfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfRl9PRkZTRVQJCQk2CisjZGVmaW5lIFNZU1JFR19DT05GSUcwX0ZfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX01NVVRfT0ZGU0VUCQkJNworI2RlZmluZSBTWVNSRUdfTU1VVF9TSVpFCQkJMworI2RlZmluZSBTWVNSRUdfQVJfT0ZGU0VUCQkJMTAKKyNkZWZpbmUgU1lTUkVHX0FSX1NJWkUJCQkJMworI2RlZmluZSBTWVNSRUdfQVRfT0ZGU0VUCQkJMTMKKyNkZWZpbmUgU1lTUkVHX0FUX1NJWkUJCQkJMworI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SUkVWSVNJT05fT0ZGU0VUCQkxNgorI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SUkVWSVNJT05fU0laRQkJOAorI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SSURfT0ZGU0VUCQkyNAorI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SSURfU0laRQkJCTgKIAogLyogQml0ZmllbGRzIGluIENPTkZJRzEgKi8KLSNkZWZpbmUgU1lTUkVHX0RBU1NfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1lTUkVHX0RBU1NfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX0RMU1pfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX0RMU1pfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX0RTRVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgU1lTUkVHX0RTRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU1lTUkVHX0lBU1NfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNZU1JFR19JQVNTX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNZU1JFR19JTFNaX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBTWVNSRUdfSUxTWl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfSVNFVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgU1lTUkVHX0lTRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU1lTUkVHX0RNTVVTWl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFNZU1JFR19ETU1VU1pfU0laRSAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNZU1JFR19JTU1VU1pfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAyNgotI2RlZmluZSBTWVNSRUdfSU1NVVNaX1NJWkUgICAgICAgICAgICAgICAgICAgICAgNgotCi0vKiBCaXRmaWVsZHMgaW4gQ09VTlQgKi8KLQotLyogQml0ZmllbGRzIGluIENPTVBBUkUgKi8KKyNkZWZpbmUgU1lTUkVHX0RBU1NfT0ZGU0VUCQkJMAorI2RlZmluZSBTWVNSRUdfREFTU19TSVpFCQkJMworI2RlZmluZSBTWVNSRUdfRExTWl9PRkZTRVQJCQkzCisjZGVmaW5lIFNZU1JFR19ETFNaX1NJWkUJCQkzCisjZGVmaW5lIFNZU1JFR19EU0VUX09GRlNFVAkJCTYKKyNkZWZpbmUgU1lTUkVHX0RTRVRfU0laRQkJCTQKKyNkZWZpbmUgU1lTUkVHX0lBU1NfT0ZGU0VUCQkJMTAKKyNkZWZpbmUgU1lTUkVHX0lBU1NfU0laRQkJCTMKKyNkZWZpbmUgU1lTUkVHX0lMU1pfT0ZGU0VUCQkJMTMKKyNkZWZpbmUgU1lTUkVHX0lMU1pfU0laRQkJCTMKKyNkZWZpbmUgU1lTUkVHX0lTRVRfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgU1lTUkVHX0lTRVRfU0laRQkJCTQKKyNkZWZpbmUgU1lTUkVHX0RNTVVTWl9PRkZTRVQJCQkyMAorI2RlZmluZSBTWVNSRUdfRE1NVVNaX1NJWkUJCQk2CisjZGVmaW5lIFNZU1JFR19JTU1VU1pfT0ZGU0VUCQkJMjYKKyNkZWZpbmUgU1lTUkVHX0lNTVVTWl9TSVpFCQkJNgogCiAvKiBCaXRmaWVsZHMgaW4gVExCRUhJICovCi0jZGVmaW5lIFNZU1JFR19BU0lEX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNZU1JFR19BU0lEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNZU1JFR19UTEJFSElfSV9PRkZTRVQgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNZU1JFR19UTEJFSElfSV9TSVpFICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19UTEJFSElfVl9PRkZTRVQgICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIFNZU1JFR19UTEJFSElfVl9TSVpFICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19WUE5fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBTWVNSRUdfVlBOX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgU1lTUkVHX0FTSURfT0ZGU0VUCQkJMAorI2RlZmluZSBTWVNSRUdfQVNJRF9TSVpFCQkJOAorI2RlZmluZSBTWVNSRUdfVExCRUhJX0lfT0ZGU0VUCQkJOAorI2RlZmluZSBTWVNSRUdfVExCRUhJX0lfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1RMQkVISV9WX09GRlNFVAkJCTkKKyNkZWZpbmUgU1lTUkVHX1RMQkVISV9WX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19WUE5fT0ZGU0VUCQkJMTAKKyNkZWZpbmUgU1lTUkVHX1ZQTl9TSVpFCQkJCTIyCiAKIC8qIEJpdGZpZWxkcyBpbiBUTEJFTE8gKi8KLSNkZWZpbmUgU1lTUkVHX1dfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1lTUkVHX1dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1RMQkVMT19EX09GRlNFVCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1RMQkVMT19EX1NJWkUgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1NaX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU1lTUkVHX1NaX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU1lTUkVHX0FQX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU1lTUkVHX0FQX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX0JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgU1lTUkVHX0JfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0dfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1lTUkVHX0dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1RMQkVMT19DX09GRlNFVCAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgU1lTUkVHX1RMQkVMT19DX1NJWkUgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1BGTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNZU1JFR19QRk5fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAyMgotCi0vKiBCaXRmaWVsZHMgaW4gUFRCUiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gVExCRUFSICovCisjZGVmaW5lIFNZU1JFR19XX09GRlNFVAkJCQkwCisjZGVmaW5lIFNZU1JFR19XX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfVExCRUxPX0RfT0ZGU0VUCQkJMQorI2RlZmluZSBTWVNSRUdfVExCRUxPX0RfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1NaX09GRlNFVAkJCTIKKyNkZWZpbmUgU1lTUkVHX1NaX1NJWkUJCQkJMgorI2RlZmluZSBTWVNSRUdfQVBfT0ZGU0VUCQkJNAorI2RlZmluZSBTWVNSRUdfQVBfU0laRQkJCQkzCisjZGVmaW5lIFNZU1JFR19CX09GRlNFVAkJCQk3CisjZGVmaW5lIFNZU1JFR19CX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfR19PRkZTRVQJCQkJOAorI2RlZmluZSBTWVNSRUdfR19TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1RMQkVMT19DX09GRlNFVAkJCTkKKyNkZWZpbmUgU1lTUkVHX1RMQkVMT19DX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19QRk5fT0ZGU0VUCQkJMTAKKyNkZWZpbmUgU1lTUkVHX1BGTl9TSVpFCQkJCTIyCiAKIC8qIEJpdGZpZWxkcyBpbiBNTVVDUiAqLwotI2RlZmluZSBTWVNSRUdfRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTWVNSRUdfRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTU1VQ1JfSV9PRkZTRVQgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfTU1VQ1JfSV9TSVpFICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTU1VQ1JfTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfTU1VQ1JfTl9TSVpFICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTU1VQ1JfU19PRkZTRVQgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfTU1VQ1JfU19TSVpFICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfRExBX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBTWVNSRUdfRExBX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBTWVNSRUdfRFJQX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgU1lTUkVHX0RSUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgU1lTUkVHX0lMQV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFNZU1JFR19JTEFfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNZU1JFR19JUlBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAyNgotI2RlZmluZSBTWVNSRUdfSVJQX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgNgotCi0vKiBCaXRmaWVsZHMgaW4gVExCQVJMTyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gVExCQVJISSAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUENDTlQgKi8KLQotLyogQml0ZmllbGRzIGluIFBDTlQwICovCi0KLS8qIEJpdGZpZWxkcyBpbiBQQ05UMSAqLworI2RlZmluZSBTWVNSRUdfRV9PRkZTRVQJCQkJMAorI2RlZmluZSBTWVNSRUdfRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX01fT0ZGU0VUCQkJCTEKKyNkZWZpbmUgU1lTUkVHX01fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19NTVVDUl9JX09GRlNFVAkJCTIKKyNkZWZpbmUgU1lTUkVHX01NVUNSX0lfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX01NVUNSX05fT0ZGU0VUCQkJMworI2RlZmluZSBTWVNSRUdfTU1VQ1JfTl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfTU1VQ1JfU19PRkZTRVQJCQk0CisjZGVmaW5lIFNZU1JFR19NTVVDUl9TX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19ETEFfT0ZGU0VUCQkJOAorI2RlZmluZSBTWVNSRUdfRExBX1NJWkUJCQkJNgorI2RlZmluZSBTWVNSRUdfRFJQX09GRlNFVAkJCTE0CisjZGVmaW5lIFNZU1JFR19EUlBfU0laRQkJCQk2CisjZGVmaW5lIFNZU1JFR19JTEFfT0ZGU0VUCQkJMjAKKyNkZWZpbmUgU1lTUkVHX0lMQV9TSVpFCQkJCTYKKyNkZWZpbmUgU1lTUkVHX0lSUF9PRkZTRVQJCQkyNgorI2RlZmluZSBTWVNSRUdfSVJQX1NJWkUJCQkJNgogCiAvKiBCaXRmaWVsZHMgaW4gUENDUiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gQkVBUiAqLworI2RlZmluZSBTWVNSRUdfUENDUl9SX09GRlNFVAkJCTEKKyNkZWZpbmUgU1lTUkVHX1BDQ1JfUl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfUENDUl9DX09GRlNFVAkJCTIKKyNkZWZpbmUgU1lTUkVHX1BDQ1JfQ19TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfUENDUl9TX09GRlNFVAkJCTMKKyNkZWZpbmUgU1lTUkVHX1BDQ1JfU19TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfSUVDX09GRlNFVAkJCTQKKyNkZWZpbmUgU1lTUkVHX0lFQ19TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0lFMF9PRkZTRVQJCQk1CisjZGVmaW5lIFNZU1JFR19JRTBfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19JRTFfT0ZGU0VUCQkJNgorI2RlZmluZSBTWVNSRUdfSUUxX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfRkNfT0ZGU0VUCQkJOAorI2RlZmluZSBTWVNSRUdfRkNfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19GMF9PRkZTRVQJCQk5CisjZGVmaW5lIFNZU1JFR19GMF9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0YxX09GRlNFVAkJCTEwCisjZGVmaW5lIFNZU1JFR19GMV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkYwX09GRlNFVAkJCTEyCisjZGVmaW5lIFNZU1JFR19DT05GMF9TSVpFCQkJNgorI2RlZmluZSBTWVNSRUdfQ09ORjFfT0ZGU0VUCQkJMTgKKyNkZWZpbmUgU1lTUkVHX0NPTkYxX1NJWkUJCQk2CiAKIC8qIENvbnN0YW50cyBmb3IgRUNSICovCi0jZGVmaW5lIEVDUl9VTlJFQ09WRVJBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEVDUl9UTEJfTVVMVElQTEUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEVDUl9CVVNfRVJST1JfV1JJVEUgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEVDUl9CVVNfRVJST1JfUkVBRCAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEVDUl9OTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEVDUl9BRERSX0FMSUdOX1ggICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEVDUl9QUk9URUNUSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEVDUl9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIEVDUl9JTExFR0FMX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEVDUl9VTklNUExfSU5TVFJVQ1RJT04gICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIEVDUl9QUklWSUxFR0VfVklPTEFUSU9OICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBFQ1JfRlBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgRUNSX0NPUFJPQ19BQlNFTlQgICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEVDUl9BRERSX0FMSUdOX1IgICAgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBFQ1JfQUREUl9BTElHTl9XICAgICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgRUNSX1BST1RFQ1RJT05fUiAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIEVDUl9QUk9URUNUSU9OX1cgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBFQ1JfRFRMQl9NT0RJRklFRCAgICAgICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgRUNSX1RMQl9NSVNTX1ggICAgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIEVDUl9UTEJfTUlTU19SICAgICAgICAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBFQ1JfVExCX01JU1NfVyAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgRUNSX1VOUkVDT1ZFUkFCTEUJCQkwCisjZGVmaW5lIEVDUl9UTEJfTVVMVElQTEUJCQkxCisjZGVmaW5lIEVDUl9CVVNfRVJST1JfV1JJVEUJCQkyCisjZGVmaW5lIEVDUl9CVVNfRVJST1JfUkVBRAkJCTMKKyNkZWZpbmUgRUNSX05NSQkJCQkJNAorI2RlZmluZSBFQ1JfQUREUl9BTElHTl9YCQkJNQorI2RlZmluZSBFQ1JfUFJPVEVDVElPTl9YCQkJNgorI2RlZmluZSBFQ1JfREVCVUcJCQkJNworI2RlZmluZSBFQ1JfSUxMRUdBTF9PUENPREUJCQk4CisjZGVmaW5lIEVDUl9VTklNUExfSU5TVFJVQ1RJT04JCQk5CisjZGVmaW5lIEVDUl9QUklWSUxFR0VfVklPTEFUSU9OCQkJMTAKKyNkZWZpbmUgRUNSX0ZQRQkJCQkJMTEKKyNkZWZpbmUgRUNSX0NPUFJPQ19BQlNFTlQJCQkxMgorI2RlZmluZSBFQ1JfQUREUl9BTElHTl9SCQkJMTMKKyNkZWZpbmUgRUNSX0FERFJfQUxJR05fVwkJCTE0CisjZGVmaW5lIEVDUl9QUk9URUNUSU9OX1IJCQkxNQorI2RlZmluZSBFQ1JfUFJPVEVDVElPTl9XCQkJMTYKKyNkZWZpbmUgRUNSX0RUTEJfTU9ESUZJRUQJCQkxNworI2RlZmluZSBFQ1JfVExCX01JU1NfWAkJCQkyMAorI2RlZmluZSBFQ1JfVExCX01JU1NfUgkJCQkyNAorI2RlZmluZSBFQ1JfVExCX01JU1NfVwkJCQkyOAogCiAvKiBCaXQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLwotI2RlZmluZSBTWVNSRUdfQklUKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkKLSNkZWZpbmUgU1lTUkVHX0JGKG5hbWUsdmFsdWUpICAgICAgICAgICAgICAgICAgICgoKHZhbHVlKSAmICgoMSA8PCBTWVNSRUdfIyNuYW1lIyNfU0laRSkgLSAxKSkgPDwgU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkKLSNkZWZpbmUgU1lTUkVHX0JGRVhUKG5hbWUsdmFsdWUpICAgICAgICAgICAgICAgICgoKHZhbHVlKSA+PiBTWVNSRUdfIyNuYW1lIyNfT0ZGU0VUKSAmICgoMSA8PCBTWVNSRUdfIyNuYW1lIyNfU0laRSkgLSAxKSkKLSNkZWZpbmUgU1lTUkVHX0JGSU5TKG5hbWUsdmFsdWUsb2xkKSAgICAgICAgICAgICgoKG9sZCkgJiB+KCgoMSA8PCBTWVNSRUdfIyNuYW1lIyNfU0laRSkgLSAxKSA8PCBTWVNSRUdfIyNuYW1lIyNfT0ZGU0VUKSkgfCBTWVNSRUdfQkYobmFtZSx2YWx1ZSkpCisjZGVmaW5lIFNZU1JFR19CSVQobmFtZSkJCQkJXAorCSgxIDw8IFNZU1JFR18jI25hbWUjI19PRkZTRVQpCisjZGVmaW5lIFNZU1JFR19CRihuYW1lLHZhbHVlKQkJCQlcCisJKCgodmFsdWUpICYgKCgxIDw8IFNZU1JFR18jI25hbWUjI19TSVpFKSAtIDEpKQlcCisJIDw8IFNZU1JFR18jI25hbWUjI19PRkZTRVQpCisjZGVmaW5lIFNZU1JFR19CRkVYVChuYW1lLHZhbHVlKVwKKwkoKCh2YWx1ZSkgPj4gU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkJCVwKKwkgJiAoKDEgPDwgU1lTUkVHXyMjbmFtZSMjX1NJWkUpIC0gMSkpCisjZGVmaW5lIFNZU1JFR19CRklOUyhuYW1lLHZhbHVlLG9sZCkJCQlcCisJKCgob2xkKSAmIH4oKCgxIDw8IFNZU1JFR18jI25hbWUjI19TSVpFKSAtIDEpCVwKKwkJICAgIDw8IFNZU1JFR18jI25hbWUjI19PRkZTRVQpKQkJXAorCSB8IFNZU1JFR19CRihuYW1lLHZhbHVlKSkKIAorLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwogI2lmZGVmIF9fQ0hFQ0tFUl9fCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2J1aWx0aW5fbWZzcih1bnNpZ25lZCBsb25nIHJlZyk7CiBleHRlcm4gdm9pZCBfX2J1aWx0aW5fbXRzcih1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CiAjZW5kaWYKIAotLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBzeXNyZWdfcmVhZChyZWcpICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX21mc3IoU1lTUkVHXyMjcmVnKQotI2RlZmluZSBzeXNyZWdfd3JpdGUocmVnLCB2YWx1ZSkgICAgICAgICAgICAgICAgX19idWlsdGluX210c3IoU1lTUkVHXyMjcmVnLCB2YWx1ZSkKKyNkZWZpbmUgc3lzcmVnX3JlYWQocmVnKQkJX19idWlsdGluX21mc3IoU1lTUkVHXyMjcmVnKQorI2RlZmluZSBzeXNyZWdfd3JpdGUocmVnLCB2YWx1ZSkJX19idWlsdGluX210c3IoU1lTUkVHXyMjcmVnLCB2YWx1ZSkKIAotI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NZU1JFR19IX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9BVlIzMl9TWVNSRUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9zeXN0ZW0uaAppbmRleCBhYzU5NjA1OC4uYTgyMzZiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmgKQEAgLTksNiArOSw3IEBACiAjZGVmaW5lIF9fQVNNX0FWUjMyX1NZU1RFTV9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtMTQwLDE1ICsxNDEsOSBAQAogCQkJCSAgIHNpemVvZigqKHB0cikpKSkKIAogc3RydWN0IHB0X3JlZ3M7Ci1leHRlcm4gdm9pZCBfX2RpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcsCi0JCSAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgX19kaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiwgc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywKLQkJCSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7Ci0KLSNkZWZpbmUgZGllKG1zZywgcmVncywgZXJyKQkJCQkJXAotCV9fZGllKG1zZywgcmVncywgZXJyLCBfX0ZJTEVfXyAiOiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIGRpZV9pZl9rZXJuZWwobXNnLCByZWdzLCBlcnIpCQkJCQlcCi0JX19kaWVfaWZfa2VybmVsKG1zZywgcmVncywgZXJyLCBfX0ZJTEVfXyAiOiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCit2b2lkIE5PUkVUX1RZUEUgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKTsKK3ZvaWQgX2V4Y2VwdGlvbihsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNvZGUsCisJCXVuc2lnbmVkIGxvbmcgYWRkcik7CiAKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KQkoeCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3RocmVhZF9pbmZvLmgKaW5kZXggZDFmNWIzNS4uYTJlNjA2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi90aHJlYWRfaW5mby5oCkBAIC04Myw2ICs4Myw3IEBACiAjZGVmaW5lIFRJRl9TSU5HTEVfU1RFUAkJNgkvKiBzaW5nbGUgc3RlcCBhZnRlciBuZXh0IGJyZWFrICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTcKICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk4CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsICovCisjZGVmaW5lIFRJRl9DUFVfR09JTkdfVE9fU0xFRVAJOQkvKiBDUFUgaXMgZW50ZXJpbmcgc2xlZXAgMCBtb2RlICovCiAjZGVmaW5lIFRJRl9VU0VSU1BBQ0UJCTMxICAgICAgLyogdHJ1ZSBpZiBGUyBzZXRzIHVzZXJzcGFjZSAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKQEAgLTk0LDYgKzk1LDcgQEAKICNkZWZpbmUgX1RJRl9TSU5HTEVfU1RFUAkoMSA8PCBUSUZfU0lOR0xFX1NURVApCiAjZGVmaW5lIF9USUZfTUVNRElFCQkoMSA8PCBUSUZfTUVNRElFKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMSA8PCBUSUZfUkVTVE9SRV9TSUdNQVNLKQorI2RlZmluZSBfVElGX0NQVV9HT0lOR19UT19TTEVFUCAoMSA8PCBUSUZfQ1BVX0dPSU5HX1RPX1NMRUVQKQogCiAvKiBYWFg6IFRoZXNlIHR3byBtYXNrcyBtdXN0IG5ldmVyIHNwYW4gbW9yZSB0aGFuIDE2IGJpdHMhICovCiAvKiB3b3JrIHRvIGRvIG9uIGludGVycnVwdC9leGNlcHRpb24gcmV0dXJuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1hdnIzMi91YWNjZXNzLmgKaW5kZXggNzRhNjc5ZTkuLmVkMDkyMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi91YWNjZXNzLmgKQEAgLTE4MSwyNCArMTgxLDIzIEBACiAKICNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJXAogKHsJCQkJCQkJCQlcCi0JdHlwZW9mKCoocHRyKSkgX19ndV92YWwgPSAodHlwZW9mKCoocHRyKSkgX19mb3JjZSkwOwkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWwgPSAwOwkJCQkJXAogCWludCBfX2d1X2VyciA9IDA7CQkJCQkJXAogCQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCiAJY2FzZSAxOiBfX2dldF91c2VyX2FzbSgidWIiLCBfX2d1X3ZhbCwgcHRyLCBfX2d1X2Vycik7IGJyZWFrOwlcCiAJY2FzZSAyOiBfX2dldF91c2VyX2FzbSgidWgiLCBfX2d1X3ZhbCwgcHRyLCBfX2d1X2Vycik7IGJyZWFrOwlcCiAJY2FzZSA0OiBfX2dldF91c2VyX2FzbSgidyIsIF9fZ3VfdmFsLCBwdHIsIF9fZ3VfZXJyKTsgYnJlYWs7CVwKLQljYXNlIDg6IF9fZ2V0X3VzZXJfYXNtKCJkIiwgX19ndV92YWwsIHB0ciwgX19ndV9lcnIpOyBicmVhazsJXAogCWRlZmF1bHQ6IF9fZ3VfZXJyID0gX19nZXRfdXNlcl9iYWQoKTsgYnJlYWs7CQkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKLQl4ID0gX19ndV92YWw7CQkJCQkJCVwKKwl4ID0gKHR5cGVvZigqKHB0cikpKV9fZ3VfdmFsOwkJCQkJXAogCV9fZ3VfZXJyOwkJCQkJCQlcCiB9KQogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfY2hlY2soeCwgcHRyLCBzaXplKQkJCQkJXAogKHsJCQkJCQkJCQlcCi0JdHlwZW9mKCoocHRyKSkgX19ndV92YWwgPSAodHlwZW9mKCoocHRyKSkgX19mb3JjZSkwOwkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWwgPSAwOwkJCQkJXAogCWNvbnN0IHR5cGVvZigqKHB0cikpIF9fdXNlciAqIF9fZ3VfYWRkciA9IChwdHIpOwkJXAogCWludCBfX2d1X2VyciA9IDA7CQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMjE2LDEwICsyMTUsNiBAQAogCQkJX19nZXRfdXNlcl9hc20oInciLCBfX2d1X3ZhbCwgX19ndV9hZGRyLAlcCiAJCQkJICAgICAgIF9fZ3VfZXJyKTsJCQlcCiAJCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgODoJCQkJCQkJXAotCQkJX19nZXRfdXNlcl9hc20oImQiLCBfX2d1X3ZhbCwgX19ndV9hZGRyLAlcCi0JCQkJICAgICAgIF9fZ3VfZXJyKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCiAJCWRlZmF1bHQ6CQkJCQkJXAogCQkJX19ndV9lcnIgPSBfX2dldF91c2VyX2JhZCgpOwkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKQEAgLTIyNyw3ICsyMjIsNyBAQAogCX0gZWxzZSB7CQkJCQkJCVwKIAkJX19ndV9lcnIgPSAtRUZBVUxUOwkJCQkJXAogCX0JCQkJCQkJCVwKLQl4ID0gX19ndV92YWw7CQkJCQkJCVwKKwl4ID0gKHR5cGVvZigqKHB0cikpKV9fZ3VfdmFsOwkJCQkJXAogCV9fZ3VfZXJyOwkJCQkJCQlcCiB9KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9zb2NrZXQuaAppbmRleCAwMWNmZGYxLi41YjE4ZGZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvc29ja2V0LmgKQEAgLTUxLDYgKzUxLDggQEAKIAogI2RlZmluZSBTT19QRUVSU0VDICAgICAgICAgICAgIDMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9zb2NraW9zLmgKaW5kZXggNmM0MDEyZi4uY2ZlN2JmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3NvY2tldC5oIGIvaW5jbHVkZS9hc20tZnJ2L3NvY2tldC5oCmluZGV4IDMxZGIxOGYuLmE4MjNiZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvc29ja2V0LmgKQEAgLTQ5LDYgKzQ5LDggQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tZnJ2L3NvY2tpb3MuaAppbmRleCA4YTZlNGIyLi41ZGJkZDEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9zb2NraW9zLmgKQEAgLTcsNyArNyw4IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tJT1NfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RpdjY0LmgKaW5kZXggOGY0ZTMxOS4uYTRhNDkzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGl2NjQuaApAQCAtMzAsNiArMzAsMTEgQEAKIAlfX3JlbTsJCQkJCQkJXAogIH0pCiAKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpCit7CisJcmV0dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjsKK30KKwogI2VsaWYgQklUU19QRVJfTE9ORyA9PSAzMgogCiBleHRlcm4gdWludDMyX3QgX19kaXY2NF8zMih1aW50NjRfdCAqZGl2aWRlbmQsIHVpbnQzMl90IGRpdmlzb3IpOwpAQCAtNDksNiArNTQsOCBAQAogCV9fcmVtOwkJCQkJCVwKICB9KQogCitleHRlcm4gdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpOworCiAjZWxzZSAvKiBCSVRTX1BFUl9MT05HID09ID8/ICovCiAKICMgZXJyb3IgZG9fZGl2KCkgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGhlIEM2NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA2ZDdlMjc5Li5kYzhmOTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMTM5LDggKzEzOSwxNSBAQAogI2RlZmluZSBwdGVfc2FtZShBLEIpCShwdGVfdmFsKEEpID09IHB0ZV92YWwoQikpCiAjZW5kaWYKIAotI2lmbmRlZiBfX0hBVkVfQVJDSF9QQUdFX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHBhZ2VfdGVzdF9hbmRfY2xlYXJfZGlydHkocGFnZSkgKDApCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BBR0VfVEVTVF9ESVJUWQorI2RlZmluZSBwYWdlX3Rlc3RfZGlydHkocGFnZSkJCSgwKQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUEFHRV9DTEVBUl9ESVJUWQorI2RlZmluZSBwYWdlX2NsZWFyX2RpcnR5KHBhZ2UpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9QQUdFX1RFU1RfRElSVFkKICNkZWZpbmUgcHRlX21heWJlX2RpcnR5KHB0ZSkJCXB0ZV9kaXJ0eShwdGUpCiAjZWxzZQogI2RlZmluZSBwdGVfbWF5YmVfZGlydHkocHRlKQkJKDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tldC5oCmluZGV4IGViYzgzMGYuLjM5OTExZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tpb3MuaAppbmRleCBkMDA1ZDk1Li5lOWM3ZWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogX19BUkNIX0g4MzAwX1NPQ0tJT1NfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9kaXY2NC5oIGIvaW5jbHVkZS9hc20taTM4Ni9kaXY2NC5oCmluZGV4IDc1YzY3YzcuLjQzOGU5ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZGl2NjQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fSTM4Nl9ESVY2NAogI2RlZmluZSBfX0kzODZfRElWNjQKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qCiAgKiBkb19kaXYoKSBpcyBOT1QgYSBDIGZ1bmN0aW9uLiBJdCB3YW50cyB0byByZXR1cm4KICAqIHR3byB2YWx1ZXMgKHRoZSBxdW90aWVudCBhbmQgdGhlIHJlbWFpbmRlciksIGJ1dApAQCAtNDUsNCArNDcsNiBAQAogCXJldHVybiBkdW0yOwogCiB9CisKK2V4dGVybiB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1pMzg2L3NvY2tldC5oCmluZGV4IDU3NTVkNTcuLjk5Y2E2NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zb2NrZXQuaApAQCAtNDksNSArNDksNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWkzODYvc29ja2lvcy5oCmluZGV4IDZiNzQ3ZjguLmZmNTI4YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1pYTY0L3NvY2tldC5oCmluZGV4IGQ2MzhlZjMuLjllNDJjZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zb2NrZXQuaApAQCAtNTgsNSArNTgsNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMgICAgICAgICAgICAgMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fSUE2NF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NvY2tpb3MuaAppbmRleCBjZjk0ODU3Li4xNWM5MjQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NvY2tpb3MuaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLW0zMnIvc29ja2V0LmgKaW5kZXggYWNkZjc0OC4uNzkzZDVkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fTTMyUl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1tMzJyL3NvY2tpb3MuaAppbmRleCBmODk5NjJlLi42YzFmYjliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmICAvKiBfQVNNX00zMlJfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1tNjhrL2RpdjY0LmgKaW5kZXggOWY2NWRlMS4uMzNjYWFkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZGl2NjQuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX002OEtfRElWNjRfSAogI2RlZmluZSBfTTY4S19ESVY2NF9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvKiBuID0gbiAvIGJhc2U7IHJldHVybiByZW07ICovCiAKICNkZWZpbmUgZG9fZGl2KG4sIGJhc2UpICh7CQkJCQlcCkBAIC0yMyw0ICsyNSw1IEBACiAJX19yZW07CQkJCQkJCVwKIH0pCiAKK2V4dGVybiB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcik7CiAjZW5kaWYgLyogX002OEtfRElWNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLW02OGsvc29ja2V0LmgKaW5kZXggYTU5NjZlYy4uNmQyMWI5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQyAgICAgICAgICAgICAzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1tNjhrL3NvY2tpb3MuaAppbmRleCA5YjllZDk3Li5jMDRhMjM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmIC8qIF9fQVJDSF9NNjhLX1NPQ0tJT1NfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaAppbmRleCAyOGQ5MDdkLi40OTMzYjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaApAQCAtOTYsNiArOTYsNiBAQAogdW5zaWduZWQgbG9uZyBfX2luaXQgcnVuX3VuY2FjaGVkKHZvaWQgKmZ1bmMpOwogCiBleHRlcm4gdm9pZCAqa21hcF9jb2hlcmVudChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGt1bm1hcF9jb2hlcmVudChzdHJ1Y3QgcGFnZSAqcGFnZSk7CitleHRlcm4gdm9pZCBrdW5tYXBfY29oZXJlbnQodm9pZCk7CiAKICNlbmRpZiAvKiBfQVNNX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kaXY2NC5oIGIvaW5jbHVkZS9hc20tbWlwcy9kaXY2NC5oCmluZGV4IGQxMDc4MzIuLjY2MTg5ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDA0ICBNYWNpZWogVy4gUm96eWNraQotICogQ29weXJpZ2h0IChDKSAyMDAzIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAwNyBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9BU01fRElWNjRfSAogI2RlZmluZSBfQVNNX0RJVjY0X0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNpZiAoX01JUFNfU1pMT05HID09IDMyKQogCiAjaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+CkBAIC03OCw2ICs4MCw4IEBACiAJX19xdW90ID0gX19xdW90IDw8IDMyIHwgX19sb3c7IFwKIAkobikgPSBfX3F1b3Q7IFwKIAlfX21vZDsgfSkKKworZXh0ZXJuIHVpbnQ2NF90IGRpdjY0XzY0KHVpbnQ2NF90IGRpdmlkZW5kLCB1aW50NjRfdCBkaXZpc29yKTsKICNlbmRpZiAvKiAoX01JUFNfU1pMT05HID09IDMyKSAqLwogCiAjaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKQEAgLTEwMSw2ICsxMDUsMTEgQEAKIAkobikgPSBfX3F1b3Q7IFwKIAlfX21vZDsgfSkKIAorc3RhdGljIGlubGluZSB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcikKK3sKKwlyZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yOworfQorCiAjZW5kaWYgLyogKF9NSVBTX1NaTE9ORyA9PSA2NCkgKi8KIAogI2VuZGlmIC8qIF9BU01fRElWNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2lycS5oIGIvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2lycS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2U3ZWQzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy9pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tbWlwcy90eDM5MjcvaXJxLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgotICovCi0jaWZuZGVmIF9fQVNNX1RYMzkyN19JUlFfSAotI2RlZmluZSBfX0FTTV9UWDM5MjdfSVJRX0gKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotc3RydWN0IHRiX2lycV9zcGFjZSB7Ci0Jc3RydWN0IHRiX2lycV9zcGFjZSogbmV4dDsKLQlpbnQgc3RhcnRfaXJxbm87Ci0JaW50IG5yX2lycXM7Ci0Jdm9pZCAoKm1hc2tfZnVuYykoaW50IGlycV9uciwgaW50IHNwYWNlX2lkKTsKLQl2b2lkICgqdW5tYXNrX2Z1bmMpKGludCBpcnFfbm8sIGludCBzcGFjZV9pZCk7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgc3BhY2VfaWQ7Ci0JaW50IGNhbl9zaGFyZTsKLX07Ci1leHRlcm4gc3RydWN0IHRiX2lycV9zcGFjZSogdGJfaXJxX3NwYWNlczsKLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhZGRfdGJfaXJxX3NwYWNlKHN0cnVjdCB0Yl9pcnFfc3BhY2UqIHNwKQotewotCXNwLT5uZXh0ID0gdGJfaXJxX3NwYWNlczsKLQl0Yl9pcnFfc3BhY2VzID0gc3A7Ci19Ci0KLQotc3RydWN0IHB0X3JlZ3M7Ci1leHRlcm4gdm9pZAotdG9zaGliYWJvYXJkc19zcHVyaW91cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlycSk7Ci1leHRlcm4gdm9pZAotdG9zaGliYWJvYXJkc19pcnFkaXNwYXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlycSk7Ci0KLWV4dGVybiBzdHJ1Y3QgaXJxYWN0aW9uICoKLXRvc2hpYmFib2FyZHNfZ2V0X2lycV9hY3Rpb24oaW50IGlycSk7Ci1leHRlcm4gaW50Ci10b3NoaWJhYm9hcmRzX3NldHVwX2lycShpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICogbmV3KTsKLQotCi1leHRlcm4gaW50ICgqdG9zaGliYWJvYXJkc19nZW5faWFjaykodm9pZCk7Ci0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLSNkZWZpbmUgTlJfSVNBX0lSUVMgMTYKLSNkZWZpbmUgVEJfSVJRX0lTX0lTQShpcnEpCVwKLQkoMCA8PSAoaXJxKSAmJiAoaXJxKSA8IE5SX0lTQV9JUlFTKQotI2RlZmluZSBUQl9JUlFfVE9fSVNBX0lSUShpcnEpCShpcnEpCi0KLSNlbmRpZiAvKiBfX0FTTV9UWDM5MjdfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy9qbXIzOTI3LmggYi9pbmNsdWRlL2FzbS1taXBzL2ptcjM5Mjcvam1yMzkyNy5oCmluZGV4IGM1MGU2OGYuLjk1OGUyOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy9qbXIzOTI3LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2ptcjM5MjcuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEZWZpbmVzIGZvciB0aGUgVEpTWVMgSk1SLVRYMzkyNy9KTUktMzkyN0lPMi9KTVktMTM5NElGLgorICogRGVmaW5lcyBmb3IgdGhlIFRKU1lTIEpNUi1UWDM5MjcKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMTIsMTAgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4MzkyNy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vam1yMzkyNy9pcnEuaD4KLSNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2VuZGlmCiAKIC8qIENTICovCiAjZGVmaW5lIEpNUjM5MjdfUk9NQ0UwCTB4MWZjMDAwMDAJLyogNE0gKi8KQEAgLTM1LDI4ICszMiwxMCBAQAogI2RlZmluZSBKTVIzOTI3X1NEUkFNX1NJWkUJMHgwMjAwMDAwMAkvKiAzMk0gKi8KICNkZWZpbmUgSk1SMzkyN19QT1JUX0JBU0UJS1NFRzEKIAotLyogc2VsZWN0IGluZGlyZWN0IGluaXRpYXRvciBhY2Nlc3MgcGVyIGVycmF0YSAqLwotI2RlZmluZSBKTVIzOTI3X0lOSVRfSU5ESVJFQ1RfUENJCi0jZGVmaW5lIFBDSV9JU1RBVF9JRElDQyAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBDSV9JUENJQkVfSUJFX0xPTkcgICAgICAgMAotI2RlZmluZSBQQ0lfSVBDSUJFX0lDTURfSU9SRUFEICAgIDIKLSNkZWZpbmUgUENJX0lQQ0lCRV9JQ01EX0lPV1JJVEUgICAzCi0jZGVmaW5lIFBDSV9JUENJQkVfSUNNRF9NRU1SRUFEICAgNgotI2RlZmluZSBQQ0lfSVBDSUJFX0lDTURfTUVNV1JJVEUgIDcKLSNkZWZpbmUgUENJX0lQQ0lCRV9JQ01EX1NISUZUICAgICA0Ci0KIC8qIEFkZHJlc3MgbWFwICh2aXJ0dWFsIGFkZHJlc3MpICovCiAjZGVmaW5lIEpNUjM5MjdfUk9NMF9CQVNFCShLU0VHMSArIEpNUjM5MjdfUk9NQ0UwKQogI2RlZmluZSBKTVIzOTI3X1JPTTFfQkFTRQkoS1NFRzEgKyBKTVIzOTI3X1JPTUNFMSkKICNkZWZpbmUgSk1SMzkyN19JT0NfQkFTRQkoS1NFRzEgKyBKTVIzOTI3X1JPTUNFMikKLSNkZWZpbmUgSk1SMzkyN19JT0JfQkFTRQkoS1NFRzEgKyBKTVIzOTI3X1JPTUNFMykKLSNkZWZpbmUgSk1SMzkyN19JU0FNRU1fQkFTRQkoSk1SMzkyN19JT0JfQkFTRSkKLSNkZWZpbmUgSk1SMzkyN19JU0FJT19CQVNFCShKTVIzOTI3X0lPQl9CQVNFICsgMHgwMTAwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0JBU0UJKEpNUjM5MjdfSU9CX0JBU0UgKyAweDAyMDAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0xDRFZHQV9SRUdfQkFTRQkoSk1SMzkyN19JT0JfQkFTRSArIDB4MDMwMDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfTENEVkdBX01FTV9CQVNFCShKTVIzOTI3X0lPQl9CQVNFICsgMHgwMzgwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19KTVkxMzk0X0JBU0UJKEtTRUcxICsgSk1SMzkyN19ST01DRTUpCi0jZGVmaW5lIEpNUjM5MjdfUFJFTUlFUjNfQkFTRQkoSk1SMzkyN19KTVkxMzk0X0JBU0UgKyAweDAwMTAwMDAwKQogI2RlZmluZSBKTVIzOTI3X1BDSU1FTV9CQVNFCShLU0VHMSArIEpNUjM5MjdfUENJTUVNKQogI2RlZmluZSBKTVIzOTI3X1BDSUlPX0JBU0UJKEtTRUcxICsgSk1SMzkyN19QQ0lJTykKIApAQCAtNzIsMjUgKzUxLDE0IEBACiAjZGVmaW5lIEpNUjM5MjdfSU9DX0lOVFBfQUREUgkoSk1SMzkyN19JT0NfQkFTRSArIDB4MDAwYjAwMDApCiAjZGVmaW5lIEpNUjM5MjdfSU9DX1JFU0VUX0FERFIJKEpNUjM5MjdfSU9DX0JBU0UgKyAweDAwMGYwMDAwKQogCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19SRVZfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwMDAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfRUlOVFNfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwMjAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfRUlOVE1fQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwMzAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfTk1JX0FERFIJKEpNUjM5MjdfSVNBQ19CQVNFICsgMHgwMDQwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0xFRF9BRERSCShKTVIzOTI3X0lTQUNfQkFTRSArIDB4MDA1MDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRQX0FERFIJKEpNUjM5MjdfSVNBQ19CQVNFICsgMHgwMDgwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVFMxX0FERFIJKEpNUjM5MjdfSVNBQ19CQVNFICsgMHgwMDkwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVFMyX0FERFIJKEpNUjM5MjdfSVNBQ19CQVNFICsgMHgwMGEwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVE1fQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwYjAwMDAwKQotCiAvKiBGbGFzaCBST00gKi8KICNkZWZpbmUgSk1SMzkyN19GTEFTSF9CQVNFCShKTVIzOTI3X1JPTTBfQkFTRSkKICNkZWZpbmUgSk1SMzkyN19GTEFTSF9TSVpFCTB4MDA0MDAwMDAKIAotLyogYml0cyBmb3IgSU9DX1JFVi9JT0NfQlJFVi9JU0FDX1JFViAoaGlnaCBieXRlKSAqLworLyogYml0cyBmb3IgSU9DX1JFVi9JT0NfQlJFViAoaGlnaCBieXRlKSAqLwogI2RlZmluZSBKTVIzOTI3X0lEVF9NQVNLCTB4ZmMKICNkZWZpbmUgSk1SMzkyN19SRVZfTUFTSwkweDAzCiAjZGVmaW5lIEpNUjM5MjdfSU9DX0lEVAkJMHhlMAotI2RlZmluZSBKTVIzOTI3X0lTQUNfSURUCTB4MjAKIAogLyogYml0cyBmb3IgSU9DX0lOVFMxL0lPQ19JTlRTMi9JT0NfSU5UTS9JT0NfSU5UUCAoaGlnaCBieXRlKSAqLwogI2RlZmluZSBKTVIzOTI3X0lPQ19JTlRCX1BDSUEJMApAQCAtMTE0LDQwICs4Miw2IEBACiAjZGVmaW5lIEpNUjM5MjdfSU9DX1JFU0VUX0NQVQkxCiAjZGVmaW5lIEpNUjM5MjdfSU9DX1JFU0VUX1BDSQkyCiAKLS8qIGJpdHMgZm9yIElTQUNfRUlOVFMvSVNBQ19FSU5UTSAoaGlnaCBieXRlKSAqLwotI2RlZmluZSBKTVIzOTI3X0lTQUNfRUlOVEJfSU9DSEsJMgotI2RlZmluZSBKTVIzOTI3X0lTQUNfRUlOVEJfQldUSAk0Ci0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5URl9JT0NISwkoMSA8PCBKTVIzOTI3X0lTQUNfRUlOVEJfSU9DSEspCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5URl9CV1RICSgxIDw8IEpNUjM5MjdfSVNBQ19FSU5UQl9CV1RIKQotCi0vKiBiaXRzIGZvciBJU0FDX0xFRCAoaGlnaCBieXRlKSAqLwotI2RlZmluZSBKTVIzOTI3X0lTQUNfTEVEX0lTQUxFRAkweDAxCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19MRURfVVNSTEVECTB4MDIKLQotLyogYml0cyBmb3IgSVNBQ19JTlRTL0lTQUNfSU5UTS9JU0FDX0lOVFAgKGhpZ2ggYnl0ZSkgKi8KLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEJfSVJRNQkwCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRCX0lSUUtCCTEKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEJfSVJRTU9VU0UJMgotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlE0CTMKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEJfSVJRMTIJNAotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlEzCTUKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEJfSVJRMTAJNgotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JU0FFUgk3Ci0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUTUJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRNSkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEZfSVJRS0IJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRS0IpCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUU1PVVNFCSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lSUU1PVVNFKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5URl9JUlE0CSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lSUTQpCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUTEyCSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lSUTEyKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5URl9JUlEzCSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lSUTMpCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUTEwCSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lSUTEwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5URl9JU0FFUgkoMSA8PCBKTVIzOTI3X0lTQUNfSU5UQl9JU0FFUikKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2lmIDAKLSNkZWZpbmUgam1yMzkyN19pb2NfcmVnX291dChkLCBhKQkoKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYSkpID0gKGQpIDw8IDgpCi0jZGVmaW5lIGptcjM5MjdfaW9jX3JlZ19pbihhKQkJKCgoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkgPj4gOCkgJiAweGZmKQotI2Vsc2UKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKICNkZWZpbmUgam1yMzkyN19pb2NfcmVnX291dChkLCBhKQkoKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSkgPSAoZCkpCiAjZGVmaW5lIGptcjM5MjdfaW9jX3JlZ19pbihhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSkKQEAgLTE1NywzMSArOTEsOSBAQAogI2Vsc2UKICNlcnJvciAiTm8gRW5kaWFuIgogI2VuZGlmCi0jZW5kaWYKLSNkZWZpbmUgam1yMzkyN19pc2FjX3JlZ19vdXQoZCwgYSkJKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYSkpID0gKGQpKQotI2RlZmluZSBqbXIzOTI3X2lzYWNfcmVnX2luKGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGEpKQotCi1zdGF0aWMgaW5saW5lIGludCBqbXIzOTI3X2hhdmVfaXNhYyh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgaWR0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyByb21jcjM7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jcm9tY3IzID0gdHgzOTI3X3JvbWNwdHItPmNyWzNdOwotCXR4MzkyN19yb21jcHRyLT5jclszXSAmPSAweGZmZmZlZmZmOwkvKiBkbyBub3Qgd2FpdCBpbmZpbml0ZWx5ICovCi0JaWR0ID0gam1yMzkyN19pc2FjX3JlZ19pbihKTVIzOTI3X0lTQUNfUkVWX0FERFIpICYgSk1SMzkyN19JRFRfTUFTSzsKLQl0eDM5Mjdfcm9tY3B0ci0+Y3JbM10gPSByb21jcjM7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIGlkdCA9PSBKTVIzOTI3X0lTQUNfSURUOwotfQotI2RlZmluZSBqbXIzOTI3X2hhdmVfbnZyYW0oKSBcCi0JKChqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfUkVWX0FERFIpICYgSk1SMzkyN19JRFRfTUFTSykgPT0gSk1SMzkyN19JT0NfSURUKQogCiAvKiBMRUQgbWFjcm8gKi8KICNkZWZpbmUgam1yMzkyN19sZWRfc2V0KG4vKjAtMTYqLykJam1yMzkyN19pb2NfcmVnX291dCh+KG4pLCBKTVIzOTI3X0lPQ19MRURfQUREUikKLSNkZWZpbmUgam1yMzkyN19pb19sZWRfc2V0KG4vKjAtMyovKQlqbXIzOTI3X2lzYWNfcmVnX291dCgobiksIEpNUjM5MjdfSVNBQ19MRURfQUREUikKIAogI2RlZmluZSBqbXIzOTI3X2xlZF9hbmRfc2V0KG4vKjAtMTYqLykJam1yMzkyN19pb2NfcmVnX291dCgofihuKSkgJiBqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfTEVEX0FERFIpLCBKTVIzOTI3X0lPQ19MRURfQUREUikKIApAQCAtMTkwLDEwICsxMDIsNiBAQAogI2RlZmluZSBqbXIzOTI3X2RpcHN3MigpCSgodHgzOTI3X3Bpb3B0ci0+ZGluICYgKDEgPDwgMTApKSA9PSAwKQogI2RlZmluZSBqbXIzOTI3X2RpcHN3MygpCSgoam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX0RJUFNXX0FERFIpICYgMikgPT0gMCkKICNkZWZpbmUgam1yMzkyN19kaXBzdzQoKQkoKGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19ESVBTV19BRERSKSAmIDEpID09IDApCi0jZGVmaW5lIGptcjM5MjdfaW9fZGlwc3coKQkoam1yMzkyN19pc2FjX3JlZ19pbihKTVIzOTI3X0lTQUNfTEVEX0FERFIpID4+IDQpCi0KLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogLyoKICAqIElSUSBtYXBwaW5ncwpAQCAtMjA2LDE2ICsxMTQsMTAgQEAKICAqLwogI2RlZmluZSBKTVIzOTI3X05SX0lSUV9JUkMJMTYJLyogT24tQ2hpcCBJUkMgKi8KICNkZWZpbmUgSk1SMzkyN19OUl9JUlFfSU9DCTgJLyogUENJL01PREVNL0lOVFs2OjddICovCi0jZGVmaW5lIEpNUjM5MjdfTlJfSVJRX0lTQUMJOAkvKiBJU0EgKi8KIAotCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lSQwlOUl9JU0FfSVJRUworI2RlZmluZSBKTVIzOTI3X0lSUV9JUkMJMTYKICNkZWZpbmUgSk1SMzkyN19JUlFfSU9DCShKTVIzOTI3X0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JUkMpCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUMJKEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfTlJfSVJRX0lPQykKLSNkZWZpbmUgSk1SMzkyN19JUlFfRU5ECShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19OUl9JUlFfSVNBQykKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNfSVJDKGlycSkJKEpNUjM5MjdfSVJRX0lSQyA8PSAoaXJxKSAmJiAoaXJxKSA8IEpNUjM5MjdfSVJRX0lPQykKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNfSU9DKGlycSkJCShKTVIzOTI3X0lSUV9JT0MgPD0gKGlycSkgJiYgKGlycSkgPCBKTVIzOTI3X0lSUV9JU0FDKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU19JU0FDKGlycSkJKEpNUjM5MjdfSVJRX0lTQUMgPD0gKGlycSkgJiYgKGlycSkgPCBKTVIzOTI3X0lSUV9FTkQpCisjZGVmaW5lIEpNUjM5MjdfSVJRX0VORAkoSk1SMzkyN19JUlFfSU9DICsgSk1SMzkyN19OUl9JUlFfSU9DKQogCiAjZGVmaW5lIEpNUjM5MjdfSVJRX0lSQ19JTlQwCShKTVIzOTI3X0lSUV9JUkMgKyBUWDM5MjdfSVJfSU5UMCkKICNkZWZpbmUgSk1SMzkyN19JUlFfSVJDX0lOVDEJKEpNUjM5MjdfSVJRX0lSQyArIFRYMzkyN19JUl9JTlQxKQpAQCAtMjQwLDM3ICsxNDIsMTMgQEAKICNkZWZpbmUgSk1SMzkyN19JUlFfSU9DX0lOVDYJKEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfSU9DX0lOVEJfSU5UNikKICNkZWZpbmUgSk1SMzkyN19JUlFfSU9DX0lOVDcJKEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfSU9DX0lOVEJfSU5UNykKICNkZWZpbmUgSk1SMzkyN19JUlFfSU9DX1NPRlQJKEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfSU9DX0lOVEJfU09GVCkKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlE1CShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRNSkKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlFLQgkoSk1SMzkyN19JUlFfSVNBQyArIEpNUjM5MjdfSVNBQ19JTlRCX0lSUUtCKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lSUU1PVVNFCShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRTU9VU0UpCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUNfSVJRNAkoSk1SMzkyN19JUlFfSVNBQyArIEpNUjM5MjdfSVNBQ19JTlRCX0lSUTQpCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUNfSVJRMTIJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X0lTQUNfSU5UQl9JUlExMikKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlEzCShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRMykKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlExMAkoSk1SMzkyN19JUlFfSVNBQyArIEpNUjM5MjdfSVNBQ19JTlRCX0lSUTEwKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lTQUVSCShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVNBRVIpCiAKLSNpZiAwCS8qIGF1dG8gZGV0ZWN0ICovCi0vKiBSVEw4MDE5QVMgMTBNIEV0aGVyIChKTUktMzkyN0lPMjpKUFcyOjEtMiBTaG9ydCkgKi8KLSNkZWZpbmUgSk1SMzkyN19JUlFfRVRIRVIxCUpNUjM5MjdfSVJRX0lSQ19JTlQwCi0jZW5kaWYKIC8qIElPQyAoUENJLCBNT0RFTSkgKi8KICNkZWZpbmUgSk1SMzkyN19JUlFfSU9DSU5UCUpNUjM5MjdfSVJRX0lSQ19JTlQxCi0vKiBJU0FDIChJU0EsIFBDTUNJQSwgS0VZQk9BUkQsIE1PVVNFKSAqLwotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDSU5UCUpNUjM5MjdfSVJRX0lSQ19JTlQyCiAvKiBUQzM1ODE1IDEwME0gRXRoZXIgKEpNUi1UWDM5MTI6SlBXNDoyLTMgU2hvcnQpICovCiAjZGVmaW5lIEpNUjM5MjdfSVJRX0VUSEVSMAlKTVIzOTI3X0lSUV9JUkNfSU5UMwogLyogQ2xvY2sgVGljayAoMTBtcykgKi8KICNkZWZpbmUgSk1SMzkyN19JUlFfVElDSwlKTVIzOTI3X0lSUV9JUkNfVE1SMAotI2RlZmluZSBKTVIzOTI3X0lSUV9JREUJCUpNUjM5MjdfSVJRX0lTQUNfSVJRMTIKLQotLyogSUVFRTEzOTQgKE5vdGUgdGhhdCB0aGlzIG1heSBjb25mbGljdHMgd2l0aCBSVEw4MDE5QVMgMTBNIEV0aGVyLi4uKSAqLwotI2RlZmluZSBKTVIzOTI3X0lSUV9QUkVNSUVSMwlKTVIzOTI3X0lSUV9JUkNfSU5UMAotCi0vKiBJL08gUG9ydHMgKi8KLS8qIFJUTDgwMTlBUyAxME0gRXRoZXIgKi8KLSNkZWZpbmUgSk1SMzkyN19FVEhFUjFfUE9SVAkoSk1SMzkyN19JU0FJT19CQVNFIC0gSk1SMzkyN19QT1JUX0JBU0UgKyAweDI4MCkKLSNkZWZpbmUgSk1SMzkyN19LQkRfUE9SVAkoSk1SMzkyN19JU0FJT19CQVNFIC0gSk1SMzkyN19QT1JUX0JBU0UgKyAweDAwODAwMDYwKQotI2RlZmluZSBKTVIzOTI3X0lERV9QT1JUCShKTVIzOTI3X0lTQUlPX0JBU0UgLSBKTVIzOTI3X1BPUlRfQkFTRSArIDB4MDAxMDAxZjApCiAKIC8qIENsb2NrcyAqLwogI2RlZmluZSBKTVIzOTI3X0NPUkVDTEsJMTMyNzEwNDAwCS8qIDEzMi43TUh6ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvdHgzOTI3LmggYi9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvdHgzOTI3LmgKaW5kZXggYjNkNjdjNy4uMGI5MDczYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L3R4MzkyNy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eDM5MjcuaApAQCAtMjIsOCArMjIsNiBAQAogI2RlZmluZSBUWDM5MjdfU0lPX1JFRyhjaCkJKDB4ZmZmZWYzMDAgKyAoY2gpICogMHgxMDApCiAjZGVmaW5lIFRYMzkyN19QSU9fUkVHCQkweGZmZmVmNTAwCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KIHN0cnVjdCB0eDM5Mjdfc2RyYW1jX3JlZyB7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjcls4XTsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRyWzNdOwpAQCAtMTY0LDggKzE2Miw2IEBACiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwZGNyOwogfTsKIAotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQogLyoKICAqIFNEUkFNQwogICovCkBAIC0zNDgsOCArMzQ0LDYgQEAKICNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMRE1BX0FMTAkweDAwMDAwMDBmCiAjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTERNQShjaCkJKDB4MDAwMDAwMDE8PChjaCkpCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KICNkZWZpbmUgdHgzOTI3X3NkcmFtY3B0cgkoKHN0cnVjdCB0eDM5Mjdfc2RyYW1jX3JlZyAqKVRYMzkyN19TRFJBTUNfUkVHKQogI2RlZmluZSB0eDM5Mjdfcm9tY3B0cgkJKChzdHJ1Y3QgdHgzOTI3X3JvbWNfcmVnICopVFgzOTI3X1JPTUNfUkVHKQogI2RlZmluZSB0eDM5MjdfZG1hcHRyCQkoKHN0cnVjdCB0eDM5MjdfZG1hX3JlZyAqKVRYMzkyN19ETUFfUkVHKQpAQCAtMzYwLDYgKzM1NCw0IEBACiAjZGVmaW5lIHR4MzkyN19zaW9wdHIoY2gpCSgoc3RydWN0IHR4eDkyN19zaW9fcmVnICopVFgzOTI3X1NJT19SRUcoY2gpKQogI2RlZmluZSB0eDM5MjdfcGlvcHRyCQkoKHN0cnVjdCB0eHg5MjdfcGlvX3JlZyAqKVRYMzkyN19QSU9fUkVHKQogCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCiAjZW5kaWYgLyogX19BU01fVFgzOTI3X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eHg5MjcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eHg5MjcuaAppbmRleCA5ZDU3OTJlLi41OGE4ZmY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvdHh4OTI3LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L3R4eDkyNy5oCkBAIC0xMCw4ICsxMCw2IEBACiAjaWZuZGVmIF9fQVNNX1RYWDkyN19ICiAjZGVmaW5lIF9fQVNNX1RYWDkyN19ICiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KIHN0cnVjdCB0eHg5MjdfdG1yX3JlZyB7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0Y3I7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0aXNyOwpAQCAtNTIsOSArNTAsNiBAQAogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbWFza2V4dDsKIH07CiAKLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLQogLyoKICAqIFRNUgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCmluZGV4IDE0Nzg0NGUuLjhjMDhmYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIF9fZ2V0X2RiZSh4LHB0cixzaXplKQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnI7CQkJCQkJCVwKLQlfX3R5cGVvZigqKHB0cikpIF9fZ3VfdmFsOwkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX2d1X3ZhbDsJCQkJCVwKIAl1bnNpZ25lZCBsb25nIF9fZ3VfYWRkcjsJCQkJCVwKIAlfX2FzbV9fKCIiOiI9ciIgKF9fZ3VfdmFsKSk7CQkJCQlcCiAJX19ndV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIChwdHIpOwkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9ocGMzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9ocGMzLmgKaW5kZXggZmNlYzUyYi4uYzQ3MjlmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaHBjMy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2hwYzMuaApAQCAtMjA2LDcgKzIwNiw3IEBACiAjZGVmaW5lIEhQQzNfR0lPTUlTQ19FUlRJTUUJMHgxCS8qIEVuYWJsZSBleHRlcm5hbCB0aW1lciByZWFsIHRpbWUuICovCiAjZGVmaW5lIEhQQzNfR0lPTUlTQ19ERU5ESUFOCTB4MgkvKiBkbWEgZGVzY3JpcHRvciBlbmRpYW4sIDE9bGl0IDA9YmlnICovCiAKLQl2b2xhdGlsZSB1MzIgZWVwcm9tOwkJLyogRUVQUk9NIGRhdGEgcmVnLiAqLworCXUzMiBlZXByb207CQkJLyogRUVQUk9NIGRhdGEgcmVnLiAqLwogI2RlZmluZSBIUEMzX0VFUFJPTV9FUFJPVAkweDAxCS8qIFByb3RlY3QgcmVnaXN0ZXIgZW5hYmxlICovCiAjZGVmaW5lIEhQQzNfRUVQUk9NX0NTRUwJMHgwMgkvKiBDaGlwIHNlbGVjdCAqLwogI2RlZmluZSBIUEMzX0VFUFJPTV9FQ0xLCTB4MDQJLyogRUVQUk9NIGNsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9pcDIyLmggYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9pcDIyLmgKaW5kZXggNjU5MmYzYi4uZjQ5ODFjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaXAyMi5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lwMjIuaApAQCAtNzIsNyArNzIsNyBAQAogCiAjZGVmaW5lIGlwMjJfaXNfZnVsbGhvdXNlKCkJKHNnaW9jLT5zeXNpZCAmIFNHSU9DX1NZU0lEX0ZVTExIT1VTRSkKIAotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwMjJfZWVwcm9tX3JlYWQodm9sYXRpbGUgdW5zaWduZWQgaW50ICpjdHJsLCBpbnQgcmVnKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpcDIyX2VlcHJvbV9yZWFkKHVuc2lnbmVkIGludCAqY3RybCwgaW50IHJlZyk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgaXAyMl9udnJhbV9yZWFkKGludCByZWcpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL21jLmggYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9tYy5oCmluZGV4IGM1MmY3ODMuLjE1NzZjMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL21jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaApAQCAtNTcsNyArNTcsNyBAQAogCXZvbGF0aWxlIHUzMiBkaXZpZGVyOwkvKiBEaXZpZGVyIHJlZyBmb3IgUlBTUyAqLwogCiAJdTMyIF91bnVzZWQ1OwotCXZvbGF0aWxlIHUzMiBlZXByb207CS8qIEVFUFJPTSBieXRlIHJlZyBmb3IgcjRrICovCisJdTMyIGVlcHJvbTsJCS8qIEVFUFJPTSBieXRlIHJlZyBmb3IgcjRrICovCiAjZGVmaW5lIFNHSU1DX0VFUFJPTV9QUkUJMHgwMDAwMDAwMSAvKiBlZXByb20gY2hpcCBQUkUgcGluIGFzc2VydGlvbiAqLwogI2RlZmluZSBTR0lNQ19FRVBST01fQ1NFTAkweDAwMDAwMDAyIC8qIEFjdGl2ZSBoaWdoLCBlZXByb20gY2hpcCBzZWxlY3QgKi8KICNkZWZpbmUgU0dJTUNfRUVQUk9NX1NFQ0xPQ0sJMHgwMDAwMDAwNCAvKiBFRVBST00gc2VyaWFsIGNsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX2ludC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9pbnQuaAppbmRleCA0MmQ0Y2YwLi5jMGQ1MjA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX2ludC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfaW50LmgKQEAgLTE1Nyw2ICsxNTcsNyBAQAogICogTWFzayB2YWx1ZXMgZm9yIGVhY2ggaW50ZXJydXB0CiAgKi8KIAorI2RlZmluZSBfQkNNMTQ4MF9JTlRfTUFTSyh3LG4pICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sodywoKG4pICYgMHgzRikpCiAjZGVmaW5lIF9CQ00xNDgwX0lOVF9NQVNLMShuKSAgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoKChuKSAmIDB4M0YpKQogI2RlZmluZSBfQkNNMTQ4MF9JTlRfT0ZGU0VUKG4pICAgICAgICAgICAgICAoKChuKSAmIDB4NDApIDw8IDYpCiAKQEAgLTE5NSw2ICsxOTYsNyBAQAogI2RlZmluZSBNX0JDTTE0ODBfSU5UX1BNSV9ISUdIICAgICAgICAgICAgICBfQkNNMTQ4MF9JTlRfTUFTSzEoS19CQ00xNDgwX0lOVF9QTUlfSElHSCkKICNkZWZpbmUgTV9CQ00xNDgwX0lOVF9QTU9fTE9XICAgICAgICAgICAgICAgX0JDTTE0ODBfSU5UX01BU0sxKEtfQkNNMTQ4MF9JTlRfUE1PX0xPVykKICNkZWZpbmUgTV9CQ00xNDgwX0lOVF9QTU9fSElHSCAgICAgICAgICAgICAgX0JDTTE0ODBfSU5UX01BU0sxKEtfQkNNMTQ4MF9JTlRfUE1PX0hJR0gpCisjZGVmaW5lIE1fQkNNMTQ4MF9JTlRfTUJPWF9BTEwgICAgICAgICAgICAgIF9CQ00xNDgwX0lOVF9NQVNLKDgsS19CQ00xNDgwX0lOVF9NQk9YXzBfMCkKICNkZWZpbmUgTV9CQ00xNDgwX0lOVF9NQk9YXzBfMCAgICAgICAgICAgICAgX0JDTTE0ODBfSU5UX01BU0sxKEtfQkNNMTQ4MF9JTlRfTUJPWF8wXzApCiAjZGVmaW5lIE1fQkNNMTQ4MF9JTlRfTUJPWF8wXzEgICAgICAgICAgICAgIF9CQ00xNDgwX0lOVF9NQVNLMShLX0JDTTE0ODBfSU5UX01CT1hfMF8xKQogI2RlZmluZSBNX0JDTTE0ODBfSU5UX01CT1hfMF8yICAgICAgICAgICAgICBfQkNNMTQ4MF9JTlRfTUFTSzEoS19CQ00xNDgwX0lOVF9NQk9YXzBfMikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbWMuaAppbmRleCA2YmRjOTQxLi5hNmE0Mzc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX21jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9tYy5oCkBAIC0zODIsNiArMzgyLDEwIEBACiAjZGVmaW5lIE1fQkNNMTQ4MF9NQ19DUzYgICAgICAgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMTApCiAjZGVmaW5lIE1fQkNNMTQ4MF9NQ19DUzcgICAgICAgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMTEpCiAKKyNkZWZpbmUgTV9CQ00xNDgwX01DX0NTICAgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX01DX0NTMCkKKyNkZWZpbmUgVl9CQ00xNDgwX01DX0NTKHgpICAgICAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9NQ19DUzApCisjZGVmaW5lIEdfQkNNMTQ4MF9NQ19DUyh4KSAgICAgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9NQ19DUzAsTV9CQ00xNDgwX01DX0NTMCkKKwogI2RlZmluZSBNX0JDTTE0ODBfTUNfQ01EX0FDVElWRSAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDE2KQogCiAvKgpAQCAtNDEyLDYgKzQxNiw4IEBACiAjZGVmaW5lIEtfQkNNMTQ4MF9NQ19EUkFNX1RZUEVfRERSMgkgICAgMgogI2VuZGlmCiAKKyNkZWZpbmUgS19CQ00xNDgwX01DX0RSQU1fVFlQRV9ERFIyX1BBU1MxICAgMAorCiAjZGVmaW5lIFZfQkNNMTQ4MF9NQ19EUkFNX1RZUEVfSkVERUMgICAgICAgIFZfQkNNMTQ4MF9NQ19EUkFNX1RZUEUoS19CQ00xNDgwX01DX0RSQU1fVFlQRV9KRURFQykKICNkZWZpbmUgVl9CQ00xNDgwX01DX0RSQU1fVFlQRV9GQ1JBTSAgICAgICAgVl9CQ00xNDgwX01DX0RSQU1fVFlQRShLX0JDTTE0ODBfTUNfRFJBTV9UWVBFX0ZDUkFNKQogCkBAIC01MTEsNiArNTE3LDIyIEBACiAjZGVmaW5lIE1fQkNNMTQ4MF9NQ19XUl9PRFQ2X0NTNgkgICAgX1NCX01BS0VNQVNLMSgzMSkKIAogI2RlZmluZSBNX0JDTTE0ODBfTUNfQ1NfT0REX09EVF9FTgkgICAgX1NCX01BS0VNQVNLMSgzMikKKworI2RlZmluZSBTX0JDTTE0ODBfTUNfT0RUMAkgICAgICAgICAgICAwCisjZGVmaW5lIE1fQkNNMTQ4MF9NQ19PRFQwCQkgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX01DX09EVDApCisjZGVmaW5lIFZfQkNNMTQ4MF9NQ19PRFQwKHgpCQkgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9NQ19PRFQwKQorCisjZGVmaW5lIFNfQkNNMTQ4MF9NQ19PRFQyCSAgICAgICAgICAgIDgKKyNkZWZpbmUgTV9CQ00xNDgwX01DX09EVDIJCSAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfTUNfT0RUMikKKyNkZWZpbmUgVl9CQ00xNDgwX01DX09EVDIoeCkJCSAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX09EVDIpCisKKyNkZWZpbmUgU19CQ00xNDgwX01DX09EVDQJICAgICAgICAgICAgMTYKKyNkZWZpbmUgTV9CQ00xNDgwX01DX09EVDQJCSAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfTUNfT0RUNCkKKyNkZWZpbmUgVl9CQ00xNDgwX01DX09EVDQoeCkJCSAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX09EVDQpCisKKyNkZWZpbmUgU19CQ00xNDgwX01DX09EVDYJICAgICAgICAgICAgMjQKKyNkZWZpbmUgTV9CQ00xNDgwX01DX09EVDYJCSAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfTUNfT0RUNikKKyNkZWZpbmUgVl9CQ00xNDgwX01DX09EVDYoeCkJCSAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX09EVDYpCiAjZW5kaWYKIAogLyoKQEAgLTU4OCwxMSArNjEwLDExIEBACiAjZGVmaW5lCU1fQkNNMTQ4MF9NQ19EUU9fU0hJRlQgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDQ3KQogI2VuZGlmCiAKLSNkZWZpbmUgU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUICAgICAgICAgICAgNDgKLSNkZWZpbmUgTV9CQ00xNDgwX01DX0RMTF9ERUZBVUxUICAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUKQotI2RlZmluZSBWX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoeCkgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUKQotI2RlZmluZSBHX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoeCkgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQsTV9CQ00xNDgwX01DX0RMTF9ERUZBVUxUKQotI2RlZmluZSBWX0JDTTE0ODBfTUNfRExMX0RFRkFVTFRfREVGQVVMVCAgICBWX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoMHgxMCkKKyNkZWZpbmUgU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUICAgICAgICAgICA0OAorI2RlZmluZSBNX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQgICAgICAgICAgIF9TQl9NQUtFTUFTSyg2LFNfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCkKKyNkZWZpbmUgVl9CQ00xNDgwX01DX0RMTF9ERUZBVUxUKHgpICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUKQorI2RlZmluZSBHX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoeCkgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCxNX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQpCisjZGVmaW5lIFZfQkNNMTQ4MF9NQ19ETExfREVGQVVMVF9ERUZBVUxUICAgVl9CQ00xNDgwX01DX0RMTF9ERUZBVUxUKDB4MTApCiAKICNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTQ4MCwgUEFTUzIpCiAjZGVmaW5lIFNfQkNNMTQ4MF9NQ19ETExfUkVHQ1RSTAkgIDU0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCmluZGV4IGMyZGQyZmUuLmJkYTM5MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCkBAIC0yMzAsNiArMjMwLDcgQEAKIAogI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKSkKICNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTl9QT1JUKGNoYW4pICAgICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0RVQVJUX0lOUF9PUlQpCiAKIC8qCiAgKiBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBhYnNvbHV0ZSBhZGRyZXNzZXMuCkBAIC00MDQsNiArNDA1LDIxIEBACiAjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfQUxJQVNfTUFJTEJPWF8wICAgICAgICAgICAweDAwMDAJCS8qIDB4MHgwICovCiAjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfQUxJQVNfTUFJTEJPWF8wX1NFVCAgICAgICAweDAwMDgJCS8qIDB4MHg4ICovCiAKKy8qCisgKiB0aGVzZSBtYWNyb3Mgd29yayB0b2dldGhlciB0byBidWlsZCB0aGUgYWRkcmVzcyBvZiBhIG1haWxib3gKKyAqIHJlZ2lzdGVyLCBlLmcuLCBBX0JDTTE0ODBfTUFJTEJPWF9SRUdJU1RFUigwLFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9TRVQsMikKKyAqIGZvciBtYm94XzBfc2V0X2NwdTIgcmV0dXJucyAweDAwMTAwMjQwQzgKKyAqLworI2RlZmluZSBSX0JDTTE0ODBfSU1SX01BSUxCT1hfQ1BVICAgICAgICAgMHgwMAorI2RlZmluZSBSX0JDTTE0ODBfSU1SX01BSUxCT1hfU0VUICAgICAgICAgMHgwOAorI2RlZmluZSBSX0JDTTE0ODBfSU1SX01BSUxCT1hfQ0xSICAgICAgICAgMHgxMAorI2RlZmluZSBSX0JDTTE0ODBfSU1SX01BSUxCT1hfTlVNX1NQQUNJTkcgMHgyMAorI2RlZmluZSBBX0JDTTE0ODBfTUFJTEJPWF9SRUdJU1RFUihudW0scmVnLGNwdSkgXAorICAgIChBX0JDTTE0ODBfSU1SX0NQVTBfQkFTRSArIFwKKyAgICAgKG51bSAqIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9OVU1fU1BBQ0lORykgKyBcCisgICAgIChjcHUgKiBCQ00xNDgwX0lNUl9SRUdJU1RFUl9TUEFDSU5HKSArIFwKKyAgICAgKFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF8wX0NQVSArIHJlZykpCisKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBQZXJmb3JtYW5jZSBDb3VudGVyIFJlZ2lzdGVycyAoU2VjdGlvbiA0LjcpCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC00MjgsNiArNDQ0LDEwIEBACiAjZGVmaW5lIEFfQkNNMTQ4MF9TQ0RfUEVSRl9DTlRfNiAgICAgICAgICAgIDB4MDAxMDAyMDUwMAogI2RlZmluZSBBX0JDTTE0ODBfU0NEX1BFUkZfQ05UXzcgICAgICAgICAgICAweDAwMTAwMjA1MDgKIAorI2RlZmluZSBCQ00xNDgwX1NDRF9OVU1fUEVSRl9DTlQgOAorI2RlZmluZSBCQ00xNDgwX1NDRF9QRVJGX0NOVF9TUEFDSU5HIDgKKyNkZWZpbmUgQV9CQ00xNDgwX1NDRF9QRVJGX0NOVChuKSAoQV9TQ0RfUEVSRl9DTlRfMCsobipCQ00xNDgwX1NDRF9QRVJGX0NOVF9TUEFDSU5HKSkKKwogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogU3lzdGVtIEJ1cyBXYXRjaGVyIFJlZ2lzdGVycyAoU2VjdGlvbiA0LjgpCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3NjZC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9zY2QuaAppbmRleCA2NDhiZWQ5Li42MTExZDZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3NjZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfc2NkLmgKQEAgLTEwLDcgKzEwLDcgQEAKICAgICAqCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiwyMDAzCisgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA1CiAgICAgKiAgQnJvYWRjb20gQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTc4LDYgKzc4LDcgQEAKICNkZWZpbmUgS19TWVNfUEFSVF9CQ00xMjgwICAgICAgICAgIDB4MTIwNgogI2RlZmluZSBLX1NZU19QQVJUX0JDTTE0NTUgICAgICAgICAgMHgxNDA3CiAjZGVmaW5lIEtfU1lTX1BBUlRfQkNNMTI1NSAgICAgICAgICAweDEyNTcKKyNkZWZpbmUgS19TWVNfUEFSVF9CQ00xMTU4ICAgICAgICAgIDB4MTE1NgogCiAvKgogICogTWFudWZhY3R1cmluZyBJbmZvcm1hdGlvbiBSZWdpc3RlciAoVGFibGUgMTQpCkBAIC0yMzcsNTggKzIzOCw0MiBAQAogICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoVGFibGUgMzEpCiAgKiBSZWdpc3RlcjogUEVSRl9DTlRfQ0ZHXzAKICAqCi0gKiBTaW5jZSB0aGUgY2xlYXIvZW5hYmxlIGJpdHMgYXJlIG1vdmVkIGNvbXBhcmVkIHRvIHRoZQotICogMTI1MCBhbmQgdGhlcmUgYXJlIG1vcmUgZmllbGRzLCB0aGlzIHJlZ2lzdGVyIHdpbGwgYmUgQkNNMTQ4MCBzcGVjaWZpYy4KKyAqIFNQQ19DRkdfU1JDWzAtM10gaXMgdGhlIHNhbWUgYXMgdGhlIDEyNTAuCisgKiBTUENfQ0ZHX1NSQ1s0LTddIG9ubHkgZXhpc3Qgb24gdGhlIDE0ODAKKyAqIFRoZSBjbGVhci9lbmFibGUgYml0cyBhcmUgaW4gZGlmZmVyZW50IGxvY2F0aW9ucyBvbiB0aGUgMTI1MCBhbmQgMTQ4MC4KICAqLwogCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDMCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMCkKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDMCh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzApCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzAoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzAsTV9CQ00xNDgwX1NQQ19DRkdfU1JDMCkKKyNkZWZpbmUgU19TUENfQ0ZHX1NSQzQgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1fU1BDX0NGR19TUkM0ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NQQ19DRkdfU1JDNCkKKyNkZWZpbmUgVl9TUENfQ0ZHX1NSQzQoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NQQ19DRkdfU1JDNCkKKyNkZWZpbmUgR19TUENfQ0ZHX1NSQzQoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1BDX0NGR19TUkM0LE1fU1BDX0NGR19TUkM0KQogCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzEgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDMSAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMSkKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDMSh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzEpCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzEoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzEsTV9CQ00xNDgwX1NQQ19DRkdfU1JDMSkKKyNkZWZpbmUgU19TUENfQ0ZHX1NSQzUgICAgICAgICAgICAgIDQwCisjZGVmaW5lIE1fU1BDX0NGR19TUkM1ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NQQ19DRkdfU1JDNSkKKyNkZWZpbmUgVl9TUENfQ0ZHX1NSQzUoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NQQ19DRkdfU1JDNSkKKyNkZWZpbmUgR19TUENfQ0ZHX1NSQzUoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1BDX0NGR19TUkM1LE1fU1BDX0NGR19TUkM1KQogCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzIgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkMyKQotI2RlZmluZSBHX0JDTTE0ODBfU1BDX0NGR19TUkMyKHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkMyLE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzIpCisjZGVmaW5lIFNfU1BDX0NGR19TUkM2ICAgICAgICAgICAgICA0OAorI2RlZmluZSBNX1NQQ19DRkdfU1JDNiAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19TUENfQ0ZHX1NSQzYpCisjZGVmaW5lIFZfU1BDX0NGR19TUkM2KHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TUENfQ0ZHX1NSQzYpCisjZGVmaW5lIEdfU1BDX0NGR19TUkM2KHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX1NQQ19DRkdfU1JDNixNX1NQQ19DRkdfU1JDNikKIAotI2RlZmluZSBTX0JDTTE0ODBfU1BDX0NGR19TUkMzICAgICAgICAgICAgICAyNAotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19TUkMzICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU1BDX0NGR19TUkMzKQotI2RlZmluZSBWX0JDTTE0ODBfU1BDX0NGR19TUkMzKHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMykKLSNkZWZpbmUgR19CQ00xNDgwX1NQQ19DRkdfU1JDMyh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMyxNX0JDTTE0ODBfU1BDX0NGR19TUkMzKQotCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzQgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM0KQotI2RlZmluZSBHX0JDTTE0ODBfU1BDX0NGR19TUkM0KHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM0LE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzQpCi0KLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDNSAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDNSAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNSkKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDNSh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzUpCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzUoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzUsTV9CQ00xNDgwX1NQQ19DRkdfU1JDNSkKLQotI2RlZmluZSBTX0JDTTE0ODBfU1BDX0NGR19TUkM2ICAgICAgICAgICAgICA0OAotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19TUkM2ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU1BDX0NGR19TUkM2KQotI2RlZmluZSBWX0JDTTE0ODBfU1BDX0NGR19TUkM2KHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNikKLSNkZWZpbmUgR19CQ00xNDgwX1NQQ19DRkdfU1JDNih4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNixNX0JDTTE0ODBfU1BDX0NGR19TUkM2KQotCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcgICAgICAgICAgICAgIDU2Ci0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzcgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM3KQotI2RlZmluZSBHX0JDTTE0ODBfU1BDX0NGR19TUkM3KHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM3LE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzcpCisjZGVmaW5lIFNfU1BDX0NGR19TUkM3ICAgICAgICAgICAgICA1NgorI2RlZmluZSBNX1NQQ19DRkdfU1JDNyAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19TUENfQ0ZHX1NSQzcpCisjZGVmaW5lIFZfU1BDX0NGR19TUkM3KHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TUENfQ0ZHX1NSQzcpCisjZGVmaW5lIEdfU1BDX0NGR19TUkM3KHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX1NQQ19DRkdfU1JDNyxNX1NQQ19DRkdfU1JDNykKIAogLyoKICAqIFN5c3RlbSBQZXJmb3JtYW5jZSBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgKFRhYmxlIDMyKQogICogUmVnaXN0ZXI6IFBFUkZfQ05UX0NGR18xCiAgKiBCQ00xNDgwIHNwZWNpZmljCiAgKi8KLQotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19DTEVBUiAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDApCi0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX0VOQUJMRSAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMSkKKyNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfQ0xFQVIgICAgIF9TQl9NQUtFTUFTSzEoMCkKKyNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfRU5BQkxFICAgIF9TQl9NQUtFTUFTSzEoMSkKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQorI2RlZmluZSBNX1NQQ19DRkdfQ0xFQVIJCQlNX0JDTTE0ODBfU1BDX0NGR19DTEVBUgorI2RlZmluZSBNX1NQQ19DRkdfRU5BQkxFCQlNX0JDTTE0ODBfU1BDX0NGR19FTkFCTEUKKyNlbmRpZgogCiAvKgogICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXJzIChUYWJsZSAzMykKQEAgLTQwNSwyMCArMzkwLDEwIEBACiAgKiBUcmFjZSBDb250cm9sIFJlZ2lzdGVyIChUYWJsZSA0OSkKICAqIFJlZ2lzdGVyOiBUUkFDRV9DRkcKICAqCi0gKiBCaXRzIDAuLjggYXJlIHRoZSBzYW1lIGFzIHRoZSBCQ00xMjUwLCByZXN0IGFyZSBkaWZmZXJlbnQuCi0gKiBFbnRpcmUgcmVnaXN0ZXIgaXMgcmVkZWZpbmVkIGJlbG93LgorICogQkNNMTQ4MCBjaGFuZ2VzIHRvIHRoaXMgcmVnaXN0ZXIgKG90aGVyIHRoYW4gbG9jYXRpb24gb2YgdGhlIENVUl9BRERSIGZpZWxkKQorICogYXJlIGRlZmluZWQgYmVsb3cuCiAgKi8KIAotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19SRVNFVCAgICAgICBfU0JfTUFLRU1BU0sxKDApCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX1NUQVJUX1JFQUQgIF9TQl9NQUtFTUFTSzEoMSkKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfU1RBUlQgICAgICAgX1NCX01BS0VNQVNLMSgyKQotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19TVE9QICAgICAgICBfU0JfTUFLRU1BU0sxKDMpCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX0ZSRUVaRSAgICAgIF9TQl9NQUtFTUFTSzEoNCkKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfRlJFRVpFX0ZVTEwgX1NCX01BS0VNQVNLMSg1KQotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19ERUJVR19GVUxMICBfU0JfTUFLRU1BU0sxKDYpCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX0ZVTEwgICAgICAgIF9TQl9NQUtFTUFTSzEoNykKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfRk9SQ0VfQ05UICAgX1NCX01BS0VNQVNLMSg4KQotCiAjZGVmaW5lIFNfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREUgICAgICAgIDE2CiAjZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREUgICAgICAgIF9TQl9NQUtFTUFTSygyLFNfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREUpCiAjZGVmaW5lIFZfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREUoeCkgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19NT0RFKQpAQCAtNDI4LDkgKzQwMyw0IEBACiAjZGVmaW5lIEtfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREVfQllURUVOX0lOVAkxCiAjZGVmaW5lIEtfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREVfRkxPV19JRAkyCiAKLSNkZWZpbmUgU19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIgICAgMjQKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKHgpIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUikKLSNkZWZpbmUgR19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIoeCkgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIsTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIpCi0KICNlbmRpZiAvKiBfQkNNMTQ4MF9TQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JvYXJkLmgKaW5kZXggM2RmZTI5ZS4uNzNiY2U5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9ib2FyZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMTksOCArMTksOCBAQAogI2lmbmRlZiBfU0lCWVRFX0JPQVJEX0gKICNkZWZpbmUgX1NJQllURV9CT0FSRF9ICiAKLQogI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9TV0FSTSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX1BUU1dBUk0pIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TSUJZVEVfUFQxMTIwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfUFQxMTI1KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU0lCWVRFX0NSSE9ORSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0NSSElORSkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX1NJQllURV9MSVRUTEVTVVIpCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zd2FybS5oPgpAQCAtNTUsNiArNTUsMTYgQEAKICNkZWZpbmUgc2V0bGVkcyh0MCx0MSxjMCxjMSxjMixjMykKICNlbmRpZiAvKiBMRURTX1BIWVMgKi8KIAorI2Vsc2UKKwordm9pZCBzd2FybV9zZXR1cCh2b2lkKTsKKworI2lmZGVmIExFRFNfUEhZUworZXh0ZXJuIHZvaWQgc2V0bGVkcyhjaGFyICpzdHIpOworI2Vsc2UKKyNkZWZpbmUgc2V0bGVkcyhzKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogTEVEU19QSFlTICovCisKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9TSUJZVEVfQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvY2FybWVsLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaAppbmRleCA1N2M1M2U2Li4xMWNhZDcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaApAQCAtMTgsNyArMTgsNiBAQAogI2lmbmRlZiBfX0FTTV9TSUJZVEVfQ0FSTUVMX0gKICNkZWZpbmUgX19BU01fU0lCWVRFX0NBUk1FTF9ICiAKLQogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9pbnQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9pbnQuaAppbmRleCAwNWM3YjM5Li45NGU4Mjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfaW50LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2ludC5oCkBAIC00NSw4ICs0NSw2IEBACiAgKiBGaXJzdCwgdGhlIGludGVycnVwdCBudW1iZXJzLgogICovCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4Ci0KICNkZWZpbmUgS19JTlRfU09VUkNFUyAgICAgICAgICAgICAgIDY0CiAKICNkZWZpbmUgS19JTlRfV0FUQ0hET0dfVElNRVJfMCAgICAgIDAKQEAgLTE1Miw2ICsxNTAsNyBAQAogI2RlZmluZSBNX0lOVF9NQk9YXzEgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMShLX0lOVF9NQk9YXzEpCiAjZGVmaW5lIE1fSU5UX01CT1hfMiAgICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKEtfSU5UX01CT1hfMikKICNkZWZpbmUgTV9JTlRfTUJPWF8zICAgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoS19JTlRfTUJPWF8zKQorI2RlZmluZSBNX0lOVF9NQk9YX0FMTCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDQsS19JTlRfTUJPWF8wKQogI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQogI2RlZmluZSBNX0lOVF9DWUNMRV9DUDBfSU5UCSAgICBfU0JfTUFLRU1BU0sxKEtfSU5UX0NZQ0xFX0NQMF9JTlQpCiAjZGVmaW5lIE1fSU5UX0NZQ0xFX0NQMV9JTlQJICAgIF9TQl9NQUtFTUFTSzEoS19JTlRfQ1lDTEVfQ1AxX0lOVCkKQEAgLTI0Nyw1ICsyNDYsMyBAQAogCiAKICNlbmRpZgkvKiAxMjUwLzExMnggKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWFjLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWFjLmgKaW5kZXggYWRmYzY4OC4uODMzYzhiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21hYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaApAQCAtMTI5LDkgKzEyOSw5IEBACiAjZGVmaW5lIE1fTUFDX0JZUEFTU18xNiAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDQyKQogI2RlZmluZSBNX01BQ19CWVBBU1NfRkNTX0NISwkgICAgX1NCX01BS0VNQVNLMSg0MykKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19SWF9DSF9TRUxfTVNCCSAgICBfU0JfTUFLRU1BU0sxKDQ0KQotI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSAqLworI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwKi8KIAogI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMykgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19TUExJVF9DSF9TRUwJICAgIF9TQl9NQUtFTUFTSzEoNDUpCkBAIC0yMjMsOSArMjIzLDkgQEAKIC8qIFhYWDogQ2FuJ3QgZW5hYmxlLCBhcyBpdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIHBhc3MyKyBkZWZpbmUgYmVsb3cuICAqLwogLyogI2RlZmluZSBNX01BQ19UWF9XUl9USFJTSCAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19NQUNfVFhfV1JfVEhSU0gpICovCiAjZW5kaWYgLyogdXAgdG8gMTI1MCBQQVNTMSAqLwotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19UWF9XUl9USFJTSCAgICAgICAgICAgX1NCX01BS0VNQVNLKDcsU19NQUNfVFhfV1JfVEhSU0gpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KICNkZWZpbmUgVl9NQUNfVFhfV1JfVEhSU0goeCkgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX01BQ19UWF9XUl9USFJTSCkKICNkZWZpbmUgR19NQUNfVFhfV1JfVEhSU0goeCkgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfTUFDX1RYX1dSX1RIUlNILE1fTUFDX1RYX1dSX1RIUlNIKQogCkBAIC0yMzQsOSArMjM0LDkgQEAKIC8qIFhYWDogQ2FuJ3QgZW5hYmxlLCBhcyBpdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIHBhc3MyKyBkZWZpbmUgYmVsb3cuICAqLwogLyogI2RlZmluZSBNX01BQ19UWF9SRF9USFJTSCAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19NQUNfVFhfUkRfVEhSU0gpICovCiAjZW5kaWYgLyogdXAgdG8gMTI1MCBQQVNTMSAqLwotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19UWF9SRF9USFJTSCAgICAgICAgICAgX1NCX01BS0VNQVNLKDcsU19NQUNfVFhfUkRfVEhSU0gpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KICNkZWZpbmUgVl9NQUNfVFhfUkRfVEhSU0goeCkgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX01BQ19UWF9SRF9USFJTSCkKICNkZWZpbmUgR19NQUNfVFhfUkRfVEhSU0goeCkgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfTUFDX1RYX1JEX1RIUlNILE1fTUFDX1RYX1JEX1RIUlNIKQogCkBAIC0yNjAsMTIgKzI2MCwxMiBAQAogI2RlZmluZSBWX01BQ19SWF9STF9USFJTSCh4KSAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfTUFDX1JYX1JMX1RIUlNIKQogI2RlZmluZSBHX01BQ19SWF9STF9USFJTSCh4KSAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19NQUNfUlhfUkxfVEhSU0gsTV9NQUNfUlhfUkxfVEhSU0gpCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkgfHwgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKICNkZWZpbmUgU19NQUNfRU5DX0ZDX1RIUlNIICAgICAgICAgICBfU0JfTUFLRTY0KDU2KQogI2RlZmluZSBNX01BQ19FTkNfRkNfVEhSU0ggICAgICAgICAgIF9TQl9NQUtFTUFTSyg2LFNfTUFDX0VOQ19GQ19USFJTSCkKICNkZWZpbmUgVl9NQUNfRU5DX0ZDX1RIUlNIKHgpICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19NQUNfRU5DX0ZDX1RIUlNIKQogI2RlZmluZSBHX01BQ19FTkNfRkNfVEhSU0goeCkgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfTUFDX0VOQ19GQ19USFJTSCxNX01BQ19FTkNfRkNfVEhSU0gpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAogLyoKICAqIE1BQyBGcmFtZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAoVGFibGUgOS0xNSkKQEAgLTQ2Miw5ICs0NjIsOSBAQAogI2RlZmluZSBNX01BQ19MVENPTF9FUlIgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg0NCkKICNkZWZpbmUgTV9NQUNfRVhDT0xfRVJSICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNDUpCiAjZGVmaW5lIE1fTUFDX0NOVFJfT1ZSRkxfRVJSICAgICAgICBfU0JfTUFLRU1BU0sxKDQ2KQotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19TUExJVF9FTgkJICAgIF9TQl9NQUtFTUFTSzEoNDcpIAkvKiBpbnRlcnJ1cHQgbWFzayBvbmx5ICovCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAogI2RlZmluZSBTX01BQ19DT1VOVEVSX0FERFIgICAgICAgICAgX1NCX01BS0U2NCg0NykKICNkZWZpbmUgTV9NQUNfQ09VTlRFUl9BRERSICAgICAgICAgIF9TQl9NQUtFTUFTSyg1LFNfTUFDX0NPVU5URVJfQUREUikKQEAgLTU5OCw5ICs1OTgsOSBAQAogI2RlZmluZSBNX01BQ19NQ0FTVF9JTlYgICAgICAgICBfU0JfTUFLRU1BU0sxKDQpCiAjZGVmaW5lIE1fTUFDX0JDQVNUX0VOICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNSkKICNkZWZpbmUgTV9NQUNfRElSRUNUX0lOViAgICAgICAgX1NCX01BS0VNQVNLMSg2KQotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX01BQ19BTExNQ0FTVF9FTglfU0JfTUFLRU1BU0sxKDcpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAogI2RlZmluZSBTX01BQ19JUEhEUl9PRkZTRVQgICAgICBfU0JfTUFLRTY0KDgpCiAjZGVmaW5lIE1fTUFDX0lQSERSX09GRlNFVCAgICAgIF9TQl9NQUtFTUFTSyg4LFNfTUFDX0lQSERSX09GRlNFVCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21jLmgKaW5kZXggMjZlNDIxNDkuLjRmZTg0OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oCkBAIC0yOTUsNyArMjk1LDcgQEAKIAogI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMykgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQogI2RlZmluZSBNX01DX1BSRV9PTl9BOCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzNikKLSNkZWZpbmUgTV9NQ19SQU1fV0lUSF9BMTMgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMzgpCisjZGVmaW5lIE1fTUNfUkFNX1dJVEhfQTEzICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDM3KQogI2VuZGlmIC8qIDEyNTAgUEFTUzMgfHwgMTEyeCBQQVNTMSAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCmluZGV4IGJhYjNhNDUuLmRhN2MxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaApAQCAtMTMxLDYgKzEzMSw3IEBACiAKICNlbmRpZgogCisKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFBDSSBJbnRlcmZhY2UgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0yMzksMTQgKzI0MCwxNCBAQAogI2RlZmluZSBSX01BQ19WTEFOVEFHICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTAKICNkZWZpbmUgUl9NQUNfRlJBTUVDRkcgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4CiAjZGVmaW5lIFJfTUFDX0VPUENOVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEyMAotI2RlZmluZSBSX01BQ19GSUZPX1BUUlMgICAgICAgICAgICAgICAgIDB4MDAwMDAxMzAKKyNkZWZpbmUgUl9NQUNfRklGT19QVFJTICAgICAgICAgICAgICAgICAweDAwMDAwMTI4CiAjZGVmaW5lIFJfTUFDX0FERklMVEVSX0NGRyAgICAgICAgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBSX01BQ19FVEhFUk5FVF9BRERSICAgICAgICAgICAgIDB4MDAwMDAyMDgKICNkZWZpbmUgUl9NQUNfUEtUX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAwMjEwCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MzKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MzKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIFJfTUFDX0FETUFTSzAJCQkweDAwMDAwMjE4CiAjZGVmaW5lIFJfTUFDX0FETUFTSzEJCQkweDAwMDAwMjIwCi0jZW5kaWYgLyogMTI1MCBQQVNTMyB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMyB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KICNkZWZpbmUgUl9NQUNfSEFTSF9CQVNFICAgICAgICAgICAgICAgICAweDAwMDAwMjQwCiAjZGVmaW5lIFJfTUFDX0FERFJfQkFTRSAgICAgICAgICAgICAgICAgMHgwMDAwMDI4MAogI2RlZmluZSBSX01BQ19DSExPMF9CQVNFICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKQEAgLTI1Niw5ICsyNTcsOSBAQAogI2RlZmluZSBSX01BQ19JTlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTAKICNkZWZpbmUgUl9NQUNfVFhEX0NUTCAgICAgICAgICAgICAgICAgICAweDAwMDAwNDIwCiAjZGVmaW5lIFJfTUFDX01ESU8gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyOAotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBSX01BQ19TVEFUVVMxCQkgICAgICAgIDB4MDAwMDA0MzAKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogI2RlZmluZSBSX01BQ19ERUJVR19TVEFUVVMgICAgICAgICAgICAgIDB4MDAwMDA0NDgKIAogI2RlZmluZSBNQUNfSEFTSF9DT1VOVAkJCTgKQEAgLTI4OSwxMSArMjkwLDExIEBACiAjZGVmaW5lIFJfRFVBUlRfUlhfSE9MRCAgICAgICAgICAgICAweDE2MAogI2RlZmluZSBSX0RVQVJUX1RYX0hPTEQgICAgICAgICAgICAgMHgxNzAKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBSX0RVQVJUX0ZVTExfQ1RMCSAgICAweDE0MAogI2RlZmluZSBSX0RVQVJUX09QQ1JfWAkJICAgIDB4MTgwCiAjZGVmaW5lIFJfRFVBUlRfQVVYQ1RMX1gJICAgIDB4MTkwCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAqLwogCiAKIC8qCkBAIC0zMDgsNiArMzA5LDcgQEAKICNkZWZpbmUgUl9EVUFSVF9JTVJfQiAgICAgICAgICAgICAgIDB4MzUwCiAjZGVmaW5lIFJfRFVBUlRfT1VUX1BPUlQgICAgICAgICAgICAweDM2MAogI2RlZmluZSBSX0RVQVJUX09QQ1IgICAgICAgICAgICAgICAgMHgzNzAKKyNkZWZpbmUgUl9EVUFSVF9JTl9QT1JUICAgICAgICAgICAgIDB4MzgwCiAKICNkZWZpbmUgUl9EVUFSVF9TRVRfT1BSCQkgICAgMHgzQjAKICNkZWZpbmUgUl9EVUFSVF9DTEVBUl9PUFIJICAgIDB4M0MwCkBAIC02ODUsMTIgKzY4NywxNyBAQAogI2RlZmluZSBBX0FERFJfVFJBUF9SRUdfREVCVUcJICAgIDB4MDAxMDAyMDQ2MAogI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwICovCiAKKyNkZWZpbmUgQUREUl9UUkFQX1NQQUNJTkcgOAorI2RlZmluZSBOVU1fQUREUl9UUkFQIDQKKyNkZWZpbmUgQV9BRERSX1RSQVBfVVAobikgKEFfQUREUl9UUkFQX1VQXzAgKyAoKG4pICogQUREUl9UUkFQX1NQQUNJTkcpKQorI2RlZmluZSBBX0FERFJfVFJBUF9ET1dOKG4pIChBX0FERFJfVFJBUF9ET1dOXzAgKyAoKG4pICogQUREUl9UUkFQX1NQQUNJTkcpKQorI2RlZmluZSBBX0FERFJfVFJBUF9DRkcobikgKEFfQUREUl9UUkFQX0NGR18wICsgKChuKSAqIEFERFJfVFJBUF9TUEFDSU5HKSkKKwogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gSW50ZXJydXB0IE1hcHBlciBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngKICNkZWZpbmUgQV9JTVJfQ1BVMF9CQVNFICAgICAgICAgICAgICAgICAweDAwMTAwMjAwMDAKICNkZWZpbmUgQV9JTVJfQ1BVMV9CQVNFICAgICAgICAgICAgICAgICAweDAwMTAwMjIwMDAKICNkZWZpbmUgSU1SX1JFR0lTVEVSX1NQQUNJTkcgICAgICAgICAgICAweDIwMDAKQEAgLTcwMCw2ICs3MDcsNyBAQAogI2RlZmluZSBBX0lNUl9SRUdJU1RFUihjcHUscmVnKSAoQV9JTVJfTUFQUEVSKGNwdSkrKHJlZykpCiAKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX0RJQUcgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX0xEVCAgICAgICAgICAgICAweDAwMTgKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX01BU0sgICAgICAgICAgICAweDAwMjgKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX1RSQUNFICAgICAgICAgICAweDAwMzgKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX1NPVVJDRV9TVEFUVVMgICAweDAwNDAKQEAgLTcxNSw3ICs3MjMsMTQgQEAKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX1NUQVRVU19DT1VOVCAgICA3CiAjZGVmaW5lIFJfSU1SX0lOVEVSUlVQVF9NQVBfQkFTRSAgICAgICAgMHgwMjAwCiAjZGVmaW5lIFJfSU1SX0lOVEVSUlVQVF9NQVBfQ09VTlQgICAgICAgNjQKLSNlbmRpZgkvKiAxMjUwLzExMnggKi8KKworLyoKKyAqIHRoZXNlIG1hY3JvcyB3b3JrIHRvZ2V0aGVyIHRvIGJ1aWxkIHRoZSBhZGRyZXNzIG9mIGEgbWFpbGJveAorICogcmVnaXN0ZXIsIGUuZy4sIEFfTUFJTEJPWF9SRUdJU1RFUihSX0lNUl9NQUlMQk9YX1NFVF9DUFUsMSkKKyAqIGZvciBtYm94XzBfc2V0X2NwdTIgcmV0dXJucyAweDAwMTAwMjQwQzgKKyAqLworI2RlZmluZSBBX01BSUxCT1hfUkVHSVNURVIocmVnLGNwdSkgXAorICAgIChBX0lNUl9DUFUwX0JBU0UgKyAoY3B1ICogSU1SX1JFR0lTVEVSX1NQQUNJTkcpICsgcmVnKQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlcnMKQEAgLTcyNyw2ICs3NDIsMTAgQEAKICNkZWZpbmUgQV9TQ0RfUEVSRl9DTlRfMiAgICAgICAgICAgIDB4MDAxMDAyMDRFMAogI2RlZmluZSBBX1NDRF9QRVJGX0NOVF8zICAgICAgICAgICAgMHgwMDEwMDIwNEU4CiAKKyNkZWZpbmUgU0NEX05VTV9QRVJGX0NOVCA0CisjZGVmaW5lIFNDRF9QRVJGX0NOVF9TUEFDSU5HIDgKKyNkZWZpbmUgQV9TQ0RfUEVSRl9DTlQobikgKEFfU0NEX1BFUkZfQ05UXzArKG4qU0NEX1BFUkZfQ05UX1NQQUNJTkcpKQorCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gQnVzIFdhdGNoZXIgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC03NzIsNiArNzkxLDE1IEBACiAjZGVmaW5lIEFfU0NEX1RSQUNFX1NFUVVFTkNFXzYgICAgICAweDAwMTAwMjBBOTAKICNkZWZpbmUgQV9TQ0RfVFJBQ0VfU0VRVUVOQ0VfNyAgICAgIDB4MDAxMDAyMEE5OAogCisjZGVmaW5lIFRSQUNFX1JFR0lTVEVSX1NQQUNJTkcgOAorI2RlZmluZSBUUkFDRV9OVU1fUkVHSVNURVJTICAgIDgKKyNkZWZpbmUgQV9TQ0RfVFJBQ0VfRVZFTlQobikgKCgobikgJiA0KSA/IFwKKyAgIChBX1NDRF9UUkFDRV9FVkVOVF80ICsgKCgobikgJiAzKSAqIFRSQUNFX1JFR0lTVEVSX1NQQUNJTkcpKSA6IFwKKyAgIChBX1NDRF9UUkFDRV9FVkVOVF8wICsgKChuKSAqIFRSQUNFX1JFR0lTVEVSX1NQQUNJTkcpKSkKKyNkZWZpbmUgQV9TQ0RfVFJBQ0VfU0VRVUVOQ0UobikgKCgobikgJiA0KSA/IFwKKyAgIChBX1NDRF9UUkFDRV9TRVFVRU5DRV80ICsgKCgobikgJiAzKSAqIFRSQUNFX1JFR0lTVEVSX1NQQUNJTkcpKSA6IFwKKyAgIChBX1NDRF9UUkFDRV9TRVFVRU5DRV8wICsgKChuKSAqIFRSQUNFX1JFR0lTVEVSX1NQQUNJTkcpKSkKKwogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogU3lzdGVtIEdlbmVyaWMgRE1BIFJlZ2lzdGVycwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oCmluZGV4IGI2YTdkOGYuLjllYTNkYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmgKQEAgLTEwLDcgKzEwLDcgQEAKICAgICAqCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiwyMDAzCisgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA1CiAgICAgKiAgQnJvYWRjb20gQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogKEZvciB0aGUgYXNzZW1ibGVyIHZlcnNpb24sIHN5c3JldiBhbmQgZGVzdCBtYXkgYmUgdGhlIHNhbWUgcmVnaXN0ZXIuCiAgKiBBbHNvLCBpdCBjbG9iYmVycyBBVC4pCiAgKi8KLSNpZmRlZiBfX0FTU0VNQkxZX18KKyNpZmRlZiBfX0FTU0VNQkxFUl9fCiAjZGVmaW5lIFNZU19TT0NfVFlQRShkZXN0LCBzeXNyZXYpCQkJCQlcCiAJLnNldCBwdXNoIDsJCQkJCQkJXAogCS5zZXQgcmVvcmRlciA7CQkJCQkJCVwKQEAgLTIxNCw2ICsyMTQsNyBAQAogI2RlZmluZSBHX1NZU19ZUE9TKHgpICAgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1lTX1lQT1MsTV9TWVNfWVBPUykKICNlbmRpZgogCisKIC8qCiAgKiBTeXN0ZW0gQ29uZmlnIFJlZ2lzdGVyIChUYWJsZSA0LTIpCiAgKiBSZWdpc3RlcjogU0NEX1NZU1RFTV9DRkcKQEAgLTM2MCwxMyArMzYxLDEzIEBACiAgKi8KIAogI2RlZmluZSBWX1NDRF9USU1FUl9GUkVRICAgICAgICAgICAgMTAwMDAwMAotI2RlZmluZSBWX1NDRF9USU1FUl9XSURUSCAgICAgICAgICAgMjMKIAogI2RlZmluZSBTX1NDRF9USU1FUl9JTklUICAgICAgICAgICAgMAotI2RlZmluZSBNX1NDRF9USU1FUl9JTklUICAgICAgICAgICAgX1NCX01BS0VNQVNLKFZfU0NEX1RJTUVSX1dJRFRILFNfU0NEX1RJTUVSX0lOSVQpCisjZGVmaW5lIE1fU0NEX1RJTUVSX0lOSVQgICAgICAgICAgICBfU0JfTUFLRU1BU0soMjMsU19TQ0RfVElNRVJfSU5JVCkKICNkZWZpbmUgVl9TQ0RfVElNRVJfSU5JVCh4KSAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NDRF9USU1FUl9JTklUKQogI2RlZmluZSBHX1NDRF9USU1FUl9JTklUKHgpICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19TQ0RfVElNRVJfSU5JVCxNX1NDRF9USU1FUl9JTklUKQogCisjZGVmaW5lIFZfU0NEX1RJTUVSX1dJRFRICSAgICAyMwogI2RlZmluZSBTX1NDRF9USU1FUl9DTlQgICAgICAgICAgICAgMAogI2RlZmluZSBNX1NDRF9USU1FUl9DTlQgICAgICAgICAgICAgX1NCX01BS0VNQVNLKFZfU0NEX1RJTUVSX1dJRFRILFNfU0NEX1RJTUVSX0NOVCkKICNkZWZpbmUgVl9TQ0RfVElNRVJfQ05UKHgpICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU0NEX1RJTUVSX0NOVCkKQEAgLTM4MCw3ICszODEsNiBAQAogICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXJzCiAgKi8KIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngKICNkZWZpbmUgU19TUENfQ0ZHX1NSQzAgICAgICAgICAgICAwCiAjZGVmaW5lIE1fU1BDX0NGR19TUkMwICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19TUENfQ0ZHX1NSQzApCiAjZGVmaW5lIFZfU1BDX0NGR19TUkMwKHgpICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1BDX0NGR19TUkMwKQpAQCAtNDAxLDYgKzQwMSw3IEBACiAjZGVmaW5lIFZfU1BDX0NGR19TUkMzKHgpICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1BDX0NGR19TUkMzKQogI2RlZmluZSBHX1NQQ19DRkdfU1JDMyh4KSAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1BDX0NGR19TUkMzLE1fU1BDX0NGR19TUkMzKQogCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAogI2RlZmluZSBNX1NQQ19DRkdfQ0xFQVIJCV9TQl9NQUtFTUFTSzEoMzIpCiAjZGVmaW5lIE1fU1BDX0NGR19FTkFCTEUJX1NCX01BS0VNQVNLMSgzMykKICNlbmRpZgpAQCAtNTE2LDggKzUxNyw2IEBACiAgKiBUcmFjZSBCdWZmZXIgQ29uZmlnIHJlZ2lzdGVyCiAgKi8KIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngKLQogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfUkVTRVQgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMCkKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX1NUQVJUX1JFQUQgICAgICBfU0JfTUFLRU1BU0sxKDEpCiAjZGVmaW5lIE1fU0NEX1RSQUNFX0NGR19TVEFSVCAgICAgICAgICAgX1NCX01BS0VNQVNLMSgyKQpAQCAtNTI2LDE3ICs1MjUsMjYgQEAKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX0ZSRUVaRV9GVUxMICAgICBfU0JfTUFLRU1BU0sxKDUpCiAjZGVmaW5lIE1fU0NEX1RSQUNFX0NGR19ERUJVR19GVUxMICAgICAgX1NCX01BS0VNQVNLMSg2KQogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfRlVMTCAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNykKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkgfHwgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX0ZPUkNFQ05UICAgICAgICBfU0JfTUFLRU1BU0sxKDgpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAorLyoKKyAqIFRoaXMgZmllbGQgaXMgdGhlIHNhbWUgb24gdGhlIDEyNTAvMTEyeCBhbmQgMTQ4MCwganVzdCBsb2NhdGVkIGluCisgKiBhIHNsaWdodGx5IGRpZmZlcmVudCBwbGFjZSBpbiB0aGUgcmVnaXN0ZXIuCisgKi8KKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CiAjZGVmaW5lIFNfU0NEX1RSQUNFX0NGR19DVVJfQUREUiAgICAgICAgMTAKKyNlbHNlCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKKyNkZWZpbmUgU19TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSICAgICAgICAyNAorI2VuZGlmCS8qIDE0ODAgKi8KKyNlbmRpZiAgLyogMTI1MC8xMTJ4ICovCisKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIpCiAjZGVmaW5lIFZfU0NEX1RSQUNFX0NGR19DVVJfQUREUih4KSAgICAgX1NCX01BS0VWQUxVRSh4LFNfU0NEX1RSQUNFX0NGR19DVVJfQUREUikKICNkZWZpbmUgR19TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKHgpICAgICBfU0JfR0VUVkFMVUUoeCxTX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIsTV9TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKQogCi0jZW5kaWYJLyogMTI1MC8xMTJ4ICovCi0KIC8qCiAgKiBUcmFjZSBFdmVudCByZWdpc3RlcnMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc3dhcm0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3N3YXJtLmgKaW5kZXggODZkYjM3ZS4uNTQwODY1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc3dhcm0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zd2FybS5oCkBAIC0zMiw2ICszMiwxOCBAQAogI2RlZmluZSBTSUJZVEVfSEFWRV9JREUgICAgMQogI2RlZmluZSBTSUJZVEVfREVGQVVMVF9DT05TT0xFICJ0dHlTMCwxMTUyMDAiCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0lCWVRFX1BUMTEyMAorI2RlZmluZSBTSUJZVEVfQk9BUkRfTkFNRSAiUFQxMTIwIgorI2RlZmluZSBTSUJZVEVfSEFWRV9QQ01DSUEgMQorI2RlZmluZSBTSUJZVEVfSEFWRV9JREUgICAgMQorI2RlZmluZSBTSUJZVEVfREVGQVVMVF9DT05TT0xFICJ0dHlTMCwxMTUyMDAiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0lCWVRFX1BUMTEyNQorI2RlZmluZSBTSUJZVEVfQk9BUkRfTkFNRSAiUFQxMTI1IgorI2RlZmluZSBTSUJZVEVfSEFWRV9QQ01DSUEgMQorI2RlZmluZSBTSUJZVEVfSEFWRV9JREUgICAgMQorI2RlZmluZSBTSUJZVEVfREVGQVVMVF9DT05TT0xFICJ0dHlTMCwxMTUyMDAiCisjZW5kaWYKICNpZmRlZiBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUgogI2RlZmluZSBTSUJZVEVfQk9BUkRfTkFNRSAiQkNNOTEyNTBDMiAoTGl0dGxlU3VyKSIKICNkZWZpbmUgU0lCWVRFX0hBVkVfUENNQ0lBIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1taXBzL3NvY2tldC5oCmluZGV4IDM2ZWJlNGUuLjk1OTQ1NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zb2NrZXQuaApAQCAtNzAsNiArNzAsOCBAQAogI2RlZmluZSBTT19TTkRCVUZGT1JDRQkJMzEKICNkZWZpbmUgU09fUkNWQlVGRk9SQ0UJCTMzCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zb2NraW9zLmgKaW5kZXggODdhNTBiZi4uZWQxYTVmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zb2NraW9zLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgU0lPQ1NQR1JQCV9JT1coJ3MnLCA4LCBwaWRfdCkKICNkZWZpbmUgU0lPQ0dQR1JQCV9JT1IoJ3MnLCA5LCBwaWRfdCkKIAotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJCS8qIEdldCBzdGFtcCAtIGxpbnV4LXNwZWNpZmljICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NvY2tldC5oCmluZGV4IGNlMmVhZTEuLjk5ZTg2OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2V0LmgKQEAgLTMzLDYgKzMzLDggQEAKICNkZWZpbmUgU09fUEVFUkNSRUQJMHg0MDExCiAjZGVmaW5lIFNPX1RJTUVTVEFNUAkweDQwMTIKICNkZWZpbmUgU0NNX1RJTUVTVEFNUAlTT19USU1FU1RBTVAKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJMHg0MDEzCisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwlTT19USU1FU1RBTVBOUwogCiAvKiBTZWN1cml0eSBsZXZlbHMgLSBhcyBwZXIgTlJMIElQdjYgLSBkb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyAqLwogI2RlZmluZSBTT19TRUNVUklUWV9BVVRIRU5USUNBVElPTgkJMHg0MDE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NvY2tpb3MuaAppbmRleCBhYWNlNDk2Li5kYWJmYmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmgKaW5kZXggYzhiMWRhNS4uNDAzZTlmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tldC5oCkBAIC01Niw1ICs1Niw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaAppbmRleCA1OTAwNzhkLi41NWNlZjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9idWcuaCBiL2luY2x1ZGUvYXNtLXMzOTAvYnVnLmgKaW5kZXggODc2ODk4My4uODM4Njg0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2J1Zy5oCkBAIC0xLDI3ICsxLDcwIEBACi0jaWZuZGVmIF9TMzkwX0JVR19ICi0jZGVmaW5lIF9TMzkwX0JVR19ICisjaWZuZGVmIF9BU01fUzM5MF9CVUdfSAorI2RlZmluZSBfQVNNX1MzOTBfQlVHX0gKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCiAjaWZkZWYgQ09ORklHX0JVRwogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgdm9pZCBfX2RvX2lsbGVnYWxfb3Aodm9pZCkKLXsKLSNpZiBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMykKLQlfX2J1aWx0aW5fdHJhcCgpOworI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBTMzkwX0xPTkcgIi5xdWFkIgogI2Vsc2UKLQlhc20gdm9sYXRpbGUoIi5sb25nIDAiKTsKKyNkZWZpbmUgUzM5MF9MT05HICIubG9uZyIKICNlbmRpZgotfQogCi0jZGVmaW5lIEJVRygpIGRvIHsgXAotCXByaW50aygia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKLQlfX2RvX2lsbGVnYWxfb3AoKTsgXAorI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCisKKyNkZWZpbmUgX19FTUlUX0JVRyh4KSBkbyB7CQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQkJCVwKKwkJIjA6CWoJMGIrMlxuIgkJCQlcCisJCSIxOlxuIgkJCQkJCVwKKwkJIi5zZWN0aW9uIC5yb2RhdGEuc3RyLFwiYU1TXCIsQHByb2diaXRzLDFcbiIJXAorCQkiMjoJLmFzY2l6CVwiIl9fRklMRV9fIlwiXG4iCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQkJXAorCQkiMzpcdCIJUzM5MF9MT05HICJcdDFiLDJiXG4iCQkJXAorCQkiCS5zaG9ydAklMCwlMVxuIgkJCVwKKwkJIgkub3JnCTNiKyUyXG4iCQkJXAorCQkiLnByZXZpb3VzXG4iCQkJCQlcCisJCTogOiAiaSIgKF9fTElORV9fKSwJCQkJXAorCQkgICAgImkiICh4KSwJCQkJCVwKKwkJICAgICJpIiAoc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpKSk7CQlcCiB9IHdoaWxlICgwKQogCisjZWxzZSAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLworCisjZGVmaW5lIF9fRU1JVF9CVUcoeCkgZG8gewkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQkJXAorCQkiMDoJagkwYisyXG4iCQkJXAorCQkiMTpcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQlcCisJCSIyOlx0IglTMzkwX0xPTkcgIlx0MWJcbiIJCVwKKwkJIgkuc2hvcnQJJTBcbiIJCQlcCisJCSIJLm9yZwkyYislMVxuIgkJXAorCQkiLnByZXZpb3VzXG4iCQkJCVwKKwkJOiA6ICJpIiAoeCksCQkJCVwKKwkJICAgICJpIiAoc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpKSk7CVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLworCisjZGVmaW5lIEJVRygpCV9fRU1JVF9CVUcoMCkKKworI2RlZmluZSBXQVJOX09OKHgpICh7CQkJCQlcCisJdHlwZW9mKHgpIF9fcmV0X3dhcm5fb24gPSAoeCk7CQkJXAorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChfX3JldF93YXJuX29uKSkgewlcCisJCWlmIChfX3JldF93YXJuX29uKQkJCVwKKwkJCV9fRU1JVF9CVUcoQlVHRkxBR19XQVJOSU5HKTsJXAorCX0gZWxzZSB7CQkJCQlcCisJCWlmICh1bmxpa2VseShfX3JldF93YXJuX29uKSkJCVwKKwkJCV9fRU1JVF9CVUcoQlVHRkxBR19XQVJOSU5HKTsJXAorCX0JCQkJCQlcCisJdW5saWtlbHkoX19yZXRfd2Fybl9vbik7CQkJXAorfSkKKwogI2RlZmluZSBIQVZFX0FSQ0hfQlVHCi0jZW5kaWYKKyNkZWZpbmUgSEFWRV9BUkNIX1dBUk5fT04KKyNlbmRpZiAvKiBDT05GSUdfQlVHICovCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KIAotI2VuZGlmCisjZW5kaWYgLyogX0FTTV9TMzkwX0JVR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Njd2dyb3VwLmggYi9pbmNsdWRlL2FzbS1zMzkwL2Njd2dyb3VwLmgKaW5kZXggZDJmOWMwZC4uOTI1YjNkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jY3dncm91cC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2N3Z3JvdXAuaApAQCAtMTEsNiArMTEsNyBAQAogCQlDQ1dHUk9VUF9PTkxJTkUsCiAJfSBzdGF0ZTsKIAlhdG9taWNfdCBvbm9mZjsKKwlzdHJ1Y3QgbXV0ZXggcmVnX211dGV4OwogCXVuc2lnbmVkIGludCBjb3VudDsJCS8qIG51bWJlciBvZiBhdHRhY2hlZCBzbGF2ZSBkZXZpY2VzICovCiAJc3RydWN0IGRldmljZQlkZXY7CQkvKiBtYXN0ZXIgZGV2aWNlCQkgICAgKi8KIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldlswXTsJLyogdmFyaWFibGUgbnVtYmVyLCBhbGxvY2F0ZSBhcyBuZWVkZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY2hwaWQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY2hwaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAzMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jaHBpZC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9jaHBpZC5oCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaWZuZGVmIF9BU01fUzM5MF9DSFBJRF9ICisjZGVmaW5lIF9BU01fUzM5MF9DSFBJRF9IIF9BU01fUzM5MF9DSFBJRF9ICisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2lvLmg+CisKKyNkZWZpbmUgX19NQVhfQ0hQSUQgMjU1CisKK3N0cnVjdCBjaHBfaWQgeworCXU4IHJlc2VydmVkMTsKKwl1OCBjc3NpZDsKKwl1OCByZXNlcnZlZDI7CisJdTggaWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY2hwX2lkX2luaXQoc3RydWN0IGNocF9pZCAqY2hwaWQpCit7CisJbWVtc2V0KGNocGlkLCAwLCBzaXplb2Yoc3RydWN0IGNocF9pZCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaHBfaWRfaXNfZXF1YWwoc3RydWN0IGNocF9pZCAqYSwgc3RydWN0IGNocF9pZCAqYikKK3sKKwlyZXR1cm4gKGEtPmlkID09IGItPmlkKSAmJiAoYS0+Y3NzaWQgPT0gYi0+Y3NzaWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hwX2lkX25leHQoc3RydWN0IGNocF9pZCAqY2hwaWQpCit7CisJaWYgKGNocGlkLT5pZCA8IF9fTUFYX0NIUElEKQorCQljaHBpZC0+aWQrKzsKKwllbHNlIHsKKwkJY2hwaWQtPmlkID0gMDsKKwkJY2hwaWQtPmNzc2lkKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBjaHBfaWRfaXNfdmFsaWQoc3RydWN0IGNocF9pZCAqY2hwaWQpCit7CisJcmV0dXJuIChjaHBpZC0+Y3NzaWQgPD0gX19NQVhfQ1NTSUQpOworfQorCisKKyNkZWZpbmUgY2hwX2lkX2Zvcl9lYWNoKGMpIFwKKwlmb3IgKGNocF9pZF9pbml0KGMpOyBjaHBfaWRfaXNfdmFsaWQoYyk7IGNocF9pZF9uZXh0KGMpKQorCisjZW5kaWYgLyogX0FTTV9TMzkwX0NIUElEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmggYi9pbmNsdWRlL2FzbS1zMzkwL2Npby5oCmluZGV4IGQ5Mjc4NTAuLmY3MzhkMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jaW8uaApAQCAtMTMsNiArMTMsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2RlZmluZSBMUE1fQU5ZUEFUSCAweGZmCisjZGVmaW5lIF9fTUFYX0NTU0lEIDAKIAogLyoKICAqIHN1YmNoYW5uZWwgc3RhdHVzIHdvcmQKQEAgLTI5Miw2ICsyOTMsMTMgQEAKIAogZXh0ZXJuIHZvaWQgcmVpcGxfY2N3X2RldihzdHJ1Y3QgY2N3X2Rldl9pZCAqaWQpOwogCitzdHJ1Y3QgY2lvX2lwbGluZm8geworCXUxNiBkZXZubzsKKwlpbnQgaXNfcWRpbzsKK307CisKK2V4dGVybiBpbnQgY2lvX2dldF9pcGxpbmZvKHN0cnVjdCBjaW9faXBsaW5mbyAqaXBsaW5mbyk7CisKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvaXBsLmggYi9pbmNsdWRlL2FzbS1zMzkwL2lwbC5oCmluZGV4IDBlYjY0MDguLmJkY2Q0NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvaXBsLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9pcGwuaApAQCAtOCw2ICs4LDggQEAKICNkZWZpbmUgX0FTTV9TMzkwX0lQTF9ICiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNkZWZpbmUgSVBMX1BBUk1CTE9DS19PUklHSU4JMHgyMDAwCiAKQEAgLTc0LDEyICs3NiwxMiBAQAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKLSAqIElQTCB2YWxpZGl0eSBmbGFncyBhbmQgcGFyYW1ldGVycyBhcyBkZXRlY3RlZCBpbiBoZWFkLlMKKyAqIElQTCB2YWxpZGl0eSBmbGFncwogICovCiBleHRlcm4gdTMyIGlwbF9mbGFnczsKLWV4dGVybiB1MTYgaXBsX2Rldm5vOwogCiBleHRlcm4gdTMyIGR1bXBfcHJlZml4X3BhZ2U7CisKIGV4dGVybiB2b2lkIGRvX3JlaXBsKHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBsX3NhdmVfcGFyYW1ldGVycyh2b2lkKTsKIApAQCAtODksNiArOTEsMzUgQEAKIAlJUExfTlNTX1ZBTElECQk9IDQsCiB9OwogCitlbnVtIGlwbF90eXBlIHsKKwlJUExfVFlQRV9VTktOT1dOCT0gMSwKKwlJUExfVFlQRV9DQ1cJCT0gMiwKKwlJUExfVFlQRV9GQ1AJCT0gNCwKKwlJUExfVFlQRV9GQ1BfRFVNUAk9IDgsCisJSVBMX1RZUEVfTlNTCQk9IDE2LAorfTsKKworc3RydWN0IGlwbF9pbmZvCit7CisJZW51bSBpcGxfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKKwkJfSBjY3c7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7CisJCQl1NjQgd3dwbjsKKwkJCXU2NCBsdW47CisJCX0gZmNwOworCQlzdHJ1Y3QgeworCQkJY2hhciBuYW1lW05TU19OQU1FX1NJWkUgKyAxXTsKKwkJfSBuc3M7CisJfSBkYXRhOworfTsKKworZXh0ZXJuIHN0cnVjdCBpcGxfaW5mbyBpcGxfaW5mbzsKK2V4dGVybiB2b2lkIHNldHVwX2lwbF9pbmZvKHZvaWQpOworCiAvKgogICogRElBRyAzMDggc3VwcG9ydAogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2xvd2NvcmUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCmluZGV4IDRhMzFkMGEuLmZmYzk3ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCkBAIC0xNDcsNiArMTQ3LDUyIEBACiB2b2lkIG1jY2tfaW50X2hhbmRsZXIodm9pZCk7CiB2b2lkIGlvX2ludF9oYW5kbGVyKHZvaWQpOwogCitzdHJ1Y3Qgc2F2ZV9hcmVhX3MzOTAgeworCXUzMglleHRfc2F2ZTsKKwl1NjQJdGltZXI7CisJdTY0CWNsa19jbXA7CisJdTgJcGFkMVsyNF07CisJdTgJcHN3WzhdOworCXUzMglwcmVmX3JlZzsKKwl1OAlwYWQyWzIwXTsKKwl1MzIJYWNjX3JlZ3NbMTZdOworCXU2NAlmcF9yZWdzWzRdOworCXUzMglncF9yZWdzWzE2XTsKKwl1MzIJY3RybF9yZWdzWzE2XTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2F2ZV9hcmVhX3MzOTB4IHsKKwl1NjQJZnBfcmVnc1sxNl07CisJdTY0CWdwX3JlZ3NbMTZdOworCXU4CXBzd1sxNl07CisJdTgJcGFkMVs4XTsKKwl1MzIJcHJlZl9yZWc7CisJdTMyCWZwX2N0cmxfcmVnOworCXU4CXBhZDJbNF07CisJdTMyCXRvZF9yZWc7CisJdTY0CXRpbWVyOworCXU2NAljbGtfY21wOworCXU4CXBhZDNbOF07CisJdTMyCWFjY19yZWdzWzE2XTsKKwl1NjQJY3RybF9yZWdzWzE2XTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBzYXZlX2FyZWEgeworCXN0cnVjdCBzYXZlX2FyZWFfczM5MAlzMzkwOworCXN0cnVjdCBzYXZlX2FyZWFfczM5MHgJczM5MHg7Cit9OworCisjZGVmaW5lIFNBVkVfQVJFQV9CQVNFX1MzOTAJMHhkNAorI2RlZmluZSBTQVZFX0FSRUFfQkFTRV9TMzkwWAkweDEyMDAKKworI2lmbmRlZiBfX3MzOTB4X18KKyNkZWZpbmUgU0FWRV9BUkVBX1NJWkUgc2l6ZW9mKHN0cnVjdCBzYXZlX2FyZWFfczM5MCkKKyNkZWZpbmUgU0FWRV9BUkVBX0JBU0UgU0FWRV9BUkVBX0JBU0VfUzM5MAorI2Vsc2UKKyNkZWZpbmUgU0FWRV9BUkVBX1NJWkUgc2l6ZW9mKHN0cnVjdCBzYXZlX2FyZWFfczM5MHgpCisjZGVmaW5lIFNBVkVfQVJFQV9CQVNFIFNBVkVfQVJFQV9CQVNFX1MzOTBYCisjZW5kaWYKKwogc3RydWN0IF9sb3djb3JlCiB7CiAjaWZuZGVmIF9fczM5MHhfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAppbmRleCAxM2MxNjU0Li44ZmU4ZDQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaApAQCAtNzUzLDE0ICs3NTMsMTQgQEAKICAqIHNob3VsZCB0aGVyZWZvcmUgb25seSBiZSBjYWxsZWQgaWYgaXQgaXMgbm90IG1hcHBlZCBpbiBhbnkKICAqIGFkZHJlc3Mgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIGludCBwYWdlX3Rlc3RfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JdW5zaWduZWQgbG9uZyBwaHlzcGFnZSA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKLQlpbnQgc2tleSA9IHBhZ2VfZ2V0X3N0b3JhZ2Vfa2V5KHBoeXNwYWdlKTsKKwlyZXR1cm4gKHBhZ2VfZ2V0X3N0b3JhZ2Vfa2V5KHBhZ2VfdG9fcGh5cyhwYWdlKSkgJiBfUEFHRV9DSEFOR0VEKSAhPSAwOworfQogCi0JaWYgKHNrZXkgJiBfUEFHRV9DSEFOR0VEKQotCQlwYWdlX3NldF9zdG9yYWdlX2tleShwaHlzcGFnZSwgc2tleSAmIH5fUEFHRV9DSEFOR0VEKTsKLQlyZXR1cm4gc2tleSAmIF9QQUdFX0NIQU5HRUQ7CitzdGF0aWMgaW5saW5lIHZvaWQgcGFnZV9jbGVhcl9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwYWdlX3NldF9zdG9yYWdlX2tleShwYWdlX3RvX3BoeXMocGFnZSksIFBBR0VfREVGQVVMVF9LRVkpOwogfQogCiAvKgpAQCAtOTUzLDcgKzk1Myw4IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRkxVU0gKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BBR0VfVEVTVF9BTkRfQ0xFQVJfRElSVFkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUEFHRV9URVNUX0RJUlRZCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BBR0VfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUEFHRV9URVNUX0FORF9DTEVBUl9ZT1VORwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKaW5kZXggMzNiODBjZS4uZTBmY2VhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCkBAIC01Nyw2ICs1Nyw3IEBACiAKIGV4dGVybiB2b2lkIHMzOTBfYWRqdXN0X2ppZmZpZXModm9pZCk7CiBleHRlcm4gdm9pZCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb19TMzkwICopOworZXh0ZXJuIGludCBnZXRfY3B1X2NhcGFiaWxpdHkodW5zaWduZWQgaW50ICopOwogCiAvKiBMYXp5IEZQVSBoYW5kbGluZyBvbiB1bmktcHJvY2Vzc29yICovCiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpsYXN0X3Rhc2tfdXNlZF9tYXRoOwpAQCAtMTk2LDYgKzE5Nyw3IEBACiBleHRlcm4gY2hhciAqdGFza19zaG93X3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpOwogCiBleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBzaG93X2NvZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKTsKIAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc2NscC5oIGIvaW5jbHVkZS9hc20tczM5MC9zY2xwLmgKaW5kZXggNDY4Yjk3MC4uMjFlZDY0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zY2xwLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9zY2xwLmgKQEAgLTksNiArOSw3IEBACiAjZGVmaW5lIF9BU01fUzM5MF9TQ0xQX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAKIHN0cnVjdCBzY2NiX2hlYWRlciB7CiAJdTE2CWxlbmd0aDsKQEAgLTMzLDcgKzM0LDIwIEBACiAJdTgJX3Jlc2VydmVkM1s0MDk2IC0gMTEyXTsJLyogMTEyLTQwOTUgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQwOTYpKSk7CiAKKyNkZWZpbmUgU0NMUF9DSFBfSU5GT19NQVNLX1NJWkUJCTMyCisKK3N0cnVjdCBzY2xwX2NocF9pbmZvIHsKKwl1OCByZWNvZ25pemVkW1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKKwl1OCBzdGFuZGJ5W1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKKwl1OCBjb25maWd1cmVkW1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKK307CisKIGV4dGVybiBzdHJ1Y3Qgc2NscF9yZWFkaW5mb19zY2NiIHMzOTBfcmVhZGluZm9fc2NjYjsKIGV4dGVybiB2b2lkIHNjbHBfcmVhZGluZm9fZWFybHkodm9pZCk7CitleHRlcm4gaW50IHNjbHBfc2RpYXNfYmxrX2NvdW50KHZvaWQpOworZXh0ZXJuIGludCBzY2xwX3NkaWFzX2NvcHkodm9pZCAqZGVzdCwgaW50IGJsa19udW0sIGludCBucl9ibGtzKTsKK2V4dGVybiBpbnQgc2NscF9jaHBfY29uZmlndXJlKHN0cnVjdCBjaHBfaWQgY2hwaWQpOworZXh0ZXJuIGludCBzY2xwX2NocF9kZWNvbmZpZ3VyZShzdHJ1Y3QgY2hwX2lkIGNocGlkKTsKK2V4dGVybiBpbnQgc2NscF9jaHBfcmVhZF9pbmZvKHN0cnVjdCBzY2xwX2NocF9pbmZvICppbmZvKTsKIAogI2VuZGlmIC8qIF9BU01fUzM5MF9TQ0xQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaAppbmRleCA0NGM3YWVlLi5hNzZhNmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oCkBAIC00MCw2ICs0MCw3IEBACiB9OwogCiBleHRlcm4gc3RydWN0IG1lbV9jaHVuayBtZW1vcnlfY2h1bmtbXTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHJlYWxfbWVtb3J5X3NpemU7CiAKICNpZmRlZiBDT05GSUdfUzM5MF9TV0lUQ0hfQU1PREUKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3dpdGNoX2Ftb2RlOwpAQCAtNzcsNiArNzgsNyBAQAogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX1NDTFAJKCFNQUNISU5FX0lTX1AzOTApCisjZGVmaW5lIFpGQ1BEVU1QX0hTQV9TSVpFCSgzMlVMPDwyMCkKIAogLyoKICAqIENvbnNvbGUgbW9kZS4gT3ZlcnJpZGUgd2l0aCBjb25tb2RlPQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zbXAuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc21wLmgKaW5kZXggYjk1N2U0Yy4uMGEyOGU2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oCkBAIC01NCw5ICs1NCw2IEBACiAKICNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKQkoUzM5MF9sb3djb3JlLmNwdV9kYXRhLmNwdV9ucikKIAotZXh0ZXJuIGludCBzbXBfZ2V0X2NwdShjcHVtYXNrX3QgY3B1X21hcCk7Ci1leHRlcm4gdm9pZCBzbXBfcHV0X2NwdShpbnQgY3B1KTsKLQogc3RhdGljIGlubGluZSBfX3UxNiBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKICAgICAgICAgX191MTYgY3B1X2FkZHJlc3M7CkBAIC0xMTQsOSArMTExLDggQEAKIH0KIAogI2RlZmluZSBzbXBfY3B1X25vdF9ydW5uaW5nKGNwdSkJMQotI2RlZmluZSBzbXBfZ2V0X2NwdShjcHUpICh7IDA7IH0pCi0jZGVmaW5lIHNtcF9wdXRfY3B1KGNwdSkgKHsgMDsgfSkKICNkZWZpbmUgc21wX3NldHVwX2NwdV9wb3NzaWJsZV9tYXAoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorZXh0ZXJuIHVuaW9uIHNhdmVfYXJlYSAqemZjcGR1bXBfc2F2ZV9hcmVhc1tOUl9DUFVTICsgMV07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3NvY2tldC5oCmluZGV4IDE3NzhhNDkuLjExNjFlYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9zb2NrZXQuaApAQCAtNTcsNSArNTcsNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc29ja2lvcy5oCmluZGV4IDQxMmFlYjRkLi5mNGZjMTZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NvY2tpb3MuaApAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tc2gvc29ja2V0LmgKaW5kZXggY2E3MDM2Mi4uYzQ4ZDZmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX19BU01fU0hfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXNoL3NvY2tpb3MuaAppbmRleCAwOGE3MWRmLi5jZjhiOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc29ja2lvcy5oCkBAIC05LDUgKzksNiBAQAogI2RlZmluZSBTSU9DU1BHUlAJX0lPVygncycsIDgsIHBpZF90KQogI2RlZmluZSBTSU9DR1BHUlAJX0lPUigncycsIDksIHBpZF90KQogCi0jZGVmaW5lIFNJT0NHU1RBTVAJX0lPUigncycsIDEwMCwgc3RydWN0IHRpbWV2YWwpIC8qIEdldCBzdGFtcCAtIGxpbnV4LXNwZWNpZmljICovCisjZGVmaW5lIFNJT0NHU1RBTVAJX0lPUigncycsIDEwMCwgc3RydWN0IHRpbWV2YWwpIC8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCV9JT1IoJ3MnLCAxMDEsIHN0cnVjdCB0aW1lc3BlYykgLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKaW5kZXggMWFlMjNhZS4uNDE5ZTc2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKQEAgLTIwLDUgKzIwLDYgQEAKICNkZWZpbmUgU0lPQ1NQR1JQCV9JT1coJ3MnLCA4LCBwaWRfdCkKICNkZWZpbmUgU0lPQ0dQR1JQCV9JT1IoJ3MnLCA5LCBwaWRfdCkKIAotI2RlZmluZSBTSU9DR1NUQU1QCV9JT1IoJ3MnLCAxMDAsIHN0cnVjdCB0aW1ldmFsKSAvKiBHZXQgc3RhbXAgLSBsaW51eC1zcGVjaWZpYyAqLworI2RlZmluZSBTSU9DR1NUQU1QCV9JT1IoJ3MnLCAxMDAsIHN0cnVjdCB0aW1ldmFsKSAvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwlfSU9SKCdzJywgMTAxLCBzdHJ1Y3QgdGltZXNwZWMpIC8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAjZW5kaWYgLyogX19BU01fU0g2NF9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc29ja2V0LmgKaW5kZXggZjZjNGU1Yi4uN2MxNDIzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvc29ja2V0LmgKQEAgLTQ5LDYgKzQ5LDggQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkweDAwMWUKICNkZWZpbmUgU09fUEFTU1NFQwkJMHgwMDFmCisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkweDAwMjEKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAvKiBTZWN1cml0eSBsZXZlbHMgLSBhcyBwZXIgTlJMIElQdjYgLSBkb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyAqLwogI2RlZmluZSBTT19TRUNVUklUWV9BVVRIRU5USUNBVElPTgkJMHg1MDAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9zb2NraW9zLmgKaW5kZXggMGMwMWI1OS4uOTkwZWE3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tpb3MuaApAQCAtNyw3ICs3LDggQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmIC8qICEoX0FTTV9TUEFSQ19TT0NLSU9TX0gpICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NvY2tldC5oCmluZGV4IDc1NGQ0NmEuLjk4NjQ0MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zb2NrZXQuaApAQCAtNDksNiArNDksOCBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTB4MDAxZQogI2RlZmluZSBTT19QQVNTU0VDCQkweDAwMWYKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTB4MDAyMQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKIC8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCiAjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkweDUwMDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zb2NraW9zLmgKaW5kZXggNjczNWJhYjQuLmM3ZDk5MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oCkBAIC03LDcgKzcsOCBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogIShfQVNNX1NQQVJDNjRfU09DS0lPU19IKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9kaXY2NC5oIGIvaW5jbHVkZS9hc20tdW0vZGl2NjQuaAppbmRleCAxZTE3Zjc0Li43YjczYjJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2RpdjY0LmgKQEAgLTMsNCArMyw1IEBACiAKICNpbmNsdWRlICJhc20vYXJjaC9kaXY2NC5oIgogCitleHRlcm4gdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tdjg1MC9zb2NrZXQuaAppbmRleCAwZGZlNTVhLi5hNGMyNDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX19WODUwX1NPQ0tFVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tdjg1MC9zb2NraW9zLmgKaW5kZXggY2Y0ODc0Yy4uODIzZTEwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfX1Y4NTBfU09DS0lPU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zb2NrZXQuaAppbmRleCBiNDY3MDI2Li45MGFmNjBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQyAgICAgICAgICAgICAzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zb2NraW9zLmgKaW5kZXggMmVlZmQxMC4uZDcyNmJhMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGl2NjQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oCmluZGV4IGM0YTEwNTcuLjIwOTY1ZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oCkBAIC0xMSw5ICsxMSwxNSBAQAogI2lmbmRlZiBfWFRFTlNBX0RJVjY0X0gKICNkZWZpbmUgX1hURU5TQV9ESVY2NF9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKIAlpbnQgX19yZXMgPSBuICUgKCh1bnNpZ25lZCBpbnQpIGJhc2UpOyBcCiAJbiAvPSAodW5zaWduZWQgaW50KSBiYXNlOyBcCiAJX19yZXM7IH0pCiAKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpCit7CisJcmV0dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oCmluZGV4IDk3MWQyMzEuLjFmNWFlYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmgKQEAgLTYwLDUgKzYwLDcgQEAKICNkZWZpbmUgU09fQUNDRVBUQ09OTgkJMzAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmCS8qIF9YVEVOU0FfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2lvcy5oCmluZGV4IDIwZDJiYTEuLmVmZTBhZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBTSU9DU1BHUlAJX0lPVygncycsIDgsIHBpZF90KQogI2RlZmluZSBTSU9DR1BHUlAJX0lPUigncycsIDksIHBpZF90KQogCi0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgLSBsaW51eC1zcGVjaWZpYyAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYJLyogX1hURU5TQV9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUva2V5cy9yeHJwYy10eXBlLmggYi9pbmNsdWRlL2tleXMvcnhycGMtdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWU3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2tleXMvcnhycGMtdHlwZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIFJ4UlBDIGtleSB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0tFWVNfUlhSUENfVFlQRV9ICisjZGVmaW5lIF9LRVlTX1JYUlBDX1RZUEVfSAorCisjaW5jbHVkZSA8bGludXgva2V5Lmg+CisKKy8qCisgKiBrZXkgdHlwZSBmb3IgQUZfUlhSUEMga2V5cworICovCitleHRlcm4gc3RydWN0IGtleV90eXBlIGtleV90eXBlX3J4cnBjOworCisjZW5kaWYgLyogX0tFWVNfVVNFUl9UWVBFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggZTgxZTMwMS4uNGZmMGY1N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC02OSw5ICs2OSw3IEBACiBoZWFkZXIteSArPSBoeXNkbl9pZi5oCiBoZWFkZXIteSArPSBpMmMtZGV2LmgKIGhlYWRlci15ICs9IGk4ay5oCi1oZWFkZXIteSArPSBpY21wLmgKIGhlYWRlci15ICs9IGlmX2FyY25ldC5oCi1oZWFkZXIteSArPSBpZl9hcnAuaAogaGVhZGVyLXkgKz0gaWZfYm9uZGluZy5oCiBoZWFkZXIteSArPSBpZl9jYWJsZW1vZGVtLmgKIGhlYWRlci15ICs9IGlmX2ZjLmgKQEAgLTg4LDcgKzg2LDYgQEAKIGhlYWRlci15ICs9IGluNi5oCiBoZWFkZXIteSArPSBpbl9yb3V0ZS5oCiBoZWFkZXIteSArPSBpb2N0bC5oCi1oZWFkZXIteSArPSBpcC5oCiBoZWFkZXIteSArPSBpcG1pX21zZ2RlZnMuaAogaGVhZGVyLXkgKz0gaXBfbXBfYWxnLmgKIGhlYWRlci15ICs9IGlwc2VjLmgKQEAgLTExNiw2ICsxMTMsNyBAQAogaGVhZGVyLXkgKz0gbmZzMi5oCiBoZWFkZXIteSArPSBuZnM0X21vdW50LmgKIGhlYWRlci15ICs9IG5mc19tb3VudC5oCitoZWFkZXIteSArPSBubDgwMjExLmgKIGhlYWRlci15ICs9IG9vbS5oCiBoZWFkZXIteSArPSBwYXJhbS5oCiBoZWFkZXIteSArPSBwY2lfcmVncy5oCkBAIC0yMTAsOCArMjA4LDEwIEBACiB1bmlmZGVmLXkgKz0gaHBldC5oCiB1bmlmZGVmLXkgKz0gaTJjLmgKIHVuaWZkZWYteSArPSBpMm8tZGV2LmgKK3VuaWZkZWYteSArPSBpY21wLmgKIHVuaWZkZWYteSArPSBpY21wdjYuaAogdW5pZmRlZi15ICs9IGlmX2FkZHIuaAordW5pZmRlZi15ICs9IGlmX2FycC5oCiB1bmlmZGVmLXkgKz0gaWZfYnJpZGdlLmgKIHVuaWZkZWYteSArPSBpZl9lYy5oCiB1bmlmZGVmLXkgKz0gaWZfZXFsLmgKQEAgLTIzMSw2ICsyMzEsNyBAQAogdW5pZmRlZi15ICs9IGluLmgKIHVuaWZkZWYteSArPSBpbm90aWZ5LmgKIHVuaWZkZWYteSArPSBpbnB1dC5oCit1bmlmZGVmLXkgKz0gaXAuaAogdW5pZmRlZi15ICs9IGlwYy5oCiB1bmlmZGVmLXkgKz0gaXBtaS5oCiB1bmlmZGVmLXkgKz0gaXB2Ni5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YWxrLmggYi9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKaW5kZXggZDEyOTg0ZC4uY2VkOGExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGFsay5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhbGsuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkZHBlaGRyICpkZHBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZGRwZWhkciAqKXNrYi0+aC5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgZGRwZWhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiB9CiAKIC8qIEFwcGxlVGFsayBBQVJQIGhlYWRlcnMgKi8KQEAgLTEyOSw3ICsxMjksNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgZWxhcGFhcnAgKmFhcnBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZWxhcGFhcnAgKilza2ItPmgucmF3OworCXJldHVybiAoc3RydWN0IGVsYXBhYXJwICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIH0KIAogLyogTm90IHNwZWNpZmllZCAtIGhvdyBsb25nIHRpbGwgd2UgZHJvcCBhIHJlc29sdmVkIGVudHJ5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjY3AuaCBiL2luY2x1ZGUvbGludXgvZGNjcC5oCmluZGV4IDFjYjA1NGIuLmZkYTIxNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNjcC5oCkBAIC0yNjAsMTkgKzI2MCwyMCBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkciAqZGNjcF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkciAqKXNrYi0+aC5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkciAqZGNjcF96ZXJvZWRfaGRyKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZWFkbGVuKQogewotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGhlYWRsZW4pOwotCW1lbXNldChza2ItPmgucmF3LCAwLCBoZWFkbGVuKTsKLQlyZXR1cm4gZGNjcF9oZHIoc2tiKTsKKwlza2JfcHVzaChza2IsIGhlYWRsZW4pOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJcmV0dXJuIG1lbXNldChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCAwLCBoZWFkbGVuKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9oZHJfZXh0ICpkY2NwX2hkcngoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9leHQgKikoc2tiLT5oLnJhdyArIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9leHQgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19kY2NwX2Jhc2ljX2hkcl9sZW4oY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCkKQEAgLTMwMSwxMiArMzAyLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QgKmRjY3BfaGRyX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0ICopKHNrYi0+aC5yYXcgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CisJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAqKShza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsKKwkJCQkJICAgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyAqZGNjcF9oZHJfYWNrX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyAqKShza2ItPmgucmF3ICsgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOworCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzICopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJCQkgICAgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCBkY2NwX2hkcl9hY2tfc2VxKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCkBAIC0zMTcsMTIgKzMyMCwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAqZGNjcF9oZHJfcmVzcG9uc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAqKShza2ItPmgucmF3ICsgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOworCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlICopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJCQkgICAgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkcl9yZXNldCAqZGNjcF9oZHJfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9yZXNldCAqKShza2ItPmgucmF3ICsgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOworCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX3Jlc2V0ICopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJCQkgZGNjcF9iYXNpY19oZHJfbGVuKHNrYikpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2RjY3BfaGRyX2xlbihjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoKQpAQCAtNDYwLDI2ICs0NjUsMjcgQEAKICAqIEBkY2Nwc19zZXJ2aWNlX2xpc3QgLSBzZWNvbmQgLi4gbGFzdCBzZXJ2aWNlIGNvZGUgb24gcGFzc2l2ZSBzb2NrZXQKICAqIEBkY2Nwc190aW1lc3RhbXBfdGltZSAtIHRpbWUgb2YgbGF0ZXN0IFRJTUVTVEFNUCBvcHRpb24KICAqIEBkY2Nwc190aW1lc3RhbXBfZWNobyAtIGxhdGVzdCB0aW1lc3RhbXAgcmVjZWl2ZWQgb24gYSBUSU1FU1RBTVAgb3B0aW9uCi0gKiBAZGNjcHNfbF9hY2tfcmF0aW8gLQotICogQGRjY3BzX3JfYWNrX3JhdGlvIC0KKyAqIEBkY2Nwc19sX2Fja19yYXRpbyAtIGZlYXR1cmUtbG9jYWwgQWNrIFJhdGlvCisgKiBAZGNjcHNfcl9hY2tfcmF0aW8gLSBmZWF0dXJlLXJlbW90ZSBBY2sgUmF0aW8KICAqIEBkY2Nwc19wY3NsZW4gLSBzZW5kZXIgICBwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlICh2aWEgc29ja29wdCkKICAqIEBkY2Nwc19wY3JsZW4gLSByZWNlaXZlciBwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlICh2aWEgc29ja29wdCkKICAqIEBkY2Nwc19uZHBfY291bnQgLSBudW1iZXIgb2YgTm9uIERhdGEgUGFja2V0cyBzaW5jZSBsYXN0IGRhdGEgcGFja2V0Ci0gKiBAZGNjcHNfbXNzX2NhY2hlIC0KLSAqIEBkY2Nwc19taW5pc29jayAtCisgKiBAZGNjcHNfbXNzX2NhY2hlIC0gY3VycmVudCB2YWx1ZSBvZiBNU1MgKHBhdGggTVRVIG1pbnVzIGhlYWRlciBzaXplcykKKyAqIEBkY2Nwc19taW5pc29jayAtIGFzc29jaWF0ZWQgbWluaXNvY2sgKGFjY2Vzc2VkIHZpYSBkY2NwX21zaykKICAqIEBkY2Nwc19oY19yeF9hY2t2ZWMgLSByeCBoYWxmIGNvbm5lY3Rpb24gYWNrIHZlY3RvcgotICogQGRjY3BzX2hjX3J4X2NjaWQgLQotICogQGRjY3BzX2hjX3R4X2NjaWQgLQotICogQGRjY3BzX29wdGlvbnNfcmVjZWl2ZWQgLQotICogQGRjY3BzX2Vwb2NoIC0KLSAqIEBkY2Nwc19yb2xlIC0gUm9sZSBvZiB0aGlzIHNvY2ssIG9uZSBvZiAlZGNjcF9yb2xlCi0gKiBAZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgLQotICogQGRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zIC0KKyAqIEBkY2Nwc19oY19yeF9jY2lkIC0gQ0NJRCB1c2VkIGZvciB0aGUgcmVjZWl2ZXIgKG9yIHJlY2VpdmluZyBoYWxmLWNvbm5lY3Rpb24pCisgKiBAZGNjcHNfaGNfdHhfY2NpZCAtIENDSUQgdXNlZCBmb3IgdGhlIHNlbmRlciAob3Igc2VuZGluZyBoYWxmLWNvbm5lY3Rpb24pCisgKiBAZGNjcHNfb3B0aW9uc19yZWNlaXZlZCAtIHBhcnNlZCBzZXQgb2YgcmV0cmlldmVkIG9wdGlvbnMKKyAqIEBkY2Nwc19yb2xlIC0gcm9sZSBvZiB0aGlzIHNvY2ssIG9uZSBvZiAlZGNjcF9yb2xlCisgKiBAZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgLSByZWNlaXZlciB3YW50cyB0byBhZGQgb3B0aW9ucyB3aGVuIGFja2luZworICogQGRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zIC0gc2VuZGVyIHdhbnRzIHRvIGFkZCBvcHRpb25zIHdoZW4gc2VuZGluZwogICogQGRjY3BzX3htaXRfdGltZXIgLSB0aW1lciBmb3Igd2hlbiBDQ0lEIGlzIG5vdCByZWFkeSB0byBzZW5kCisgKiBAZGNjcHNfc3luX3J0dCAtIFJUVCBzYW1wbGUgZnJvbSBSZXF1ZXN0L1Jlc3BvbnNlIGV4Y2hhbmdlIChpbiB1c2VjcykKICAqLwogc3RydWN0IGRjY3Bfc29jayB7CiAJLyogaW5ldF9jb25uZWN0aW9uX3NvY2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YgZGNjcF9zb2NrICovCiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrCWRjY3BzX2luZXRfY29ubmVjdGlvbjsKKyNkZWZpbmUgZGNjcHNfc3luX3J0dAkJCWRjY3BzX2luZXRfY29ubmVjdGlvbi5pY3NrX2Fjay5scmN2dGltZQogCV9fdTY0CQkJCWRjY3BzX3N3bDsKIAlfX3U2NAkJCQlkY2Nwc19zd2g7CiAJX191NjQJCQkJZGNjcHNfYXdsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKaW5kZXggODI3MGFhYy4uODdiNjA2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCkBAIC01LDggKzUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KIAogLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLwotI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMQotI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTIKKyNkZWZpbmUgRklCX1JVTEVfUEVSTUFORU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgRklCX1JVTEVfSU5WRVJUCQkweDAwMDAwMDAyCisjZGVmaW5lIEZJQl9SVUxFX1VOUkVTT0xWRUQJMHgwMDAwMDAwNAorI2RlZmluZSBGSUJfUlVMRV9ERVZfREVUQUNIRUQJMHgwMDAwMDAwOAorCisvKiB0cnkgdG8gZmluZCBzb3VyY2UgYWRkcmVzcyBpbiByb3V0aW5nIGxvb2t1cHMgKi8KKyNkZWZpbmUgRklCX1JVTEVfRklORF9TQUREUgkweDAwMDEwMDAwCiAKIHN0cnVjdCBmaWJfcnVsZV9oZHIKIHsKQEAgLTI5LDcgKzM0LDcgQEAKIAlGUkFfRFNULAkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCiAJRlJBX1NSQywJLyogc291cmNlIGFkZHJlc3MgKi8KIAlGUkFfSUZOQU1FLAkvKiBpbnRlcmZhY2UgbmFtZSAqLwotCUZSQV9VTlVTRUQxLAorCUZSQV9HT1RPLAkvKiB0YXJnZXQgdG8ganVtcCB0byAoRlJfQUNUX0dPVE8pICovCiAJRlJBX1VOVVNFRDIsCiAJRlJBX1BSSU9SSVRZLAkvKiBwcmlvcml0eS9wcmVmZXJlbmNlICovCiAJRlJBX1VOVVNFRDMsCkBAIC01MSw4ICs1Niw4IEBACiB7CiAJRlJfQUNUX1VOU1BFQywKIAlGUl9BQ1RfVE9fVEJMLAkJLyogUGFzcyB0byBmaXhlZCB0YWJsZSAqLwotCUZSX0FDVF9SRVMxLAotCUZSX0FDVF9SRVMyLAorCUZSX0FDVF9HT1RPLAkJLyogSnVtcCB0byBhbm90aGVyIHJ1bGUgKi8KKwlGUl9BQ1RfTk9QLAkJLyogTm8gb3BlcmF0aW9uICovCiAJRlJfQUNUX1JFUzMsCiAJRlJfQUNUX1JFUzQsCiAJRlJfQUNUX0JMQUNLSE9MRSwJLyogRHJvcCB3aXRob3V0IG5vdGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oZGxjLmggYi9pbmNsdWRlL2xpbnV4L2hkbGMuaAppbmRleCBkNGIzMzM5Li4wZmU1NjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hkbGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hkbGMuaApAQCAtMTMyLDggKzEzMiw4IEBACiB7CiAJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOwogCi0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKLQlza2ItPmRldiAgICAgID0gZGV2OworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAlpZiAoaGRsYy0+cHJvdG8tPnR5cGVfdHJhbnMpCiAJCXJldHVybiBoZGxjLT5wcm90by0+dHlwZV90cmFucyhza2IsIGRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ljbXAuaCBiL2luY2x1ZGUvbGludXgvaWNtcC5oCmluZGV4IDI0ZGE0ZmIuLjQ3NGYyYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWNtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWNtcC5oCkBAIC04Miw2ICs4MiwxNSBAQAogICB9IHVuOwogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWNtcGhkciAqaWNtcF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpY21waGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiAvKgogICoJY29uc3RhbnRzIGZvciAoc2V0fGdldClzb2Nrb3B0CiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWNtcHY2LmggYi9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCmluZGV4IDY4ZDM1MjYuLjdjNWU5ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pY21wdjYuaApAQCAtNzUsNiArNzUsMTUgQEAKICNkZWZpbmUgaWNtcDZfcm91dGVyX3ByZWYJaWNtcDZfZGF0YXVuLnVfbmRfcmEucm91dGVyX3ByZWYKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGljbXA2aGRyICppY21wNl9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpY21wNmhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisjZW5kaWYKKwogI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfTE9XCQkweDMKICNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTQkweDAKICNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX0hJR0gJCTB4MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9hZGRyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaAppbmRleCBkNTU3ZTRjLi40M2YzYmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaApAQCAtMzksNiArMzksNyBAQAogI2RlZmluZSBJRkFfRl9URU1QT1JBUlkJCUlGQV9GX1NFQ09OREFSWQogCiAjZGVmaW5lCUlGQV9GX05PREFECQkweDAyCisjZGVmaW5lIElGQV9GX09QVElNSVNUSUMJMHgwNAogI2RlZmluZQlJRkFfRl9IT01FQUREUkVTUwkweDEwCiAjZGVmaW5lIElGQV9GX0RFUFJFQ0FURUQJMHgyMAogI2RlZmluZSBJRkFfRl9URU5UQVRJVkUJCTB4NDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmggYi9pbmNsdWRlL2xpbnV4L2lmX2FycC5oCmluZGV4IDdmNTcxNDIuLmVkN2I5M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9hcnAuaApAQCAtMTQ4LDQgKzE0OCwxMyBAQAogCiB9OwogCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnBoZHIgKmFycF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhcnBoZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiAjZW5kaWYJLyogX0xJTlVYX0lGX0FSUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAppbmRleCBmZDFiNmViLi40ZmYyMTFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKQEAgLTEwNSw3ICsxMDUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiBleHRlcm4gdm9pZCBicmlvY3RsX3NldChpbnQgKCppb2N0bF9ob29rKSh1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopKTsKLWV4dGVybiBpbnQgKCpicl9oYW5kbGVfZnJhbWVfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqKCpicl9oYW5kbGVfZnJhbWVfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludCAoKmJyX3Nob3VsZF9yb3V0ZV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaCBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAppbmRleCBhYjA4ZjM1Li4xZGI3NzRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCkBAIC02MSw2ICs2MSw3IEBACiAjZGVmaW5lIEVUSF9QXzgwMjFRCTB4ODEwMCAgICAgICAgICAvKiA4MDIuMVEgVkxBTiBFeHRlbmRlZCBIZWFkZXIgICovCiAjZGVmaW5lIEVUSF9QX0lQWAkweDgxMzcJCS8qIElQWCBvdmVyIERJWAkJCSovCiAjZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECQkvKiBJUHY2IG92ZXIgYmx1ZWJvb2sJCSovCisjZGVmaW5lIEVUSF9QX1BBVVNFCTB4ODgwOAkJLyogSUVFRSBQYXVzZSBmcmFtZXMuIFNlZSA4MDIuMyAzMUIgKi8KICNkZWZpbmUgRVRIX1BfU0xPVwkweDg4MDkJCS8qIFNsb3cgUHJvdG9jb2wuIFNlZSA4MDIuM2FkIDQzQiAqLwogI2RlZmluZSBFVEhfUF9XQ0NQCTB4ODgzRQkJLyogV2ViLWNhY2hlIGNvb3JkaW5hdGlvbiBwcm90b2NvbAogCQkJCQkgKiBkZWZpbmVkIGluIGRyYWZ0LXdpbHNvbi13cmVjLXdjY3AtdjItMDAudHh0ICovCkBAIC0xMTIsNyArMTEzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoaGRyICpldGhfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZXRoaGRyICopc2tiLT5tYWMucmF3OworCXJldHVybiAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiB9CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCmluZGV4IDM1ZWQzYjUuLjYwNGMyNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0xMjYsNiArMTI2LDcgQEAKIAlJRkxBX0lORVQ2X1NUQVRTLAkvKiBzdGF0aXN0aWNzCQkJKi8KIAlJRkxBX0lORVQ2X01DQVNULAkvKiBNQyB0aGluZ3MuIFdoYXQgb2YgdGhlbT8JKi8KIAlJRkxBX0lORVQ2X0NBQ0hFSU5GTywJLyogdGltZSB2YWx1ZXMgYW5kIG1heCByZWFzbSBzaXplICovCisJSUZMQV9JTkVUNl9JQ01QNlNUQVRTLAkvKiBzdGF0aXN0aWNzIChpY21wdjYpCQkqLwogCV9fSUZMQV9JTkVUNl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCmluZGV4IGYzZGUwNWMuLmFkMDk2MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaApAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBQQUNLRVRfU1RBVElTVElDUwkJNgogI2RlZmluZSBQQUNLRVRfQ09QWV9USFJFU0gJCTcKICNkZWZpbmUgUEFDS0VUX0FVWERBVEEJCQk4CisjZGVmaW5lIFBBQ0tFVF9PUklHREVWCQkJOQogCiBzdHJ1Y3QgdHBhY2tldF9zdGF0cwogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oIGIvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCmluZGV4IGUzM2VlNzYuLjZmOTg3YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKQEAgLTExMSw3ICsxMTEsMTcgQEAKIAlzdHJ1Y3QgcHBwb2VfdGFnIHRhZ1swXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBMZW5ndGggb2YgZW50aXJlIFBQUG9FICsgUFBQIGhlYWRlciAqLworI2RlZmluZSBQUFBPRV9TRVNfSExFTgk4CisKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG9lX2hkciAqcHBwb2VfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgcHBwb2VfaGRyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Cit9CisKIHN0cnVjdCBwcHBvZV9vcHQgewogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgKmRldjsJICAvKiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNvY2tldCovCiAJaW50CQkJaWZpbmRleDsgIC8qIGlmaW5kZXggb2YgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzb2NrZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdHIuaCBiL2luY2x1ZGUvbGludXgvaWZfdHIuaAppbmRleCAyZjk0Y2YyLi4wNDZlOWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3RyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl90ci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRyaF9oZHIgKnRyX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IHRyaF9oZHIgKilza2ItPm1hYy5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgdHJoX2hkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiB9CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgdHJfdGFibGVbXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggZDEwMzU4MC4uODFlOWJjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZsYW5fZXRoX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5tYWMucmF3OworCXJldHVybiAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIH0KIAogc3RydWN0IHZsYW5faGRyIHsKQEAgLTI3NSw4ICsyNzUsOCBAQAogCXZldGgtPmhfdmxhbl9UQ0kgPSBodG9ucyh0YWcpOwogCiAJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOwotCXNrYi0+bWFjLnJhdyAtPSBWTEFOX0hMRU47Ci0Jc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCXNrYi0+bWFjX2hlYWRlciAtPSBWTEFOX0hMRU47CisJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CiAKIAlyZXR1cm4gc2tiOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl93YW5waXBlX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9pZl93YW5waXBlX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTU0NjFkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogaWZfd2FuaXBlX2NvbW1vbi5oICAgU2FuZ29tYSBEcml2ZXIvU29ja2V0IGNvbW1vbiBhcmVhIGRlZmluaXRpb25zLgotKgotKiBBdXRob3I6ICAgICAgIE5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KLSoKLSogQ29weXJpZ2h0OiAgICAoYykgMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCi0qCi0qICAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotKiAgICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qICAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0qICAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBKYW4gMTMsIDIwMDAgIE5lbmFkIENvcmJpYyAgICAgIEluaXRpYWwgdmVyc2lvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfV0FOUElQRV9TT0NLX0RSSVZFUl9DT01NT05fSAotI2RlZmluZSBfV0FOUElQRV9TT0NLX0RSSVZFUl9DT01NT05fSAotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlOwotCWF0b21pY190IHBhY2tldF9zZW50OwotCWF0b21pY190IHJlY2VpdmVfYmxvY2s7Ci0JYXRvbWljX3QgY29tbWFuZDsKLQlhdG9taWNfdCBkaXNjb25uZWN0OwotCWF0b21pY190IGRyaXZlcl9idXN5OwotCWxvbmcgY29tbW9uX2NyaXRpY2FsOwotCXN0cnVjdCB0aW1lcl9saXN0ICp0eF90aW1lcjsKLQlzdHJ1Y3Qgc29jayAqc2s7CQkvKiBXYW5waXBlIFNvY2sgYmluZCdzIGhlcmUgKi8gCi0JaW50ICgqZnVuYykoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCi0JCSAgICBzdHJ1Y3Qgc29jayAqc2spOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdhbnBpcGVfd29yazsgICAgLyogZGVmZXJyZWQga2V2ZW50ZCB3b3JrICovCi0JdW5zaWduZWQgY2hhciByd19iaW5kOwkJCSAgLyogU29jayBiaW5kIHN0YXRlICovCi0JdW5zaWduZWQgY2hhciB1c2VkYnk7Ci0JdW5zaWduZWQgY2hhciBzdGF0ZTsKLQl1bnNpZ25lZCBjaGFyIHN2YzsKLQl1bnNpZ25lZCBzaG9ydCBsY247Ci0Jdm9pZCAqbWJveDsKLX0gd2FucGlwZV9jb21tb25fdDsKLQotCi1lbnVtIHsKLQlXQU5TT0NLX1VOQ09ORklHVVJFRCwJLyogbGluay9jaGFubmVsIGlzIG5vdCBjb25maWd1cmVkICovCi0JV0FOU09DS19ESVNDT05ORUNURUQsCS8qIGxpbmsvY2hhbm5lbCBpcyBkaXNjb25uZWN0ZWQgKi8KLQlXQU5TT0NLX0NPTk5FQ1RJTkcsCQkvKiBjb25uZWN0aW9uIGlzIGluIHByb2dyZXNzICovCi0JV0FOU09DS19DT05ORUNURUQsCQkvKiBsaW5rL2NoYW5uZWwgaXMgb3BlcmF0aW9uYWwgKi8KLQlXQU5TT0NLX0xJTUlULAkJLyogZm9yIHZlcmlmaWNhdGlvbiBvbmx5ICovCi0JV0FOU09DS19EVUFMUE9SVCwJCS8qIGZvciBEdWFsIFBvcnQgY2FyZHMgKi8KLQlXQU5TT0NLX0RJU0NPTk5FQ1RJTkcsCi0JV0FOU09DS19CSU5ERUQsCi0JV0FOU09DS19CSU5EX0xJU1RFTiwKLQlXQU5TT0NLX0xJU1RFTgotfTsKLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZ21wLmggYi9pbmNsdWRlL2xpbnV4L2lnbXAuaAppbmRleCBhMTEzZmU2Li5mNTEwZTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lnbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lnbXAuaApAQCAtODAsNiArODAsMjcgQEAKIAlfX2JlMzIgc3Jjc1swXTsKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlnbXBoZHIgKmlnbXBfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaWdtcGhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlnbXB2M19yZXBvcnQgKgorCQkJaWdtcHYzX3JlcG9ydF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpZ21wdjNfcmVwb3J0ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWdtcHYzX3F1ZXJ5ICoKKwkJCWlnbXB2M19xdWVyeV9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpZ21wdjNfcXVlcnkgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorI2VuZGlmCisKICNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUVVFUlkJMHgxMQkvKiBGcm9tIFJGQzExMTIgKi8KICNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUkVQT1JUCTB4MTIJLyogRGl0dG8gKi8KICNkZWZpbmUgSUdNUF9EVk1SUAkJCTB4MTMJLyogRFZNUlAgcm91dGluZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbi5oIGIvaW5jbHVkZS9saW51eC9pbi5oCmluZGV4IDE5MTJlN2MuLjM5NzVjYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2luLmgKQEAgLTgzLDYgKzgzLDcgQEAKICNkZWZpbmUgSVBfUE1UVURJU0NfRE9OVAkJMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcyAqLwogI2RlZmluZSBJUF9QTVRVRElTQ19XQU5UCQkxCS8qIFVzZSBwZXIgcm91dGUgaGludHMJKi8KICNkZWZpbmUgSVBfUE1UVURJU0NfRE8JCQkyCS8qIEFsd2F5cyBERgkJKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfUFJPQkUJCTMgICAgICAgLyogSWdub3JlIGRzdCBwbXR1ICAgICAgKi8KIAogI2RlZmluZSBJUF9NVUxUSUNBU1RfSUYJCQkzMgogI2RlZmluZSBJUF9NVUxUSUNBU1RfVFRMIAkJMzMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW42LmggYi9pbmNsdWRlL2xpbnV4L2luNi5oCmluZGV4IDRlODM1MGEuLjJhNjFjODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW42LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbjYuaApAQCAtNDQsMTAgKzQ0LDggQEAKICAqIE5PVEU6IEJlIGF3YXJlIHRoZSBJTjZBRERSXyogY29uc3RhbnRzIGFuZCBpbjZhZGRyXyogZXh0ZXJuYWxzIGFyZSBkZWZpbmVkCiAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIG5vdCBpbiBob3N0IGJ5dGUgb3JkZXIgYXMgYXJlIHRoZSBJUHY0IGVxdWl2YWxlbnRzCiAgKi8KLSNpZiAwCiBleHRlcm4gY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfYW55OwogI2RlZmluZSBJTjZBRERSX0FOWV9JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSB9IH0KLSNlbmRpZgogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbjZfYWRkciBpbjZhZGRyX2xvb3BiYWNrOwogI2RlZmluZSBJTjZBRERSX0xPT1BCQUNLX0lOSVQgeyB7IHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSB9IH0gfQogCkBAIC0xNzksNiArMTc3LDcgQEAKICNkZWZpbmUgSVBWNl9QTVRVRElTQ19ET05UCQkwCiAjZGVmaW5lIElQVjZfUE1UVURJU0NfV0FOVAkJMQogI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCQkyCisjZGVmaW5lIElQVjZfUE1UVURJU0NfUFJPQkUJCTMKIAogLyogRmxvd2xhYmVsICovCiAjZGVmaW5lIElQVjZfRkxPV0xBQkVMX01HUgkzMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcC5oIGIvaW5jbHVkZS9saW51eC9pcC5oCmluZGV4IDFkMzZiOTcuLmJkMGEyYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwLmgKQEAgLTEwNCw2ICsxMDQsMjAgQEAKIAkvKlRoZSBvcHRpb25zIHN0YXJ0IGhlcmUuICovCiB9OwogCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcGhkciAqaXBfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaXBoZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBoZHIgKmlwaXBfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaXBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorI2VuZGlmCisKIHN0cnVjdCBpcF9hdXRoX2hkciB7CiAJX191OCAgbmV4dGhkcjsKIAlfX3U4ICBoZHJsZW47CQkvKiBUaGlzIG9uZSBpcyBtZWFzdXJlZCBpbiAzMiBiaXQgdW5pdHMhICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IDcxM2ViNWUuLjA5ZWEwMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC0xNzgsNiArMTc4LDkgQEAKICNlbmRpZgogCV9fczMyCQlwcm94eV9uZHA7CiAJX19zMzIJCWFjY2VwdF9zb3VyY2Vfcm91dGU7CisjaWZkZWYgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQKKwlfX3MzMgkJb3B0aW1pc3RpY19kYWQ7CisjZW5kaWYKIAl2b2lkCQkqc3lzY3RsOwogfTsKIApAQCAtMjA4LDYgKzIxMSw3IEBACiAJREVWQ09ORl9QUk9YWV9ORFAsCiAJX19ERVZDT05GX09QVElNSVNUSUNfREFELAogCURFVkNPTkZfQUNDRVBUX1NPVVJDRV9ST1VURSwKKwlERVZDT05GX09QVElNSVNUSUNfREFELAogCURFVkNPTkZfTUFYCiB9OwogCkBAIC0yMTksNiArMjIzLDE2IEBACiAjaW5jbHVkZSA8bmV0L2lmX2luZXQ2Lmg+ICAgICAgIC8qIHN0cnVjdCBpcHY2X21jX3NvY2tsaXN0ICovCiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHY2aGRyICppcHY2X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlwdjZoZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB2NmhkciAqaXBpcHY2X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlwdjZoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorCiAvKiAKICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHJlc3VsdHMgb2YgZXh0aGRycyBwYXJzaW5nCiAgICBhcyBvZmZzZXRzIGZyb20gc2tiLT5uaC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamhhc2guaCBiL2luY2x1ZGUvbGludXgvamhhc2guaAppbmRleCA4MmM3YWU0Li4yYTJmOTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2poYXNoLmgKKysrIGIvaW5jbHVkZS9saW51eC9qaGFzaC5oCkBAIC04NCw3ICs4NCw3IEBACiAvKiBBIHNwZWNpYWwgb3B0aW1pemVkIHZlcnNpb24gdGhhdCBoYW5kbGVzIDEgb3IgbW9yZSBvZiB1MzJzLgogICogVGhlIGxlbmd0aCBwYXJhbWV0ZXIgaGVyZSBpcyB0aGUgbnVtYmVyIG9mIHUzMnMgaW4gdGhlIGtleS4KICAqLwotc3RhdGljIGlubGluZSB1MzIgamhhc2gyKHUzMiAqaywgdTMyIGxlbmd0aCwgdTMyIGluaXR2YWwpCitzdGF0aWMgaW5saW5lIHUzMiBqaGFzaDIoY29uc3QgdTMyICprLCB1MzIgbGVuZ3RoLCB1MzIgaW5pdHZhbCkKIHsKIAl1MzIgYSwgYiwgYywgbGVuOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleS5oIGIvaW5jbHVkZS9saW51eC9rZXkuaAppbmRleCAxNjlmMDVlNC4uYTkyMjBlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleS5oCkBAIC0xNjAsNiArMTYwLDggQEAKIAkgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKwkJdW5zaWduZWQgbG9uZwkJeFsyXTsKKwkJdm9pZAkJCSpwWzJdOwogCX0gdHlwZV9kYXRhOwogCiAJLyoga2V5IGRhdGEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RpbWUuaCBiL2luY2x1ZGUvbGludXgva3RpbWUuaAppbmRleCAyNDgzMDViLi44MWJiOWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCkBAIC0yNTksNiArMjU5LDEyIEBACiAKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHM2NCBrdGltZV90b191cyhjb25zdCBrdGltZV90IGt0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2ID0ga3RpbWVfdG9fdGltZXZhbChrdCk7CisJcmV0dXJuIChzNjQpIHR2LnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHR2LnR2X3VzZWM7Cit9CisKIC8qCiAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2tzLiBUaGUgcmVzb2x1dGlvbiB2YWx1ZSBpcyByZXR1cm5lZCBpbgogICogdGhlIGNsb2NrX2dldHJlcygpIHN5c3RlbSBjYWxsIHRvIGdpdmUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IDRkYjIxZTYuLmVmYzQ1MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMjQsNyArMjQsNyBAQAogc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Owogc3RydWN0IGlub2RlOwogCi0jZGVmaW5lIE5QUk9UTwkJMzMJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCisjZGVmaW5lIE5QUk9UTwkJMzQJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCiAKICNkZWZpbmUgU1lTX1NPQ0tFVAkxCQkvKiBzeXNfc29ja2V0KDIpCQkqLwogI2RlZmluZSBTWVNfQklORAkyCQkvKiBzeXNfYmluZCgyKQkJCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAxYTUyODU0Li5lMDI3YTM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTQyLDYgKzQyLDggQEAKIHN0cnVjdCB2bGFuX2dyb3VwOwogc3RydWN0IGV0aHRvb2xfb3BzOwogc3RydWN0IG5ldHBvbGxfaW5mbzsKKy8qIDgwMi4xMSBzcGVjaWZpYyAqLworc3RydWN0IHdpcmVsZXNzX2RldjsKIAkJCQkJLyogc291cmNlIGJhY2stY29tcGF0IGhvb2tzICovCiAjZGVmaW5lIFNFVF9FVEhUT09MX09QUyhuZXRkZXYsb3BzKSBcCiAJKCAobmV0ZGV2KS0+ZXRodG9vbF9vcHMgPSAob3BzKSApCkBAIC0zMjMsNiArMzI1LDcgQEAKICNkZWZpbmUgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQJMTAyNAkvKiBEZXZpY2UgY2Fubm90IGhhbmRsZSBWTEFOIHBhY2tldHMgKi8KICNkZWZpbmUgTkVUSUZfRl9HU08JCTIwNDgJLyogRW5hYmxlIHNvZnR3YXJlIEdTTy4gKi8KICNkZWZpbmUgTkVUSUZfRl9MTFRYCQk0MDk2CS8qIExvY2tMZXNzIFRYICovCisjZGVmaW5lIE5FVElGX0ZfSU5URVJOQUxfU1RBVFMJODE5MgkvKiBVc2Ugc3RhdHMgc3RydWN0dXJlIGluIG5ldF9kZXZpY2UgKi8KIAogCS8qIFNlZ21lbnRhdGlvbiBvZmZsb2FkIGZlYXR1cmVzICovCiAjZGVmaW5lIE5FVElGX0ZfR1NPX1NISUZUCTE2CkBAIC0zNDcsMTMgKzM1MCwxNSBAQAogCiAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogKCpnZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCisjaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVAogCS8qIExpc3Qgb2YgZnVuY3Rpb25zIHRvIGhhbmRsZSBXaXJlbGVzcyBFeHRlbnNpb25zIChpbnN0ZWFkIG9mIGlvY3RsKS4KIAkgKiBTZWUgPG5ldC9pd19oYW5kbGVyLmg+IGZvciBkZXRhaWxzLiBKZWFuIElJICovCiAJY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmICoJd2lyZWxlc3NfaGFuZGxlcnM7CiAJLyogSW5zdGFuY2UgZGF0YSBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMuICovCiAJc3RydWN0IGl3X3B1YmxpY19kYXRhICoJd2lyZWxlc3NfZGF0YTsKLQorI2VuZGlmCiAJY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGh0b29sX29wczsKIAogCS8qCkBAIC0zOTgsNiArNDAzLDggQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAqaXA2X3B0cjsgICAgICAgLyogSVB2NiBzcGVjaWZpYyBkYXRhICovCiAJdm9pZAkJCSplY19wdHI7CS8qIEVjb25ldCBzcGVjaWZpYyBkYXRhCSovCiAJdm9pZAkJCSpheDI1X3B0cjsJLyogQVguMjUgc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCB3aXJlbGVzc19kZXYJKmllZWU4MDIxMV9wdHI7CS8qIElFRUUgODAyLjExIHNwZWNpZmljIGRhdGEsCisJCQkJCQkgICBhc3NpZ24gYmVmb3JlIHJlZ2lzdGVyaW5nICovCiAKIC8qCiAgKiBDYWNoZSBsaW5lIG1vc3RseSB1c2VkIG9uIHJlY2VpdmUgcGF0aCAoaW5jbHVkaW5nIGV0aF90eXBlX3RyYW5zKCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAppbmRleCA3MGQzYjRmLi4xMGI1YzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTI4MSw5ICsyODEsNiBAQAogCQkJc3RydWN0IG5mX2luZm8gKmluZm8sCiAJCQl1bnNpZ25lZCBpbnQgdmVyZGljdCk7CiAKLWV4dGVybiB2b2lkICgqaXBfY3RfYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWV4dGVybiB2b2lkIG5mX2N0X2F0dGFjaChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLQogLyogRklYTUU6IEJlZm9yZSBjYWNoZSBpcyBldmVyIHVzZWQsIHRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgcmVhbC4gKi8KIGV4dGVybiB2b2lkIG5mX2ludmFsaWRhdGVfY2FjaGUoaW50IHBmKTsKIApAQCAtMzg4LDExICszODUsMTggQEAKIHsKIAlyZXR1cm4gMTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5ldywgc3RydWN0IHNrX2J1ZmYgKnNrYikge30KIHN0cnVjdCBmbG93aTsKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfbmF0X2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpIHt9CiAjZW5kaWYgLypDT05GSUdfTkVURklMVEVSKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKK2V4dGVybiB2b2lkICgqaXBfY3RfYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiB2b2lkIG5mX2N0X2F0dGFjaChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiB2b2lkICgqbmZfY3RfZGVzdHJveSkoc3RydWN0IG5mX2Nvbm50cmFjayAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfYXR0YWNoKHN0cnVjdCBza19idWZmICpuZXcsIHN0cnVjdCBza19idWZmICpza2IpIHt9CisjZW5kaWYKKwogI2VuZGlmIC8qX19LRVJORUxfXyovCiAjZW5kaWYgLypfX0xJTlVYX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaAppbmRleCAwMDdhZjRjLi4yMmNlMjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCkBAIC0zMCw2ICszMCwxMSBAQAogLyogQmUgbGliZXJhbCBpbiB3aW5kb3cgY2hlY2tpbmcgKi8KICNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTAkJMHgwOAogCitzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzIHsKKwl1X2ludDhfdCBmbGFnczsKKwl1X2ludDhfdCBtYXNrOworfTsKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCmluZGV4IDFlOWM4MjEuLjBmOTMxMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCkBAIC02MiwxMSArNjIsMTEgQEAKICNkZWZpbmUgTkZBX0RBVEEobmZhKSAgICgodm9pZCAqKSgoKGNoYXIgKikobmZhKSkgKyBORkFfTEVOR1RIKDApKSkKICNkZWZpbmUgTkZBX1BBWUxPQUQobmZhKSAoKGludCkoKG5mYSktPm5mYV9sZW4pIC0gTkZBX0xFTkdUSCgwKSkKICNkZWZpbmUgTkZBX05FU1Qoc2tiLCB0eXBlKSBcCi0oewlzdHJ1Y3QgbmZhdHRyICpfX3N0YXJ0ID0gKHN0cnVjdCBuZmF0dHIgKikgKHNrYiktPnRhaWw7IFwKKyh7CXN0cnVjdCBuZmF0dHIgKl9fc3RhcnQgPSAoc3RydWN0IG5mYXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsgXAogCU5GQV9QVVQoc2tiLCAoTkZOTF9ORkFfTkVTVCB8IHR5cGUpLCAwLCBOVUxMKTsgXAogCV9fc3RhcnQ7ICB9KQogI2RlZmluZSBORkFfTkVTVF9FTkQoc2tiLCBzdGFydCkgXAotKHsgICAgICAoc3RhcnQpLT5uZmFfbGVuID0gKChza2IpLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgKHN0YXJ0KSk7IFwKKyh7ICAgICAgKHN0YXJ0KS0+bmZhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopKHN0YXJ0KTsgXAogICAgICAgICAoc2tiKS0+bGVuOyB9KQogI2RlZmluZSBORkFfTkVTVF9DQU5DRUwoc2tiLCBzdGFydCkgXAogKHsgICAgICBpZiAoc3RhcnQpIFwKQEAgLTExMSw3ICsxMTEsNyBAQAogc3RydWN0IG5mbmxfY2FsbGJhY2sKIHsKIAlpbnQgKCpjYWxsKShzdHJ1Y3Qgc29jayAqbmwsIHN0cnVjdCBza19idWZmICpza2IsIAotCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCk7CisJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSk7CiAJdV9pbnQxNl90IGF0dHJfY291bnQ7CS8qIG51bWJlciBvZiBuZmF0dHIncyAqLwogfTsKIApAQCAtMTI5LDE5ICsxMjksNiBAQAogKHsgaWYgKHNrYl90YWlscm9vbShza2IpIDwgKGludClORkFfU1BBQ0UoYXR0cmxlbikpIGdvdG8gbmZhdHRyX2ZhaWx1cmU7IFwKICAgIF9fbmZhX2ZpbGwoc2tiLCBhdHRydHlwZSwgYXR0cmxlbiwgZGF0YSk7IH0pCiAKLWV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIG5mbmxfc2VtOwotCi0jZGVmaW5lIG5mbmxfc2hsb2NrKCkJCWRvd24oJm5mbmxfc2VtKQotI2RlZmluZSBuZm5sX3NobG9ja19ub3dhaXQoKQlkb3duX3RyeWxvY2soJm5mbmxfc2VtKQotCi0jZGVmaW5lIG5mbmxfc2h1bmxvY2soKQkJZG8geyB1cCgmbmZubF9zZW0pOyBcCi0JCQkJICAgICBpZihuZm5sICYmIG5mbmwtPnNrX3JlY2VpdmVfcXVldWUucWxlbikgXAotCQkJCQkgICAgbmZubC0+c2tfZGF0YV9yZWFkeShuZm5sLCAwKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgCX0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgbmZubF9sb2NrKHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZubF91bmxvY2sodm9pZCk7Ci0KIGV4dGVybiBpbnQgbmZuZXRsaW5rX3N1YnN5c19yZWdpc3RlcihzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbik7CiBleHRlcm4gaW50IG5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcihzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaAppbmRleCBiNTg4M2NjLi5kN2MzNTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCkBAIC04Myw2ICs4MywxMCBAQAogZW51bSBjdGF0dHJfcHJvdG9pbmZvX3RjcCB7CiAJQ1RBX1BST1RPSU5GT19UQ1BfVU5TUEVDLAogCUNUQV9QUk9UT0lORk9fVENQX1NUQVRFLAorCUNUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTCwKKwlDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFksCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwsCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFksCiAJX19DVEFfUFJPVE9JTkZPX1RDUF9NQVgKIH07CiAjZGVmaW5lIENUQV9QUk9UT0lORk9fVENQX01BWCAoX19DVEFfUFJPVE9JTkZPX1RDUF9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAppbmRleCA1NTY4OWYzLi4xOTA2MDAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgogCiAvKiBCcmlkZ2UgSG9va3MgKi8KIC8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KQEAgLTU4LDggKzU5LDE0IEBACiAgKiBlbm91Z2ggcm9vbSBmb3IgdGhlIGVuY2Fwc3VsYXRpbmcgaGVhZGVyIChpZiB0aGVyZSBpcyBvbmUpLiAqLwogc3RhdGljIGlubGluZSBpbnQgbmZfYnJpZGdlX3BhZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotIAlyZXR1cm4gKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQotCQk/IFZMQU5fSExFTiA6IDA7CisJaW50IHBhZGRpbmcgPSAwOworCisJaWYgKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlwYWRkaW5nID0gVkxBTl9ITEVOOworCWVsc2UgaWYgKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCisJCXBhZGRpbmcgPSBQUFBPRV9TRVNfSExFTjsKKworCXJldHVybiBwYWRkaW5nOwogfQogCiBzdHJ1Y3QgYnJpZGdlX3NrYl9jYiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKaW5kZXggMDdmMDQ0Zi4uYTExYjBjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaApAQCAtNTQsNyArNTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfODAyXzNfaGRyICplYnRfODAyXzNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZWJ0XzgwMl8zX2hkciAqKXNrYi0+bWFjLnJhdzsKKwlyZXR1cm4gKHN0cnVjdCBlYnRfODAyXzNfaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaAppbmRleCA5N2U0ZGJkLi5jYmY0ODQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmgKQEAgLTgsOCArOCwxMCBAQAogI2RlZmluZSBFQlRfQVJQX0RTVF9JUCAweDEwCiAjZGVmaW5lIEVCVF9BUlBfU1JDX01BQyAweDIwCiAjZGVmaW5lIEVCVF9BUlBfRFNUX01BQyAweDQwCisjZGVmaW5lIEVCVF9BUlBfR1JBVCAweDgwCiAjZGVmaW5lIEVCVF9BUlBfTUFTSyAoRUJUX0FSUF9PUENPREUgfCBFQlRfQVJQX0hUWVBFIHwgRUJUX0FSUF9QVFlQRSB8IFwKLSAgIEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVAgfCBFQlRfQVJQX1NSQ19NQUMgfCBFQlRfQVJQX0RTVF9NQUMpCisgICBFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQIHwgRUJUX0FSUF9TUkNfTUFDIHwgRUJUX0FSUF9EU1RfTUFDIHwgXAorICAgRUJUX0FSUF9HUkFUKQogI2RlZmluZSBFQlRfQVJQX01BVENIICJhcnAiCiAKIHN0cnVjdCBlYnRfYXJwX2luZm8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKaW5kZXggMTgwMzM3OC4uNzE4NTc5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKQEAgLTEsOSArMSwzIEBACi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfaGVscGVyLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19wcm90b2NvbC5oCi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfc2N0cC5oCi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfdGNwLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja190ZnRwLmgKLWhlYWRlci15ICs9IGlwX25hdF9wcHRwLmgKIGhlYWRlci15ICs9IGlwdF9hZGRydHlwZS5oCiBoZWFkZXIteSArPSBpcHRfYWguaAogaGVhZGVyLXkgKz0gaXB0X0NMQVNTSUZZLmgKQEAgLTQ5LDEzICs0Myw1IEBACiBoZWFkZXIteSArPSBpcHRfVFRMLmgKIGhlYWRlci15ICs9IGlwdF9VTE9HLmgKIAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFjay5oCi11bmlmZGVmLXkgKz0gaXBfY29ubnRyYWNrX2gzMjMuaAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFja19pcmMuaAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFja19wcHRwLmgKLXVuaWZkZWYteSArPSBpcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKLXVuaWZkZWYteSArPSBpcF9jb25udHJhY2tfdHVwbGUuaAotdW5pZmRlZi15ICs9IGlwX25hdC5oCi11bmlmZGVmLXkgKz0gaXBfbmF0X3J1bGUuaAogdW5pZmRlZi15ICs9IGlwX3F1ZXVlLmgKIHVuaWZkZWYteSArPSBpcF90YWJsZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTI3NGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX0gKLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b19ncmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oPgotCi0vKiBwZXIgY29ubnRyYWNrOiBwcm90b2NvbCBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIGlwX2Nvbm50cmFja19wcm90byB7Ci0JLyogaW5zZXJ0IGNvbm50cmFjayBwcm90byBwcml2YXRlIGRhdGEgaGVyZSAqLwotCXN0cnVjdCBpcF9jdF9ncmUgZ3JlOwotCXN0cnVjdCBpcF9jdF9zY3RwIHNjdHA7Ci0Jc3RydWN0IGlwX2N0X3RjcCB0Y3A7Ci0Jc3RydWN0IGlwX2N0X2ljbXAgaWNtcDsKLX07Ci0KLXVuaW9uIGlwX2Nvbm50cmFja19leHBlY3RfcHJvdG8gewotCS8qIGluc2VydCBleHBlY3QgcHJvdG8gcHJpdmF0ZSBkYXRhIGhlcmUgKi8KLX07Ci0KLS8qIEFkZCBwcm90b2NvbCBoZWxwZXIgaW5jbHVkZSBmaWxlIGhlcmUgKi8KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19mdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmg+Ci0KLS8qIHBlciBjb25udHJhY2s6IGFwcGxpY2F0aW9uIGhlbHBlciBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIGlwX2Nvbm50cmFja19oZWxwIHsKLQkvKiBpbnNlcnQgY29ubnRyYWNrIGhlbHBlciBwcml2YXRlIGRhdGEgKG1hc3RlcikgaGVyZSAqLwotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciBjdF9oMzIzX2luZm87Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyIGN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciBjdF9mdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfY3RfaXJjX21hc3RlciBjdF9pcmNfaW5mbzsKLX07Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmg+Ci0KLS8qIHBlciBjb25udHJhY2s6IG5hdCBhcHBsaWNhdGlvbiBoZWxwZXIgcHJpdmF0ZSBkYXRhICovCi11bmlvbiBpcF9jb25udHJhY2tfbmF0X2hlbHAgewotCS8qIGluc2VydCBuYXQgaGVscGVyIHByaXZhdGUgZGF0YSBoZXJlICovCi0Jc3RydWN0IGlwX25hdF9wcHRwIG5hdF9wcHRwX2luZm87Ci19OwotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotI2RlZmluZSBJUF9ORl9BU1NFUlQoeCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoISh4KSkJCQkJCQkJXAotCQkvKiBXb29haCEgIEknbSB0cmlwcGluZyBteSBjb25udHJhY2sgaW4gYSBmcmVuenkgb2YJXAotCQkgICBuZXRwbGF5Li4uICovCQkJCQlcCi0JCXByaW50aygiTkZfSVBfQVNTRVJUOiAlczolaSglcylcbiIsCQkJXAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwkJXAotfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCi0jZW5kaWYKLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXI7Ci0KLXN0cnVjdCBpcF9jb25udHJhY2sKLXsKLQkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUvZGVzdHJ1Y3QgdGltZXIsIDEgcGVyIHNrYiwKLSAgICAgICAgICAgcGx1cyAxIGZvciBhbnkgY29ubmVjdGlvbihzKSB3ZSBhcmUgYG1hc3RlcicgZm9yICovCi0Jc3RydWN0IG5mX2Nvbm50cmFjayBjdF9nZW5lcmFsOwotCi0JLyogSGF2ZSB3ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzIHlldD8gKGJpdHNldCkgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXR1czsKLQotCS8qIFRpbWVyIGZ1bmN0aW9uOyBkcm9wcyByZWZjbnQgd2hlbiBpdCBnb2VzIG9mZi4gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NUX0FDQ1QKLQkvKiBBY2NvdW50aW5nIEluZm9ybWF0aW9uIChzYW1lIGNhY2hlIGxpbmUgYXMgb3RoZXIgd3JpdHRlbiBtZW1iZXJzKSAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciBjb3VudGVyc1tJUF9DVF9ESVJfTUFYXTsKLSNlbmRpZgotCS8qIElmIHdlIHdlcmUgZXhwZWN0ZWQgYnkgYW4gZXhwZWN0YXRpb24sIHRoaXMgd2lsbCBiZSBpdCAqLwotCXN0cnVjdCBpcF9jb25udHJhY2sgKm1hc3RlcjsKLQotCS8qIEN1cnJlbnQgbnVtYmVyIG9mIGV4cGVjdGVkIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQgaW50IGV4cGVjdGluZzsKLQotCS8qIFVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhpcyBjb25udHJhY2sqLwotCXVuc2lnbmVkIGludCBpZDsKLQotCS8qIEhlbHBlciwgaWYgYW55LiAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7Ci0KLQkvKiBTdG9yYWdlIHJlc2VydmVkIGZvciBvdGhlciBtb2R1bGVzOiAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19wcm90byBwcm90bzsKLQotCXVuaW9uIGlwX2Nvbm50cmFja19oZWxwIGhlbHA7Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpcF9uYXRfaW5mbyBpbmZvOwotCQl1bmlvbiBpcF9jb25udHJhY2tfbmF0X2hlbHAgaGVscDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgfHwgXAotCWRlZmluZWQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFX01PRFVMRSkKLQkJaW50IG1hc3FfaW5kZXg7Ci0jZW5kaWYKLQl9IG5hdDsKLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfTkFUX05FRURFRCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUkspCi0JdV9pbnQzMl90IG1hcms7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfU0VDTUFSSwotCXVfaW50MzJfdCBzZWNtYXJrOwotI2VuZGlmCi0KLQkvKiBUcmF2ZXJzZWQgb2Z0ZW4sIHNvIGhvcGVmdWxseSBpbiBkaWZmZXJlbnQgY2FjaGVsaW5lIHRvIHRvcCAqLwotCS8qIFRoZXNlIGFyZSBteSB0dXBsZXM7IG9yaWdpbmFsIGFuZCByZXBseSAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCB0dXBsZWhhc2hbSVBfQ1RfRElSX01BWF07Ci19OwotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdAotewotCS8qIEludGVybmFsIGxpbmtlZCBsaXN0IChnbG9iYWwgZXhwZWN0YXRpb24gbGlzdCkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBXZSBleHBlY3QgdGhpcyB0dXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIG1hc2sgKi8KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlLCBtYXNrOwotIAotCS8qIEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgc2V0dXAgYW5kIGluc2VydGlvbiAqLwotCXZvaWQgKCpleHBlY3Rmbikoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLQotCS8qIFRoZSBjb25udHJhY2sgb2YgdGhlIG1hc3RlciBjb25uZWN0aW9uICovCi0Jc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyOwotCi0JLyogVGltZXIgZnVuY3Rpb247IGRlbGV0ZXMgdGhlIGV4cGVjdGF0aW9uLiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7Ci0KLQkvKiBVc2FnZSBjb3VudC4gKi8KLQlhdG9taWNfdCB1c2U7Ci0KLQkvKiBVbmlxdWUgSUQgKi8KLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQkvKiBGbGFncyAqLwotCXVuc2lnbmVkIGludCBmbGFnczsKLQotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0JX19iZTMyIHNhdmVkX2lwOwotCS8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBlci1wcm90byBwYXJ0LCB1c2VkIHRvIG1hcCB0aGUKLQkgKiBleHBlY3RlZCBjb25uZWN0aW9uIHRoZSB3YXkgdGhlIHJlY2lwaWVudCBleHBlY3RzLiAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byBzYXZlZF9wcm90bzsKLQkvKiBEaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBjb25uZWN0aW9uLiAqLwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVAkweDEKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrICoKLXR1cGxlaGFzaF90b19jdHJhY2soY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoKQotewotCXJldHVybiBjb250YWluZXJfb2YoaGFzaCwgc3RydWN0IGlwX2Nvbm50cmFjaywKLQkJCSAgICB0dXBsZWhhc2hbaGFzaC0+dHVwbGUuZHN0LmRpcl0pOwotfQotCi0vKiBnZXQgbWFzdGVyIGNvbm50cmFjayB2aWEgbWFzdGVyIGV4cGVjdGF0aW9uICovCi0jZGVmaW5lIG1hc3Rlcl9jdChjb25udHIpIChjb25udHItPm1hc3RlcikKLQotLyogQWx0ZXIgcmVwbHkgdHVwbGUgKG1heWJlIGFsdGVyIGhlbHBlcikuICovCi1leHRlcm4gdm9pZAotaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpuZXdyZXBseSk7Ci0KLS8qIElzIHRoaXMgdHVwbGUgdGFrZW4/IChpZ25vcmluZyBhbnkgYmVsb25naW5nIHRvIHRoZSBnaXZlbgotICAgY29ubnRyYWNrKS4gKi8KLWV4dGVybiBpbnQKLWlwX2Nvbm50cmFja190dXBsZV90YWtlbihjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjayk7Ci0KLS8qIFJldHVybiBjb25udHJhY2tfaW5mbyBhbmQgdHVwbGUgaGFzaCBmb3IgZ2l2ZW4gc2tiLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrICoKLWlwX2Nvbm50cmFja19nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvKQotewotCSpjdGluZm8gPSBza2ItPm5mY3RpbmZvOwotCXJldHVybiAoc3RydWN0IGlwX2Nvbm50cmFjayAqKXNrYi0+bmZjdDsKLX0KLQotLyogZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBhIGNvbm50cmFjayAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pcF9jb25udHJhY2tfcHV0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCUlQX05GX0FTU0VSVChjdCk7Ci0JbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwotfQotCi1leHRlcm4gaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwotCi1leHRlcm4gdm9pZCBfX2lwX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXh0cmFfamlmZmllcywKLQkJCQkgaW50IGRvX2FjY3QpOwotCi0vKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgYW5kIGRvIGFjY291bnRpbmcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9jdF9yZWZyZXNoX2FjY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIAotCQkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBleHRyYV9qaWZmaWVzKQotewotCV9faXBfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIHNrYiwgZXh0cmFfamlmZmllcywgMSk7Ci19Ci0KLS8qIFJlZnJlc2ggY29ubnRyYWNrIGZvciB0aGlzIG1hbnkgamlmZmllcyAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwX2N0X3JlZnJlc2goc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZXh0cmFfamlmZmllcykKLXsKLQlfX2lwX2N0X3JlZnJlc2hfYWNjdChjdCwgMCwgc2tiLCBleHRyYV9qaWZmaWVzLCAwKTsKLX0KLQotLyogVGhlc2UgYXJlIGZvciBOQVQuICBJY2t5LiAqLwotLyogVXBkYXRlIFRDUCB3aW5kb3cgdHJhY2tpbmcgZGF0YSB3aGVuIE5BVCBtYW5nbGVzIHRoZSBwYWNrZXQgKi8KLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja190Y3BfdXBkYXRlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJCQkgICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcik7Ci0KLS8qIENhbGwgbWUgd2hlbiBhIGNvbm50cmFjayBpcyBkZXN0cm95ZWQuICovCi1leHRlcm4gdm9pZCAoKmlwX2Nvbm50cmFja19kZXN0cm95ZWQpKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayk7Ci0KLS8qIEZha2UgY29ubnRyYWNrIGVudHJ5IGZvciB1bnRyYWNrZWQgY29ubmVjdGlvbnMgKi8KLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrIGlwX2Nvbm50cmFja191bnRyYWNrZWQ7Ci0KLS8qIFJldHVybnMgbmV3IHNrX2J1ZmYsIG9yIE5VTEwgKi8KLXN0cnVjdCBza19idWZmICoKLWlwX2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcik7Ci0KLS8qIEl0ZXJhdGUgb3ZlciBhbGwgY29ubnRyYWNrczogaWYgaXRlciByZXR1cm5zIHRydWUsIGl0J3MgZGVsZXRlZC4gKi8KLWV4dGVybiB2b2lkCi1pcF9jdF9pdGVyYXRlX2NsZWFudXAoaW50ICgqaXRlcikoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSksCi0JCSAgICAgIHZvaWQgKmRhdGEpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotaXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2dldChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7Ci1leHRlcm4gdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKgotX19pcF9jb25udHJhY2tfcHJvdG9fZmluZCh1X2ludDhfdCBwcm90b2NvbCk7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqCi1pcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQodV9pbnQ4X3QgcHJvdG9jb2wpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX3Byb3RvX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90byk7Ci0KLWV4dGVybiB2b2lkIGlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFjayAqaXBfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKik7Ci0KLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19mcmVlKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLQotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLV9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLWlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKTsKLQotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2ZsdXNoKHZvaWQpOwotCi0vKiBJdCdzIGNvbmZpcm1lZCBpZiBpdCBpcywgb3IgaGFzIGJlZW4gaW4gdGhlIGhhc2ggdGFibGUuICovCi1zdGF0aWMgaW5saW5lIGludCBpc19jb25maXJtZWQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JcmV0dXJuIHRlc3RfYml0KElQU19DT05GSVJNRURfQklULCAmY3QtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX2R5aW5nKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXJldHVybiB0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotZXh0ZXJuIGludCBpcF9jb25udHJhY2tfY2hlY2tzdW07Ci0gCi0jZGVmaW5lIENPTk5UUkFDS19TVEFUX0lOQyhjb3VudCkgKF9fZ2V0X2NwdV92YXIoaXBfY29ubnRyYWNrX3N0YXQpLmNvdW50KyspCi0jZGVmaW5lIENPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoY291bnQpCQlcCi1kbyB7CQkJCQkJCVwKLQlsb2NhbF9iaF9kaXNhYmxlKCk7CQkJCVwKLQlfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19zdGF0KS5jb3VudCsrOwlcCi0JbG9jYWxfYmhfZW5hYmxlKCk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlIHsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzOwotfTsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSwgaXBfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLSNkZWZpbmUgQ09OTlRSQUNLX0VDQUNIRSh4KQkoX19nZXRfY3B1X3ZhcihpcF9jb25udHJhY2tfZWNhY2hlKS54KQotIAotZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBpcF9jb25udHJhY2tfY2hhaW47Ci1leHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIGlwX2Nvbm50cmFja19leHBlY3RfY2hhaW47Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlwX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmlwX2Nvbm50cmFja19jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IAotaXBfY29ubnRyYWNrX2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIG5iKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWlwX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwKLQkJCW5iKTsKLX0KLQotZXh0ZXJuIHZvaWQgaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLWV4dGVybiB2b2lkIF9faXBfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAKLWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCi0JCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopc2tiLT5uZmN0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0JCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19lY2FjaGUpOwotCWlmIChjdCAhPSBlY2FjaGUtPmN0KQotCQlfX2lwX2N0X2V2ZW50X2NhY2hlX2luaXQoY3QpOwotCWVjYWNoZS0+ZXZlbnRzIHw9IGV2ZW50OwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlpZiAoaXNfY29uZmlybWVkKGN0KSAmJiAhaXNfZHlpbmcoY3QpKQotCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmaXBfY29ubnRyYWNrX2NoYWluLCBldmVudCwgY3QpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1pcF9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIGV2ZW50LCBleHApOwotfQotI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoZW51bSBpcF9jb25udHJhY2tfZXZlbnRzIGV2ZW50LCAKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwgCi0JCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KSB7fQotc3RhdGljIGlubGluZSB2b2lkIAotaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LCAKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkge30KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLwotCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLXN0YXRpYyBpbmxpbmUgaW50IGlwX25hdF9pbml0aWFsaXplZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkJICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwKQotewotCWlmIChtYW5pcCA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlyZXR1cm4gdGVzdF9iaXQoSVBTX1NSQ19OQVRfRE9ORV9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7Ci0JcmV0dXJuIHRlc3RfYml0KElQU19EU1RfTkFUX0RPTkVfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotfQotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9OQVRfTkVFREVEICovCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19hbWFuZGEuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNlNDFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0FNQU5EQV9ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfQU1BTkRBX0gKLS8qIEFNQU5EQSB0cmFja2luZy4gKi8KLQotc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3Q7Ci1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJCSAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCQkgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX0FNQU5EQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTZkZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0NPUkVfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX0NPUkVfSAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotCi0jZGVmaW5lIE1BWF9JUF9DVF9QUk9UTyAyNTYKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICppcF9jdF9wcm90b3NbTUFYX0lQX0NUX1BST1RPXTsKLQotLyogVGhpcyBoZWFkZXIgaXMgdXNlZCB0byBzaGFyZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUKLSAgIHN0YW5kYWxvbmUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUsIGFuZCB0aGUgY29tcGF0aWJpbGl0eSBsYXllcidzIHVzZQotICAgb2YgY29ubmVjdGlvbiB0cmFja2luZy4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2luKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpOwotCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2NsZWFudXAodm9pZCk7Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2w7Ci0KLWV4dGVybiBpbnQKLWlwX2N0X2dldF90dXBsZShjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7Ci0KLWV4dGVybiBpbnQKLWlwX2N0X2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAotCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnLAotCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7Ci0KLS8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqCi1pcF9jb25udHJhY2tfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKTsKLQotZXh0ZXJuIGludCBfX2lwX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICoqcHNrYik7Ci0KLS8qIENvbmZpcm0gYSBjb25uZWN0aW9uOiByZXR1cm5zIE5GX0RST1AgaWYgcGFja2V0IG11c3QgYmUgZHJvcHBlZC4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlwX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICoqcHNrYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopKCpwc2tiKS0+bmZjdDsKLQlpbnQgcmV0ID0gTkZfQUNDRVBUOwotCi0JaWYgKGN0KSB7Ci0JCWlmICghaXNfY29uZmlybWVkKGN0KSAmJiAhaXNfZHlpbmcoY3QpKQotCQkJcmV0ID0gX19pcF9jb25udHJhY2tfY29uZmlybShwc2tiKTsKLQkJaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGN0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotZXh0ZXJuIHZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoOwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0OwotZXh0ZXJuIHJ3bG9ja190IGlwX2Nvbm50cmFja19sb2NrOwotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfQ09SRV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjlmYzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfRlRQX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19GVFBfSAotLyogRlRQIHRyYWNraW5nLiAqLwotCi0vKiBUaGlzIGVudW0gaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgKi8KLWVudW0gaXBfY3RfZnRwX3R5cGUKLXsKLQkvKiBQT1JUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KLQlJUF9DVF9GVFBfUE9SVCwKLQkvKiBQQVNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCi0JSVBfQ1RfRlRQX1BBU1YsCi0JLyogRVBSVCBjb21tYW5kIGZyb20gY2xpZW50ICovCi0JSVBfQ1RfRlRQX0VQUlQsCi0JLyogRVBTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLwotCUlQX0NUX0ZUUF9FUFNWLAotfTsKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBGVFBfUE9SVAkyMQotCi0jZGVmaW5lIE5VTV9TRVFfVE9fUkVNRU1CRVIgMgotLyogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgb25jZSBwZXIgbWFzdGVyICovCi1zdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciB7Ci0JLyogVmFsaWQgc2VxIHBvc2l0aW9ucyBmb3IgY21kIG1hdGNoaW5nIGFmdGVyIG5ld2xpbmUgKi8KLQl1X2ludDMyX3Qgc2VxX2FmdF9ubFtJUF9DVF9ESVJfTUFYXVtOVU1fU0VRX1RPX1JFTUVNQkVSXTsKLQkvKiAwIG1lYW5zIHNlcV9tYXRjaF9hZnRfbmwgbm90IHNldCAqLwotCWludCBzZXFfYWZ0X25sX251bVtJUF9DVF9ESVJfTUFYXTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0OwotCi0vKiBGb3IgTkFUIHRvIGhvb2sgaW4gd2hlbiB3ZSBmaW5kIGEgcGFja2V0IHdoaWNoIGRlc2NyaWJlcyB3aGF0IG90aGVyCi0gKiBjb25uZWN0aW9uIHdlIHNob3VsZCBleHBlY3QuICovCi1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X2Z0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgICBlbnVtIGlwX2N0X2Z0cF90eXBlIHR5cGUsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJCSAgICAgICB1MzIgKnNlcSk7Ci0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19GVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY3Njk4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSNpZm5kZWYgX0lQX0NPTk5UUkFDS19IMzIzX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19IMzIzX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmg+Ci0KLSNkZWZpbmUgUkFTX1BPUlQgMTcxOQotI2RlZmluZSBROTMxX1BPUlQgMTcyMAotI2RlZmluZSBIMzIzX1JUUF9DSEFOTkVMX01BWCA0CS8qIEF1ZGlvLCB2aWRlbywgRkFYIGFuZCBvdGhlciAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBleGlzdHMgb25seSBvbmNlIHBlciBtYXN0ZXIgKi8KLXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciB7Ci0KLQkvKiBPcmlnaW5hbCBhbmQgTkFUZWQgUS45MzEgb3IgSC4yNDUgc2lnbmFsIHBvcnRzICovCi0JdV9pbnQxNl90IHNpZ19wb3J0W0lQX0NUX0RJUl9NQVhdOwotCi0JLyogT3JpZ2luYWwgYW5kIE5BVGVkIFJUUCBwb3J0cyAqLwotCXVfaW50MTZfdCBydHBfcG9ydFtIMzIzX1JUUF9DSEFOTkVMX01BWF1bSVBfQ1RfRElSX01BWF07Ci0KLQl1bmlvbiB7Ci0JCS8qIFJBUyBjb25uZWN0aW9uIHRpbWVvdXQgKi8KLQkJdV9pbnQzMl90IHRpbWVvdXQ7Ci0KLQkJLyogTmV4dCBUUEtUIGxlbmd0aCAoZm9yIHNlcGFyYXRlIFRQS1QgaGVhZGVyIGFuZCBkYXRhKSAqLwotCQl1X2ludDE2X3QgdHBrdF9sZW5bSVBfQ1RfRElSX01BWF07Ci0JfTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0OwotCi1leHRlcm4gaW50IGdldF9oMjI1X2FkZHIodW5zaWduZWQgY2hhciAqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgX19iZTMyICogaXAsIHVfaW50MTZfdCAqIHBvcnQpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpuZXcsCi0JCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7Ci1leHRlcm4gaW50ICgqc2V0X2gyNDVfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCQkgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkJICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWV4dGVybiBpbnQgKCpzZXRfaDIyNV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkJICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWV4dGVybiBpbnQgKCpzZXRfc2lnX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgKCpzZXRfcmFzX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgKCpuYXRfcnRwX3J0Y3BfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCQkgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCQkgdV9pbnQxNl90IHBvcnQsIHVfaW50MTZfdCBydHBfcG9ydCwKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBydHBfZXhwLAotCQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIHJ0Y3BfZXhwKTsKLWV4dGVybiBpbnQgKCpuYXRfdDEyMF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotZXh0ZXJuIGludCAoKm5hdF9oMjQ1X2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICAgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotZXh0ZXJuIGludCAoKm5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCSAgICAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCQkgICAgICAgdV9pbnQxNl90IHBvcnQsCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogZXhwKTsKLWV4dGVybiBpbnQgKCpuYXRfcTkzMV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJICAgICBpbnQgaWR4LCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZlODY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogSVAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXJzLiAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0hFTFBFUl9ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfSEVMUEVSX0gKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLQotc3RydWN0IG1vZHVsZTsKLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIKLXsJCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAJCS8qIEludGVybmFsIHVzZS4gKi8KLQotCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBtb2R1bGUgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsJCS8qIHBvaW50ZXIgdG8gc2VsZiAqLwotCXVuc2lnbmVkIGludCBtYXhfZXhwZWN0ZWQ7CS8qIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgCi0JCQkJCSAqIGV4cGVjdGVkIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQgaW50IHRpbWVvdXQ7CQkvKiB0aW1lb3V0IGZvciBleHBlY3RlZHMgKi8KLQotCS8qIE1hc2sgb2YgdGhpbmdzIHdlIHdpbGwgaGVscCAoY29tcGFyZWQgYWdhaW5zdCBzZXJ2ZXIgcmVzcG9uc2UpICovCi0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIG1hc2s7Ci0JCi0JLyogRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRhdGEgcGFzc2VzOyByZXR1cm4gdmVyZGljdCwgb3IgLTEgdG8KLSAgICAgICAgICAgaW52YWxpZGF0ZS4gKi8KLQlpbnQgKCpoZWxwKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY29ubnRyYWNraW5mbyk7Ci0KLQl2b2lkICgqZGVzdHJveSkoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JaW50ICgqdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCk7Ci19OwotCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKik7Ci1leHRlcm4gdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKik7Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbiBleHBlY3RhdGlvbjogdGhpcyBpcyBtYW5kYXRvcnkgYmVmb3JlIGNhbGxpbmcgCi0gICBpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQuICBZb3Ugd2lsbCBoYXZlIHRvIGNhbGwgcHV0IGFmdGVyd2FyZHMuICovCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci0KLS8qIEFkZCBhbiBleHBlY3RlZCBjb25uZWN0aW9uOiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBlciBjb25uZWN0aW9uICovCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZW5kaWYgLypfSVBfQ09OTlRSQUNLX0hFTFBFUl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2ljbXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2ljbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkNWVlMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19pY21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0lQX0NPTk5UUkFDS19JQ01QX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19JQ01QX0gKLQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaWNtcC5oPgotCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19JQ01QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2lyYy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjAxZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJUkMgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLgotICogKEMpIDIwMDAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIGJhc2VkIG9uIFJSJ3MgaXBfY29ubnRyYWNrX2Z0cC5oCi0gKgotICogaXBfY29ubnRyYWNrX2lyYy5oLHYgMS42IDIwMDAvMTEvMDcgMTg6MjY6NDIgbGFmb3JnZSBFeHAKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoKLSAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0lSQ19ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfSVJDX0gKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgb25jZSBwZXIgbWFzdGVyICovCi1zdHJ1Y3QgaXBfY3RfaXJjX21hc3RlciB7Ci19OwotCi0jaWZkZWYgX19LRVJORUxfXwotZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF9pcmNfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZGVmaW5lIElSQ19QT1JUCTY2NjcKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfSVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NGIxZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyogUFBUUCBjb25zdGFudHMgYW5kIHN0cnVjdHMgKi8KLSNpZm5kZWYgX0NPTk5UUkFDS19QUFRQX0gKLSNkZWZpbmUgX0NPTk5UUkFDS19QUFRQX0gKLQotLyogc3RhdGUgb2YgdGhlIGNvbnRyb2wgc2Vzc2lvbiAqLwotZW51bSBwcHRwX2N0cmxzZXNzX3N0YXRlIHsKLQlQUFRQX1NFU1NJT05fTk9ORSwJCQkvKiBubyBzZXNzaW9uIHByZXNlbnQgKi8KLQlQUFRQX1NFU1NJT05fRVJST1IsCQkJLyogc29tZSBzZXNzaW9uIGVycm9yICovCi0JUFBUUF9TRVNTSU9OX1NUT1BSRVEsCQkJLyogc3RvcF9zZXNzIHJlcXVlc3Qgc2VlbiAqLwotCVBQVFBfU0VTU0lPTl9SRVFVRVNURUQsCQkJLyogc3RhcnRfc2VzcyByZXF1ZXN0IHNlZW4gKi8KLQlQUFRQX1NFU1NJT05fQ09ORklSTUVELAkJCS8qIHNlc3Npb24gZXN0YWJsaXNoZWQgKi8KLX07Ci0KLS8qIHN0YXRlIG9mIHRoZSBjYWxsIGluc2lkZSB0aGUgY29udHJvbCBzZXNzaW9uICovCi1lbnVtIHBwdHBfY3RybGNhbGxfc3RhdGUgewotCVBQVFBfQ0FMTF9OT05FLAotCVBQVFBfQ0FMTF9FUlJPUiwKLQlQUFRQX0NBTExfT1VUX1JFUSwKLQlQUFRQX0NBTExfT1VUX0NPTkYsCi0JUFBUUF9DQUxMX0lOX1JFUSwKLQlQUFRQX0NBTExfSU5fUkVQLAotCVBQVFBfQ0FMTF9JTl9DT05GLAotCVBQVFBfQ0FMTF9DTEVBUl9SRVEsCi19OwotCi0KLS8qIGNvbm50cmFjayBwcml2YXRlIGRhdGEgKi8KLXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciB7Ci0JZW51bSBwcHRwX2N0cmxzZXNzX3N0YXRlIHNzdGF0ZTsJLyogc2Vzc2lvbiBzdGF0ZSAqLwotCi0JLyogZXZlcnl0aGluZyBiZWxvdyBpcyBnb2luZyB0byBiZSBwZXItZXhwZWN0YXRpb24gaW4gbmV3bmF0LAotCSAqIHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgY2FsbCB3aXRoaW4gb25lIHNlc3Npb24gKi8KLQllbnVtIHBwdHBfY3RybGNhbGxfc3RhdGUgY3N0YXRlOwkvKiBjYWxsIHN0YXRlICovCi0JX19iZTE2IHBhY19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUEFDLCBob3N0IGJ5dGUgb3JkZXIgKi8KLQlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkJLyogY2FsbCBpZCBvZiBQTlMsIGhvc3QgYnl0ZSBvcmRlciAqLwotCi0JLyogaW4gcHJlLTIuNi4xMSB0aGlzIHVzZWQgdG8gYmUgcGVyLWV4cGVjdC4gTm93IGl0IGlzIHBlci1jb25udHJhY2sKLQkgKiBhbmQgdGhlcmVmb3JlIGltcG9zZXMgYSBmaXhlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG1hcHMgKi8KLQlzdHJ1Y3QgaXBfY3RfZ3JlX2tleW1hcCAqa2V5bWFwX29yaWcsICprZXltYXBfcmVwbHk7Ci19OwotCi0vKiBjb25udHJhY2tfZXhwZWN0IHByaXZhdGUgbWVtYmVyICovCi1zdHJ1Y3QgaXBfY3RfcHB0cF9leHBlY3QgewotCWVudW0gcHB0cF9jdHJsY2FsbF9zdGF0ZSBjc3RhdGU7IAkvKiBjYWxsIHN0YXRlICovCi0JX19iZTE2IHBhY19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUEFDICovCi0JX19iZTE2IHBuc19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUE5TICovCi19OwotCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgSVBfQ09OTlRSX1BQVFAJCVBQVFBfQ09OVFJPTF9QT1JUCi0KLSNkZWZpbmUgUFBUUF9DT05UUk9MX1BPUlQJMTcyMwotCi0jZGVmaW5lIFBQVFBfUEFDS0VUX0NPTlRST0wJMQotI2RlZmluZSBQUFRQX1BBQ0tFVF9NR01UCTIKLQotI2RlZmluZSBQUFRQX01BR0lDX0NPT0tJRQkweDFhMmIzYzRkCi0KLXN0cnVjdCBwcHRwX3BrdF9oZHIgewotCV9fdTE2CXBhY2tldExlbmd0aDsKLQlfX2JlMTYJcGFja2V0VHlwZTsKLQlfX2JlMzIJbWFnaWNDb29raWU7Ci19OwotCi0vKiBQcHRwQ29udHJvbE1lc3NhZ2VUeXBlIHZhbHVlcyAqLwotI2RlZmluZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVRVUVTVAkxCi0jZGVmaW5lIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWQkyCi0jZGVmaW5lIFBQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1QJMwotI2RlZmluZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWQkJNAotI2RlZmluZSBQUFRQX0VDSE9fUkVRVUVTVAkJNQotI2RlZmluZSBQUFRQX0VDSE9fUkVQTFkJCQk2Ci0jZGVmaW5lIFBQVFBfT1VUX0NBTExfUkVRVUVTVAkJNwotI2RlZmluZSBQUFRQX09VVF9DQUxMX1JFUExZCQk4Ci0jZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVFVRVNUCQk5Ci0jZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVBMWQkJMTAKLSNkZWZpbmUgUFBUUF9JTl9DQUxMX0NPTk5FQ1QJCTExCi0jZGVmaW5lIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUCQkxMgotI2RlZmluZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlkJMTMKLSNkZWZpbmUgUFBUUF9XQU5fRVJST1JfTk9USUZZCQkxNAotI2RlZmluZSBQUFRQX1NFVF9MSU5LX0lORk8JCTE1Ci0KLSNkZWZpbmUgUFBUUF9NU0dfTUFYCQkJMTUKLQotLyogUHB0cEdlbmVyYWxFcnJvciB2YWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9FUlJPUl9DT0RFX05PTkUJCTAKLSNkZWZpbmUgUFBUUF9OT1RfQ09OTkVDVEVECQkxCi0jZGVmaW5lIFBQVFBfQkFEX0ZPUk1BVAkJCTIKLSNkZWZpbmUgUFBUUF9CQURfVkFMVUUJCQkzCi0jZGVmaW5lIFBQVFBfTk9fUkVTT1VSQ0UJCTQKLSNkZWZpbmUgUFBUUF9CQURfQ0FMTElECQkJNQotI2RlZmluZSBQUFRQX1JFTU9WRV9ERVZJQ0VfRVJST1IJNgotCi1zdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgewotCV9fYmUxNgltZXNzYWdlVHlwZTsKLQlfX3UxNglyZXNlcnZlZDsKLX07Ci0KLS8qIEZyYW1pbmdDYXBhYmlsaXR5IEJpdG1hcCBWYWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9GUkFNRV9DQVBfQVNZTkMJCTB4MQotI2RlZmluZSBQUFRQX0ZSQU1FX0NBUF9TWU5DCQkweDIKLQotLyogQmVhcmVyQ2FwYWJpbGl0eSBCaXRtYXAgVmFsdWVzICovCi0jZGVmaW5lIFBQVFBfQkVBUkVSX0NBUF9BTkFMT0cJCTB4MQotI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfRElHSVRBTAkJMHgyCi0KLXN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdCB7Ci0JX19iZTE2CXByb3RvY29sVmVyc2lvbjsKLQlfX3UxNglyZXNlcnZlZDE7Ci0JX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OwotCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OwotCV9fYmUxNgltYXhDaGFubmVsczsKLQlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKLQlfX3U4CWhvc3ROYW1lWzY0XTsKLQlfX3U4CXZlbmRvclN0cmluZ1s2NF07Ci19OwotCi0vKiBQcHRwU3RhcnRTZXNzaW9uUmVzdWx0Q29kZSBWYWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9TVEFSVF9PSwkJCTEKLSNkZWZpbmUgUFBUUF9TVEFSVF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9TVEFSVF9BTFJFQURZX0NPTk5FQ1RFRAkzCi0jZGVmaW5lIFBQVFBfU1RBUlRfTk9UX0FVVEhPUklaRUQJNAotI2RlZmluZSBQUFRQX1NUQVJUX1VOS05PV05fUFJPVE9DT0wJNQotCi1zdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5IHsKLQlfX2JlMTYJcHJvdG9jb2xWZXJzaW9uOwotCV9fdTgJcmVzdWx0Q29kZTsKLQlfX3U4CWdlbmVyYWxFcnJvckNvZGU7Ci0JX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OwotCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OwotCV9fYmUxNgltYXhDaGFubmVsczsKLQlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKLQlfX3U4CWhvc3ROYW1lWzY0XTsKLQlfX3U4CXZlbmRvclN0cmluZ1s2NF07Ci19OwotCi0vKiBQcHRwU3RvcFJlYXNvbnMgKi8KLSNkZWZpbmUgUFBUUF9TVE9QX05PTkUJCQkxCi0jZGVmaW5lIFBQVFBfU1RPUF9QUk9UT0NPTAkJMgotI2RlZmluZSBQUFRQX1NUT1BfTE9DQUxfU0hVVERPV04JMwotCi1zdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVxdWVzdCB7Ci0JX191OAlyZWFzb247Ci0JX191OAlyZXNlcnZlZDE7Ci0JX191MTYJcmVzZXJ2ZWQyOwotfTsKLQotLyogUHB0cFN0b3BTZXNzaW9uUmVzdWx0Q29kZSAqLwotI2RlZmluZSBQUFRQX1NUT1BfT0sJCQkxCi0jZGVmaW5lIFBQVFBfU1RPUF9HRU5FUkFMX0VSUk9SCQkyCi0KLXN0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXBseSB7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX3UxNglyZXNlcnZlZDE7Ci19OwotCi1zdHJ1Y3QgUHB0cEVjaG9SZXF1ZXN0IHsKLQlfX2JlMzIgaWRlbnROdW1iZXI7Ci19OwotCi0vKiBQcHRwRWNob1JlcGx5UmVzdWx0Q29kZSAqLwotI2RlZmluZSBQUFRQX0VDSE9fT0sJCQkxCi0jZGVmaW5lIFBQVFBfRUNIT19HRU5FUkFMX0VSUk9SCQkyCi0KLXN0cnVjdCBQcHRwRWNob1JlcGx5IHsKLQlfX2JlMzIJaWRlbnROdW1iZXI7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX3UxNglyZXNlcnZlZDsKLX07Ci0KLS8qIFBwdHBGcmFtaW5nVHlwZSAqLwotI2RlZmluZSBQUFRQX0FTWU5DX0ZSQU1JTkcJCTEKLSNkZWZpbmUgUFBUUF9TWU5DX0ZSQU1JTkcJCTIKLSNkZWZpbmUgUFBUUF9ET05UX0NBUkVfRlJBTUlORwkJMwotCi0vKiBQcHRwQ2FsbEJlYXJlclR5cGUgKi8KLSNkZWZpbmUgUFBUUF9BTkFMT0dfVFlQRQkJMQotI2RlZmluZSBQUFRQX0RJR0lUQUxfVFlQRQkJMgotI2RlZmluZSBQUFRQX0RPTlRfQ0FSRV9CRUFSRVJfVFlQRQkzCi0KLXN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7Ci0JX19iZTMyCW1pbkJQUzsKLQlfX2JlMzIJbWF4QlBTOwotCV9fYmUzMgliZWFyZXJUeXBlOwotCV9fYmUzMglmcmFtaW5nVHlwZTsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX19iZTE2CXBob25lTnVtYmVyTGVuZ3RoOwotCV9fdTE2CXJlc2VydmVkMTsKLQlfX3U4CXBob25lTnVtYmVyWzY0XTsKLQlfX3U4CXN1YkFkZHJlc3NbNjRdOwotfTsKLQotLyogUHB0cENhbGxSZXN1bHRDb2RlICovCi0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9DT05ORUNUCQkxCi0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0NBUlJJRVIJCTMKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX0JVU1kJCTQKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0RJQUxfVE9ORQk1Ci0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9USU1FT1VUCQk2Ci0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9ET05UX0FDQ0VQVAk3Ci0KLXN0cnVjdCBQcHRwT3V0Q2FsbFJlcGx5IHsKLQlfX2JlMTYJY2FsbElEOwotCV9fYmUxNglwZWVyc0NhbGxJRDsKLQlfX3U4CXJlc3VsdENvZGU7Ci0JX191OAlnZW5lcmFsRXJyb3JDb2RlOwotCV9fYmUxNgljYXVzZUNvZGU7Ci0JX19iZTMyCWNvbm5lY3RTcGVlZDsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX19iZTMyCXBoeXNDaGFubmVsSUQ7Ci19OwotCi1zdHJ1Y3QgUHB0cEluQ2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7Ci0JX19iZTMyCWNhbGxCZWFyZXJUeXBlOwotCV9fYmUzMglwaHlzQ2hhbm5lbElEOwotCV9fYmUxNglkaWFsZWROdW1iZXJMZW5ndGg7Ci0JX19iZTE2CWRpYWxpbmdOdW1iZXJMZW5ndGg7Ci0JX191OAlkaWFsZWROdW1iZXJbNjRdOwotCV9fdTgJZGlhbGluZ051bWJlcls2NF07Ci0JX191OAlzdWJBZGRyZXNzWzY0XTsKLX07Ci0KLS8qIFBwdHBJbkNhbGxSZXN1bHRDb2RlICovCi0jZGVmaW5lIFBQVFBfSU5DQUxMX0FDQ0VQVAkJMQotI2RlZmluZSBQUFRQX0lOQ0FMTF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9JTkNBTExfRE9OVF9BQ0NFUFQJCTMKLQotc3RydWN0IFBwdHBJbkNhbGxSZXBseSB7Ci0JX19iZTE2CWNhbGxJRDsKLQlfX2JlMTYJcGVlcnNDYWxsSUQ7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZCB7Ci0JX19iZTE2CXBlZXJzQ2FsbElEOwotCV9fdTE2CXJlc2VydmVkOwotCV9fYmUzMgljb25uZWN0U3BlZWQ7Ci0JX19iZTE2CXBhY2tldFdpbmRvdzsKLQlfX2JlMTYJcGFja2V0UHJvY0RlbGF5OwotCV9fYmUzMgljYWxsRnJhbWluZ1R5cGU7Ci19OwotCi1zdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgUHB0cENhbGxEaXNjb25uZWN0Tm90aWZ5IHsKLQlfX2JlMTYJY2FsbElEOwotCV9fdTgJcmVzdWx0Q29kZTsKLQlfX3U4CWdlbmVyYWxFcnJvckNvZGU7Ci0JX19iZTE2CWNhdXNlQ29kZTsKLQlfX3UxNglyZXNlcnZlZDsKLQlfX3U4CWNhbGxTdGF0aXN0aWNzWzEyOF07Ci19OwotCi1zdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5IHsKLQlfX2JlMTYJcGVlcnNDYWxsSUQ7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci0JX19iZTMyCWNyY0Vycm9yczsKLQlfX2JlMzIJZnJhbWluZ0Vycm9yczsKLQlfX2JlMzIJaGFyZHdhcmVPdmVyUnVuczsKLQlfX2JlMzIJYnVmZmVyT3ZlclJ1bnM7Ci0JX19iZTMyCXRpbWVvdXRFcnJvcnM7Ci0JX19iZTMyCWFsaWdubWVudEVycm9yczsKLX07Ci0KLXN0cnVjdCBQcHRwU2V0TGlua0luZm8gewotCV9fYmUxNglwZWVyc0NhbGxJRDsKLQlfX3UxNglyZXNlcnZlZDsKLQlfX2JlMzIJc2VuZEFjY207Ci0JX19iZTMyCXJlY3ZBY2NtOwotfTsKLQotdW5pb24gcHB0cF9jdHJsX3VuaW9uIHsKLQlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcXVlc3QJc3JlcTsKLQlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5CXNyZXA7Ci0Jc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcXVlc3QJc3RyZXE7Ci0Jc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcGx5CXN0cmVwOwotCXN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QJb2NyZXE7Ci0Jc3RydWN0IFBwdHBPdXRDYWxsUmVwbHkJCW9jYWNrOwotCXN0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdAlpY3JlcTsKLQlzdHJ1Y3QgUHB0cEluQ2FsbFJlcGx5CQlpY2FjazsKLQlzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZAlpY2NvbjsKLQlzdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QJY2xycmVxOwotCXN0cnVjdCBQcHRwQ2FsbERpc2Nvbm5lY3ROb3RpZnkgZGlzYzsKLQlzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5CXdhbmVycjsKLQlzdHJ1Y3QgUHB0cFNldExpbmtJbmZvCQlzZXRsaW5rOwotfTsKLQotZXh0ZXJuIGludAotKCppcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkJICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOwotCi1leHRlcm4gaW50Ci0oKmlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKLQotZXh0ZXJuIHZvaWQKLSgqaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKShzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwX29yaWcsCi0JCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cF9yZXBseSk7Ci0KLWV4dGVybiB2b2lkCi0oKmlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0NPTk5UUkFDS19QUFRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzFlMGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotI2lmbmRlZiBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICi0jZGVmaW5lIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0gKLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLS8qIEdSRSBQUk9UT0NPTCBIRUFERVIgKi8KLQotLyogR1JFIFZlcnNpb24gZmllbGQgKi8KLSNkZWZpbmUgR1JFX1ZFUlNJT05fMTcwMQkweDAKLSNkZWZpbmUgR1JFX1ZFUlNJT05fUFBUUAkweDEKLQotLyogR1JFIFByb3RvY29sIGZpZWxkICovCi0jZGVmaW5lIEdSRV9QUk9UT0NPTF9QUFRQCTB4ODgwQgotCi0vKiBHUkUgRmxhZ3MgKi8KLSNkZWZpbmUgR1JFX0ZMQUdfQwkJMHg4MAotI2RlZmluZSBHUkVfRkxBR19SCQkweDQwCi0jZGVmaW5lIEdSRV9GTEFHX0sJCTB4MjAKLSNkZWZpbmUgR1JFX0ZMQUdfUwkJMHgxMAotI2RlZmluZSBHUkVfRkxBR19BCQkweDgwCi0KLSNkZWZpbmUgR1JFX0lTX0MoZikJKChmKSZHUkVfRkxBR19DKQotI2RlZmluZSBHUkVfSVNfUihmKQkoKGYpJkdSRV9GTEFHX1IpCi0jZGVmaW5lIEdSRV9JU19LKGYpCSgoZikmR1JFX0ZMQUdfSykKLSNkZWZpbmUgR1JFX0lTX1MoZikJKChmKSZHUkVfRkxBR19TKQotI2RlZmluZSBHUkVfSVNfQShmKQkoKGYpJkdSRV9GTEFHX0EpCi0KLS8qIEdSRSBpcyBhIG1lc3M6IEZvdXIgZGlmZmVyZW50IHN0YW5kYXJkcyAqLwotc3RydWN0IGdyZV9oZHIgewotI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTE2CXJlYzozLAotCQlzcnI6MSwKLQkJc2VxOjEsCi0JCWtleToxLAotCQlyb3V0aW5nOjEsCi0JCWNzdW06MSwKLQkJdmVyc2lvbjozLAotCQlyZXNlcnZlZDo0LAotCQlhY2s6MTsKLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTE2CWNzdW06MSwKLQkJcm91dGluZzoxLAotCQlrZXk6MSwKLQkJc2VxOjEsCi0JCXNycjoxLAotCQlyZWM6MywKLQkJYWNrOjEsCi0JCXJlc2VydmVkOjQsCi0JCXZlcnNpb246MzsKLSNlbHNlCi0jZXJyb3IgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCi0jZW5kaWYKLQlfX2JlMTYJcHJvdG9jb2w7Ci19OwotCi0vKiBtb2RpZmllZCBHUkUgaGVhZGVyIGZvciBQUFRQICovCi1zdHJ1Y3QgZ3JlX2hkcl9wcHRwIHsKLQlfX3U4ICAgZmxhZ3M7CQkvKiBiaXRmaWVsZCAqLwotCV9fdTggICB2ZXJzaW9uOwkJLyogc2hvdWxkIGJlIEdSRV9WRVJTSU9OX1BQVFAgKi8KLQlfX2JlMTYgcHJvdG9jb2w7CS8qIHNob3VsZCBiZSBHUkVfUFJPVE9DT0xfUFBUUCAqLwotCV9fYmUxNiBwYXlsb2FkX2xlbjsJLyogc2l6ZSBvZiBwcHAgcGF5bG9hZCwgbm90IGluYy4gZ3JlIGhlYWRlciAqLwotCV9fYmUxNiBjYWxsX2lkOwkJLyogcGVlcidzIGNhbGxfaWQgZm9yIHRoaXMgc2Vzc2lvbiAqLwotCV9fYmUzMiBzZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIuICBQcmVzZW50IGlmIFM9PTEgKi8KLQlfX2JlMzIgYWNrOwkJLyogc2VxIG51bWJlciBvZiBoaWdoZXN0IHBhY2tldCByZWNpZXZlZCBieSAqLwotCQkJCS8qICBzZW5kZXIgaW4gdGhpcyBzZXNzaW9uICovCi19OwotCi0KLS8qIHRoaXMgaXMgcGFydCBvZiBpcF9jb25udHJhY2sgKi8KLXN0cnVjdCBpcF9jdF9ncmUgewotCXVuc2lnbmVkIGludCBzdHJlYW1fdGltZW91dDsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdDsKLXN0cnVjdCBpcF9jb25udHJhY2s7Ci0KLS8qIHN0cnVjdHVyZSBmb3Igb3JpZ2luYWwgPC0+IHJlcGx5IGtleW1hcCAqLwotc3RydWN0IGlwX2N0X2dyZV9rZXltYXAgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci19OwotCi0vKiBhZGQgbmV3IHR1cGxlLT5rZXlfcmVwbHkgcGFpciB0byBrZXltYXAgKi8KLWludCBpcF9jdF9ncmVfa2V5bWFwX2FkZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0LAotCQkJIGludCByZXBseSk7Ci0KLS8qIGRlbGV0ZSBrZXltYXAgZW50cmllcyAqLwotdm9pZCBpcF9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0KLS8qIGdldCBwb2ludGVyIHRvIGdyZSBrZXksIGlmIHByZXNlbnQgKi8KLXN0YXRpYyBpbmxpbmUgX19iZTMyICpncmVfa2V5KHN0cnVjdCBncmVfaGRyICpncmVoKQotewotCWlmICghZ3JlaC0+a2V5KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZ3JlaC0+Y3N1bSB8fCBncmVoLT5yb3V0aW5nKQotCQlyZXR1cm4gKF9fYmUzMiAqKSAoZ3JlaCtzaXplb2YoKmdyZWgpKzQpOwotCXJldHVybiAoX19iZTMyICopIChncmVoK3NpemVvZigqZ3JlaCkpOwotfQotCi0vKiBnZXQgcG9pbnRlciBvdCBncmUgY3N1bSwgaWYgcHJlc2VudCAqLwotc3RhdGljIGlubGluZSBfX3N1bTE2ICpncmVfY3N1bShzdHJ1Y3QgZ3JlX2hkciAqZ3JlaCkKLXsKLQlpZiAoIWdyZWgtPmNzdW0pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoX19zdW0xNiAqKSAoZ3JlaCtzaXplb2YoKmdyZWgpKTsKLX0KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc2Yjg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBIZWFkZXIgZm9yIHVzZSBpbiBkZWZpbmluZyBhIGdpdmVuIHByb3RvY29sIGZvciBjb25uZWN0aW9uIHRyYWNraW5nLiAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1BST1RPQ09MX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19QUk9UT0NPTF9ICi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLQotc3RydWN0IHNlcV9maWxlOwotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sCi17Ci0JLyogUHJvdG9jb2wgbnVtYmVyLiAqLwotCXVfaW50OF90IHByb3RvOwotCi0JLyogUHJvdG9jb2wgbmFtZSAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkvKiBUcnkgdG8gZmlsbCBpbiB0aGUgdGhpcmQgYXJnOiBkYXRhb2ZmIGlzIG9mZnNldCBwYXN0IElQCi0gICAgICAgICAgIGhkci4gIFJldHVybiB0cnVlIGlmIHBvc3NpYmxlLiAqLwotCWludCAoKnBrdF90b190dXBsZSkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi0JLyogSW52ZXJ0IHRoZSBwZXItcHJvdG8gcGFydCBvZiB0aGUgdHVwbGU6IGllLiB0dXJuIHhtaXQgaW50byByZXBseS4KLQkgKiBTb21lIHBhY2tldHMgY2FuJ3QgYmUgaW52ZXJ0ZWQ6IHJldHVybiAwIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlpbnQgKCppbnZlcnRfdHVwbGUpKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZyk7Ci0KLQkvKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gUmV0dXJuIGxpa2Ugc2VxXyogKi8KLQlpbnQgKCpwcmludF90dXBsZSkoc3RydWN0IHNlcV9maWxlICosCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICopOwotCi0JLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KLQlpbnQgKCpwcmludF9jb25udHJhY2spKHN0cnVjdCBzZXFfZmlsZSAqLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICopOwotCi0JLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotCWludCAoKnBhY2tldCkoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbyk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kOwotCSAqIHJldHVybnMgVFJVRSBpZiBpdCdzIE9LLiAgSWYgc28sIHBhY2tldCgpIGNhbGxlZCBuZXh0LiAqLwotCWludCAoKm5ldykoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotCS8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGlzIGRlc3Ryb3llZCAqLwotCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spOwotCi0JaW50ICgqZXJyb3IpKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKLQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSk7Ci0KLQkvKiBjb252ZXJ0IHByb3RvaW5mbyB0byBuZm5ldGluayBhdHRyaWJ1dGVzICovCi0JaW50ICgqdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZhdHRyICpuZmEsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JLyogY29udmVydCBuZm5ldGxpbmsgYXR0cmlidXRlcyB0byBwcm90b2luZm8gKi8KLQlpbnQgKCpmcm9tX25mYXR0cikoc3RydWN0IG5mYXR0ciAqdGJbXSwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JaW50ICgqdHVwbGVfdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpOwotCWludCAoKm5mYXR0cl90b190dXBsZSkoc3RydWN0IG5mYXR0ciAqdGJbXSwKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0KTsKLQotCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLS8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KLWV4dGVybiBpbnQgaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKTsKLS8qIEV4aXN0aW5nIGJ1aWx0LWluIHByb3RvY29scyAqLwotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX3RjcDsKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19wcm90b2NvbF91ZHA7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfaWNtcDsKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOwotZXh0ZXJuIGludCBpcF9jb25udHJhY2tfcHJvdG9jb2xfdGNwX2luaXQodm9pZCk7Ci0KLS8qIExvZyBpbnZhbGlkIHBhY2tldHMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfbG9nX2ludmFsaWQ7Ci0KLWV4dGVybiBpbnQgaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICopOwotZXh0ZXJuIGludCBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKik7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgREVCVUdfSU5WQUxJRF9QQUNLRVRTCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSBcCi0JKGlwX2N0X2xvZ19pbnZhbGlkID09IChwcm90bykgfHwgaXBfY3RfbG9nX2ludmFsaWQgPT0gSVBQUk9UT19SQVcpCi0jZWxzZQotI2RlZmluZSBMT0dfSU5WQUxJRChwcm90bykgXAotCSgoaXBfY3RfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fCBpcF9jdF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykgXAotCSAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSAwCi0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0jZW5kaWYgLypfSVBfQ09OTlRSQUNLX1BST1RPQ09MX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk5YTA0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3NjdHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1NDVFBfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX1NDVFBfSAotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmg+Ci0KLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX1NDVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNmM2NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNpZm5kZWYgX19JUF9DT05OVFJBQ0tfU0lQX0hfXwotI2RlZmluZSBfX0lQX0NPTk5UUkFDS19TSVBfSF9fCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIFNJUF9QT1JUCTUwNjAKLSNkZWZpbmUgU0lQX1RJTUVPVVQJMzYwMAotCi1lbnVtIHNpcF9oZWFkZXJfcG9zIHsKLQlQT1NfUkVHX1JFUV9VUkksCi0JUE9TX1JFUV9VUkksCi0JUE9TX0ZST00sCi0JUE9TX1RPLAotCVBPU19WSUEsCi0JUE9TX0NPTlRBQ1QsCi0JUE9TX0NPTlRFTlQsCi0JUE9TX01FRElBLAotCVBPU19PV05FUiwKLQlQT1NfQ09OTkVDVElPTiwKLQlQT1NfU0RQX0hFQURFUiwKLX07Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgKCppcF9uYXRfc2lwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cik7Ci1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X3NkcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKTsKLQotZXh0ZXJuIGludCBjdF9zaXBfZ2V0X2luZm8oY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCi0JCQkgICB1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAotCQkJICAgdW5zaWduZWQgaW50ICptYXRjaGxlbiwKLQkJCSAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKTsKLWV4dGVybiBpbnQgY3Rfc2lwX2xubGVuKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmxpbWl0KTsKLWV4dGVybiBjb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCi0JCQkJIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAotCQkJCSBpbnQgY2FzZV9zZW5zaXRpdmUpOwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfX0lQX0NPTk5UUkFDS19TSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZiOGZiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfVENQX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19UQ1BfSAotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KLQotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfVENQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwNGZjMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190ZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIF9JUF9DVF9URlRQCi0jZGVmaW5lIF9JUF9DVF9URlRQCi0KLSNkZWZpbmUgVEZUUF9QT1JUIDY5Ci0KLXN0cnVjdCB0ZnRwaGRyIHsKLQlfX2JlMTYgb3Bjb2RlOwotfTsKLQotI2RlZmluZSBURlRQX09QQ09ERV9SRUFECTEKLSNkZWZpbmUgVEZUUF9PUENPREVfV1JJVEUJMgotI2RlZmluZSBURlRQX09QQ09ERV9EQVRBCTMKLSNkZWZpbmUgVEZUUF9PUENPREVfQUNLCQk0Ci0jZGVmaW5lIFRGVFBfT1BDT0RFX0VSUk9SCTUKLQotZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF90ZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZW5kaWYgLyogX0lQX0NUX1RGVFAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI4YmRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1RVUExFX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19UVVBMRV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmg+Ci0KLS8qIEEgYHR1cGxlJyBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiB0byB1bmlxdWVseQotICBpZGVudGlmeSBhIGNvbm5lY3Rpb24uICBpZS4gaWYgdHdvIHBhY2tldHMgaGF2ZSB0aGUgc2FtZSB0dXBsZSwgdGhleQotICBhcmUgaW4gdGhlIHNhbWUgY29ubmVjdGlvbjsgaWYgbm90LCB0aGV5IGFyZSBub3QuCi0KLSAgV2UgZGl2aWRlIHRoZSBzdHJ1Y3R1cmUgYWxvbmcgIm1hbmlwdWxhdGFibGUiIGFuZAotICAibm9uLW1hbmlwdWxhdGFibGUiIGxpbmVzLCBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIE5BVCBjb2RlLgotKi8KLQotLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZTogYWx3YXlzIGluCi0gICBuZXR3b3JrIG9yZGVyISAqLwotdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvCi17Ci0JLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCXVfaW50MTZfdCBhbGw7Ci0KLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHRjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHVkcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgaWQ7Ci0JfSBpY21wOwotCXN0cnVjdCB7Ci0JCV9fYmUxNiBwb3J0OwotCX0gc2N0cDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYga2V5OwkvKiBrZXkgaXMgMzJiaXQsIHBwdHAgb25seSB1c2VzIDE2ICovCi0JfSBncmU7Ci19OwotCi0vKiBUaGUgbWFuaXB1bGFibGUgcGFydCBvZiB0aGUgdHVwbGUuICovCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX21hbmlwCi17Ci0JX19iZTMyIGlwOwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byB1OwotfTsKLQotLyogVGhpcyBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggYSBjb25uZWN0aW9uLiAqLwotc3RydWN0IGlwX2Nvbm50cmFja190dXBsZQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfbWFuaXAgc3JjOwotCi0JLyogVGhlc2UgYXJlIHRoZSBwYXJ0cyBvZiB0aGUgdHVwbGUgd2hpY2ggYXJlIGZpeGVkLiAqLwotCXN0cnVjdCB7Ci0JCV9fYmUzMiBpcDsKLQkJdW5pb24gewotCQkJLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCQkJdV9pbnQxNl90IGFsbDsKLQotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gdGNwOwotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gdWRwOwotCQkJc3RydWN0IHsKLQkJCQl1X2ludDhfdCB0eXBlLCBjb2RlOwotCQkJfSBpY21wOwotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gc2N0cDsKLQkJCXN0cnVjdCB7Ci0JCQkJX19iZTE2IGtleTsJLyoga2V5IGlzIDMyYml0LCAKLQkJCQkJCSAqIHBwdHAgb25seSB1c2VzIDE2ICovCi0JCQl9IGdyZTsKLQkJfSB1OwotCi0JCS8qIFRoZSBwcm90b2NvbC4gKi8KLQkJdV9pbnQ4X3QgcHJvdG9udW07Ci0KLQkJLyogVGhlIGRpcmVjdGlvbiAoZm9yIHR1cGxlaGFzaCkgKi8KLQkJdV9pbnQ4X3QgZGlyOwotCX0gZHN0OwotfTsKLQotLyogVGhpcyBpcyBvcHRpbWl6ZWQgb3Bwb3NlZCB0byBhIG1lbXNldCBvZiB0aGUgd2hvbGUgc3RydWN0dXJlLiAgRXZlcnl0aGluZyB3ZQotICogcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlICBzb3VyY2UvZGVzdGluYXRpb24gdW5pb25zICovCi0jZGVmaW5lIElQX0NUX1RVUExFX1VfQkxBTksodHVwbGUpIAkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCSh0dXBsZSktPnNyYy51LmFsbCA9IDA7CQkJCVwKLQkJKHR1cGxlKS0+ZHN0LnUuYWxsID0gMDsJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgRFVNUF9UVVBMRSh0cCkJCQkJCQlcCi1ERUJVR1AoInR1cGxlICVwOiAldSAldS4ldS4ldS4ldTolaHUgLT4gJXUuJXUuJXUuJXU6JWh1XG4iLAlcCi0gICAgICAgKHRwKSwgKHRwKS0+ZHN0LnByb3RvbnVtLAkJCQlcCi0gICAgICAgTklQUVVBRCgodHApLT5zcmMuaXApLCBudG9ocygodHApLT5zcmMudS5hbGwpLAkJXAotICAgICAgIE5JUFFVQUQoKHRwKS0+ZHN0LmlwKSwgbnRvaHMoKHRwKS0+ZHN0LnUuYWxsKSkKLQotLyogSWYgd2UncmUgdGhlIGZpcnN0IHR1cGxlLCBpdCdzIHRoZSBvcmlnaW5hbCBkaXIuICovCi0jZGVmaW5lIERJUkVDVElPTihoKSAoKGVudW0gaXBfY29ubnRyYWNrX2RpcikoaCktPnR1cGxlLmRzdC5kaXIpCi0KLS8qIENvbm5lY3Rpb25zIGhhdmUgdHdvIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGU6IG9uZSBmb3IgZWFjaCB3YXkgKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci19OwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9zcmNfZXF1YWwoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDEsCi0JCQkJICAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0MikKLXsKLQlyZXR1cm4gdDEtPnNyYy5pcCA9PSB0Mi0+c3JjLmlwCi0JCSYmIHQxLT5zcmMudS5hbGwgPT0gdDItPnNyYy51LmFsbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXBfY3RfdHVwbGVfZHN0X2VxdWFsKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQxLAotCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDIpCi17Ci0JcmV0dXJuIHQxLT5kc3QuaXAgPT0gdDItPmRzdC5pcAotCQkmJiB0MS0+ZHN0LnUuYWxsID09IHQyLT5kc3QudS5hbGwKLQkJJiYgdDEtPmRzdC5wcm90b251bSA9PSB0Mi0+ZHN0LnByb3RvbnVtOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9lcXVhbChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0MSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDIpCi17Ci0JcmV0dXJuIGlwX2N0X3R1cGxlX3NyY19lcXVhbCh0MSwgdDIpICYmIGlwX2N0X3R1cGxlX2RzdF9lcXVhbCh0MSwgdDIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9tYXNrX2NtcChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWFzaykKLXsKLQlyZXR1cm4gISgoKHQtPnNyYy5pcCBeIHR1cGxlLT5zcmMuaXApICYgbWFzay0+c3JjLmlwKQotCQkgfHwgKCh0LT5kc3QuaXAgXiB0dXBsZS0+ZHN0LmlwKSAmIG1hc2stPmRzdC5pcCkKLQkJIHx8ICgodC0+c3JjLnUuYWxsIF4gdHVwbGUtPnNyYy51LmFsbCkgJiBtYXNrLT5zcmMudS5hbGwpCi0JCSB8fCAoKHQtPmRzdC51LmFsbCBeIHR1cGxlLT5kc3QudS5hbGwpICYgbWFzay0+ZHN0LnUuYWxsKQotCQkgfHwgKCh0LT5kc3QucHJvdG9udW0gXiB0dXBsZS0+ZHN0LnByb3RvbnVtKQotCQkgICAgICYgbWFzay0+ZHN0LnByb3RvbnVtKSk7Ci19Ci0KLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX1RVUExFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNhODlhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jaWZuZGVmIF9JUF9OQVRfSAotI2RlZmluZSBfSVBfTkFUX0gKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oPgotCi0jZGVmaW5lIElQX05BVF9NQVBQSU5HX1RZUEVfTUFYX05BTUVMRU4gMTYKLQotZW51bSBpcF9uYXRfbWFuaXBfdHlwZQotewotCUlQX05BVF9NQU5JUF9TUkMsCi0JSVBfTkFUX01BTklQX0RTVAotfTsKLQotLyogU1JDIG1hbmlwIG9jY3VycyBQT1NUX1JPVVRJTkcgb3IgTE9DQUxfSU4gKi8KLSNkZWZpbmUgSE9PSzJNQU5JUChob29rbnVtKSAoKGhvb2tudW0pICE9IE5GX0lQX1BPU1RfUk9VVElORyAmJiAoaG9va251bSkgIT0gTkZfSVBfTE9DQUxfSU4pCi0KLSNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQotI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0IC8qIGFkZCByYW5kb21uZXNzIHRvICJwb3J0IiBzZWxlY3Rpb24gKi8KLQotLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCi1zdHJ1Y3QgaXBfbmF0X3NlcSB7Ci0JLyogcG9zaXRpb24gb2YgdGhlIGxhc3QgVENQIHNlcXVlbmNlIG51bWJlciAKLQkgKiBtb2RpZmljYXRpb24gKGlmIGFueSkgKi8KLQl1X2ludDMyX3QgY29ycmVjdGlvbl9wb3M7Ci0JLyogc2VxdWVuY2UgbnVtYmVyIG9mZnNldCBiZWZvcmUgYW5kIGFmdGVyIGxhc3QgbW9kaWZpY2F0aW9uICovCi0JaW50MTZfdCBvZmZzZXRfYmVmb3JlLCBvZmZzZXRfYWZ0ZXI7Ci19OwotCi0vKiBTaW5nbGUgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4gKi8KLXN0cnVjdCBpcF9uYXRfcmFuZ2UKLXsKLQkvKiBTZXQgdG8gT1Igb2YgZmxhZ3MgYWJvdmUuICovCi0JdW5zaWduZWQgaW50IGZsYWdzOwotCi0JLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLwotCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKLQotCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlciAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byBtaW4sIG1heDsKLX07Ci0KLS8qIEZvciBiYWNrd2FyZHMgY29tcGF0OiBkb24ndCB1c2UgaW4gbW9kZXJuIGNvZGUuICovCi1zdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdAotewotCXVuc2lnbmVkIGludCByYW5nZXNpemU7IC8qIE11c3QgYmUgMS4gKi8KLQotCS8qIGhhbmdzIG9mZiBlbmQuICovCi0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZVsxXTsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0vKiBQcm90ZWN0cyBOQVQgaGFzaCB0YWJsZXMsIGFuZCBOQVQtcHJpdmF0ZSBwYXJ0IG9mIGNvbm50cmFja3MuICovCi1leHRlcm4gcndsb2NrX3QgaXBfbmF0X2xvY2s7Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgZW1iZWRkZWQgaW4gdGhlIGNvbm50cmFjayBzdHJ1Y3R1cmUuICovCi1zdHJ1Y3QgaXBfbmF0X2luZm8KLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ5c291cmNlOwotCXN0cnVjdCBpcF9uYXRfc2VxIHNlcVtJUF9DVF9ESVJfTUFYXTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2s7Ci0KLS8qIFNldCB1cCB0aGUgaW5mbyBzdHJ1Y3R1cmUgdG8gbWFwIGludG8gdGhpcyByYW5nZS4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfbmF0X3NldHVwX2luZm8oc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKLQotLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSovCi1leHRlcm4gaW50IGlwX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjayk7Ci0KLSNlbHNlICAvKiAhX19LRVJORUxfXzogaXB0YWJsZXMgd2FudHMgdGhpcyB0byBjb21waWxlLiAqLwotI2RlZmluZSBpcF9uYXRfbXVsdGlfcmFuZ2UgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdAotI2VuZGlmIC8qX19LRVJORUxfXyovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NjZmOWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2lmbmRlZiBfSVBfTkFUX0NPUkVfSAotI2RlZmluZSBfSVBfTkFUX0NPUkVfSAotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLQotLyogVGhpcyBoZWFkZXIgdXNlZCB0byBzaGFyZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUgc3RhbmRhbG9uZQotICAgTkFUIG1vZHVsZSwgYW5kIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyJ3MgdXNlIG9mIE5BVCBmb3IgbWFzcXVlcmFkaW5nLiAqLwotCi1leHRlcm4gdW5zaWduZWQgaW50IGlwX25hdF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjb25udHJhY2tpbmZvLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYik7Ci0KLWV4dGVybiBpbnQgaXBfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkJIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCQkgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKLSNlbmRpZiAvKiBfSVBfTkFUX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5Y2IxMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSNpZm5kZWYgX0lQX05BVF9IRUxQRVJfSAotI2RlZmluZSBfSVBfTkFUX0hFTFBFUl9ICi0vKiBOQVQgcHJvdG9jb2wgaGVscGVyIHJvdXRpbmVzLiAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLXN0cnVjdCBza19idWZmOwotCi0vKiBUaGVzZSByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLWV4dGVybiBpbnQgaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHN0cnVjdCBza19idWZmICoqc2tiLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKLQkJCQljb25zdCBjaGFyICpyZXBfYnVmZmVyLAotCQkJCXVuc2lnbmVkIGludCByZXBfbGVuKTsKLWV4dGVybiBpbnQgaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHN0cnVjdCBza19idWZmICoqc2tiLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKLQkJCQljb25zdCBjaGFyICpyZXBfYnVmZmVyLAotCQkJCXVuc2lnbmVkIGludCByZXBfbGVuKTsKLWV4dGVybiBpbnQgaXBfbmF0X3NlcV9hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCAKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbyk7Ci0KLS8qIFNldHVwIE5BVCBvbiB0aGlzIGV4cGVjdGVkIGNvbm50cmFjayBzbyBpdCBmb2xsb3dzIG1hc3RlciwgYnV0IGdvZXMKLSAqIHRvIHBvcnQgY3QtPm1hc3Rlci0+c2F2ZWRfcHJvdG8uICovCi1leHRlcm4gdm9pZCBpcF9uYXRfZm9sbG93X21hc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjY4YmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHB0cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogUFBUUCBjb25zdGFudHMgYW5kIHN0cnVjdHMgKi8KLSNpZm5kZWYgX05BVF9QUFRQX0gKLSNkZWZpbmUgX05BVF9QUFRQX0gKLQotLyogY29ubnRyYWNrIHByaXZhdGUgZGF0YSAqLwotc3RydWN0IGlwX25hdF9wcHRwIHsKLQlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkvKiBOQVQnZWQgUE5TIGNhbGwgaWQgKi8KLQlfX2JlMTYgcGFjX2NhbGxfaWQ7CQkvKiBOQVQnZWQgUEFDIGNhbGwgaWQgKi8KLX07Ci0KLSNlbmRpZiAvKiBfTkFUX1BQVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMmE0MzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIEhlYWRlciBmb3IgdXNlIGluIGRlZmluaW5nIGEgZ2l2ZW4gcHJvdG9jb2wuICovCi0jaWZuZGVmIF9JUF9OQVRfUFJPVE9DT0xfSAotI2RlZmluZSBfSVBfTkFUX1BST1RPQ09MX0gKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLQotc3RydWN0IGlwaGRyOwotc3RydWN0IGlwX25hdF9yYW5nZTsKLQotc3RydWN0IGlwX25hdF9wcm90b2NvbAotewotCS8qIFByb3RvY29sIG5hbWUgKi8KLQljb25zdCBjaGFyICpuYW1lOwotCi0JLyogUHJvdG9jb2wgbnVtYmVyLiAqLwotCXVuc2lnbmVkIGludCBwcm90b251bTsKLQotCXN0cnVjdCBtb2R1bGUgKm1lOwotCi0JLyogVHJhbnNsYXRlIGEgcGFja2V0IHRvIHRoZSB0YXJnZXQgYWNjb3JkaW5nIHRvIG1hbmlwIHR5cGUuCi0JICAgUmV0dXJuIHRydWUgaWYgc3VjY2VlZGVkLiAqLwotCWludCAoKm1hbmlwX3BrdCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSk7Ci0KLQkvKiBJcyB0aGUgbWFuaXBhYmxlIHBhcnQgb2YgdGhlIHR1cGxlIGJldHdlZW4gbWluIGFuZCBtYXggaW5jbD8gKi8KLQlpbnQgKCppbl9yYW5nZSkoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJCWNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAotCQkJY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpOwotCi0JLyogQWx0ZXIgdGhlIHBlci1wcm90byBwYXJ0IG9mIHRoZSB0dXBsZSAoZGVwZW5kaW5nIG9uCi0JICAgbWFuaXB0eXBlKSwgdG8gZ2l2ZSBhIHVuaXF1ZSB0dXBsZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaWYKLQkgICBwb3NzaWJsZTsgcmV0dXJuIGZhbHNlIGlmIG5vdC4gIFBlci1wcm90b2NvbCBwYXJ0IG9mIHR1cGxlCi0JICAgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGluY29taW5nIHBhY2tldC4gKi8KLQlpbnQgKCp1bmlxdWVfdHVwbGUpKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkJICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayk7Ci0KLQlpbnQgKCpyYW5nZV90b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpOwotCi0JaW50ICgqbmZhdHRyX3RvX3JhbmdlKShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJICAgICAgIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLX07Ci0KLS8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KLWV4dGVybiBpbnQgaXBfbmF0X3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLWV4dGVybiB2b2lkIGlwX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKmlwX25hdF9wcm90b19maW5kX2dldCh1X2ludDhfdCBwcm90b2NvbCk7Ci1leHRlcm4gdm9pZCBpcF9uYXRfcHJvdG9fcHV0KHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLQotLyogQnVpbHQtaW4gcHJvdG9jb2xzLiAqLwotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX3RjcDsKLWV4dGVybiBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF9wcm90b2NvbF91ZHA7Ci1leHRlcm4gc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfaWNtcDsKLWV4dGVybiBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF91bmtub3duX3Byb3RvY29sOwotCi1leHRlcm4gaW50IGluaXRfcHJvdG9jb2xzKHZvaWQpIF9faW5pdDsKLWV4dGVybiB2b2lkIGNsZWFudXBfcHJvdG9jb2xzKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKmZpbmRfbmF0X3Byb3RvKHVfaW50MTZfdCBwcm90b251bSk7Ci0KLWV4dGVybiBpbnQgaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLWV4dGVybiBpbnQgaXBfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlKHN0cnVjdCBuZmF0dHIgKnRiW10sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLQotI2VuZGlmIC8qX0lQX05BVF9QUk9UT19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiOTU1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaWZuZGVmIF9JUF9OQVRfUlVMRV9ICi0jZGVmaW5lIF9JUF9OQVRfUlVMRV9ICi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLWV4dGVybiBpbnQgaXBfbmF0X3J1bGVfaW5pdCh2b2lkKSBfX2luaXQ7Ci1leHRlcm4gdm9pZCBpcF9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIGludCBpcF9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8pOwotCi1leHRlcm4gdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8sCi0JCSAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludAotYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOwotI2VuZGlmCi0jZW5kaWYgLyogX0lQX05BVF9SVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaAppbmRleCBjYzRjMGIyLi5iZTZlNjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCkBAIC0xMyw3ICsxMyw3IEBACiAJdV9pbnQzMl90ICppcGFycmF5OwogCiAJLyogaGFuZ3Mgb2ZmIGVuZC4gKi8KLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlW0lQVF9TQU1FX01BWF9SQU5HRV07CisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVtJUFRfU0FNRV9NQVhfUkFOR0VdOwogfTsKIAogI2VuZGlmIC8qX0lQVF9TQU1FX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCAyYTIwZjQ4Li5mNDE2ODhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMTM4LDYgKzEzOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgbmxtc2doZHIgKm5sbXNnX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworfQorCiBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMKIHsKIAlzdHJ1Y3QgdWNyZWQJCWNyZWRzOwkJLyogU2tiIGNyZWRlbnRpYWxzCSovCkBAIC0xNTIsNyArMTU3LDEwIEBACiAjZGVmaW5lIE5FVExJTktfQ1JFRFMoc2tiKQkoJk5FVExJTktfQ0IoKHNrYikpLmNyZWRzKQogCiAKLWV4dGVybiBzdHJ1Y3Qgc29jayAqbmV0bGlua19rZXJuZWxfY3JlYXRlKGludCB1bml0LCB1bnNpZ25lZCBpbnQgZ3JvdXBzLCB2b2lkICgqaW5wdXQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiksIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CitleHRlcm4gc3RydWN0IHNvY2sgKm5ldGxpbmtfa2VybmVsX2NyZWF0ZShpbnQgdW5pdCwgdW5zaWduZWQgaW50IGdyb3VwcywKKwkJCQkJICB2b2lkICgqaW5wdXQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiksCisJCQkJCSAgc3RydWN0IG11dGV4ICpjYl9tdXRleCwKKwkJCQkJICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwogZXh0ZXJuIHZvaWQgbmV0bGlua19hY2soc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCBlcnIpOwogZXh0ZXJuIGludCBuZXRsaW5rX2hhc19saXN0ZW5lcnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXApOwogZXh0ZXJuIGludCBuZXRsaW5rX3VuaWNhc3Qoc3RydWN0IHNvY2sgKnNzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MzIgcGlkLCBpbnQgbm9uYmxvY2spOwpAQCAtMTcxLDkgKzE3OSwxNiBAQAogCiAvKgogICoJc2tiIHNob3VsZCBmaXQgb25lIHBhZ2UuIFRoaXMgY2hvaWNlIGlzIGdvb2QgZm9yIGhlYWRlcmxlc3MgbWFsbG9jLgorICoJQnV0IHdlIHNob3VsZCBsaW1pdCB0byA4SyBzbyB0aGF0IHVzZXJzcGFjZSBkb2VzIG5vdCBoYXZlIHRvCisgKgl1c2UgZW5vcm1vdXMgYnVmZmVyIHNpemVzIG9uIHJlY3Ztc2coKSBjYWxscyBqdXN0IHRvIGF2b2lkCisgKglNU0dfVFJVTkMgd2hlbiBQQUdFX1NJWkUgaXMgdmVyeSBsYXJnZS4KICAqLwotI2RlZmluZSBOTE1TR19HT09ET1JERVIgMAotI2RlZmluZSBOTE1TR19HT09EU0laRSAoU0tCX01BWF9PUkRFUigwLCBOTE1TR19HT09ET1JERVIpKQorI2lmIFBBR0VfU0laRSA8IDgxOTJVTAorI2RlZmluZSBOTE1TR19HT09EU0laRQlTS0JfV0lUSF9PVkVSSEVBRChQQUdFX1NJWkUpCisjZWxzZQorI2RlZmluZSBOTE1TR19HT09EU0laRQlTS0JfV0lUSF9PVkVSSEVBRCg4MTkyVUwpCisjZW5kaWYKKwogI2RlZmluZSBOTE1TR19ERUZBVUxUX1NJWkUgKE5MTVNHX0dPT0RTSVpFIC0gTkxNU0dfSERSTEVOKQogCiAKQEAgLTIxNywxOCArMjMyLDYgQEAKICNkZWZpbmUgTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIHR5cGUsIGxlbikgXAogCU5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCB0eXBlLCBsZW4sIDApCiAKLSNkZWZpbmUgTkxNU0dfTkVXX0FOU1dFUihza2IsIGNiLCB0eXBlLCBsZW4sIGZsYWdzKSBcCi0JTkxNU0dfTkVXKHNrYiwgTkVUTElOS19DQigoY2IpLT5za2IpLnBpZCwgXAotCQkgIChjYiktPm5saC0+bmxtc2dfc2VxLCB0eXBlLCBsZW4sIGZsYWdzKQotCi0jZGVmaW5lIE5MTVNHX0VORChza2IsIG5saCkgXAotKHsJKG5saCktPm5sbXNnX2xlbiA9IChza2IpLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgKG5saCk7IFwKLQkoc2tiKS0+bGVuOyB9KQotCi0jZGVmaW5lIE5MTVNHX0NBTkNFTChza2IsIG5saCkgXAotKHsJc2tiX3RyaW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSAobmxoKSAtIChza2IpLT5kYXRhKTsgXAotCS0xOyB9KQotCiBleHRlcm4gaW50IG5ldGxpbmtfZHVtcF9zdGFydChzdHJ1Y3Qgc29jayAqc3NrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgICBpbnQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayopLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTMwYmEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfX0xJTlVYX05MODAyMTFfSAorI2RlZmluZSBfX0xJTlVYX05MODAyMTFfSAorLyoKKyAqIDgwMi4xMSBuZXRsaW5rIGludGVyZmFjZSBwdWJsaWMgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqLworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZnR5cGUgLSAodmlydHVhbCkgaW50ZXJmYWNlIHR5cGVzCisgKiBATkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6IHVuc3BlY2lmaWVkIHR5cGUsIGRyaXZlciBkZWNpZGVzCisgKiBATkw4MDIxMV9JRlRZUEVfQURIT0M6IGluZGVwZW5kZW50IEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOiBtYW5hZ2VkIEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9BUDogYWNjZXNzIHBvaW50CisgKiBATkw4MDIxMV9JRlRZUEVfQVBfVkxBTjogVkxBTiBpbnRlcmZhY2UgZm9yIGFjY2VzcyBwb2ludHMKKyAqIEBOTDgwMjExX0lGVFlQRV9XRFM6IHdpcmVsZXNzIGRpc3RyaWJ1dGlvbiBpbnRlcmZhY2UKKyAqIEBOTDgwMjExX0lGVFlQRV9NT05JVE9SOiBtb25pdG9yIGludGVyZmFjZSByZWNlaXZpbmcgYWxsIGZyYW1lcworICogQF9fTkw4MDIxMV9JRlRZUEVfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggdGhlIE5MODAyMTFfQVRUUl9JRlRZUEUKKyAqIHRvIHNldCB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UuCisgKgorICovCitlbnVtIG5sODAyMTFfaWZ0eXBlIHsKKwlOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCwKKwlOTDgwMjExX0lGVFlQRV9BREhPQywKKwlOTDgwMjExX0lGVFlQRV9TVEFUSU9OLAorCU5MODAyMTFfSUZUWVBFX0FQLAorCU5MODAyMTFfSUZUWVBFX0FQX1ZMQU4sCisJTkw4MDIxMV9JRlRZUEVfV0RTLAorCU5MODAyMTFfSUZUWVBFX01PTklUT1IsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1QKK307CisjZGVmaW5lIE5MODAyMTFfSUZUWVBFX01BWCAoX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUIC0gMSkKKworI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IDljZDBkMGUuLjk2MzI2NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXRQYWdlVXB0b2RhdGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFBHX3VwdG9kYXRlLCAmcGFnZS0+ZmxhZ3MpKQotCQlwYWdlX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHBhZ2UpOworCQlwYWdlX2NsZWFyX2RpcnR5KHBhZ2UpOwogfQogI2Vsc2UKICNkZWZpbmUgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpCXNldF9iaXQoUEdfdXB0b2RhdGUsICYocGFnZSktPmZsYWdzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggNGE2MjllYS4uMWZhZTMwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC01NzQsMTMgKzU3NCw2IEBACiAjZGVmaW5lIHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIG1heCwgcnRhKSBcCiAJcnRhdHRyX3BhcnNlKCh0YiksIChtYXgpLCBSVEFfREFUQSgocnRhKSksIFJUQV9QQVlMT0FEKChydGEpKSkKIAotc3RydWN0IHJ0bmV0bGlua19saW5rCi17Ci0JaW50ICgqZG9pdCkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5sbXNnaGRyKiwgdm9pZCAqYXR0cik7Ci0JaW50ICgqZHVtcGl0KShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBydG5ldGxpbmtfbGluayAqIHJ0bmV0bGlua19saW5rc1tOUFJPVE9dOwogZXh0ZXJuIGludCBydG5ldGxpbmtfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgZ3JvdXAsIGludCBlY2hvKTsKIGV4dGVybiBpbnQgcnRubF91bmljYXN0KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQpOwogZXh0ZXJuIGludCBydG5sX25vdGlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgZ3JvdXAsCkBAIC02MDUsNyArNTk4LDcgQEAKIAogI2RlZmluZSBSVEFfUFVUX05PSERSKHNrYiwgYXR0cmxlbiwgZGF0YSkgXAogKHsJUlRBX0FQUEVORChza2IsIFJUQV9BTElHTihhdHRybGVuKSwgZGF0YSk7IFwKLQltZW1zZXQoc2tiLT50YWlsIC0gKFJUQV9BTElHTihhdHRybGVuKSAtIGF0dHJsZW4pLCAwLCBcCisJbWVtc2V0KHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIChSVEFfQUxJR04oYXR0cmxlbikgLSBhdHRybGVuKSwgMCwgXAogCSAgICAgICBSVEFfQUxJR04oYXR0cmxlbikgLSBhdHRybGVuKTsgfSkKIAogI2RlZmluZSBSVEFfUFVUX1U4KHNrYiwgYXR0cnR5cGUsIHZhbHVlKSBcCkBAIC02MzcsMTIgKzYzMCwxMiBAQAogCVJUQV9QVVQoc2tiLCBhdHRydHlwZSwgMCwgTlVMTCk7CiAKICNkZWZpbmUgUlRBX05FU1Qoc2tiLCB0eXBlKSBcCi0oewlzdHJ1Y3QgcnRhdHRyICpfX3N0YXJ0ID0gKHN0cnVjdCBydGF0dHIgKikgKHNrYiktPnRhaWw7IFwKKyh7CXN0cnVjdCBydGF0dHIgKl9fc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsgXAogCVJUQV9QVVQoc2tiLCB0eXBlLCAwLCBOVUxMKTsgXAogCV9fc3RhcnQ7ICB9KQogCiAjZGVmaW5lIFJUQV9ORVNUX0VORChza2IsIHN0YXJ0KSBcCi0oewkoc3RhcnQpLT5ydGFfbGVuID0gKChza2IpLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgKHN0YXJ0KSk7IFwKKyh7CShzdGFydCktPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodW5zaWduZWQgY2hhciAqKShzdGFydCk7IFwKIAkoc2tiKS0+bGVuOyB9KQogCiAjZGVmaW5lIFJUQV9ORVNUX0NBTkNFTChza2IsIHN0YXJ0KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J4cnBjLmggYi9pbmNsdWRlL2xpbnV4L3J4cnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiODI2YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcnhycGMuaApAQCAtMCwwICsxLDYyIEBACisvKiBBRl9SWFJQQyBwYXJhbWV0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1JYUlBDX0gKKyNkZWZpbmUgX0xJTlVYX1JYUlBDX0gKKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisKKy8qCisgKiBSeFJQQyBzb2NrZXQgYWRkcmVzcworICovCitzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgeworCXNhX2ZhbWlseV90CXNyeF9mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5ICovCisJdTE2CQlzcnhfc2VydmljZTsJLyogc2VydmljZSBkZXNpcmVkICovCisJdTE2CQl0cmFuc3BvcnRfdHlwZTsJLyogdHlwZSBvZiB0cmFuc3BvcnQgc29ja2V0IChTT0NLX0RHUkFNKSAqLworCXUxNgkJdHJhbnNwb3J0X2xlbjsJLyogbGVuZ3RoIG9mIHRyYW5zcG9ydCBhZGRyZXNzICovCisJdW5pb24geworCQlzYV9mYW1pbHlfdCBmYW1pbHk7CQkvKiB0cmFuc3BvcnQgYWRkcmVzcyBmYW1pbHkgKi8KKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsJCS8qIElQdjQgdHJhbnNwb3J0IGFkZHJlc3MgKi8KKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OwkvKiBJUHY2IHRyYW5zcG9ydCBhZGRyZXNzICovCisJfSB0cmFuc3BvcnQ7Cit9OworCisvKgorICogUnhSUEMgc29ja2V0IG9wdGlvbnMKKyAqLworI2RlZmluZSBSWFJQQ19TRUNVUklUWV9LRVkJCTEJLyogW2NsbnRdIHNldCBjbGllbnQgc2VjdXJpdHkga2V5ICovCisjZGVmaW5lIFJYUlBDX1NFQ1VSSVRZX0tFWVJJTkcJCTIJLyogW3NydnJdIHNldCByaW5nIG9mIHNlcnZlciBzZWN1cml0eSBrZXlzICovCisjZGVmaW5lIFJYUlBDX0VYQ0xVU0lWRV9DT05ORUNUSU9OCTMJLyogW2NsbnRdIHVzZSBleGNsdXNpdmUgUnhSUEMgY29ubmVjdGlvbiAqLworI2RlZmluZSBSWFJQQ19NSU5fU0VDVVJJVFlfTEVWRUwJNAkvKiBtaW5pbXVtIHNlY3VyaXR5IGxldmVsICovCisKKy8qCisgKiBSeFJQQyBjb250cm9sIG1lc3NhZ2VzCisgKiAtIHRlcm1pbmFsIG1lc3NhZ2VzIG1lYW4gdGhhdCBhIHVzZXIgY2FsbCBJRCB0YWcgY2FuIGJlIHJlY3ljbGVkCisgKi8KKyNkZWZpbmUgUlhSUENfVVNFUl9DQUxMX0lECTEJLyogdXNlciBjYWxsIElEIHNwZWNpZmllciAqLworI2RlZmluZSBSWFJQQ19BQk9SVAkJMgkvKiBhYm9ydCByZXF1ZXN0IC8gbm90aWZpY2F0aW9uIFt0ZXJtaW5hbF0gKi8KKyNkZWZpbmUgUlhSUENfQUNLCQkzCS8qIFtTZXJ2ZXJdIFJQQyBvcCBmaW5hbCBBQ0sgcmVjZWl2ZWQgW3Rlcm1pbmFsXSAqLworI2RlZmluZSBSWFJQQ19ORVRfRVJST1IJCTUJLyogbmV0d29yayBlcnJvciByZWNlaXZlZCBbdGVybWluYWxdICovCisjZGVmaW5lIFJYUlBDX0JVU1kJCTYJLyogc2VydmVyIGJ1c3kgcmVjZWl2ZWQgW3Rlcm1pbmFsXSAqLworI2RlZmluZSBSWFJQQ19MT0NBTF9FUlJPUgk3CS8qIGxvY2FsIGVycm9yIGdlbmVyYXRlZCBbdGVybWluYWxdICovCisjZGVmaW5lIFJYUlBDX05FV19DQUxMCQk4CS8qIFtTZXJ2ZXJdIG5ldyBpbmNvbWluZyBjYWxsIG5vdGlmaWNhdGlvbiAqLworI2RlZmluZSBSWFJQQ19BQ0NFUFQJCTkJLyogW1NlcnZlcl0gYWNjZXB0IHJlcXVlc3QgKi8KKworLyoKKyAqIFJ4UlBDIHNlY3VyaXR5IGxldmVscworICovCisjZGVmaW5lIFJYUlBDX1NFQ1VSSVRZX1BMQUlOCTAJLyogcGxhaW4gc2VjdXJlLWNoZWNrc3VtbWVkIHBhY2tldHMgb25seSAqLworI2RlZmluZSBSWFJQQ19TRUNVUklUWV9BVVRICTEJLyogYXV0aGVudGljYXRlZCBwYWNrZXRzICovCisjZGVmaW5lIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQJMgkvKiBlbmNyeXB0ZWQgcGFja2V0cyAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3RwLmggYi9pbmNsdWRlL2xpbnV4L3NjdHAuaAppbmRleCBkNGY4NjU2Li5kNzBkZjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjdHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjdHAuaApAQCAtNjMsNiArNjMsMTUgQEAKIAlfX2JlMzIgY2hlY2tzdW07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2N0cGhkcl90OwogCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3RwaGRyICpzY3RwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHNjdHBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorI2VuZGlmCisKIC8qIFNlY3Rpb24gMy4yLiAgQ2h1bmsgRmllbGQgRGVzY3JpcHRpb25zLiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jaHVua2hkciB7CiAJX191OCB0eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZGxhX2ZyLmggYi9pbmNsdWRlL2xpbnV4L3NkbGFfZnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmYTc3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3NkbGFfZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogc2RsYV9mci5oCVNhbmdvbWEgZnJhbWUgcmVsYXkgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zLgotKgotKiBBdXRob3I6ICAgICAgIEdpZGVvbiBIYWNrICAJCi0qCQlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+IAkKLSoKLSogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAwIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KLSoKLSoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogT2N0IDA0LCAxOTk5ICBHaWRlb24gSGFjayAgICAgVXBkYXRlZCBBUEkgc3RydWN0dXJlcwotKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrIAlNb2RpZmljYXRpb25zIGZvciBTNTE0IHN1cHBvcnQKLSogT2N0IDEyLCAxOTk3CUphc3ByZWV0IFNpbmdoCUFkZGVkIEZSX1JFQURfRExDSV9JQl9NQVBQSU5HCi0qIEp1bCAyMSwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBGUlJFU19UT09fTE9ORyBhbmQgRlJSRVNfVE9PX01BTlkgdG8gCi0qCQkJCTB4MDUgYW5kIDB4MDYgcmVzcGVjdGl2ZWx5LgotKiBEZWMgMjMsIDE5OTYJR2VuZSBLb3ppbgl2Mi4wCi0qIEFwciAyOSwgMTk5NglHZW5lIEtvemluCXYxLjAgKG1lcmdlZCB2ZXJzaW9uIFM1MDIgJiBTNTA4IGRlZmluaXRpb25zKS4KLSogU2VwIDI2LCAxOTk1CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9TRExBX0ZSX0gKLSNkZWZpbmUJX1NETEFfRlJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE5vdGVzOgotICogLS0tLS0tCi0gKiAxLiBBbGwgc3RydWN0dXJlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgYnl0ZS1hbGluZWQuICAKLSAqCi0gKglDb21waWxlcglQbGF0Zm9ybQotICoJLS0tLS0tLS0JLS0tLS0tLS0KLSAqCUdOVSBDCQlMaW51eAotICovCi0KLSNpZm5kZWYJUEFDS0VECi0jICAgIGRlZmluZQlQQUNLRUQJX19hdHRyaWJ1dGVfXygocGFja2VkKSkKLSNlbmRpZgkvKiBQQUNLRUQgKi8KLQotLyogQWRhcHRlciBtZW1vcnkgbGF5b3V0ICovCi0jZGVmaW5lCUZSX01CX1ZFQ1RPUgkweEUwMDAJLyogbWFpbGJveCB3aW5kb3cgdmVjdG9yICovCi0jZGVmaW5lCUZSNTAyX1JYX1ZFQ1RPUgkweEEwMDAJLyogUzUwMiBkaXJlY3QgcmVjZWl2ZSB3aW5kb3cgdmVjdG9yICovCi0jZGVmaW5lCUZSNTAyX01CT1hfT0ZGUwkweEY2MAkvKiBTNTAyIG1haWxib3ggb2Zmc2V0ICovCi0jZGVmaW5lCUZSNTA4X01CT1hfT0ZGUwkwCS8qIFM1MDggbWFpbGJveCBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDJfRkxBR19PRkZTCTB4MUZGMAkvKiBTNTAyIHN0YXR1cyBmbGFncyBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDhfRkxBR19PRkZTCTB4MTAwMAkvKiBTNTA4IHN0YXR1cyBmbGFncyBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDJfUlhNQl9PRkZTCTB4OTAwCS8qIFM1MDIgZGlyZWN0IHJlY2VpdmUgbWFpbGJveCBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDhfVFhCQ19PRkZTCTB4MTEwMAkvKiBTNTA4IFR4IGJ1ZmZlciBpbmZvIG9mZnNldCAqLwotI2RlZmluZQlGUjUwOF9SWEJDX09GRlMJMHgxMTIwCS8qIFM1MDggUnggYnVmZmVyIGluZm8gb2Zmc2V0ICovCi0KLS8qIEltcG9ydGFudCBjb25zdGFudHMgKi8KLSNkZWZpbmUgRlI1MDJfTUFYX0RBVEEJNDA5NgkvKiBtYXhpbXVtIGRhdGEgYnVmZmVyIGxlbmd0aCAqLwotI2RlZmluZSBGUjUwOF9NQVhfREFUQQk0MDgwCS8qIG1heGltdW0gZGF0YSBidWZmZXIgbGVuZ3RoICovCi0jZGVmaW5lIE1JTl9MR1RIX0ZSX0RBVEFfQ0ZHICAgICAgICAgMzAwICAgICAvKiBtaW4gSW5mb3JtYXRpb24gZnJhbWUgbGVuZ3RoCi0oZm9yIGNvbmZpZ3VyYXRpb24gcHVycG9zZXMpICovCi0jZGVmaW5lIEZSX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FICAxNTM1NCAJLyogbWF4IEluZm9ybWF0aW9uIGZyYW1lIGxlbmd0aCAqLwotIAotI2RlZmluZSBISUdIRVNUX1ZBTElEX0RMQ0kJOTkxCi0KLS8qKioqKiogRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIHJlbGF5IGNvbW1hbmQgYmxvY2suCi0gKi8KLXR5cGVkZWYgc3RydWN0IGZyX2NtZAotewotCXVuc2lnbmVkIGNoYXIgIGNvbW1hbmQJUEFDS0VEOwkvKiBjb21tYW5kIGNvZGUgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGgJUEFDS0VEOwkvKiBsZW5ndGggb2YgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBjaGFyICByZXN1bHQJUEFDS0VEOwkvKiByZXR1cm4gY29kZSAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2kJUEFDS0VEOwkvKiBETENJIG51bWJlciAqLwotCXVuc2lnbmVkIGNoYXIgIGF0dHIJUEFDS0VEOwkvKiBGRUNOLCBCRUNOLCBERSBhbmQgQy9SIGJpdHMgKi8KLQl1bnNpZ25lZCBzaG9ydCByeGxvc3QxCVBBQ0tFRDsJLyogZnJhbWVzIGRpc2NhcmRlZCBhdCBpbnQuIGxldmVsICovCi0JdW5zaWduZWQgbG9uZyAgcnhsb3N0MglQQUNLRUQ7CS8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgYXBwLiBsZXZlbCAqLwotCXVuc2lnbmVkIGNoYXIgIHJzcnZbMl0JUEFDS0VEOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotfSBmcl9jbWRfdDsKLQotLyogJ2NvbW1hbmQnIGZpZWxkIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfV1JJVEUJCTB4MDEKLSNkZWZpbmUJRlJfUkVBRAkJCTB4MDIKLSNkZWZpbmUJRlJfSVNTVUVfSVNfRlJBTUUJMHgwMwotI2RlZmluZSBGUl9TRVRfQ09ORklHCQkweDEwCi0jZGVmaW5lIEZSX1JFQURfQ09ORklHCQkweDExCi0jZGVmaW5lIEZSX0NPTU1fRElTQUJMRQkJMHgxMgotI2RlZmluZSBGUl9DT01NX0VOQUJMRQkJMHgxMwotI2RlZmluZSBGUl9SRUFEX1NUQVRVUwkJMHgxNAotI2RlZmluZSBGUl9SRUFEX1NUQVRJU1RJQ1MJMHgxNQotI2RlZmluZSBGUl9GTFVTSF9TVEFUSVNUSUNTCTB4MTYKLSNkZWZpbmUJRlJfTElTVF9BQ1RJVkVfRExDSQkweDE3Ci0jZGVmaW5lIEZSX0ZMVVNIX0RBVEFfQlVGRkVSUwkweDE4Ci0jZGVmaW5lIEZSX1JFQURfQUREX0RMQ19TVEFUUwkweDE5Ci0jZGVmaW5lCUZSX0FERF9ETENJCQkweDIwCi0jZGVmaW5lCUZSX0RFTEVURV9ETENJCQkweDIxCi0jZGVmaW5lCUZSX0FDVElWQVRFX0RMQ0kJMHgyMgotI2RlZmluZQlGUl9ERUFDVElWQVRFX0RMQ0kJMHgyMgotI2RlZmluZSBGUl9SRUFEX01PREVNX1NUQVRVUwkweDMwCi0jZGVmaW5lIEZSX1NFVF9NT0RFTV9TVEFUVVMJMHgzMQotI2RlZmluZSBGUl9SRUFEX0VSUk9SX1NUQVRTCTB4MzIKLSNkZWZpbmUgRlJfRkxVU0hfRVJST1JfU1RBVFMJMHgzMwotI2RlZmluZSBGUl9SRUFEX0RMQ0lfSUJfTUFQUElORyAweDM0Ci0jZGVmaW5lIEZSX1JFQURfQ09ERV9WRVJTSU9OCTB4NDAKLSNkZWZpbmUJRlJfU0VUX0lOVFJfTU9ERQkweDUwCi0jZGVmaW5lCUZSX1JFQURfSU5UUl9NT0RFCTB4NTEKLSNkZWZpbmUgRlJfU0VUX1RSQUNFX0NPTkZJRwkweDYwCi0jZGVmaW5lIEZSX0ZUMV9TVEFUVVNfQ1RSTCAJMHg4MAotI2RlZmluZSBGUl9TRVRfRlQxX01PREUJCTB4ODEKLQotLyogU3BlY2lhbCBVRFAgZHJpdmVycyBtYW5hZ2VtZW50IGNvbW1hbmRzICovCi0jZGVmaW5lIEZQSVBFX0VOQUJMRV9UUkFDSU5HICAgICAgICAgIAkweDQxCi0jZGVmaW5lIEZQSVBFX0RJU0FCTEVfVFJBQ0lORwkJMHg0MgotI2RlZmluZSBGUElQRV9HRVRfVFJBQ0VfSU5GTyAgICAgICAgICAgIDB4NDMKLSNkZWZpbmUgRlBJUEVfRlQxX1JFQURfU1RBVFVTICAgICAgICAgICAweDQ0Ci0jZGVmaW5lIEZQSVBFX0RSSVZFUl9TVEFUX0lGU0VORCAgICAgICAgMHg0NQotI2RlZmluZSBGUElQRV9EUklWRVJfU1RBVF9JTlRSICAgICAgICAgIDB4NDYKLSNkZWZpbmUgRlBJUEVfRFJJVkVSX1NUQVRfR0VOICAgICAgICAgICAweDQ3Ci0jZGVmaW5lIEZQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUyAgICAgICAgMHg0OAotI2RlZmluZSBGUElQRV9ST1VURVJfVVBfVElNRSAgICAgICAgICAgIDB4NDkKLQotLyogJ3Jlc3VsdCcgZmllbGQgZGVmaW5lcyAqLwotI2RlZmluZSBGUlJFU19PSwkJMHgwMAkvKiBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSAqLwotI2RlZmluZQlGUlJFU19ESVNBQkxFRAkJMHgwMQkvKiBjb21tdW5pY2F0aW9ucyBub3QgZW5hYmxlZCAqLwotI2RlZmluZQlGUlJFU19JTk9QRVJBVElWRQkweDAyCS8qIGNoYW5uZWwgaW5vcGVyYXRpdmUgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9JTkFDVElWRQkweDAzCS8qIERMQ0kgaXMgaW5hY3RpdmUgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9JTlZBTElECTB4MDQJLyogRExDSSBpcyBub3QgY29uZmlndXJlZCAqLwotI2RlZmluZQlGUlJFU19UT09fTE9ORwkJMHgwNQotI2RlZmluZQlGUlJFU19UT09fTUFOWQkJMHgwNgotI2RlZmluZQlGUlJFU19DSVJfT1ZFUkZMT1cJMHgwNwkvKiBUeCB0aHJvdWdocHV0IGhhcyBleGNlZWRlZCBDSVIgKi8KLSNkZWZpbmUJRlJSRVNfQlVGRkVSX09WRVJGTE9XCTB4MDgKLSNkZWZpbmUJRlJSRVNfTU9ERU1fRkFJTFVSRQkweDEwCS8qIERDRCBhbmQvb3IgQ1RTIGRyb3BwZWQgKi8KLSNkZWZpbmUJRlJSRVNfQ0hBTk5FTF9ET1dOCTB4MTEJLyogY2hhbm5lbCBiZWNhbWUgaW5vcGVyYXRpdmUgKi8KLSNkZWZpbmUJRlJSRVNfQ0hBTk5FTF9VUAkweDEyCS8qIGNoYW5uZWwgYmVjYW1lIG9wZXJhdGl2ZSAqLwotI2RlZmluZQlGUlJFU19ETENJX0NIQU5HRQkweDEzCS8qIERMQ0kgc3RhdHVzIChvciBudW1iZXIpIGNoYW5nZWQgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9NSVNNQVRDSAkweDE0Ci0jZGVmaW5lCUZSUkVTX0lOVkFMSURfQ01ECTB4MUYJLyogaW52YWxpZCBjb21tYW5kICovCi0KLS8qICdhdHRyJyBmaWVsZCBkZWZpbmVzICovCi0jZGVmaW5lCUZSQVRUUl8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGcmFtZSByZWxheSBtYWlsYm94LgotICoJVGhpcyBzdHJ1Y3R1cmUgaXMgbG9jYXRlZCBhdCBvZmZzZXQgRlI1MD9fTUJPWF9PRkZTIGludG8gRlJfTUJfVkVDVE9SLgotICoJRm9yIFM1MDIgaXQgaXMgYWxzbyBsb2NhdGVkIGF0IG9mZnNldCBGUjUwMl9SWE1CX09GRlMgaW50bwotICoJRlI1MDJfUlhfVkVDVE9SLgotICovCi10eXBlZGVmIHN0cnVjdCBmcl9tYm94Ci17Ci0JdW5zaWduZWQgY2hhciBvcGZsYWcJUEFDS0VEOwkvKiAwMGg6IGV4ZWN1dGlvbiBmbGFnICovCi0JZnJfY21kX3QgY21kCQlQQUNLRUQ7CS8qIDAxaDogY29tbWFuZCBibG9jayAqLwotCXVuc2lnbmVkIGNoYXIgZGF0YVsxXQlQQUNLRUQ7CS8qIDEwaDogdmFyaWFibGUgbGVuZ3RoIGRhdGEgYnVmZmVyICovCi19IGZyX21ib3hfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTAyIGZyYW1lIHJlbGF5IHN0YXR1cyBmbGFncy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTAyX0ZMQUdfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnI1MDJfZmxhZ3MKLXsJCi0JdW5zaWduZWQgY2hhciByc3J2MVsxXQlQQUNLRUQ7CS8qIDAwaDogKi8KLQl1bnNpZ25lZCBjaGFyIHR4X3JlYWR5CVBBQ0tFRDsJLyogMDFoOiBUeCBidWZmZXIgYXZhaWxhYmxlICovCi0JdW5zaWduZWQgY2hhciByeF9yZWFkeQlQQUNLRUQ7CS8qIDAyaDogUnggZnJhbWUgYXZhaWxhYmxlICovCi0JdW5zaWduZWQgY2hhciBldmVudAlQQUNLRUQ7CS8qIDAzaDogYXN5bmNocm9ub3VzIGV2ZW50ICovCi0JdW5zaWduZWQgY2hhciBtc3RhdHVzCVBBQ0tFRDsJLyogMDRoOiBtb2RlbSBzdGF0dXMgKi8KLQl1bnNpZ25lZCBjaGFyIHJzcnYyWzhdCVBBQ0tFRDsJLyogMDVoOiAqLwotCXVuc2lnbmVkIGNoYXIgaWZsYWcJUEFDS0VEOwkvKiAwRGg6IGludGVycnVwdCBmbGFnICovCi0JdW5zaWduZWQgY2hhciBpbWFzawlQQUNLRUQ7CS8qIDBFaDogaW50ZXJydXB0IG1hc2sgKi8KLX0gZnI1MDJfZmxhZ3NfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTA4IGZyYW1lIHJlbGF5IHN0YXR1cyBmbGFncy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTA4X0ZMQUdfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnI1MDhfZmxhZ3MKLXsKLQl1bnNpZ25lZCBjaGFyIHJzcnYxWzNdCVBBQ0tFRDsJLyogMDBoOiByZXNlcnZlZCAqLwotCXVuc2lnbmVkIGNoYXIgZXZlbnQJUEFDS0VEOwkvKiAwM2g6IGFzeW5jaHJvbm91cyBldmVudCAqLwotCXVuc2lnbmVkIGNoYXIgbXN0YXR1cwlQQUNLRUQ7CS8qIDA0aDogbW9kZW0gc3RhdHVzICovCi0JdW5zaWduZWQgY2hhciByc3J2MlsxMV0JUEFDS0VEOwkvKiAwNWg6IHJlc2VydmVkICovCi0JdW5zaWduZWQgY2hhciBpZmxhZwlQQUNLRUQ7CS8qIDEwaDogaW50ZXJydXB0IGZsYWcgKi8KLQl1bnNpZ25lZCBjaGFyIGltYXNrCVBBQ0tFRDsJLyogMTFoOiBpbnRlcnJ1cHQgbWFzayAqLwotCXVuc2lnbmVkIGxvbmcgdHNlX29mZnMJUEFDS0VEOwkvKiAxMmg6IFR4IHN0YXR1cyBlbGVtZW50ICovCi0JdW5zaWduZWQgc2hvcnQgZGxjaQlQQUNLRUQ7IC8qIDE2aDogRExDSSBOVU1CRVIgKi8KLX0gZnI1MDhfZmxhZ3NfdDsKLQotLyogJ2V2ZW50JyBmaWVsZCBkZWZpbmVzICovCi0jZGVmaW5lCUZSX0VWRU5UX1NUQVRVUwkJMHgwMQkvKiBjaGFubmVsIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUJRlJfRVZFTlRfRExDX1NUQVRVUwkweDAyCS8qIERMQyBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lCUZSX0VWRU5UX0JBRF9ETENJCTB4MDQJLyogRlNSIGluY2x1ZGVkIHdyb25nIERMQ0kgKi8KLSNkZWZpbmUJRlJfRVZFTlRfTElOS19ET1dOCTB4NDAJLyogRENEIG9yIENUUyBsb3cgKi8KLQotLyogJ21zdGF0dXMnIGZpZWxkIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfTURNX0RDRAkJMHgwOAkvKiBtZG1fc3RhdHVzOiBEQ0QgKi8KLSNkZWZpbmUJRlJfTURNX0NUUwkJMHgyMAkvKiBtZG1fc3RhdHVzOiBDVFMgKi8KLQotLyogJ2lmbGFnJyAmICdpbWFzaycgZmllbGRzIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfSU5UUl9SWFJEWQkJMHgwMQkvKiBSeCByZWFkeSAqLwotI2RlZmluZQlGUl9JTlRSX1RYUkRZCQkweDAyCS8qIFR4IHJlYWR5ICovCi0jZGVmaW5lCUZSX0lOVFJfTU9ERU0JCTB4MDQJLyogbW9kZW0gc3RhdHVzIGNoYW5nZSAoRENELCBDVFMpICovCi0jZGVmaW5lCUZSX0lOVFJfUkVBRFkJCTB4MDgJLyogaW50ZXJmYWNlIGNvbW1hbmQgY29tcGxldGVkICovCi0jZGVmaW5lCUZSX0lOVFJfRExDCQkweDEwCS8qIERMQyBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lCUZSX0lOVFJfVElNRVIJCTB4MjAJLyogbWlsbGlzZWNvbmQgdGltZXIgKi8KLSNkZWZpbmUgRlJfSU5UUl9UWF9NVUxUX0RMQ0lzCTB4ODAJLyogVHggaW50ZXJydXB0IG9uIG11bHRpcGxlIERMQ0lzICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSZWNlaXZlIEJ1ZmZlciBDb25maWd1cmF0aW9uIEluZm8uIFM1MDggb25seSEKLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTA4X1JYQkNfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfYnVmX2luZm8KLXsKLQl1bnNpZ25lZCBzaG9ydCByc2VfbnVtCVBBQ0tFRDsJLyogMDBoOiBudW1iZXIgb2Ygc3RhdHVzIGVsZW1lbnRzICovCi0JdW5zaWduZWQgbG9uZyByc2VfYmFzZQlQQUNLRUQ7CS8qIDAyaDogcmVjZWl2ZSBzdGF0dXMgYXJyYXkgYmFzZSAqLwotCXVuc2lnbmVkIGxvbmcgcnNlX25leHQJUEFDS0VEOwkvKiAwNmg6IG5leHQgc3RhdHVzIGVsZW1lbnQgKi8KLQl1bnNpZ25lZCBsb25nIGJ1Zl9iYXNlCVBBQ0tFRDsJLyogMEFoOiByb3RhdGlvbmFsIGJ1ZmZlciBiYXNlICovCi0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQJUEFDS0VEOwkvKiAwRWg6ICAqLwotCXVuc2lnbmVkIGxvbmcgYnVmX3RvcAlQQUNLRUQ7CS8qIDEwaDogcm90YXRpb25hbCBidWZmZXIgdG9wICovCi19IGZyX2J1Zl9pbmZvX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQnVmZmVyIFN0YXR1cyBFbGVtZW50LiBTNTA4IG9ubHkhCi0gKglBcnJheSBvZiBzdHJ1Y3R1cmVzIG9mIHRoaXMgdHlwZSBpcyBsb2NhdGVkIGF0IG9mZnNldCBkZWZpbmVkIGJ5IHRoZQotICoJJ3JzZV9iYXNlJyBmaWVsZCBvZiB0aGUgZnJCdWZJbmZvX3Qgc3RydWN0dXJlIGludG8gYWJzb2x1dGUgYWRhcHRlcgotICoJbWVtb3J5IGFkZHJlc3Mgc3BhY2UuCi0gKi8KLXR5cGVkZWYgc3RydWN0CWZyX3J4X2J1Zl9jdGwKLXsKLQl1bnNpZ25lZCBjaGFyIGZsYWcJUEFDS0VEOwkvKiAwMGg6IHJlYWR5IGZsYWcgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGgJUEFDS0VEOwkvKiAwMWg6IGZyYW1lIGxlbmd0aCAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2kJUEFDS0VEOwkvKiAwM2g6IERMQ0kgKi8KLQl1bnNpZ25lZCBjaGFyIGF0dHIJUEFDS0VEOwkvKiAwNWg6IEZFQ04vQkVDTi9ERS9DUiAqLwotCXVuc2lnbmVkIHNob3J0IHRtc3RhbXAJUEFDS0VEOwkvKiAwNmg6IHRpbWUgc3RhbXAgKi8KLQl1bnNpZ25lZCBzaG9ydCByc3J2WzJdCVBBQ0tFRDsgLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBsb25nIG9mZnNldAlQQUNLRUQ7CS8qIDBDaDogYnVmZmVyIGFic29sdXRlIGFkZHJlc3MgKi8KLX0gZnJfcnhfYnVmX2N0bF90OwotCi10eXBlZGVmIHN0cnVjdCAgZnJfdHhfYnVmX2N0bAotewotICAgICAgICB1bnNpZ25lZCBjaGFyIGZsYWcgICAgICBQQUNLRUQ7IC8qIDAwaDogcmVhZHkgZmxhZyAqLwotCXVuc2lnbmVkIHNob3J0IHJzcnYwWzJdCVBBQ0tFRDsJLyogMDFoOiAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggICBQQUNLRUQ7IC8qIDA1aDogZnJhbWUgbGVuZ3RoICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGRsY2kgICAgIFBBQ0tFRDsgLyogMDdoOiBETENJICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYXR0ciAgICAgIFBBQ0tFRDsgLyogMDloOiBGRUNOL0JFQ04vREUvQ1IgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgcnNydjEgCVBBQ0tFRDsgLyogMEFoOiAgKi8KLSAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgUEFDS0VEOyAvKiAwQ2g6IGJ1ZmZlciBhYnNvbHV0ZSBhZGRyZXNzICovCi19IGZyX3R4X2J1Zl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBHbG9iYWwgQ29uZmlndXJhdGlvbiBCbG9jay4gUGFzc2VkIHRvIEZSX1NFVF9DT05GSUcgY29tbWFuZCB3aGVuIGRsY2kgPT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfY29uZgotewotCXVuc2lnbmVkIHNob3J0IHN0YXRpb24JUEFDS0VEOwkvKiAwMGg6IENQRS9Ob2RlICovCi0JdW5zaWduZWQgc2hvcnQgb3B0aW9ucwlQQUNLRUQ7CS8qIDAyaDogY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0JdW5zaWduZWQgc2hvcnQga2JwcwlQQUNLRUQ7CS8qIDA0aDogYmF1ZCByYXRlIGluIGticHMgKi8KLQl1bnNpZ25lZCBzaG9ydCBwb3J0CVBBQ0tFRDsJLyogMDZoOiBSUy0yMzIvVi4zNSAqLwotCXVuc2lnbmVkIHNob3J0IG10dQlQQUNLRUQ7CS8qIDA4aDogbWF4LiB0cmFuc21pdCBsZW5ndGggKi8KLQl1bnNpZ25lZCBzaG9ydCB0MzkxCVBBQ0tFRDsJLyogMEFoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCB0MzkyCVBBQ0tFRDsJLyogMENoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkxCVBBQ0tFRDsJLyogMEVoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkyCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkzCVBBQ0tFRDsJLyogMTJoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjaXJfZndkCVBBQ0tFRDsJLyogMTRoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBiY19md2QJUEFDS0VEOwkvKiAxNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJlX2Z3ZAlQQUNLRUQ7CS8qIDE4aDogICovCi0JdW5zaWduZWQgc2hvcnQgY2lyX2J3ZAlQQUNLRUQ7CS8qIDFBaDogICovCi0JdW5zaWduZWQgc2hvcnQgYmNfYndkCVBBQ0tFRDsJLyogMUNoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBiZV9id2QJUEFDS0VEOwkvKiAxRWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2lbMF0JUEFDS0VEOwkvKiAyMGg6ICAqLwotfSBmcl9jb25mX3Q7Ci0KLS8qICdzdGF0aW9uX3R5cGUnIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJDRkdfU1RBVElPTl9DUEUJMAotI2RlZmluZQlGUkNGR19TVEFUSU9OX05PREUJMQotCi0vKiAnY29uZl9mbGFncycgZGVmaW5lcyAqLwotI2RlZmluZQlGUkNGR19JR05PUkVfVFhfQ0lSCTB4MDAwMQotI2RlZmluZQlGUkNGR19JR05PUkVfUlhfQ0lSCTB4MDAwMgotI2RlZmluZQlGUkNGR19ET05UX1JFVFJBTlNNSVQJMHgwMDA0Ci0jZGVmaW5lCUZSQ0ZHX0lHTk9SRV9DQlMJMHgwMDA4Ci0jZGVmaW5lCUZSQ0ZHX1RIUk9VR0hQVVQJMHgwMDEwCS8qIGVuYWJsZSB0aHJvdWdocHV0IGNhbGN1bGF0aW9uICovCi0jZGVmaW5lCUZSQ0ZHX0RJUkVDVF9SWAkJMHgwMDgwCS8qIGVuYWJsZSBkaXJlY3QgcmVjZWl2ZSBidWZmZXIgKi8KLSNkZWZpbmUJRlJDRkdfQVVUT19DT05GSUcJMHg4MDAwCS8qIGVuYWJsZSAgYXV0byBETENJIGNvbmZpZ3VyYXRpb24gKi8KLQotLyogJ2JhdWRfcmF0ZScgZGVmaW5lcyAqLwotI2RlZmluZQlGUkNGR19CQVVEXzEyMDAJCTEyCi0jZGVmaW5lCUZSQ0ZHX0JBVURfMjQwMAkJMjQKLSNkZWZpbmUJRlJDRkdfQkFVRF80ODAwCQk0OAotI2RlZmluZQlGUkNGR19CQVVEXzk2MDAJCTk2Ci0jZGVmaW5lCUZSQ0ZHX0JBVURfMTkyMDAJMTkKLSNkZWZpbmUJRlJDRkdfQkFVRF8zODQwMAkzOAotI2RlZmluZQlGUkNGR19CQVVEXzU2MDAwCTU2Ci0jZGVmaW5lCUZSQ0ZHX0JBVURfNjQwMDAJNjQKLSNkZWZpbmUJRlJDRkdfQkFVRF8xMjgwMDAJMTI4Ci0KLS8qICdwb3J0X21vZGUnIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJDRkdfTU9ERV9FWFRfQ0xLCTB4MDAwMAotI2RlZmluZQlGUkNGR19NT0RFX0lOVF9DTEsJMHgwMDAxCi0jZGVmaW5lCUZSQ0ZHX01PREVfVjM1CQkweDAwMDAJLyogUzUwOCBvbmx5ICovCi0jZGVmaW5lCUZSQ0ZHX01PREVfUlMyMzIJMHgwMDAyCS8qIFM1MDggb25seSAqLwotCi0vKiBkZWZpbmVzIGZvciBsaW5lIHRyYWNpbmcgKi8KLQotLyogdGhlIGxpbmUgdHJhY2Ugc3RhdHVzIGVsZW1lbnQgcHJlc2VudGVkIGJ5IHRoZSBmcmFtZSByZWxheSBjb2RlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZmxhZyAgICAgIFBBQ0tFRDsgLyogcmVhZHkgZmxhZyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggICBQQUNLRUQ7IC8qIHRyYWNlIGxlbmd0aCAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIHJzcnYwWzJdICBQQUNLRUQ7IC8qIHJlc2VydmVkICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYXR0ciAgICAgIFBBQ0tFRDsgLyogdHJhY2UgYXR0cmlidXRlcyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB0bXN0YW1wICBQQUNLRUQ7IC8qIHRpbWUgc3RhbXAgKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciByc3J2MVs0XSAgUEFDS0VEOyAvKiByZXNlcnZlZCAqLwotICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICBQQUNLRUQ7IC8qIGJ1ZmZlciBhYnNvbHV0ZSBhZGRyZXNzICovCi19IGZyX3RyY19lbF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzICAgIAlQQUNLRUQ7IC8qIHN0YXR1cyBmbGFnICovCi0JdW5zaWduZWQgY2hhciBkYXRhX3Bhc3NlZAlQQUNLRUQ7CS8qIDAgaWYgbm8gZGF0YSBwYXNzZWQsIDEgaWYgKi8KLQkJCQkJCS8qIGRhdGEgcGFzc2VkICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aCAgIAlQQUNLRUQ7IC8qIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB0bXN0YW1wICAJUEFDS0VEOyAvKiB0aW1lIHN0YW1wICovCi19IGZwaXBlbW9uX3RyY19oZHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWZwaXBlbW9uX3RyY19oZHJfdCBmcGlwZW1vbl90cmNfaGRyCQkJUEFDS0VEOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGFbRlJfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUVdCVBBQ0tFRDsKLX0gZnBpcGVtb25fdHJjX3Q7Ci0KLS8qIGJpdCBzZXR0aW5ncyBmb3IgdGhlICdzdGF0dXMnIGJ5dGUgIC0gbm90ZSB0aGF0IGJpdHMgMSwgMiBhbmQgMyBhcmUgdXNlZCAqLwotLyogZm9yIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBiZWluZyBwYXNzZWQgdG8gZnBpcGVtb24gKi8KLSNkZWZpbmUgVFJDX09VVEdPSU5HX0ZSTQkweDAxCi0jZGVmaW5lIFRSQ19BQk9SVF9FUlJPUiAgICAgICAgIDB4MTAKLSNkZWZpbmUgVFJDX0NSQ19FUlJPUiAgICAgICAgICAgMHgyMAotI2RlZmluZSBUUkNfT1ZFUlJVTl9FUlJPUiAgICAgICAweDQwCi0jZGVmaW5lIE1PUkVfVFJDX0RBVEEJCTB4ODAKLQotI2RlZmluZSBNQVhfRlJNU19UUkFDRUQJCTB4MDcKLQotI2RlZmluZSBOT19UUkNfRUxFTUVOVFNfT0ZGCQkweDkwMDAKLSNkZWZpbmUgQkFTRV9UUkNfRUxFTUVOVFNfT0ZGCQkweDkwMDIKLSNkZWZpbmUgVFJDX0FDVElWRQkJCTB4MDEKLSNkZWZpbmUgRkxVU0hfVFJDX0JVRkZFUlMgCQkweDAyCi0jZGVmaW5lIEZMVVNIX1RSQ19TVEFUSVNUSUNTCQkweDA0Ci0jZGVmaW5lIFRSQ19TSUdOQUxMSU5HX0ZSTVMJCTB4MTAKLSNkZWZpbmUgVFJDX0lORk9fRlJNUwkJCTB4MjAKLSNkZWZpbmUgQUNUSVZBVEVfVFJDCShUUkNfQUNUSVZFIHwgVFJDX1NJR05BTExJTkdfRlJNUyB8IFRSQ19JTkZPX0ZSTVMpCi0jZGVmaW5lIFJFU0VUX1RSQwkoRkxVU0hfVFJDX0JVRkZFUlMgfCBGTFVTSF9UUkNfU1RBVElTVElDUykKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24uCi0gKglUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gdGhlIEZSX1NFVF9DT05GSUcgY29tbWFuZCB3aGVuIGRsY2kgIT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfZGxjX2NvbmYKLXsKLQl1bnNpZ25lZCBzaG9ydCBjb25mX2ZsYWdzCVBBQ0tFRDsJLyogMDBoOiBjb25maWd1cmF0aW9uIGJpdHMgKi8KLQl1bnNpZ25lZCBzaG9ydCBjaXJfZndkCQlQQUNLRUQ7CS8qIDAyaDogICovCi0JdW5zaWduZWQgc2hvcnQgYmNfZndkCQlQQUNLRUQ7CS8qIDA0aDogICovCi0JdW5zaWduZWQgc2hvcnQgYmVfZndkCQlQQUNLRUQ7CS8qIDA2aDogICovCi0JdW5zaWduZWQgc2hvcnQgY2lyX2J3ZAkJUEFDS0VEOwkvKiAwOGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJjX2J3ZAkJUEFDS0VEOwkvKiAwQWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJlX2J3ZAkJUEFDS0VEOwkvKiAwQ2g6ICAqLwotfSBmcl9kbGNfY29uZl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFM1MDIgaW50ZXJydXB0IG1vZGUgY29udHJvbCBibG9jay4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCB0byB0aGUgRlJfU0VUX0lOVFJfRkxBR1MgYW5kIHJldHVybmVkIGJ5IHRoZQotICoJRlJfUkVBRF9JTlRSX0ZMQUdTIGNvbW1hbmRzLgotICovCi10eXBlZGVmIHN0cnVjdCBmcjUwMl9pbnRyX2N0bAotewotCXVuc2lnbmVkIGNoYXIgbW9kZQlQQUNLRUQ7CS8qIDAwaDogaW50ZXJydXB0IGVuYWJsZSBmbGFncyAqLwotCXVuc2lnbmVkIHNob3J0IHR4X2xlbglQQUNLRUQ7CS8qIDAxaDogcmVxdWlyZWQgVHggYnVmZmVyIHNpemUgKi8KLX0gZnI1MDJfaW50cl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTA4IGludGVycnVwdCBtb2RlIGNvbnRyb2wgYmxvY2suCi0gKglUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gdGhlIEZSX1NFVF9JTlRSX0ZMQUdTIGFuZCByZXR1cm5lZCBieSB0aGUKLSAqCUZSX1JFQURfSU5UUl9GTEFHUyBjb21tYW5kcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZnI1MDhfaW50cl9jdGwKLXsKLQl1bnNpZ25lZCBjaGFyIG1vZGUJUEFDS0VEOwkvKiAwMGg6IGludGVycnVwdCBlbmFibGUgZmxhZ3MgKi8KLQl1bnNpZ25lZCBzaG9ydCB0eF9sZW4JUEFDS0VEOwkvKiAwMWg6IHJlcXVpcmVkIFR4IGJ1ZmZlciBzaXplICovCi0JdW5zaWduZWQgY2hhciBpcnEJUEFDS0VEOwkvKiAwM2g6IElSUSBsZXZlbCB0byBhY3RpdmF0ZSAqLwotCXVuc2lnbmVkIGNoYXIgZmxhZ3MJUEFDS0VEOwkvKiAwNGg6ID8/ICovCi0JdW5zaWduZWQgc2hvcnQgdGltZW91dAlQQUNLRUQ7CS8qIDA1aDogbXMsIGZvciB0aW1lciBpbnRlcnJ1cHQgKi8KLX0gZnI1MDhfaW50cl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDaGFubmVsIHN0YXR1cy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSBGUl9SRUFEX1NUQVRVUyBjb21tYW5kLgotICovCi10eXBlZGVmIHN0cnVjdAlmcl9kbGNfU3RhdHVzCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXMJCVBBQ0tFRDsJLyogMDBoOiBsaW5rL0RMQ0kgc3RhdHVzICovCi0Jc3RydWN0Ci0JewotCQl1bnNpZ25lZCBzaG9ydCBkbGNpCVBBQ0tFRDsJLyogMDFoOiBETENJIG51bWJlciAqLwotCQl1bnNpZ25lZCBjaGFyIHN0YXR1cwlQQUNLRUQ7CS8qIDAzaDogRExDSSBzdGF0dXMgKi8KLQl9IGNpcmN1aXRbMV0JCQlQQUNLRUQ7Ci19IGZyX2RsY19zdGF0dXNfdDsKLQotLyogJ3N0YXR1cycgZGVmaW5lcyAqLwotI2RlZmluZQlGUl9MSU5LX0lOT1BFUgkweDAwCQkvKiBmb3IgZ2xvYmFsIHN0YXR1cyAoRExDSSA9PSAwKSAqLwotI2RlZmluZQlGUl9MSU5LX09QRVIJMHgwMQotI2RlZmluZQlGUl9ETENJX0RFTEVURUQJMHgwMQkJLyogZm9yIGNpcmN1aXQgc3RhdHVzIChETENJICE9IDApICovCi0jZGVmaW5lCUZSX0RMQ0lfQUNUSVZFCTB4MDIKLSNkZWZpbmUJRlJfRExDSV9XQUlUSU5HCTB4MDQKLSNkZWZpbmUJRlJfRExDSV9ORVcJMHgwOAotI2RlZmluZQlGUl9ETENJX1JFUE9SVAkweDQwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogR2xvYmFsIFN0YXRpc3RpY3MgQmxvY2suCi0gKglUaGlzIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSB0aGUgRlJfUkVBRF9TVEFUSVNUSUNTIGNvbW1hbmQgd2hlbgotICoJZGNsaSA9PSAwLgotICovCi10eXBlZGVmIHN0cnVjdAlmcl9saW5rX3N0YXQKLXsKLQl1bnNpZ25lZCBzaG9ydCByeF90b29fbG9uZwlQQUNLRUQ7CS8qIDAwaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfZHJvcHBlZAlQQUNLRUQ7CS8qIDAyaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfZHJvcHBlZDIJUEFDS0VEOwkvKiAwNGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X2JhZF9kbGNpCVBBQ0tFRDsJLyogMDZoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCByeF9iYWRfZm9ybWF0CVBBQ0tFRDsJLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXRyYW5zbWl0dGVkCVBBQ0tFRDsJLyogMEFoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfdHhfRlNFCVBBQ0tFRDsJLyogMENoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfdHhfTElWCVBBQ0tFRDsJLyogMEVoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfcnhfRlNSCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfcnhfTElWCVBBQ0tFRDsJLyogMTJoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBub2RlX3J4X0ZTRQlQQUNLRUQ7CS8qIDE0aDogICovCi0JdW5zaWduZWQgc2hvcnQgbm9kZV9yeF9MSVYJUEFDS0VEOwkvKiAxNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IG5vZGVfdHhfRlNSCVBBQ0tFRDsJLyogMThoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBub2RlX3R4X0xJVglQQUNLRUQ7CS8qIDFBaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfSVNGX2VycglQQUNLRUQ7CS8qIDFDaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfdW5zb2xpY2l0ZWQJUEFDS0VEOwkvKiAxRWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X1NTTl9lcnIJUEFDS0VEOwkvKiAyMGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X1JTTl9lcnIJUEFDS0VEOwkvKiAyMmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IFQzOTFfdGltZW91dHMJUEFDS0VEOwkvKiAyNGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IFQzOTJfdGltZW91dHMJUEFDS0VEOwkvKiAyNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IE4zOTJfcmVhY2hlZAlQQUNLRUQ7CS8qIDI4aDogICovCi0JdW5zaWduZWQgc2hvcnQgY3BlX1NTTl9SU04JUEFDS0VEOwkvKiAyQWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfU1NOCVBBQ0tFRDsJLyogMkNoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X1JTTglQQUNLRUQ7CS8qIDJFaDogICovCi0JdW5zaWduZWQgc2hvcnQgY3VycmVueV9UMzkxCVBBQ0tFRDsJLyogMzBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X1QzOTIJUEFDS0VEOwkvKiAzMmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfTjM5MglQQUNLRUQ7CS8qIDM0aDogICovCi0JdW5zaWduZWQgc2hvcnQgY3VycmVudF9OMzkzCVBBQ0tFRDsJLyogMzZoOiAgKi8KLX0gZnJfbGlua19zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRExDSSBzdGF0aXN0aWNzLgotICoJVGhpcyBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgYnkgdGhlIEZSX1JFQURfU1RBVElTVElDUyBjb21tYW5kIHdoZW4KLSAqCWRsY2kgIT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfZGxjaV9zdGF0Ci17Ci0JdW5zaWduZWQgbG9uZyB0eF9mcmFtZXMJCVBBQ0tFRDsJLyogMDBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2J5dGVzCQlQQUNLRUQ7CS8qIDA0aDogICovCi0JdW5zaWduZWQgbG9uZyByeF9mcmFtZXMJCVBBQ0tFRDsJLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzCQlQQUNLRUQ7CS8qIDBDaDogICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2luYWN0aXZlCVBBQ0tFRDsJLyogMTRoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2V4Y2VlZF9DSVIJUEFDS0VEOwkvKiAxOGg6ICAqLwotCXVuc2lnbmVkIGxvbmcgcnhfREVfc2V0CQlQQUNLRUQ7CS8qIDFDaDogICovCi0JdW5zaWduZWQgbG9uZyB0eF90aHJvdWdocHV0CVBBQ0tFRDsJLyogMjBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2NhbGNfdGltZXIJUEFDS0VEOwkvKiAyNGg6ICAqLwotCXVuc2lnbmVkIGxvbmcgcnhfdGhyb3VnaHB1dAlQQUNLRUQ7CS8qIDI4aDogICovCi0JdW5zaWduZWQgbG9uZyByeF9jYWxjX3RpbWVyCVBBQ0tFRDsJLyogMkNoOiAgKi8KLX0gZnJfZGxjaV9zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSBGUl9SRUFEX0VSUk9SX1NUQVRTIGNvbW1hbmQuCi0gKi8KLXR5cGVkZWYgc3RydWN0CWZyX2NvbW1fc3RhdAotewotCXVuc2lnbmVkIGNoYXIgcnhfb3ZlcnJ1bnMJUEFDS0VEOwkvKiAwMGg6ICAqLwotCXVuc2lnbmVkIGNoYXIgcnhfYmFkX2NyYwlQQUNLRUQ7CS8qIDAxaDogICovCi0JdW5zaWduZWQgY2hhciByeF9hYm9ydHMJCVBBQ0tFRDsJLyogMDJoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHJ4X3Rvb19sb25nCVBBQ0tFRDsJLyogMDNoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHR4X2Fib3J0cwkJUEFDS0VEOwkvKiAwNGg6ICAqLwotCXVuc2lnbmVkIGNoYXIgdHhfdW5kZXJydW5zCVBBQ0tFRDsJLyogMDVoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHR4X21pc3NlZF91bmRyCVBBQ0tFRDsJLyogMDZoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIGRjZF9kcm9wcGVkCVBBQ0tFRDsJLyogMDdoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIGN0c19kcm9wcGVkCVBBQ0tFRDsJLyogMDhoOiAgKi8KLX0gZnJfY29tbV9zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGVmaW5lcyBmb3IgdGhlIEZSX0lTU1VFX0lTX0ZSQU1FIGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUJRlJfSVNGX0xWRQkyCQkvKiBpc3N1ZSBMaW5rIFZlcmlmaWNhdGlvbiBFbnF1aXJ5ICovCi0jZGVmaW5lCUZSX0lTRl9GU0UJMwkJLyogaXNzdWUgRnVsbCBTdGF0dXMgRW5xdWlyeSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIFJlbGF5IEFSUCBIZWFkZXIgLS0gVXNlZCBmb3IgRHluYW1pYyByb3V0ZSBjcmVhdGlvbiB3aXRoIEludkFSUCAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBhcnBoZHJfZnIKLQl7Ci0JdW5zaWduZWQgc2hvcnQgYXJfaHJkIFBBQ0tFRDsJCS8qIGZvcm1hdCBvZiBoYXJkd2FyZSBhZGRyICovCi0JdW5zaWduZWQgc2hvcnQgYXJfcHJvIFBBQ0tFRDsJCS8qIGZvcm1hdCBvZiBwcm90b2NvbCBhZGRyICovCi0JdW5zaWduZWQgY2hhciAgYXJfaGxuIFBBQ0tFRDsJCS8qIGxlbmd0aCBvZiBoYXJkd2FyZSBhZGRyICovCQotCXVuc2lnbmVkIGNoYXIgIGFyX3BsbiBQQUNLRUQ7CQkvKiBsZW5ndGggb2YgcHJvdG9jb2wgYWRkciAqLwotCXVuc2lnbmVkIHNob3J0IGFyX29wICBQQUNLRUQ7CQkvKiBBUlAgb3Bjb2RlCQkgICAqLwotCXVuc2lnbmVkIHNob3J0IGFyX3NoYSBQQUNLRUQ7CQkvKiBTZW5kZXIgRExDSSBhZGRyIDIgYnl0ZXMgKi8KLQl1bnNpZ25lZCBsb25nICBhcl9zaXAgUEFDS0VEOwkJLyogU2VuZGVyIElQICAgYWRkciA0IGJ5dGVzICovCi0JdW5zaWduZWQgc2hvcnQgYXJfdGhhIFBBQ0tFRDsJCS8qIFRhcmdldCBETENJIGFkZHIgMiBieXRlcyAqLwotCXVuc2lnbmVkIGxvbmcgIGFyX3RpcCBQQUNLRUQ7CQkvKiBUYXJnZXQgSVAgICBhZGRyIDQgYnl0ZXMgKi8KLQl9IGFycGhkcl9mcl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIFJlbGF5IFJGQyAxNDkwIFNOQVAgSGVhZGVyIC0tIFVzZWQgdG8gY2hlY2sgZm9yIEFSUCBwYWNrZXRzCi0gKi8KLXR5cGVkZWYgc3RydWN0IGFycGhkcl8xNDkwCi0JewotCXVuc2lnbmVkIGNoYXIgY29udHJvbCBQQUNLRUQ7CQkvKiBVSSwgZXRjLi4uICAqLwotCXVuc2lnbmVkIGNoYXIgcGFkICAgICBQQUNLRUQ7CQkvKiBQYWQgKi8KLQl1bnNpZ25lZCBjaGFyIE5MUElEICAgUEFDS0VEOwkJLyogU05BUCAqLwotCXVuc2lnbmVkIGNoYXIgT1VJWzNdICBQQUNLRUQ7CQkvKiBFdGhlcnR5cGUsIGV0Yy4uLiAqLwotCXVuc2lnbmVkIHNob3J0IFBJRCAgICBQQUNLRUQ7CQkvKiBBUlAsIElQLCBldGMuLi4gKi8KLQl9ICBhcnBoZHJfMTQ5MF90OwotCi0vKiBVRFAvSVAgcGFja2V0IChmb3IgVURQIG1hbmFnZW1lbnQpIGxheW91dCAqLwotCi0vKiBUaGUgZW1iZWRkZWQgY29udHJvbCBibG9jayBmb3IgVURQIG1nbXQKLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBtYWlsYm94IHN0cnVjdHVyZSwgd2l0aG91dCB0aGUgbGFyZ2UgZGF0YSBmaWVsZCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgIG9wcF9mbGFnIFBBQ0tFRDsgLyogdGhlIG9wcCBmbGFnICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgIGNvbW1hbmQgIFBBQ0tFRDsgLyogY29tbWFuZCBjb2RlICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aCAgIFBBQ0tFRDsgLyogbGVuZ3RoIG9mIGRhdGEgYnVmZmVyICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgIHJlc3VsdCAgIFBBQ0tFRDsgLyogcmV0dXJuIGNvZGUgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZGxjaSAgICAgUEFDS0VEOyAvKiBETENJIG51bWJlciAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICBhdHRyICAgICBQQUNLRUQ7IC8qIEZFQ04sIEJFQ04sIERFIGFuZCBDL1IgYml0cyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCByeGxvc3QxICBQQUNLRUQ7IC8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgaW50LiBsZXZlbCAqLwotICAgICAgICB1bnNpZ25lZCBsb25nICByeGxvc3QyICBQQUNLRUQ7IC8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgYXBwLiBsZXZlbCAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICByc3J2WzJdICBQQUNLRUQ7IC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi19IGNibG9ja190OwotCi0KLS8qIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBsYXlvdXQgKGRhdGEgYXJlYSBvZiBpcCBwYWNrZXQpICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGNvbnRyb2wgICAgICAgICAgICAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIE5MUElEICAgICAgICAgICAgICAgICAgIFBBQ0tFRDsKLX0gZnJfZW5jYXBfaGRyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLS8vCWZyX2VuY2FwX2hkcl90IAkJZnJfZW5jYXBfaGRyCVBBQ0tFRDsKLQlpcF9wa3RfdCAJCWlwX3BrdAkJUEFDS0VEOwotCXVkcF9wa3RfdAkJdWRwX3BrdAkJUEFDS0VEOwotCXdwX21nbXRfdCAJCXdwX21nbXQgICAgICAgCVBBQ0tFRDsKLSAgICAgICAgY2Jsb2NrX3QgICAgICAgICAgICAgICAgY2Jsb2NrICAgICAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgZGF0YVs0MDgwXSAgICAgIFBBQ0tFRDsKLX0gZnJfdWRwX3BrdF90OwotCi0KLS8qIHZhbGlkIGlwX3Byb3RvY29sIGZvciBVRFAgbWFuYWdlbWVudCAqLwotI2RlZmluZSBVRFBNR01UX1VEUF9QUk9UT0NPTCAweDExCi0KLSNkZWZpbmUgVURQTUdNVF9GUElQRV9TSUdOQVRVUkUgICAgICAgICAiRlBJUEU4TkQiCi0jZGVmaW5lIFVEUE1HTVRfRFJWUlNUQVRTX1NJR05BVFVSRSAgICAgIkRSVlNUQVRTIgotCi0vKiB2YWx1ZXMgZm9yIHJlcXVlc3QvcmVwbHkgYnl0ZSAqLwotI2RlZmluZSBVRFBNR01UX1JFUVVFU1QJMHgwMQotI2RlZmluZSBVRFBNR01UX1JFUExZCTB4MDIKLSNkZWZpbmUgVURQX09GRlNFVAkxMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9lbnRyeTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX3NrYl9udWxsOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfYnJvYWRjYXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfbXVsdGljYXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfY3JpdGljYWxfSVNSOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfY3JpdGljYWxfbm9uX0lTUjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2J1c3k7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9idXN5X3RpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBpZl9zZW5kX0RSVlNUQVRTX3JlcXVlc3Q7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9GUElQRV9yZXF1ZXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2RsY2lfZGlzY29ubmVjdGVkOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfbm9fYmZyczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2FkcHRyX2JmcnNfZnVsbDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2JmcnNfcGFzc2VkX3RvX2FkcHRyOwotCXVuc2lnbmVkIGxvbmcgaWZfc2VuZF9jb25zZWNfc2VuZF9mYWlsOwotfSBkcnZzdGF0c19pZl9zZW5kX3Q7IAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9ub19zb2NrZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9kZXZfbm90X3N0YXJ0ZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9EUlZTVEFUU19yZXF1ZXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJ4X2ludHJfRlBJUEVfcmVxdWVzdDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJ4X2ludHJfYmZyX3Bhc3NlZF90b19zdGFjazsKLSB9IGRydnN0YXRzX3J4X2ludHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9GUElQRV9tZ210X2ttYWxsb2NfZXJyOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9GUElQRV9tZ210X2RpcmVjdGlvbl9lcnI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfdHlwZV9lcnI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfY21uZF9PSzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBVRFBfRlBJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfc2VuZF9wYXNzZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfc2VuZF9mYWlsZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfbm90X3Bhc3NlZF90b19zdGFjazsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBVRFBfRlBJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfbm9fc29ja2V0OwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2ttYWxsb2NfZXJyOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX2NtbmRfT0s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0RSVlNUQVRTX21nbXRfYWRwdHJfY21uZF90aW1lb3V0OwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX3NlbmRfcGFzc2VkOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX3NlbmRfZmFpbGVkOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X25vdF9wYXNzZWRfdG9fc3RhY2s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0RSVlNUQVRTX21nbXRfcGFzc2VkX3RvX3N0YWNrOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X25vX3NvY2tldDsKLX0gZHJ2c3RhdHNfZ2VuX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGF0dHIgICAgICAJUEFDS0VEOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgdGltZV9zdGFtcCAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHJlc2VydmVkWzEzXSAgICBQQUNLRUQ7Ci19IGFwaV9yeF9oZHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBhcGlfcnhfaGRyX3QgICAgYXBpX3J4X2hkciAgICAgIFBBQ0tFRDsKLSAgICAgICAgdm9pZCAqICAgICAgICAgIGRhdGEgICAgICAgICAgICBQQUNLRUQ7Ci19IGFwaV9yeF9lbGVtZW50X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGF0dHIgICAgICAgICAgICBQQUNLRUQ7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICByZXNlcnZlZFsxNV0gICAgUEFDS0VEOwotfSBhcGlfdHhfaGRyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgYXBpX3R4X2hkcl90ICAgIGFwaV90eF9oZHIgICAgICBQQUNLRUQ7Ci0gICAgICAgIHZvaWQgKiAgICAgICAgICBkYXRhICAgICAgICAgICAgUEFDS0VEOwotfSBhcGlfdHhfZWxlbWVudF90OwotCi0jaWZkZWYJCV9NU0NfCi0jICBwcmFnbWEJcGFjaygpCi0jZW5kaWYKLSNlbmRpZgkvKiBfU0RMQV9GUl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IDU5OTJmNjUuLjI2OTRjYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMjcsMjAgKzI3LDI0IEBACiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKICNkZWZpbmUgSEFWRV9BTExPQ19TS0IJCS8qIEZvciB0aGUgZHJpdmVycyB0byBrbm93ICovCiAjZGVmaW5lIEhBVkVfQUxJR05BQkxFX1NLQgkvKiBEaXR0byA4KQkJICAgKi8KIAorLyogRG9uJ3QgY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBza2JfY3N1bV91bm5lY2Vzc2FyeSEgKi8KICNkZWZpbmUgQ0hFQ0tTVU1fTk9ORSAwCi0jZGVmaW5lIENIRUNLU1VNX1BBUlRJQUwgMQotI2RlZmluZSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAyCi0jZGVmaW5lIENIRUNLU1VNX0NPTVBMRVRFIDMKKyNkZWZpbmUgQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgMQorI2RlZmluZSBDSEVDS1NVTV9DT01QTEVURSAyCisjZGVmaW5lIENIRUNLU1VNX1BBUlRJQUwgMwogCiAjZGVmaW5lIFNLQl9EQVRBX0FMSUdOKFgpCSgoKFgpICsgKFNNUF9DQUNIRV9CWVRFUyAtIDEpKSAmIFwKIAkJCQkgfihTTVBfQ0FDSEVfQllURVMgLSAxKSkKLSNkZWZpbmUgU0tCX01BWF9PUkRFUihYLCBPUkRFUikJKCgoUEFHRV9TSVpFIDw8IChPUkRFUikpIC0gKFgpIC0gXAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKSAmIFwKLQkJCQkgIH4oU01QX0NBQ0hFX0JZVEVTIC0gMSkpCisjZGVmaW5lIFNLQl9XSVRIX09WRVJIRUFEKFgpCVwKKwkoKChYKSAtIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSkgJiBcCisJIH4oU01QX0NBQ0hFX0JZVEVTIC0gMSkpCisjZGVmaW5lIFNLQl9NQVhfT1JERVIoWCwgT1JERVIpIFwKKwlTS0JfV0lUSF9PVkVSSEVBRCgoUEFHRV9TSVpFIDw8IChPUkRFUikpIC0gKFgpKQogI2RlZmluZSBTS0JfTUFYX0hFQUQoWCkJCShTS0JfTUFYX09SREVSKChYKSwgMCkpCiAjZGVmaW5lIFNLQl9NQVhfQUxMT0MJCShTS0JfTUFYX09SREVSKDAsIDIpKQogCkBAIC02Niw4ICs3MCw4IEBACiAgKglOT05FOiBza2IgaXMgY2hlY2tzdW1tZWQgYnkgcHJvdG9jb2wgb3IgY3N1bSBpcyBub3QgcmVxdWlyZWQuCiAgKgogICoJUEFSVElBTDogZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGNzdW0gcGFja2V0IGFzIHNlZW4gYnkgaGFyZF9zdGFydF94bWl0Ci0gKglmcm9tIHNrYi0+aC5yYXcgdG8gdGhlIGVuZCBhbmQgdG8gcmVjb3JkIHRoZSBjaGVja3N1bQotICoJYXQgc2tiLT5oLnJhdytza2ItPmNzdW0uCisgKglmcm9tIHNrYi0+dHJhbnNwb3J0X2hlYWRlciB0byB0aGUgZW5kIGFuZCB0byByZWNvcmQgdGhlIGNoZWNrc3VtCisgKglhdCBza2ItPnRyYW5zcG9ydF9oZWFkZXIgKyBza2ItPmNzdW0uCiAgKgogICoJRGV2aWNlIG11c3Qgc2hvdyBpdHMgY2FwYWJpbGl0aWVzIGluIGRldi0+ZmVhdHVyZXMsIHNldAogICoJYXQgZGV2aWNlIHNldHVwIHRpbWUuCkBAIC04MywxMiArODcsMTMgQEAKICAqLwogCiBzdHJ1Y3QgbmV0X2RldmljZTsKK3N0cnVjdCBzY2F0dGVybGlzdDsKIAotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCiBzdHJ1Y3QgbmZfY29ubnRyYWNrIHsKIAlhdG9taWNfdCB1c2U7Ci0Jdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBuZl9jb25udHJhY2sgKik7CiB9OworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogc3RydWN0IG5mX2JyaWRnZV9pbmZvIHsKQEAgLTEwMyw4ICsxMDgsNiBAQAogfTsKICNlbmRpZgogCi0jZW5kaWYKLQogc3RydWN0IHNrX2J1ZmZfaGVhZCB7CiAJLyogVGhlc2UgdHdvIG1lbWJlcnMgbXVzdCBiZSBmaXJzdC4gKi8KIAlzdHJ1Y3Qgc2tfYnVmZgkqbmV4dDsKQEAgLTE1NiwxMSArMTU5LDYgQEAKICNkZWZpbmUgU0tCX0RBVEFSRUZfU0hJRlQgMTYKICNkZWZpbmUgU0tCX0RBVEFSRUZfTUFTSyAoKDEgPDwgU0tCX0RBVEFSRUZfU0hJRlQpIC0gMSkKIAotc3RydWN0IHNrYl90aW1ldmFsIHsKLQl1MzIJb2ZmX3NlYzsKLQl1MzIJb2ZmX3VzZWM7Ci19OwotCiAKIGVudW0gewogCVNLQl9GQ0xPTkVfVU5BVkFJTEFCTEUsCkBAIC0xODEsNiArMTc5LDE2IEBACiAJU0tCX0dTT19UQ1BWNiA9IDEgPDwgNCwKIH07CiAKKyNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyNkZWZpbmUgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUIDEKKyNlbmRpZgorCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCit0eXBlZGVmIHVuc2lnbmVkIGludCBza19idWZmX2RhdGFfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKnNrX2J1ZmZfZGF0YV90OworI2VuZGlmCisKIC8qKiAKICAqCXN0cnVjdCBza19idWZmIC0gc29ja2V0IGJ1ZmZlcgogICoJQG5leHQ6IE5leHQgYnVmZmVyIGluIGxpc3QKQEAgLTE5MCwxNSArMTk4LDE3IEBACiAgKglAZGV2OiBEZXZpY2Ugd2UgYXJyaXZlZCBvbi9hcmUgbGVhdmluZyBieQogICoJQGlpZjogaWZpbmRleCBvZiBkZXZpY2Ugd2UgYXJyaXZlZCBvbgogICoJQGg6IFRyYW5zcG9ydCBsYXllciBoZWFkZXIKLSAqCUBuaDogTmV0d29yayBsYXllciBoZWFkZXIKLSAqCUBtYWM6IExpbmsgbGF5ZXIgaGVhZGVyCisgKglAbmV0d29ya19oZWFkZXI6IE5ldHdvcmsgbGF5ZXIgaGVhZGVyCisgKglAbWFjX2hlYWRlcjogTGluayBsYXllciBoZWFkZXIKICAqCUBkc3Q6IGRlc3RpbmF0aW9uIGVudHJ5CiAgKglAc3A6IHRoZSBzZWN1cml0eSBwYXRoLCB1c2VkIGZvciB4ZnJtCiAgKglAY2I6IENvbnRyb2wgYnVmZmVyLiBGcmVlIGZvciB1c2UgYnkgZXZlcnkgbGF5ZXIuIFB1dCBwcml2YXRlIHZhcnMgaGVyZQogICoJQGxlbjogTGVuZ3RoIG9mIGFjdHVhbCBkYXRhCiAgKglAZGF0YV9sZW46IERhdGEgbGVuZ3RoCiAgKglAbWFjX2xlbjogTGVuZ3RoIG9mIGxpbmsgbGF5ZXIgaGVhZGVyCi0gKglAY3N1bTogQ2hlY2tzdW0KKyAqCUBjc3VtOiBDaGVja3N1bSAobXVzdCBpbmNsdWRlIHN0YXJ0L29mZnNldCBwYWlyKQorICoJQGNzdW1fc3RhcnQ6IE9mZnNldCBmcm9tIHNrYi0+aGVhZCB3aGVyZSBjaGVja3N1bW1pbmcgc2hvdWxkIHN0YXJ0CisgKglAY3N1bV9vZmZzZXQ6IE9mZnNldCBmcm9tIGNzdW1fc3RhcnQgd2hlcmUgY2hlY2tzdW0gc2hvdWxkIGJlIHN0b3JlZAogICoJQGxvY2FsX2RmOiBhbGxvdyBsb2NhbCBmcmFnbWVudGF0aW9uCiAgKglAY2xvbmVkOiBIZWFkIG1heSBiZSBjbG9uZWQgKGNoZWNrIHJlZmNudCB0byBiZSBzdXJlKQogICoJQG5vaGRyOiBQYXlsb2FkIHJlZmVyZW5jZSBvbmx5LCBtdXN0IG5vdCBtb2RpZnkgaGVhZGVyCkBAIC0yMzMsMzIgKzI0MywxMSBAQAogCXN0cnVjdCBza19idWZmCQkqcHJldjsKIAogCXN0cnVjdCBzb2NrCQkqc2s7Ci0Jc3RydWN0IHNrYl90aW1ldmFsCXRzdGFtcDsKKwlrdGltZV90CQkJdHN0YW1wOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJaW50CQkJaWlmOwogCS8qIDQgYnl0ZSBob2xlIG9uIDY0IGJpdCovCiAKLQl1bmlvbiB7Ci0JCXN0cnVjdCB0Y3BoZHIJKnRoOwotCQlzdHJ1Y3QgdWRwaGRyCSp1aDsKLQkJc3RydWN0IGljbXBoZHIJKmljbXBoOwotCQlzdHJ1Y3QgaWdtcGhkcgkqaWdtcGg7Ci0JCXN0cnVjdCBpcGhkcgkqaXBpcGg7Ci0JCXN0cnVjdCBpcHY2aGRyCSppcHY2aDsKLQkJdW5zaWduZWQgY2hhcgkqcmF3OwotCX0gaDsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGlwaGRyCSppcGg7Ci0JCXN0cnVjdCBpcHY2aGRyCSppcHY2aDsKLQkJc3RydWN0IGFycGhkcgkqYXJwaDsKLQkJdW5zaWduZWQgY2hhcgkqcmF3OwotCX0gbmg7Ci0KLQl1bmlvbiB7Ci0JICAJdW5zaWduZWQgY2hhciAJKnJhdzsKLQl9IG1hYzsKLQogCXN0cnVjdCAgZHN0X2VudHJ5CSpkc3Q7CiAJc3RydWN0CXNlY19wYXRoCSpzcDsKIApAQCAtMjc1LDcgKzI2NCwxMCBAQAogCQkJCW1hY19sZW47CiAJdW5pb24gewogCQlfX3dzdW0JCWNzdW07Ci0JCV9fdTMyCQljc3VtX29mZnNldDsKKwkJc3RydWN0IHsKKwkJCV9fdTE2CWNzdW1fc3RhcnQ7CisJCQlfX3UxNgljc3VtX29mZnNldDsKKwkJfTsKIAl9OwogCV9fdTMyCQkJcHJpb3JpdHk7CiAJX191OAkJCWxvY2FsX2RmOjEsCkBAIC0yODksMTUgKzI4MSwxMyBAQAogCV9fYmUxNgkJCXByb3RvY29sOwogCiAJdm9pZAkJCSgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCXN0cnVjdCBuZl9jb25udHJhY2sJKm5mY3Q7CiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorCXN0cnVjdCBuZl9jb25udHJhY2sJKm5mY3Q7CiAJc3RydWN0IHNrX2J1ZmYJCSpuZmN0X3JlYXNtOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKIAlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8JKm5mX2JyaWRnZTsKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19ORVRGSUxURVIgKi8KICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJX191MTYJCQl0Y19pbmRleDsJLyogdHJhZmZpYyBjb250cm9sIGluZGV4ICovCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCkBAIC0zMTMsMTMgKzMwMywxNiBAQAogCiAJX191MzIJCQltYXJrOwogCisJc2tfYnVmZl9kYXRhX3QJCXRyYW5zcG9ydF9oZWFkZXI7CisJc2tfYnVmZl9kYXRhX3QJCW5ldHdvcmtfaGVhZGVyOworCXNrX2J1ZmZfZGF0YV90CQltYWNfaGVhZGVyOwogCS8qIFRoZXNlIGVsZW1lbnRzIG11c3QgYmUgYXQgdGhlIGVuZCwgc2VlIGFsbG9jX3NrYigpIGZvciBkZXRhaWxzLiAgKi8KKwlza19idWZmX2RhdGFfdAkJdGFpbDsKKwlza19idWZmX2RhdGFfdAkJZW5kOworCXVuc2lnbmVkIGNoYXIJCSpoZWFkLAorCQkJCSpkYXRhOwogCXVuc2lnbmVkIGludAkJdHJ1ZXNpemU7CiAJYXRvbWljX3QJCXVzZXJzOwotCXVuc2lnbmVkIGNoYXIJCSpoZWFkLAotCQkJCSpkYXRhLAotCQkJCSp0YWlsLAotCQkJCSplbmQ7CiB9OwogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMzYxLDYgKzM1NCwxMSBAQAogZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfY29weV9leHBhbmQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgaW50IG5ld2hlYWRyb29tLCBpbnQgbmV3dGFpbHJvb20sCiAJCQkJICAgICAgIGdmcF90IHByaW9yaXR5KTsKK2V4dGVybiBpbnQJICAgICAgIHNrYl90b19zZ3ZlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgb2Zmc2V0LAorCQkJCSAgICBpbnQgbGVuKTsKK2V4dGVybiBpbnQJICAgICAgIHNrYl9jb3dfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGFpbGJpdHMsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqdHJhaWxlcik7CiBleHRlcm4gaW50CSAgICAgICBza2JfcGFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBwYWQpOwogI2RlZmluZSBkZXZfa2ZyZWVfc2tiKGEpCWtmcmVlX3NrYihhKQogZXh0ZXJuIHZvaWQJICAgICAgc2tiX292ZXJfcGFuaWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbiwKQEAgLTQwMiw4ICs0MDAsMjAgQEAKIAkJCQkgICAgdW5zaWduZWQgaW50IHRvLCBzdHJ1Y3QgdHNfY29uZmlnICpjb25maWcsCiAJCQkJICAgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpOwogCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9lbmRfcG9pbnRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmhlYWQgKyBza2ItPmVuZDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9lbmRfcG9pbnRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmVuZDsKK30KKyNlbmRpZgorCiAvKiBJbnRlcm5hbCAqLwotI2RlZmluZSBza2Jfc2hpbmZvKFNLQikJCSgoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqKSgoU0tCKS0+ZW5kKSkKKyNkZWZpbmUgc2tiX3NoaW5mbyhTS0IpCSgoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqKShza2JfZW5kX3BvaW50ZXIoU0tCKSkpCiAKIC8qKgogICoJc2tiX3F1ZXVlX2VtcHR5IC0gY2hlY2sgaWYgYSBxdWV1ZSBpcyBlbXB0eQpAQCAtODIyLDEyICs4MzIsNDYgQEAKICNkZWZpbmUgU0tCX0ZSQUdfQVNTRVJUKHNrYikgCUJVR19PTihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkKICNkZWZpbmUgU0tCX0xJTkVBUl9BU1NFUlQoc2tiKSAgQlVHX09OKHNrYl9pc19ub25saW5lYXIoc2tiKSkKIAorI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfdGFpbF9wb2ludGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+aGVhZCArIHNrYi0+dGFpbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF90YWlsX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPnRhaWwgPSBza2ItPmRhdGEgLSBza2ItPmhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X3RhaWxfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBpbnQgb2Zmc2V0KQoreworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKKwlza2ItPnRhaWwgKz0gb2Zmc2V0OworfQorI2Vsc2UgLyogTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl90YWlsX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT50YWlsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGFpbF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgb2Zmc2V0OworfQorCisjZW5kaWYgLyogTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUICovCisKIC8qCiAgKglBZGQgZGF0YSB0byBhbiBza19idWZmCiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqX19za2JfcHV0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgY2hhciAqdG1wID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKnRtcCA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlTS0JfTElORUFSX0FTU0VSVChza2IpOwogCXNrYi0+dGFpbCArPSBsZW47CiAJc2tiLT5sZW4gICs9IGxlbjsKQEAgLTg0NSwxMSArODg5LDExIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXVuc2lnbmVkIGNoYXIgKnRtcCA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICp0bXAgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJU0tCX0xJTkVBUl9BU1NFUlQoc2tiKTsKIAlza2ItPnRhaWwgKz0gbGVuOwogCXNrYi0+bGVuICArPSBsZW47Ci0JaWYgKHVubGlrZWx5KHNrYi0+dGFpbD5za2ItPmVuZCkpCisJaWYgKHVubGlrZWx5KHNrYi0+dGFpbCA+IHNrYi0+ZW5kKSkKIAkJc2tiX292ZXJfcGFuaWMoc2tiLCBsZW4sIGN1cnJlbnRfdGV4dF9hZGRyKCkpOwogCXJldHVybiB0bXA7CiB9CkBAIC05NjIsNiArMTAwNiwxMzAgQEAKIAlza2ItPnRhaWwgKz0gbGVuOwogfQogCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl90cmFuc3BvcnRfaGVhZGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+aGVhZCArIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5kYXRhIC0gc2tiLT5oZWFkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICBjb25zdCBpbnQgb2Zmc2V0KQoreworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfbmV0d29ya19oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5oZWFkICsgc2tiLT5uZXR3b3JrX2hlYWRlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBza2ItPmRhdGEgLSBza2ItPmhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX21hY19oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5oZWFkICsgc2tiLT5tYWNfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2JfbWFjX2hlYWRlcl93YXNfc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bWFjX2hlYWRlciAhPSB+MFU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfbWFjX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bWFjX2hlYWRlciA9IHNrYi0+ZGF0YSAtIHNrYi0+aGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfbWFjX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBpbnQgb2Zmc2V0KQoreworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiLT5tYWNfaGVhZGVyICs9IG9mZnNldDsKK30KKworI2Vsc2UgLyogTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3RyYW5zcG9ydF9oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5kYXRhICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9uZXR3b3JrX2hlYWRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5ldHdvcmtfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfbmV0d29ya19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgaW50IG9mZnNldCkKK3sKKwlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT5kYXRhICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9tYWNfaGVhZGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bWFjX2hlYWRlcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tiX21hY19oZWFkZXJfd2FzX3NldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm1hY19oZWFkZXIgIT0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF9tYWNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF9tYWNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5kYXRhICsgb2Zmc2V0OworfQorI2VuZGlmIC8qIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVCAqLworCitzdGF0aWMgaW5saW5lIGludCBza2JfdHJhbnNwb3J0X29mZnNldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBza2JfbmV0d29ya19oZWFkZXJfbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+dHJhbnNwb3J0X2hlYWRlciAtIHNrYi0+bmV0d29ya19oZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNrYl9uZXR3b3JrX29mZnNldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtIHNrYi0+ZGF0YTsKK30KKwogLyoKICAqIENQVXMgb2Z0ZW4gdGFrZSBhIHBlcmZvcm1hbmNlIGhpdCB3aGVuIGFjY2Vzc2luZyB1bmFsaWduZWQgbWVtb3J5CiAgKiBsb2NhdGlvbnMuIFRoZSBhY3R1YWwgcGVyZm9ybWFuY2UgaGl0IHZhcmllcywgaXQgY2FuIGJlIHNtYWxsIGlmIHRoZQpAQCAtMTAxMyw4ICsxMTgxLDggQEAKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuOwogCX0KLQlza2ItPmxlbiAgPSBsZW47Ci0Jc2tiLT50YWlsID0gc2tiLT5kYXRhICsgbGVuOworCXNrYi0+bGVuID0gbGVuOworCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIH0KIAogLyoqCkBAIC0xMzI2LDggKzE0OTQsOCBAQAogCQkJCSAgICBpbnQgbGVuLCBfX3dzdW0gY3N1bSk7CiBleHRlcm4gaW50CSAgICAgICBza2JfY29weV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCiAJCQkJICAgICB2b2lkICp0bywgaW50IGxlbik7Ci1leHRlcm4gaW50CSAgICAgICBza2Jfc3RvcmVfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAotCQkJCSAgICAgIHZvaWQgKmZyb20sIGludCBsZW4pOworZXh0ZXJuIGludAkgICAgICAgc2tiX3N0b3JlX2JpdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKKwkJCQkgICAgICBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKTsKIGV4dGVybiBfX3dzdW0JICAgICAgIHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgaW50IG9mZnNldCwgdTggKnRvLCBpbnQgbGVuLAogCQkJCQkgICAgICBfX3dzdW0gY3N1bSk7CkBAIC0xMzUxLDggKzE1MTksMzYgQEAKIAlyZXR1cm4gYnVmZmVyOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgIHZvaWQgKnRvLAorCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pCit7CisJbWVtY3B5KHRvLCBza2ItPmRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICAgIGNvbnN0IGludCBvZmZzZXQsIHZvaWQgKnRvLAorCQkJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pCit7CisJbWVtY3B5KHRvLCBza2ItPmRhdGEgKyBvZmZzZXQsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfY29weV90b19saW5lYXJfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICBjb25zdCB2b2lkICpmcm9tLAorCQkJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVuKQoreworCW1lbWNweShza2ItPmRhdGEsIGZyb20sIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgY29uc3QgaW50IG9mZnNldCwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJCSAgY29uc3QgdW5zaWduZWQgaW50IGxlbikKK3sKKwltZW1jcHkoc2tiLT5kYXRhICsgb2Zmc2V0LCBmcm9tLCBsZW4pOworfQorCiBleHRlcm4gdm9pZCBza2JfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHNrYl9hZGRfbXR1KGludCBtdHUpOwogCiAvKioKICAqCXNrYl9nZXRfdGltZXN0YW1wIC0gZ2V0IHRpbWVzdGFtcCBmcm9tIGEgc2tiCkBAIC0xMzY1LDI5ICsxNTYxLDI4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZ2V0X3RpbWVzdGFtcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGltZXZhbCAqc3RhbXApCiB7Ci0Jc3RhbXAtPnR2X3NlYyAgPSBza2ItPnRzdGFtcC5vZmZfc2VjOwotCXN0YW1wLT50dl91c2VjID0gc2tiLT50c3RhbXAub2ZmX3VzZWM7CisJKnN0YW1wID0ga3RpbWVfdG9fdGltZXZhbChza2ItPnRzdGFtcCk7CiB9CiAKLS8qKgotICogCXNrYl9zZXRfdGltZXN0YW1wIC0gc2V0IHRpbWVzdGFtcCBvZiBhIHNrYgotICoJQHNrYjogc2tiIHRvIHNldCBzdGFtcCBvZgotICoJQHN0YW1wOiBwb2ludGVyIHRvIHN0cnVjdCB0aW1ldmFsIHRvIGdldCBzdGFtcCBmcm9tCi0gKgotICoJVGltZXN0YW1wcyBhcmUgc3RvcmVkIGluIHRoZSBza2IgYXMgb2Zmc2V0cyB0byBhIGJhc2UgdGltZXN0YW1wLgotICoJVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cnVjdCB0aW1ldmFsIHRvIGFuIG9mZnNldCBhbmQgc3RvcmVzCi0gKglpdCBpbiB0aGUgc2tiLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnN0YW1wKQorc3RhdGljIGlubGluZSB2b2lkIF9fbmV0X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrYi0+dHN0YW1wLm9mZl9zZWMgID0gc3RhbXAtPnR2X3NlYzsKLQlza2ItPnRzdGFtcC5vZmZfdXNlYyA9IHN0YW1wLT50dl91c2VjOworCXNrYi0+dHN0YW1wID0ga3RpbWVfZ2V0X3JlYWwoKTsKIH0KIAotZXh0ZXJuIHZvaWQgX19uZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGlubGluZSBrdGltZV90IG5ldF90aW1lZGVsdGEoa3RpbWVfdCB0KQoreworCXJldHVybiBrdGltZV9zdWIoa3RpbWVfZ2V0X3JlYWwoKSwgdCk7Cit9CiAKKworZXh0ZXJuIF9fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKIGV4dGVybiBfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpOwogCitzdGF0aWMgaW5saW5lIGludCBza2JfY3N1bV91bm5lY2Vzc2FyeShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmlwX3N1bW1lZCAmIENIRUNLU1VNX1VOTkVDRVNTQVJZOworfQorCiAvKioKICAqCXNrYl9jaGVja3N1bV9jb21wbGV0ZSAtIENhbGN1bGF0ZSBjaGVja3N1bSBvZiBhbiBlbnRpcmUgcGFja2V0CiAgKglAc2tiOiBwYWNrZXQgdG8gcHJvY2VzcwpAQCAtMTQwNiwyMiArMTYwMSwyMiBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBza2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKLQkJX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKKwlyZXR1cm4gc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSA/CisJICAgICAgIDAgOiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwogfQogCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKK2V4dGVybiB2b2lkIG5mX2Nvbm50cmFja19kZXN0cm95KHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpOwogc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19wdXQoc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKIHsKIAlpZiAobmZjdCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZuZmN0LT51c2UpKQotCQluZmN0LT5kZXN0cm95KG5mY3QpOworCQluZl9jb25udHJhY2tfZGVzdHJveShuZmN0KTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfZ2V0KHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJaWYgKG5mY3QpCiAJCWF0b21pY19pbmMoJm5mY3QtPnVzZSk7CiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19nZXRfcmVhc20oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiKQpAQCAtMTQ0Nyw5ICsxNjQyLDkgQEAKICNlbmRpZiAvKiBDT05GSUdfQlJJREdFX05FVEZJTFRFUiAqLwogc3RhdGljIGlubGluZSB2b2lkIG5mX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogCW5mX2Nvbm50cmFja19wdXQoc2tiLT5uZmN0KTsKIAlza2ItPm5mY3QgPSBOVUxMOwotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAluZl9jb25udHJhY2tfcHV0X3JlYXNtKHNrYi0+bmZjdF9yZWFzbSk7CiAJc2tiLT5uZmN0X3JlYXNtID0gTlVMTDsKICNlbmRpZgpAQCAtMTQ1OSw5ICsxNjU0LDMzIEBACiAjZW5kaWYKIH0KIAotI2Vsc2UgLyogQ09ORklHX05FVEZJTFRFUiAqLwotc3RhdGljIGlubGluZSB2b2lkIG5mX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpIHt9Ci0jZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLworLyogTm90ZTogVGhpcyBkb2Vzbid0IHB1dCBhbnkgY29ubnRyYWNrIGFuZCBicmlkZ2UgaW5mbyBpbiBkc3QuICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19uZl9jb3B5KHN0cnVjdCBza19idWZmICpkc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpzcmMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorCWRzdC0+bmZjdCA9IHNyYy0+bmZjdDsKKwluZl9jb25udHJhY2tfZ2V0KHNyYy0+bmZjdCk7CisJZHN0LT5uZmN0aW5mbyA9IHNyYy0+bmZjdGluZm87CisJZHN0LT5uZmN0X3JlYXNtID0gc3JjLT5uZmN0X3JlYXNtOworCW5mX2Nvbm50cmFja19nZXRfcmVhc20oc3JjLT5uZmN0X3JlYXNtKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJZHN0LT5uZl9icmlkZ2UgID0gc3JjLT5uZl9icmlkZ2U7CisJbmZfYnJpZGdlX2dldChzcmMtPm5mX2JyaWRnZSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mX2NvcHkoc3RydWN0IHNrX2J1ZmYgKmRzdCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNyYykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisJbmZfY29ubnRyYWNrX3B1dChkc3QtPm5mY3QpOworCW5mX2Nvbm50cmFja19wdXRfcmVhc20oZHN0LT5uZmN0X3JlYXNtKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJbmZfYnJpZGdlX3B1dChkc3QtPm5mX2JyaWRnZSk7CisjZW5kaWYKKwlfX25mX2NvcHkoZHN0LCBzcmMpOworfQogCiAjaWZkZWYgQ09ORklHX05FVFdPUktfU0VDTUFSSwogc3RhdGljIGlubGluZSB2b2lkIHNrYl9jb3B5X3NlY21hcmsoc3RydWN0IHNrX2J1ZmYgKnRvLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSkKQEAgLTE0ODYsNSArMTcwNSwxMiBAQAogCXJldHVybiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2ZvcndhcmRfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIG9uZS4gIEFueSBicmF2ZSBzb3Vscz8gKi8KKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKK30KKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfU0tCVUZGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IGZjZDM1YTIuLjZlN2M5NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMTg4LDcgKzE4OCw4IEBACiAjZGVmaW5lIEFGX1RJUEMJCTMwCS8qIFRJUEMgc29ja2V0cwkJCSovCiAjZGVmaW5lIEFGX0JMVUVUT09USAkzMQkvKiBCbHVldG9vdGggc29ja2V0cyAJCSovCiAjZGVmaW5lIEFGX0lVQ1YJCTMyCS8qIElVQ1Ygc29ja2V0cwkJCSovCi0jZGVmaW5lIEFGX01BWAkJMzMJLyogRm9yIG5vdy4uICovCisjZGVmaW5lIEFGX1JYUlBDCTMzCS8qIFJ4UlBDIHNvY2tldHMgCQkqLworI2RlZmluZSBBRl9NQVgJCTM0CS8qIEZvciBub3cuLiAqLwogCiAvKiBQcm90b2NvbCBmYW1pbGllcywgc2FtZSBhcyBhZGRyZXNzIGZhbWlsaWVzLiAqLwogI2RlZmluZSBQRl9VTlNQRUMJQUZfVU5TUEVDCkBAIC0yMjIsNiArMjIzLDcgQEAKICNkZWZpbmUgUEZfVElQQwkJQUZfVElQQwogI2RlZmluZSBQRl9CTFVFVE9PVEgJQUZfQkxVRVRPT1RICiAjZGVmaW5lIFBGX0lVQ1YJCUFGX0lVQ1YKKyNkZWZpbmUgUEZfUlhSUEMJQUZfUlhSUEMKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIAogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KQEAgLTI4NCw2ICsyODYsNyBAQAogI2RlZmluZSBTT0xfRENDUAkyNjkKICNkZWZpbmUgU09MX05FVExJTksJMjcwCiAjZGVmaW5lIFNPTF9USVBDCTI3MQorI2RlZmluZSBTT0xfUlhSUEMJMjcyCiAKIC8qIElQWCBvcHRpb25zICovCiAjZGVmaW5lIElQWF9UWVBFCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCmluZGV4IDlhODk3MGIuLjQ3ZjFjNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtMjkwLDYgKzI5MCw3IEBACiAJTkVUX0NPUkVfQlVER0VUPTE5LAogCU5FVF9DT1JFX0FFVkVOVF9FVElNRT0yMCwKIAlORVRfQ09SRV9BRVZFTlRfUlNFUVRIPTIxLAorCU5FVF9DT1JFX1dBUk5JTkdTPTIyLAogfTsKIAogLyogL3Byb2Mvc3lzL25ldC9ldGhlcm5ldCAqLwpAQCAtNDM4LDYgKzQzOSw4IEBACiAJTkVUX0NJUFNPVjRfUkJNX1NUUklDVFZBTElEPTEyMSwKIAlORVRfVENQX0FWQUlMX0NPTkdfQ09OVFJPTD0xMjIsCiAJTkVUX1RDUF9BTExPV0VEX0NPTkdfQ09OVFJPTD0xMjMsCisJTkVUX1RDUF9NQVhfU1NUSFJFU0g9MTI0LAorCU5FVF9UQ1BfRlJUT19SRVNQT05TRT0xMjUsCiB9OwogCiBlbnVtIHsKQEAgLTc4OSw2ICs3OTIsNyBAQAogCU5FVF9CUklER0VfTkZfQ0FMTF9JUFRBQkxFUyA9IDIsCiAJTkVUX0JSSURHRV9ORl9DQUxMX0lQNlRBQkxFUyA9IDMsCiAJTkVUX0JSSURHRV9ORl9GSUxURVJfVkxBTl9UQUdHRUQgPSA0LAorCU5FVF9CUklER0VfTkZfRklMVEVSX1BQUE9FX1RBR0dFRCA9IDUsCiB9OwogCiAvKiBDVExfRlMgbmFtZXM6ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCAyOWQzMDg5Li5jNmI5ZjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTE3OCw2ICsxNzgsMjEgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRjcGhkciAqdGNwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHRjcGhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRjcF9oZHJsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gdGNwX2hkcihza2IpLT5kb2ZmICogNDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGNwX29wdGxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAodGNwX2hkcihza2IpLT5kb2ZmIC0gNSkgKiA0OworfQorCiAvKiBUaGlzIGRlZmluZXMgYSBzZWxlY3RpdmUgYWNrbm93bGVkZ2VtZW50IGJsb2NrLiAqLwogc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgewogCV9fYmUzMglzdGFydF9zZXE7CkBAIC0yNDIsNiArMjU3LDggQEAKICAqCVNlZSBSRkM3OTMgYW5kIFJGQzExMjIuIFRoZSBSRkMgd3JpdGVzIHRoZXNlIGluIGNhcGl0YWxzLgogICovCiAgCXUzMglyY3Zfbnh0OwkvKiBXaGF0IHdlIHdhbnQgdG8gcmVjZWl2ZSBuZXh0IAkqLworCXUzMgljb3BpZWRfc2VxOwkvKiBIZWFkIG9mIHlldCB1bnJlYWQgZGF0YQkJKi8KKwl1MzIJcmN2X3d1cDsJLyogcmN2X254dCBvbiBsYXN0IHdpbmRvdyB1cGRhdGUgc2VudAkqLwogIAl1MzIJc25kX254dDsJLyogTmV4dCBzZXF1ZW5jZSB3ZSBzZW5kCQkqLwogCiAgCXUzMglzbmRfdW5hOwkvKiBGaXJzdCBieXRlIHdlIHdhbnQgYW4gYWNrIGZvcgkqLwpAQCAtMzAwLDE3ICszMTcsMTUgQEAKICAJdTMyCXNuZF9zc3RocmVzaDsJLyogU2xvdyBzdGFydCBzaXplIHRocmVzaG9sZAkJKi8KICAJdTMyCXNuZF9jd25kOwkvKiBTZW5kaW5nIGNvbmdlc3Rpb24gd2luZG93CQkqLwogIAl1MTYJc25kX2N3bmRfY250OwkvKiBMaW5lYXIgaW5jcmVhc2UgY291bnRlcgkJKi8KLQl1MTYJc25kX2N3bmRfY2xhbXA7IC8qIERvIG5vdCBhbGxvdyBzbmRfY3duZCB0byBncm93IGFib3ZlIHRoaXMgKi8KKwl1MzIJc25kX2N3bmRfY2xhbXA7IC8qIERvIG5vdCBhbGxvdyBzbmRfY3duZCB0byBncm93IGFib3ZlIHRoaXMgKi8KIAl1MzIJc25kX2N3bmRfdXNlZDsKIAl1MzIJc25kX2N3bmRfc3RhbXA7CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCW91dF9vZl9vcmRlcl9xdWV1ZTsgLyogT3V0IG9mIG9yZGVyIHNlZ21lbnRzIGdvIGhlcmUgKi8KIAogIAl1MzIJcmN2X3duZDsJLyogQ3VycmVudCByZWNlaXZlciB3aW5kb3cJCSovCi0JdTMyCXJjdl93dXA7CS8qIHJjdl9ueHQgb24gbGFzdCB3aW5kb3cgdXBkYXRlIHNlbnQJKi8KIAl1MzIJd3JpdGVfc2VxOwkvKiBUYWlsKCsxKSBvZiBkYXRhIGhlbGQgaW4gdGNwIHNlbmQgYnVmZmVyICovCiAJdTMyCXB1c2hlZF9zZXE7CS8qIExhc3QgcHVzaGVkIHNlcSwgcmVxdWlyZWQgdG8gdGFsayB0byB3aW5kb3dzICovCi0JdTMyCWNvcGllZF9zZXE7CS8qIEhlYWQgb2YgeWV0IHVucmVhZCBkYXRhCQkqLwogCiAvKglTQUNLcyBkYXRhCSovCiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrIGR1cGxpY2F0ZV9zYWNrWzFdOyAvKiBELVNBQ0sgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWRwLmggYi9pbmNsdWRlL2xpbnV4L3VkcC5oCmluZGV4IDdlMDhjMDcuLjZkZTQ0NWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWRwLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZHAuaApAQCAtMjYsNiArMjYsMTUgQEAKIAlfX3N1bTE2CWNoZWNrOwogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRwaGRyICp1ZHBfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgdWRwaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiAvKiBVRFAgc29ja2V0IG9wdGlvbnMgKi8KICNkZWZpbmUgVURQX0NPUksJMQkvKiBOZXZlciBzZW5kIHBhcnRpYWxseSBjb21wbGV0ZSBzZWdtZW50cyAqLwogI2RlZmluZSBVRFBfRU5DQVAJMTAwCS8qIFNldCB0aGUgc29ja2V0IHRvIGFjY2VwdCBlbmNhcHN1bGF0ZWQgcGFja2V0cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaCBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKaW5kZXggMmE3YjM4ZC4uYjhhYmZjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCkBAIC0xOTEsMTQgKzE5MSwxNSBAQAogCiAvKgogICogS2lsbCBvZmYgYSBwZW5kaW5nIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpLiAgTm90ZSB0aGF0IHRoZSB3b3JrIGNhbGxiYWNrCi0gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZyBvbiByZXR1cm4gZnJvbSBjYW5jZWxfZGVsYXllZF93b3JrKCkuICBSdW4KLSAqIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgdG8gd2FpdCBvbiBpdC4KKyAqIGZ1bmN0aW9uIG1heSBzdGlsbCBiZSBydW5uaW5nIG9uIHJldHVybiBmcm9tIGNhbmNlbF9kZWxheWVkX3dvcmsoKSwgdW5sZXNzCisgKiBpdCByZXR1cm5zIDEgYW5kIHRoZSB3b3JrIGRvZXNuJ3QgcmUtYXJtIGl0c2VsZi4gUnVuIGZsdXNoX3dvcmtxdWV1ZSgpIG9yCisgKiBjYW5jZWxfd29ya19zeW5jKCkgdG8gd2FpdCBvbiBpdC4KICAqLwogc3RhdGljIGlubGluZSBpbnQgY2FuY2VsX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQogewogCWludCByZXQ7CiAKLQlyZXQgPSBkZWxfdGltZXJfc3luYygmd29yay0+dGltZXIpOworCXJldCA9IGRlbF90aW1lcigmd29yay0+dGltZXIpOwogCWlmIChyZXQpCiAJCXdvcmtfcmVsZWFzZSgmd29yay0+d29yayk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveGZybS5oIGIvaW5jbHVkZS9saW51eC94ZnJtLmgKaW5kZXggMTVjYTg5ZS4uOWM2NTZhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC94ZnJtLmgKKysrIGIvaW5jbHVkZS9saW51eC94ZnJtLmgKQEAgLTE4MSw2ICsxODEsMTAgQEAKIAlYRlJNX01TR19NSUdSQVRFLAogI2RlZmluZSBYRlJNX01TR19NSUdSQVRFIFhGUk1fTVNHX01JR1JBVEUKIAorCVhGUk1fTVNHX05FV1NBRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX05FV1NBRElORk8gWEZSTV9NU0dfTkVXU0FESU5GTworCVhGUk1fTVNHX0dFVFNBRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX0dFVFNBRElORk8gWEZSTV9NU0dfR0VUU0FESU5GTwogCV9fWEZSTV9NU0dfTUFYCiB9OwogI2RlZmluZSBYRlJNX01TR19NQVggKF9fWEZSTV9NU0dfTUFYIC0gMSkKQEAgLTIzNCw2ICsyMzgsMTcgQEAKICNkZWZpbmUgWEZSTV9BRV9NQVggKF9fWEZSTV9BRV9NQVggLSAxKQogfTsKIAorLyogU0FEIFRhYmxlIGZpbHRlciBmbGFncyAgKi8KK2VudW0geGZybV9zYWRfZnR5cGVfdCB7CisJWEZSTV9TQURfVU5TUEVDLAorCVhGUk1fU0FEX0hNQVNLPTEsCisJWEZSTV9TQURfSE1BWD0yLAorCVhGUk1fU0FEX0NOVD00LAorCV9fWEZSTV9TQURfTUFYCisKKyNkZWZpbmUgWEZSTV9TQURfTUFYIChfX1hGUk1fU0FEX01BWCAtIDEpCit9OworCiBzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgewogCV9fdTgJCXR5cGU7CiAJX191MTYJCXJlc2VydmVkMTsKQEAgLTI2NSw2ICsyODAsMTYgQEAKICNkZWZpbmUgWEZSTUFfTUFYIChfX1hGUk1BX01BWCAtIDEpCiB9OwogCitlbnVtIHhmcm1fc2FkYXR0cl90eXBlX3QgeworCVhGUk1BX1NBRF9VTlNQRUMsCisJWEZSTUFfU0FESE1BU0ssCisJWEZSTUFfU0FESE1BWCwKKwlYRlJNQV9TQURDTlQsCisJX19YRlJNQV9TQURfTUFYCisKKyNkZWZpbmUgWEZSTUFfU0FEX01BWCAoX19YRlJNQV9TQURfTUFYIC0gMSkKK307CisKIHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvIHsKIAlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOwogCXN0cnVjdCB4ZnJtX2lkCQkJaWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCA4OGRmOGZjLi5mMzUzMWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTczLDcgKzczLDkgQEAKIGV4dGVybiBpbnQJCQlpcHY2X2Rldl9nZXRfc2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCiAJCQkJCSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAogCQkJCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpzYWRkcik7Ci1leHRlcm4gaW50CQkJaXB2Nl9nZXRfbGxhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqKTsKK2V4dGVybiBpbnQJCQlpcHY2X2dldF9sbGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBpbjZfYWRkciAqYWRkciwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgYmFubmVkX2ZsYWdzKTsKIGV4dGVybiBpbnQJCQlpcHY2X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAogCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IHNvY2sgKnNrMik7CiBleHRlcm4gdm9pZAkJCWFkZHJjb25mX2pvaW5fc29saWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZl9yeHJwYy5oIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMyZWFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApAQCAtMCwwICsxLDU3IEBACisvKiBSeFJQQyBrZXJuZWwgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTkVUX1JYUlBDX0gKKyNkZWZpbmUgX05FVF9SWFJQQ19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9yeHJwYy5oPgorCitzdHJ1Y3QgcnhycGNfY2FsbDsKKworLyoKKyAqIHRoZSBtYXJrIGFwcGxpZWQgdG8gc29ja2V0IGJ1ZmZlcnMgdGhhdCBtYXkgYmUgaW50ZXJjZXB0ZWQKKyAqLworZW51bSB7CisJUlhSUENfU0tCX01BUktfREFUQSwJCS8qIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSywJLyogZmluYWwgQUNLIHJlY2VpdmVkIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19CVVNZLAkJLyogc2VydmVyIGJ1c3kgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVCwJLyogcmVtb3RlIGFib3J0IG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19ORVRfRVJST1IsCS8qIG5ldHdvcmsgZXJyb3IgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SLAkvKiBsb2NhbCBlcnJvciBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfTkVXX0NBTEwsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoKnJ4cnBjX2ludGVyY2VwdG9yX3QpKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGxvbmcsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICosCisJCQkJCSAgICAgICByeHJwY19pbnRlcmNlcHRvcl90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoc3RydWN0IHNvY2tldCAqLAorCQkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwKKwkJCQkJCSAgc3RydWN0IGtleSAqLAorCQkJCQkJICB1bnNpZ25lZCBsb25nLAorCQkJCQkJICBnZnBfdCk7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IG1zZ2hkciAqLAorCQkJCSAgc2l6ZV90KTsKK2V4dGVybiB2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIHUzMik7CitleHRlcm4gdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7CitleHRlcm4gYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHUzMiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqLAorCQkJCQkJICAgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICopOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9ORVRfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXgyNS5oIGIvaW5jbHVkZS9uZXQvYXgyNS5oCmluZGV4IDQ3ZmYyZjQuLjk5YTRlMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2F4MjUuaAorKysgYi9pbmNsdWRlL25ldC9heDI1LmgKQEAgLTI2Myw4ICsyNjMsOCBAQAogc3RhdGljIGlubGluZSBfX2JlMTYgYXgyNV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc2tiLT5kZXYgICAgICA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOwogCXJldHVybiBodG9ucyhFVEhfUF9BWDI1KTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCmluZGV4IDQxNDU2YzEuLjkzY2UyNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKQEAgLTcwOSw2ICs3MDksMjQgQEAKIAlfX3U4IAlkbGVuOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CitzdGF0aWMgaW5saW5lIHN0cnVjdCBoY2lfZXZlbnRfaGRyICpoY2lfZXZlbnRfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKXNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2FjbF9oZHIgKmhjaV9hY2xfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaGNpX2FjbF9oZHIgKilza2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9zY29faGRyICpoY2lfc2NvX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGhjaV9zY29faGRyICopc2tiLT5kYXRhOworfQorI2VuZGlmCisKIC8qIENvbW1hbmQgb3Bjb2RlIHBhY2svdW5wYWNrICovCiAjZGVmaW5lIGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikJKF9fdTE2KSAoKG9jZiAmIDB4MDNmZil8KG9nZiA8PCAxMCkpCiAjZGVmaW5lIGhjaV9vcGNvZGVfb2dmKG9wKQkJKG9wID4+IDEwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfX05FVF9DRkc4MDIxMV9ICisjZGVmaW5lIF9fTkVUX0NGRzgwMjExX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisKKy8qCisgKiA4MDIuMTEgY29uZmlndXJhdGlvbiBpbi1rZXJuZWwgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqLworCisvKiBmcm9tIG5ldC93aXJlbGVzcy5oICovCitzdHJ1Y3Qgd2lwaHk7CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX29wcyAtIGJhY2tlbmQgZGVzY3JpcHRpb24gZm9yIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGlzIHN0cnVjdCBpcyByZWdpc3RlcmVkIGJ5IGZ1bGxtYWMgY2FyZCBkcml2ZXJzIGFuZC9vciB3aXJlbGVzcyBzdGFja3MKKyAqIGluIG9yZGVyIHRvIGhhbmRsZSBjb25maWd1cmF0aW9uIHJlcXVlc3RzIG9uIHRoZWlyIGludGVyZmFjZXMuCisgKgorICogQWxsIGNhbGxiYWNrcyBleGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkIHNob3VsZCByZXR1cm4gMAorICogb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogQWxsIG9wZXJhdGlvbnMgYXJlIGN1cnJlbnRseSBpbnZva2VkIHVuZGVyIHJ0bmwgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlCisgKiB3aXJlbGVzcyBleHRlbnNpb25zIGJ1dCB0aGlzIGlzIHN1YmplY3QgdG8gcmVldmFsdWF0aW9uIGFzIHNvb24gYXMgdGhpcworICogY29kZSBpcyB1c2VkIG1vcmUgd2lkZWx5IGFuZCB3ZSBoYXZlIGEgZmlyc3QgdXNlciB3aXRob3V0IHdleHQuCisgKgorICogQGFkZF92aXJ0dWFsX2ludGY6IGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKgorICogQGRlbF92aXJ0dWFsX2ludGY6IHJlbW92ZSB0aGUgdmlydHVhbCBpbnRlcmZhY2UgZGV0ZXJtaW5lZCBieSBpZmluZGV4LgorICovCitzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKKwlpbnQJKCphZGRfdmlydHVhbF9pbnRmKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdHlwZSk7CisJaW50CSgqZGVsX3ZpcnR1YWxfaW50Zikoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50IGlmaW5kZXgpOworfTsKKworI2VuZGlmIC8qIF9fTkVUX0NGRzgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaCBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAppbmRleCA0Yzk1MjJjLi40ZjkwZjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCkBAIC0xMjAsNyArMTIwLDcgQEAKICAqLwogCiAjZGVmaW5lIENJUFNPX1Y0X09QVEVYSVNUKHgpIChJUENCKHgpLT5vcHQuY2lwc28gIT0gMCkKLSNkZWZpbmUgQ0lQU09fVjRfT1BUUFRSKHgpICgoeCktPm5oLnJhdyArIElQQ0IoeCktPm9wdC5jaXBzbykKKyNkZWZpbmUgQ0lQU09fVjRfT1BUUFRSKHgpIChza2JfbmV0d29ya19oZWFkZXIoeCkgKyBJUENCKHgpLT5vcHQuY2lwc28pCiAKIC8qCiAgKiBET0kgTGlzdCBGdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NvbXBhdC5oIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKaW5kZXggOTg1OWI2MC4uNDA2ZGIyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKQEAgLTI1LDYgKzI1LDcgQEAKIH07CiAKIGV4dGVybiBpbnQgY29tcGF0X3NvY2tfZ2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKik7CitleHRlcm4gaW50IGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyhzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopOwogCiAjZWxzZSAvKiBkZWZpbmVkKENPTkZJR19DT01QQVQpICovCiAjZGVmaW5lIGNvbXBhdF9tc2doZHIJbXNnaGRyCQkvKiB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZG5fZmliLmggYi9pbmNsdWRlL25ldC9kbl9maWIuaAppbmRleCBmMDE2MjZjLi4zMDEyNTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9maWIuaAorKysgYi9pbmNsdWRlL25ldC9kbl9maWIuaApAQCAtMTQ4LDE3ICsxNDgsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGRuZXRfYWRkcl90eXBlKF9fbGUxNiBhZGRyKTsKIGV4dGVybiBpbnQgZG5fZmliX2xvb2t1cChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKTsKIAotLyoKLSAqIHJ0bmV0bGluayBpbnRlcmZhY2UKLSAqLwotZXh0ZXJuIGludCBkbl9maWJfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBkbl9maWJfcnRtX25ld3JvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwogZXh0ZXJuIGludCBkbl9maWJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCi1leHRlcm4gaW50IGRuX2ZpYl9ydG1fZGVscnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgZG5fZmliX3J0bV9uZXdydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBkbl9maWJfZHVtcF9ydWxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotCiBleHRlcm4gdm9pZCBkbl9maWJfZnJlZV9pbmZvKHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG5fZmliX2luZm9fcHV0KHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oIGIvaW5jbHVkZS9uZXQvZG5fcm91dGUuaAppbmRleCBhNTY2OTQ0Li5jMTBlOGU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmgKQEAgLTE4LDcgKzE4LDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqZG5fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGdmcF90IHByaSk7CiBleHRlcm4gaW50IGRuX3JvdXRlX291dHB1dF9zb2NrKHN0cnVjdCBkc3RfZW50cnkgKipwcHJ0LCBzdHJ1Y3QgZmxvd2kgKiwgc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBkbl9jYWNoZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci1leHRlcm4gaW50IGRuX2NhY2hlX2dldHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwogZXh0ZXJuIHZvaWQgZG5fcnRfY2FjaGVfZmx1c2goaW50IGRlbGF5KTsKIAogLyogTWFza3MgZm9yIGZsYWdzIGZpZWxkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9lc3AuaCBiL2luY2x1ZGUvbmV0L2VzcC5oCmluZGV4IDcxM2QwMzlmLi5kMDVkOGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9lc3AuaAorKysgYi9pbmNsdWRlL25ldC9lc3AuaApAQCAtNDAsOCArNDAsNiBAQAogCX0gYXV0aDsKIH07CiAKLWV4dGVybiBpbnQgc2tiX3RvX3NndmVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBvZmZzZXQsIGludCBsZW4pOwotZXh0ZXJuIGludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpOwogZXh0ZXJuIHZvaWQgKnBza2JfcHV0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICp0YWlsLCBpbnQgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQgZXNwX21hY19kaWdlc3Qoc3RydWN0IGVzcF9kYXRhICplc3AsIHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCmluZGV4IGQ1ODVlYTkuLmVkM2E4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCkBAIC01LDcgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpYl9ydWxlcy5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBmaWJfcnVsZQogewpAQCAtMTksNiArMTksOCBAQAogCXUzMgkJCWZsYWdzOwogCXUzMgkJCXRhYmxlOwogCXU4CQkJYWN0aW9uOworCXUzMgkJCXRhcmdldDsKKwlzdHJ1Y3QgZmliX3J1bGUgKgljdGFyZ2V0OwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogfTsKIApAQCAtMzUsNiArMzcsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlpbnQJCQlydWxlX3NpemU7CiAJaW50CQkJYWRkcl9zaXplOworCWludAkJCXVucmVzb2x2ZWRfcnVsZXM7CisJaW50CQkJbnJfZ290b19ydWxlczsKIAogCWludAkJCSgqYWN0aW9uKShzdHJ1Y3QgZmliX3J1bGUgKiwKIAkJCQkJICBzdHJ1Y3QgZmxvd2kgKiwgaW50LApAQCAtNTUsNiArNTksMTAgQEAKIAl1MzIJCQkoKmRlZmF1bHRfcHJlZikodm9pZCk7CiAJc2l6ZV90CQkJKCpubG1zZ19wYXlsb2FkKShzdHJ1Y3QgZmliX3J1bGUgKik7CiAKKwkvKiBDYWxsZWQgYWZ0ZXIgbW9kaWZpY2F0aW9ucyB0byB0aGUgcnVsZXMgc2V0LCBtdXN0IGZsdXNoCisJICogdGhlIHJvdXRlIGNhY2hlIGlmIG9uZSBleGlzdHMuICovCisJdm9pZAkJCSgqZmx1c2hfY2FjaGUpKHZvaWQpOworCiAJaW50CQkJbmxncm91cDsKIAlzdHJ1Y3QgbmxhX3BvbGljeQkqcG9saWN5OwogCXN0cnVjdCBsaXN0X2hlYWQJKnJ1bGVzX2xpc3Q7CkBAIC02Niw3ICs3NCw4IEBACiAJW0ZSQV9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCiAJW0ZSQV9GV01BUktdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAogCVtGUkFfRldNQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKLQlbRlJBX1RBQkxFXSAgICAgPSB7IC50eXBlID0gTkxBX1UzMiB9CisJW0ZSQV9UQUJMRV0gICAgID0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAorCVtGUkFfR09UT10JPSB7IC50eXBlID0gTkxBX1UzMiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWJfcnVsZV9nZXQoc3RydWN0IGZpYl9ydWxlICpydWxlKQogewpAQCAtOTgsMTEgKzEwNyw0IEBACiBleHRlcm4gaW50CQkJZmliX3J1bGVzX2xvb2t1cChzdHJ1Y3QgZmliX3J1bGVzX29wcyAqLAogCQkJCQkJIHN0cnVjdCBmbG93aSAqLCBpbnQgZmxhZ3MsCiAJCQkJCQkgc3RydWN0IGZpYl9sb29rdXBfYXJnICopOwotCi1leHRlcm4gaW50CQkJZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqLCB2b2lkICopOwotZXh0ZXJuIGludAkJCWZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQJCQlmaWJfcnVsZXNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKiwgaW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oIGIvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCmluZGV4IGMyOGU0MjQuLjY2ODA1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKQEAgLTE5LDYgKzE5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorCisjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIApAQCAtMjgsMTIgKzMxLDExIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpbmV0Nl9laGFzaGZuKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsIGNvbnN0IHUxNiBscG9ydCwKIAkJCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyLCBjb25zdCBfX2JlMTYgZnBvcnQpCiB7Ci0JdW5zaWduZWQgaW50IGhhc2hlbnQgPSAobHBvcnQgXiAoX19mb3JjZSB1MTYpZnBvcnQpOworCXUzMiBwb3J0cyA9IChscG9ydCBeIChfX2ZvcmNlIHUxNilmcG9ydCk7CiAKLQloYXNoZW50IF49IChfX2ZvcmNlIHUzMikobGFkZHItPnM2X2FkZHIzMlszXSBeIGZhZGRyLT5zNl9hZGRyMzJbM10pOwotCWhhc2hlbnQgXj0gaGFzaGVudCA+PiAxNjsKLQloYXNoZW50IF49IGhhc2hlbnQgPj4gODsKLQlyZXR1cm4gaGFzaGVudDsKKwlyZXR1cm4gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMilsYWRkci0+czZfYWRkcjMyWzNdLAorCQkJICAgIChfX2ZvcmNlIHUzMilmYWRkci0+czZfYWRkcjMyWzNdLAorCQkJICAgIHBvcnRzLCBpbmV0X2VoYXNoX3NlY3JldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGluZXQ2X3NrX2VoYXNoZm4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaCBiL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKaW5kZXggMTAxMTdjOC4uZGU4Mzk5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogewogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCWlmIChza2ItPm5oLnJhdyArIHNpemVvZihzdHJ1Y3QgaXBoZHIpIDw9IHNrYi0+dGFpbCkKLQkJCXJldHVybiBJUF9FQ05fc2V0X2NlKHNrYi0+bmguaXBoKTsKKwkJaWYgKHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSA8PSBza2ItPnRhaWwpCisJCQlyZXR1cm4gSVBfRUNOX3NldF9jZShpcF9oZHIoc2tiKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgotCQlpZiAoc2tiLT5uaC5yYXcgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDw9IHNrYi0+dGFpbCkKLQkJCXJldHVybiBJUDZfRUNOX3NldF9jZShza2ItPm5oLmlwdjZoKTsKKwkJaWYgKHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDw9IHNrYi0+dGFpbCkKKwkJCXJldHVybiBJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCmluZGV4IGNlNmRhOTcuLjYyZGFmMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAKICNpbmNsdWRlIDxuZXQvZmxvdy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0xNjcsMTMgKzE2OCwxNSBAQAogCiBleHRlcm4gaW50IGluZXRfc2tfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNvY2sgKnNrKTsKIAorZXh0ZXJuIHUzMiBpbmV0X2VoYXNoX3NlY3JldDsKK2V4dGVybiB2b2lkIGJ1aWxkX2VoYXNoX3NlY3JldCh2b2lkKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW5ldF9laGFzaGZuKGNvbnN0IF9fYmUzMiBsYWRkciwgY29uc3QgX191MTYgbHBvcnQsCiAJCQkJCWNvbnN0IF9fYmUzMiBmYWRkciwgY29uc3QgX19iZTE2IGZwb3J0KQogewotCXVuc2lnbmVkIGludCBoID0gKChfX2ZvcmNlIF9fdTMyKWxhZGRyIF4gbHBvcnQpIF4gKChfX2ZvcmNlIF9fdTMyKWZhZGRyIF4gKF9fZm9yY2UgX191MzIpZnBvcnQpOwotCWggXj0gaCA+PiAxNjsKLQloIF49IGggPj4gODsKLQlyZXR1cm4gaDsKKwlyZXR1cm4gamhhc2hfMndvcmRzKChfX2ZvcmNlIF9fdTMyKSBsYWRkciBeIChfX2ZvcmNlIF9fdTMyKSBmYWRkciwKKwkJCSAgICAoKF9fdTMyKSBscG9ydCkgPDwgMTYgfCAoX19mb3JjZSBfX3UzMilmcG9ydCwKKwkJCSAgICBpbmV0X2VoYXNoX3NlY3JldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGluZXRfc2tfZWhhc2hmbihjb25zdCBzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCBlNzljM2UzLi5iYjIwN2RiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvc25tcC5oPgpAQCAtNDMsNiArNDQsMTEgQEAKICNkZWZpbmUgSVBTS0JfUkVST1VURUQJCTE2CiB9OwogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcF9oZHJsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gaXBfaGRyKHNrYiktPmlobCAqIDQ7Cit9CisKIHN0cnVjdCBpcGNtX2Nvb2tpZQogewogCV9fYmUzMgkJCWFkZHI7CkBAIC03NCw3ICs4MCw2IEBACiBzdHJ1Y3QgbmV0X2RldmljZTsKIHN0cnVjdCBwYWNrZXRfdHlwZTsKIHN0cnVjdCBydGFibGU7Ci1zdHJ1Y3Qgc2tfYnVmZjsKIHN0cnVjdCBzb2NrYWRkcjsKIAogZXh0ZXJuIHZvaWQJCWlwX21jX2Ryb3Bzb2NrZXQoc3RydWN0IHNvY2sgKik7CkBAIC0xNjEsNiArMTY2LDEwIEBACiAjZGVmaW5lIE5FVF9BRERfU1RBVFNfQkgoZmllbGQsIGFkbmQpCVNOTVBfQUREX1NUQVRTX0JIKG5ldF9zdGF0aXN0aWNzLCBmaWVsZCwgYWRuZCkKICNkZWZpbmUgTkVUX0FERF9TVEFUU19VU0VSKGZpZWxkLCBhZG5kKQlTTk1QX0FERF9TVEFUU19VU0VSKG5ldF9zdGF0aXN0aWNzLCBmaWVsZCwgYWRuZCkKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25tcF9mb2xkX2ZpZWxkKHZvaWQgKm1pYltdLCBpbnQgb2ZmdCk7CitleHRlcm4gaW50IHNubXBfbWliX2luaXQodm9pZCAqcHRyWzJdLCBzaXplX3QgbWlic2l6ZSwgc2l6ZV90IG1pYmFsaWduKTsKK2V4dGVybiB2b2lkIHNubXBfbWliX2ZyZWUodm9pZCAqcHRyWzJdKTsKKwogZXh0ZXJuIGludCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsyXTsKIGV4dGVybiBpbnQgc3lzY3RsX2lwX2RlZmF1bHRfdHRsOwogZXh0ZXJuIGludCBzeXNjdGxfaXBfbm9ubG9jYWxfYmluZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaCBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaAppbmRleCBjZjM1NWEzLi5jNDhlYTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCkBAIC0yMTksOCArMjE5LDYgQEAKIAogZXh0ZXJuIHZvaWQJCQlmaWI2X3J1bGVzX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZAkJCWZpYjZfcnVsZXNfY2xlYW51cCh2b2lkKTsKLWV4dGVybiBpbnQJCQlmaWI2X3J1bGVzX2R1bXAoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICopOwogCiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmggYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAppbmRleCA0ZTkyN2ViLi41NDU2ZmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaApAQCAtMTE2LDEyICsxMTYsNyBAQAogCQkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIHUzMiBwbXR1KTsKIAotc3RydWN0IG5sbXNnaGRyOwogc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7Ci1leHRlcm4gaW50IGluZXQ2X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci1leHRlcm4gaW50IGluZXQ2X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgaW5ldDZfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBpbmV0Nl9ydG1fZ2V0cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZyk7CiAKIHN0cnVjdCBydDZfcnRubF9kdW1wX2FyZwogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfZmliLmggYi9pbmNsdWRlL25ldC9pcF9maWIuaAppbmRleCAzNmM2MzVjLi41YTRhMDM2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKQEAgLTIxNSwxMCArMjE1LDYgQEAKIC8qIEV4cG9ydGVkIGJ5IGZpYl9mcm9udGVuZC5jICovCiBleHRlcm4gc3RydWN0IG5sYV9wb2xpY3kgcnRtX2lwdjRfcG9saWN5W107CiBleHRlcm4gdm9pZAkJaXBfZmliX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IGluZXRfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBpbmV0X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgaW5ldF9ydG1fZ2V0cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGluZXRfZHVtcF9maWIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGV4dGVybiBpbnQgZmliX3ZhbGlkYXRlX3NvdXJjZShfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCB1OCB0b3MsIGludCBvaWYsCiAJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTMyICpzcGVjX2RzdCwgdTMyICppdGFnKTsKIGV4dGVybiB2b2lkIGZpYl9zZWxlY3RfbXVsdGlwYXRoKGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLCBzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKTsKQEAgLTIzNSw4ICsyMzEsNiBAQAogZXh0ZXJuIHN0cnVjdCBmaWJfdGFibGUgKmZpYl9oYXNoX2luaXQodTMyIGlkKTsKIAogI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKLWV4dGVybiBpbnQgZmliNF9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci0KIGV4dGVybiB2b2lkIF9faW5pdCBmaWI0X3J1bGVzX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB2Ni5oIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCmluZGV4IDAwMzI4YjcuLmY3MGFmZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwdjYuaAorKysgYi9pbmNsdWRlL25ldC9pcHY2LmgKQEAgLTE2NiwxMyArMTY2LDYgQEAKIAlpZiAoaXNfdWRwbGl0ZSkgU05NUF9JTkNfU1RBVFNfVVNFUih1ZHBsaXRlX3N0YXRzX2luNiwgZmllbGQpOyAgICAgICAgIFwKIAllbHNlCQlTTk1QX0lOQ19TVEFUU19VU0VSKHVkcF9zdGF0c19pbjYsIGZpZWxkKTsgICAgfSB3aGlsZSgwKQogCi1pbnQgc25tcDZfcmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwotaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwotaW50IHNubXA2X2FsbG9jX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKLWludCBzbm1wNl9mcmVlX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKLWludCBzbm1wNl9taWJfaW5pdCh2b2lkICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgbWliYWxpZ24pOwotdm9pZCBzbm1wNl9taWJfZnJlZSh2b2lkICpwdHJbMl0pOwotCiBzdHJ1Y3QgaXA2X3JhX2NoYWluCiB7CiAJc3RydWN0IGlwNl9yYV9jaGFpbgkqbmV4dDsKQEAgLTYwNSw4ICs1OTgsMjAgQEAKIGV4dGVybiB2b2lkIHVkcGxpdGU2X3Byb2NfZXhpdCh2b2lkKTsKIGV4dGVybiBpbnQgIGlwdjZfbWlzY19wcm9jX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBpcHY2X21pc2NfcHJvY19leGl0KHZvaWQpOworZXh0ZXJuIGludCBzbm1wNl9yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CitleHRlcm4gaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwogCiBleHRlcm4gc3RydWN0IHJ0Nl9zdGF0aXN0aWNzIHJ0Nl9zdGF0czsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzbm1wNl9yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25tcDZfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB4LmggYi9pbmNsdWRlL25ldC9pcHguaAppbmRleCBjNmIyZWU2Li40Y2MwYjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHguaAorKysgYi9pbmNsdWRlL25ldC9pcHguaApAQCAtNDMsNyArNDMsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXB4aGRyICppcHhfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgaXB4aGRyICopc2tiLT5oLnJhdzsKKwlyZXR1cm4gKHN0cnVjdCBpcHhoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogfQogCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmggYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKaW5kZXggOGE4MzAxOC4uZjIzZDA3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaApAQCAtNDMxLDI2ICs0MzEsNyBAQAogICogVGhvc2UgbWF5IGJlIGNhbGxlZCBvbmx5IHdpdGhpbiB0aGUga2VybmVsLgogICovCiAKLS8qIEZpcnN0IDogZnVuY3Rpb24gc3RyaWN0bHkgdXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLwotCi0vKiBIYW5kbGUgL3Byb2MvbmV0L3dpcmVsZXNzLCBjYWxsZWQgaW4gbmV0L2NvZGUvZGV2LmMgKi8KLWV4dGVybiBpbnQgZGV2X2dldF93aXJlbGVzc19pbmZvKGNoYXIgKiBidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAotCQkJCSBpbnQgbGVuZ3RoKTsKLQotLyogSGFuZGxlIElPQ1RMcywgY2FsbGVkIGluIG5ldC9jb3JlL2Rldi5jICovCi1leHRlcm4gaW50IHdpcmVsZXNzX3Byb2Nlc3NfaW9jdGwoc3RydWN0IGlmcmVxICppZnIsIHVuc2lnbmVkIGludCBjbWQpOwotCi0vKiBIYW5kbGUgUnROZXRsaW5rIHJlcXVlc3RzLCBjYWxsZWQgaW4gbmV0L2NvcmUvcnRuZXRsaW5rLmMgKi8KLWV4dGVybiBpbnQgd2lyZWxlc3NfcnRuZXRsaW5rX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkgIGNoYXIgKgkJZGF0YSwKLQkJCQkgIGludAkJCWxlbik7Ci1leHRlcm4gaW50IHdpcmVsZXNzX3J0bmV0bGlua19nZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJICBjaGFyICoJCWRhdGEsCi0JCQkJICBpbnQJCQlsZW4sCi0JCQkJICBjaGFyICoqCQlwX2J1ZiwKLQkJCQkgIGludCAqCQkJcF9sZW4pOwotCi0vKiBTZWNvbmQgOiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgY2FsbGVkIGJ5IGRyaXZlciBtb2R1bGVzICovCisvKiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgY2FsbGVkIGJ5IGRyaXZlciBtb2R1bGVzICovCiAKIC8qIFNlbmQgYSBzaW5nbGUgZXZlbnQgdG8gdXNlciBzcGFjZSAqLwogZXh0ZXJuIHZvaWQgd2lyZWxlc3Nfc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2xsY19wZHUuaCBiL2luY2x1ZGUvbmV0L2xsY19wZHUuaAppbmRleCBhYTMzYTQ3Li40YThmNThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9sbGNfcGR1LmgKKysrIGIvaW5jbHVkZS9uZXQvbGxjX3BkdS5oCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxjX3BkdV9zbiAqbGxjX3BkdV9zbl9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBsbGNfcGR1X3NuICopc2tiLT5uaC5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgbGxjX3BkdV9zbiAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogfQogCiAvKiBVbi1udW1iZXJlZCBQRFUgZm9ybWF0ICgzIGJ5dGVzIGluIGxlbmd0aCkgKi8KQEAgLTIxNSwxMiArMjE1LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxjX3BkdV91biAqbGxjX3BkdV91bl9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gKHN0cnVjdCBsbGNfcGR1X3VuICopc2tiLT5uaC5yYXc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqbGxjX3NldF9wZHVfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gc2tiLT5uaC5yYXcgPSBwdHI7CisJcmV0dXJuIChzdHJ1Y3QgbGxjX3BkdV91biAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogfQogCiAvKioKQEAgLTIzNyw3ICsyMzIsMTEgQEAKIAkJCQkgICAgICAgdTggc3NhcCwgdTggZHNhcCwgdTggY3IpCiB7CiAJY29uc3QgaW50IGhsZW4gPSB0eXBlID09IExMQ19QRFVfVFlQRV9VID8gMyA6IDQ7Ci0Jc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19zZXRfcGR1X2hkcihza2IsIHNrYl9wdXNoKHNrYiwgaGxlbikpOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHU7CisKKwlza2JfcHVzaChza2IsIGhsZW4pOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CiAJcGR1LT5kc2FwID0gZHNhcDsKIAlwZHUtPnNzYXAgPSBzc2FwOwogCXBkdS0+c3NhcCB8PSBjcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oIGIvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKaW5kZXggYWQ3ZmUxMS4uYTRmMjYxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKKysrIGIvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KIAogI2RlZmluZSBOVURfSU5fVElNRVIJKE5VRF9JTkNPTVBMRVRFfE5VRF9SRUFDSEFCTEV8TlVEX0RFTEFZfE5VRF9QUk9CRSkKICNkZWZpbmUgTlVEX1ZBTElECShOVURfUEVSTUFORU5UfE5VRF9OT0FSUHxOVURfUkVBQ0hBQkxFfE5VRF9QUk9CRXxOVURfU1RBTEV8TlVEX0RFTEFZKQpAQCAtMjEzLDE2ICsyMTQsNyBAQAogZXh0ZXJuIHN0cnVjdCBwbmVpZ2hfZW50cnkJKnBuZWlnaF9sb29rdXAoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNyZWF0KTsKIGV4dGVybiBpbnQJCQlwbmVpZ2hfZGVsZXRlKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICprZXksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi1zdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKLXN0cnVjdCBubG1zZ2hkcjsKLWV4dGVybiBpbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci1leHRlcm4gaW50IG5laWdoX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgbmVpZ2hfZGVsZXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwogZXh0ZXJuIHZvaWQgbmVpZ2hfYXBwX25zKHN0cnVjdCBuZWlnaGJvdXIgKm4pOwotCi1leHRlcm4gaW50IG5laWdodGJsX2R1bXBfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotZXh0ZXJuIGludCBuZWlnaHRibF9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZyk7Ci0KIGV4dGVybiB2b2lkIG5laWdoX2Zvcl9lYWNoKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCB2b2lkICgqY2IpKHN0cnVjdCBuZWlnaGJvdXIgKiwgdm9pZCAqKSwgdm9pZCAqY29va2llKTsKIGV4dGVybiB2b2lkIF9fbmVpZ2hfZm9yX2VhY2hfcmVsZWFzZShzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgaW50ICgqY2IpKHN0cnVjdCBuZWlnaGJvdXIgKikpOwogZXh0ZXJuIHZvaWQgcG5laWdoX2Zvcl9lYWNoKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCB2b2lkICgqY2IpKHN0cnVjdCBwbmVpZ2hfZW50cnkgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDBlNjkwZTMuLjFjNmI4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTI1MCw2ICsyNTAsMTEgQEAKIAlyZXR1cm4gdGVzdF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc191bnRyYWNrZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHNrYi0+bmZjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsKTsKK30KKwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiBleHRlcm4gaW50IG5mX2Nvbm50cmFja19jaGVja3N1bTsKIGV4dGVybiBhdG9taWNfdCBuZl9jb25udHJhY2tfY291bnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4NGMxZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSNpZm5kZWYgX05GX0NPTk5UUkFDS19DT01QQVRfSAotI2RlZmluZSBfTkZfQ09OTlRSQUNLX0NPTVBBVF9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSwotc3RhdGljIGlubGluZSB1X2ludDMyX3QgKm5mX2N0X2dldF9tYXJrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXVfaW50MzJfdCAqY3RpbmZvKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsIGN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiAmY3QtPm1hcms7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksgKi8KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfU0VDTUFSSwotc3RhdGljIGlubGluZSB1X2ludDMyX3QgKm5mX2N0X2dldF9zZWNtYXJrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgIHVfaW50MzJfdCAqY3RpbmZvKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsIGN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiAmY3QtPnNlY21hcms7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX1NFQ01BUksgKi8KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DVF9BQ0NUCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciAqCi1uZl9jdF9nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGlwX2Nvbm50cmFja19nZXQoc2tiLCAmY3RpbmZvKTsKLQotCWlmIChjdCkKLQkJcmV0dXJuIGN0LT5jb3VudGVyczsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9DVF9BQ0NUICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2lzX3VudHJhY2tlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc2tiLT5uZmN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfdW50cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXNrYi0+bmZjdCA9ICZpcF9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2dldF9jdGluZm8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBpcF9jb25udHJhY2tfZ2V0KHNrYiwgY3RpbmZvKTsKLQlyZXR1cm4gKGN0ICE9IE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHVuc2lnbmVkIHNob3J0IGwzcHJvdG8pCi17Ci0JbmVlZF9jb25udHJhY2soKTsKLQlyZXR1cm4gbDNwcm90byA9PSBQRl9JTkVUID8gMCA6IC0xOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHVuc2lnbmVkIHNob3J0IGwzcHJvdG8pCi17Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19JUF9ORl9DT05OVFJBQ0sgKi8KLQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksKLQotc3RhdGljIGlubGluZSB1X2ludDMyX3QgKm5mX2N0X2dldF9tYXJrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXVfaW50MzJfdCAqY3RpbmZvKQotewotCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldChza2IsIGN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiAmY3QtPm1hcms7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksgKi8KLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSwotc3RhdGljIGlubGluZSB1X2ludDMyX3QgKm5mX2N0X2dldF9zZWNtYXJrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgIHVfaW50MzJfdCAqY3RpbmZvKQotewotCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldChza2IsIGN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiAmY3QtPnNlY21hcms7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksgKi8KLQotI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciAqCi1uZl9jdF9nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQotCWlmIChjdCkKLQkJcmV0dXJuIGN0LT5jb3VudGVyczsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPTkZJR19ORl9DVF9BQ0NUICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2lzX3VudHJhY2tlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc2tiLT5uZmN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfdW50cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXNrYi0+bmZjdCA9ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2dldF9jdGluZm8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCi17Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KHNrYiwgY3RpbmZvKTsKLQlyZXR1cm4gKGN0ICE9IE5VTEwpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDSyAqLwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX05GX0NPTk5UUkFDS19DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAppbmRleCA4NTYzNGUxLi45ZmI5MDY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaApAQCAtMjcsNiArMjcsOSBAQAogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19jbGVhbnVwKHZvaWQpOwogCitleHRlcm4gaW50IG5mX2Nvbm50cmFja19wcm90b19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3Byb3RvX2Zpbmkodm9pZCk7CisKIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90bzsKIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKm5mX2N0X2ZpbmRfbDNwcm90byh1X2ludDE2X3QgcGYpOwogLyogTGlrZSBhYm92ZSwgYnV0IHlvdSBhbHJlYWR5IGhhdmUgY29ubnRyYWNrIHJlYWQgbG9jay4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCmluZGV4IGI2MmE4YTkuLjgxMWM5MDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaApAQCAtMjAsMzAgKzIwLDggQEAKICNkZWZpbmUgQ09OTlRSQUNLX0VDQUNIRSh4KQkoX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKS54KQogCiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19jaGFpbjsKLWV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbjsKLQotc3RhdGljIGlubGluZSBpbnQgbmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfY2hhaW4sIG5iKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW5mX2Nvbm50cmFja19leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZl9jb25udHJhY2tfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sCi0JCQluYik7Ci19CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiAKIGV4dGVybiB2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOwogZXh0ZXJuIHZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCk7CkBAIC03MSw2ICs0OSwxMCBAQAogCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbmZfY29ubnRyYWNrX2NoYWluLCBldmVudCwgY3QpOwogfQogCitleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW47CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKKwogc3RhdGljIGlubGluZSB2b2lkCiBuZl9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCiAJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCmluZGV4IGViNTc1Y2IuLmYzMmY3MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCkBAIC05MCwxMCArOTAsNyBAQAogLyogUHJvdG9jb2wgcmVnaXN0cmF0aW9uLiAqLwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbDNwcm90b19yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKTsKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90byk7Ci0KLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKgotbmZfY3RfbDNwcm90b19maW5kX2dldCh1X2ludDE2X3QgbDNwcm90byk7Ci0KK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKm5mX2N0X2wzcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8pOwogZXh0ZXJuIHZvaWQgbmZfY3RfbDNwcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwKTsKIAogLyogRXhpc3RpbmcgYnVpbHQtaW4gcHJvdG9jb2xzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCmluZGV4IDg0MTUxODIuLmY0NmNiOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCkBAIC05Nyw3ICs5Nyw2IEBACiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CiAKICNkZWZpbmUgTUFYX05GX0NUX1BST1RPIDI1NgotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKm5mX2N0X3Byb3Rvc1tQRl9NQVhdOwogCiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoKIF9fbmZfY3RfbDRwcm90b19maW5kKHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBsNHByb3RvKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKaW5kZXggZjE5MWM2Ny4uZTc2NTY1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKQEAgLTQsMTYgKzQsNiBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAKLS8qIENvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMgZm9yIGlwdF9GT08gbW9kdWxlcyAqLwotI2RlZmluZSBpcF9uYXRfcmFuZ2UJCQluZl9uYXRfcmFuZ2UKLSNkZWZpbmUgaXBfY29ubnRyYWNrX3R1cGxlCQluZl9jb25udHJhY2tfdHVwbGUKLSNkZWZpbmUgaXBfY29ubnRyYWNrX2dldAkJbmZfY3RfZ2V0Ci0jZGVmaW5lIGlwX2Nvbm50cmFjawkJCW5mX2Nvbm4KLSNkZWZpbmUgaXBfbmF0X3NldHVwX2luZm8JCW5mX25hdF9zZXR1cF9pbmZvCi0jZGVmaW5lIGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQJbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdAotI2RlZmluZSBpcF9jdF9pdGVyYXRlX2NsZWFudXAJCW5mX2N0X2l0ZXJhdGVfY2xlYW51cAotI2RlZmluZQlJUF9ORl9BU1NFUlQJCQlORl9DVF9BU1NFUlQKLQogZXh0ZXJuIGludCBuZl9uYXRfcnVsZV9pbml0KHZvaWQpIF9faW5pdDsKIGV4dGVybiB2b2lkIG5mX25hdF9ydWxlX2NsZWFudXAodm9pZCk7CiBleHRlcm4gaW50IG5mX25hdF9ydWxlX2ZpbmQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCmluZGV4IGJjYWY2N2IuLjBiZjMyNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKQEAgLTE3MSw2ICsxNzEsNyBAQAogCU5MQV9NU0VDUywKIAlOTEFfTkVTVEVELAogCU5MQV9OVUxfU1RSSU5HLAorCU5MQV9CSU5BUlksCiAJX19OTEFfVFlQRV9NQVgsCiB9OwogCkBAIC0xODgsMTIgKzE4OSwxMyBAQAogICogICAgTkxBX1NUUklORyAgICAgICAgICAgTWF4aW11bSBsZW5ndGggb2Ygc3RyaW5nCiAgKiAgICBOTEFfTlVMX1NUUklORyAgICAgICBNYXhpbXVtIGxlbmd0aCBvZiBzdHJpbmcgKGV4Y2x1ZGluZyBOVUwpCiAgKiAgICBOTEFfRkxBRyAgICAgICAgICAgICBVbnVzZWQKKyAqICAgIE5MQV9CSU5BUlkgICAgICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCiAgKiAgICBBbGwgb3RoZXIgICAgICAgICAgICBFeGFjdCBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKICAqCiAgKiBFeGFtcGxlOgogICogc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IG15X3BvbGljeVtBVFRSX01BWCsxXSBfX3JlYWRfbW9zdGx5ID0gewogICogCVtBVFRSX0ZPT10gPSB7IC50eXBlID0gTkxBX1UxNiB9LAotICoJW0FUVFJfQkFSXSA9IHsgLnR5cGUgPSBOTEFfU1RSSU5HLCBsZW4gPSBCQVJTSVogfSwKKyAqCVtBVFRSX0JBUl0gPSB7IC50eXBlID0gTkxBX1NUUklORywgLmxlbiA9IEJBUlNJWiB9LAogICoJW0FUVFJfQkFaXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgbXlzdHJ1Y3QpIH0sCiAgKiB9OwogICovCkBAIC0yMTQsOSArMjE2LDcgQEAKIAogZXh0ZXJuIHZvaWQJCW5ldGxpbmtfcnVuX3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50ICpxbGVuLAogCQkJCQkgIGludCAoKmNiKShzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQJCW5ldGxpbmtfcXVldWVfc2tpcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJCQkJCQkgICAgc3RydWN0IG5sbXNnaGRyICopKTsKIGV4dGVybiBpbnQJCW5sbXNnX25vdGlmeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICB1MzIgcGlkLCB1bnNpZ25lZCBpbnQgZ3JvdXAsIGludCByZXBvcnQsCiAJCQkJICAgICBnZnBfdCBmbGFncyk7CkBAIC01MjUsNyArNTI1LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgbmxtc2dfZW5kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgbmxoOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHVuc2lnbmVkIGNoYXIgKilubGg7CiAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CkBAIC01MzgsNyArNTM4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpubG1zZ19nZXRfcG9zKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYi0+dGFpbDsKKwlyZXR1cm4gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogfQogCiAvKioKQEAgLTU0OCw3ICs1NDgsNyBAQAogICoKICAqIFRyaW1zIHRoZSBtZXNzYWdlIHRvIHRoZSBwcm92aWRlZCBtYXJrLiBSZXR1cm5zIC0xLgogICovCi1zdGF0aWMgaW5saW5lIGludCBubG1zZ190cmltKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKm1hcmspCitzdGF0aWMgaW5saW5lIGludCBubG1zZ190cmltKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHZvaWQgKm1hcmspCiB7CiAJaWYgKG1hcmspCiAJCXNrYl90cmltKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikgbWFyayAtIHNrYi0+ZGF0YSk7CkBAIC05NDAsNyArOTQwLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmxhdHRyICpubGFfbmVzdF9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUpCiB7Ci0Jc3RydWN0IG5sYXR0ciAqc3RhcnQgPSAoc3RydWN0IG5sYXR0ciAqKSBza2ItPnRhaWw7CisJc3RydWN0IG5sYXR0ciAqc3RhcnQgPSAoc3RydWN0IG5sYXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCWlmIChubGFfcHV0KHNrYiwgYXR0cnR5cGUsIDAsIE5VTEwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC05NjAsNyArOTYwLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgbmxhX25lc3RfZW5kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubGF0dHIgKnN0YXJ0KQogewotCXN0YXJ0LT5ubGFfbGVuID0gc2tiLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgc3RhcnQ7CisJc3RhcnQtPm5sYV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodW5zaWduZWQgY2hhciAqKXN0YXJ0OwogCXJldHVybiBza2ItPmxlbjsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X2Nscy5oIGIvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCmluZGV4IDAyNjQ3ZmUuLjQxMjlkZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL25ldC9wa3RfY2xzLmgKQEAgLTMyNiwxOCArMzI2LDE4IEBACiAJCWNhc2UgVENGX0xBWUVSX0xJTks6CiAJCQlyZXR1cm4gc2tiLT5kYXRhOwogCQljYXNlIFRDRl9MQVlFUl9ORVRXT1JLOgotCQkJcmV0dXJuIHNrYi0+bmgucmF3OworCQkJcmV0dXJuIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQljYXNlIFRDRl9MQVlFUl9UUkFOU1BPUlQ6Ci0JCQlyZXR1cm4gc2tiLT5oLnJhdzsKKwkJCXJldHVybiBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCX0KIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0Y2ZfdmFsaWRfb2Zmc2V0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKnB0ciwKLQkJCQkgICBpbnQgbGVuKQorc3RhdGljIGlubGluZSBpbnQgdGNmX3ZhbGlkX29mZnNldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgY29uc3QgaW50IGxlbikKIHsKLQlyZXR1cm4gdW5saWtlbHkoKHB0ciArIGxlbikgPCBza2ItPnRhaWwgJiYgcHRyID4gc2tiLT5oZWFkKTsKKwlyZXR1cm4gdW5saWtlbHkoKHB0ciArIGxlbikgPCBza2JfdGFpbF9wb2ludGVyKHNrYikgJiYgcHRyID4gc2tiLT5oZWFkKTsKIH0KIAogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCBmNmFmZWU3Li41NzU0ZDUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19ORVRfUEtUX1NDSEVEX0gKIAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPG5ldC9zY2hfZ2VuZXJpYy5oPgogCiBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyCkBAIC0xMiw4ICsxMyw2IEBACiAJaW50CSgqZm4pKHN0cnVjdCBRZGlzYyAqLCB1bnNpZ25lZCBsb25nIGNsLCBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICopOwogfTsKIAotZXh0ZXJuIHJ3bG9ja190IHFkaXNjX3RyZWVfbG9jazsKLQogI2RlZmluZSBRRElTQ19BTElHTlRPCQkzMgogI2RlZmluZSBRRElTQ19BTElHTihsZW4pCSgoKGxlbikgKyBRRElTQ19BTElHTlRPLTEpICYgfihRRElTQ19BTElHTlRPLTEpKQogCkBAIC0zNywxNzUgKzM2LDM4IEBACiAgICBUaGUgdGhpbmdzIGFyZSBub3Qgc28gYmFkLCBiZWNhdXNlIHdlIG1heSB1c2UgYXJ0aWZpY2FsCiAgICBjbG9jayBldmFsdWF0ZWQgYnkgaW50ZWdyYXRpb24gb2YgbmV0d29yayBkYXRhIGZsb3cKICAgIGluIHRoZSBtb3N0IGNyaXRpY2FsIHBsYWNlcy4KLQotICAgTm90ZTogd2UgZG8gbm90IHVzZSBmYXN0Z2V0dGltZW9mZGF5LgotICAgVGhlIHJlYXNvbiBpcyB0aGF0LCB3aGVuIGl0IGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcwotICAgZ2V0dGltZW9mZGF5LCBpdCByZXR1cm5zIGludmFsaWQgdGltZXN0YW1wLCB3aGljaCBpcwotICAgbm90IHVwZGF0ZWQsIHdoZW4gbmV0X2JoIGlzIGFjdGl2ZS4KICAqLwogCi0vKiBHZW5lcmFsIG5vdGUgYWJvdXQgaW50ZXJuYWwgY2xvY2suCi0KLSAgIEFueSBjbG9jayBzb3VyY2UgcmV0dXJucyB0aW1lIGludGVydmFscywgbWVhc3VyZWQgaW4gdW5pdHMKLSAgIGNsb3NlIHRvIDF1c2VjLiBXaXRoIHNvdXJjZSBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZIGl0IGlzIHByZWNpc2VseQotICAgbWljcm9zZWNvbmRzLCBvdGhlcndpc2Ugc29tZXRoaW5nIGNsb3NlIGJ1dCBkaWZmZXJlbnQgY2hvc2VuIHRvIG1pbmltaXplCi0gICBhcml0aG1ldGljIGNvc3QuIFJhdGlvIHVzZWMvaW50ZXJuYWwgdW50aXMgaW4gZm9ybSBub21pbmF0b3IvZGVub21pbmF0b3IKLSAgIG1heSBiZSByZWFkIGZyb20gL3Byb2MvbmV0L3BzY2hlZC4KLSAqLwotCi0KLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCi0KLXR5cGVkZWYgc3RydWN0IHRpbWV2YWwJcHNjaGVkX3RpbWVfdDsKLXR5cGVkZWYgbG9uZwkJcHNjaGVkX3RkaWZmX3Q7Ci0KLSNkZWZpbmUgUFNDSEVEX0dFVF9USU1FKHN0YW1wKSBkb19nZXR0aW1lb2ZkYXkoJihzdGFtcCkpCi0jZGVmaW5lIFBTQ0hFRF9VUzJKSUZGSUUodXNlY3MpIHVzZWNzX3RvX2ppZmZpZXModXNlY3MpCi0jZGVmaW5lIFBTQ0hFRF9KSUZGSUUyVVMoZGVsYXkpIGppZmZpZXNfdG9fdXNlY3MoZGVsYXkpCi0KLSNlbHNlIC8qICFDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZICovCi0KIHR5cGVkZWYgdTY0CXBzY2hlZF90aW1lX3Q7CiB0eXBlZGVmIGxvbmcJcHNjaGVkX3RkaWZmX3Q7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUworLyogQXZvaWQgZG9pbmcgNjQgYml0IGRpdmlkZSBieSAxMDAwICovCisjZGVmaW5lIFBTQ0hFRF9VUzJOUyh4KQkJCSgoczY0KSh4KSA8PCAxMCkKKyNkZWZpbmUgUFNDSEVEX05TMlVTKHgpCQkJKCh4KSA+PiAxMCkKIAotI2lmIEhaIDwgOTYKLSNkZWZpbmUgUFNDSEVEX0pTQ0FMRSAxNAotI2VsaWYgSFogPj0gOTYgJiYgSFogPCAxOTIKLSNkZWZpbmUgUFNDSEVEX0pTQ0FMRSAxMwotI2VsaWYgSFogPj0gMTkyICYmIEhaIDwgMzg0Ci0jZGVmaW5lIFBTQ0hFRF9KU0NBTEUgMTIKLSNlbGlmIEhaID49IDM4NCAmJiBIWiA8IDc2OAotI2RlZmluZSBQU0NIRURfSlNDQUxFIDExCi0jZWxpZiBIWiA+PSA3NjgKLSNkZWZpbmUgUFNDSEVEX0pTQ0FMRSAxMAotI2VuZGlmCisjZGVmaW5lIFBTQ0hFRF9USUNLU19QRVJfU0VDCQlQU0NIRURfTlMyVVMoTlNFQ19QRVJfU0VDKQorI2RlZmluZSBQU0NIRURfUEFTVFBFUkZFQ1QJCTAKIAotI2RlZmluZSBQU0NIRURfR0VUX1RJTUUoc3RhbXApICgoc3RhbXApID0gKGdldF9qaWZmaWVzXzY0KCk8PFBTQ0hFRF9KU0NBTEUpKQotI2RlZmluZSBQU0NIRURfVVMySklGRklFKGRlbGF5KSAoKChkZWxheSkrKDE8PFBTQ0hFRF9KU0NBTEUpLTEpPj5QU0NIRURfSlNDQUxFKQotI2RlZmluZSBQU0NIRURfSklGRklFMlVTKGRlbGF5KSAoKGRlbGF5KTw8UFNDSEVEX0pTQ0FMRSkKLQotI2VuZGlmIC8qIENPTkZJR19ORVRfU0NIX0NMS19KSUZGSUVTICovCi0jaWZkZWYgQ09ORklHX05FVF9TQ0hfQ0xLX0NQVQotI2luY2x1ZGUgPGFzbS90aW1leC5oPgotCi1leHRlcm4gcHNjaGVkX3RkaWZmX3QgcHNjaGVkX2Nsb2NrX3Blcl9oejsKLWV4dGVybiBpbnQgcHNjaGVkX2Nsb2NrX3NjYWxlOwotZXh0ZXJuIHBzY2hlZF90aW1lX3QgcHNjaGVkX3RpbWVfYmFzZTsKLWV4dGVybiBjeWNsZXNfdCBwc2NoZWRfdGltZV9tYXJrOwotCi0jZGVmaW5lIFBTQ0hFRF9HRVRfVElNRShzdGFtcCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWN5Y2xlc190IGN1ciA9IGdldF9jeWNsZXMoKTsJCQkJCVwKLQlpZiAoc2l6ZW9mKGN5Y2xlc190KSA9PSBzaXplb2YodTMyKSkgewkJCQlcCi0JCWlmIChjdXIgPD0gcHNjaGVkX3RpbWVfbWFyaykJCQkJXAotCQkJcHNjaGVkX3RpbWVfYmFzZSArPSAweDEwMDAwMDAwMFVMTDsJCVwKLQkJcHNjaGVkX3RpbWVfbWFyayA9IGN1cjsJCQkJCVwKLQkJKHN0YW1wKSA9IChwc2NoZWRfdGltZV9iYXNlICsgY3VyKT4+cHNjaGVkX2Nsb2NrX3NjYWxlOwlcCi0JfSBlbHNlIHsJCQkJCQkJXAotCQkoc3RhbXApID0gY3VyPj5wc2NoZWRfY2xvY2tfc2NhbGU7CQkJXAotCX0JCQkJCQkJCVwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpICgoKGRlbGF5KStwc2NoZWRfY2xvY2tfcGVyX2h6LTEpL3BzY2hlZF9jbG9ja19wZXJfaHopCi0jZGVmaW5lIFBTQ0hFRF9KSUZGSUUyVVMoZGVsYXkpICgoZGVsYXkpKnBzY2hlZF9jbG9ja19wZXJfaHopCi0KLSNlbmRpZiAvKiBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVICovCi0KLSNlbmRpZiAvKiAhQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSAqLwotCi0jaWZkZWYgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWQotI2RlZmluZSBQU0NIRURfVERJRkYodHYxLCB0djIpIFwKLSh7IFwKLQkgICBpbnQgX19kZWx0YV9zZWMgPSAodHYxKS50dl9zZWMgLSAodHYyKS50dl9zZWM7IFwKLQkgICBpbnQgX19kZWx0YSA9ICh0djEpLnR2X3VzZWMgLSAodHYyKS50dl91c2VjOyBcCi0JICAgaWYgKF9fZGVsdGFfc2VjKSB7IFwKLQkgICAgICAgICAgIHN3aXRjaCAoX19kZWx0YV9zZWMpIHsgXAotCQkgICBkZWZhdWx0OiBcCi0JCQkgICBfX2RlbHRhID0gMDsgXAotCQkgICBjYXNlIDI6IFwKLQkJCSAgIF9fZGVsdGEgKz0gVVNFQ19QRVJfU0VDOyBcCi0JCSAgIGNhc2UgMTogXAotCQkJICAgX19kZWx0YSArPSBVU0VDX1BFUl9TRUM7IFwKLQkgICAgICAgICAgIH0gXAotCSAgIH0gXAotCSAgIF9fZGVsdGE7IFwKLX0pCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wc2NoZWRfdG9kX2RpZmYoaW50IGRlbHRhX3NlYywgaW50IGJvdW5kKQorc3RhdGljIGlubGluZSBwc2NoZWRfdGltZV90IHBzY2hlZF9nZXRfdGltZSh2b2lkKQogewotCWludCBkZWx0YTsKLQotCWlmIChib3VuZCA8PSBVU0VDX1BFUl9TRUMgfHwgZGVsdGFfc2VjID4gKDB4N0ZGRkZGRkYvVVNFQ19QRVJfU0VDKS0xKQotCQlyZXR1cm4gYm91bmQ7Ci0JZGVsdGEgPSBkZWx0YV9zZWMgKiBVU0VDX1BFUl9TRUM7Ci0JaWYgKGRlbHRhID4gYm91bmQgfHwgZGVsdGEgPCAwKQotCQlkZWx0YSA9IGJvdW5kOwotCXJldHVybiBkZWx0YTsKKwlyZXR1cm4gUFNDSEVEX05TMlVTKGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKSk7CiB9CiAKLSNkZWZpbmUgUFNDSEVEX1RESUZGX1NBRkUodHYxLCB0djIsIGJvdW5kKSBcCi0oeyBcCi0JICAgaW50IF9fZGVsdGFfc2VjID0gKHR2MSkudHZfc2VjIC0gKHR2MikudHZfc2VjOyBcCi0JICAgaW50IF9fZGVsdGEgPSAodHYxKS50dl91c2VjIC0gKHR2MikudHZfdXNlYzsgXAotCSAgIHN3aXRjaCAoX19kZWx0YV9zZWMpIHsgXAotCSAgIGRlZmF1bHQ6IFwKLQkJICAgX19kZWx0YSA9IHBzY2hlZF90b2RfZGlmZihfX2RlbHRhX3NlYywgYm91bmQpOyAgYnJlYWs7IFwKLQkgICBjYXNlIDI6IFwKLQkJICAgX19kZWx0YSArPSBVU0VDX1BFUl9TRUM7IFwKLQkgICBjYXNlIDE6IFwKLQkJICAgX19kZWx0YSArPSBVU0VDX1BFUl9TRUM7IFwKLQkgICBjYXNlIDA6IFwKLSAJCSAgIGlmIChfX2RlbHRhID4gYm91bmQgfHwgX19kZWx0YSA8IDApIFwKLSAJCQlfX2RlbHRhID0gYm91bmQ7IFwKLQkgICB9IFwKLQkgICBfX2RlbHRhOyBcCi19KQorc3RhdGljIGlubGluZSBwc2NoZWRfdGRpZmZfdAorcHNjaGVkX3RkaWZmX2JvdW5kZWQocHNjaGVkX3RpbWVfdCB0djEsIHBzY2hlZF90aW1lX3QgdHYyLCBwc2NoZWRfdGltZV90IGJvdW5kKQoreworCXJldHVybiBtaW4odHYxIC0gdHYyLCBib3VuZCk7Cit9CiAKLSNkZWZpbmUgUFNDSEVEX1RMRVNTKHR2MSwgdHYyKSAoKCh0djEpLnR2X3VzZWMgPCAodHYyKS50dl91c2VjICYmIFwKLQkJCQkodHYxKS50dl9zZWMgPD0gKHR2MikudHZfc2VjKSB8fCBcCi0JCQkJICh0djEpLnR2X3NlYyA8ICh0djIpLnR2X3NlYykKK3N0cnVjdCBxZGlzY193YXRjaGRvZyB7CisJc3RydWN0IGhydGltZXIJdGltZXI7CisJc3RydWN0IFFkaXNjCSpxZGlzYzsKK307CiAKLSNkZWZpbmUgUFNDSEVEX1RBREQyKHR2LCBkZWx0YSwgdHZfcmVzKSBcCi0oeyBcCi0JICAgaW50IF9fZGVsdGEgPSAodHYpLnR2X3VzZWMgKyAoZGVsdGEpOyBcCi0JICAgKHR2X3JlcykudHZfc2VjID0gKHR2KS50dl9zZWM7IFwKLQkgICB3aGlsZSAoX19kZWx0YSA+PSBVU0VDX1BFUl9TRUMpIHsgKHR2X3JlcykudHZfc2VjKys7IF9fZGVsdGEgLT0gVVNFQ19QRVJfU0VDOyB9IFwKLQkgICAodHZfcmVzKS50dl91c2VjID0gX19kZWx0YTsgXAotfSkKLQotI2RlZmluZSBQU0NIRURfVEFERCh0diwgZGVsdGEpIFwKLSh7IFwKLQkgICAodHYpLnR2X3VzZWMgKz0gKGRlbHRhKTsgXAotCSAgIHdoaWxlICgodHYpLnR2X3VzZWMgPj0gVVNFQ19QRVJfU0VDKSB7ICh0dikudHZfc2VjKys7IFwKLQkJICh0dikudHZfdXNlYyAtPSBVU0VDX1BFUl9TRUM7IH0gXAotfSkKLQotLyogU2V0L2NoZWNrIHRoYXQgdGltZSBpcyBpbiB0aGUgInBhc3QgcGVyZmVjdCI7Ci0gICBpdCBkZXBlbmRzIG9uIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSB0aW1lCi0gKi8KLQotI2RlZmluZSBQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHQpCSgodCkudHZfc2VjID0gMCkKLSNkZWZpbmUgUFNDSEVEX0lTX1BBU1RQRVJGRUNUKHQpCSgodCkudHZfc2VjID09IDApCi0KLSNkZWZpbmUJUFNDSEVEX0FVRElUX1RESUZGKHQpICh7IGlmICgodCkgPiAyMDAwMDAwKSAodCkgPSAyMDAwMDAwOyB9KQotCi0jZWxzZSAvKiAhQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSAqLwotCi0jZGVmaW5lIFBTQ0hFRF9URElGRih0djEsIHR2MikgKGxvbmcpKCh0djEpIC0gKHR2MikpCi0jZGVmaW5lIFBTQ0hFRF9URElGRl9TQUZFKHR2MSwgdHYyLCBib3VuZCkgXAotCW1pbl90KGxvbmcgbG9uZywgKHR2MSkgLSAodHYyKSwgYm91bmQpCi0KLQotI2RlZmluZSBQU0NIRURfVExFU1ModHYxLCB0djIpICgodHYxKSA8ICh0djIpKQotI2RlZmluZSBQU0NIRURfVEFERDIodHYsIGRlbHRhLCB0dl9yZXMpICgodHZfcmVzKSA9ICh0dikgKyAoZGVsdGEpKQotI2RlZmluZSBQU0NIRURfVEFERCh0diwgZGVsdGEpICgodHYpICs9IChkZWx0YSkpCi0jZGVmaW5lIFBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QodCkJKCh0KSA9IDApCi0jZGVmaW5lIFBTQ0hFRF9JU19QQVNUUEVSRkVDVCh0KQkoKHQpID09IDApCi0jZGVmaW5lCVBTQ0hFRF9BVURJVF9URElGRih0KQotCi0jZW5kaWYgLyogIUNPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgKi8KK2V4dGVybiB2b2lkIHFkaXNjX3dhdGNoZG9nX2luaXQoc3RydWN0IHFkaXNjX3dhdGNoZG9nICp3ZCwgc3RydWN0IFFkaXNjICpxZGlzYyk7CitleHRlcm4gdm9pZCBxZGlzY193YXRjaGRvZ19zY2hlZHVsZShzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkLAorCQkJCSAgICBwc2NoZWRfdGltZV90IGV4cGlyZXMpOworZXh0ZXJuIHZvaWQgcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKHN0cnVjdCBxZGlzY193YXRjaGRvZyAqd2QpOwogCiBleHRlcm4gc3RydWN0IFFkaXNjX29wcyBwZmlmb19xZGlzY19vcHM7CiBleHRlcm4gc3RydWN0IFFkaXNjX29wcyBiZmlmb19xZGlzY19vcHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9yZWQuaCBiL2luY2x1ZGUvbmV0L3JlZC5oCmluZGV4IGE0ZWIzNzkuLjNjZjMxZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlZC5oCisrKyBiL2luY2x1ZGUvbmV0L3JlZC5oCkBAIC0xNTEsMTcgKzE1MSwxNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCByZWRfaXNfaWRsaW5nKHN0cnVjdCByZWRfcGFybXMgKnApCiB7Ci0JcmV0dXJuICFQU0NIRURfSVNfUEFTVFBFUkZFQ1QocC0+cWlkbGVzdGFydCk7CisJcmV0dXJuIHAtPnFpZGxlc3RhcnQgIT0gUFNDSEVEX1BBU1RQRVJGRUNUOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVkX3N0YXJ0X29mX2lkbGVfcGVyaW9kKHN0cnVjdCByZWRfcGFybXMgKnApCiB7Ci0JUFNDSEVEX0dFVF9USU1FKHAtPnFpZGxlc3RhcnQpOworCXAtPnFpZGxlc3RhcnQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlZF9lbmRfb2ZfaWRsZV9wZXJpb2Qoc3RydWN0IHJlZF9wYXJtcyAqcCkKIHsKLQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHAtPnFpZGxlc3RhcnQpOworCXAtPnFpZGxlc3RhcnQgPSBQU0NIRURfUEFTVFBFUkZFQ1Q7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWRfcmVzdGFydChzdHJ1Y3QgcmVkX3Bhcm1zICpwKQpAQCAtMTc3LDggKzE3Nyw4IEBACiAJbG9uZyB1c19pZGxlOwogCWludCAgc2hpZnQ7CiAKLQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQl1c19pZGxlID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwLT5xaWRsZXN0YXJ0LCBwLT5TY2VsbF9tYXgpOworCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCXVzX2lkbGUgPSBwc2NoZWRfdGRpZmZfYm91bmRlZChub3csIHAtPnFpZGxlc3RhcnQsIHAtPlNjZWxsX21heCk7CiAKIAkvKgogCSAqIFRoZSBwcm9ibGVtOiBpZGVhbGx5LCBhdmVyYWdlIGxlbmd0aCBxdWV1ZSByZWNhbGN1bHRpb24gc2hvdWxkCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L3J0bmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiM2Q0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9ydG5ldGxpbmsuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fTkVUX1JUTkVUTElOS19ICisjZGVmaW5lIF9fTkVUX1JUTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorCit0eXBlZGVmIGludCAoKnJ0bmxfZG9pdF9mdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgbmxtc2doZHIgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqcnRubF9kdW1waXRfZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKik7CisKK2V4dGVybiBpbnQJX19ydG5sX3JlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUsCisJCQkJcnRubF9kb2l0X2Z1bmMsIHJ0bmxfZHVtcGl0X2Z1bmMpOworZXh0ZXJuIHZvaWQJcnRubF9yZWdpc3RlcihpbnQgcHJvdG9jb2wsIGludCBtc2d0eXBlLAorCQkJICAgICAgcnRubF9kb2l0X2Z1bmMsIHJ0bmxfZHVtcGl0X2Z1bmMpOworZXh0ZXJuIGludAlydG5sX3VucmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSk7CitleHRlcm4gdm9pZAlydG5sX3VucmVnaXN0ZXJfYWxsKGludCBwcm90b2NvbCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0bmxfbXNnX2ZhbWlseShzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlpZiAobmxtc2dfbGVuKG5saCkgPj0gc2l6ZW9mKHN0cnVjdCBydGdlbm1zZykpCisJCXJldHVybiAoKHN0cnVjdCBydGdlbm1zZyAqKSBubG1zZ19kYXRhKG5saCkpLT5ydGdlbl9mYW1pbHk7CisJZWxzZQorCQlyZXR1cm4gQUZfVU5TUEVDOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IDgyMDg2MzkuLjFiOGUzNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtNSwxMCArNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L2dlbl9zdGF0cy5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KIAogc3RydWN0IFFkaXNjX29wczsKIHN0cnVjdCBxZGlzY193YWxrZXI7CkBAIC0xNzcsMTQgKzE3Nyw4IEBACiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOwogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzLCB1MzIgcGFyZW50aWQpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQotewotCXRwLT5vcHMtPmRlc3Ryb3kodHApOwotCW1vZHVsZV9wdXQodHAtPm9wcy0+b3duZXIpOwotCWtmcmVlKHRwKTsKLX0KK2V4dGVybiB2b2lkIHRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKTsKK2V4dGVybiB2b2lkIHRjZl9kZXN0cm95X2NoYWluKHN0cnVjdCB0Y2ZfcHJvdG8gKmZsKTsKIAogc3RhdGljIGlubGluZSBpbnQgX19xZGlzY19lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaAppbmRleCA1ZGRiODU1Li5iYjM3NzI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKQEAgLTI4Myw3ICsyODMsNyBAQAogI2RlZmluZSBTQ1RQX1JUT19CRVRBICAgICAgICAgICAyICAgLyogMS80IHdoZW4gY29udmVydGVkIHRvIHJpZ2h0IHNoaWZ0cy4gKi8KIAogLyogTWF4aW11bSBudW1iZXIgb2YgbmV3IGRhdGEgcGFja2V0cyB0aGF0IGNhbiBiZSBzZW50IGluIGEgYnVyc3QuICAqLwotI2RlZmluZSBTQ1RQX01BWF9CVVJTVAkJNAorI2RlZmluZSBTQ1RQX0RFRkFVTFRfTUFYX0JVUlNUCQk0CiAKICNkZWZpbmUgU0NUUF9DTE9DS19HUkFOVUxBUklUWQkxCS8qIDEgamlmZnkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCBmNDMxYWNmLi43YjRmZmY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtMjc2LDYgKzI3Niw3IEBACiAJX191MzIgZGVmYXVsdF9jb250ZXh0OwogCV9fdTMyIGRlZmF1bHRfdGltZXRvbGl2ZTsKIAlfX3UzMiBkZWZhdWx0X3Jjdl9jb250ZXh0OworCWludCBtYXhfYnVyc3Q7CiAKIAkvKiBIZWFydGJlYXQgaW50ZXJ2YWw6IFRoZSBlbmRwb2ludCBzZW5kcyBvdXQgYSBIZWFydGJlYXQgY2h1bmsgdG8KIAkgKiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBldmVyeSBoZWFydGJlYXQgaW50ZXJ2YWwuIFRoaXMgdmFsdWUKQEAgLTMwNCwxMCArMzA1LDEyIEBACiAJX191MzIgYXV0b2Nsb3NlOwogCV9fdTggbm9kZWxheTsKIAlfX3U4IGRpc2FibGVfZnJhZ21lbnRzOwotCV9fdTggcGRfbW9kZTsKIAlfX3U4IHY0bWFwcGVkOworCV9fdTggZnJhZ19pbnRlcmxlYXZlOwogCV9fdTMyIGFkYXB0YXRpb25faW5kOworCV9fdTMyIHBkX3BvaW50OwogCisJYXRvbWljX3QgcGRfbW9kZTsKIAkvKiBSZWNlaXZlIHRvIGhlcmUgd2hpbGUgcGFydGlhbCBkZWxpdmVyeSBpcyBpbiBlZmZlY3QuICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZF9sb2JieTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmggYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKaW5kZXggMjkyM2UzZDMuLmRlODhlZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKQEAgLTg5LDYgKzg5LDcgQEAKIAlfX3UxNiBlcnJvciwKIAlfX3UxNiBvdXRib3VuZCwKIAlfX3UxNiBpbmJvdW5kLAorCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAlnZnBfdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3BlZXJfYWRkcl9jaGFuZ2UoCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmggYi9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmgKaW5kZXggYWIyNmFiMy4uMzllYTNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaApAQCAtNzgsNyArNzgsNyBAQAogdm9pZCBzY3RwX3VscHFfYWJvcnRfcGQoc3RydWN0IHNjdHBfdWxwcSAqLCBnZnBfdCk7CiAKIC8qIENsZWFyIHRoZSBwYXJ0aWFsIGRhdGEgZGVsaXZlcnkgY29uZGl0aW9uIG9uIHRoaXMgc29ja2V0LiAqLwotaW50IHNjdHBfY2xlYXJfcGQoc3RydWN0IHNvY2sgKnNrKTsKK2ludCBzY3RwX2NsZWFyX3BkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpOwogCiAvKiBTa2lwIG92ZXIgYW4gU1NOLiAqLwogdm9pZCBzY3RwX3VscHFfc2tpcChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBfX3UxNiBzaWQsIF9fdTE2IHNzbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCmluZGV4IDY3YTMwZWIuLjZkMmI1NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCkBAIC05Nyw2ICs5NywxMiBAQAogI2RlZmluZSBTQ1RQX0RFTEFZRURfQUNLX1RJTUUgU0NUUF9ERUxBWUVEX0FDS19USU1FCiAJU0NUUF9DT05URVhULAkvKiBSZWNlaXZlIENvbnRleHQgKi8KICNkZWZpbmUgU0NUUF9DT05URVhUIFNDVFBfQ09OVEVYVAorCVNDVFBfRlJBR01FTlRfSU5URVJMRUFWRSwKKyNkZWZpbmUgU0NUUF9GUkFHTUVOVF9JTlRFUkxFQVZFIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRQorCVNDVFBfUEFSVElBTF9ERUxJVkVSWV9QT0lOVCwJLyogU2V0L0dldCBwYXJ0aWFsIGRlbGl2ZXJ5IHBvaW50ICovCisjZGVmaW5lIFNDVFBfUEFSVElBTF9ERUxJVkVSWV9QT0lOVCBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQKKwlTQ1RQX01BWF9CVVJTVCwJCS8qIFNldC9HZXQgbWF4IGJ1cnN0ICovCisjZGVmaW5lIFNDVFBfTUFYX0JVUlNUIFNDVFBfTUFYX0JVUlNUCiAKIAkvKiBJbnRlcm5hbCBTb2NrZXQgT3B0aW9ucy4gU29tZSBvZiB0aGUgc2N0cCBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgCiAJICogaW1wbGVtZW50ZWQgdXNpbmcgdGhlc2Ugc29ja2V0IG9wdGlvbnMuCkBAIC0yMTMsNiArMjE5LDcgQEAKIAlfX3UxNiBzYWNfb3V0Ym91bmRfc3RyZWFtczsKIAlfX3UxNiBzYWNfaW5ib3VuZF9zdHJlYW1zOwogCXNjdHBfYXNzb2NfdCBzYWNfYXNzb2NfaWQ7CisJX191OCBzYWNfaW5mb1swXTsKIH07CiAKIC8qCkBAIC0yNjEsNiArMjY4LDcgQEAKIAlTQ1RQX0FERFJfUkVNT1ZFRCwKIAlTQ1RQX0FERFJfQURERUQsCiAJU0NUUF9BRERSX01BREVfUFJJTSwKKwlTQ1RQX0FERFJfQ09ORklSTUVELAogfTsKIAogCkBAIC01MDgsMTYgKzUxNiwxNyBAQAogICogICBhZGRyZXNzJ3MgcGFyYW1ldGVyczoKICAqLwogZW51bSAgc2N0cF9zcHBfZmxhZ3MgewotCVNQUF9IQl9FTkFCTEUgPSAxLAkJLypFbmFibGUgaGVhcnRiZWF0cyovCi0JU1BQX0hCX0RJU0FCTEUgPSAyLAkJLypEaXNhYmxlIGhlYXJ0YmVhdHMqLworCVNQUF9IQl9FTkFCTEUgPSAxPDwwLAkJLypFbmFibGUgaGVhcnRiZWF0cyovCisJU1BQX0hCX0RJU0FCTEUgPSAxPDwxLAkJLypEaXNhYmxlIGhlYXJ0YmVhdHMqLwogCVNQUF9IQiA9IFNQUF9IQl9FTkFCTEUgfCBTUFBfSEJfRElTQUJMRSwKLQlTUFBfSEJfREVNQU5EID0gNCwJCS8qU2VuZCBoZWFydGJlYXQgaW1tZWRpYXRlbHkqLwotCVNQUF9QTVRVRF9FTkFCTEUgPSA4LAkJLypFbmFibGUgUE1UVSBkaXNjb3ZlcnkqLwotCVNQUF9QTVRVRF9ESVNBQkxFID0gMTYsCQkvKkRpc2FibGUgUE1UVSBkaXNjb3ZlcnkqLworCVNQUF9IQl9ERU1BTkQgPSAxPDwyLAkJLypTZW5kIGhlYXJ0YmVhdCBpbW1lZGlhdGVseSovCisJU1BQX1BNVFVEX0VOQUJMRSA9IDE8PDMsCS8qRW5hYmxlIFBNVFUgZGlzY292ZXJ5Ki8KKwlTUFBfUE1UVURfRElTQUJMRSA9IDE8PDQsCS8qRGlzYWJsZSBQTVRVIGRpc2NvdmVyeSovCiAJU1BQX1BNVFVEID0gU1BQX1BNVFVEX0VOQUJMRSB8IFNQUF9QTVRVRF9ESVNBQkxFLAotCVNQUF9TQUNLREVMQVlfRU5BQkxFID0gMzIsCS8qRW5hYmxlIFNBQ0sqLwotCVNQUF9TQUNLREVMQVlfRElTQUJMRSA9IDY0LAkvKkRpc2FibGUgU0FDSyovCisJU1BQX1NBQ0tERUxBWV9FTkFCTEUgPSAxPDw1LAkvKkVuYWJsZSBTQUNLKi8KKwlTUFBfU0FDS0RFTEFZX0RJU0FCTEUgPSAxPDw2LAkvKkRpc2FibGUgU0FDSyovCiAJU1BQX1NBQ0tERUxBWSA9IFNQUF9TQUNLREVMQVlfRU5BQkxFIHwgU1BQX1NBQ0tERUxBWV9ESVNBQkxFLAorCVNQUF9IQl9USU1FX0lTX1pFUk8gPSAxPDw3LAkvKiBTZXQgSEIgZGVsYXkgdG8gMCAqLwogfTsKIAogc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgewpAQCAtNTMwLDcgKzUzOSw3IEBACiAJX191MzIJCQlzcHBfZmxhZ3M7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwogCi0vKiA3LjEuMjQuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCisvKiA3LjEuMjMuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCiAgKgogICogICBUaGlzIG9wdGlvbnMgd2lsbCBnZXQgb3Igc2V0IHRoZSBkZWxheWVkIGFjayB0aW1lci4gIFRoZSB0aW1lIGlzIHNldAogICogICBpbiBtaWxsaXNlY29uZHMuICBJZiB0aGUgYXNzb2NfaWQgaXMgMCwgdGhlbiB0aGlzIHNldHMgb3IgZ2V0cyB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCAyYzdkNjBjLi4yNWMzN2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0yMDIsNiArMjAyLDE1IEBACiAJdW5zaWduZWQgc2hvcnQJCXNrX3R5cGU7CiAJaW50CQkJc2tfcmN2YnVmOwogCXNvY2tldF9sb2NrX3QJCXNrX2xvY2s7CisJLyoKKwkgKiBUaGUgYmFja2xvZyBxdWV1ZSBpcyBzcGVjaWFsLCBpdCBpcyBhbHdheXMgdXNlZCB3aXRoCisJICogdGhlIHBlci1zb2NrZXQgc3BpbmxvY2sgaGVsZCBhbmQgcmVxdWlyZXMgbG93IGxhdGVuY3kKKwkgKiBhY2Nlc3MuIFRoZXJlZm9yZSB3ZSBzcGVjaWFsIGNhc2UgaXQncyBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsKKwkJc3RydWN0IHNrX2J1ZmYgKnRhaWw7CisJfSBza19iYWNrbG9nOwogCXdhaXRfcXVldWVfaGVhZF90CSpza19zbGVlcDsKIAlzdHJ1Y3QgZHN0X2VudHJ5CSpza19kc3RfY2FjaGU7CiAJc3RydWN0IHhmcm1fcG9saWN5CSpza19wb2xpY3lbMl07CkBAIC0yMjEsMTUgKzIzMCw2IEBACiAJaW50CQkJc2tfcmN2bG93YXQ7CiAJdW5zaWduZWQgbG9uZyAJCXNrX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcJICAgICAgICBza19saW5nZXJ0aW1lOwotCS8qCi0JICogVGhlIGJhY2tsb2cgcXVldWUgaXMgc3BlY2lhbCwgaXQgaXMgYWx3YXlzIHVzZWQgd2l0aAotCSAqIHRoZSBwZXItc29ja2V0IHNwaW5sb2NrIGhlbGQgYW5kIHJlcXVpcmVzIGxvdyBsYXRlbmN5Ci0JICogYWNjZXNzLiBUaGVyZWZvcmUgd2Ugc3BlY2lhbCBjYXNlIGl0J3MgaW1wbGVtZW50YXRpb24uCi0JICovCi0Jc3RydWN0IHsKLQkJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7Ci0JCXN0cnVjdCBza19idWZmICp0YWlsOwotCX0gc2tfYmFja2xvZzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXNrX2Vycm9yX3F1ZXVlOwogCXN0cnVjdCBwcm90bwkJKnNrX3Byb3RfY3JlYXRvcjsKIAlyd2xvY2tfdAkJc2tfY2FsbGJhY2tfbG9jazsKQEAgLTI0NCw3ICsyNDQsNyBAQAogCXN0cnVjdCBza19maWx0ZXIgICAgICAJKnNrX2ZpbHRlcjsKIAl2b2lkCQkJKnNrX3Byb3RpbmZvOwogCXN0cnVjdCB0aW1lcl9saXN0CXNrX3RpbWVyOwotCXN0cnVjdCB0aW1ldmFsCQlza19zdGFtcDsKKwlrdGltZV90CQkJc2tfc3RhbXA7CiAJc3RydWN0IHNvY2tldAkJKnNrX3NvY2tldDsKIAl2b2lkCQkJKnNrX3VzZXJfZGF0YTsKIAlzdHJ1Y3QgcGFnZQkJKnNrX3NuZG1zZ19wYWdlOwpAQCAtMzkwLDYgKzM5MCw3IEBACiAJU09DS19VU0VfV1JJVEVfUVVFVUUsIC8qIHdoZXRoZXIgdG8gY2FsbCBzay0+c2tfd3JpdGVfc3BhY2UgaW4gc29ja193ZnJlZSAqLwogCVNPQ0tfREJHLCAvKiAlU09fREVCVUcgc2V0dGluZyAqLwogCVNPQ0tfUkNWVFNUQU1QLCAvKiAlU09fVElNRVNUQU1QIHNldHRpbmcgKi8KKwlTT0NLX1JDVlRTVEFNUE5TLCAvKiAlU09fVElNRVNUQU1QTlMgc2V0dGluZyAqLwogCVNPQ0tfTE9DQUxST1VURSwgLyogcm91dGUgbG9jYWxseSBvbmx5LCAlU09fRE9OVFJPVVRFIHNldHRpbmcgKi8KIAlTT0NLX1FVRVVFX1NIUlVOSywgLyogd3JpdGUgcXVldWUgaGFzIGJlZW4gc2hydW5rIHJlY2VudGx5ICovCiB9OwpAQCAtNzEwLDE1ICs3MTEsNiBAQAogCQlfX3NrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza19zdHJlYW1fd3JpdGVxdWV1ZV9wdXJnZShzdHJ1Y3Qgc29jayAqc2spCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkKLQkJc2tfc3RyZWFtX2ZyZWVfc2tiKHNrLCBza2IpOwotCXNrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNrX3N0cmVhbV9ybWVtX3NjaGVkdWxlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gKGludClza2ItPnRydWVzaXplIDw9IHNrLT5za19mb3J3YXJkX2FsbG9jIHx8CkBAIC0xMDgzLDE5ICsxMDc1LDcgQEAKIAlyZXR1cm4gbmV0X2dzb19vayhzay0+c2tfcm91dGVfY2Fwcywgc2stPnNrX2dzb190eXBlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrX3NldHVwX2NhcHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCi17Ci0JX19za19kc3Rfc2V0KHNrLCBkc3QpOwotCXNrLT5za19yb3V0ZV9jYXBzID0gZHN0LT5kZXYtPmZlYXR1cmVzOwotCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfR1NPKQotCQlzay0+c2tfcm91dGVfY2FwcyB8PSBORVRJRl9GX0dTT19NQVNLOwotCWlmIChza19jYW5fZ3NvKHNrKSkgewotCQlpZiAoZHN0LT5oZWFkZXJfbGVuKQotCQkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfR1NPX01BU0s7Ci0JCWVsc2UgCi0JCQlzay0+c2tfcm91dGVfY2FwcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOwotCX0KLX0KK2V4dGVybiB2b2lkIHNrX3NldHVwX2NhcHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tfY2hhcmdlX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMjU2LDE4ICsxMjM2LDYgQEAKIAlyZXR1cm4gcGFnZTsKIH0KIAotI2RlZmluZSBza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykJCQkJXAotCQlmb3IgKHNrYiA9IChzayktPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CQkJXAotCQkgICAgIChza2IgIT0gKHNrKS0+c2tfc2VuZF9oZWFkKSAmJgkJCVwKLQkJICAgICAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSYoc2spLT5za193cml0ZV9xdWV1ZSk7CVwKLQkJICAgICBza2IgPSBza2ItPm5leHQpCi0KLS8qZnJvbSBTVENQIGZvciBmYXN0IFNBQ0sgUHJvY2VzcyovCi0jZGVmaW5lIHNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZV9mcm9tKHNrYiwgc2spCQkJXAotCQlmb3IgKDsgKHNrYiAhPSAoc2spLT5za19zZW5kX2hlYWQpICYmICAgICAgICAgICAgICAgICAgIFwKLQkJICAgICAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSYoc2spLT5za193cml0ZV9xdWV1ZSk7CVwKLQkJICAgICBza2IgPSBza2ItPm5leHQpCi0KIC8qCiAgKglEZWZhdWx0IHdyaXRlIHBvbGljeSBhcyBzaG93biB0byB1c2VyIHNwYWNlIHZpYSBwb2xsL3NlbGVjdC9TSUdJTwogICovCkBAIC0xMzA0LDIyICsxMjcyLDE4IEBACiAJcmV0dXJuIHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUID8gLUVSRVNUQVJUU1lTIDogLUVJTlRSOwogfQogCitleHRlcm4gdm9pZCBfX3NvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQKIHNvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJa3RpbWVfdCBrdCA9IHNrYi0+dHN0YW1wOwogCi0Jc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmc3RhbXApOwotCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKSkgewotCQkvKiBSYWNlIG9jY3VycmVkIGJldHdlZW4gdGltZXN0YW1wIGVuYWJsaW5nIGFuZCBwYWNrZXQKLQkJICAgcmVjZWl2aW5nLiAgRmlsbCBpbiB0aGUgY3VycmVudCB0aW1lIGZvciBub3cuICovCi0JCWlmIChzdGFtcC50dl9zZWMgPT0gMCkKLQkJCWRvX2dldHRpbWVvZmRheSgmc3RhbXApOwotCQlza2Jfc2V0X3RpbWVzdGFtcChza2IsICZzdGFtcCk7Ci0JCXB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU09fVElNRVNUQU1QLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpLAotCQkJICZzdGFtcCk7Ci0JfSBlbHNlCi0JCXNrLT5za19zdGFtcCA9IHN0YW1wOworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKSkKKwkJX19zb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisJZWxzZQorCQlzay0+c2tfc3RhbXAgPSBrdDsKIH0KIAogLyoqCkBAIC0xMzUwLDE4ICsxMzE0LDE3IEBACiAKIGV4dGVybiB2b2lkIHNvY2tfZW5hYmxlX3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqc2spOwogZXh0ZXJuIGludCBzb2NrX2dldF90aW1lc3RhbXAoc3RydWN0IHNvY2sgKiwgc3RydWN0IHRpbWV2YWwgX191c2VyICopOworZXh0ZXJuIGludCBzb2NrX2dldF90aW1lc3RhbXBucyhzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopOwogCiAvKiAKICAqCUVuYWJsZSBkZWJ1Zy9pbmZvIG1lc3NhZ2VzIAogICovCitleHRlcm4gaW50IG5ldF9tc2dfd2FybjsKKyNkZWZpbmUgTkVUREVCVUcoZm10LCBhcmdzLi4uKSBcCisJZG8geyBpZiAobmV0X21zZ193YXJuKSBwcmludGsoZm10LCMjYXJncyk7IH0gd2hpbGUgKDApCiAKLSNpZmRlZiBDT05GSUdfTkVUREVCVUcKLSNkZWZpbmUgTkVUREVCVUcoZm10LCBhcmdzLi4uKQlwcmludGsoZm10LCMjYXJncykKLSNkZWZpbmUgTElNSVRfTkVUREVCVUcoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChuZXRfcmF0ZWxpbWl0KCkpIHByaW50ayhmbXQsIyNhcmdzKTsgfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgTkVUREVCVUcoZm10LCBhcmdzLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIExJTUlUX05FVERFQlVHKGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKKyNkZWZpbmUgTElNSVRfTkVUREVCVUcoZm10LCBhcmdzLi4uKSBcCisJZG8geyBpZiAobmV0X21zZ193YXJuICYmIG5ldF9yYXRlbGltaXQoKSkgcHJpbnRrKGZtdCwjI2FyZ3MpOyB9IHdoaWxlKDApCiAKIC8qCiAgKiBNYWNyb3MgZm9yIHNsZWVwaW5nIG9uIGEgc29ja2V0LiBVc2UgdGhlbSBsaWtlIHRoaXM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IDVjNDcyZjIuLmEzODU3OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC0yMjAsNiArMjIwLDcgQEAKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9hZHZfd2luX3NjYWxlOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX3R3X3JldXNlOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX2ZydG87CitleHRlcm4gaW50IHN5c2N0bF90Y3BfZnJ0b19yZXNwb25zZTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9sb3dfbGF0ZW5jeTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9kbWFfY29weWJyZWFrOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX25vbWV0cmljc19zYXZlOwpAQCAtMjMwLDYgKzIzMSw3IEBACiBleHRlcm4gaW50IHN5c2N0bF90Y3BfYmFzZV9tc3M7CiBleHRlcm4gaW50IHN5c2N0bF90Y3Bfd29ya2Fyb3VuZF9zaWduZWRfd2luZG93czsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9zbG93X3N0YXJ0X2FmdGVyX2lkbGU7CitleHRlcm4gaW50IHN5c2N0bF90Y3BfbWF4X3NzdGhyZXNoOwogCiBleHRlcm4gYXRvbWljX3QgdGNwX21lbW9yeV9hbGxvY2F0ZWQ7CiBleHRlcm4gYXRvbWljX3QgdGNwX3NvY2tldHNfYWxsb2NhdGVkOwpAQCAtMzQxLDYgKzM0Myw3IEBACiBleHRlcm4gaW50CQkJdGNwX2NoaWxkX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnBhcmVudCwKIAkJCQkJCSAgc3RydWN0IHNvY2sgKmNoaWxkLAogCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQJCQl0Y3BfdXNlX2ZydG8oc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkCQkJdGNwX2VudGVyX2ZydG8oc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkCQkJdGNwX2VudGVyX2xvc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKIGV4dGVybiB2b2lkCQkJdGNwX2NsZWFyX3JldHJhbnMoc3RydWN0IHRjcF9zb2NrICp0cCk7CkBAIC00MTcsOSArNDIwLDkgQEAKIAogLyogdGNwX291dHB1dC5jICovCiAKLWV4dGVybiB2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdXJfbXNzLCBpbnQgbm9uYWdsZSk7Ci1leHRlcm4gaW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKTsKK2V4dGVybiB2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY3VyX21zcywKKwkJCQkgICAgICBpbnQgbm9uYWdsZSk7CitleHRlcm4gaW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiBpbnQgdGNwX3JldHJhbnNtaXRfc2tiKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIHZvaWQgdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZShzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9zaW1wbGVfcmV0cmFuc21pdChzdHJ1Y3Qgc29jayAqKTsKQEAgLTQ3Niw4ICs0NzksMTAgQEAKIAlfX3RjcF9mYXN0X3BhdGhfb24odHAsIHRwLT5zbmRfd25kID4+IHRwLT5yeF9vcHQuc25kX3dzY2FsZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZmFzdF9wYXRoX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZmFzdF9wYXRoX2NoZWNrKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpICYmCiAJICAgIHRwLT5yY3Zfd25kICYmCiAJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCBzay0+c2tfcmN2YnVmICYmCkBAIC01ODgsMTAgKzU5MywxMCBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRjcF9wYWNrZXRzX291dF9pbmMoc3RydWN0IHNvY2sgKnNrLCAKLQkJCQkgICAgICAgc3RydWN0IHRjcF9zb2NrICp0cCwKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfcGFja2V0c19vdXRfaW5jKHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgb3JpZyA9IHRwLT5wYWNrZXRzX291dDsKIAogCXRwLT5wYWNrZXRzX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtNjI0LDkgKzYyOSwxMiBAQAogI2RlZmluZSBUQ1BfQ0FfTUFYCTEyOAogI2RlZmluZSBUQ1BfQ0FfQlVGX01BWAkoVENQX0NBX05BTUVfTUFYKlRDUF9DQV9NQVgpCiAKKyNkZWZpbmUgVENQX0NPTkdfTk9OX1JFU1RSSUNURUQgMHgxCisjZGVmaW5lIFRDUF9DT05HX1JUVF9TVEFNUAkweDIKKwogc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCWludAlub25fcmVzdHJpY3RlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKG9wdGlvbmFsKSAqLwogCXZvaWQgKCppbml0KShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjQwLDggKzY0OCw2IEBACiAJLyogZG8gbmV3IGN3bmQgY2FsY3VsYXRpb24gKHJlcXVpcmVkKSAqLwogCXZvaWQgKCpjb25nX2F2b2lkKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssCiAJCQkgICB1MzIgcnR0LCB1MzIgaW5fZmxpZ2h0LCBpbnQgZ29vZF9hY2spOwotCS8qIHJvdW5kIHRyaXAgdGltZSBzYW1wbGUgcGVyIGFja2VkIHBhY2tldCAob3B0aW9uYWwpICovCi0Jdm9pZCAoKnJ0dF9zYW1wbGUpKHN0cnVjdCBzb2NrICpzaywgdTMyIHVzcnR0KTsKIAkvKiBjYWxsIGJlZm9yZSBjaGFuZ2luZyBjYV9zdGF0ZSAob3B0aW9uYWwpICovCiAJdm9pZCAoKnNldF9zdGF0ZSkoc3RydWN0IHNvY2sgKnNrLCB1OCBuZXdfc3RhdGUpOwogCS8qIGNhbGwgd2hlbiBjd25kIGV2ZW50IG9jY3VycyAob3B0aW9uYWwpICovCkBAIC02NDksNyArNjU1LDcgQEAKIAkvKiBuZXcgdmFsdWUgb2YgY3duZCBhZnRlciBsb3NzIChvcHRpb25hbCkgKi8KIAl1MzIgICgqdW5kb19jd25kKShzdHJ1Y3Qgc29jayAqc2spOwogCS8qIGhvb2sgZm9yIHBhY2tldCBhY2sgYWNjb3VudGluZyAob3B0aW9uYWwpICovCi0Jdm9pZCAoKnBrdHNfYWNrZWQpKHN0cnVjdCBzb2NrICpzaywgdTMyIG51bV9hY2tlZCk7CisJdm9pZCAoKnBrdHNfYWNrZWQpKHN0cnVjdCBzb2NrICpzaywgdTMyIG51bV9hY2tlZCwga3RpbWVfdCBsYXN0KTsKIAkvKiBnZXQgaW5mbyBmb3IgaW5ldF9kaWFnIChvcHRpb25hbCkgKi8KIAl2b2lkICgqZ2V0X2luZm8pKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKQEAgLTczNiw3ICs3NDIsNyBAQAogCXRwLT5sZWZ0X291dCA9IHRwLT5zYWNrZWRfb3V0ICsgdHAtPmxvc3Rfb3V0OwogfQogCi1leHRlcm4gdm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gdm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHNldF9zc3RocmVzaCk7CiBleHRlcm4gX191MzIgdGNwX2luaXRfY3duZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCiAvKiBTbG93IHN0YXJ0IHdpdGggZGVsYWNrIHByb2R1Y2VzIDMgcGFja2V0cyBvZiBidXJzdCwgc28gdGhhdApAQCAtNzc1LDE4ICs3ODEsMjEgQEAKIAkJdHAtPnNuZF9zbWwgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9jaGVja19wcm9iZV90aW1lcihzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCiAJaWYgKCF0cC0+cGFja2V0c19vdXQgJiYgIWljc2stPmljc2tfcGVuZGluZykKIAkJaW5ldF9jc2tfcmVzZXRfeG1pdF90aW1lcihzaywgSUNTS19USU1FX1BST0JFMCwKIAkJCQkJICBpY3NrLT5pY3NrX3J0bywgVENQX1JUT19NQVgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKIHsKLQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwgdHAtPm5vbmFnbGUpOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwgdHAtPm5vbmFnbGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRfd2woc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcSkKQEAgLTgxNSw3ICs4MjQsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB0Y3BfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKKwlyZXR1cm4gIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgJiYKIAkJX190Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKIH0KIApAQCAtOTE4LDIxICs5MjcsNyBAQAogI2VuZGlmCQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX2RvbmUoc3RydWN0IHNvY2sgKnNrKQotewotCWlmKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQgfHwgc2stPnNrX3N0YXRlID09IFRDUF9TWU5fUkVDVikKLQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0FUVEVNUFRGQUlMUyk7Ci0KLQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOwotCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7Ci0KLQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOwotCi0JaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCi0JCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCWVsc2UKLQkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKHNrKTsKLX0KK2V4dGVybiB2b2lkIHRjcF9kb25lKHN0cnVjdCBzb2NrICpzayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2Fja19yZXNldChzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgKnJ4X29wdCkKIHsKQEAgLTk4MSw3ICs5NzYsNyBAQAogCWlyZXEtPndzY2FsZV9vayA9IHJ4X29wdC0+d3NjYWxlX29rOwogCWlyZXEtPmFja2VkID0gMDsKIAlpcmVxLT5lY25fb2sgPSAwOwotCWlyZXEtPnJtdF9wb3J0ID0gc2tiLT5oLnRoLT5zb3VyY2U7CisJaXJlcS0+cm10X3BvcnQgPSB0Y3BfaGRyKHNrYiktPnNvdXJjZTsKIH0KIAogZXh0ZXJuIHZvaWQgdGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZSh2b2lkKTsKQEAgLTEwMTEsNyArMTAwNiw3IEBACiB7CiAJaWYgKChzMzIpKHJ4X29wdC0+cmN2X3RzdmFsIC0gcnhfb3B0LT50c19yZWNlbnQpID49IDApCiAJCXJldHVybiAwOwotCWlmICh4dGltZS50dl9zZWMgPj0gcnhfb3B0LT50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCisJaWYgKGdldF9zZWNvbmRzKCkgPj0gcnhfb3B0LT50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCiAJCXJldHVybiAwOwogCiAJLyogUlNUIHNlZ21lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQgdG8gY2FycnkgdGltZXN0YW1wLApAQCAtMTAyNiwyNiArMTAyMSwxMyBAQAogCiAJICAgSG93ZXZlciwgd2UgY2FuIHJlbGF4IHRpbWUgYm91bmRzIGZvciBSU1Qgc2VnbWVudHMgdG8gTVNMLgogCSAqLwotCWlmIChyc3QgJiYgeHRpbWUudHZfc2VjID49IHJ4X29wdC0+dHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfTVNMKQorCWlmIChyc3QgJiYgZ2V0X3NlY29uZHMoKSA+PSByeF9vcHQtPnRzX3JlY2VudF9zdGFtcCArIFRDUF9QQVdTX01TTCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKICNkZWZpbmUgVENQX0NIRUNLX1RJTUVSKHNrKSBkbyB7IH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgaW50IHRjcF91c2VfZnJ0byhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCi17Ci0JY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JCi0JLyogRi1SVE8gbXVzdCBiZSBhY3RpdmF0ZWQgaW4gc3lzY3RsIGFuZCB0aGVyZSBtdXN0IGJlIHNvbWUKLQkgKiB1bnNlbnQgbmV3IGRhdGEsIGFuZCB0aGUgYWR2ZXJ0aXNlZCB3aW5kb3cgc2hvdWxkIGFsbG93Ci0JICogc2VuZGluZyBpdC4KLQkgKi8KLQlyZXR1cm4gKHN5c2N0bF90Y3BfZnJ0byAmJiBzay0+c2tfc2VuZF9oZWFkICYmCi0JCSFhZnRlcihUQ1BfU0tCX0NCKHNrLT5za19zZW5kX2hlYWQpLT5lbmRfc2VxLAotCQkgICAgICAgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX21pYl9pbml0KHZvaWQpCiB7CiAJLyogU2VlIFJGQyAyMDEyICovCkBAIC0xMTcyLDYgKzExNTQsMTIwIEBACiAJcHV0X2NwdSgpOwogfQogCisvKiB3cml0ZSBxdWV1ZSBhYnN0cmFjdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkIHRjcF93cml0ZV9xdWV1ZV9wdXJnZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkKKwkJc2tfc3RyZWFtX2ZyZWVfc2tiKHNrLCBza2IpOworCXNrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnRjcF93cml0ZV9xdWV1ZV9oZWFkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJaWYgKHNrYiA9PSAoc3RydWN0IHNrX2J1ZmYgKikgJnNrLT5za193cml0ZV9xdWV1ZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3dyaXRlX3F1ZXVlX3RhaWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKKwlpZiAoc2tiID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSAmc2stPnNrX3dyaXRlX3F1ZXVlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICp0Y3Bfd3JpdGVfcXVldWVfbmV4dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dDsKK30KKworI2RlZmluZSB0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spCQkJCQlcCisJCWZvciAoc2tiID0gKHNrKS0+c2tfd3JpdGVfcXVldWUubmV4dDsJCQlcCisJCSAgICAgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmKHNrKS0+c2tfd3JpdGVfcXVldWUpOwlcCisJCSAgICAgc2tiID0gc2tiLT5uZXh0KQorCisjZGVmaW5lIHRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbShza2IsIHNrKQkJCQlcCisJCWZvciAoOyAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSYoc2spLT5za193cml0ZV9xdWV1ZSk7XAorCQkgICAgIHNrYiA9IHNrYi0+bmV4dCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHNrLT5za19zZW5kX2hlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfYWR2YW5jZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrLT5za19zZW5kX2hlYWQgPSBza2ItPm5leHQ7CisJaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZSkKKwkJc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY2hlY2tfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYl91bmxpbmtlZCkKK3sKKwlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2JfdW5saW5rZWQpCisJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fdGNwX2FkZF93cml0ZV9xdWV1ZV90YWlsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfYWRkX3dyaXRlX3F1ZXVlX3RhaWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdGNwX2FkZF93cml0ZV9xdWV1ZV90YWlsKHNrLCBza2IpOworCisJLyogUXVldWUgaXQsIHJlbWVtYmVyaW5nIHdoZXJlIHdlIG11c3Qgc3RhcnQgc2VuZGluZy4gKi8KKwlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBOVUxMKQorCQlzay0+c2tfc2VuZF9oZWFkID0gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX190Y3BfYWRkX3dyaXRlX3F1ZXVlX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fc2tiX3F1ZXVlX2hlYWQoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKK30KKworLyogSW5zZXJ0IGJ1ZmYgYWZ0ZXIgc2tiIG9uIHRoZSB3cml0ZSBxdWV1ZSBvZiBzay4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luc2VydF93cml0ZV9xdWV1ZV9hZnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmYsCisJCQkJCQlzdHJ1Y3Qgc29jayAqc2spCit7CisJX19za2JfYXBwZW5kKHNrYiwgYnVmZiwgJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKKy8qIEluc2VydCBza2IgYmV0d2VlbiBwcmV2IGFuZCBuZXh0IG9uIHRoZSB3cml0ZSBxdWV1ZSBvZiBzay4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luc2VydF93cml0ZV9xdWV1ZV9iZWZvcmUoc3RydWN0IHNrX2J1ZmYgKm5ldywKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgc3RydWN0IHNvY2sgKnNrKQoreworCV9fc2tiX2luc2VydChuZXcsIHNrYi0+cHJldiwgc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF91bmxpbmtfd3JpdGVfcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQoreworCV9fc2tiX3VubGluayhza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2tiX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5uZXh0ID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF93cml0ZV9xdWV1ZV9lbXB0eShzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKK30KKwogLyogL3Byb2MgKi8KIGVudW0gdGNwX3NlcV9zdGF0ZXMgewogCVRDUF9TRVFfU1RBVEVfTElTVEVOSU5HLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwX2Vjbi5oIGIvaW5jbHVkZS9uZXQvdGNwX2Vjbi5oCmluZGV4IDQ2MjlkNzcuLjg5ZWIzZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcF9lY24uaAorKysgYi9pbmNsdWRlL25ldC90Y3BfZWNuLmgKQEAgLTI3LDkgKzI3LDEwIEBACiAJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJj0gflRDUENCX0ZMQUdfRUNFOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9zZW5kX3N5bihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9zZW5kX3N5bihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAl0cC0+ZWNuX2ZsYWdzID0gMDsKIAlpZiAoc3lzY3RsX3RjcF9lY24pIHsKIAkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX0VDRXxUQ1BDQl9GTEFHX0NXUjsKQEAgLTQ0LDkgKzQ1LDExIEBACiAJCXRoLT5lY2UgPSAxOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9zZW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGNwX2hlYWRlcl9sZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9zZW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlpbnQgdGNwX2hlYWRlcl9sZW4pCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAlpZiAodHAtPmVjbl9mbGFncyAmIFRDUF9FQ05fT0spIHsKIAkJLyogTm90LXJldHJhbnNtaXR0ZWQgZGF0YSBzZWdtZW50OiBzZXQgRUNUIGFuZCBpbmplY3QgQ1dSLiAqLwogCQlpZiAoc2tiLT5sZW4gIT0gdGNwX2hlYWRlcl9sZW4gJiYKQEAgLTU0LDcgKzU3LDcgQEAKIAkJCUlORVRfRUNOX3htaXQoc2spOwogCQkJaWYgKHRwLT5lY25fZmxhZ3MmVENQX0VDTl9RVUVVRV9DV1IpIHsKIAkJCQl0cC0+ZWNuX2ZsYWdzICY9IH5UQ1BfRUNOX1FVRVVFX0NXUjsKLQkJCQlza2ItPmgudGgtPmN3ciA9IDE7CisJCQkJdGNwX2hkcihza2IpLT5jd3IgPSAxOwogCQkJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgfD0gU0tCX0dTT19UQ1BfRUNOOwogCQkJfQogCQl9IGVsc2UgewpAQCAtNjIsNyArNjUsNyBAQAogCQkJSU5FVF9FQ05fZG9udHhtaXQoc2spOwogCQl9CiAJCWlmICh0cC0+ZWNuX2ZsYWdzICYgVENQX0VDTl9ERU1BTkRfQ1dSKQotCQkJc2tiLT5oLnRoLT5lY2UgPSAxOworCQkJdGNwX2hkcihza2IpLT5lY2UgPSAxOwogCX0KIH0KIApAQCAtNzAsNyArNzMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9hY2NlcHRfY3dyKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHNrYi0+aC50aC0+Y3dyKQorCWlmICh0Y3BfaGRyKHNrYiktPmN3cikKIAkJdHAtPmVjbl9mbGFncyAmPSB+VENQX0VDTl9ERU1BTkRfQ1dSOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHAuaCBiL2luY2x1ZGUvbmV0L3VkcC5oCmluZGV4IDFiOTIxZmEuLjk4NzU1ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC03MiwxNSArNzIsMTIgQEAKICAqLwogc3RhdGljIGlubGluZSBfX3N1bTE2IF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICghIFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpCi0JCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwotCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgVURQX1NLQl9DQihza2IpLT5jc2NvdiwKLQkJCQkgICAgICBza2ItPmNzdW0pKTsKKwlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZChza2IsIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJcmV0dXJuICFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmCiAJCV9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwogfQogCkBAIC05Miw4ICs4OSw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgX193c3VtIHVkcF9jc3VtX291dGdvaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlfX3dzdW0gY3N1bSA9IGNzdW1fcGFydGlhbChza2ItPmgucmF3LCBzaXplb2Yoc3RydWN0IHVkcGhkciksIDApOwotCisJX193c3VtIGNzdW0gPSBjc3VtX3BhcnRpYWwoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHVkcGhkciksIDApOwogCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYikgewogCQljc3VtID0gY3N1bV9hZGQoY3N1bSwgc2tiLT5jc3VtKTsKIAl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHBsaXRlLmggYi9pbmNsdWRlL25ldC91ZHBsaXRlLmgKaW5kZXggNjdhYzUxNC4uNjM1YjBlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwbGl0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcGxpdGUuaApAQCAtNDcsMTEgKzQ3LDEwIEBACiAJCXJldHVybiAxOwogCX0KIAotICAgICAgICBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKIAljc2NvdiA9IG50b2hzKHVoLT5sZW4pOwogCiAJaWYgKGNzY292ID09IDApCQkgLyogSW5kaWNhdGVzIHRoYXQgZnVsbCBjb3ZlcmFnZSBpcyByZXF1aXJlZC4gKi8KLQkJY3Njb3YgPSBza2ItPmxlbjsKKwkJOwogCWVsc2UgaWYgKGNzY292IDwgOCAgfHwgY3Njb3YgPiBza2ItPmxlbikgewogCQkvKgogCQkgKiBDb3ZlcmFnZSBsZW5ndGggdmlvbGF0ZXMgUkZDIDM4Mjg6IGxvZyBhbmQgZGlzY2FyZCBzaWxlbnRseS4KQEAgLTYwLDQyICs1OSwxNiBAQAogCQkJICAgICAgIGNzY292LCBza2ItPmxlbik7CiAJCXJldHVybiAxOwogCi0JfSBlbHNlIGlmIChjc2NvdiA8IHNrYi0+bGVuKQorCX0gZWxzZSBpZiAoY3Njb3YgPCBza2ItPmxlbikgewogICAgICAgICAJVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDE7Ci0KLSAgICAgICAgVURQX1NLQl9DQihza2IpLT5jc2NvdiA9IGNzY292OwotCi0JLyoKLQkgKiBUaGVyZSBpcyBubyBrbm93biBOSUMgbWFudWZhY3R1cmVyIHN1cHBvcnRpbmcgVURQLUxpdGUgeWV0LAotCSAqIGhlbmNlIGlwX3N1bW1lZCBpcyBhbHdheXMgKHJlLSlzZXQgdG8gQ0hFQ0tTVU1fTk9ORS4KLQkgKi8KLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCVVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YgPSBjc2NvdjsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworICAgICAgICB9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHVkcGxpdGU0X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKLXsKLQlpbnQgcmMgPSB1ZHBsaXRlX2NoZWNrc3VtX2luaXQoc2tiLCB1aCk7Ci0KLQlpZiAoIXJjKQotCQlza2ItPmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCQkgICAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQkgICAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQTElURSwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdWRwbGl0ZTZfY3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQotewotCWludCByYyA9IHVkcGxpdGVfY2hlY2tzdW1faW5pdChza2IsIHVoKTsKLQotCWlmICghcmMpCi0JCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQkgICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJICAgICBza2ItPmxlbiwgSVBQUk9UT19VRFBMSVRFLCAwKSk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB1ZHBsaXRlX3NlbmRlcl9jc2NvdihzdHJ1Y3QgdWRwX3NvY2sgKnVwLCBzdHJ1Y3QgdWRwaGRyICp1aCkKIHsKIAlpbnQgY3Njb3YgPSB1cC0+bGVuOwpAQCAtMTI4LDE0ICsxMDEsMTQgQEAKIAogc3RhdGljIGlubGluZSBfX3dzdW0gdWRwbGl0ZV9jc3VtX291dGdvaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgb2ZmLCBsZW4sIGNzY292ID0gdWRwbGl0ZV9zZW5kZXJfY3Njb3YodWRwX3NrKHNrKSwgc2tiLT5oLnVoKTsKKwlpbnQgY3Njb3YgPSB1ZHBsaXRlX3NlbmRlcl9jc2Nvdih1ZHBfc2soc2spLCB1ZHBfaGRyKHNrYikpOwogCV9fd3N1bSBjc3VtID0gMDsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgICAgIC8qIG5vIEhXIHN1cHBvcnQgZm9yIGNoZWNrc3VtbWluZyAqLwogCiAJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7Ci0JCW9mZiA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7Ci0JCWxlbiA9IHNrYi0+bGVuIC0gb2ZmOworCQljb25zdCBpbnQgb2ZmID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwkJY29uc3QgaW50IGxlbiA9IHNrYi0+bGVuIC0gb2ZmOwogCiAJCWNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCBvZmYsIChjc2NvdiA+IGxlbik/IGxlbiA6IGNzY292LCBjc3VtKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvd2V4dC5oIGIvaW5jbHVkZS9uZXQvd2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzQxODMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC93ZXh0LmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfX05FVF9XRVhUX0gKKyNkZWZpbmUgX19ORVRfV0VYVF9ICisKKy8qCisgKiB3aXJlbGVzcyBleHRlbnNpb25zIGludGVyZmFjZSB0byB0aGUgY29yZSBjb2RlCisgKi8KKworI2lmZGVmIENPTkZJR19XSVJFTEVTU19FWFQKK2V4dGVybiBpbnQgd2V4dF9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gaW50IHdleHRfaGFuZGxlX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB2b2lkIF9fdXNlciAqYXJnKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB3ZXh0X3Byb2NfaW5pdCgpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB3ZXh0X2hhbmRsZV9pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICAgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19ORVRfV0VYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC93aXJlbGVzcy5oIGIvaW5jbHVkZS9uZXQvd2lyZWxlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBjNGJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvd2lyZWxlc3MuaApAQCAtMCwwICsxLDEzOSBAQAorI2lmbmRlZiBfX05FVF9XSVJFTEVTU19ICisjZGVmaW5lIF9fTkVUX1dJUkVMRVNTX0gKKworLyoKKyAqIDgwMi4xMSBkZXZpY2UgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAyMDA3CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisKKy8qKgorICogc3RydWN0IHdpcGh5IC0gd2lyZWxlc3MgaGFyZHdhcmUgZGVzY3JpcHRpb24KKyAqIEBpZHg6IHRoZSB3aXBoeSBpbmRleCBhc3NpZ25lZCB0byB0aGlzIGl0ZW0KKyAqIEBjbGFzc19kZXY6IHRoZSBjbGFzcyBkZXZpY2UgcmVwcmVzZW50aW5nIC9zeXMvY2xhc3MvaWVlZTgwMjExLzx3aXBoeS1uYW1lPgorICovCitzdHJ1Y3Qgd2lwaHkgeworCS8qIGFzc2lnbiB0aGVzZSBmaWVsZHMgYmVmb3JlIHlvdSByZWdpc3RlciB0aGUgd2lwaHkgKi8KKworCS8qIHBlcm1hbmVudCBNQUMgYWRkcmVzcyAqLworCXU4IHBlcm1fYWRkcltFVEhfQUxFTl07CisKKwkvKiBJZiBtdWx0aXBsZSB3aXBoeXMgYXJlIHJlZ2lzdGVyZWQgYW5kIHlvdSdyZSBoYW5kZWQgZS5nLgorCSAqIGEgcmVndWxhciBuZXRkZXYgd2l0aCBhc3NpZ25lZCBpZWVlODAyMTFfcHRyLCB5b3Ugd29uJ3QKKwkgKiBrbm93IHdoZXRoZXIgaXQgcG9pbnRzIHRvIGEgd2lwaHkgeW91ciBkcml2ZXIgaGFzIHJlZ2lzdGVyZWQKKwkgKiBvciBub3QuIEFzc2lnbiB0aGlzIHRvIHNvbWV0aGluZyBnbG9iYWwgdG8geW91ciBkcml2ZXIgdG8KKwkgKiBoZWxwIGRldGVybWluZSB3aGV0aGVyIHlvdSBvd24gdGhpcyB3aXBoeSBvciBub3QuICovCisJdm9pZCAqcHJpdmlkOworCisJLyogZmllbGRzIGJlbG93IGFyZSByZWFkLW9ubHksIGFzc2lnbmVkIGJ5IGNmZzgwMjExICovCisKKwkvKiB0aGUgaXRlbSBpbiAvc3lzL2NsYXNzL2llZWU4MDIxMS8gcG9pbnRzIHRvIHRoaXMsCisJICogeW91IG5lZWQgdXNlIHNldF93aXBoeV9kZXYoKSAoc2VlIGJlbG93KSAqLworCXN0cnVjdCBkZXZpY2UgZGV2OworCisJLyogZGlyIGluIGRlYnVnZnM6IGllZWU4MDIxMS88d2lwaHluYW1lPiAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXI7CisKKwljaGFyIHByaXZbMF0gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oTkVUREVWX0FMSUdOKSkpOworfTsKKworLyoqIHN0cnVjdCB3aXJlbGVzc19kZXYgLSB3aXJlbGVzcyBwZXItbmV0ZGV2IHN0YXRlCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci9zdGFjaworICogdGhhdCB1c2VzIHRoZSBpZWVlODAyMTFfcHRyIGZpZWxkIGluIHN0cnVjdCBuZXRfZGV2aWNlCisgKiAodGhpcyBpcyBpbnRlbnRpb25hbCBzbyBpdCBjYW4gYmUgYWxsb2NhdGVkIGFsb25nIHdpdGgKKyAqIHRoZSBuZXRkZXYuKQorICoKKyAqIEB3aXBoeTogcG9pbnRlciB0byBoYXJkd2FyZSBkZXNjcmlwdGlvbgorICovCitzdHJ1Y3Qgd2lyZWxlc3NfZGV2IHsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCisJLyogcHJpdmF0ZSB0byB0aGUgZ2VuZXJpYyB3aXJlbGVzcyBjb2RlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Cit9OworCisvKioKKyAqIHdpcGh5X3ByaXYgLSByZXR1cm4gcHJpdiBmcm9tIHdpcGh5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqd2lwaHlfcHJpdihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCUJVR19PTighd2lwaHkpOworCXJldHVybiAmd2lwaHktPnByaXY7Cit9CisKKy8qKgorICogc2V0X3dpcGh5X2RldiAtIHNldCBkZXZpY2UgcG9pbnRlciBmb3Igd2lwaHkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF93aXBoeV9kZXYoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXdpcGh5LT5kZXYucGFyZW50ID0gZGV2OworfQorCisvKioKKyAqIHdpcGh5X2RldiAtIGdldCB3aXBoeSBkZXYgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKndpcGh5X2RldihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXJldHVybiB3aXBoeS0+ZGV2LnBhcmVudDsKK30KKworLyoqCisgKiB3aXBoeV9uYW1lIC0gZ2V0IHdpcGh5IG5hbWUKKyAqLworc3RhdGljIGlubGluZSBjaGFyICp3aXBoeV9uYW1lKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJcmV0dXJuIHdpcGh5LT5kZXYuYnVzX2lkOworfQorCisvKioKKyAqIHdkZXZfcHJpdiAtIHJldHVybiB3aXBoeSBwcml2IGZyb20gd2lyZWxlc3NfZGV2CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqd2Rldl9wcml2KHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCit7CisJQlVHX09OKCF3ZGV2KTsKKwlyZXR1cm4gd2lwaHlfcHJpdih3ZGV2LT53aXBoeSk7Cit9CisKKy8qKgorICogd2lwaHlfbmV3IC0gY3JlYXRlIGEgbmV3IHdpcGh5IGZvciB1c2Ugd2l0aCBjZmc4MDIxMQorICoKKyAqIGNyZWF0ZSBhIG5ldyB3aXBoeSBhbmQgYXNzb2NpYXRlIHRoZSBnaXZlbiBvcGVyYXRpb25zIHdpdGggaXQuCisgKiBAc2l6ZW9mX3ByaXYgYnl0ZXMgYXJlIGFsbG9jYXRlZCBmb3IgcHJpdmF0ZSB1c2UuCisgKgorICogdGhlIHJldHVybmVkIHBvaW50ZXIgbXVzdCBiZSBhc3NpZ25lZCB0byBlYWNoIG5ldGRldidzCisgKiBpZWVlODAyMTFfcHRyIGZvciBwcm9wZXIgb3BlcmF0aW9uLgorICovCitzdHJ1Y3Qgd2lwaHkgKndpcGh5X25ldyhzdHJ1Y3QgY2ZnODAyMTFfb3BzICpvcHMsIGludCBzaXplb2ZfcHJpdik7CisKKy8qKgorICogd2lwaHlfcmVnaXN0ZXIgLSByZWdpc3RlciBhIHdpcGh5IHdpdGggY2ZnODAyMTEKKyAqCisgKiByZWdpc3RlciB0aGUgZ2l2ZW4gd2lwaHkKKyAqCisgKiBSZXR1cm5zIGEgbm9uLW5lZ2F0aXZlIHdpcGh5IGluZGV4IG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworZXh0ZXJuIGludCB3aXBoeV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKKworLyoqCisgKiB3aXBoeV91bnJlZ2lzdGVyIC0gZGVyZWdpc3RlciBhIHdpcGh5IGZyb20gY2ZnODAyMTEKKyAqCisgKiB1bnJlZ2lzdGVyIGEgZGV2aWNlIHdpdGggdGhlIGdpdmVuIHByaXYgcG9pbnRlci4KKyAqIEFmdGVyIHRoaXMgY2FsbCwgbm8gbW9yZSByZXF1ZXN0cyBjYW4gYmUgbWFkZSB3aXRoIHRoaXMgcHJpdgorICogcG9pbnRlciwgYnV0IHRoZSBjYWxsIG1heSBzbGVlcCB0byB3YWl0IGZvciBhbiBvdXRzdGFuZGluZworICogcmVxdWVzdCB0aGF0IGlzIGJlaW5nIGhhbmRsZWQuCisgKi8KK2V4dGVybiB2b2lkIHdpcGh5X3VucmVnaXN0ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSk7CisKKy8qKgorICogd2lwaHlfZnJlZSAtIGZyZWUgd2lwaHkKKyAqLworZXh0ZXJuIHZvaWQgd2lwaHlfZnJlZShzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKKworI2VuZGlmIC8qIF9fTkVUX1dJUkVMRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3gyNWRldmljZS5oIGIvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKaW5kZXggMWQxMGM4Ny4uMTQxNWJjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKQEAgLTcsOCArNyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgX19iZTE2IHgyNV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwogCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCQogCXJldHVybiBodG9ucyhFVEhfUF9YMjUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveGZybS5oIGIvaW5jbHVkZS9uZXQveGZybS5oCmluZGV4IDVhMDBhYTguLjgyODcwODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3hmcm0uaAorKysgYi9pbmNsdWRlL25ldC94ZnJtLmgKQEAgLTI3OSw3ICsyNzksNyBAQAogCXhmcm1fYWRkcmVzc190CQkqKCpsb2NhbF9hZGRyKShzdHJ1Y3QgeGZybV9zdGF0ZSAqLCB4ZnJtX2FkZHJlc3NfdCAqKTsKIAl4ZnJtX2FkZHJlc3NfdAkJKigqcmVtb3RlX2FkZHIpKHN0cnVjdCB4ZnJtX3N0YXRlICosIHhmcm1fYWRkcmVzc190ICopOwogCS8qIEVzdGltYXRlIG1heGltYWwgc2l6ZSBvZiByZXN1bHQgb2YgdHJhbnNmb3JtYXRpb24gb2YgYSBkZ3JhbSAqLwotCXUzMgkJCSgqZ2V0X21heF9zaXplKShzdHJ1Y3QgeGZybV9zdGF0ZSAqLCBpbnQgc2l6ZSk7CisJdTMyCQkJKCpnZXRfbXR1KShzdHJ1Y3QgeGZybV9zdGF0ZSAqLCBpbnQgc2l6ZSk7CiB9OwogCiBleHRlcm4gaW50IHhmcm1fcmVnaXN0ZXJfdHlwZShzdHJ1Y3QgeGZybV90eXBlICp0eXBlLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOwpAQCAtNDE2LDYgKzQxNiwxMyBAQAogCXUzMglzZWNpZDsKIH07CiAKKy8qIFNBRCBtZXRhZGF0YSwgYWRkIG1vcmUgbGF0ZXIgKi8KK3N0cnVjdCB4ZnJtX3NhZGluZm8KK3sKKwl1MzIgc2FkaGNudDsgLyogY3VycmVudCBoYXNoIGJrdHMgKi8KKwl1MzIgc2FkaG1jbnQ7IC8qIG1heCBhbGxvd2VkIGhhc2ggYmt0cyAqLworCXUzMiBzYWRjbnQ7IC8qIGN1cnJlbnQgcnVubmluZyBjb3VudCAqLworfTsKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiBleHRlcm4gdm9pZCB4ZnJtX2F1ZGl0X2xvZyh1aWRfdCBhdWlkLCB1MzIgc2VjaWQsIGludCB0eXBlLCBpbnQgcmVzdWx0LAogCQkgICAgc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHhmcm1fc3RhdGUgKngpOwpAQCAtOTM4LDYgKzk0NSw3IEBACiBleHRlcm4gc3RydWN0IHhmcm1fc3RhdGUgKnhmcm1fZmluZF9hY3FfYnlzZXEodTMyIHNlcSk7CiBleHRlcm4gaW50IHhmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKIGV4dGVybiB2b2lkIHhmcm1fc3RhdGVfZmx1c2godTggcHJvdG8sIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2V4dGVybiB2b2lkIHhmcm1fc2FkX2dldGluZm8oc3RydWN0IHhmcm1fc2FkaW5mbyAqc2kpOwogZXh0ZXJuIGludCB4ZnJtX3JlcGxheV9jaGVjayhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIHNlcSk7CiBleHRlcm4gdm9pZCB4ZnJtX3JlcGxheV9hZHZhbmNlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBfX2JlMzIgc2VxKTsKIGV4dGVybiB2b2lkIHhmcm1fcmVwbGF5X25vdGlmeShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGV2ZW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMvY2FsbC5oIGIvaW5jbHVkZS9yeHJwYy9jYWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmY4MzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9jYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogY2FsbC5oOiBSeCBjYWxsIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19DQUxMX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0NBTExfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0KLSNkZWZpbmUgUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUJMTYKLQotZXh0ZXJuIHVuc2lnbmVkIHJ4cnBjX2NhbGxfcmN2X3RpbWVvdXQ7CQkvKiByZWNlaXZlIGFjdGl2aXR5IHRpbWVvdXQgKHNlY3MpICovCi0KLS8qIGFwcGxpY2F0aW9uIGNhbGwgc3RhdGUKLSAqIC0gb25seSBzdGF0ZSAwIGFuZCBmZmZmIGFyZSByZXNlcnZlZCwgdGhlIHN0YXRlIGlzIHNldCB0byAxIGFmdGVyIGFuIG9waWQgaXMgcmVjZWl2ZWQKLSAqLwotZW51bSByeHJwY19hcHBfY3N0YXRlIHsKLQlSWFJQQ19DU1RBVEVfQ09NUExFVEUJCT0gMCwJLyogb3BlcmF0aW9uIGNvbXBsZXRlICovCi0JUlhSUENfQ1NUQVRFX0VSUk9SLAkJCS8qIG9wZXJhdGlvbiBJQ01QIGVycm9yIG9yIGFib3J0ZWQgKi8KLQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRCwJCS8qIFtTRVJWRVJdIHJlY2VpdmluZyBvcGVyYXRpb24gSUQgKi8KLQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfQVJHUywJCS8qIFtTRVJWRVJdIHJlY2VpdmluZyBvcGVyYXRpb24gZGF0YSAqLwotCVJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTLAkJLyogW1NFUlZFUl0gY29tcGxldGVseSByZWNlaXZlZCBvcGVyYXRpb24gZGF0YSAqLwotCVJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWSwJCS8qIFtTRVJWRVJdIHNlbmRpbmcgb3BlcmF0aW9uIHJlcGx5ICovCi0JUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0ZJTkFMX0FDSywJLyogW1NFUlZFUl0gcmVjZWl2aW5nIGZpbmFsIEFDSyAqLwotCVJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTLAkJLyogW0NMSUVOVF0gc2VuZGluZyBvcGVyYXRpb24gYXJncyAqLwotCVJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSwJCS8qIFtDTElFTlRdIHJlY2VpdmluZyBvcGVyYXRpb24gcmVwbHkgKi8KLQlSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFksCQkvKiBbQ0xJRU5UXSBjb21wbGV0ZWx5IHJlY2VpdmVkIG9wZXJhdGlvbiByZXBseSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW107Ci0KLWVudW0gcnhycGNfYXBwX2VzdGF0ZSB7Ci0JUlhSUENfRVNUQVRFX05PX0VSUk9SCQk9IDAsCS8qIG5vIGVycm9yICovCi0JUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JULAkJLyogYWJvcnRlZCBsb2NhbGx5IGJ5IGFwcGxpY2F0aW9uIGxheWVyICovCi0JUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQsCQkvKiBhYm9ydGVkIHJlbW90ZWx5IGJ5IHBlZXIgKi8KLQlSWFJQQ19FU1RBVEVfTE9DQUxfRVJST1IsCQkvKiBsb2NhbCBJQ01QIG5ldHdvcmsgZXJyb3IgKi8KLQlSWFJQQ19FU1RBVEVfUkVNT1RFX0VSUk9SLAkJLyogcmVtb3RlIElDTVAgbmV0d29yayBlcnJvciAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzW107Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBjYWxsIHJlY29yZCBhbmQgYXBwbGljYXRpb24gc2NyYXRjaCBidWZmZXIKLSAqIC0gdGhlIGNhbGwgcmVjb3JkIG9jY3VwaWVzIHRoZSBib3R0b20gb2YgYSBjb21wbGV0ZSBwYWdlCi0gKiAtIHRoZSBhcHBsaWNhdGlvbiBzY3JhdGNoIGJ1ZmZlciBvY2N1cGllcyB0aGUgcmVzdAotICovCi1zdHJ1Y3QgcnhycGNfY2FsbAotewotCWF0b21pY190CQl1c2FnZTsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubjsJCS8qIGNvbm5lY3Rpb24gdXBvbiB3aGljaCBhY3RpdmUgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KLQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CQkvKiBvd25lciBtb2R1bGUgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsJCS8qIHdhaXQgcXVldWUgZm9yIGV2ZW50cyB0byBoYXBwZW4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBnZW5lcmFsIGludGVybmFsIGxpc3QgbGluayAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY2FsbF9saW5rOwkvKiBtYXN0ZXIgY2FsbCBsaXN0IGxpbmsgKi8KLQlfX2JlMzIJCQljaGFuX2l4OwkvKiBjb25uZWN0aW9uIGNoYW5uZWwgaW5kZXggICovCi0JX19iZTMyCQkJY2FsbF9pZDsJLyogY2FsbCBJRCBvbiBjb25uZWN0aW9uICAqLwotCXVuc2lnbmVkIGxvbmcJCWNqaWY7CQkvKiBqaWZmaWVzIGF0IGNhbGwgY3JlYXRpb24gKi8KLQl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGNvbnRyb2wgZmxhZ3MgKi8KLSNkZWZpbmUgUlhSUENfQ0FMTF9BQ0tTX1RJTU8JMHgwMDAwMDAwMQkvKiBBQ0tTIHRpbWVvdXQgcmVhY2hlZCAqLwotI2RlZmluZSBSWFJQQ19DQUxMX0FDS1JfVElNTwkweDAwMDAwMDAyCS8qIEFDS1IgdGltZW91dCByZWFjaGVkICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkNWX1RJTU8JMHgwMDAwMDAwNAkvKiBSQ1YgdGltZW91dCByZWFjaGVkICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkNWX1BLVAkweDAwMDAwMDA4CS8qIHJlY2VpdmVkIHBhY2tldCAqLwotCi0JLyogdHJhbnNtaXNzaW9uICovCi0JcnhycGNfc2VxX3QJCXNuZF9zZXFfY291bnQ7CS8qIG91dGdvaW5nIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgY291bnRlciAqLwotCXN0cnVjdCByeHJwY19tZXNzYWdlCSpzbmRfbmV4dG1zZzsJLyogbmV4dCBtZXNzYWdlIGJlaW5nIGNvbnN0cnVjdGVkIGZvciBzZW5kaW5nICovCi0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UJKnNuZF9waW5nOwkvKiBsYXN0IHBpbmcgbWVzc2FnZSBzZW50ICovCi0JdW5zaWduZWQgc2hvcnQJCXNuZF9yZXNlbmRfY250OwkvKiBjb3VudCBvZiByZXNlbmRzIHNpbmNlIGxhc3QgQUNLICovCi0KLQkvKiB0cmFuc21pc3Npb24gQUNLIHRyYWNraW5nICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhY2tzX3BlbmRxOwkvKiBtZXNzYWdlcyBwZW5kaW5nIEFDSyAob3JkZXJlZCBieSBzZXEpICovCi0JdW5zaWduZWQJCWFja3NfcGVuZF9jbnQ7CS8qIG51bWJlciBvZiB1bi1BQ0snZCBwYWNrZXRzICovCi0JcnhycGNfc2VxX3QJCWFja3NfZGZ0dl9zZXE7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdAlhY2tzX3RpbWVvdXQ7CS8qIHRpbWVvdXQgb24gZXhwZWN0ZWQgQUNLICovCi0KLQkvKiByZWNlcHRpb24gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJjdl9yZWNlaXZlcTsJLyogbWVzc2FnZXMgcGVuZGluZyByZWNlcHRpb24gKG9yZGVyZWQgYnkgc2VxKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcmN2X2tyeGlvZHFfbGs7CS8qIGtyeGlvZCBxdWV1ZSBmb3IgbmV3IGluYm91bmQgcGFja2V0cyAqLwotCXN0cnVjdCB0aW1lcl9saXN0CXJjdl90aW1lb3V0OwkvKiBjYWxsIHJlY2VpdmUgYWN0aXZpdHkgdGltZW91dCAqLwotCi0JLyogcmVjZXB0aW9uIEFDSydpbmcgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl93aW5fYm90OwkvKiBib3R0b20gb2YgQUNLIHdpbmRvdyAqLwotCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93ICovCi0JcnhycGNfc2VxX3QJCWFja3JfaGlnaF9zZXE7CS8qIGhpZ2hlc3Qgc2Vxbm8geWV0IHJlY2VpdmVkICovCi0JcnhycGNfc2VxX25ldF90CQlhY2tyX3ByZXZfc2VxOwkvKiBwcmV2aW91cyBzZXFubyByZWNlaXZlZCAqLwotCXVuc2lnbmVkCQlhY2tyX3BlbmRfY250OwkvKiBudW1iZXIgb2YgcGVuZGluZyBBQ0tzICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJYWNrcl9kZnJfdGltbzsJLyogdGltZW91dCBvbiBkZWZlcnJlZCBBQ0sgKi8KLQljaGFyCQkJYWNrcl9kZnJfcGVybTsJLyogcmVxdWVzdCBmb3IgZGVmZXJyZWQgQUNLcyBwZXJtaXR0ZWQgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl9kZnJfc2VxOwkvKiBzZXFubyBmb3IgZGVmZXJyZWQgQUNLICovCi0Jc3RydWN0IHJ4cnBjX2Fja3BhY2tldAlhY2tyOwkJLyogcGVuZGluZyBub3JtYWwgQUNLIHBhY2tldCAqLwotCXVpbnQ4X3QJCQlhY2tyX2FycmF5W1JYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFXTsJLyogQUNLIHJlY29yZHMgKi8KLQotCS8qIHByZXNlbnRhdGlvbiBsYXllciAqLwotCWNoYXIJCQlhcHBfbGFzdF9yY3Y7CS8qIFQgaWYgcmVjZWl2ZWQgbGFzdCBwYWNrZXQgZnJvbSByZW1vdGUgZW5kICovCi0JZW51bSByeHJwY19hcHBfY3N0YXRlCWFwcF9jYWxsX3N0YXRlOwkvKiBjYWxsIHN0YXRlICovCi0JZW51bSByeHJwY19hcHBfZXN0YXRlCWFwcF9lcnJfc3RhdGU7CS8qIGFib3J0L2Vycm9yIHN0YXRlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfcmVhZHlxOwkvKiBvcmRlcmVkIHJlYWR5IHJlY2VpdmVkIHBhY2tldCBxdWV1ZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJYXBwX3VucmVhZHlxOwkvKiBvcmRlcmVkIHBvc3QtaG9sZSByZWN2J2QgcGFja2V0IHF1ZXVlICovCi0JcnhycGNfc2VxX3QJCWFwcF9yZWFkeV9zZXE7CS8qIGxhc3Qgc2VxIG51bWJlciBkcm9wcGVkIGludG8gcmVhZHlxICovCi0Jc2l6ZV90CQkJYXBwX3JlYWR5X3F0eTsJLyogYW1vdW50IG9mIGRhdGEgcmVhZHkgaW4gcmVhZHlxICovCi0JdW5zaWduZWQJCWFwcF9vcGNvZGU7CS8qIG9wZXJhdGlvbiBJRCAqLwotCXVuc2lnbmVkCQlhcHBfYWJvcnRfY29kZTsJLyogYWJvcnQgY29kZSAod2hlbiBhYm9ydGVkKSAqLwotCWludAkJCWFwcF9lcnJubzsJLyogZXJyb3IgbnVtYmVyICh3aGVuIElDTVAgZXJyb3IgcmVjZWl2ZWQpICovCi0KLQkvKiBzdGF0aXNpY3MgKi8KLQl1bnNpZ25lZAkJcGt0X3Jjdl9jb3VudDsJLyogY291bnQgb2YgcmVjZWl2ZWQgcGFja2V0cyBvbiB0aGlzIGNhbGwgKi8KLQl1bnNpZ25lZAkJcGt0X3NuZF9jb3VudDsJLyogY291bnQgb2Ygc2VudCBwYWNrZXRzIG9uIHRoaXMgY2FsbCAqLwotCXVuc2lnbmVkCQlhcHBfcmVhZF9jb3VudDsJLyogbnVtYmVyIG9mIHJlYWRzIGlzc3VlZCAqLwotCi0JLyogYml0cyBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSAqLwotCXJ4cnBjX2NhbGxfYXR0bl9mdW5jX3QJYXBwX2F0dG5fZnVuYzsJLyogY2FsbGJhY2sgd2hlbiBhdHRlbnRpb24gcmVxdWlyZWQgKi8KLQlyeHJwY19jYWxsX2Vycm9yX2Z1bmNfdAlhcHBfZXJyb3JfZnVuYzsJLyogY2FsbGJhY2sgd2hlbiBhYm9ydCBzZW50IChjbGVhbnVwIGFuZCBwdXQpICovCi0JcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QJYXBwX2FlbWFwX2Z1bmM7CS8qIGNhbGxiYWNrIHRvIG1hcCBhYm9ydCBjb2RlIHRvL2Zyb20gZXJybm8gKi8KLQl2b2lkCQkJKmFwcF91c2VyOwkvKiBhcHBsaWNhdGlvbiBkYXRhICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfbGluazsJLyogYXBwbGljYXRpb24gbGlzdCBsaW5rYWdlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfYXR0bl9saW5rOwkvKiBhcHBsaWNhdGlvbiBhdHRlbnRpb24gbGlzdCBsaW5rYWdlICovCi0Jc2l6ZV90CQkJYXBwX21hcms7CS8qIHRyaWdnZXIgY2FsbGJhY2sgd2hlbiBhcHBfcmVhZHlfcXR5Pj1hcHBfbWFyayAqLwotCWNoYXIJCQlhcHBfYXN5bmNfcmVhZDsJLyogVCBpZiBpbiBhc3luYy1yZWFkIG1vZGUgKi8KLQl1aW50OF90CQkJKmFwcF9yZWFkX2J1ZjsJLyogYXBwbGljYXRpb24gYXN5bmMgcmVhZCBidWZmZXIgKGFwcF9tYXJrIHNpemUpICovCi0JdWludDhfdAkJCSphcHBfc2NyX2FsbG9jOwkvKiBhcHBsaWNhdGlvbiBzY3JhdGNoIGFsbG9jYXRpb24gcG9pbnRlciAqLwotCXZvaWQJCQkqYXBwX3Njcl9wdHI7CS8qIGFwcGxpY2F0aW9uIHBvaW50ZXIgaW50byBzY3JhdGNoIGJ1ZmZlciAqLwotCi0jZGVmaW5lIFJYUlBDX0FQUF9NQVJLX0VPRiAweEZGRkZGRkZGVQkvKiBtYXJrIGF0IGVuZCBvZiBpbnB1dCAqLwotCi0JLyogYXBwbGljYXRpb24gc2NyYXRjaCBidWZmZXIgKi8KLQl1aW50OF90CQkJYXBwX3NjcmF0Y2hbMF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YobG9uZykpKSk7Ci19OwotCi0jZGVmaW5lIFJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJ4cnBjX2NhbGwpKQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfcmVzZXRfc2NyYXRjaChDQUxMKSBcCi1kbyB7IChDQUxMKS0+YXBwX3Njcl9hbGxvYyA9IChDQUxMKS0+YXBwX3NjcmF0Y2g7IH0gd2hpbGUoMCkKLQotI2RlZmluZSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goQ0FMTCxTSVpFKQkJCQkJCVwKLSh7CQkJCQkJCQkJCQlcCi0Jdm9pZCAqcHRyOwkJCQkJCQkJCVwKLQlwdHIgPSAoQ0FMTCktPmFwcF9zY3JfYWxsb2M7CQkJCQkJCVwKLQkoQ0FMTCktPmFwcF9zY3JfYWxsb2MgKz0gKFNJWkUpOwkJCQkJCVwKLQlpZiAoKFNJWkUpPlJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIHx8CQkJCQkJXAotCSAgICAoc2l6ZV90KSgoQ0FMTCktPmFwcF9zY3JfYWxsb2MgLSAodTgqKShDQUxMKSkgPiBSWFJQQ19DQUxMX1NDUkFUQ0hfU0laRSkgewlcCi0JCXByaW50aygicnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKCVwLCVadSlcbiIsKENBTEwpLChzaXplX3QpKFNJWkUpKTsJXAotCQlCVUcoKTsJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQlcCi0JcHRyOwkJCQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaF9zKENBTEwsVFlQRSkJCQkJCQlcCi0oewkJCQkJCQkJCQkJXAotCXNpemVfdCBzaXplID0gc2l6ZW9mKFRZUEUpOwkJCQkJCQlcCi0JVFlQRSAqcHRyOwkJCQkJCQkJCVwKLQlwdHIgPSAoVFlQRSopKENBTEwpLT5hcHBfc2NyX2FsbG9jOwkJCQkJCVwKLQkoQ0FMTCktPmFwcF9zY3JfYWxsb2MgKz0gc2l6ZTsJCQkJCQkJXAotCWlmIChzaXplPlJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIHx8CQkJCQkJXAotCSAgICAoc2l6ZV90KSgoQ0FMTCktPmFwcF9zY3JfYWxsb2MgLSAodTgqKShDQUxMKSkgPiBSWFJQQ19DQUxMX1NDUkFUQ0hfU0laRSkgewlcCi0JCXByaW50aygicnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKCVwLCVadSlcbiIsKENBTEwpLHNpemUpOwkJXAotCQlCVUcoKTsJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQlcCi0JcHRyOwkJCQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfaXNfYWNrX3BlbmRpbmcoQ0FMTCkgKChDQUxMKS0+YWNrci5yZWFzb24gIT0gMCkKLQotZXh0ZXJuIGludCByeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCSAgICAgcnhycGNfY2FsbF9hdHRuX2Z1bmNfdCBhdHRuLAotCQkJICAgICByeHJwY19jYWxsX2Vycm9yX2Z1bmNfdCBlcnJvciwKLQkJCSAgICAgcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QgYWVtYXAsCi0JCQkgICAgIHN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpOwotCi1leHRlcm4gaW50IHJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkgICAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqKl9jYWxsKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCUJVR19PTihhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpPD0wKTsKLQlhdG9taWNfaW5jKCZjYWxsLT51c2FnZSk7Ci0JLypwcmludGsoInJ4cnBjX2dldF9jYWxsKCVwe3U9JWR9KVxuIiwoQyksYXRvbWljX3JlYWQoJihDKS0+dXNhZ2UpKTsqLwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2NhbGxfZG9fc3R1ZmYoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGludCBlcnJvcik7Ci0KLSNkZWZpbmUgUlhSUENfQ0FMTF9SRUFEX0JMT0NLCTB4MDAwMQkvKiBibG9jayBpZiBub3QgZW5vdWdoIGRhdGEgYW5kIG5vdCB5ZXQgRU9GICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkVBRF9BTEwJMHgwMDAyCS8qIGVycm9yIGlmIGluc3VmZmljaWVudCBkYXRhIHJlY2VpdmVkICovCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgc2l6ZV90IHNpb2MsCi0JCQkJIHN0cnVjdCBrdmVjICpzaW92LAotCQkJCSB1aW50OF90IHJ4aGRyX2ZsYWdzLAotCQkJCSBnZnBfdCBhbGxvY19mbGFncywKLQkJCQkgaW50IGR1cF9kYXRhLAotCQkJCSBzaXplX3QgKnNpemVfc2VudCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2NhbGxfaGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjb25uLCBpbnQgbG9jYWwsIGludCBlcnJubyk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL2Nvbm5lY3Rpb24uaCBiL2luY2x1ZGUvcnhycGMvY29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU2NzgxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvY29ubmVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogY29ubmVjdGlvbi5oOiBSeCBjb25uZWN0aW9uIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19DT05ORUNUSU9OX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0NPTk5FQ1RJT05fSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLSNpbmNsdWRlIDxyeHJwYy9rcnh0aW1vZC5oPgotCi1zdHJ1Y3Qgc2tfYnVmZjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFJ4IGNvbm5lY3Rpb24KLSAqIC0gY29ubmVjdGlvbnMgYXJlIG1hdGNoZWQgYnkgKHJtdF9wb3J0LHJtdF9hZGRyLHNlcnZpY2VfaWQsY29ubl9pZCxjbGllbnRmbGFnKQotICogLSBjb25uZWN0aW9ucyBvbmx5IHJldGFpbiBhIHJlZmNvdW50IG9uIHRoZSBwZWVyIHdoZW4gdGhleSBhcmUgYWN0aXZlCi0gKiAtIGNvbm5lY3Rpb25zIHdpdGggcmVmY291bnQ9PTAgYXJlIGluYWN0aXZlIGFuZCByZXNpZGUgaW4gdGhlIHBlZXIncyBncmF2ZXlhcmQKLSAqLwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24KLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydAkqdHJhbnM7CQkvKiB0cmFuc3BvcnQgZW5kcG9pbnQgKi8KLQlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcjsJCS8qIHBlZXIgZnJvbS90byB3aGljaCBjb25uZWN0ZWQgKi8KLQlzdHJ1Y3QgcnhycGNfc2VydmljZQkqc2VydmljZTsJLyogcmVzcG9uc2libGUgc2VydmljZSAoaW5ib3VuZCBjb25ucykgKi8KLQlzdHJ1Y3QgcnhycGNfdGltZXIJdGltZW91dDsJLyogZGVjYWNoaW5nIHRpbWVyICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBwZWVyJ3MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiBsaW5rIGluIHByb2MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZXJyX2xpbms7CS8qIGxpbmsgaW4gSUNNUCBlcnJvciBwcm9jZXNzaW5nIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWlkX2xpbms7CS8qIGxpbmsgaW4gSUQgZ3JhbnQgbGlzdCAqLwotCXN0cnVjdCBzb2NrYWRkcl9pbglhZGRyOwkJLyogcmVtb3RlIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgcnhycGNfY2FsbAkqY2hhbm5lbHNbNF07CS8qIGNoYW5uZWxzIChhY3RpdmUgY2FsbHMpICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJY2hhbndhaXQ7CS8qIHdhaXQgZm9yIGNoYW5uZWwgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBhY2Nlc3MgbG9jayAqLwotCXN0cnVjdCB0aW1ldmFsCQlhdGltZTsJCS8qIGxhc3QgYWNjZXNzIHRpbWUgKi8KLQlzaXplX3QJCQltdHVfc2l6ZTsJLyogTVRVIHNpemUgZm9yIG91dGJvdW5kIG1lc3NhZ2VzICovCi0JdW5zaWduZWQJCWNhbGxfY291bnRlcjsJLyogY2FsbCBJRCBjb3VudGVyICovCi0JcnhycGNfc2VyaWFsX3QJCXNlcmlhbF9jb3VudGVyOwkvKiBwYWNrZXQgc2VyaWFsIG51bWJlciBjb3VudGVyICovCi0KLQkvKiB0aGUgZm9sbG93aW5nIHNob3VsZCBhbGwgYmUgaW4gbmV0IG9yZGVyICovCi0JX19iZTMyCQkJaW5fZXBvY2g7CS8qIHBlZXIncyBlcG9jaCAqLwotCV9fYmUzMgkJCW91dF9lcG9jaDsJLyogbXkgZXBvY2ggKi8KLQlfX2JlMzIJCQljb25uX2lkOwkvKiBjb25uZWN0aW9uIElELCBhcHByb3ByaWF0ZWx5IHNoaWZ0ZWQgKi8KLQlfX2JlMTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCi0JdWludDhfdAkJCXNlY3VyaXR5X2l4OwkvKiBzZWN1cml0eSBJRCAqLwotCXVpbnQ4X3QJCQlpbl9jbGllbnRmbGFnOwkvKiBSWFJQQ19DTElFTlRfSU5JVElBVEVEIGlmIHdlIGFyZSBzZXJ2ZXIgKi8KLQl1aW50OF90CQkJb3V0X2NsaWVudGZsYWc7CS8qIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgaWYgd2UgYXJlIGNsaWVudCAqLwotfTsKLQotZXh0ZXJuIGludCByeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCQkgICBfX2JlMTYgcG9ydCwKLQkJCQkgICBfX2JlMzIgYWRkciwKLQkJCQkgICB1aW50MTZfdCBzZXJ2aWNlX2lkLAotCQkJCSAgIHZvaWQgKnNlY3VyaXR5LAotCQkJCSAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pOwotCi1leHRlcm4gaW50IHJ4cnBjX2Nvbm5lY3Rpb25fbG9va3VwKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJCSAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKTwwKTsKLQlhdG9taWNfaW5jKCZjb25uLT51c2FnZSk7Ci0JLy9wcmludGsoInJ4cnBjX2dldF9jb25uKCVwe3U9JWR9KVxuIixjb25uLGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubik7Ci0KLWV4dGVybiBpbnQgcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJCQkgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCQkgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpOwotCi1leHRlcm4gdm9pZCByeHJwY19jb25uX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgaW50IGxvY2FsLCBpbnQgZXJybm8pOwotCi0jZW5kaWYgLyogX0xJTlVYX1JYUlBDX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy9rcnhpb2QuaCBiL2luY2x1ZGUvcnhycGMva3J4aW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZTBlODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnhpb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIGtyeGlvZC5oOiBSeCBSUEMgSS9PIGtlcm5lbCB0aHJlYWQgaW50ZXJmYWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX1JYUlBDX0tSWElPRF9ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19LUlhJT0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotZXh0ZXJuIGludCByeHJwY19rcnhpb2RfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHJ4cnBjX2tyeGlvZF9raWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhpb2RfY2xlYXJfcGVlcnMoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfS1JYSU9EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMva3J4c2VjZC5oIGIvaW5jbHVkZS9yeHJwYy9rcnhzZWNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2U0M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnhzZWNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBrcnhzZWNkLmg6IFJ4IFJQQyBzZWN1cml0eSBrZXJuZWwgdGhyZWFkIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19LUlhTRUNEX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0tSWFNFQ0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotZXh0ZXJuIGludCByeHJwY19rcnhzZWNkX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX2tpbGwodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX2NsZWFyX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX3F1ZXVlX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfS1JYU0VDRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL2tyeHRpbW9kLmggYi9pbmNsdWRlL3J4cnBjL2tyeHRpbW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDI5OGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnh0aW1vZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoga3J4dGltb2QuaDogUnhSUEMgdGltZW91dCBkYWVtb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfS1JYVElNT0RfSAotI2RlZmluZSBfTElOVVhfUlhSUENfS1JYVElNT0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotc3RydWN0IHJ4cnBjX3RpbWVyX29wcyB7Ci0JLyogY2FsbGVkIHdoZW4gdGhlIGZyb250IG9mIHRoZSB0aW1lciBxdWV1ZSBoYXMgdGltZWQgb3V0ICovCi0Jdm9pZCAoKnRpbWVkX291dCkoc3RydWN0IHJ4cnBjX3RpbWVyICp0aW1lcik7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUlhSUEMgdGltZXIvdGltZW91dCByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX3RpbWVyCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGluazsJCS8qIGxpbmsgaW4gdGltZXIgcXVldWUgKi8KLQl1bnNpZ25lZCBsb25nCQkJdGltb19qaWY7CS8qIHRpbWVvdXQgdGltZSAqLwotCWNvbnN0IHN0cnVjdCByeHJwY190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfdGltZXJfaW5pdChyeHJwY190aW1lcl90ICp0aW1lciwgY29uc3Qgc3RydWN0IHJ4cnBjX3RpbWVyX29wcyAqb3BzKQotewotCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7Ci0JdGltZXItPm9wcyA9IG9wczsKLX0KLQotZXh0ZXJuIGludCByeHJwY19rcnh0aW1vZF9zdGFydCh2b2lkKTsKLWV4dGVybiB2b2lkIHJ4cnBjX2tyeHRpbW9kX2tpbGwodm9pZCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcihyeHJwY190aW1lcl90ICp0aW1lciwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLWV4dGVybiBpbnQgcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9SWFJQQ19LUlhUSU1PRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL21lc3NhZ2UuaCBiL2luY2x1ZGUvcnhycGMvbWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzE4ZjI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvbWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogbWVzc2FnZS5oOiBSeCBtZXNzYWdlIGNhY2hpbmcKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfTUVTU0FHRV9ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19NRVNTQUdFX0gKLQotI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggbWVzc2FnZSByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX21lc3NhZ2UKLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGlzdCBsaW5rICovCi0Jc3RydWN0IHRpbWV2YWwJCXN0YW1wOwkJLyogdGltZSByZWNlaXZlZCBvciBsYXN0IHNlbnQgKi8KLQlyeHJwY19zZXFfdAkJc2VxOwkJLyogbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQotCWludAkJCXN0YXRlOwkJLyogdGhlIHN0YXRlIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBpbiAqLwotI2RlZmluZSBSWFJQQ19NU0dfUFJFUEFSRUQJMAotI2RlZmluZSBSWFJQQ19NU0dfU0VOVAkJMQotI2RlZmluZSBSWFJQQ19NU0dfQUNLRUQJCTIJCS8qIHByb3Zpc2lvbmFsbHkgQUNLJ2QgKi8KLSNkZWZpbmUgUlhSUENfTVNHX0RPTkUJCTMJCS8qIGRlZmluaXRpdmVseSBBQ0snZCAobXNnLT5zZXE8YWNrLmZpcnN0UGFja2V0KSAqLwotI2RlZmluZSBSWFJQQ19NU0dfUkVDRUlWRUQJNAotI2RlZmluZSBSWFJQQ19NU0dfRVJST1IJCS0xCi0JY2hhcgkJCXJ0dGRvbmU7CS8qIHVzZWQgZm9yIFJUVCAqLwotCi0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydAkqdHJhbnM7CQkvKiB0cmFuc3BvcnQgcmVjZWl2ZWQgdGhyb3VnaCAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiByZWNlaXZlZCBvdmVyICovCi0Jc3RydWN0IHNrX2J1ZmYJCSpwa3Q7CQkvKiByZWNlaXZlZCBwYWNrZXQgKi8KLQlvZmZfdAkJCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIHBrdCBvZiBuZXh0IGJ5dGUgb2YgZGF0YSAqLwotCi0Jc3RydWN0IHJ4cnBjX2hlYWRlcgloZHI7CQkvKiBtZXNzYWdlIGhlYWRlciAqLwotCi0JaW50CQkJZGNvdW50OwkJLyogZGF0YSBwYXJ0IGNvdW50ICovCi0Jc2l6ZV90CQkJZHNpemU7CQkvKiBkYXRhIHNpemUgKi8KLSNkZWZpbmUgUlhSUENfTVNHX01BWF9JT0NTIDgKLQlzdHJ1Y3Qga3ZlYwkJZGF0YVtSWFJQQ19NU0dfTUFYX0lPQ1NdOyAvKiBtZXNzYWdlIGRhdGEgKi8KLQl1bnNpZ25lZCBsb25nCQlkZnJlZTsJCS8qIGJpdCBtYXNrIGluZGljYXRpbmcga2ZyZWUoZGF0YVt4XSkgaWYgVCAqLwotfTsKLQotI2RlZmluZSByeHJwY19nZXRfbWVzc2FnZShNKSBkbyB7IGF0b21pY19pbmMoJihNKS0+dXNhZ2UpOyB9IHdoaWxlKDApCi0KLWV4dGVybiB2b2lkIF9fcnhycGNfcHV0X21lc3NhZ2Uoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHV0X21lc3NhZ2Uoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZykKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJm1zZy0+dXNhZ2UpPD0wKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbXNnLT51c2FnZSkpCi0JCV9fcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLX0KLQotZXh0ZXJuIGludCByeHJwY19jb25uX25ld21zZyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCSAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgIHVpbnQ4X3QgdHlwZSwKLQkJCSAgICAgaW50IGNvdW50LAotCQkJICAgICBzdHJ1Y3Qga3ZlYyAqZGlvdiwKLQkJCSAgICAgZ2ZwX3QgYWxsb2NfZmxhZ3MsCi0JCQkgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICoqX21zZyk7Ci0KLWV4dGVybiBpbnQgcnhycGNfY29ubl9zZW5kbXNnKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9SWFJQQ19NRVNTQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMvcGFja2V0LmggYi9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCmluZGV4IDE0NDdmMGEuLmI2OWU2ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKKysrIGIvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaApAQCAtMSw2ICsxLDYgQEAKIC8qIHBhY2tldC5oOiBSeCBwYWNrZXQgbGF5b3V0IGFuZCBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEyLDI4ICsxMiwyNSBAQAogI2lmbmRlZiBfTElOVVhfUlhSUENfUEFDS0VUX0gKICNkZWZpbmUgX0xJTlVYX1JYUlBDX1BBQ0tFVF9ICiAKLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotCi0jZGVmaW5lIFJYUlBDX0lQVURQX1NJWkUJCTI4Ci1leHRlcm4gc2l6ZV90IFJYUlBDX01BWF9QQUNLRVRfU0laRTsKLSNkZWZpbmUgUlhSUENfTUFYX1BBQ0tFVF9EQVRBX1NJWkUJKFJYUlBDX01BWF9QQUNLRVRfU0laRSAtIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSkKLSNkZWZpbmUgUlhSUENfTE9DQUxfUEFDS0VUX1NJWkUJCVJYUlBDX01BWF9QQUNLRVRfU0laRQotI2RlZmluZSBSWFJQQ19SRU1PVEVfUEFDS0VUX1NJWkUJKDU3NiAtIFJYUlBDX0lQVURQX1NJWkUpCit0eXBlZGVmIHUzMglyeHJwY19zZXFfdDsJLyogUnggbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYgdTMyCXJ4cnBjX3NlcmlhbF90OwkvKiBSeCBtZXNzYWdlIHNlcmlhbCBudW1iZXIgKi8KK3R5cGVkZWYgX19iZTMyCXJ4cnBjX3NlcV9uZXRfdDsgLyogb24tdGhlLXdpcmUgUnggbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYgX19iZTMyCXJ4cnBjX3NlcmlhbF9uZXRfdDsgLyogb24tdGhlLXdpcmUgUnggbWVzc2FnZSBzZXJpYWwgbnVtYmVyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBvbi10aGUtd2lyZSBSeCBwYWNrZXQgaGVhZGVyCiAgKiAtIGFsbCBtdWx0aWJ5dGUgZmllbGRzIHNob3VsZCBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKICAqLwotc3RydWN0IHJ4cnBjX2hlYWRlcgoteworc3RydWN0IHJ4cnBjX2hlYWRlciB7CiAJX19iZTMyCQllcG9jaDsJCS8qIGNsaWVudCBib290IHRpbWVzdGFtcCAqLwogCiAJX19iZTMyCQljaWQ7CQkvKiBjb25uZWN0aW9uIGFuZCBjaGFubmVsIElEICovCiAjZGVmaW5lIFJYUlBDX01BWENBTExTCQk0CQkJLyogbWF4IGFjdGl2ZSBjYWxscyBwZXIgY29ubiAqLwogI2RlZmluZSBSWFJQQ19DSEFOTkVMTUFTSwkoUlhSUENfTUFYQ0FMTFMtMSkJLyogbWFzayBmb3IgY2hhbm5lbCBJRCAqLwogI2RlZmluZSBSWFJQQ19DSURNQVNLCQkoflJYUlBDX0NIQU5ORUxNQVNLKQkvKiBtYXNrIGZvciBjb25uZWN0aW9uIElEICovCi0jZGVmaW5lIFJYUlBDX0NJRFNISUZUCQkyCQkJLyogc2hpZnQgZm9yIGNvbm5lY3Rpb24gSUQgKi8KKyNkZWZpbmUgUlhSUENfQ0lEU0hJRlQJCWlsb2cyKFJYUlBDX01BWENBTExTKQkvKiBzaGlmdCBmb3IgY29ubmVjdGlvbiBJRCAqLworI2RlZmluZSBSWFJQQ19DSURfSU5DCQkoMSA8PCBSWFJQQ19DSURTSElGVCkJLyogY29ubmVjdGlvbiBJRCBpbmNyZW1lbnQgKi8KIAogCV9fYmUzMgkJY2FsbE51bWJlcjsJLyogY2FsbCBJRCAoMCBmb3IgY29ubmVjdGlvbi1sZXZlbCBwYWNrZXRzKSAqLwogI2RlZmluZSBSWFJQQ19QUk9DRVNTX01BWENBTExTCSgxPDwyKQkvKiBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsbHMgcGVyIGNvbm4gKHBvd2VyIG9mIDIpICovCkBAIC02Miw3ICs1OSwxMCBAQAogCiAJdWludDhfdAkJdXNlclN0YXR1czsJLyogYXBwLWxheWVyIGRlZmluZWQgc3RhdHVzICovCiAJdWludDhfdAkJc2VjdXJpdHlJbmRleDsJLyogc2VjdXJpdHkgcHJvdG9jb2wgSUQgKi8KLQlfX2JlMTYJCV9yc3ZkOwkJLyogcmVzZXJ2ZWQgKHVzZWQgYnkga2VyYmVyb3Mgc2VjdXJpdHkgYXMgY2tzdW0pICovCisJdW5pb24geworCQlfX2JlMTYJX3JzdmQ7CQkvKiByZXNlcnZlZCAqLworCQlfX2JlMTYJY2tzdW07CQkvKiBrZXJiZXJvcyBzZWN1cml0eSBjaGVja3N1bSAqLworCX07CiAJX19iZTE2CQlzZXJ2aWNlSWQ7CS8qIHNlcnZpY2UgSUQgKi8KIAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKQEAgLTgxLDggKzgxLDcgQEAKICAqICAgLSBuZXdfX3JzdmQgPSBqX19yc3ZkCiAgKiAgIC0gZHVwbGljYXRpbmcgYWxsIG90aGVyIGZpZWxkcwogICovCi1zdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyCi17CitzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyIHsKIAl1aW50OF90CQlmbGFnczsJCS8qIHBhY2tldCBmbGFncyAoYXMgcGVyIHJ4cnBjX2hlYWRlcikgKi8KIAl1aW50OF90CQlwYWQ7CiAJX19iZTE2CQlfcnN2ZDsJCS8qIHJlc2VydmVkICh1c2VkIGJ5IGtlcmJlcm9zIHNlY3VyaXR5IGFzIGNrc3VtKSAqLwpAQCAtOTUsOCArOTQsNyBAQAogICogb24tdGhlLXdpcmUgUnggQUNLIHBhY2tldCBkYXRhIHBheWxvYWQKICAqIC0gYWxsIG11bHRpYnl0ZSBmaWVsZHMgc2hvdWxkIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgogICovCi1zdHJ1Y3QgcnhycGNfYWNrcGFja2V0Ci17CitzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IHsKIAlfX2JlMTYJCWJ1ZmZlclNwYWNlOwkvKiBudW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCiAJX19iZTE2CQltYXhTa2V3OwkvKiBkaWZmIGJldHdlZW4gc2Vybm8gYmVpbmcgQUNLJ2QgYW5kIGhpZ2hlc3Qgc2VyaWFsIG5vCiAJCQkJCSAqIHJlY2VpdmVkICovCkBAIC0xMjQsNCArMTIyLDkzIEBACiAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKKy8qCisgKiBBQ0sgcGFja2V0cyBjYW4gaGF2ZSBhIGZ1cnRoZXIgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGFnZ2VkIG9uIHRoZSBlbmQKKyAqLworc3RydWN0IHJ4cnBjX2Fja2luZm8geworCV9fYmUzMgkJcnhNVFU7CQkvKiBtYXhpbXVtIFJ4IE1UVSBzaXplIChieXRlcykgW0FGUyAzLjNdICovCisJX19iZTMyCQltYXhNVFU7CQkvKiBtYXhpbXVtIGludGVyZmFjZSBNVFUgc2l6ZSAoYnl0ZXMpIFtBRlMgMy4zXSAqLworCV9fYmUzMgkJcndpbmQ7CQkvKiBSeCB3aW5kb3cgc2l6ZSAocGFja2V0cykgW0FGUyAzLjRdICovCisJX19iZTMyCQlqdW1ib19tYXg7CS8qIG1heCBwYWNrZXRzIHRvIHN0aWNrIGludG8gYSBqdW1ibyBwYWNrZXQgW0FGUyAzLjVdICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogS2VyYmVyb3Mgc2VjdXJpdHkgdHlwZS0yIGNoYWxsZW5nZSBwYWNrZXQKKyAqLworc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSB7CisJX19iZTMyCQl2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoaXMgY2hhbGxlbmdlIHR5cGUgKi8KKwlfX2JlMzIJCW5vbmNlOwkJLyogZW5jcnlwdGVkIHJhbmRvbSBudW1iZXIgKi8KKwlfX2JlMzIJCW1pbl9sZXZlbDsJLyogbWluaW11bSBzZWN1cml0eSBsZXZlbCAqLworCV9fYmUzMgkJX19wYWRkaW5nOwkvKiBwYWRkaW5nIHRvIDgtYnl0ZSBib3VuZGFyeSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEtlcmJlcm9zIHNlY3VyaXR5IHR5cGUtMiByZXNwb25zZSBwYWNrZXQKKyAqLworc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHsKKwlfX2JlMzIJCXZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhpcyByZXBvbnNlIHR5cGUgKi8KKwlfX2JlMzIJCV9fcGFkOworCisJLyogZW5jcnlwdGVkIGJpdCBvZiB0aGUgcmVzcG9uc2UgKi8KKwlzdHJ1Y3QgeworCQlfX2JlMzIJCWVwb2NoOwkJLyogY3VycmVudCBlcG9jaCAqLworCQlfX2JlMzIJCWNpZDsJCS8qIHBhcmVudCBjb25uZWN0aW9uIElEICovCisJCV9fYmUzMgkJY2hlY2tzdW07CS8qIGNoZWNrc3VtICovCisJCV9fYmUzMgkJc2VjdXJpdHlJbmRleDsJLyogc2VjdXJpdHkgdHlwZSAqLworCQlfX2JlMzIJCWNhbGxfaWRbNF07CS8qIGVuY3J5cHRlZCBjYWxsIElEcyAqLworCQlfX2JlMzIJCWluY19ub25jZTsJLyogY2hhbGxlbmdlIG5vbmNlICsgMSAqLworCQlfX2JlMzIJCWxldmVsOwkJLyogZGVzaXJlZCBsZXZlbCAqLworCX0gZW5jcnlwdGVkOworCisJX19iZTMyCQlrdm5vOwkJLyogS2VyYmVyb3Mga2V5IHZlcnNpb24gbnVtYmVyICovCisJX19iZTMyCQl0aWNrZXRfbGVuOwkvKiBLZXJiZXJvcyB0aWNrZXQgbGVuZ3RoICAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ4UlBDLWxldmVsIGFib3J0IGNvZGVzCisgKi8KKyNkZWZpbmUgUlhfQ0FMTF9ERUFECQktMQkvKiBjYWxsL2Nvbm4gaGFzIGJlZW4gaW5hY3RpdmUgYW5kIGlzIHNodXQgZG93biAqLworI2RlZmluZSBSWF9JTlZBTElEX09QRVJBVElPTgktMgkvKiBpbnZhbGlkIG9wZXJhdGlvbiByZXF1ZXN0ZWQgLyBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUgUlhfQ0FMTF9USU1FT1VUCQktMwkvKiBjYWxsIHRpbWVvdXQgZXhjZWVkZWQgKi8KKyNkZWZpbmUgUlhfRU9GCQkJLTQJLyogdW5leHBlY3RlZCBlbmQgb2YgZGF0YSBvbiByZWFkIG9wICovCisjZGVmaW5lIFJYX1BST1RPQ09MX0VSUk9SCS01CS8qIGxvdy1sZXZlbCBwcm90b2NvbCBlcnJvciAqLworI2RlZmluZSBSWF9VU0VSX0FCT1JUCQktNgkvKiBnZW5lcmljIHVzZXIgYWJvcnQgKi8KKyNkZWZpbmUgUlhfQUREUklOVVNFCQktNwkvKiBVRFAgcG9ydCBpbiB1c2UgKi8KKyNkZWZpbmUgUlhfREVCVUdJX0JBRFRZUEUJLTgJLyogYmFkIGRlYnVnZ2luZyBwYWNrZXQgdHlwZSAqLworCisvKgorICogKHVuKW1hcnNoYWxsaW5nIGFib3J0IGNvZGVzIChyeGdlbikKKyAqLworI2RlZmluZQlSWEdFTl9DQ19NQVJTSEFMICAgIC00NTAKKyNkZWZpbmUJUlhHRU5fQ0NfVU5NQVJTSEFMICAtNDUxCisjZGVmaW5lCVJYR0VOX1NTX01BUlNIQUwgICAgLTQ1MgorI2RlZmluZQlSWEdFTl9TU19VTk1BUlNIQUwgIC00NTMKKyNkZWZpbmUJUlhHRU5fREVDT0RFCSAgICAtNDU0CisjZGVmaW5lCVJYR0VOX09QQ09ERQkgICAgLTQ1NQorI2RlZmluZQlSWEdFTl9TU19YRFJGUkVFICAgIC00NTYKKyNkZWZpbmUJUlhHRU5fQ0NfWERSRlJFRSAgICAtNDU3CisKKy8qCisgKiBSeCBrZXJiZXJvcyBzZWN1cml0eSBhYm9ydCBjb2RlcworICogLSB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gZ2VuZXJhbGlzZWQgc2VjdXJpdHkgYWJvcnQgY29kZXMgdG8gc2F5IHRoaW5ncworICogICBsaWtlICJ1bnN1cHBvcnRlZCBzZWN1cml0eSIsIHNvIHdlIGhhdmUgdG8gdXNlIHRoZXNlIGluc3RlYWQgYW5kIGhvcGUgdGhlCisgKiAgIG90aGVyIHNpZGUgdW5kZXJzdGFuZHMKKyAqLworI2RlZmluZSBSWEtBRElOQ09OU0lTVEVOQ1kJMTkyNzA0MDAJLyogc2VjdXJpdHkgbW9kdWxlIHN0cnVjdHVyZSBpbmNvbnNpc3RlbnQgKi8KKyNkZWZpbmUgUlhLQURQQUNLRVRTSE9SVAkxOTI3MDQwMQkvKiBwYWNrZXQgdG9vIHNob3J0IGZvciBzZWN1cml0eSBjaGFsbGVuZ2UgKi8KKyNkZWZpbmUgUlhLQURMRVZFTEZBSUwJCTE5MjcwNDAyCS8qIHNlY3VyaXR5IGxldmVsIG5lZ290aWF0aW9uIGZhaWxlZCAqLworI2RlZmluZSBSWEtBRFRJQ0tFVExFTgkJMTkyNzA0MDMJLyogdGlja2V0IGxlbmd0aCB0b28gc2hvcnQgb3IgdG9vIGxvbmcgKi8KKyNkZWZpbmUgUlhLQURPVVRPRlNFUVVFTkNFCTE5MjcwNDA0CS8qIHBhY2tldCBoYWQgYmFkIHNlcXVlbmNlIG51bWJlciAqLworI2RlZmluZSBSWEtBRE5PQVVUSAkJMTkyNzA0MDUJLyogY2FsbGVyIG5vdCBhdXRob3Jpc2VkICovCisjZGVmaW5lIFJYS0FEQkFES0VZCQkxOTI3MDQwNgkvKiBpbGxlZ2FsIGtleTogYmFkIHBhcml0eSBvciB3ZWFrICovCisjZGVmaW5lIFJYS0FEQkFEVElDS0VUCQkxOTI3MDQwNwkvKiBzZWN1cml0eSBvYmplY3Qgd2FzIHBhc3NlZCBhIGJhZCB0aWNrZXQgKi8KKyNkZWZpbmUgUlhLQURVTktOT1dOS0VZCQkxOTI3MDQwOAkvKiB0aWNrZXQgY29udGFpbmVkIHVua25vd24ga2V5IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFJYS0FERVhQSVJFRAkJMTkyNzA0MDkJLyogYXV0aGVudGljYXRpb24gZXhwaXJlZCAqLworI2RlZmluZSBSWEtBRFNFQUxFRElOQ09OCTE5MjcwNDEwCS8qIHNlYWxlZCBkYXRhIGluY29uc2lzdGVudCAqLworI2RlZmluZSBSWEtBRERBVEFMRU4JCTE5MjcwNDExCS8qIHVzZXIgZGF0YSB0b28gbG9uZyAqLworI2RlZmluZSBSWEtBRElMTEVHQUxMRVZFTAkxOTI3MDQxMgkvKiBjYWxsZXIgbm90IGF1dGhvcmlzZWQgdG8gdXNlIGVuY3J5cHRlZCBjb25ucyAqLworCiAjZW5kaWYgLyogX0xJTlVYX1JYUlBDX1BBQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3BlZXIuaCBiL2luY2x1ZGUvcnhycGMvcGVlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhmZTk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvcGVlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogcGVlci5oOiBSeCBSUEMgcGVyLXRyYW5zcG9ydCBwZWVyIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19QRUVSX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX1BFRVJfSAotCi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPHJ4cnBjL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4dGltb2QuaD4KLQotc3RydWN0IHJ4cnBjX3BlZXJfb3BzCi17Ci0JLyogcGVlciByZWNvcmQgYmVpbmcgYWRkZWQgKi8KLQlpbnQgKCphZGRpbmcpKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKLQotCS8qIHBlZXIgcmVjb3JkIGJlaW5nIGRpc2NhcmRlZCBmcm9tIGdyYXZleWFyZCAqLwotCXZvaWQgKCpkaXNjYXJkaW5nKShzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLQkvKiBjaGFuZ2Ugb2YgZXBvY2ggZGV0ZWN0ZWQgb24gY29ubmVjdGlvbiAqLwotCXZvaWQgKCpjaGFuZ2Vfb2ZfZXBvY2gpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBSUEMgcGVyLXRyYW5zcG9ydCBwZWVyIHJlY29yZAotICogLSBwZWVycyBvbmx5IHJldGFpbiBhIHJlZmNvdW50IG9uIHRoZSB0cmFuc3BvcnQgd2hlbiB0aGV5IGFyZSBhY3RpdmUKLSAqIC0gcGVlcnMgd2l0aCByZWZjb3VudD09MCBhcmUgaW5hY3RpdmUgYW5kIHJlc2lkZSBpbiB0aGUgdHJhbnNwb3J0J3MgZ3JhdmV5YXJkCi0gKi8KLXN0cnVjdCByeHJwY19wZWVyCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCByeHJwY19wZWVyX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyBvbiB0aGlzIHBlZXIgKi8KLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIG93bmVyIHRyYW5zcG9ydCAqLwotCXN0cnVjdCByeHJwY190aW1lcgl0aW1lb3V0OwkvKiB0aW1lb3V0IGZvciBncmF2ZSBkZXN0cnVjdGlvbiAqLwotCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gdHJhbnNwb3J0J3MgcGVlciBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlwcm9jX2xpbms7CS8qIGxpbmsgaW4gL3Byb2MgbGlzdCAqLwotCXJ3bG9ja190CQljb25uX2lkbG9jazsJLyogbG9jayBmb3IgY29ubmVjdGlvbiBJRHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWNvbm5faWRsaXN0OwkvKiBsaXN0IG9mIGNvbm5lY3Rpb25zIGdyYW50ZWQgSURzICovCi0JdWludDMyX3QJCWNvbm5faWRjb3VudGVyOwkvKiBjb25uZWN0aW9uIElEIGNvdW50ZXIgKi8KLQlyd2xvY2tfdAkJY29ubl9sb2NrOwkvKiBsb2NrIGZvciBhY3RpdmUvZGVhZCBjb25uZWN0aW9ucyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY29ubl9hY3RpdmU7CS8qIGFjdGl2ZSBjb25uZWN0aW9ucyB0by9mcm9tIHRoaXMgcGVlciAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY29ubl9ncmF2ZXlhcmQ7CS8qIGdyYXZleWFyZCBmb3IgaW5hY3RpdmUgY29ubmVjdGlvbnMgKi8KLQlzcGlubG9ja190CQljb25uX2d5bG9jazsJLyogbG9jayBmb3IgY29ubl9ncmF2ZXlhcmQgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAljb25uX2d5X3dhaXRxOwkvKiB3YWl0IHF1ZXVlIGhpdCB3aGVuIGdyYXZleWFyZCBpcyBlbXB0eSAqLwotCWF0b21pY190CQljb25uX2NvdW50OwkvKiBudW1iZXIgb2YgYXR0YWNoZWQgY29ubmVjdGlvbnMgKi8KLQlzdHJ1Y3QgaW5fYWRkcgkJYWRkcjsJCS8qIHJlbW90ZSBhZGRyZXNzICovCi0Jc2l6ZV90CQkJaWZfbXR1OwkJLyogaW50ZXJmYWNlIE1UVSBmb3IgdGhpcyBwZWVyICovCi0Jc3BpbmxvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCi0KLQl2b2lkCQkJKnVzZXI7CQkvKiBhcHBsaWNhdGlvbiBsYXllciBkYXRhICovCi0KLQkvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLwotI2RlZmluZSBSWFJQQ19SVFRfQ0FDSEVfU0laRSAzMgotCXN1c2Vjb25kc190CQlydHQ7CQkvKiBjdXJyZW50IFJUVCBlc3RpbWF0ZSAoaW4gdVMpICovCi0JdW5zaWduZWQJCXJ0dF9wb2ludDsJLyogbmV4dCBlbnRyeSBhdCB3aGljaCB0byBpbnNlcnQgKi8KLQl1bnNpZ25lZAkJcnR0X3VzYWdlOwkvKiBhbW91bnQgb2YgY2FjaGUgYWN0dWFsbHkgdXNlZCAqLwotCXN1c2Vjb25kc190CQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLwotfTsKLQotCi1leHRlcm4gaW50IHJ4cnBjX3BlZXJfbG9va3VwKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgICBfX2JlMzIgYWRkciwKLQkJCSAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKipfcGVlcik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKTwwKTsKLQlhdG9taWNfaW5jKCZwZWVyLT51c2FnZSk7Ci0JLy9wcmludGsoInJ4cnBjX2dldF9wZWVyKCVwe3U9JWR9KVxuIixwZWVyLGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfUEVFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3J4cnBjLmggYi9pbmNsdWRlL3J4cnBjL3J4cnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTg3NGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9yeHJwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogcnguaDogUnggUlBDIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19SWFJQQ19ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19SWFJQQ19ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLWV4dGVybiBfX2JlMzIgcnhycGNfZXBvY2g7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi1leHRlcm4gaW50IHJ4cnBjX2t0cmFjZTsKLWV4dGVybiBpbnQgcnhycGNfa2RlYnVnOwotZXh0ZXJuIGludCByeHJwY19rcHJvdG87Ci1leHRlcm4gaW50IHJ4cnBjX2tuZXQ7Ci0jZWxzZQotI2RlZmluZSByeHJwY19rdHJhY2UJMAotI2RlZmluZSByeHJwY19rZGVidWcJMAotI2RlZmluZSByeHJwY19rcHJvdG8JMAotI2RlZmluZSByeHJwY19rbmV0CTAKLSNlbmRpZgotCi1leHRlcm4gaW50IHJ4cnBjX3N5c2N0bF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcnhycGNfc3lzY3RsX2NsZWFudXAodm9pZCk7Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy90cmFuc3BvcnQuaCBiL2luY2x1ZGUvcnhycGMvdHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2I5NjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiB0cmFuc3BvcnQuaDogUnggdHJhbnNwb3J0IG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfVFJBTlNQT1JUX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLQotdHlwZWRlZiBpbnQgKCpyeHJwY19uZXdjYWxsX2ZueF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCByeHJwY19rcnhpb2Rfd3E7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBvcGVyYXRpb24gc3BlY2lmaWNhdGlvbgotICogLSB0YWJsZXMgb2YgdGhlc2UgbXVzdCBiZSBzb3J0ZWQgYnkgb3AgSUQgc28gdGhhdCB0aGV5IGNhbiBiZSBiaW5hcnktY2hvcCBzZWFyY2hlZAotICovCi1zdHJ1Y3QgcnhycGNfb3BlcmF0aW9uCi17Ci0JdW5zaWduZWQJCWlkOwkJLyogb3BlcmF0aW9uIElEICovCi0Jc2l6ZV90CQkJYXNpemU7CQkvKiBtaW5pbXVtIHNpemUgb2YgYXJndW1lbnQgYmxvY2sgKi8KLQljb25zdCBjaGFyCQkqbmFtZTsJCS8qIG5hbWUgb2Ygb3BlcmF0aW9uICovCi0Jdm9pZAkJCSp1c2VyOwkJLyogaW5pdGlhbCB1c2VyIGRhdGEgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCB0cmFuc3BvcnQgc2VydmljZSByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX3NlcnZpY2UKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHNlcnZpY2VzIGxpc3Qgb24gdHJhbnNwb3J0ICovCi0Jc3RydWN0IG1vZHVsZQkJKm93bmVyOwkJLyogb3duZXIgbW9kdWxlICovCi0JcnhycGNfbmV3Y2FsbF9mbnhfdAluZXdfY2FsbDsJLyogbmV3IGNhbGwgaGFuZGxlciBmdW5jdGlvbiAqLwotCWNvbnN0IGNoYXIJCSpuYW1lOwkJLyogbmFtZSBvZiBzZXJ2aWNlICovCi0JdW5zaWduZWQgc2hvcnQJCXNlcnZpY2VfaWQ7CS8qIFJ4IHNlcnZpY2UgSUQgKi8KLQlyeHJwY19jYWxsX2F0dG5fZnVuY190CWF0dG5fZnVuYzsJLyogY2FsbCByZXF1aXJlcyBhdHRlbnRpb24gY2FsbGJhY2sgKi8KLQlyeHJwY19jYWxsX2Vycm9yX2Z1bmNfdAllcnJvcl9mdW5jOwkvKiBjYWxsIGVycm9yIGNhbGxiYWNrICovCi0JcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QJYWVtYXBfZnVuYzsJLyogYWJvcnQgLT4gZXJybm8gbWFwcGluZyBjYWxsYmFjayAqLwotCi0JY29uc3Qgc3RydWN0IHJ4cnBjX29wZXJhdGlvbgkqb3BzX2JlZ2luOwkvKiBiZWdpbm5pbmcgb2Ygb3BlcmF0aW9ucyB0YWJsZSAqLwotCWNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24JKm9wc19lbmQ7CS8qIGVuZCBvZiBvcGVyYXRpb25zIHRhYmxlICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggdHJhbnNwb3J0IGVuZHBvaW50IHJlY29yZAotICovCi1zdHJ1Y3QgcnhycGNfdHJhbnNwb3J0Ci17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlcnZpY2VzOwkvKiBzZXJ2aWNlcyBsaXN0ZW5pbmcgb24gdGhpcyBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHRyYW5zcG9ydCBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlwcm9jX2xpbms7CS8qIGxpbmsgaW4gdHJhbnNwb3J0IHByb2MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJa3J4aW9kcV9saW5rOwkvKiBrcnhpb2QgYXR0ZW50aW9uIHF1ZXVlIGxpbmsgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBlZXJfYWN0aXZlOwkvKiBhY3RpdmUgcGVlcnMgY29ubmVjdGVkIHRvIG92ZXIgdGhpcyBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBlZXJfZ3JhdmV5YXJkOwkvKiBpbmFjdGl2ZSBwZWVyIGxpc3QgKi8KLQlzcGlubG9ja190CQlwZWVyX2d5bG9jazsJLyogcGVlciBncmF2ZXlhcmQgbG9jayAqLwotCXdhaXRfcXVldWVfaGVhZF90CXBlZXJfZ3lfd2FpdHE7CS8qIHdhaXQgcXVldWUgaGl0IHdoZW4gcGVlciBncmF2ZXlhcmQgaXMgZW1wdHkgKi8KLQlyd2xvY2tfdAkJcGVlcl9sb2NrOwkvKiBwZWVyIGxpc3QgYWNjZXNzIGxvY2sgKi8KLQlhdG9taWNfdAkJcGVlcl9jb3VudDsJLyogbnVtYmVyIG9mIHBlZXJzICovCi0Jc3RydWN0IHJ4cnBjX3BlZXJfb3BzCSpwZWVyX29wczsJLyogZGVmYXVsdCBwZWVyIG9wZXJhdGlvbnMgKi8KLQl1bnNpZ25lZCBzaG9ydAkJcG9ydDsJCS8qIHBvcnQgdXBvbiB3aGljaCBsaXN0ZW5pbmcgKi8KLQl2b2xhdGlsZSBjaGFyCQllcnJvcl9yY3ZkOwkvKiBUIGlmIHJlY2VpdmVkIElDTVAgZXJyb3Igb3V0c3RhbmRpbmcgKi8KLX07Ci0KLWV4dGVybiBpbnQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJCSAgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKl90cmFucyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQotewotCUJVR19PTihhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSA8PSAwKTsKLQlhdG9taWNfaW5jKCZ0cmFucy0+dXNhZ2UpOwotCS8vcHJpbnRrKCJyeHJwY19nZXRfdHJhbnNwb3J0KCVwe3U9JWR9KVxuIiwKLQkvLyAgICAgICB0cmFucywgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotZXh0ZXJuIGludCByeHJwY19hZGRfc2VydmljZShzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCSAgICAgc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydik7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2RlbF9zZXJ2aWNlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgICAgc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydik7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotZXh0ZXJuIGludCByeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJICAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJICAgICAgIGludCBlcnJvcik7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggNzZjOWExMS4uNGU5ZDIwOCAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiBzdGF0aWMgdm9pZCBhdWRpdF9zZXRfcGlkKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBwaWRfdCBwaWQpCiB7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopYWItPnNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IG5sbXNnX2hkcihhYi0+c2tiKTsKIAlubGgtPm5sbXNnX3BpZCA9IHBpZDsKIH0KIApAQCAtNzUwLDcgKzc1MCw3IEBACiAJdTMyCQlybGVuOwogCiAJd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJCW5saCA9IG5sbXNnX2hkcihza2IpOwogCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKIAkJCXJldHVybjsKIAkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKQEAgLTc5NSw3ICs3OTUsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImF1ZGl0OiBpbml0aWFsaXppbmcgbmV0bGluayBzb2NrZXQgKCVzKVxuIiwKIAkgICAgICAgYXVkaXRfZGVmYXVsdCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCWF1ZGl0X3NvY2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19BVURJVCwgMCwgYXVkaXRfcmVjZWl2ZSwKLQkJCQkJICAgVEhJU19NT0RVTEUpOworCQkJCQkgICBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKCFhdWRpdF9zb2NrKQogCQlhdWRpdF9wYW5pYygiY2Fubm90IGluaXRpYWxpemUgbmV0bGluayBzb2NrZXQiKTsKIAllbHNlCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCQkJZ290byBvdXQ7CiAJfQogCXZhX2NvcHkoYXJnczIsIGFyZ3MpOwotCWxlbiA9IHZzbnByaW50Zihza2ItPnRhaWwsIGF2YWlsLCBmbXQsIGFyZ3MpOworCWxlbiA9IHZzbnByaW50Zihza2JfdGFpbF9wb2ludGVyKHNrYiksIGF2YWlsLCBmbXQsIGFyZ3MpOwogCWlmIChsZW4gPj0gYXZhaWwpIHsKIAkJLyogVGhlIHByaW50ayBidWZmZXIgaXMgMTAyNCBieXRlcyBsb25nLCBzbyBpZiB3ZSBnZXQKIAkJICogaGVyZSBhbmQgQVVESVRfQlVGU0laIGlzIGF0IGxlYXN0IDEwMjQsIHRoZW4gd2UgY2FuCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCQkJbWF4X3QodW5zaWduZWQsIEFVRElUX0JVRlNJWiwgMStsZW4tYXZhaWwpKTsKIAkJaWYgKCFhdmFpbCkKIAkJCWdvdG8gb3V0OwotCQlsZW4gPSB2c25wcmludGYoc2tiLT50YWlsLCBhdmFpbCwgZm10LCBhcmdzMik7CisJCWxlbiA9IHZzbnByaW50Zihza2JfdGFpbF9wb2ludGVyKHNrYiksIGF2YWlsLCBmbXQsIGFyZ3MyKTsKIAl9CiAJaWYgKGxlbiA+IDApCiAJCXNrYl9wdXQoc2tiLCBsZW4pOwpAQCAtMTE0Myw3ICsxMTQzLDcgQEAKIAkJCXJldHVybjsKIAl9CiAKLQlwdHIgPSBza2ItPnRhaWw7CisJcHRyID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CiAJCSpwdHIrKyA9IGhleFsoYnVmW2ldICYgMHhGMCk+PjRdOyAvKiBVcHBlciBuaWJibGUgKi8KIAkJKnB0cisrID0gaGV4W2J1ZltpXSAmIDB4MEZdOwkgIC8qIExvd2VyIG5pYmJsZSAqLwpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAkJaWYgKCFhdmFpbCkKIAkJCXJldHVybjsKIAl9Ci0JcHRyID0gc2tiLT50YWlsOworCXB0ciA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAkqcHRyKysgPSAnIic7CiAJbWVtY3B5KHB0ciwgc3RyaW5nLCBzbGVuKTsKIAlwdHIgKz0gc2xlbjsKQEAgLTEyNjgsNyArMTI2OCw3IEBACiAJCWF1ZGl0X2xvZ19sb3N0KCJyYXRlIGxpbWl0IGV4Y2VlZGVkIik7CiAJfSBlbHNlIHsKIAkJaWYgKGF1ZGl0X3BpZCkgewotCQkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopYWItPnNrYi0+ZGF0YTsKKwkJCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gbmxtc2dfaGRyKGFiLT5za2IpOwogCQkJbmxoLT5ubG1zZ19sZW4gPSBhYi0+c2tiLT5sZW4gLSBOTE1TR19TUEFDRSgwKTsKIAkJCXNrYl9xdWV1ZV90YWlsKCZhdWRpdF9za2JfcXVldWUsIGFiLT5za2IpOwogCQkJYWItPnNrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBiNzQ4NjBhLi5mNWNmZGU4IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAogCXJldHVybiB0aW1lc3BlY190b19rdGltZShub3cpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoa3RpbWVfZ2V0KTsKIAogLyoqCiAgKiBrdGltZV9nZXRfcmVhbCAtIGdldCB0aGUgcmVhbCAod2FsbC0pIHRpbWUgaW4ga3RpbWVfdCBmb3JtYXQKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCA0YzM0NzZmLi5hZDdkMjM5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC0xMDIsNyArMTAyLDcgQEAKICAqLwogc3RhdGljIGludCBzZW5kX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHBpZF90IHBpZCkKIHsKLQlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubGhkciA9IG5sbXNnX2RhdGEoKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YSk7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmxoZHIgPSBubG1zZ19kYXRhKG5sbXNnX2hkcihza2IpKTsKIAl2b2lkICpyZXBseSA9IGdlbmxtc2dfZGF0YShnZW5saGRyKTsKIAlpbnQgcmM7CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogc3RhdGljIHZvaWQgc2VuZF9jcHVfbGlzdGVuZXJzKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCXN0cnVjdCBsaXN0ZW5lcl9saXN0ICpsaXN0ZW5lcnMpCiB7Ci0Jc3RydWN0IGdlbmxtc2doZHIgKmdlbmxoZHIgPSBubG1zZ19kYXRhKChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGEpOworCXN0cnVjdCBnZW5sbXNnaGRyICpnZW5saGRyID0gbmxtc2dfZGF0YShubG1zZ19oZHIoc2tiKSk7CiAJc3RydWN0IGxpc3RlbmVyICpzLCAqdG1wOwogCXN0cnVjdCBza19idWZmICpza2JfbmV4dCwgKnNrYl9jdXIgPSBza2I7CiAJdm9pZCAqcmVwbHkgPSBnZW5sbXNnX2RhdGEoZ2VubGhkcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCAyZjQ3ODg4Li5iYTE4ZWM0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTQ1Miw2ICs0NTIsNyBAQAogCiAJcmV0dXJuIHRzOwogfQorRVhQT1JUX1NZTUJPTChuc190b190aW1lc3BlYyk7CiAKIC8qKgogICogbnNfdG9fdGltZXZhbCAtIENvbnZlcnQgbmFub3NlY29uZHMgdG8gdGltZXZhbApAQCAtNDY5LDYgKzQ3MCw3IEBACiAKIAlyZXR1cm4gdHY7CiB9CitFWFBPUlRfU1lNQk9MKG5zX3RvX3RpbWV2YWwpOwogCiAvKgogICogQ29udmVydCBqaWZmaWVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYmFjay4KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggZGQ2YzJjMS4uYjIyYmQzOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTUwNSw2ICs1MDUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0wodHJ5X3RvX2RlbF90aW1lcl9zeW5jKTsKKwogLyoqCiAgKiBkZWxfdGltZXJfc3luYyAtIGRlYWN0aXZhdGUgYSB0aW1lciBhbmQgd2FpdCBmb3IgdGhlIGhhbmRsZXIgdG8gZmluaXNoLgogICogQHRpbWVyOiB0aGUgdGltZXIgdG8gYmUgZGVhY3RpdmF0ZWQKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggM2YzZTc0MC4uNzlhZmQwMCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTI2MSw3ICsyNjEsNyBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUICYmIFNUQUNLVFJBQ0VfU1VQUE9SVCAmJiBMT0NLREVQX1NVUFBPUlQKIAlzZWxlY3QgU1RBQ0tUUkFDRQotCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFYODYKKwlzZWxlY3QgRlJBTUVfUE9JTlRFUiBpZiAhWDg2ICYmICFNSVBTCiAJc2VsZWN0IEtBTExTWU1TCiAJc2VsZWN0IEtBTExTWU1TX0FMTAogCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggOTkyYTM5ZS4uYWU1N2YzNSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogbGliLXkgOj0gY3R5cGUubyBzdHJpbmcubyB2c3ByaW50Zi5vIGNtZGxpbmUubyBcCiAJIHJidHJlZS5vIHJhZGl4LXRyZWUubyBkdW1wX3N0YWNrLm8gXAotCSBpZHIubyBkaXY2NC5vIGludF9zcXJ0Lm8gYml0bWFwLm8gZXh0YWJsZS5vIHByaW9fdHJlZS5vIFwKKwkgaWRyLm8gaW50X3NxcnQubyBiaXRtYXAubyBleHRhYmxlLm8gcHJpb190cmVlLm8gXAogCSBzaGExLm8gaXJxX3JlZ3MubyByZWNpcHJvY2FsX2Rpdi5vCiAKIGxpYi0kKENPTkZJR19NTVUpICs9IGlvcmVtYXAubwpAQCAtMTIsNyArMTIsOCBAQAogCiBsaWIteQkrPSBrb2JqZWN0Lm8ga3JlZi5vIGtvYmplY3RfdWV2ZW50Lm8ga2xpc3QubwogCi1vYmoteSArPSBzb3J0Lm8gcGFyc2VyLm8gaGFsZm1kNC5vIGRlYnVnX2xvY2tzLm8gcmFuZG9tMzIubyBidXN0X3NwaW5sb2Nrcy5vCitvYmoteSArPSBkaXY2NC5vIHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vIFwKKwkgYnVzdF9zcGlubG9ja3MubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19LT0JKRUNUKSx5KQogQ0ZMQUdTX2tvYmplY3QubyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9saWIvZGl2NjQuYyBiL2xpYi9kaXY2NC5jCmluZGV4IDM2NTcxOWYuLmI3MWNmOTMgMTAwNjQ0Ci0tLSBhL2xpYi9kaXY2NC5jCisrKyBiL2xpYi9kaXY2NC5jCkBAIC0yMyw3ICsyMyw3IEBACiAvKiBOb3QgbmVlZGVkIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMgKi8KICNpZiBCSVRTX1BFUl9MT05HID09IDMyCiAKLXVpbnQzMl90IF9fZGl2NjRfMzIodWludDY0X3QgKm4sIHVpbnQzMl90IGJhc2UpCit1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgX19kaXY2NF8zMih1aW50NjRfdCAqbiwgdWludDMyX3QgYmFzZSkKIHsKIAl1aW50NjRfdCByZW0gPSAqbjsKIAl1aW50NjRfdCBiID0gYmFzZTsKQEAgLTU4LDQgKzU4LDI0IEBACiAKIEVYUE9SVF9TWU1CT0woX19kaXY2NF8zMik7CiAKKy8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCit1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcikKK3sKKwl1aW50MzJfdCBoaWdoLCBkOworCisJaGlnaCA9IGRpdmlzb3IgPj4gMzI7CisJaWYgKGhpZ2gpIHsKKwkJdW5zaWduZWQgaW50IHNoaWZ0ID0gZmxzKGhpZ2gpOworCisJCWQgPSBkaXZpc29yID4+IHNoaWZ0OworCQlkaXZpZGVuZCA+Pj0gc2hpZnQ7CisJfSBlbHNlCisJCWQgPSBkaXZpc29yOworCisJZG9fZGl2KGRpdmlkZW5kLCBkKTsKKworCXJldHVybiBkaXZpZGVuZDsKK30KK0VYUE9SVF9TWU1CT0woZGl2NjRfNjQpOworCiAjZW5kaWYgLyogQklUU19QRVJfTE9ORyA9PSAzMiAqLwpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3RfdWV2ZW50LmMgYi9saWIva29iamVjdF91ZXZlbnQuYwppbmRleCA4NDI3MmVkLi44MmZjMTc5IDEwMDY0NAotLS0gYS9saWIva29iamVjdF91ZXZlbnQuYworKysgYi9saWIva29iamVjdF91ZXZlbnQuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBrb2JqZWN0X3VldmVudF9pbml0KHZvaWQpCiB7CiAJdWV2ZW50X3NvY2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19LT0JKRUNUX1VFVkVOVCwgMSwgTlVMTCwKLQkJCQkJICAgIFRISVNfTU9EVUxFKTsKKwkJCQkJICAgIE5VTEwsIFRISVNfTU9EVUxFKTsKIAogCWlmICghdWV2ZW50X3NvY2spIHsKIAkJcHJpbnRrKEtFUk5fRVJSCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCBmNDY5ZTNjLi5hNzk0OTQ1IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTY3LDEyICs2NywxMiBAQAogLyoKICAqIFN0YXJ0IGJhY2tncm91bmQgd3JpdGViYWNrICh2aWEgcGRmbHVzaCkgYXQgdGhpcyBwZXJjZW50YWdlCiAgKi8KLWludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvID0gMTA7CitpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpbyA9IDU7CiAKIC8qCiAgKiBUaGUgZ2VuZXJhdG9yIG9mIGRpcnR5IGRhdGEgc3RhcnRzIHdyaXRlYmFjayBhdCB0aGlzIHBlcmNlbnRhZ2UKICAqLwotaW50IHZtX2RpcnR5X3JhdGlvID0gNDA7CitpbnQgdm1fZGlydHlfcmF0aW8gPSAxMDsKIAogLyoKICAqIFRoZSBpbnRlcnZhbCBiZXR3ZWVuIGBrdXBkYXRlJy1zdHlsZSB3cml0ZWJhY2tzLCBpbiBqaWZmaWVzCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggYjgyMTQ2ZS4uNTlkYTViNyAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNDk4LDggKzQ5OCwxMCBAQAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAkJaWYgKG1hcHBpbmcpCiAJCQlyZXQgPSBwYWdlX21rY2xlYW5fZmlsZShtYXBwaW5nLCBwYWdlKTsKLQkJaWYgKHBhZ2VfdGVzdF9hbmRfY2xlYXJfZGlydHkocGFnZSkpCisJCWlmIChwYWdlX3Rlc3RfZGlydHkocGFnZSkpIHsKKwkJCXBhZ2VfY2xlYXJfZGlydHkocGFnZSk7CiAJCQlyZXQgPSAxOworCQl9CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTYwNSw4ICs2MDcsMTAgQEAKIAkJICogTGVhdmluZyBpdCBzZXQgYWxzbyBoZWxwcyBzd2Fwb2ZmIHRvIHJlaW5zdGF0ZSBwdGVzCiAJCSAqIGZhc3RlciBmb3IgdGhvc2UgcGFnZXMgc3RpbGwgaW4gc3dhcGNhY2hlLgogCQkgKi8KLQkJaWYgKHBhZ2VfdGVzdF9hbmRfY2xlYXJfZGlydHkocGFnZSkpCisJCWlmIChwYWdlX3Rlc3RfZGlydHkocGFnZSkpIHsKKwkJCXBhZ2VfY2xlYXJfZGlydHkocGFnZSk7CiAJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJfQogCQlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwKIAkJCQlQYWdlQW5vbihwYWdlKSA/IE5SX0FOT05fUEFHRVMgOiBOUl9GSUxFX01BUFBFRCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mZGRpLmMgYi9uZXQvODAyL2ZkZGkuYwppbmRleCBhY2U2Mzg2Li45MWRkZTQxIDEwMDY0NAotLS0gYS9uZXQvODAyL2ZkZGkuYworKysgYi9uZXQvODAyL2ZkZGkuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJc3RydWN0IGZkZGloZHIgKmZkZGkgPSAoc3RydWN0IGZkZGloZHIgKilza2ItPmRhdGE7CiAKICNpZmRlZiBDT05GSUdfSU5FVAotCWlmIChmZGRpLT5oZHIubGxjX3NuYXAuZXRoZXJ0eXBlID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKQorCWlmIChmZGRpLT5oZHIubGxjX3NuYXAuZXRoZXJ0eXBlID09IGh0b25zKEVUSF9QX0lQKSkKIAkJLyogVHJ5IHRvIGdldCBBUlAgdG8gcmVzb2x2ZSB0aGUgaGVhZGVyIGFuZCBmaWxsIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KIAkJcmV0dXJuIGFycF9maW5kKGZkZGktPmRhZGRyLCBza2IpOwogCWVsc2UKQEAgLTEzMCwxMiArMTMwLDEzIEBACiAJICogdG8gc3RhcnQgb2YgcGFja2V0IGRhdGEuICBBc3N1bWUgODAyLjIgU05BUCBmcmFtZXMgZm9yIG5vdy4KIAkgKi8KIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsJLyogcG9pbnQgdG8gZnJhbWUgY29udHJvbCAoRkMpICovCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsJLyogcG9pbnQgdG8gZnJhbWUgY29udHJvbCAoRkMpICovCiAKIAlpZihmZGRpLT5oZHIubGxjXzgwMjJfMS5kc2FwPT0weGUwKQogCXsKIAkJc2tiX3B1bGwoc2tiLCBGRERJX0tfODAyMl9ITEVOLTMpOwotCQl0eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMik7CisJCXR5cGUgPSBodG9ucyhFVEhfUF84MDJfMik7CiAJfQogCWVsc2UKIAl7CmRpZmYgLS1naXQgYS9uZXQvODAyL2hpcHBpLmMgYi9uZXQvODAyL2hpcHBpLmMKaW5kZXggNTc4ZjJhMy4uODdmZmMxMiAxMDA2NDQKLS0tIGEvbmV0LzgwMi9oaXBwaS5jCisrKyBiL25ldC84MDIvaGlwcGkuYwpAQCAtNjAsNyArNjAsNyBAQAogCSAqIER1ZSB0byB0aGUgc3R1cGlkaXR5IG9mIHRoZSBsaXR0bGUgZW5kaWFuIGJ5dGUtb3JkZXIgd2UKIAkgKiBoYXZlIHRvIHNldCB0aGUgZnAgZmllbGQgdGhpcyB3YXkuCiAJICovCi0JaGlwLT5mcC5maXhlZAkJPSBfX2NvbnN0YW50X2h0b25sKDB4MDQ4MDAwMTgpOworCWhpcC0+ZnAuZml4ZWQJCT0gaHRvbmwoMHgwNDgwMDAxOCk7CiAJaGlwLT5mcC5kMl9zaXplCQk9IGh0b25sKGxlbiArIDgpOwogCWhpcC0+bGUuZmMJCT0gMDsKIAloaXAtPmxlLmRvdWJsZV93aWRlCT0gMDsJLyogb25seSBISVBQSSA4MDAgZm9yIHRoZSB0aW1lIGJlaW5nICovCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKiBPbmx5IElQIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQKIAkgKi8KIAotCWlmKGhpcC0+c25hcC5ldGhlcnR5cGUgIT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpCisJaWYoaGlwLT5zbmFwLmV0aGVydHlwZSAhPSBodG9ucyhFVEhfUF9JUCkpCiAJewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuYWJsZSB0byByZXNvbHZlIHR5cGUgJVggYWRkcmVzc2VzLlxuIixza2ItPmRldi0+bmFtZSxudG9ocyhoaXAtPnNuYXAuZXRoZXJ0eXBlKSk7CiAJCXJldHVybiAwOwpAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIHsKIAlzdHJ1Y3QgaGlwcGlfaGRyICpoaXA7CiAKLQloaXAgPSAoc3RydWN0IGhpcHBpX2hkciAqKSBza2ItPmRhdGE7Ci0KIAkvKgogCSAqIFRoaXMgaXMgYWN0dWFsbHkgd3JvbmcgLi4uIHF1ZXN0aW9uIGlzIGlmIHdlIHJlYWxseSBzaG91bGQKIAkgKiBzZXQgdGhlIHJhdyBhZGRyZXNzIGhlcmUuCiAJICovCi0JIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQkgc2tiX3B1bGwoc2tiLCBISVBQSV9ITEVOKTsKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCWhpcCA9IChzdHJ1Y3QgaGlwcGlfaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKKwlza2JfcHVsbChza2IsIEhJUFBJX0hMRU4pOwogCiAJLyoKIAkgKiBObyBmYW5jeSBwcm9taXNjIHN0dWZmIGhlcmUgbm93LgpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9wc25hcC5jIGIvbmV0LzgwMi9wc25hcC5jCmluZGV4IDZlN2MyMTIuLjA0ZWU0M2UgMTAwNjQ0Ci0tLSBhL25ldC84MDIvcHNuYXAuYworKysgYi9uZXQvODAyL3BzbmFwLmMKQEAgLTU2LDEwICs1NiwxMCBAQAogCX07CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcHJvdG8gPSBmaW5kX3NuYXBfY2xpZW50KHNrYi0+aC5yYXcpOworCXByb3RvID0gZmluZF9zbmFwX2NsaWVudChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpKTsKIAlpZiAocHJvdG8pIHsKIAkJLyogUGFzcyB0aGUgZnJhbWUgb24uICovCi0JCXNrYi0+aC5yYXcgICs9IDU7CisJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSA1OwogCQlza2JfcHVsbF9yY3N1bShza2IsIDUpOwogCQlyYyA9IHByb3RvLT5yY3ZmdW5jKHNrYiwgZGV2LCAmc25hcF9wYWNrZXRfdHlwZSwgb3JpZ19kZXYpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9uZXQvODAyL3RyLmMgYi9uZXQvODAyL3RyLmMKaW5kZXggOTZiZDE0NC4uMGJhMTk0NiAxMDA2NDQKLS0tIGEvbmV0LzgwMi90ci5jCisrKyBiL25ldC84MDIvdHIuYwpAQCAtMTg5LDExICsxODksMTMgQEAKIF9fYmUxNiB0cl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKLQlzdHJ1Y3QgdHJoX2hkciAqdHJoPShzdHJ1Y3QgdHJoX2hkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgdHJoX2hkciAqdHJoOwogCXN0cnVjdCB0cmxsYyAqdHJsbGM7CiAJdW5zaWduZWQgcmlmbGVuPTA7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwl0cmggPSB0cl9oZHIoc2tiKTsKIAogCWlmKHRyaC0+c2FkZHJbMF0gJiBUUl9SSUkpCiAJCXJpZmxlbiA9IChudG9ocyh0cmgtPnJjZikgJiBUUl9SQ0ZfTEVOX01BU0spID4+IDg7CkBAIC01NTIsNyArNTU0LDggQEAKIAkJCQkJaWYoaj09MSkgewogCQkJCQkJc2VnbWVudD1udG9ocyhlbnRyeS0+cnNlZ1tqLTFdKT4+NDsKIAkJCQkJCXNlcV9wcmludGYoc2VxLCIgICUwM1giLHNlZ21lbnQpOwotCQkJCQl9OworCQkJCQl9CisKIAkJCQkJc2VnbWVudD1udG9ocyhlbnRyeS0+cnNlZ1tqXSk+PjQ7CiAJCQkJCWJyZGdubWI9bnRvaHMoZW50cnktPnJzZWdbai0xXSkmMHgwMGY7CiAJCQkJCXNlcV9wcmludGYoc2VxLCItJTAxWC0lMDNYIixicmRnbm1iLHNlZ21lbnQpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggZWIxYzcxZS4uYzBjN2JiOCAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAkJICovCiAJZGVmYXVsdDoKIAkJc25wcmludGYobmFtZSwgSUZOQU1TSVosICJ2bGFuJS40aSIsIFZMQU5fSUQpOwotCX07CisJfQogCiAJbmV3X2RldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHZsYW5fZGV2X2luZm8pLCBuYW1lLAogCQkJICAgICAgIHZsYW5fc2V0dXApOwpAQCAtNjg1LDcgKzY4NSw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIG91dDoKIAlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC04MTksNyArODE5LDcgQEAKIAkJcHJpbnRrKFZMQU5fREJHICIlczogVW5rbm93biBWTEFOIENNRDogJXggXG4iLAogCQkJX19GVU5DVElPTl9fLCBhcmdzLmNtZCk7CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9kZXYuYyBiL25ldC84MDIxcS92bGFuX2Rldi5jCmluZGV4IGI2ZTBlZWEuLmVjNDYwODQgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC02Niw3ICs2Niw3IEBACiAKIAkJbWVtY3B5KHZldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04Myw3ICs4Myw3IEBACiAJCQkvKiBMaWZ0ZWQgZnJvbSBHbGViJ3MgVkxBTiBjb2RlLi4uICovCiAJCQltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLAogCQkJCXNrYi0+ZGF0YSAtIFZMQU5fRVRIX0hMRU4sIDEyKTsKLQkJCXNrYi0+bWFjLnJhdyArPSBWTEFOX0hMRU47CisJCQlza2ItPm1hY19oZWFkZXIgKz0gVkxBTl9ITEVOOwogCQl9CiAJfQogCkBAIC0yMTksNyArMjE5LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiAgV2FzIGEgVkxBTiBwYWNrZXQsIGdyYWIgdGhlIGVuY2Fwc3VsYXRlZCBwcm90b2NvbCwgd2hpY2ggdGhlIGxheWVyCiAJICogdGhyZWUgcHJvdG9jb2xzIGNhcmUgYWJvdXQuCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkgKiB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KIAkgKi8KIAlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKSB7Ci0JCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8zKTsKIAkJLyogcGxhY2UgaXQgYmFjayBvbiB0aGUgcXVldWUgdG8gYmUgaGFuZGxlZCBieSB0cnVlIGxheWVyIDMgcHJvdG9jb2xzLgogCQkgKi8KIApAQCAtMjgxLDcgKzI4MSw3IEBACiAJLyoKIAkgKglSZWFsIDgwMi4yIExMQwogCSAqLwotCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8yKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwogCS8qIHBsYWNlIGl0IGJhY2sgb24gdGhlIHF1ZXVlIHRvIGJlIGhhbmRsZWQgYnkgdXBwZXIgbGF5ZXIgcHJvdG9jb2xzLgogCSAqLwogCkBAIC0zODIsNyArMzgyLDcgQEAKIAkJfQogCiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDIxUSk7Ci0JCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAl9CiAKIAkvKiBCZWZvcmUgZGVsZWdhdGluZyB3b3JrIHRvIHRoZSBsb3dlciBsYXllciwgZW50ZXIgb3VyIE1BQy1hZGRyZXNzICovCkBAIC00NDgsNyArNDQ4LDcgQEAKIAkgKiBPVEhFUiBUSElOR1MgTElLRSBGRERJL1Rva2VuUmluZy84MDIuMyBTTkFQcy4uLgogCSAqLwogCi0JaWYgKHZldGgtPmhfdmxhbl9wcm90byAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCWlmICh2ZXRoLT5oX3ZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCWludCBvcmlnX2hlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CiAJCXVuc2lnbmVkIHNob3J0IHZldGhfVENJOwogCmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDkxNTY1NzguLjJmYzhlNzcgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0yNywxMyArMjcsNiBAQAogCiBtZW51ICJOZXR3b3JraW5nIG9wdGlvbnMiCiAKLWNvbmZpZyBORVRERUJVRwotCWJvb2wgIk5ldHdvcmsgcGFja2V0IGRlYnVnZ2luZyIKLQloZWxwCi0JICBZb3UgY2FuIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZ2V0IGFkZGl0aW9uYWwgbWVzc2FnZXMgdXNlZnVsIGluCi0JICBkZWJ1Z2dpbmcgYmFkIHBhY2tldHMsIGJ1dCBjYW4gb3ZlcndoZWxtIGxvZ3MgdW5kZXIgZGVuaWFsIG9mIHNlcnZpY2UKLQkgIGF0dGFja3MuCi0KIHNvdXJjZSAibmV0L3BhY2tldC9LY29uZmlnIgogc291cmNlICJuZXQvdW5peC9LY29uZmlnIgogc291cmNlICJuZXQveGZybS9LY29uZmlnIgpAQCAtMjE5LDE0ICsyMTIsMTggQEAKIHNvdXJjZSAibmV0L2F4MjUvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2lyZGEvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2JsdWV0b290aC9LY29uZmlnIgotc291cmNlICJuZXQvaWVlZTgwMjExL0tjb25maWciCi0KLWNvbmZpZyBXSVJFTEVTU19FWFQKLQlib29sCitzb3VyY2UgIm5ldC9yeHJwYy9LY29uZmlnIgogCiBjb25maWcgRklCX1JVTEVTCiAJYm9vbAogCittZW51ICJXaXJlbGVzcyIKKworc291cmNlICJuZXQvd2lyZWxlc3MvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2llZWU4MDIxMS9LY29uZmlnIgorCitlbmRtZW51CisKIGVuZGlmICAgIyBpZiBORVQKIGVuZG1lbnUgIyBOZXR3b3JraW5nCiAKZGlmZiAtLWdpdCBhL25ldC9NYWtlZmlsZSBiL25ldC9NYWtlZmlsZQppbmRleCA0ODU0YWM1Li42Yjc0ZDQxIDEwMDY0NAotLS0gYS9uZXQvTWFrZWZpbGUKKysrIGIvbmV0L01ha2VmaWxlCkBAIC0zOCw2ICszOCw3IEBACiBvYmotJChDT05GSUdfQlQpCQkrPSBibHVldG9vdGgvCiBvYmotJChDT05GSUdfU1VOUlBDKQkJKz0gc3VucnBjLwogb2JqLSQoQ09ORklHX1JYUlBDKQkJKz0gcnhycGMvCitvYmotJChDT05GSUdfQUZfUlhSUEMpCQkrPSByeHJwYy8KIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfREVDTkVUKQkJKz0gZGVjbmV0Lwogb2JqLSQoQ09ORklHX0VDT05FVCkJCSs9IGVjb25ldC8KQEAgLTUyLDMgKzUzLDUgQEAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KIGVuZGlmCisKK29iai15CQkJCSs9IHdpcmVsZXNzLwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hYXJwLmMgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwppbmRleCBkODlkNjJmLi41ZWY2YTIzIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2FhcnAuYworKysgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwpAQCAtMTE4LDcgKzExOCw5IEBACiAKIAkvKiBTZXQgdXAgdGhlIGJ1ZmZlciAqLwogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBhYXJwX2RsLT5oZWFkZXJfbGVuZ3RoKTsKLQlza2ItPm5oLnJhdyAgICAgID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBzaXplb2YoKmVhaCkpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CiAJc2tiLT5wcm90b2NvbCAgICA9IGh0b25zKEVUSF9QX0FUQUxLKTsKIAlza2ItPmRldgkgPSBkZXY7CiAJZWFoCQkgPSBhYXJwX2hkcihza2IpOwpAQCAtMTYzLDcgKzE2NSw5IEBACiAKIAkvKiBTZXQgdXAgdGhlIGJ1ZmZlciAqLwogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBhYXJwX2RsLT5oZWFkZXJfbGVuZ3RoKTsKLQlza2ItPm5oLnJhdyAgICAgID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBzaXplb2YoKmVhaCkpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CiAJc2tiLT5wcm90b2NvbCAgICA9IGh0b25zKEVUSF9QX0FUQUxLKTsKIAlza2ItPmRldgkgPSBkZXY7CiAJZWFoCQkgPSBhYXJwX2hkcihza2IpOwpAQCAtMjEyLDcgKzIxNiw5IEBACiAKIAkvKiBTZXQgdXAgdGhlIGJ1ZmZlciAqLwogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBhYXJwX2RsLT5oZWFkZXJfbGVuZ3RoKTsKLQlza2ItPm5oLnJhdyAgICAgID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBzaXplb2YoKmVhaCkpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CiAJc2tiLT5wcm90b2NvbCAgICA9IGh0b25zKEVUSF9QX0FUQUxLKTsKIAlza2ItPmRldgkgPSBkZXY7CiAJZWFoCQkgPSBhYXJwX2hkcihza2IpOwpAQCAtNTM5LDcgKzU0NSw3IEBACiAJaW50IGhhc2g7CiAJc3RydWN0IGFhcnBfZW50cnkgKmE7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCS8qIENoZWNrIGZvciBMb2NhbFRhbGsgZmlyc3QgKi8KIAlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9MT0NBTFRMSykgewpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggYzhiN2RjMi4uMTZlZGEyMSAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC05MzcsMTEgKzkzNywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXRhbGtfc3VtX3NrYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJCSAgIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgc3VtKQogewotCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CisJaW50IGVuZCA9IHNrYl9oZWFkbGVuKHNrYik7CiAJaW50IGksIGNvcHk7CiAKIAkvKiBjaGVja3N1bSBzdHVmZiBpbiBoZWFkZXIgc3BhY2UgKi8KLQlpZiAoIChjb3B5ID0gc3RhcnQgLSBvZmZzZXQpID4gMCkgeworCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCWlmIChjb3B5ID4gbGVuKQogCQkJY29weSA9IGxlbjsKIAkJc3VtID0gYXRhbGtfc3VtX3BhcnRpYWwoc2tiLT5kYXRhICsgb2Zmc2V0LCBjb3B5LCBzdW0pOwpAQCAtOTUzLDExICs5NTMsOSBAQAogCiAJLyogY2hlY2tzdW0gc3R1ZmYgaW4gZnJhZ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWludCBlbmQ7CisJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQllbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQl1OCAqdmFkZHI7CiAJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CkBAIC05NjUsMzYgKzk2MywzMSBAQAogCQkJaWYgKGNvcHkgPiBsZW4pCiAJCQkJY29weSA9IGxlbjsKIAkJCXZhZGRyID0ga21hcF9za2JfZnJhZyhmcmFnKTsKLQkJCXN1bSA9IGF0YWxrX3N1bV9wYXJ0aWFsKHZhZGRyICsgZnJhZy0+cGFnZV9vZmZzZXQgKwotCQkJCQkJICBvZmZzZXQgLSBzdGFydCwgY29weSwgc3VtKTsKKwkJCXN1bSA9IGF0YWxrX3N1bV9wYXJ0aWFsKHZhZGRyICsgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCQljb3B5LCBzdW0pOwogCQkJa3VubWFwX3NrYl9mcmFnKHZhZGRyKTsKIAogCQkJaWYgKCEobGVuIC09IGNvcHkpKQogCQkJCXJldHVybiBzdW07CiAJCQlvZmZzZXQgKz0gY29weTsKIAkJfQotCQlzdGFydCA9IGVuZDsKIAl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAogCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCWludCBlbmQ7CisJCQlCVUdfVFJBUChsZW4gPj0gMCk7CiAKLQkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJZW5kID0gb2Zmc2V0ICsgbGlzdC0+bGVuOwogCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKIAkJCQlpZiAoY29weSA+IGxlbikKIAkJCQkJY29weSA9IGxlbjsKLQkJCQlzdW0gPSBhdGFsa19zdW1fc2tiKGxpc3QsIG9mZnNldCAtIHN0YXJ0LAotCQkJCQkJICAgIGNvcHksIHN1bSk7CisJCQkJc3VtID0gYXRhbGtfc3VtX3NrYihsaXN0LCAwLCBjb3B5LCBzdW0pOwogCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCiAJCQkJCXJldHVybiBzdW07CiAJCQkJb2Zmc2V0ICs9IGNvcHk7CiAJCQl9Ci0JCQlzdGFydCA9IGVuZDsKIAkJfQogCX0KIApAQCAtMTI3NSw3ICsxMjY4LDcgQEAKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCXNrYl9wdWxsKHNrYiwgMTMpOwogCXNrYi0+ZGV2ICAgPSBkZXY7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJc3RhdHMgPSBkZXYtPnByaXY7CiAJc3RhdHMtPnJ4X3BhY2tldHMrKzsKQEAgLTEzODMsMTAgKzEzNzYsMTAgQEAKICAqCUBwdCAtIHBhY2tldCB0eXBlCiAgKgogICoJUmVjZWl2ZSBhIHBhY2tldCAoaW4gc2tiKSBmcm9tIGRldmljZSBkZXYuIFRoaXMgaGFzIGNvbWUgZnJvbSB0aGUgU05BUAotICoJZGVjb2RlciwgYW5kIG9uIGVudHJ5IHNrYi0+aC5yYXcgaXMgdGhlIEREUCBoZWFkZXIsIHNrYi0+bGVuIGlzIHRoZSBERFAKLSAqCWhlYWRlciwgc2tiLT5sZW4gaXMgdGhlIEREUCBsZW5ndGguIFRoZSBwaHlzaWNhbCBoZWFkZXJzIGhhdmUgYmVlbgotICoJZXh0cmFjdGVkLiBQUFAgc2hvdWxkIHByb2JhYmx5IHBhc3MgZnJhbWVzIG1hcmtlZCBhcyBmb3IgdGhpcyBsYXllci4KLSAqCVtpZSBBUlBIUkRfRVRIRVJUQUxLXQorICoJZGVjb2RlciwgYW5kIG9uIGVudHJ5IHNrYi0+dHJhbnNwb3J0X2hlYWRlciBpcyB0aGUgRERQIGhlYWRlciwgc2tiLT5sZW4KKyAqCWlzIHRoZSBERFAgaGVhZGVyLCBza2ItPmxlbiBpcyB0aGUgRERQIGxlbmd0aC4gVGhlIHBoeXNpY2FsIGhlYWRlcnMKKyAqCWhhdmUgYmVlbiBleHRyYWN0ZWQuIFBQUCBzaG91bGQgcHJvYmFibHkgcGFzcyBmcmFtZXMgbWFya2VkIGFzIGZvciB0aGlzCisgKglsYXllci4gIFtpZSBBUlBIUkRfRVRIRVJUQUxLXQogICovCiBzdGF0aWMgaW50IGF0YWxrX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKQEAgLTE0ODQsNyArMTQ3Nyw3IEBACiAJCSAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQogewogCS8qIEV4cGFuZCBhbnkgc2hvcnQgZm9ybSBmcmFtZXMgKi8KLQlpZiAoc2tiLT5tYWMucmF3WzJdID09IDEpIHsKKwlpZiAoc2tiX21hY19oZWFkZXIoc2tiKVsyXSA9PSAxKSB7CiAJCXN0cnVjdCBkZHBlaGRyICpkZHA7CiAJCS8qIEZpbmQgb3VyIGFkZHJlc3MgKi8KIAkJc3RydWN0IGF0YWxrX2FkZHIgKmFwID0gYXRhbGtfZmluZF9kZXZfYWRkcihkZXYpOwpAQCAtMTUxMCw4ICsxNTAzLDggQEAKIAkJICogd2Ugd3JpdGUgdGhlIG5ldHdvcmsgbnVtYmVycyAhCiAJCSAqLwogCi0JCWRkcC0+ZGVoX2Rub2RlID0gc2tiLT5tYWMucmF3WzBdOyAgICAgLyogRnJvbSBwaHlzaWNhbCBoZWFkZXIgKi8KLQkJZGRwLT5kZWhfc25vZGUgPSBza2ItPm1hYy5yYXdbMV07ICAgICAvKiBGcm9tIHBoeXNpY2FsIGhlYWRlciAqLworCQlkZHAtPmRlaF9kbm9kZSA9IHNrYl9tYWNfaGVhZGVyKHNrYilbMF07ICAgICAvKiBGcm9tIHBoeXNpY2FsIGhlYWRlciAqLworCQlkZHAtPmRlaF9zbm9kZSA9IHNrYl9tYWNfaGVhZGVyKHNrYilbMV07ICAgICAvKiBGcm9tIHBoeXNpY2FsIGhlYWRlciAqLwogCiAJCWRkcC0+ZGVoX2RuZXQgID0gYXAtPnNfbmV0OwkvKiBOZXR3b3JrIG51bWJlciAqLwogCQlkZHAtPmRlaF9zbmV0ICA9IGFwLT5zX25ldDsKQEAgLTE1MjIsNyArMTUxNSw3IEBACiAJCS8qIE5vbiByb3V0YWJsZSwgc28gZm9yY2UgYSBkcm9wIGlmIHdlIHNsaXAgdXAgbGF0ZXIgKi8KIAkJZGRwLT5kZWhfbGVuX2hvcHMgPSBodG9ucyhza2ItPmxlbiArIChERFBfTUFYSE9QUyA8PCAxMCkpOwogCX0KLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAlyZXR1cm4gYXRhbGtfcmN2KHNrYiwgZGV2LCBwdCwgb3JpZ19kZXYpOwogZnJlZWl0OgpAQCAtMTc3MSw2ICsxNzY0LDkgQEAKIAkJY2FzZSBTSU9DR1NUQU1QOgogCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOwogCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisJCQlicmVhazsKIAkJLyogUm91dGluZyAqLwogCQljYXNlIFNJT0NBRERSVDoKIAkJY2FzZSBTSU9DREVMUlQ6CmRpZmYgLS1naXQgYS9uZXQvYXRtL2JyMjY4NC5jIGIvbmV0L2F0bS9icjI2ODQuYwppbmRleCBlYzRlYmQzLi4wZTlmMDBjIDEwMDY0NAotLS0gYS9uZXQvYXRtL2JyMjY4NC5jCisrKyBiL25ldC9hdG0vYnIyNjg0LmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCX0KIAlza2JfcHVzaChza2IsIG1pbmhlYWRyb29tKTsKIAlpZiAoYnJ2Y2MtPmVuY2FwcyA9PSBlX2xsYykKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgbGxjX291aV9waWRfcGFkLCAxMCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbGxjX291aV9waWRfcGFkLCAxMCk7CiAJZWxzZQogCQltZW1zZXQoc2tiLT5kYXRhLCAwLCAyKTsKICNlbmRpZiAvKiBGQVNURVJfVkVSU0lPTiAqLwpAQCAtMzc1LDExICszNzUsMTEgQEAKIHsKIAlpZiAoYnJ2Y2MtPmZpbHRlci5uZXRtYXNrID09IDApCiAJCXJldHVybiAwOwkJCS8qIG5vIGZpbHRlciBpbiBwbGFjZSAqLwotCWlmICh0eXBlID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApICYmCisJaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfSVApICYmCiAJICAgICgoKHN0cnVjdCBpcGhkciAqKSAoc2tiLT5kYXRhKSktPmRhZGRyICYgYnJ2Y2MtPmZpbHRlci4KIAkgICAgIG5ldG1hc2spID09IGJydmNjLT5maWx0ZXIucHJlZml4KQogCQlyZXR1cm4gMDsKLQlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkpCisJaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfQVJQKSkKIAkJcmV0dXJuIDA7CiAJLyogVE9ETzogd2Ugc2hvdWxkIHByb2JhYmx5IGZpbHRlciBBUlBzIHRvby4uIGRvbid0IHdhbnQgdG8gaGF2ZQogCSAqICAgdGhlbSByZXR1cm5pbmcgdmFsdWVzIHRoYXQgZG9uJ3QgbWFrZSBzZW5zZSwgb3IgaXMgdGhhdCBvaz8KQEAgLTQ1OCw3ICs0NTgsNyBAQAogCS8qIEZJWE1FOiB0Y3BkdW1wIHNob3dzIHRoYXQgcG9pbnRlciB0byBtYWMgaGVhZGVyIGlzIDIgYnl0ZXMgZWFybGllciwKIAkgICB0aGFuIHNob3VsZCBiZS4gV2hhdCBlbHNlIHNob3VsZCBJIHNldD8gKi8KIAlza2JfcHVsbChza2IsIHBsZW4pOwotCXNrYi0+bWFjLnJhdyA9ICgoY2hhciAqKSAoc2tiLT5kYXRhKSkgLSBFVEhfSExFTjsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtRVRIX0hMRU4pOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKICNpZmRlZiBDT05GSUdfQlIyNjg0X0ZBU1RfVFJBTlMKIAlza2ItPnByb3RvY29sID0gKCh1MTYgKikgc2tiLT5kYXRhKVstMV07CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCmluZGV4IDhjMzgyNTguLjg3NmI3N2YgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY2xpcC5jCisrKyBiL25ldC9hdG0vY2xpcC5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAlBVE1fU0tCKHNrYiktPnZjYyA9IHZjYzsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlpZiAoIWNsaXBfdmNjLT5lbmNhcAogCSAgICB8fCBza2ItPmxlbiA8IFJGQzE0ODNMTENfTEVOCiAJICAgIHx8IG1lbWNtcChza2ItPmRhdGEsIGxsY19vdWksIHNpemVvZiAobGxjX291aSkpKQpAQCAtNzAyLDcgKzcwMiw3IEBACiAJLm9wcyA9CQkJJmF0bWFycGRfZGV2X29wcywKIAkudHlwZSA9CQkJImFycGQiLAogCS5udW1iZXIgPSAJCTk5OSwKLQkubG9jayA9CQkJU1BJTl9MT0NLX1VOTE9DS0VECisJLmxvY2sgPQkJCV9fU1BJTl9MT0NLX1VOTE9DS0VEKGF0bWFycGRfZGV2LmxvY2spCiB9OwogCiAKZGlmZiAtLWdpdCBhL25ldC9hdG0vaW9jdGwuYyBiL25ldC9hdG0vaW9jdGwuYwppbmRleCA4Y2NlZTQ1Li43YWZkOGU3IDEwMDY0NAotLS0gYS9uZXQvYXRtL2lvY3RsLmMKKysrIGIvbmV0L2F0bS9pb2N0bC5jCkBAIC04Miw2ICs4Miw5IEBACiAJCWNhc2UgU0lPQ0dTVEFNUDogLyogYm9ycm93ZWQgZnJvbSBJUCAqLwogCQkJZXJyb3IgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOwogCQkJZ290byBkb25lOworCQljYXNlIFNJT0NHU1RBTVBOUzogLyogYm9ycm93ZWQgZnJvbSBJUCAqLworCQkJZXJyb3IgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisJCQlnb3RvIGRvbmU7CiAJCWNhc2UgQVRNX1NFVFNDOgogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVRNX1NFVFNDIGlzIG9ic29sZXRlXG4iKTsKIAkJCWVycm9yID0gMDsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbGVjLmMgYi9uZXQvYXRtL2xlYy5jCmluZGV4IDNkODA0ZDYuLjRkYzVmMmIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbGVjLmMKKysrIGIvbmV0L2F0bS9sZWMuYwpAQCAtMjgzLDggKzI4Myw4IEBACiAJfQogCiAJRFBSSU5USygic2tidWZmIGhlYWQ6JWx4IGRhdGE6JWx4IHRhaWw6JWx4IGVuZDolbHhcbiIsCi0JCShsb25nKXNrYi0+aGVhZCwgKGxvbmcpc2tiLT5kYXRhLCAobG9uZylza2ItPnRhaWwsCi0JCShsb25nKXNrYi0+ZW5kKTsKKwkJKGxvbmcpc2tiLT5oZWFkLCAobG9uZylza2ItPmRhdGEsIChsb25nKXNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJKGxvbmcpc2tiX2VuZF9wb2ludGVyKHNrYikpOwogI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKIAlpZiAobWVtY21wKHNrYi0+ZGF0YSwgYnJpZGdlX3VsYV9sZWMsIHNpemVvZihicmlkZ2VfdWxhX2xlYykpID09IDApCiAJCWxlY19oYW5kbGVfYnJpZGdlKHNrYiwgZGV2KTsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJc2tiMi0+bGVuID0gc2l6ZW9mKHN0cnVjdCBhdG1sZWNfbXNnKTsKLQkJCQltZW1jcHkoc2tiMi0+ZGF0YSwgbWVzZywKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdG1sZWNfbXNnKSk7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiMiwgbWVzZywKKwkJCQkJCQlzaXplb2YoKm1lc2cpKTsKIAkJCQlhdG1fZm9yY2VfY2hhcmdlKHByaXYtPmxlY2QsIHNrYjItPnRydWVzaXplKTsKIAkJCQlzayA9IHNrX2F0bShwcml2LT5sZWNkKTsKIAkJCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYjIpOwpAQCAtNjMwLDcgKzYzMCw3IEBACiAJLm9wcyA9ICZsZWNkZXZfb3BzLAogCS50eXBlID0gImxlYyIsCiAJLm51bWJlciA9IDk5OSwJCS8qIGR1bW15IGRldmljZSBudW1iZXIgKi8KLQkubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRAorCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQobGVjYXRtX2Rldi5sb2NrKQogfTsKIAogLyoKQEAgLTgyNSw3ICs4MjUsNiBAQAogCQlpZiAoIWhsaXN0X2VtcHR5KCZwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMpKSB7CiAJCQlsZWNfYXJwX2NoZWNrX2VtcHRpZXMocHJpdiwgdmNjLCBza2IpOwogCQl9Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2JfcHVsbChza2IsIDIpOwkvKiBza2lwIGxlY19pZCAqLwogI2lmZGVmIENPTkZJR19UUgogCQlpZiAocHJpdi0+aXNfdHJkZXYpCkBAIC0xMzM4LDcgKzEzMzcsNyBAQAogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAJCXNrYi0+bGVuID0gKnNpemVvZnRsdnM7Ci0JCW1lbWNweShza2ItPmRhdGEsICp0bHZzLCAqc2l6ZW9mdGx2cyk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgKnRsdnMsICpzaXplb2Z0bHZzKTsKIAkJcmV0dmFsID0gc2VuZF90b19sZWNkKHByaXYsIGxfYXJwX3htdCwgZHN0X21hYywgTlVMTCwgc2tiKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTEzNzIsNyArMTM3MSw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAlza2ItPmxlbiA9IHNpemVvZnRsdnM7Ci0JbWVtY3B5KHNrYi0+ZGF0YSwgdGx2cywgc2l6ZW9mdGx2cyk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCB0bHZzLCBzaXplb2Z0bHZzKTsKIAlyZXR2YWwgPSBzZW5kX3RvX2xlY2QocHJpdiwgbF9hc3NvY2lhdGVfcmVxLCBOVUxMLCBOVUxMLCBza2IpOwogCWlmIChyZXR2YWwgIT0gMCkKIAkJcHJpbnRrKCJsZWMuYzogbGFuZTJfYXNzb2NpYXRlX3JlcSgpIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wYy5jIGIvbmV0L2F0bS9tcGMuYwppbmRleCBjYjNjMDA0Li43Yzg1YWE1IDEwMDY0NAotLS0gYS9uZXQvYXRtL21wYy5jCisrKyBiL25ldC9hdG0vbXBjLmMKQEAgLTUwNCwxMSArNTA0LDEzIEBACiAJCXRhZ2dlZF9sbGNfc25hcF9oZHIudGFnID0gZW50cnktPmN0cmxfaW5mby50YWc7CiAJCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHJpZCBvZiBFdGggaGVhZGVyICovCiAJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHRhZ2dlZF9sbGNfc25hcF9oZHIpKTsgICAgLyogYWRkIExMQy9TTkFQIGhlYWRlciAgICovCi0JCW1lbWNweShza2ItPmRhdGEsICZ0YWdnZWRfbGxjX3NuYXBfaGRyLCBzaXplb2YodGFnZ2VkX2xsY19zbmFwX2hkcikpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsICZ0YWdnZWRfbGxjX3NuYXBfaGRyLAorCQkJCQlzaXplb2YodGFnZ2VkX2xsY19zbmFwX2hkcikpOwogCX0gZWxzZSB7CiAJCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCByaWQgb2YgRXRoIGhlYWRlciAqLwogCQlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKSk7ICAgICAvKiBhZGQgTExDL1NOQVAgaGVhZGVyICsgdGFnICAqLwotCQltZW1jcHkoc2tiLT5kYXRhLCAmbGxjX3NuYXBfbXBvYV9kYXRhLCBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcikpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsICZsbGNfc25hcF9tcG9hX2RhdGEsCisJCQkJCXNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKSk7CiAJfQogCiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2tfYXRtKGVudHJ5LT5zaG9ydGN1dCktPnNrX3dtZW1fYWxsb2MpOwpAQCAtNzExLDExICs3MTMsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAlza2JfcHVzaChuZXdfc2tiLCBlZy0+Y3RybF9pbmZvLkRIX2xlbmd0aCk7ICAgICAvKiBhZGQgTUFDIGhlYWRlciAqLwotCW1lbWNweShuZXdfc2tiLT5kYXRhLCBlZy0+Y3RybF9pbmZvLkRMTF9oZWFkZXIsIGVnLT5jdHJsX2luZm8uREhfbGVuZ3RoKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShuZXdfc2tiLCBlZy0+Y3RybF9pbmZvLkRMTF9oZWFkZXIsCisJCQkJZWctPmN0cmxfaW5mby5ESF9sZW5ndGgpOwogCW5ld19za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X3NrYiwgZGV2KTsKLQluZXdfc2tiLT5uaC5yYXcgPSBuZXdfc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihuZXdfc2tiKTsKIAotCWVnLT5sYXRlc3RfaXBfYWRkciA9IG5ld19za2ItPm5oLmlwaC0+c2FkZHI7CisJZWctPmxhdGVzdF9pcF9hZGRyID0gaXBfaGRyKG5ld19za2IpLT5zYWRkcjsKIAllZy0+cGFja2V0c19yY3ZkKys7CiAJbXBjLT5lZ19vcHMtPnB1dChlZyk7CiAKQEAgLTczNCw3ICs3MzcsNyBAQAogCS5vcHMJPSAmbXBjX29wcywKIAkudHlwZQk9ICJtcGMiLAogCS5udW1iZXIJPSA0MiwKLQkubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRAorCS5sb2NrCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQobXBjX2Rldi5sb2NrKQogCS8qIG1lbWJlcnMgbm90IGV4cGxpY2l0bHkgaW5pdGlhbGlzZWQgd2lsbCBiZSAwICovCiB9OwogCkBAIC05MzYsNyArOTM5LDcgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGtfbWVzc2FnZSkpOwotCW1lbWNweShza2ItPmRhdGEsIG1lc2csIHNpemVvZihzdHJ1Y3Qga19tZXNzYWdlKSk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBtZXNnLCBzaXplb2YoKm1lc2cpKTsKIAlhdG1fZm9yY2VfY2hhcmdlKG1wYy0+bXBvYWRfdmNjLCBza2ItPnRydWVzaXplKTsKIAogCXNrID0gc2tfYXRtKG1wYy0+bXBvYWRfdmNjKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vc2lnbmFsaW5nLmMgYi9uZXQvYXRtL3NpZ25hbGluZy5jCmluZGV4IDMxZDk4YjUuLmQxNGJhYWYgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vc2lnbmFsaW5nLmMKKysrIGIvbmV0L2F0bS9zaWduYWxpbmcuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJLm9wcyA9CQkmc2lnZF9kZXZfb3BzLAogCS50eXBlID0JCSJzaWciLAogCS5udW1iZXIgPQk5OTksCi0JLmxvY2sgPQkJU1BJTl9MT0NLX1VOTE9DS0VECisJLmxvY2sgPQkJX19TUElOX0xPQ0tfVU5MT0NLRUQoc2lnZF9kZXYubG9jaykKIH07CiAKIApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IDFjMDdjNmEuLjZkZWQ5NTIgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTExMjcsMjIgKzExMjcsMjIgQEAKIAkJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKIAkJY2FzZSBUQ1BfU1lOX1NFTlQ6IC8qIHN0aWxsIHRyeWluZyAqLwogCQkJZXJyID0gLUVJTlBST0dSRVNTOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJCWNhc2UgVENQX0VTVEFCTElTSEVEOiAvKiBjb25uZWN0aW9uIGVzdGFibGlzaGVkICovCiAJCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfcmVsZWFzZTsKIAogCQljYXNlIFRDUF9DTE9TRTogLyogY29ubmVjdGlvbiByZWZ1c2VkICovCiAJCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwogCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfcmVsZWFzZTsKIAkJfQogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEICYmIHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUKSB7CiAJCWVyciA9IC1FSVNDT05OOwkvKiBObyByZWNvbm5lY3Qgb24gYSBzZXFwYWNrZXQgc29ja2V0ICovCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCXNrLT5za19zdGF0ZSAgID0gVENQX0NMT1NFOwpAQCAtMTE1OSwxMiArMTE1OSwxMiBAQAogCQkvKiBWYWxpZCBudW1iZXIgb2YgZGlnaXBlYXRlcnMgPyAqLwogCQlpZiAoZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgPCAxIHx8IGZzYS0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzID4gQVgyNV9NQVhfRElHSVMpIHsKIAkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAogCQlpZiAoKGRpZ2kgPSBrbWFsbG9jKHNpemVvZihheDI1X2RpZ2kpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQkJZXJyID0gLUVOT0JVRlM7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAogCQlkaWdpLT5uZGlnaSAgICAgID0gZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXM7CkBAIC0xMTk0LDcgKzExOTQsNyBAQAogCQkJY3VycmVudC0+Y29tbSk7CiAJCWlmICgoZXJyID0gYXgyNV9ydF9hdXRvYmluZChheDI1LCAmZnNhLT5mc2FfYXgyNS5zYXgyNV9jYWxsKSkgPCAwKSB7CiAJCQlrZnJlZShkaWdpKTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfcmVsZWFzZTsKIAkJfQogCiAJCWF4MjVfZmlsbGluX2NiKGF4MjUsIGF4MjUtPmF4MjVfZGV2KTsKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJCWlmIChheDI1LT5heDI1X2RldiA9PSBOVUxMKSB7CiAJCQlrZnJlZShkaWdpKTsKIAkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAl9CiAKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCWtmcmVlKGRpZ2kpOwogCQllcnIgPSAtRUFERFJJTlVTRTsJCS8qIEFscmVhZHkgc3VjaCBhIGNvbm5lY3Rpb24gKi8KIAkJYXgyNV9jYl9wdXQoYXgyNXQpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlheDI1LT5kZXN0X2FkZHIgPSBmc2EtPmZzYV9heDI1LnNheDI1X2NhbGw7CkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgewogCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKIAkJc2stPnNrX3N0YXRlICAgPSBUQ1BfRVNUQUJMSVNIRUQ7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCS8qIE1vdmUgdG8gY29ubmVjdGluZyBzb2NrZXQsIGF4LjI1IGxhcGIgV0FJVF9VQS4uICovCkBAIC0xMjU1LDU1ICsxMjU1LDUzIEBACiAJLyogTm93IHRoZSBsb29wICovCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQgJiYgKGZsYWdzICYgT19OT05CTE9DSykpIHsKIAkJZXJyID0gLUVJTlBST0dSRVNTOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9TWU5fU0VOVCkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJCURFRklORV9XQUlUKHdhaXQpOwogCi0JCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwogCQlmb3IgKDs7KSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwKKwkJCSAgICAgICAgICAgICAgICBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQpCiAJCQkJYnJlYWs7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQkJc2NoZWR1bGUoKTsKIAkJCQlsb2NrX3NvY2soc2spOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKIAkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CiAJCS8qIE5vdCBpbiBBQk0sIG5vdCBpbiBXQUlUX1VBIC0+IGZhaWxlZCAqLwogCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwogCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsJLyogQWx3YXlzIHNldCBhdCB0aGlzIHBvaW50ICovCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOwogCi0JZXJyPTA7Ci1vdXQ6CisJZXJyID0gMDsKK291dF9yZWxlYXNlOgogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi0KIHN0YXRpYyBpbnQgYXgyNV9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNvY2sgKm5ld3NrOworCURFRklORV9XQUlUKHdhaXQpOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyID0gMDsKIApAQCAtMTMyOCwzMCArMTMyNiwyOSBAQAogCSAqCVRoZSByZWFkIHF1ZXVlIHRoaXMgdGltZSBpcyBob2xkaW5nIHNvY2tldHMgcmVhZHkgdG8gdXNlCiAJICoJaG9va2VkIGludG8gdGhlIFNBQk0gd2Ugc2F2ZWQKIAkgKi8KLQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAlmb3IgKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQlpZiAoc2tiKQogCQkJYnJlYWs7CiAKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQkJZXJyID0gLUVXT1VMREJMT0NLOworCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKSB7CisJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQlzY2hlZHVsZSgpOwogCQkJbG9ja19zb2NrKHNrKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZXJyID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKIAl9Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAogCW5ld3NrCQkgPSBza2ItPnNrOwogCW5ld3NrLT5za19zb2NrZXQgPSBuZXdzb2NrOwpAQCAtMTQyNSw3ICsxNDIyLDYgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSBzYXg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlheDI1X2RpZ2kgZHRtcCwgKmRwOwotCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKIAlheDI1X2NiICpheDI1OwogCXNpemVfdCBzaXplOwogCWludCBsdiwgZXJyLCBhZGRyX2xlbiA9IG1zZy0+bXNnX25hbWVsZW47CkBAIC0xNTQ4LDEzICsxNTQ0LDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJLyogQWRkIHRoZSBQSUQgaWYgb25lIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgdXNlciBpbiB0aGUgc2tiICovCi0JaWYgKCFheDI1LT5waWRpbmNsKSB7Ci0JCWFzbXB0ciAgPSBza2JfcHVzaChza2IsIDEpOwotCQkqYXNtcHRyID0gc2stPnNrX3Byb3RvY29sOwotCX0KKwlpZiAoIWF4MjUtPnBpZGluY2wpCisJCSpza2JfcHVzaChza2IsIDEpID0gc2stPnNrX3Byb3RvY29sOwogCiAJU09DS19ERUJVRyhzaywgIkFYLjI1OiBUcmFuc21pdHRpbmcgYnVmZmVyXG4iKTsKIApAQCAtMTU3Myw3ICsxNTY3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYXNtcHRyID0gc2tiX3B1c2goc2tiLCAxICsgYXgyNV9hZGRyX3NpemUoZHApKTsKKwlza2JfcHVzaChza2IsIDEgKyBheDI1X2FkZHJfc2l6ZShkcCkpOwogCiAJU09DS19ERUJVRyhzaywgIkJ1aWxkaW5nIEFYLjI1IEhlYWRlciAoZHA9JXApLlxuIiwgZHApOwogCkBAIC0xNTgxLDE3ICsxNTc1LDE3IEBACiAJCVNPQ0tfREVCVUcoc2ssICJOdW0gZGlnaXBlYXRlcnM9JWRcbiIsIGRwLT5uZGlnaSk7CiAKIAkvKiBCdWlsZCBhbiBBWC4yNSBoZWFkZXIgKi8KLQlhc21wdHIgKz0gKGx2ID0gYXgyNV9hZGRyX2J1aWxkKGFzbXB0ciwgJmF4MjUtPnNvdXJjZV9hZGRyLAotCQkJCQkmc2F4LnNheDI1X2NhbGwsIGRwLAotCQkJCQlBWDI1X0NPTU1BTkQsIEFYMjVfTU9EVUxVUykpOworCWx2ID0gYXgyNV9hZGRyX2J1aWxkKHNrYi0+ZGF0YSwgJmF4MjUtPnNvdXJjZV9hZGRyLCAmc2F4LnNheDI1X2NhbGwsCisJCQkgICAgIGRwLCBBWDI1X0NPTU1BTkQsIEFYMjVfTU9EVUxVUyk7CiAKIAlTT0NLX0RFQlVHKHNrLCAiQnVpbHQgaGVhZGVyICglZCBieXRlcylcbiIsbHYpOwogCi0Jc2tiLT5oLnJhdyA9IGFzbXB0cjsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBsdik7CiAKLQlTT0NLX0RFQlVHKHNrLCAiYmFzZT0lcCBwb3M9JXBcbiIsIHNrYi0+ZGF0YSwgYXNtcHRyKTsKKwlTT0NLX0RFQlVHKHNrLCAiYmFzZT0lcCBwb3M9JXBcbiIsCisJCSAgIHNrYi0+ZGF0YSwgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSk7CiAKLQkqYXNtcHRyID0gQVgyNV9VSTsKKwkqc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSA9IEFYMjVfVUk7CiAKIAkvKiBEYXRhZ3JhbSBmcmFtZXMgZ28gc3RyYWlnaHQgb3V0IG9mIHRoZSBkb29yIGFzIFVJICovCiAJYXgyNV9xdWV1ZV94bWl0KHNrYiwgYXgyNS0+YXgyNV9kZXYtPmRldik7CkBAIC0xNjMxLDggKzE2MjUsOCBAQAogCWlmICghYXgyNV9zayhzayktPnBpZGluY2wpCiAJCXNrYl9wdWxsKHNrYiwgMSk7CQkvKiBSZW1vdmUgUElEICovCiAKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOwotCWNvcGllZCAgICAgPSBza2ItPmxlbjsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWNvcGllZCA9IHNrYi0+bGVuOwogCiAJaWYgKGNvcGllZCA+IHNpemUpIHsKIAkJY29waWVkID0gc2l6ZTsKQEAgLTE2NDUsOSArMTYzOSwxMCBAQAogCQlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqc2F4ID0gKHN0cnVjdCBzb2NrYWRkcl9heDI1ICopbXNnLT5tc2dfbmFtZTsKIAkJYXgyNV9kaWdpIGRpZ2k7CiAJCWF4MjVfYWRkcmVzcyBzcmM7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYyA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CiAKLQkJYXgyNV9hZGRyX3BhcnNlKHNrYi0+bWFjLnJhdysxLCBza2ItPmRhdGEtc2tiLT5tYWMucmF3LTEsICZzcmMsIE5VTEwsICZkaWdpLCBOVUxMLCBOVUxMKTsKLQorCQlheDI1X2FkZHJfcGFyc2UobWFjICsgMSwgc2tiLT5kYXRhIC0gbWFjIC0gMSwgJnNyYywgTlVMTCwKKwkJCQkmZGlnaSwgTlVMTCwgTlVMTCk7CiAJCXNheC0+c2F4MjVfZmFtaWx5ID0gQUZfQVgyNTsKIAkJLyogV2Ugc2V0IHRoaXMgY29ycmVjdGx5LCBldmVuIHRob3VnaCB3ZSBtYXkgbm90IGxldCB0aGUKIAkJICAgYXBwbGljYXRpb24ga25vdyB0aGUgZGlnaSBjYWxscyBmdXJ0aGVyIGRvd24gKGJlY2F1c2UgaXQKQEAgLTE3MTEsNiArMTcwNiwxMCBAQAogCQlyZXMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOwogCQlicmVhazsKIAorCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQlyZXMgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisJCWJyZWFrOworCiAJY2FzZSBTSU9DQVgyNUFERFVJRDoJLyogQWRkIGEgdWlkIHRvIHRoZSB1aWQvY2FsbCBtYXAgdGFibGUgKi8KIAljYXNlIFNJT0NBWDI1REVMVUlEOgkvKiBEZWxldGUgYSB1aWQgZnJvbSB0aGUgdWlkL2NhbGwgbWFwIHRhYmxlICovCiAJY2FzZSBTSU9DQVgyNUdFVFVJRDogewpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9kc19zdWJyLmMgYi9uZXQvYXgyNS9heDI1X2RzX3N1YnIuYwppbmRleCA5NTY5ZGQzLi5hNDk3NzNmIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2RzX3N1YnIuYworKysgYi9uZXQvYXgyNS9heDI1X2RzX3N1YnIuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJaWYgKChza2IgPSBhbGxvY19za2IoMiwgR0ZQX0FUT01JQykpID09IE5VTEwpCiAJCXJldHVybjsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXAgPSBza2JfcHV0KHNrYiwgMik7CiAKIAkqcCsrID0gY21kOwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9pbi5jIGIvbmV0L2F4MjUvYXgyNV9pbi5jCmluZGV4IDRhNmIyNmIuLjBkZGFmZjAgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfaW4uYworKysgYi9uZXQvYXgyNS9heDI1X2luLmMKQEAgLTYxLDEyICs2MSwxNCBAQAogCQkJCQlza2JfcmVzZXJ2ZShza2JuLCBBWDI1X01BWF9IRUFERVJfTEVOKTsKIAogCQkJCQlza2JuLT5kZXYgICA9IGF4MjUtPmF4MjVfZGV2LT5kZXY7Ci0JCQkJCXNrYm4tPmgucmF3ID0gc2tibi0+ZGF0YTsKLQkJCQkJc2tibi0+bmgucmF3ID0gc2tibi0+ZGF0YTsKKwkJCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYm4pOworCQkJCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2JuKTsKIAogCQkJCQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgZnJhZ21lbnRzICovCiAJCQkJCXdoaWxlICgoc2tibyA9IHNrYl9kZXF1ZXVlKCZheDI1LT5mcmFnX3F1ZXVlKSkgIT0gTlVMTCkgewotCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwgc2tiby0+ZGF0YSwgc2tiby0+bGVuKTsKKwkJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tibywKKwkJCQkJCQkgIHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwKKwkJCQkJCQkJCSAgc2tiby0+bGVuKTsKIAkJCQkJCWtmcmVlX3NrYihza2JvKTsKIAkJCQkJfQogCkBAIC0xMjIsOCArMTI0LDggQEAKIAkJfQogCiAJCXNrYl9wdWxsKHNrYiwgMSk7CS8qIFJlbW92ZSBQSUQgKi8KLQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+bmgucmF3OwotCQlza2ItPm5oLnJhdyAgID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJc2tiLT5kZXYgICAgICA9IGF4MjUtPmF4MjVfZGV2LT5kZXY7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKQEAgLTE5Niw3ICsxOTgsNyBAQAogCSAqCVByb2Nlc3MgdGhlIEFYLjI1L0xBUEIgZnJhbWUuCiAJICovCiAKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAlpZiAoKGF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihkZXYpKSA9PSBOVUxMKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMjMzLDcgKzIzNSw3IEBACiAKIAkvKiBVSSBmcmFtZSAtIGJ5cGFzcyBMQVBCIHByb2Nlc3NpbmcgKi8KIAlpZiAoKCpza2ItPmRhdGEgJiB+MHgxMCkgPT0gQVgyNV9VSSAmJiBkcC5sYXN0cmVwZWF0ICsgMSA9PSBkcC5uZGlnaSkgewotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgMjsJCS8qIHNraXAgY29udHJvbCBhbmQgcGlkICovCisJCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIDIpOyAvKiBza2lwIGNvbnRyb2wgYW5kIHBpZCAqLwogCiAJCWF4MjVfc2VuZF90b19yYXcoJmRlc3QsIHNrYiwgc2tiLT5kYXRhWzFdKTsKIApAQCAtMjQ2LDggKzI0OCw4IEBACiAJCXN3aXRjaCAoc2tiLT5kYXRhWzFdKSB7CiAJCWNhc2UgQVgyNV9QX0lQOgogCQkJc2tiX3B1bGwoc2tiLDIpOwkJLyogZHJvcCBQSUQvQ1RSTCAqLwotCQkJc2tiLT5oLnJhdyAgICA9IHNrYi0+ZGF0YTsKLQkJCXNrYi0+bmgucmF3ICAgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCQlza2ItPmRldiAgICAgID0gZGV2OwogCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKQEAgLTI1Niw4ICsyNTgsOCBAQAogCiAJCWNhc2UgQVgyNV9QX0FSUDoKIAkJCXNrYl9wdWxsKHNrYiwyKTsKLQkJCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7Ci0JCQlza2ItPm5oLnJhdyAgID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCQkJc2tiLT5kZXYgICAgICA9IGRldjsKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9pcC5jIGIvbmV0L2F4MjUvYXgyNV9pcC5jCmluZGV4IDdmODE4YmIuLjkzMGU0OTEgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfaXAuYworKysgYi9uZXQvYXgyNS9heDI1X2lwLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlkaWdpcGVhdCA9IHJvdXRlLT5kaWdpcGVhdDsKIAkJZGV2ID0gcm91dGUtPmRldjsKIAkJaXBfbW9kZSA9IHJvdXRlLT5pcF9tb2RlOwotCX07CisJfQogCiAJaWYgKGRldiA9PSBOVUxMKQogCQlkZXYgPSBza2ItPmRldjsKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQkJc3JjX2MgPSAqKGF4MjVfYWRkcmVzcyAqKShicCArIDgpOwogCiAJCQlza2JfcHVsbChvdXJza2IsIEFYMjVfSEVBREVSX0xFTiAtIDEpOwkvKiBLZWVwIFBJRCAqLwotCQkJb3Vyc2tiLT5uaC5yYXcgPSBvdXJza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIob3Vyc2tiKTsKIAogCQkJYXgyNT1heDI1X3NlbmRfZnJhbWUoCiAJCQkgICAgb3Vyc2tiLApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9vdXQuYyBiL25ldC9heDI1L2F4MjVfb3V0LmMKaW5kZXggMjIzODM1MC4uOTJiNTE3YSAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9vdXQuYworKysgYi9uZXQvYXgyNS9heDI1X291dC5jCkBAIC0xNDgsOCArMTQ4LDkgQEAKIAogCQkJaWYgKGthOXFmcmFnID09IDEpIHsKIAkJCQlza2JfcmVzZXJ2ZShza2JuLCBmcm9udGxlbiArIDIpOwotCQkJCXNrYm4tPm5oLnJhdyA9IHNrYm4tPmRhdGEgKyAoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOwotCQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYm4sCisJCQkJCQkgICAgICBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoc2tibiwgbGVuKSwgbGVuKTsKIAkJCQlwID0gc2tiX3B1c2goc2tibiwgMik7CiAKIAkJCQkqcCsrID0gQVgyNV9QX1NFR01FTlQ7CkBAIC0xNjEsOCArMTYyLDkgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXNrYl9yZXNlcnZlKHNrYm4sIGZyb250bGVuICsgMSk7Ci0JCQkJc2tibi0+bmgucmF3ID0gc2tibi0+ZGF0YSArIChza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOworCQkJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tibiwKKwkJCQkJCSAgICAgIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChza2JuLCBsZW4pLCBsZW4pOwogCQkJCXAgPSBza2JfcHVzaChza2JuLCAxKTsKIAkJCQkqcCA9IEFYMjVfUF9URVhUOwogCQkJfQpAQCAtMjA1LDcgKzIwNyw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgewogCQlmcmFtZSA9IHNrYl9wdXNoKHNrYiwgMSk7CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3N1YnIuYyBiL25ldC9heDI1L2F4MjVfc3Vici5jCmluZGV4IGI2YzU3N2UuLjVmZTliMmEgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfc3Vici5jCisrKyBiL25ldC9heDI1L2F4MjVfc3Vici5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogCXNrYl9yZXNlcnZlKHNrYiwgYXgyNS0+YXgyNV9kZXYtPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJLyogQXNzdW1lIGEgcmVzcG9uc2UgLSBhZGRyZXNzIHN0cnVjdHVyZSBmb3IgRFRFICovCiAJaWYgKGF4MjUtPm1vZHVsdXMgPT0gQVgyNV9NT0RVTFVTKSB7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJcmV0dXJuOwkvKiBOZXh0IFNBQk0gd2lsbCBnZXQgRE0nZCAqLwogCiAJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlheDI1X2RpZ2lfaW52ZXJ0KGRpZ2ksICZyZXRkaWdpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKaW5kZXggYzcyMjhjZi4uZDk0MmI5NCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYworKysgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJY29waWVkID0gbGVuOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKIAogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggYjg1ZDE0OS4uYWIyZGI1NSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkvKiBWZXJpZnkgYW5kIHB1bGwgb3V0IGhlYWRlciAqLwogCWlmICghc2tiX3B1bGwoc2tiLCBfX2JuZXBfcnhfaGxlblt0eXBlICYgQk5FUF9UWVBFX01BU0tdKSkKQEAgLTM2NCwyNiArMzY0LDI4IEBACiAKIAljYXNlIEJORVBfQ09NUFJFU1NFRF9TUkNfT05MWToKIAkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHMtPmVoLmhfZGVzdCwgRVRIX0FMRU4pOwotCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOKSwgc2tiLT5tYWMucmF3LCBFVEhfQUxFTik7CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBza2JfbWFjX2hlYWRlcihza2IpLCBFVEhfQUxFTik7CiAJCXB1dF91bmFsaWduZWQocy0+ZWguaF9wcm90bywgKF9fYmUxNiAqKSBfX3NrYl9wdXQobnNrYiwgMikpOwogCQlicmVhazsKIAogCWNhc2UgQk5FUF9DT01QUkVTU0VEX0RTVF9PTkxZOgotCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOKSwgc2tiLT5tYWMucmF3LCBFVEhfQUxFTik7Ci0JCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4gKyAyKSwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOICsgMik7CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBza2JfbWFjX2hlYWRlcihza2IpLAorCQkgICAgICAgRVRIX0FMRU4pOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICsgMiksIHMtPmVoLmhfc291cmNlLAorCQkgICAgICAgRVRIX0FMRU4gKyAyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJORVBfR0VORVJBTDoKLQkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiAqIDIpLCBza2ItPm1hYy5yYXcsIEVUSF9BTEVOICogMik7CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4gKiAyKSwgc2tiX21hY19oZWFkZXIoc2tiKSwKKwkJICAgICAgIEVUSF9BTEVOICogMik7CiAJCXB1dF91bmFsaWduZWQocy0+ZWguaF9wcm90bywgKF9fYmUxNiAqKSBfX3NrYl9wdXQobnNrYiwgMikpOwogCQlicmVhazsKIAl9CiAKLQltZW1jcHkoX19za2JfcHV0KG5za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIF9fc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAogCXMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQluc2tiLT5kZXYgICAgICAgPSBkZXY7CiAJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAluc2tiLT5wcm90b2NvbCAgPSBldGhfdHlwZV90cmFucyhuc2tiLCBkZXYpOwogCW5ldGlmX3J4X25pKG5za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKaW5kZXggMzkzMzYwOC4uNjZiZWYxYyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAl9CiAKIAlpZiAoc2tiICYmIChza2ItPmxlbiA+IDApKQotCQltZW1jcHkoc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAogCW1lbWNweShza2JfcHV0KG5za2IsIGNvdW50KSwgYnVmLCBjb3VudCk7CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCQkJaGRyWzJdID0gc2l6ZSA+PiA4OwogCQl9CiAKLQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgc2l6ZSksIHNrYi0+ZGF0YSwgc2l6ZSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KG5za2IsIHNpemUpLCBzaXplKTsKIAkJc2tiX3B1bGwoc2tiLCBzaXplKTsKIAogCQlpZiAoc2tiLT5sZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggZjM0MDNmZC4uNjM5ODBiZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtNzIsMTEgKzcyLDExIEBACiAJCQlpbnF1aXJ5X2VudHJ5X2FnZShpZSkgPD0gSU5RVUlSWV9FTlRSWV9BR0VfTUFYKSB7CiAJCWNwLnBzY2FuX3JlcF9tb2RlID0gaWUtPmRhdGEucHNjYW5fcmVwX21vZGU7CiAJCWNwLnBzY2FuX21vZGUgICAgID0gaWUtPmRhdGEucHNjYW5fbW9kZTsKLQkJY3AuY2xvY2tfb2Zmc2V0ICAgPSBpZS0+ZGF0YS5jbG9ja19vZmZzZXQgfCBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJCWNwLmNsb2NrX29mZnNldCAgID0gaWUtPmRhdGEuY2xvY2tfb2Zmc2V0IHwgY3B1X3RvX2xlMTYoMHg4MDAwKTsKIAkJbWVtY3B5KGNvbm4tPmRldl9jbGFzcywgaWUtPmRhdGEuZGV2X2NsYXNzLCAzKTsKIAl9CiAKLQljcC5wa3RfdHlwZSA9IF9fY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBBQ0xfUFRZUEVfTUFTSyk7CisJY3AucGt0X3R5cGUgPSBjcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIEFDTF9QVFlQRV9NQVNLKTsKIAlpZiAobG1wX3Jzd2l0Y2hfY2FwYWJsZShoZGV2KSAmJiAhKGhkZXYtPmxpbmtfbW9kZSAmIEhDSV9MTV9NQVNURVIpKQogCQljcC5yb2xlX3N3aXRjaAk9IDB4MDE7CiAJZWxzZQpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIAljb25uLT5zdGF0ZSA9IEJUX0RJU0NPTk47CiAKLQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJY3AuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKIAljcC5yZWFzb24gPSByZWFzb247CiAJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwKIAkJCQlPQ0ZfRElTQ09OTkVDVCwgc2l6ZW9mKGNwKSwgJmNwKTsKQEAgLTEyMyw4ICsxMjMsOCBAQAogCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKIAljb25uLT5vdXQgPSAxOwogCi0JY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOwotCWNwLmhhbmRsZSAgID0gX19jcHVfdG9fbGUxNihoYW5kbGUpOworCWNwLnBrdF90eXBlID0gY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBTQ09fUFRZUEVfTUFTSyk7CisJY3AuaGFuZGxlICAgPSBjcHVfdG9fbGUxNihoYW5kbGUpOwogCiAJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0FERF9TQ08sIHNpemVvZihjcCksICZjcCk7CiB9CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKSkgewogCQlzdHJ1Y3QgaGNpX2NwX2F1dGhfcmVxdWVzdGVkIGNwOwotCQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9BVVRIX1JFUVVFU1RFRCwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNjgsNyArMzY4LDcgQEAKIAogCWlmIChoY2lfY29ubl9hdXRoKGNvbm4pKSB7CiAJCXN0cnVjdCBoY2lfY3Bfc2V0X2Nvbm5fZW5jcnlwdCBjcDsKLQkJY3AuaGFuZGxlICA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJY3AuaGFuZGxlICA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJCWNwLmVuY3J5cHQgPSAxOwogCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfU0VUX0NPTk5fRU5DUllQVCwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CkBAIC0zODMsNyArMzgzLDcgQEAKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKSkgewogCQlzdHJ1Y3QgaGNpX2NwX2NoYW5nZV9jb25uX2xpbmtfa2V5IGNwOwotCQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DSEFOR0VfQ09OTl9MSU5LX0tFWSwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00MjMsNyArNDIzLDcgQEAKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmY29ubi0+cGVuZCkpIHsKIAkJc3RydWN0IGhjaV9jcF9leGl0X3NuaWZmX21vZGUgY3A7Ci0JCWNwLmhhbmRsZSA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJY3AuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX1BPTElDWSwKIAkJCQlPQ0ZfRVhJVF9TTklGRl9NT0RFLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KQEAgLTQ1MiwyMSArNDUyLDIxIEBACiAKIAlpZiAobG1wX3NuaWZmc3Vicl9jYXBhYmxlKGhkZXYpICYmIGxtcF9zbmlmZnN1YnJfY2FwYWJsZShjb25uKSkgewogCQlzdHJ1Y3QgaGNpX2NwX3NuaWZmX3N1YnJhdGUgY3A7Ci0JCWNwLmhhbmRsZSAgICAgICAgICAgICA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKLQkJY3AubWF4X2xhdGVuY3kgICAgICAgID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKLQkJY3AubWluX3JlbW90ZV90aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKLQkJY3AubWluX2xvY2FsX3RpbWVvdXQgID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKwkJY3AuaGFuZGxlICAgICAgICAgICAgID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJY3AubWF4X2xhdGVuY3kgICAgICAgID0gY3B1X3RvX2xlMTYoMCk7CisJCWNwLm1pbl9yZW1vdGVfdGltZW91dCA9IGNwdV90b19sZTE2KDApOworCQljcC5taW5fbG9jYWxfdGltZW91dCAgPSBjcHVfdG9fbGUxNigwKTsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX1BPTElDWSwKIAkJCQlPQ0ZfU05JRkZfU1VCUkFURSwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fTU9ERV9DSEFOR0VfUEVORCwgJmNvbm4tPnBlbmQpKSB7CiAJCXN0cnVjdCBoY2lfY3Bfc25pZmZfbW9kZSBjcDsKLQkJY3AuaGFuZGxlICAgICAgID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwotCQljcC5tYXhfaW50ZXJ2YWwgPSBfX2NwdV90b19sZTE2KGhkZXYtPnNuaWZmX21heF9pbnRlcnZhbCk7Ci0JCWNwLm1pbl9pbnRlcnZhbCA9IF9fY3B1X3RvX2xlMTYoaGRldi0+c25pZmZfbWluX2ludGVydmFsKTsKLQkJY3AuYXR0ZW1wdCAgICAgID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig0KTsKLQkJY3AudGltZW91dCAgICAgID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwkJY3AuaGFuZGxlICAgICAgID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJY3AubWF4X2ludGVydmFsID0gY3B1X3RvX2xlMTYoaGRldi0+c25pZmZfbWF4X2ludGVydmFsKTsKKwkJY3AubWluX2ludGVydmFsID0gY3B1X3RvX2xlMTYoaGRldi0+c25pZmZfbWluX2ludGVydmFsKTsKKwkJY3AuYXR0ZW1wdCAgICAgID0gY3B1X3RvX2xlMTYoNCk7CisJCWNwLnRpbWVvdXQgICAgICA9IGNwdV90b19sZTE2KDEpOwogCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfUE9MSUNZLAogCQkJCU9DRl9TTklGRl9NT0RFLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwppbmRleCA0OTE3OTE5Li5hYTRiNTZhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlkZWZhdWx0OgogCQllcnIgPSAtRVRJTUVET1VUOwogCQlicmVhazsKLQl9OworCX0KIAogCWhkZXYtPnJlcV9zdGF0dXMgPSBoZGV2LT5yZXFfcmVzdWx0ID0gMDsKIApAQCAtMjE2LDEwICsyMTYsMTAgQEAKIAkvKiBIb3N0IGJ1ZmZlciBzaXplICovCiAJewogCQlzdHJ1Y3QgaGNpX2NwX2hvc3RfYnVmZmVyX3NpemUgY3A7Ci0JCWNwLmFjbF9tdHUgPSBfX2NwdV90b19sZTE2KEhDSV9NQVhfQUNMX1NJWkUpOworCQljcC5hY2xfbXR1ID0gY3B1X3RvX2xlMTYoSENJX01BWF9BQ0xfU0laRSk7CiAJCWNwLnNjb19tdHUgPSBIQ0lfTUFYX1NDT19TSVpFOwotCQljcC5hY2xfbWF4X3BrdCA9IF9fY3B1X3RvX2xlMTYoMHhmZmZmKTsKLQkJY3Auc2NvX21heF9wa3QgPSBfX2NwdV90b19sZTE2KDB4ZmZmZik7CisJCWNwLmFjbF9tYXhfcGt0ID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKKwkJY3Auc2NvX21heF9wa3QgPSBjcHVfdG9fbGUxNigweGZmZmYpOwogCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfSE9TVF9CVUZGRVJfU0laRSwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CiAjZW5kaWYKQEAgLTI0MCwxMSArMjQwLDExIEBACiAJfQogCiAJLyogUGFnZSB0aW1lb3V0IH4yMCBzZWNzICovCi0JcGFyYW0gPSBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJcGFyYW0gPSBjcHVfdG9fbGUxNigweDgwMDApOwogCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9QR19USU1FT1VULCAyLCAmcGFyYW0pOwogCiAJLyogQ29ubmVjdGlvbiBhY2NlcHQgdGltZW91dCB+MjAgc2VjcyAqLwotCXBhcmFtID0gX19jcHVfdG9fbGUxNigweDdkMDApOworCXBhcmFtID0gY3B1X3RvX2xlMTYoMHg3ZDAwKTsKIAloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfQ0FfVElNRU9VVCwgMiwgJnBhcmFtKTsKIH0KIApAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAl9CiAKIAloZHIgPSAoc3RydWN0IGhjaV9jb21tYW5kX2hkciAqKSBza2JfcHV0KHNrYiwgSENJX0NPTU1BTkRfSERSX1NJWkUpOwotCWhkci0+b3Bjb2RlID0gX19jcHVfdG9fbGUxNihoY2lfb3Bjb2RlX3BhY2sob2dmLCBvY2YpKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikpOwogCWhkci0+cGxlbiAgID0gcGxlbjsKIAogCWlmIChwbGVuKQpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKIAogCWhkciA9ICh2b2lkICopIGhkZXYtPnNlbnRfY21kLT5kYXRhOwogCi0JaWYgKGhkci0+b3Bjb2RlICE9IF9fY3B1X3RvX2xlMTYoaGNpX29wY29kZV9wYWNrKG9nZiwgb2NmKSkpCisJaWYgKGhkci0+b3Bjb2RlICE9IGNwdV90b19sZTE2KGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikpKQogCQlyZXR1cm4gTlVMTDsKIAogCUJUX0RCRygiJXMgb2dmIDB4JXggb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvZ2YsIG9jZik7CkBAIC0xMDc0LDExICsxMDc0LDExIEBACiAJc3RydWN0IGhjaV9hY2xfaGRyICpoZHI7CiAJaW50IGxlbiA9IHNrYi0+bGVuOwogCi0JaGRyID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKSBza2JfcHVzaChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOwotCWhkci0+aGFuZGxlID0gX19jcHVfdG9fbGUxNihoY2lfaGFuZGxlX3BhY2soaGFuZGxlLCBmbGFncykpOwotCWhkci0+ZGxlbiAgID0gX19jcHVfdG9fbGUxNihsZW4pOwotCi0Jc2tiLT5oLnJhdyA9ICh2b2lkICopIGhkcjsKKwlza2JfcHVzaChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJaGRyID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJaGRyLT5oYW5kbGUgPSBjcHVfdG9fbGUxNihoY2lfaGFuZGxlX3BhY2soaGFuZGxlLCBmbGFncykpOworCWhkci0+ZGxlbiAgID0gY3B1X3RvX2xlMTYobGVuKTsKIH0KIAogaW50IGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQpAQCAtMTE0MCwxMSArMTE0MCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQloZHIuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCWhkci5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwogCWhkci5kbGVuICAgPSBza2ItPmxlbjsKIAotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIEhDSV9TQ09fSERSX1NJWkUpOwotCW1lbWNweShza2ItPmgucmF3LCAmaGRyLCBIQ0lfU0NPX0hEUl9TSVpFKTsKKwlza2JfcHVzaChza2IsIEhDSV9TQ09fSERSX1NJWkUpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJbWVtY3B5KHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksICZoZHIsIEhDSV9TQ09fSERSX1NJWkUpOwogCiAJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OwogCWJ0X2NiKHNrYiktPnBrdF90eXBlID0gSENJX1NDT0RBVEFfUEtUOwpAQCAtMTM4Nyw3ICsxMzg4LDcgQEAKIAkJCWNhc2UgSENJX1NDT0RBVEFfUEtUOgogCQkJCWtmcmVlX3NrYihza2IpOwogCQkJCWNvbnRpbnVlOwotCQkJfTsKKwkJCX0KIAkJfQogCiAJCS8qIFByb2Nlc3MgZnJhbWUgKi8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IDkzNmQzZmMuLjQ0N2JhNzEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJCWlmIChjb25uLT50eXBlID09IEFDTF9MSU5LICYmIGhkZXYtPmxpbmtfcG9saWN5KSB7CiAJCQlzdHJ1Y3QgaGNpX2NwX3dyaXRlX2xpbmtfcG9saWN5IGNwOwogCQkJY3AuaGFuZGxlID0gZXYtPmhhbmRsZTsKLQkJCWNwLnBvbGljeSA9IF9fY3B1X3RvX2xlMTYoaGRldi0+bGlua19wb2xpY3kpOworCQkJY3AucG9saWN5ID0gY3B1X3RvX2xlMTYoaGRldi0+bGlua19wb2xpY3kpOwogCQkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX1BPTElDWSwKIAkJCQlPQ0ZfV1JJVEVfTElOS19QT0xJQ1ksIHNpemVvZihjcCksICZjcCk7CiAJCX0KQEAgLTc5Myw4ICs3OTMsOCBAQAogCQkJc3RydWN0IGhjaV9jcF9jaGFuZ2VfY29ubl9wdHlwZSBjcDsKIAkJCWNwLmhhbmRsZSA9IGV2LT5oYW5kbGU7CiAJCQljcC5wa3RfdHlwZSA9IChjb25uLT50eXBlID09IEFDTF9MSU5LKSA/Ci0JCQkJX19jcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIEFDTF9QVFlQRV9NQVNLKToKLQkJCQlfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOworCQkJCWNwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOgorCQkJCWNwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOwogCiAJCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfQ1RMLAogCQkJCU9DRl9DSEFOR0VfQ09OTl9QVFlQRSwgc2l6ZW9mKGNwKSwgJmNwKTsKQEAgLTk3MCw3ICs5NzAsNyBAQAogCQlpZiAodGVzdF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKIAkJCWlmICghZXYtPnN0YXR1cykgewogCQkJCXN0cnVjdCBoY2lfY3Bfc2V0X2Nvbm5fZW5jcnlwdCBjcDsKLQkJCQljcC5oYW5kbGUgID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQkJCWNwLmhhbmRsZSAgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwogCQkJCWNwLmVuY3J5cHQgPSAxOwogCQkJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsCiAJCQkJCU9DRl9TRVRfQ09OTl9FTkNSWVBULCBzaXplb2YoY3ApLCAmY3ApOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IDcxZjVjZmIuLjgzMmI1ZjQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQljb3BpZWQgPSBsZW47CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCiAJaGNpX3NvY2tfY21zZyhzaywgbXNnLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcC5jIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCmluZGV4IGU4M2VlODIuLmE1ODY3ODcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXAuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKQEAgLTQ1OSw4ICs0NTksOCBAQAogCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKIAkJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOwogCi0JCQlyZXEuZGNpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKLQkJCXJlcS5zY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOworCQkJcmVxLmRjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQkJcmVxLnNjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLAogCQkJCQlMMkNBUF9ESVNDT05OX1JFUSwgc2l6ZW9mKHJlcSksICZyZXEpOwogCQl9IGVsc2UgewpAQCAtNjUyLDcgKzY1Miw3IEBACiAJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgewogCQkJc3RydWN0IGwyY2FwX2Nvbm5fcmVxIHJlcTsKIAkJCWwyY2FwX3BpKHNrKS0+aWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7Ci0JCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAkJCXJlcS5wc20gID0gbDJjYXBfcGkoc2spLT5wc207CiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9waShzayktPmlkZW50LAogCQkJCQlMMkNBUF9DT05OX1JFUSwgc2l6ZW9mKHJlcSksICZyZXEpOwpAQCAtODY4LDggKzg2OCw4IEBACiAKIAkvKiBDcmVhdGUgTDJDQVAgaGVhZGVyICovCiAJbGggPSAoc3RydWN0IGwyY2FwX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfSERSX1NJWkUpOwotCWxoLT5jaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7Ci0JbGgtPmxlbiA9IF9fY3B1X3RvX2xlMTYobGVuICsgKGhsZW4gLSBMMkNBUF9IRFJfU0laRSkpOworCWxoLT5jaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCWxoLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4gKyAoaGxlbiAtIEwyQ0FQX0hEUl9TSVpFKSk7CiAKIAlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkKIAkJcHV0X3VuYWxpZ25lZChsMmNhcF9waShzayktPnBzbSwgKHUxNiAqKSBza2JfcHV0KHNrYiwgMikpOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAkJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVCkgewogCQkJc3RydWN0IGwyY2FwX2Nvbm5fcmVxIHJlcTsKIAkJCWwyY2FwX3BpKHNrKS0+aWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7Ci0JCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAkJCXJlcS5wc20gID0gbDJjYXBfcGkoc2spLT5wc207CiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9waShzayktPmlkZW50LCBMMkNBUF9DT05OX1JFUSwgc2l6ZW9mKHJlcSksICZyZXEpOwogCQl9CkBAIC0xMTkyLDEzICsxMTkyLDEzIEBACiAJCXJldHVybiBOVUxMOwogCiAJbGggPSAoc3RydWN0IGwyY2FwX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfSERSX1NJWkUpOwotCWxoLT5sZW4gPSBfX2NwdV90b19sZTE2KEwyQ0FQX0NNRF9IRFJfU0laRSArIGRsZW4pOwotCWxoLT5jaWQgPSBfX2NwdV90b19sZTE2KDB4MDAwMSk7CisJbGgtPmxlbiA9IGNwdV90b19sZTE2KEwyQ0FQX0NNRF9IRFJfU0laRSArIGRsZW4pOworCWxoLT5jaWQgPSBjcHVfdG9fbGUxNigweDAwMDEpOwogCiAJY21kID0gKHN0cnVjdCBsMmNhcF9jbWRfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9DTURfSERSX1NJWkUpOwogCWNtZC0+Y29kZSAgPSBjb2RlOwogCWNtZC0+aWRlbnQgPSBpZGVudDsKLQljbWQtPmxlbiAgID0gX19jcHVfdG9fbGUxNihkbGVuKTsKKwljbWQtPmxlbiAgID0gY3B1X3RvX2xlMTYoZGxlbik7CiAKIAlpZiAoZGxlbikgewogCQljb3VudCAtPSBMMkNBUF9IRFJfU0laRSArIEwyQ0FQX0NNRF9IRFJfU0laRTsKQEAgLTEzMTYsMTEgKzEzMTYsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIDI6Ci0JCSooKHUxNiAqKSBvcHQtPnZhbCkgPSBfX2NwdV90b19sZTE2KHZhbCk7CisJCSooKHUxNiAqKSBvcHQtPnZhbCkgPSBjcHVfdG9fbGUxNih2YWwpOwogCQlicmVhazsKIAogCWNhc2UgNDoKLQkJKigodTMyICopIG9wdC0+dmFsKSA9IF9fY3B1X3RvX2xlMzIodmFsKTsKKwkJKigodTMyICopIG9wdC0+dmFsKSA9IGNwdV90b19sZTMyKHZhbCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEzNDYsOCArMTM0Niw4IEBACiAJLy9pZiAoZmx1c2hfdG8gIT0gTDJDQVBfREVGQVVMVF9GTFVTSF9UTykKIAkvLyAgIGwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0ZMVVNIX1RPLCAyLCBwaS0+Zmx1c2hfdG8pOwogCi0JcmVxLT5kY2lkICA9IF9fY3B1X3RvX2xlMTYocGktPmRjaWQpOwotCXJlcS0+ZmxhZ3MgPSBfX2NwdV90b19sZTE2KDApOworCXJlcS0+ZGNpZCAgPSBjcHVfdG9fbGUxNihwaS0+ZGNpZCk7CisJcmVxLT5mbGFncyA9IGNwdV90b19sZTE2KDApOwogCiAJcmV0dXJuIHB0ciAtIGRhdGE7CiB9CkBAIC0xMzgzLDkgKzEzODMsOSBAQAogCWVsc2UKIAkJZmxhZ3MgPSAweDAwMDE7CiAKLQlyc3AtPnNjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKLQlyc3AtPnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0ID8gKnJlc3VsdCA6IDApOwotCXJzcC0+ZmxhZ3MgID0gX19jcHVfdG9fbGUxNihmbGFncyk7CisJcnNwLT5zY2lkICAgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCXJzcC0+cmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0ID8gKnJlc3VsdCA6IDApOworCXJzcC0+ZmxhZ3MgID0gY3B1X3RvX2xlMTYoZmxhZ3MpOwogCiAJcmV0dXJuIHB0ciAtIGRhdGE7CiB9CkBAIC0xNDcwLDEwICsxNDcwLDEwIEBACiAJYmhfdW5sb2NrX3NvY2socGFyZW50KTsKIAogc2VuZHJlc3A6Ci0JcnNwLnNjaWQgICA9IF9fY3B1X3RvX2xlMTYoc2NpZCk7Ci0JcnNwLmRjaWQgICA9IF9fY3B1X3RvX2xlMTYoZGNpZCk7Ci0JcnNwLnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0KTsKLQlyc3Auc3RhdHVzID0gX19jcHVfdG9fbGUxNihzdGF0dXMpOworCXJzcC5zY2lkICAgPSBjcHVfdG9fbGUxNihzY2lkKTsKKwlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYoZGNpZCk7CisJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCk7CisJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXR1cyk7CiAJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MTMsOCArMTYxMyw4IEBACiAJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAqIDUpOwogCQl7CiAJCQlzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgcmVxOwotCQkJcmVxLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7Ci0JCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCXJlcS5kY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwkJCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKIAkJCQkJTDJDQVBfRElTQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKIAkJfQpAQCAtMTY1Miw4ICsxNjUyLDggQEAKIAlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgZGNpZCkpKQogCQlyZXR1cm4gMDsKIAotCXJzcC5kY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOwotCXJzcC5zY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCXJzcC5kY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwlyc3Auc2NpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CiAJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfRElTQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKIAogCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CkBAIC0xNjk2LDggKzE2OTYsOCBAQAogCiAJQlRfREJHKCJ0eXBlIDB4JTQuNHgiLCB0eXBlKTsKIAotCXJzcC50eXBlICAgPSBfX2NwdV90b19sZTE2KHR5cGUpOwotCXJzcC5yZXN1bHQgPSBfX2NwdV90b19sZTE2KEwyQ0FQX0lSX05PVFNVUFApOworCXJzcC50eXBlICAgPSBjcHVfdG9fbGUxNih0eXBlKTsKKwlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYoTDJDQVBfSVJfTk9UU1VQUCk7CiAJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfSU5GT19SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKIAogCXJldHVybiAwOwpAQCAtMTc5NCw3ICsxNzk0LDcgQEAKIAkJCUJUX0RCRygiZXJyb3IgJWQiLCBlcnIpOwogCiAJCQkvKiBGSVhNRTogTWFwIGVyciB0byBhIHZhbGlkIHJlYXNvbiAqLwotCQkJcmVqLnJlYXNvbiA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCQlyZWoucmVhc29uID0gY3B1X3RvX2xlMTYoMCk7CiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQuaWRlbnQsIEwyQ0FQX0NPTU1BTkRfUkVKLCBzaXplb2YocmVqKSwgJnJlaik7CiAJCX0KIApAQCAtMTk5MywxMCArMTk5MywxMCBAQAogCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOwogCQl9CiAKLQkJcnNwLnNjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKLQkJcnNwLmRjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKLQkJcnNwLnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0KTsKLQkJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCXJzcC5zY2lkICAgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCk7CisJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNigwKTsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKIAkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOwogCkBAIC0yMDQxLDEwICsyMDQxLDEwIEBACiAJCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CiAJCX0KIAotCQlyc3Auc2NpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwotCQlyc3AuZGNpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOwotCQlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihyZXN1bHQpOwotCQlyc3Auc3RhdHVzID0gX19jcHVfdG9fbGUxNigwKTsKKwkJcnNwLnNjaWQgICA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJCXJzcC5kY2lkICAgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOworCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKKwkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KDApOwogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9waShzayktPmlkZW50LAogCQkJCUwyQ0FQX0NPTk5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7CiAKQEAgLTIxMDcsNyArMjEwNyw4IEBACiAJCWlmICghKGNvbm4tPnJ4X3NrYiA9IGJ0X3NrYl9hbGxvYyhsZW4sIEdGUF9BVE9NSUMpKSkKIAkJCWdvdG8gZHJvcDsKIAotCQltZW1jcHkoc2tiX3B1dChjb25uLT5yeF9za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGNvbm4tPnJ4X3NrYiwgc2tiLT5sZW4pLAorCQkJICAgICAgc2tiLT5sZW4pOwogCQljb25uLT5yeF9sZW4gPSBsZW4gLSBza2ItPmxlbjsKIAl9IGVsc2UgewogCQlCVF9EQkcoIkNvbnQ6IGZyYWcgbGVuICVkIChleHBlY3RpbmcgJWQpIiwgc2tiLT5sZW4sIGNvbm4tPnJ4X2xlbik7CkBAIC0yMTI4LDcgKzIxMjksOCBAQAogCQkJZ290byBkcm9wOwogCQl9CiAKLQkJbWVtY3B5KHNrYl9wdXQoY29ubi0+cnhfc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChjb25uLT5yeF9za2IsIHNrYi0+bGVuKSwKKwkJCSAgICAgIHNrYi0+bGVuKTsKIAkJY29ubi0+cnhfbGVuIC09IHNrYi0+bGVuOwogCiAJCWlmICghY29ubi0+cnhfbGVuKSB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKaW5kZXggOTRmNDU3My4uZmU3ZGY5MCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwpAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKIAogCS8qIFRyaW0gRkNTICovCiAJc2tiLT5sZW4tLTsgc2tiLT50YWlsLS07Ci0JZmNzID0gKih1OCAqKSBza2ItPnRhaWw7CisJZmNzID0gKih1OCAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCWlmIChfX2NoZWNrX2Zjcyhza2ItPmRhdGEsIHR5cGUsIGZjcykpIHsKIAkJQlRfRVJSKCJiYWQgY2hlY2tzdW0gaW4gcGFja2V0Iik7CkBAIC0xODUxLDE4ICsxODUxLDE4IEBACiAJQlRfREJHKCIiKTsKIAogCXdoaWxlICghYXRvbWljX3JlYWQoJnRlcm1pbmF0ZSkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKCF0ZXN0X2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KSkgewogCQkJLyogTm8gcGVuZGluZyBldmVudHMuIExldCdzIHNsZWVwLgogCQkJICogSW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGRhdGEgd2lsbCB3YWtlIHVzIHVwLiAqLwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCXNjaGVkdWxlKCk7CiAJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAogCQkvKiBQcm9jZXNzIHN0dWZmICovCiAJCWNsZWFyX2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KTsKIAkJcmZjb21tX3Byb2Nlc3Nfc2Vzc2lvbnMoKTsKIAl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc2NvLmMgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCmluZGV4IGFlNDM5MTQuLjNmNTE2M2UgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc2NvLmMKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJZGVmYXVsdDoKIAkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOwogCQlicmVhazsKLQl9OworCX0KIAogCXJlbGVhc2Vfc29jayhzayk7CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnIuYyBiL25ldC9icmlkZ2UvYnIuYwppbmRleCAyOTk0Mzg3Li44NDhiOGZhIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyLmMKKysrIGIvbmV0L2JyaWRnZS9ici5jCkBAIC0zNyw3ICszNyw5IEBACiAJCXJldHVybiAtRUFERFJJTlVTRTsKIAl9CiAKLQlicl9mZGJfaW5pdCgpOworCWVyciA9IGJyX2ZkYl9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0MTsKIAogCWVyciA9IGJyX25ldGZpbHRlcl9pbml0KCk7CiAJaWYgKGVycikKQEAgLTQ3LDcgKzQ5LDEwIEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0MjsKIAotCWJyX25ldGxpbmtfaW5pdCgpOworCWVyciA9IGJyX25ldGxpbmtfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDM7CisKIAlicmlvY3RsX3NldChicl9pb2N0bF9kZXZpY2VsZXNzX3N0dWIpOwogCWJyX2hhbmRsZV9mcmFtZV9ob29rID0gYnJfaGFuZGxlX2ZyYW1lOwogCkBAIC01NSw3ICs2MCw4IEBACiAJYnJfZmRiX3B1dF9ob29rID0gYnJfZmRiX3B1dDsKIAogCXJldHVybiAwOwotCitlcnJfb3V0MzoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYnJfZGV2aWNlX25vdGlmaWVyKTsKIGVycl9vdXQyOgogCWJyX25ldGZpbHRlcl9maW5pKCk7CiBlcnJfb3V0MToKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCmluZGV4IDkwNWEzOWMuLjVlMTg5MmQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKKysrIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwpAQCAtMzcsNyArMzcsNyBAQAogCWJyLT5zdGF0aXN0aWNzLnR4X3BhY2tldHMrKzsKIAlici0+c3RhdGlzdGljcy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwogCiAJaWYgKGRlc3RbMF0gJiAxKQpAQCAtODMsMjcgKzgzLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEFsbG93IHNldHRpbmcgbWFjIGFkZHJlc3Mgb2YgcHNldWRvLWJyaWRnZSB0byBiZSBzYW1lIGFzCi0gKiBhbnkgb2YgdGhlIGJvdW5kIGludGVyZmFjZXMKLSAqLworLyogQWxsb3cgc2V0dGluZyBtYWMgYWRkcmVzcyB0byBhbnkgdmFsaWQgZXRoZXJuZXQgYWRkcmVzcy4gKi8KIHN0YXRpYyBpbnQgYnJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQ7Ci0JaW50IGVyciA9IC1FQUREUk5PVEFWQUlMOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocG9ydC0+ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSkpIHsKLQkJCWJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKGJyLCBhZGRyLT5zYV9kYXRhKTsKLQkJCWVyciA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCWJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKGJyLCBhZGRyLT5zYV9kYXRhKTsKIAlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYnJfZ2V0aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKaW5kZXggOGQ1NjZjMS4uOTFiMDE3MCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mZGIuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCkBAIC0yMCwxOSArMjAsMjggQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYnJfZmRiX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50IGZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCiAJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOwogCi12b2lkIF9faW5pdCBicl9mZGJfaW5pdCh2b2lkKQorc3RhdGljIHUzMiBmZGJfc2FsdCBfX3JlYWRfbW9zdGx5OworCitpbnQgX19pbml0IGJyX2ZkYl9pbml0KHZvaWQpCiB7CiAJYnJfZmRiX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJyaWRnZV9mZGJfY2FjaGUiLAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSksCiAJCQkJCSAwLAogCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWJyX2ZkYl9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZmZGJfc2FsdCwgc2l6ZW9mKGZkYl9zYWx0KSk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgX19leGl0IGJyX2ZkYl9maW5pKHZvaWQpCkBAIC00NCwyNCArNTMsMjYgQEAKIC8qIGlmIHRvcG9sb2d5X2NoYW5naW5nIHRoZW4gdXNlIGZvcndhcmRfZGVsYXkgKGRlZmF1bHQgMTUgc2VjKQogICogb3RoZXJ3aXNlIGtlZXAgbG9uZ2VyIChkZWZhdWx0IDUgbWludXRlcykKICAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBob2xkX3RpbWUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhvbGRfdGltZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCiB7CiAJcmV0dXJuIGJyLT50b3BvbG9neV9jaGFuZ2UgPyBici0+Zm9yd2FyZF9kZWxheSA6IGJyLT5hZ2VpbmdfdGltZTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGhhc19leHBpcmVkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19leHBpcmVkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiKQogewogCXJldHVybiAhZmRiLT5pc19zdGF0aWMKIAkJJiYgdGltZV9iZWZvcmVfZXEoZmRiLT5hZ2VpbmdfdGltZXIgKyBob2xkX3RpbWUoYnIpLCBqaWZmaWVzKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGJyX21hY19oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYykKK3N0YXRpYyBpbmxpbmUgaW50IGJyX21hY19oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYykKIHsKLQlyZXR1cm4gamhhc2gobWFjLCBFVEhfQUxFTiwgMCkgJiAoQlJfSEFTSF9TSVpFIC0gMSk7CisJLyogdXNlIDEgYnl0ZSBvZiBPVUkgY25kIDMgYnl0ZXMgb2YgTklDICovCisJdTMyIGtleSA9IGdldF91bmFsaWduZWQoKHUzMiAqKShtYWMgKyAyKSk7CisJcmV0dXJuIGpoYXNoXzF3b3JkKGtleSwgZmRiX3NhbHQpICYgKEJSX0hBU0hfU0laRSAtIDEpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZkYl9kZWxldGUoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmKQorc3RhdGljIGlubGluZSB2b2lkIGZkYl9kZWxldGUoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmKQogewogCWhsaXN0X2RlbF9yY3UoJmYtPmhsaXN0KTsKIAlicl9mZGJfcHV0KGYpOwpAQCAtMTI4LDcgKzEzOSwyNiBAQAogCW1vZF90aW1lcigmYnItPmdjX3RpbWVyLCBqaWZmaWVzICsgSFovMTApOwogfQogCisvKiBDb21wbGV0ZWx5IGZsdXNoIGFsbCBkeW5hbWljIGVudHJpZXMgaW4gZm9yd2FyZGluZyBkYXRhYmFzZS4qLwordm9pZCBicl9mZGJfZmx1c2goc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWludCBpOwogCisJc3Bpbl9sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlJfSEFTSF9TSVpFOyBpKyspIHsKKwkJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqaCwgKm47CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZiwgaCwgbiwgJmJyLT5oYXNoW2ldLCBobGlzdCkgeworCQkJaWYgKCFmLT5pc19zdGF0aWMpCisJCQkJZmRiX2RlbGV0ZShmKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7Cit9CisKKy8qIEZsdXNoIGFsbCBlbnRyaWVzIHJlZmVyaW5nIHRvIGEgc3BlY2lmaWMgcG9ydC4KKyAqIGlmIGRvX2FsbCBpcyBzZXQgYWxzbyBmbHVzaCBzdGF0aWMgZW50cmllcworICovCiB2b2lkIGJyX2ZkYl9kZWxldGVfYnlfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAogCQkJICAgaW50IGRvX2FsbCkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKaW5kZXggM2U0NWMxYS4uYWRhN2Y0OSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogCWluZGV2ID0gc2tiLT5kZXY7CiAJc2tiLT5kZXYgPSB0by0+ZGV2OwotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlza2JfZm9yd2FyZF9jc3VtKHNrYik7CiAKIAlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgc2tiLCBpbmRldiwgc2tiLT5kZXYsCiAJCQlicl9mb3J3YXJkX2ZpbmlzaCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggZjNhMmUyOS4uNjkwNTczYiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMTUyLDYgKzE1Miw4IEBACiAJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKIAlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOwogCisJYnJfaWZpbmZvX25vdGlmeShSVE1fREVMTElOSywgcCk7CisKIAlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHAsIDEpOwogCiAJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKQEAgLTIwMyw3ICsyMDUsNyBAQAogCW1lbWNweShici0+Z3JvdXBfYWRkciwgYnJfZ3JvdXBfYWRkcmVzcywgRVRIX0FMRU4pOwogCiAJYnItPmZlYXR1cmVfbWFzayA9IGRldi0+ZmVhdHVyZXM7Ci0JYnItPnN0cF9lbmFibGVkID0gMDsKKwlici0+c3RwX2VuYWJsZWQgPSBCUl9OT19TVFA7CiAJYnItPmRlc2lnbmF0ZWRfcm9vdCA9IGJyLT5icmlkZ2VfaWQ7CiAJYnItPnJvb3RfcGF0aF9jb3N0ID0gMDsKIAlici0+cm9vdF9wb3J0ID0gMDsKQEAgLTQzNCw2ICs0MzYsOCBAQAogCQlicl9zdHBfZW5hYmxlX3BvcnQocCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIAorCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOworCiAJZGV2X3NldF9tdHUoYnItPmRldiwgYnJfbWluX210dShicikpOwogCiAJa29iamVjdF91ZXZlbnQoJnAtPmtvYmosIEtPQkpfQUREKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwppbmRleCAzNWI5NGY5Li40MjBiYmI5IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCkBAIC0xMTIsNDYgKzExMiw1OSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBpc19saW5rX2xvY2FsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc3QpCiB7Ci0JcmV0dXJuIG1lbWNtcChkZXN0LCBicl9ncm91cF9hZGRyZXNzLCA1KSA9PSAwICYmIChkZXN0WzVdICYgMHhmMCkgPT0gMDsKKwljb25zdCB1MTYgKmEgPSAoY29uc3QgdTE2ICopIGRlc3Q7CisJc3RhdGljIGNvbnN0IHUxNiAqY29uc3QgYiA9IChjb25zdCB1MTYgKmNvbnN0ICkgYnJfZ3JvdXBfYWRkcmVzczsKKwlzdGF0aWMgY29uc3QgdTE2IG0gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KDB4ZmZmMCk7CisKKwlyZXR1cm4gKChhWzBdIF4gYlswXSkgfCAoYVsxXSBeIGJbMV0pIHwgKChhWzJdIF4gYlsyXSkgJiBtKSkgPT0gMDsKIH0KIAogLyoKICAqIENhbGxlZCB2aWEgYnJfaGFuZGxlX2ZyYW1lX2hvb2suCi0gKiBSZXR1cm4gMCBpZiAqcHNrYiBzaG91bGQgYmUgcHJvY2Vzc2VkIGZ1cnRodXIKLSAqCSAgMSBpZiAqcHNrYiBpcyBoYW5kbGVkCisgKiBSZXR1cm4gTlVMTCBpZiBza2IgaXMgaGFuZGxlZAogICogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrIChwcmVlbXB0X2Rpc2FibGVkKQogICovCi1pbnQgYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBza19idWZmICoqcHNrYikKK3N0cnVjdCBza19idWZmICpicl9oYW5kbGVfZnJhbWUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpKQotCQlnb3RvIGVycjsKKwkJZ290byBkcm9wOwogCiAJaWYgKHVubGlrZWx5KGlzX2xpbmtfbG9jYWwoZGVzdCkpKSB7Ci0JCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQkJcmV0dXJuIE5GX0hPT0soUEZfQlJJREdFLCBORl9CUl9MT0NBTF9JTiwgc2tiLCBza2ItPmRldiwKLQkJCSAgICAgICBOVUxMLCBicl9oYW5kbGVfbG9jYWxfZmluaXNoKSAhPSAwOworCQkvKiBQYXVzZSBmcmFtZXMgc2hvdWxkbid0IGJlIHBhc3NlZCB1cCBieSBkcml2ZXIgYW55d2F5ICovCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BBVVNFKSkKKwkJCWdvdG8gZHJvcDsKKworCQkvKiBQcm9jZXNzIFNUUCBCUERVJ3MgdGhyb3VnaCBub3JtYWwgbmV0aWZfcmVjZWl2ZV9za2IoKSBwYXRoICovCisJCWlmIChwLT5ici0+c3RwX2VuYWJsZWQgIT0gQlJfTk9fU1RQKSB7CisJCQlpZiAoTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0xPQ0FMX0lOLCBza2IsIHNrYi0+ZGV2LAorCQkJCSAgICBOVUxMLCBicl9oYW5kbGVfbG9jYWxfZmluaXNoKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gc2tiOworCQl9CiAJfQogCi0JaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0ZPUldBUkRJTkcgfHwgcC0+c3RhdGUgPT0gQlJfU1RBVEVfTEVBUk5JTkcpIHsKKwlzd2l0Y2ggKHAtPnN0YXRlKSB7CisJY2FzZSBCUl9TVEFURV9GT1JXQVJESU5HOgorCiAJCWlmIChicl9zaG91bGRfcm91dGVfaG9vaykgewotCQkJaWYgKGJyX3Nob3VsZF9yb3V0ZV9ob29rKHBza2IpKQotCQkJCXJldHVybiAwOwotCQkJc2tiID0gKnBza2I7CisJCQlpZiAoYnJfc2hvdWxkX3JvdXRlX2hvb2soJnNrYikpCisJCQkJcmV0dXJuIHNrYjsKIAkJCWRlc3QgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKIAkJfQotCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgQlJfU1RBVEVfTEVBUk5JTkc6CiAJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHAtPmJyLT5kZXYtPmRldl9hZGRyLCBkZXN0KSkKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAogCQlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCiAJCQlicl9oYW5kbGVfZnJhbWVfZmluaXNoKTsKLQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6Citkcm9wOgorCQlrZnJlZV9za2Ioc2tiKTsKIAl9Ci0KLWVycjoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW9jdGwuYyBiL25ldC9icmlkZ2UvYnJfaW9jdGwuYwppbmRleCAxNDcwMTVmLi5lZGEwZmJmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pb2N0bC5jCkBAIC0xMzcsNyArMTM3LDggQEAKIAkJYi50b3BvbG9neV9jaGFuZ2UgPSBici0+dG9wb2xvZ3lfY2hhbmdlOwogCQliLnRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCA9IGJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQ7CiAJCWIucm9vdF9wb3J0ID0gYnItPnJvb3RfcG9ydDsKLQkJYi5zdHBfZW5hYmxlZCA9IGJyLT5zdHBfZW5hYmxlZDsKKworCQliLnN0cF9lbmFibGVkID0gKGJyLT5zdHBfZW5hYmxlZCAhPSBCUl9OT19TVFApOwogCQliLmFnZWluZ190aW1lID0gamlmZmllc190b19jbG9ja190KGJyLT5hZ2VpbmdfdGltZSk7CiAJCWIuaGVsbG9fdGltZXJfdmFsdWUgPSBicl90aW1lcl92YWx1ZSgmYnItPmhlbGxvX3RpbWVyKTsKIAkJYi50Y25fdGltZXJfdmFsdWUgPSBicl90aW1lcl92YWx1ZSgmYnItPnRjbl90aW1lcik7CkBAIC0yNTEsNyArMjUyLDcgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKIAotCQlici0+c3RwX2VuYWJsZWQgPSBhcmdzWzFdPzE6MDsKKwkJYnJfc3RwX3NldF9lbmFibGVkKGJyLCBhcmdzWzFdKTsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIEJSQ1RMX1NFVF9CUklER0VfUFJJT1JJVFk6CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCA1NDM5YTNjLi45YjI5ODZiIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KQEAgLTQ4LDggKzUwLDggQEAKIAogI2RlZmluZSBza2Jfb3JpZ2FkZHIoc2tiKQkgKCgoc3RydWN0IGJyaWRnZV9za2JfY2IgKikgXAogCQkJCSAoc2tiLT5uZl9icmlkZ2UtPmRhdGEpKS0+ZGFkZHIuaXB2NCkKLSNkZWZpbmUgc3RvcmVfb3JpZ19kc3RhZGRyKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSA9IChza2IpLT5uaC5pcGgtPmRhZGRyKQotI2RlZmluZSBkbmF0X3Rvb2tfcGxhY2Uoc2tiKQkgKHNrYl9vcmlnYWRkcihza2IpICE9IChza2IpLT5uaC5pcGgtPmRhZGRyKQorI2RlZmluZSBzdG9yZV9vcmlnX2RzdGFkZHIoc2tiKQkgKHNrYl9vcmlnYWRkcihza2IpID0gaXBfaGRyKHNrYiktPmRhZGRyKQorI2RlZmluZSBkbmF0X3Rvb2tfcGxhY2Uoc2tiKQkgKHNrYl9vcmlnYWRkcihza2IpICE9IGlwX2hkcihza2IpLT5kYWRkcikKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqYnJuZl9zeXNjdGxfaGVhZGVyOwpAQCAtNTcsOCArNTksMTAgQEAKIHN0YXRpYyBpbnQgYnJuZl9jYWxsX2lwNnRhYmxlcyBfX3JlYWRfbW9zdGx5ID0gMTsKIHN0YXRpYyBpbnQgYnJuZl9jYWxsX2FycHRhYmxlcyBfX3JlYWRfbW9zdGx5ID0gMTsKIHN0YXRpYyBpbnQgYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgaW50IGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCBfX3JlYWRfbW9zdGx5ID0gMTsKICNlbHNlCiAjZGVmaW5lIGJybmZfZmlsdGVyX3ZsYW5fdGFnZ2VkIDEKKyNkZWZpbmUgYnJuZl9maWx0ZXJfcHBwb2VfdGFnZ2VkIDEKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIF9fYmUxNiB2bGFuX3Byb3RvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCkBAIC04MSw2ICs4NSwyMiBAQAogCSB2bGFuX3Byb3RvKHNrYikgPT0gaHRvbnMoRVRIX1BfQVJQKSAmJglcCiAJIGJybmZfZmlsdGVyX3ZsYW5fdGFnZ2VkKQogCitzdGF0aWMgaW5saW5lIF9fYmUxNiBwcHBvZV9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAqKChfX2JlMTYgKikoc2tiX21hY19oZWFkZXIoc2tiKSArIEVUSF9ITEVOICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpKTsKK30KKworI2RlZmluZSBJU19QUFBPRV9JUChza2IpIFwKKwkoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSAmJiBcCisJIHBwcG9lX3Byb3RvKHNrYikgPT0gaHRvbnMoUFBQX0lQKSAmJiBcCisJIGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCkKKworI2RlZmluZSBJU19QUFBPRV9JUFY2KHNrYikgXAorCShza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpICYmIFwKKwkgcHBwb2VfcHJvdG8oc2tiKSA9PSBodG9ucyhQUFBfSVBWNikgJiYgXAorCSBicm5mX2ZpbHRlcl9wcHBvZV90YWdnZWQpCisKIC8qIFdlIG5lZWQgdGhlc2UgZmFrZSBzdHJ1Y3R1cmVzIHRvIG1ha2UgbmV0ZmlsdGVyIGhhcHB5IC0tCiAgKiBsb3RzIG9mIHBsYWNlcyBhc3N1bWUgdGhhdCBza2ItPmRzdCAhPSBOVUxMLCB3aGljaCBpc24ndAogICogYWxsIHRoYXQgdW5yZWFzb25hYmxlLgpAQCAtMTI4LDggKzE0OCwxMSBAQAogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQogCQloZWFkZXJfc2l6ZSArPSBWTEFOX0hMRU47CisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkKKwkJaGVhZGVyX3NpemUgKz0gUFBQT0VfU0VTX0hMRU47CiAKLQltZW1jcHkoc2tiLT5uZl9icmlkZ2UtPmRhdGEsIHNrYi0+ZGF0YSAtIGhlYWRlcl9zaXplLCBoZWFkZXJfc2l6ZSk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAtaGVhZGVyX3NpemUsCisJCQkJCSBza2ItPm5mX2JyaWRnZS0+ZGF0YSwgaGVhZGVyX3NpemUpOwogfQogCiAvKgpAQCAtMTQzLDE1ICsxNjYsMjAgQEAKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkKIAkJaGVhZGVyX3NpemUgKz0gVkxBTl9ITEVOOworCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCisJCWhlYWRlcl9zaXplICs9IFBQUE9FX1NFU19ITEVOOwogCiAJZXJyID0gc2tiX2Nvdyhza2IsIGhlYWRlcl9zaXplKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JbWVtY3B5KHNrYi0+ZGF0YSAtIGhlYWRlcl9zaXplLCBza2ItPm5mX2JyaWRnZS0+ZGF0YSwgaGVhZGVyX3NpemUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIC1oZWFkZXJfc2l6ZSwKKwkJCQkgICAgICAgc2tiLT5uZl9icmlkZ2UtPmRhdGEsIGhlYWRlcl9zaXplKTsKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkKIAkJX19za2JfcHVzaChza2IsIFZMQU5fSExFTik7CisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkKKwkJX19za2JfcHVzaChza2IsIFBQUE9FX1NFU19ITEVOKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0LDcgKzIwMiwxMCBAQAogCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCXNrYl9wdXNoKHNrYiwgVkxBTl9ITEVOKTsKLQkJc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFZMQU5fSExFTjsKKwl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJc2tiX3B1c2goc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gUFBQT0VfU0VTX0hMRU47CiAJfQogCU5GX0hPT0tfVEhSRVNIKFBGX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCiAJCSAgICAgICBicl9oYW5kbGVfZnJhbWVfZmluaXNoLCAxKTsKQEAgLTI1NSw3ICsyODYsMTAgQEAKIAllbHNlIHsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCQlza2JfcHVsbChza2IsIFZMQU5fSExFTik7Ci0JCQlza2ItPm5oLnJhdyArPSBWTEFOX0hMRU47CisJCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFZMQU5fSExFTjsKKwkJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCQlza2JfcHVsbChza2IsIFBQUE9FX1NFU19ITEVOKTsKKwkJCXNrYi0+bmV0d29ya19oZWFkZXIgKz0gUFBQT0VfU0VTX0hMRU47CiAJCX0KIAkJc2tiLT5kc3QtPm91dHB1dChza2IpOwogCX0KQEAgLTI2NSw3ICsyOTksNyBAQAogc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CiAJaW50IGVycjsKIApAQCAtMzI1LDcgKzM1OSwxMSBAQAogCQkJCWlmIChza2ItPnByb3RvY29sID09CiAJCQkJICAgIGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQkJCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCQkJCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJCQkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CisJCQkJfSBlbHNlIGlmKHNrYi0+cHJvdG9jb2wgPT0KKwkJCQkgICAgaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJCQkJc2tiX3B1c2goc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCQkJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gUFBQT0VfU0VTX0hMRU47CiAJCQkJfQogCQkJCU5GX0hPT0tfVEhSRVNIKFBGX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsCiAJCQkJCSAgICAgICBza2IsIHNrYi0+ZGV2LCBOVUxMLApAQCAtMzQ0LDcgKzM4MiwxMCBAQAogCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCXNrYl9wdXNoKHNrYiwgVkxBTl9ITEVOKTsKLQkJc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFZMQU5fSExFTjsKKwl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJc2tiX3B1c2goc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gUFBQT0VfU0VTX0hMRU47CiAJfQogCU5GX0hPT0tfVEhSRVNIKFBGX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCiAJCSAgICAgICBicl9oYW5kbGVfZnJhbWVfZmluaXNoLCAxKTsKQEAgLTM3Miw5ICs0MTMsMTAgQEAKIC8qIFdlIG9ubHkgY2hlY2sgdGhlIGxlbmd0aC4gQSBicmlkZ2Ugc2hvdWxkbid0IGRvIGFueSBob3AtYnktaG9wIHN0dWZmIGFueXdheSAqLwogc3RhdGljIGludCBjaGVja19oYmhfbGVuKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgY2hhciAqcmF3ID0gKHU4ICopIChza2ItPm5oLmlwdjZoICsgMSk7CisJdW5zaWduZWQgY2hhciAqcmF3ID0gKHU4ICopKGlwdjZfaGRyKHNrYikgKyAxKTsKIAl1MzIgcGt0X2xlbjsKLQlpbnQgb2ZmID0gcmF3IC0gc2tiLT5uaC5yYXc7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpbnQgb2ZmID0gcmF3IC0gbmg7CiAJaW50IGxlbiA9IChyYXdbMV0gKyAxKSA8PCAzOwogCiAJaWYgKChyYXcgKyBsZW4pIC0gc2tiLT5kYXRhID4gc2tiX2hlYWRsZW4oc2tiKSkKQEAgLTM4NCw5ICs0MjYsOSBAQAogCWxlbiAtPSAyOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJaW50IG9wdGxlbiA9IHNrYi0+bmgucmF3W29mZiArIDFdICsgMjsKKwkJaW50IG9wdGxlbiA9IG5oW29mZiArIDFdICsgMjsKIAotCQlzd2l0Y2ggKHNrYi0+bmgucmF3W29mZl0pIHsKKwkJc3dpdGNoIChuaFtvZmZdKSB7CiAJCWNhc2UgSVBWNl9UTFZfUEFEMDoKIAkJCW9wdGxlbiA9IDE7CiAJCQlicmVhazsKQEAgLTM5NSwxNyArNDM3LDE4IEBACiAJCQlicmVhazsKIAogCQljYXNlIElQVjZfVExWX0pVTUJPOgotCQkJaWYgKHNrYi0+bmgucmF3W29mZiArIDFdICE9IDQgfHwgKG9mZiAmIDMpICE9IDIpCisJCQlpZiAobmhbb2ZmICsgMV0gIT0gNCB8fCAob2ZmICYgMykgIT0gMikKIAkJCQlnb3RvIGJhZDsKLQkJCXBrdF9sZW4gPSBudG9obCgqKF9fYmUzMiAqKSAoc2tiLT5uaC5yYXcgKyBvZmYgKyAyKSk7CisJCQlwa3RfbGVuID0gbnRvaGwoKihfX2JlMzIgKikgKG5oICsgb2ZmICsgMikpOwogCQkJaWYgKHBrdF9sZW4gPD0gSVBWNl9NQVhQTEVOIHx8Ci0JCQkgICAgc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pCisJCQkgICAgaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pCiAJCQkJZ290byBiYWQ7CiAJCQlpZiAocGt0X2xlbiA+IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkKIAkJCQlnb3RvIGJhZDsKIAkJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLAogCQkJCQkgICAgcGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQogCQkJCWdvdG8gYmFkOworCQkJbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKG9wdGxlbiA+IGxlbikKQEAgLTQzOSw3ICs0ODIsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCi0JaGRyID0gc2tiLT5uaC5pcHY2aDsKKwloZHIgPSBpcHY2X2hkcihza2IpOwogCiAJaWYgKGhkci0+dmVyc2lvbiAhPSA2KQogCQlnb3RvIGluaGRyX2Vycm9yOwpAQCAtNDg1LDcgKzUyOCw4IEBACiAJX191MzIgbGVuOwogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpIHx8IElTX1ZMQU5fSVBWNihza2IpKSB7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikgfHwgSVNfVkxBTl9JUFY2KHNrYikgfHwKKwkgICAgSVNfUFBQT0VfSVBWNihza2IpKSB7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCQlpZiAoIWJybmZfY2FsbF9pcDZ0YWJsZXMpCiAJCQlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtNDk1LDcgKzUzOSwxMCBAQAogCiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQkJc2tiX3B1bGxfcmNzdW0oc2tiLCBWTEFOX0hMRU4pOwotCQkJc2tiLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCQkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBWTEFOX0hMRU47CisJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQkJc2tiX3B1bGxfcmNzdW0oc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFBQUE9FX1NFU19ITEVOOwogCQl9CiAJCXJldHVybiBicl9uZl9wcmVfcm91dGluZ19pcHY2KGhvb2ssIHNrYiwgaW4sIG91dCwgb2tmbik7CiAJfQpAQCAtNTA0LDcgKzU1MSw4IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAjZW5kaWYKIAotCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSAmJiAhSVNfVkxBTl9JUChza2IpKQorCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSAmJiAhSVNfVkxBTl9JUChza2IpICYmCisJICAgICFJU19QUFBPRV9JUChza2IpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soKnBza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQpAQCAtNTEyLDIwICs1NjAsMjMgQEAKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVsbF9yY3N1bShza2IsIFZMQU5fSExFTik7Ci0JCXNrYi0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBWTEFOX0hMRU47CisJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFBQUE9FX1NFU19ITEVOOwogCX0KIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJZ290byBpbmhkcl9lcnJvcjsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCiAJCWdvdG8gaW5oZHJfZXJyb3I7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCA0ICogaXBoLT5paGwpKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWYgKGlwX2Zhc3RfY3N1bSgoX191OCAqKSBpcGgsIGlwaC0+aWhsKSAhPSAwKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCkBAIC01OTMsNyArNjQ0LDEwIEBACiAJfQogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CisJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCXNrYl9wdXNoKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFBQUE9FX1NFU19ITEVOOwogCX0KIAlORl9IT09LX1RIUkVTSChQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgaW4sCiAJCSAgICAgICBza2ItPmRldiwgYnJfZm9yd2FyZF9maW5pc2gsIDEpOwpAQCAtNjIyLDE0ICs2NzYsMTggQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUChza2IpKQorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSB8fCBJU19WTEFOX0lQKHNrYikgfHwKKwkgICAgSVNfUFBQT0VfSVAoc2tiKSkKIAkJcGYgPSBQRl9JTkVUOwogCWVsc2UKIAkJcGYgPSBQRl9JTkVUNjsKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVsbCgqcHNrYiwgVkxBTl9ITEVOKTsKLQkJKCpwc2tiKS0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJKCpwc2tiKS0+bmV0d29ya19oZWFkZXIgKz0gVkxBTl9ITEVOOworCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQlza2JfcHVsbCgqcHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQkoKnBza2IpLT5uZXR3b3JrX2hlYWRlciArPSBQUFBPRV9TRVNfSExFTjsKIAl9CiAKIAluZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKQEAgLTY2NSwxMyArNzIzLDEzIEBACiAJCWlmICghSVNfVkxBTl9BUlAoc2tiKSkKIAkJCXJldHVybiBORl9BQ0NFUFQ7CiAJCXNrYl9wdWxsKCpwc2tiLCBWTEFOX0hMRU4pOwotCQkoKnBza2IpLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCQkoKnBza2IpLT5uZXR3b3JrX2hlYWRlciArPSBWTEFOX0hMRU47CiAJfQogCi0JaWYgKHNrYi0+bmguYXJwaC0+YXJfcGxuICE9IDQpIHsKKwlpZiAoYXJwX2hkcihza2IpLT5hcl9wbG4gIT0gNCkgewogCQlpZiAoSVNfVkxBTl9BUlAoc2tiKSkgewogCQkJc2tiX3B1c2goKnBza2IsIFZMQU5fSExFTik7Ci0JCQkoKnBza2IpLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCQkJKCpwc2tiKS0+bmV0d29ya19oZWFkZXIgLT0gVkxBTl9ITEVOOwogCQl9CiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQpAQCAtNzIxLDcgKzc3OSwxMCBAQAogCX0KIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47CisJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gVkxBTl9ITEVOOworCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQlza2JfcHVzaChza2IsIFBQUE9FX1NFU19ITEVOKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBQUFBPRV9TRVNfSExFTjsKIAl9CiAKIAlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgc2tiLCByZWFsaW5kZXYsIHNrYi0+ZGV2LApAQCAtNzUzLDcgKzgxNCw4IEBACiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogCS8qIEJlIHZlcnkgcGFyYW5vaWQuIFRoaXMgcHJvYmFibHkgd29uJ3QgaGFwcGVuIGFueW1vcmUsIGJ1dCBsZXQncwogCSAqIGtlZXAgdGhlIGNoZWNrIGp1c3QgdG8gYmUgc3VyZS4uLiAqLwotCWlmIChza2ItPm1hYy5yYXcgPCBza2ItPmhlYWQgfHwgc2tiLT5tYWMucmF3ICsgRVRIX0hMRU4gPiBza2ItPmRhdGEpIHsKKwlpZiAoc2tiX21hY19oZWFkZXIoc2tiKSA8IHNrYi0+aGVhZCB8fAorCSAgICBza2JfbWFjX2hlYWRlcihza2IpICsgRVRIX0hMRU4gPiBza2ItPmRhdGEpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiYnJfbmV0ZmlsdGVyOiBBcmdoISEgYnJfbmZfcG9zdF9yb3V0aW5nOiAiCiAJCSAgICAgICAiYmFkIG1hYy5yYXcgcG9pbnRlci5cbiIpOwogCQlnb3RvIHByaW50X2Vycm9yOwpAQCAtNzY2LDcgKzgyOCw4IEBACiAJaWYgKCFyZWFsb3V0ZGV2KQogCQlyZXR1cm4gTkZfRFJPUDsKIAotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSB8fCBJU19WTEFOX0lQKHNrYikpCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApIHx8IElTX1ZMQU5fSVAoc2tiKSB8fAorCSAgICBJU19QUFBPRV9JUChza2IpKQogCQlwZiA9IFBGX0lORVQ7CiAJZWxzZQogCQlwZiA9IFBGX0lORVQ2OwpAQCAtNzg3LDcgKzg1MCwxMCBAQAogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCXNrYl9wdWxsKHNrYiwgVkxBTl9ITEVOKTsKLQkJc2tiLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFZMQU5fSExFTjsKKwl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJc2tiX3B1bGwoc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCXNrYi0+bmV0d29ya19oZWFkZXIgKz0gUFBQT0VfU0VTX0hMRU47CiAJfQogCiAJbmZfYnJpZGdlX3NhdmVfaGVhZGVyKHNrYik7CkBAIC04MDgsNyArODc0LDcgQEAKIAkJaWYgKHJlYWxvdXRkZXYpCiAJCQlwcmludGsoIlslc10iLCByZWFsb3V0ZGV2LT5uYW1lKTsKIAl9Ci0JcHJpbnRrKCIgaGVhZDolcCwgcmF3OiVwLCBkYXRhOiVwXG4iLCBza2ItPmhlYWQsIHNrYi0+bWFjLnJhdywKKwlwcmludGsoIiBoZWFkOiVwLCByYXc6JXAsIGRhdGE6JXBcbiIsIHNrYi0+aGVhZCwgc2tiX21hY19oZWFkZXIoc2tiKSwKIAkgICAgICAgc2tiLT5kYXRhKTsKIAlkdW1wX3N0YWNrKCk7CiAJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTkyNSw2ICs5OTEsMTQgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZicm5mX3N5c2N0bF9jYWxsX3RhYmxlcywKIAl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0JSSURHRV9ORl9GSUxURVJfUFBQT0VfVEFHR0VELAorCQkucHJvY25hbWUJPSAiYnJpZGdlLW5mLWZpbHRlci1wcHBvZS10YWdnZWQiLAorCQkuZGF0YQkJPSAmYnJuZl9maWx0ZXJfcHBwb2VfdGFnZ2VkLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmJybmZfc3lzY3RsX2NhbGxfdGFibGVzLAorCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKaW5kZXggN2Q2OGIyNC4uMzVmYWNjMCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKQEAgLTExLDggKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgogCiBzdGF0aWMgaW5saW5lIHNpemVfdCBicl9ubG1zZ19zaXplKHZvaWQpCkBAIC0xMTAsNyArMTA5LDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpZHg7CiAKLQlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWZvciAoZGV2ID0gZGV2X2Jhc2UsIGlkeCA9IDA7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CiAJCS8qIG5vdCBhIGJyaWRnZSBwb3J0ICovCiAJCWlmIChkZXYtPmJyX3BvcnQgPT0gTlVMTCB8fCBpZHggPCBjYi0+YXJnc1swXSkKQEAgLTEyMyw3ICsxMjEsNiBAQAogc2tpcDoKIAkJKytpZHg7CiAJfQotCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAogCWNiLT5hcmdzWzBdID0gaWR4OwogCkBAIC0xNjYsNyArMTYzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBpZiBrZXJuZWwgU1RQIGlzIHJ1bm5pbmcsIGRvbid0IGFsbG93IGNoYW5nZXMgKi8KLQlpZiAocC0+YnItPnN0cF9lbmFibGVkKQorCWlmIChwLT5ici0+c3RwX2VuYWJsZWQgPT0gQlJfS0VSTkVMX1NUUCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8CkBAIC0xNzksMTggKzE3NiwxOSBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgYnJpZGdlX3J0bmV0bGlua190YWJsZVtSVE1fTlJfTVNHVFlQRVNdID0gewotCVtSVE1fR0VUTElOSyAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGJyX2R1bXBfaWZpbmZvLCB9LAotCVtSVE1fU0VUTElOSyAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICAgICA9IGJyX3J0bV9zZXRsaW5rLCB9LAotfTsKLQotdm9pZCBfX2luaXQgYnJfbmV0bGlua19pbml0KHZvaWQpCitpbnQgX19pbml0IGJyX25ldGxpbmtfaW5pdCh2b2lkKQogewotCXJ0bmV0bGlua19saW5rc1tQRl9CUklER0VdID0gYnJpZGdlX3J0bmV0bGlua190YWJsZTsKKwlpZiAoX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX0dFVExJTkssIE5VTEwsIGJyX2R1bXBfaWZpbmZvKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJLyogT25seSB0aGUgZmlyc3QgY2FsbCB0byBfX3J0bmxfcmVnaXN0ZXIgY2FuIGZhaWwgKi8KKwlfX3J0bmxfcmVnaXN0ZXIoUEZfQlJJREdFLCBSVE1fU0VUTElOSywgYnJfcnRtX3NldGxpbmssIE5VTEwpOworCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgX19leGl0IGJyX25ldGxpbmtfZmluaSh2b2lkKQogewotCXJ0bmV0bGlua19saW5rc1tQRl9CUklER0VdID0gTlVMTDsKKwlydG5sX3VucmVnaXN0ZXJfYWxsKFBGX0JSSURHRSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMgYi9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCmluZGV4IDM3MzU3ZWQuLmM4NDUxZDMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMKKysrIGIvbmV0L2JyaWRnZS9icl9ub3RpZnkuYwpAQCAtNTAsNyArNTAsNiBAQAogCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CiAJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwogCQlicl9mZGJfY2hhbmdlYWRkcihwLCBkZXYtPmRldl9hZGRyKTsKLQkJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CiAJCWJyX3N0cF9yZWNhbGN1bGF0ZV9icmlkZ2VfaWQoYnIpOwogCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOwogCQlicmVhazsKQEAgLTc0LDEwICs3MywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX1VQOgotCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSAmJiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpICYmIChici0+ZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwogCQkJYnJfc3RwX2VuYWJsZV9wb3J0KHApOwotCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CkBAIC04NSw1ICs4NSwxMCBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBFdmVudHMgdGhhdCBtYXkgY2F1c2Ugc3Bhbm5pbmcgdHJlZSB0byByZWZyZXNoICovCisJaWYgKGV2ZW50ID09IE5FVERFVl9DSEFOR0VBRERSIHx8IGV2ZW50ID09IE5FVERFVl9VUCB8fAorCSAgICBldmVudCA9PSBORVRERVZfQ0hBTkdFIHx8IGV2ZW50ID09IE5FVERFVl9ET1dOKQorCQlicl9pZmluZm9fbm90aWZ5KFJUTV9ORVdMSU5LLCBwKTsKKwogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKaW5kZXggY2MzZjFjOS4uMjFiZjNhOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKQEAgLTI2LDcgKzI2LDEwIEBACiAjZGVmaW5lIEJSX1BPUlRfQklUUwkxMAogI2RlZmluZSBCUl9NQVhfUE9SVFMJKDE8PEJSX1BPUlRfQklUUykKIAotI2RlZmluZSBCUl9WRVJTSU9OCSIyLjIiCisjZGVmaW5lIEJSX1ZFUlNJT04JIjIuMyIKKworLyogUGF0aCB0byB1c2VybW9kZSBzcGFubmluZyB0cmVlIHByb2dyYW0gKi8KKyNkZWZpbmUgQlJfU1RQX1BST0cJIi9zYmluL2JyaWRnZS1zdHAiCiAKIHR5cGVkZWYgc3RydWN0IGJyaWRnZV9pZCBicmlkZ2VfaWQ7CiB0eXBlZGVmIHN0cnVjdCBtYWNfYWRkciBtYWNfYWRkcjsKQEAgLTEwNyw3ICsxMTAsMTMgQEAKIAogCXU4CQkJCWdyb3VwX2FkZHJbRVRIX0FMRU5dOwogCXUxNgkJCQlyb290X3BvcnQ7Ci0JdW5zaWduZWQgY2hhcgkJCXN0cF9lbmFibGVkOworCisJZW51bSB7CisJCUJSX05PX1NUUCwgCQkvKiBubyBzcGFubmluZyB0cmVlICovCisJCUJSX0tFUk5FTF9TVFAsCQkvKiBvbGQgU1RQIGluIGtlcm5lbCAqLworCQlCUl9VU0VSX1NUUCwJCS8qIG5ldyBSU1RQIGluIHVzZXJzcGFjZSAqLworCX0gc3RwX2VuYWJsZWQ7CisKIAl1bnNpZ25lZCBjaGFyCQkJdG9wb2xvZ3lfY2hhbmdlOwogCXVuc2lnbmVkIGNoYXIJCQl0b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQ7CiAKQEAgLTEyNywxNCArMTM2LDE0IEBACiAJcmV0dXJuICFtZW1jbXAoJmJyLT5icmlkZ2VfaWQsICZici0+ZGVzaWduYXRlZF9yb290LCA4KTsKIH0KIAotCiAvKiBicl9kZXZpY2UuYyAqLwogZXh0ZXJuIHZvaWQgYnJfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBicl9kZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogLyogYnJfZmRiLmMgKi8KLWV4dGVybiB2b2lkIGJyX2ZkYl9pbml0KHZvaWQpOworZXh0ZXJuIGludCBicl9mZGJfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGJyX2ZkYl9maW5pKHZvaWQpOworZXh0ZXJuIHZvaWQgYnJfZmRiX2ZsdXNoKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CiBleHRlcm4gdm9pZCBicl9mZGJfY2hhbmdlYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAogCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3YWRkcik7CiBleHRlcm4gdm9pZCBicl9mZGJfY2xlYW51cCh1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC0xODIsNyArMTkxLDggQEAKIAogLyogYnJfaW5wdXQuYyAqLwogZXh0ZXJuIGludCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIGludCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogCiAvKiBicl9pb2N0bC5jICovCiBleHRlcm4gaW50IGJyX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKQEAgLTIwNyw2ICsyMTcsNyBAQAogLyogYnJfc3RwX2lmLmMgKi8KIGV4dGVybiB2b2lkIGJyX3N0cF9lbmFibGVfYnJpZGdlKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CiBleHRlcm4gdm9pZCBicl9zdHBfZGlzYWJsZV9icmlkZ2Uoc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9zZXRfZW5hYmxlZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGV4dGVybiB2b2lkIGJyX3N0cF9lbmFibGVfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKIGV4dGVybiB2b2lkIGJyX3N0cF9kaXNhYmxlX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CiBleHRlcm4gdm9pZCBicl9zdHBfcmVjYWxjdWxhdGVfYnJpZGdlX2lkKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CkBAIC0yMzUsNyArMjQ2LDcgQEAKIAogCiAvKiBicl9uZXRsaW5rLmMgKi8KLWV4dGVybiB2b2lkIGJyX25ldGxpbmtfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnJfbmV0bGlua19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgYnJfbmV0bGlua19maW5pKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnJfaWZpbmZvX25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQpOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cC5jIGIvbmV0L2JyaWRnZS9icl9zdHAuYwppbmRleCBmOWZmNGQ1Li5lYmIwODYxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cC5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwLmMKQEAgLTM3MCwxMSArMzcwLDExIEBACiBzdGF0aWMgdm9pZCBicl9tYWtlX2ZvcndhcmRpbmcoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKIHsKIAlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfQkxPQ0tJTkcpIHsKLQkJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCkgeworCQlpZiAocC0+YnItPnN0cF9lbmFibGVkID09IEJSX0tFUk5FTF9TVFApCiAJCQlwLT5zdGF0ZSA9IEJSX1NUQVRFX0xJU1RFTklORzsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcC0+c3RhdGUgPSBCUl9TVEFURV9MRUFSTklORzsKLQkJfQorCiAJCWJyX2xvZ19zdGF0ZShwKTsKIAkJbW9kX3RpbWVyKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgcC0+YnItPmZvcndhcmRfZGVsYXkpOwl9CiB9CkBAIC0zODQsNiArMzg0LDEwIEBACiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKIAorCS8qIERvbid0IGNoYW5nZSBwb3J0IHN0YXRlcyBpZiB1c2Vyc3BhY2UgaXMgaGFuZGxpbmcgU1RQICovCisJaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9VU0VSX1NUUCkKKwkJcmV0dXJuOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgewogCQlpZiAocC0+c3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQpIHsKIAkJCWlmIChwLT5wb3J0X25vID09IGJyLT5yb290X3BvcnQpIHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYwppbmRleCBiOWZiMGRjLi42MDExMmJjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKKysrIGIvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCkBAIC0zMyw5ICszMyw2IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCWlmICghcC0+YnItPnN0cF9lbmFibGVkKQotCQlyZXR1cm47Ci0KIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCtMTENfUkVTRVJWRSk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKQEAgLTc1LDYgKzcyLDkgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlszNV07CiAKKwlpZiAocC0+YnItPnN0cF9lbmFibGVkICE9IEJSX0tFUk5FTF9TVFApCisJCXJldHVybjsKKwogCWJ1ZlswXSA9IDA7CiAJYnVmWzFdID0gMDsKIAlidWZbMl0gPSAwOwpAQCAtMTE3LDYgKzExNyw5IEBACiB7CiAJdW5zaWduZWQgY2hhciBidWZbNF07CiAKKwlpZiAocC0+YnItPnN0cF9lbmFibGVkICE9IEJSX0tFUk5FTF9TVFApCisJCXJldHVybjsKKwogCWJ1ZlswXSA9IDA7CiAJYnVmWzFdID0gMDsKIAlidWZbMl0gPSAwOwpAQCAtMTU3LDkgKzE2MCwxMyBAQAogCWJyID0gcC0+YnI7CiAJc3Bpbl9sb2NrKCZici0+bG9jayk7CiAKLQlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQKLQkgICAgfHwgIWJyLT5zdHBfZW5hYmxlZAotCSAgICB8fCAhKGJyLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwlpZiAoYnItPnN0cF9lbmFibGVkICE9IEJSX0tFUk5FTF9TVFApCisJCWdvdG8gb3V0OworCisJaWYgKCEoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlnb3RvIG91dDsKKworCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9ESVNBQkxFRCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGRlc3QsIGJyLT5ncm91cF9hZGRyKSAhPSAwKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKaW5kZXggYTI4NTg5Ny4uM2UyNDZiMyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCkBAIC04Nyw3ICs4Nyw2IEBACiB2b2lkIGJyX3N0cF9lbmFibGVfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQogewogCWJyX2luaXRfcG9ydChwKTsKLQlicl9pZmluZm9fbm90aWZ5KFJUTV9ORVdMSU5LLCBwKTsKIAlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihwLT5icik7CiB9CiAKQEAgLTEwMSw4ICsxMDAsNiBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBwb3J0ICVpKCVzKSBlbnRlcmluZyAlcyBzdGF0ZVxuIiwKIAkgICAgICAgYnItPmRldi0+bmFtZSwgcC0+cG9ydF9ubywgcC0+ZGV2LT5uYW1lLCAiZGlzYWJsZWQiKTsKIAotCWJyX2lmaW5mb19ub3RpZnkoUlRNX0RFTExJTkssIHApOwotCiAJd2Fzcm9vdCA9IGJyX2lzX3Jvb3RfYnJpZGdlKGJyKTsKIAlicl9iZWNvbWVfZGVzaWduYXRlZF9wb3J0KHApOwogCXAtPnN0YXRlID0gQlJfU1RBVEVfRElTQUJMRUQ7CkBAIC0xMjMsNiArMTIwLDYyIEBACiAJCWJyX2JlY29tZV9yb290X2JyaWRnZShicik7CiB9CiAKK3N0YXRpYyB2b2lkIGJyX3N0cF9zdGFydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJaW50IHI7CisJY2hhciAqYXJndltdID0geyBCUl9TVFBfUFJPRywgYnItPmRldi0+bmFtZSwgInN0YXJ0IiwgTlVMTCB9OworCWNoYXIgKmVudnBbXSA9IHsgTlVMTCB9OworCisJciA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoQlJfU1RQX1BST0csIGFyZ3YsIGVudnAsIDEpOworCWlmIChyID09IDApIHsKKwkJYnItPnN0cF9lbmFibGVkID0gQlJfVVNFUl9TVFA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2Vyc3BhY2UgU1RQIHN0YXJ0ZWRcbiIsIGJyLT5kZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCWJyLT5zdHBfZW5hYmxlZCA9IEJSX0tFUk5FTF9TVFA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdGFydGluZyB1c2Vyc3BhY2UgU1RQIGZhaWxlZCwgIgorCQkJCSJzdGFyaW5nIGtlcm5lbCBTVFBcbiIsIGJyLT5kZXYtPm5hbWUpOworCisJCS8qIFRvIHN0YXJ0IHRpbWVycyBvbiBhbnkgcG9ydHMgbGVmdCBpbiBibG9ja2luZyAqLworCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwkJYnJfcG9ydF9zdGF0ZV9zZWxlY3Rpb24oYnIpOworCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgYnJfc3RwX3N0b3Aoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWludCByOworCWNoYXIgKmFyZ3ZbXSA9IHsgQlJfU1RQX1BST0csIGJyLT5kZXYtPm5hbWUsICJzdG9wIiwgTlVMTCB9OworCWNoYXIgKmVudnBbXSA9IHsgTlVMTCB9OworCisJaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9VU0VSX1NUUCkgeworCQlyID0gY2FsbF91c2VybW9kZWhlbHBlcihCUl9TVFBfUFJPRywgYXJndiwgZW52cCwgMSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2Vyc3BhY2UgU1RQIHN0b3BwZWQsIHJldHVybiBjb2RlICVkXG4iLAorCQkJYnItPmRldi0+bmFtZSwgcik7CisKKworCQkvKiBUbyBzdGFydCB0aW1lcnMgb24gYW55IHBvcnRzIGxlZnQgaW4gYmxvY2tpbmcgKi8KKwkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKGJyKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwl9CisKKwlici0+c3RwX2VuYWJsZWQgPSBCUl9OT19TVFA7Cit9CisKK3ZvaWQgYnJfc3RwX3NldF9lbmFibGVkKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJQVNTRVJUX1JUTkwoKTsKKworCWlmICh2YWwpIHsKKwkJaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9OT19TVFApCisJCQlicl9zdHBfc3RhcnQoYnIpOworCX0gZWxzZSB7CisJCWlmIChici0+c3RwX2VuYWJsZWQgIT0gQlJfTk9fU1RQKQorCQkJYnJfc3RwX3N0b3AoYnIpOworCX0KK30KKwogLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCiB2b2lkIGJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwppbmRleCAwMWEyMmFkLi4zM2M2YzRhIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCkBAIC0xNDksNyArMTQ5LDExIEBACiAKIHN0YXRpYyB2b2lkIHNldF9zdHBfc3RhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKLQlici0+c3RwX2VuYWJsZWQgPSB2YWw7CisJcnRubF9sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwlicl9zdHBfc2V0X2VuYWJsZWQoYnIsIHZhbCk7CisJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJcnRubF91bmxvY2soKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfc3RwX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmQsCkBAIC0zMDksNiArMzEzLDE5IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoZ3JvdXBfYWRkciwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIHNob3dfZ3JvdXBfYWRkciwgc3RvcmVfZ3JvdXBfYWRkcik7CiAKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ZsdXNoKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZCk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlicl9mZGJfZmx1c2goYnIpOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmx1c2gsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2ZsdXNoKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJyaWRnZV9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9mb3J3YXJkX2RlbGF5LmF0dHIsCkBAIC0zMjgsNiArMzQ1LDcgQEAKIAkmZGV2X2F0dHJfdG9wb2xvZ3lfY2hhbmdlX3RpbWVyLmF0dHIsCiAJJmRldl9hdHRyX2djX3RpbWVyLmF0dHIsCiAJJmRldl9hdHRyX2dyb3VwX2FkZHIuYXR0ciwKKwkmZGV2X2F0dHJfZmx1c2guYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKaW5kZXggMGJjMmFlZi4uMmRhMjI5MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwpAQCAtMTM3LDYgKzEzNywxMyBAQAogfQogc3RhdGljIEJSUE9SVF9BVFRSKGhvbGRfdGltZXIsIFNfSVJVR08sIHNob3dfaG9sZF90aW1lciwgTlVMTCk7CiAKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ZsdXNoKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlicl9mZGJfZGVsZXRlX2J5X3BvcnQocC0+YnIsIHAsIDApOyAvLyBEb24ndCBkZWxldGUgbG9jYWwgZW50cnkKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBCUlBPUlRfQVRUUihmbHVzaCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfZmx1c2gpOworCiBzdGF0aWMgc3RydWN0IGJycG9ydF9hdHRyaWJ1dGUgKmJycG9ydF9hdHRyc1tdID0gewogCSZicnBvcnRfYXR0cl9wYXRoX2Nvc3QsCiAJJmJycG9ydF9hdHRyX3ByaW9yaXR5LApAQCAtMTUyLDYgKzE1OSw3IEBACiAJJmJycG9ydF9hdHRyX21lc3NhZ2VfYWdlX3RpbWVyLAogCSZicnBvcnRfYXR0cl9mb3J3YXJkX2RlbGF5X3RpbWVyLAogCSZicnBvcnRfYXR0cl9ob2xkX3RpbWVyLAorCSZicnBvcnRfYXR0cl9mbHVzaCwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKaW5kZXggOWM1OTk4MC4uMWE0Njk1MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnAuYwpAQCAtMzUsNDAgKzM1LDM2IEBACiAJCXJldHVybiBFQlRfTk9NQVRDSDsKIAogCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVApKSB7Ci0JCV9fYmUzMiBfYWRkciwgKmFwOworCQlfX2JlMzIgc2FkZHIsIGRhZGRyLCAqc2FwLCAqZGFwOwogCi0JCS8qIElQdjQgYWRkcmVzc2VzIGFyZSBhbHdheXMgNCBieXRlcyAqLwotCQlpZiAoYWgtPmFyX3BsbiAhPSBzaXplb2YoX19iZTMyKSkKKwkJaWYgKGFoLT5hcl9wbG4gIT0gc2l6ZW9mKF9fYmUzMikgfHwgYWgtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkpCiAJCQlyZXR1cm4gRUJUX05PTUFUQ0g7Ci0JCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfSVApIHsKLQkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKLQkJCQkJCWFoLT5hcl9obG4sIHNpemVvZihfYWRkciksCi0JCQkJCQkmX2FkZHIpOwotCQkJaWYgKGFwID09IE5VTEwpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOwotCQkJaWYgKEZXSU5WKGluZm8tPnNhZGRyICE9ICgqYXAgJiBpbmZvLT5zbXNrKSwKLQkJCSAgIEVCVF9BUlBfU1JDX0lQKSkKLQkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7Ci0JCX0KLQotCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfRFNUX0lQKSB7Ci0JCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCi0JCQkJCQkyKmFoLT5hcl9obG4rc2l6ZW9mKF9fYmUzMiksCi0JCQkJCQlzaXplb2YoX2FkZHIpLCAmX2FkZHIpOwotCQkJaWYgKGFwID09IE5VTEwpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOwotCQkJaWYgKEZXSU5WKGluZm8tPmRhZGRyICE9ICgqYXAgJiBpbmZvLT5kbXNrKSwKLQkJCSAgIEVCVF9BUlBfRFNUX0lQKSkKLQkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7Ci0JCX0KKwkJc2FwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKKwkJCQkJYWgtPmFyX2hsbiwgc2l6ZW9mKHNhZGRyKSwKKwkJCQkJJnNhZGRyKTsKKwkJaWYgKHNhcCA9PSBOVUxMKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlkYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKworCQkJCQkyKmFoLT5hcl9obG4rc2l6ZW9mKHNhZGRyKSwKKwkJCQkJc2l6ZW9mKGRhZGRyKSwgJmRhZGRyKTsKKwkJaWYgKGRhcCA9PSBOVUxMKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfU1JDX0lQICYmCisJCSAgICBGV0lOVihpbmZvLT5zYWRkciAhPSAoKnNhcCAmIGluZm8tPnNtc2spLCBFQlRfQVJQX1NSQ19JUCkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfSVAgJiYKKwkJICAgIEZXSU5WKGluZm8tPmRhZGRyICE9ICgqZGFwICYgaW5mby0+ZG1zayksIEVCVF9BUlBfRFNUX0lQKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX0dSQVQgJiYKKwkJICAgIEZXSU5WKCpkYXAgIT0gKnNhcCwgRUJUX0FSUF9HUkFUKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKIAl9CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIChFQlRfQVJQX1NSQ19NQUMgfCBFQlRfQVJQX0RTVF9NQUMpKSB7CiAJCXVuc2lnbmVkIGNoYXIgX21hY1tFVEhfQUxFTl0sICptcDsKIAkJdWludDhfdCB2ZXJkaWN0LCBpOwogCi0JCS8qIE1BQyBhZGRyZXNzZXMgYXJlIDYgYnl0ZXMgKi8KLQkJaWYgKGFoLT5hcl9obG4gIT0gRVRIX0FMRU4pCisJCWlmIChhaC0+YXJfaGxuICE9IEVUSF9BTEVOIHx8IGFoLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSkKIAkJCXJldHVybiBFQlRfTk9NQVRDSDsKIAkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX1NSQ19NQUMpIHsKIAkJCW1wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCmluZGV4IDQ1NzEyYWUuLjAzMWJmYTQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKQEAgLTE5NiwxNCArMTk2LDEwIEBACiAJcmV0ID0gZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoJmxvZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JaWYgKG5mX2xvZ19yZWdpc3RlcihQRl9CUklER0UsICZlYnRfbG9nX2xvZ2dlcikgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVidF9sb2c6IG5vdCBsb2dnaW5nIHZpYSBzeXN0ZW0gY29uc29sZSAiCi0JCSAgICAgICAic2luY2Ugc29tZWJvZHkgZWxzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIFBGX0lORVRcbiIpOwotCQkvKiB3ZSBjYW5ub3QgbWFrZSBtb2R1bGUgbG9hZCBmYWlsIGhlcmUsIHNpbmNlIG90aGVyd2lzZQotCQkgKiBlYnRhYmxlcyB1c2Vyc3BhY2Ugd291bGQgYWJvcnQgKi8KLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXQgPSBuZl9sb2dfcmVnaXN0ZXIoUEZfQlJJREdFLCAmZWJ0X2xvZ19sb2dnZXIpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUVYSVNUKQorCQllYnRfdW5yZWdpc3Rlcl93YXRjaGVyKCZsb2cpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfbG9nX2Zpbmkodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCmluZGV4IDhlMTVjYzQuLjk0MTFkYjYyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogCXVuc2lnbmVkIGludCBncm91cCA9IHVsb2dpbmZvLT5ubGdyb3VwOwogCWVidF91bG9nX2J1ZmZfdCAqdWIgPSAmdWxvZ19idWZmZXJzW2dyb3VwXTsKIAlzcGlubG9ja190ICpsb2NrID0gJnViLT5sb2NrOworCWt0aW1lX3Qga3Q7CiAKIAlpZiAoKHVsb2dpbmZvLT5jcHJhbmdlID09IDApIHx8CiAJICAgICh1bG9naW5mby0+Y3ByYW5nZSA+IHNrYi0+bGVuICsgRVRIX0hMRU4pKQpAQCAtMTY0LDkgKzE2NSwxMCBAQAogCiAJLyogRmlsbCBpbiB0aGUgdWxvZyBkYXRhICovCiAJcG0tPnZlcnNpb24gPSBFQlRfVUxPR19WRVJTSU9OOwotCWRvX2dldHRpbWVvZmRheSgmcG0tPnN0YW1wKTsKKwlrdCA9IGt0aW1lX2dldF9yZWFsKCk7CisJcG0tPnN0YW1wID0ga3RpbWVfdG9fdGltZXZhbChrdCk7CiAJaWYgKHViLT5xbGVuID09IDEpCi0JCXNrYl9zZXRfdGltZXN0YW1wKHViLT5za2IsICZwbS0+c3RhbXApOworCQl1Yi0+c2tiLT50c3RhbXAgPSBrdDsKIAlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKIAlwbS0+bWFyayA9IHNrYi0+bWFyazsKIAlwbS0+aG9vayA9IGhvb2tucjsKQEAgLTI5NSwxNCArMjk3LDEyIEBACiAKIAkvKiBpbml0aWFsaXplIHVsb2dfYnVmZmVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBFQlRfVUxPR19NQVhOTEdST1VQUzsgaSsrKSB7Ci0JCWluaXRfdGltZXIoJnVsb2dfYnVmZmVyc1tpXS50aW1lcik7Ci0JCXVsb2dfYnVmZmVyc1tpXS50aW1lci5mdW5jdGlvbiA9IHVsb2dfdGltZXI7Ci0JCXVsb2dfYnVmZmVyc1tpXS50aW1lci5kYXRhID0gaTsKKwkJc2V0dXBfdGltZXIoJnVsb2dfYnVmZmVyc1tpXS50aW1lciwgdWxvZ190aW1lciwgaSk7CiAJCXNwaW5fbG9ja19pbml0KCZ1bG9nX2J1ZmZlcnNbaV0ubG9jayk7CiAJfQogCiAJZWJ0dWxvZ25sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfTkZMT0csIEVCVF9VTE9HX01BWE5MR1JPVVBTLAotCQkJCQkgIE5VTEwsIFRISVNfTU9EVUxFKTsKKwkJCQkJICBOVUxMLCBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKCFlYnR1bG9nbmwpCiAJCXJldCA9IC1FTk9NRU07CiAJZWxzZSBpZiAoKHJldCA9IGVidF9yZWdpc3Rlcl93YXRjaGVyKCZ1bG9nKSkpCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggMWYzMjg2Ni4uOWEwZjVmMiAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMzQsMTEgKzM0LDExIEBACiB7CiAJaW50IHRvdF9sZW4gPSAwOwogCi0Jd2hpbGUobmlvdiA+IDApIHsKKwl3aGlsZSAobmlvdiA+IDApIHsKIAkJY29tcGF0X3VwdHJfdCBidWY7CiAJCWNvbXBhdF9zaXplX3QgbGVuOwogCi0JCWlmKGdldF91c2VyKGxlbiwgJnVpb3YzMi0+aW92X2xlbikgfHwKKwkJaWYgKGdldF91c2VyKGxlbiwgJnVpb3YzMi0+aW92X2xlbikgfHwKIAkJICAgZ2V0X3VzZXIoYnVmLCAmdWlvdjMyLT5pb3ZfYmFzZSkpIHsKIAkJCXRvdF9sZW4gPSAtRUZBVUxUOwogCQkJYnJlYWs7CkBAIC03OCwxMiArNzgsMTIgQEAKIHsKIAlpbnQgdG90X2xlbjsKIAotCWlmKGtlcm5fbXNnLT5tc2dfbmFtZWxlbikgewotCQlpZihtb2RlPT1WRVJJRllfUkVBRCkgeworCWlmIChrZXJuX21zZy0+bXNnX25hbWVsZW4pIHsKKwkJaWYgKG1vZGU9PVZFUklGWV9SRUFEKSB7CiAJCQlpbnQgZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbChrZXJuX21zZy0+bXNnX25hbWUsCiAJCQkJCQkgICAgICBrZXJuX21zZy0+bXNnX25hbWVsZW4sCiAJCQkJCQkgICAgICBrZXJuX2FkZHJlc3MpOwotCQkJaWYoZXJyIDwgMCkKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KIAkJa2Vybl9tc2ctPm1zZ19uYW1lID0ga2Vybl9hZGRyZXNzOwpAQCAtOTMsNyArOTMsNyBAQAogCXRvdF9sZW4gPSBpb3ZfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKGtlcm5faW92LAogCQkJCQkgIChzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqKWtlcm5fbXNnLT5tc2dfaW92LAogCQkJCQkgIGtlcm5fbXNnLT5tc2dfaW92bGVuKTsKLQlpZih0b3RfbGVuID49IDApCisJaWYgKHRvdF9sZW4gPj0gMCkKIAkJa2Vybl9tc2ctPm1zZ19pb3YgPSBrZXJuX2lvdjsKIAogCXJldHVybiB0b3RfbGVuOwpAQCAtMTQ2LDggKzE0Niw4IEBACiAJa2NtbGVuID0gMDsKIAlrY21zZ19iYXNlID0ga2Ntc2cgPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZjsKIAl1Y21zZyA9IENNU0dfQ09NUEFUX0ZJUlNUSERSKGttc2cpOwotCXdoaWxlKHVjbXNnICE9IE5VTEwpIHsKLQkJaWYoZ2V0X3VzZXIodWNtbGVuLCAmdWNtc2ctPmNtc2dfbGVuKSkKKwl3aGlsZSAodWNtc2cgIT0gTlVMTCkgeworCQlpZiAoZ2V0X3VzZXIodWNtbGVuLCAmdWNtc2ctPmNtc2dfbGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCS8qIENhdGNoIGJvZ29ucy4gKi8KQEAgLTE2MCw3ICsxNjAsNyBAQAogCQlrY21sZW4gKz0gdG1wOwogCQl1Y21zZyA9IGNtc2dfY29tcGF0X254dGhkcihrbXNnLCB1Y21zZywgdWNtbGVuKTsKIAl9Ci0JaWYoa2NtbGVuID09IDApCisJaWYgKGtjbWxlbiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFRoZSBrY21sZW4gaG9sZHMgdGhlIDY0LWJpdCB2ZXJzaW9uIG9mIHRoZSBjb250cm9sIGxlbmd0aC4KQEAgLTE3Niw3ICsxNzYsNyBAQAogCS8qIE5vdyBjb3B5IHRoZW0gb3ZlciBuZWF0bHkuICovCiAJbWVtc2V0KGtjbXNnLCAwLCBrY21sZW4pOwogCXVjbXNnID0gQ01TR19DT01QQVRfRklSU1RIRFIoa21zZyk7Ci0Jd2hpbGUodWNtc2cgIT0gTlVMTCkgeworCXdoaWxlICh1Y21zZyAhPSBOVUxMKSB7CiAJCWlmIChfX2dldF91c2VyKHVjbWxlbiwgJnVjbXNnLT5jbXNnX2xlbikpCiAJCQlnb3RvIEVmYXVsdDsKIAkJaWYgKCFDTVNHX0NPTVBBVF9PSyh1Y21sZW4sIHVjbXNnLCBrbXNnKSkKQEAgLTIxNSwxMSArMjE1LDEyIEBACiBpbnQgcHV0X2Ntc2dfY29tcGF0KHN0cnVjdCBtc2doZHIgKmttc2csIGludCBsZXZlbCwgaW50IHR5cGUsIGludCBsZW4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNvbXBhdF90aW1ldmFsIGN0djsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIGN0czsKIAlzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgX191c2VyICpjbSA9IChzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgX191c2VyICopIGttc2ctPm1zZ19jb250cm9sOwogCXN0cnVjdCBjb21wYXRfY21zZ2hkciBjbWhkcjsKIAlpbnQgY21sZW47CiAKLQlpZihjbSA9PSBOVUxMIHx8IGttc2ctPm1zZ19jb250cm9sbGVuIDwgc2l6ZW9mKCpjbSkpIHsKKwlpZiAoY20gPT0gTlVMTCB8fCBrbXNnLT5tc2dfY29udHJvbGxlbiA8IHNpemVvZigqY20pKSB7CiAJCWttc2ctPm1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOwogCQlyZXR1cm4gMDsgLyogWFhYOiByZXR1cm4gZXJyb3I/IGNoZWNrIHNwZWMuICovCiAJfQpAQCAtMjI5LDExICsyMzAsMTggQEAKIAkJY3R2LnR2X3NlYyA9IHR2LT50dl9zZWM7CiAJCWN0di50dl91c2VjID0gdHYtPnR2X3VzZWM7CiAJCWRhdGEgPSAmY3R2OwotCQlsZW4gPSBzaXplb2Yoc3RydWN0IGNvbXBhdF90aW1ldmFsKTsKKwkJbGVuID0gc2l6ZW9mKGN0dik7CisJfQorCWlmIChsZXZlbCA9PSBTT0xfU09DS0VUICYmIHR5cGUgPT0gU09fVElNRVNUQU1QTlMpIHsKKwkJc3RydWN0IHRpbWVzcGVjICp0cyA9IChzdHJ1Y3QgdGltZXNwZWMgKilkYXRhOworCQljdHMudHZfc2VjID0gdHMtPnR2X3NlYzsKKwkJY3RzLnR2X25zZWMgPSB0cy0+dHZfbnNlYzsKKwkJZGF0YSA9ICZjdHM7CisJCWxlbiA9IHNpemVvZihjdHMpOwogCX0KIAogCWNtbGVuID0gQ01TR19DT01QQVRfTEVOKGxlbik7Ci0JaWYoa21zZy0+bXNnX2NvbnRyb2xsZW4gPCBjbWxlbikgeworCWlmIChrbXNnLT5tc2dfY29udHJvbGxlbiA8IGNtbGVuKSB7CiAJCWttc2ctPm1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOwogCQljbWxlbiA9IGttc2ctPm1zZ19jb250cm9sbGVuOwogCX0KQEAgLTI0MSw5ICsyNDksOSBAQAogCWNtaGRyLmNtc2dfdHlwZSA9IHR5cGU7CiAJY21oZHIuY21zZ19sZW4gPSBjbWxlbjsKIAotCWlmKGNvcHlfdG9fdXNlcihjbSwgJmNtaGRyLCBzaXplb2YgY21oZHIpKQorCWlmIChjb3B5X3RvX3VzZXIoY20sICZjbWhkciwgc2l6ZW9mIGNtaGRyKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYoY29weV90b191c2VyKENNU0dfQ09NUEFUX0RBVEEoY20pLCBkYXRhLCBjbWxlbiAtIHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpKSkKKwlpZiAoY29weV90b191c2VyKENNU0dfQ09NUEFUX0RBVEEoY20pLCBkYXRhLCBjbWxlbiAtIHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJY21sZW4gPSBDTVNHX0NPTVBBVF9TUEFDRShsZW4pOwogCWttc2ctPm1zZ19jb250cm9sICs9IGNtbGVuOwpAQCAtNTQ1LDIwICs1NTMsNDkgQEAKIAlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpjdHYgPQogCQkJKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIqKSB1c2Vyc3RhbXA7CiAJaW50IGVyciA9IC1FTk9FTlQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVApKQogCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAoc2spOwotCWlmIChzay0+c2tfc3RhbXAudHZfc2VjID09IC0xKQorCXR2ID0ga3RpbWVfdG9fdGltZXZhbChzay0+c2tfc3RhbXApOworCWlmICh0di50dl9zZWMgPT0gLTEpCiAJCXJldHVybiBlcnI7Ci0JaWYgKHNrLT5za19zdGFtcC50dl9zZWMgPT0gMCkKLQkJZG9fZ2V0dGltZW9mZGF5KCZzay0+c2tfc3RhbXApOwotCWlmIChwdXRfdXNlcihzay0+c2tfc3RhbXAudHZfc2VjLCAmY3R2LT50dl9zZWMpIHx8Ci0JCQlwdXRfdXNlcihzay0+c2tfc3RhbXAudHZfdXNlYywgJmN0di0+dHZfdXNlYykpCisJaWYgKHR2LnR2X3NlYyA9PSAwKSB7CisJCXNrLT5za19zdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXR2ID0ga3RpbWVfdG9fdGltZXZhbChzay0+c2tfc3RhbXApOworCX0KKwllcnIgPSAwOworCWlmIChwdXRfdXNlcih0di50dl9zZWMsICZjdHYtPnR2X3NlYykgfHwKKwkJCXB1dF91c2VyKHR2LnR2X3VzZWMsICZjdHYtPnR2X3VzZWMpKQogCQllcnIgPSAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXApOwogCitpbnQgY29tcGF0X3NvY2tfZ2V0X3RpbWVzdGFtcG5zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXNlcnN0YW1wKQoreworCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpjdHYgPQorCQkJKHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyKikgdXNlcnN0YW1wOworCWludCBlcnIgPSAtRU5PRU5UOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpCisJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7CisJdHMgPSBrdGltZV90b190aW1lc3BlYyhzay0+c2tfc3RhbXApOworCWlmICh0cy50dl9zZWMgPT0gLTEpCisJCXJldHVybiBlcnI7CisJaWYgKHRzLnR2X3NlYyA9PSAwKSB7CisJCXNrLT5za19zdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXRzID0ga3RpbWVfdG9fdGltZXNwZWMoc2stPnNrX3N0YW1wKTsKKwl9CisJZXJyID0gMDsKKwlpZiAocHV0X3VzZXIodHMudHZfc2VjLCAmY3R2LT50dl9zZWMpIHx8CisJCQlwdXRfdXNlcih0cy50dl9uc2VjLCAmY3R2LT50dl9uc2VjKSkKKwkJZXJyID0gLUVGQVVMVDsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChjb21wYXRfc29ja19nZXRfdGltZXN0YW1wbnMpOworCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCiB7CkBAIC02MTcsNyArNjU0LDcgQEAKIAlhMCA9IGFbMF07CiAJYTEgPSBhWzFdOwogCi0Jc3dpdGNoKGNhbGwpIHsKKwlzd2l0Y2ggKGNhbGwpIHsKIAljYXNlIFNZU19TT0NLRVQ6CiAJCXJldCA9IHN5c19zb2NrZXQoYTAsIGExLCBhWzJdKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlCmluZGV4IDczMjcyZDUuLjQ3NTE2MTMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL01ha2VmaWxlCisrKyBiL25ldC9jb3JlL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiBvYmotJChDT05GSUdfWEZSTSkgKz0gZmxvdy5vCiBvYmotJChDT05GSUdfU1lTRlMpICs9IG5ldC1zeXNmcy5vCiBvYmotJChDT05GSUdfTkVUX1BLVEdFTikgKz0gcGt0Z2VuLm8KLW9iai0kKENPTkZJR19XSVJFTEVTU19FWFQpICs9IHdpcmVsZXNzLm8KIG9iai0kKENPTkZJR19ORVRQT0xMKSArPSBuZXRwb2xsLm8KIG9iai0kKENPTkZJR19ORVRfRE1BKSArPSB1c2VyX2RtYS5vCiBvYmotJChDT05GSUdfRklCX1JVTEVTKSArPSBmaWJfcnVsZXMubwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGF0YWdyYW0uYyBiL25ldC9jb3JlL2RhdGFncmFtLmMKaW5kZXggMTg2MjEyYi4uZTFhZmE3NiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGF0YWdyYW0uYworKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC0yNDcsOCArMjQ3LDggQEAKIGludCBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJICAgIHN0cnVjdCBpb3ZlYyAqdG8sIGludCBsZW4pCiB7Ci0JaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKLQlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gZW5kIC0gb2Zmc2V0OwogCiAJLyogQ29weSBoZWFkZXIuICovCiAJaWYgKGNvcHkgPiAwKSB7CkBAIC0yNjMsMTEgKzI2Myw5IEBACiAKIAkvKiBDb3B5IHBhZ2VkIGFwcGVuZGl4LiBIbW0uLi4gd2h5IGRvZXMgdGhpcyBsb29rIHNvIGNvbXBsaWNhdGVkPyAqLwogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKLQkJaW50IGVuZDsKKwkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWVuZCA9IG9mZnNldCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKIAkJCWludCBlcnI7CiAJCQl1OCAgKnZhZGRyOwpAQCAtMjc3LDggKzI3NSw4IEBACiAJCQlpZiAoY29weSA+IGxlbikKIAkJCQljb3B5ID0gbGVuOwogCQkJdmFkZHIgPSBrbWFwKHBhZ2UpOwotCQkJZXJyID0gbWVtY3B5X3RvaW92ZWModG8sIHZhZGRyICsgZnJhZy0+cGFnZV9vZmZzZXQgKwotCQkJCQkgICAgIG9mZnNldCAtIHN0YXJ0LCBjb3B5KTsKKwkJCWVyciA9IG1lbWNweV90b2lvdmVjKHRvLCB2YWRkciArIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgIGNvcHkpOwogCQkJa3VubWFwKHBhZ2UpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGZhdWx0OwpAQCAtMjg2LDMwICsyODQsMjQgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCW9mZnNldCArPSBjb3B5OwogCQl9Ci0JCXN0YXJ0ID0gZW5kOwogCX0KIAogCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OwogCiAJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgewotCQkJaW50IGVuZDsKKwkJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQllbmQgPSBvZmZzZXQgKyBsaXN0LT5sZW47CiAJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJCWlmIChjb3B5ID4gbGVuKQogCQkJCQljb3B5ID0gbGVuOwotCQkJCWlmIChza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhsaXN0LAotCQkJCQkJCSAgICBvZmZzZXQgLSBzdGFydCwKLQkJCQkJCQkgICAgdG8sIGNvcHkpKQorCQkJCWlmIChza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhsaXN0LCAwLCB0bywgY29weSkpCiAJCQkJCWdvdG8gZmF1bHQ7CiAJCQkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKIAkJCQkJcmV0dXJuIDA7CiAJCQkJb2Zmc2V0ICs9IGNvcHk7CiAJCQl9Ci0JCQlzdGFydCA9IGVuZDsKIAkJfQogCX0KIAlpZiAoIWxlbikKQEAgLTMyMyw5ICszMTUsOSBAQAogCQkJCSAgICAgIHU4IF9fdXNlciAqdG8sIGludCBsZW4sCiAJCQkJICAgICAgX193c3VtICpjc3VtcCkKIHsKLQlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOwogCWludCBwb3MgPSAwOwotCWludCBpLCBjb3B5ID0gc3RhcnQgLSBvZmZzZXQ7CisJaW50IGksIGNvcHkgPSBlbmQgLSBvZmZzZXQ7CiAKIAkvKiBDb3B5IGhlYWRlci4gKi8KIAlpZiAoY29weSA+IDApIHsKQEAgLTM0NCwxMSArMzM2LDkgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWludCBlbmQ7CisJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQllbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQlfX3dzdW0gY3N1bTI7CiAJCQlpbnQgZXJyID0gMDsKQEAgLTM2MCw4ICszNTAsNyBAQAogCQkJCWNvcHkgPSBsZW47CiAJCQl2YWRkciA9IGttYXAocGFnZSk7CiAJCQljc3VtMiA9IGNzdW1fYW5kX2NvcHlfdG9fdXNlcih2YWRkciArCi0JCQkJCQkJZnJhZy0+cGFnZV9vZmZzZXQgKwotCQkJCQkJCW9mZnNldCAtIHN0YXJ0LAorCQkJCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0LAogCQkJCQkJICAgICAgdG8sIGNvcHksIDAsICZlcnIpOwogCQkJa3VubWFwKHBhZ2UpOwogCQkJaWYgKGVycikKQEAgLTM3MywyNCArMzYyLDIwIEBACiAJCQl0byArPSBjb3B5OwogCQkJcG9zICs9IGNvcHk7CiAJCX0KLQkJc3RhcnQgPSBlbmQ7CiAJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CiAJCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CiAKIAkJZm9yICg7IGxpc3Q7IGxpc3Q9bGlzdC0+bmV4dCkgewotCQkJaW50IGVuZDsKKwkJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQllbmQgPSBvZmZzZXQgKyBsaXN0LT5sZW47CiAJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJCV9fd3N1bSBjc3VtMiA9IDA7CiAJCQkJaWYgKGNvcHkgPiBsZW4pCiAJCQkJCWNvcHkgPSBsZW47Ci0JCQkJaWYgKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtKGxpc3QsCi0JCQkJCQkJICAgICAgIG9mZnNldCAtIHN0YXJ0LAorCQkJCWlmIChza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbShsaXN0LCAwLAogCQkJCQkJCSAgICAgICB0bywgY29weSwKIAkJCQkJCQkgICAgICAgJmNzdW0yKSkKIAkJCQkJZ290byBmYXVsdDsKQEAgLTQwMSw3ICszODYsNiBAQAogCQkJCXRvICs9IGNvcHk7CiAJCQkJcG9zICs9IGNvcHk7CiAJCQl9Ci0JCQlzdGFydCA9IGVuZDsKIAkJfQogCX0KIAlpZiAoIWxlbikKQEAgLTQxMSwxMSArMzk1LDExIEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLV9fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK19fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQogewogCV9fc3VtMTYgc3VtOwogCi0Jc3VtID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKKwlzdW0gPSBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgbGVuLCBza2ItPmNzdW0pKTsKIAlpZiAobGlrZWx5KCFzdW0pKSB7CiAJCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkpCiAJCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7CkBAIC00MjMsNiArNDA3LDEyIEBACiAJfQogCXJldHVybiBzdW07CiB9CitFWFBPUlRfU1lNQk9MKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQpOworCitfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc2tiLCBza2ItPmxlbik7Cit9CiBFWFBPUlRfU1lNQk9MKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKTsKIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDRkYzkzY2MuLmQ1ZTQyZDEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0xMDksNyArMTA5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L3dleHQuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KQEAgLTE0Niw4ICsxNDYsOCBAQAogICovCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHR5cGVfbG9jayk7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9iYXNlWzE2XTsJLyogMTYgd2F5IGhhc2hlZCBsaXN0ICovCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9hbGw7CQkvKiBUYXBzICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9iYXNlWzE2XSBfX3JlYWRfbW9zdGx5OwkvKiAxNiB3YXkgaGFzaGVkIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2FsbCBfX3JlYWRfbW9zdGx5OwkvKiBUYXBzICovCiAKICNpZmRlZiBDT05GSUdfTkVUX0RNQQogc3RhdGljIHN0cnVjdCBkbWFfY2xpZW50ICpuZXRfZG1hX2NsaWVudDsKQEAgLTIyNiwxMiArMjI2LDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKglGb3IgZWZmaWNpZW5jeQotICovCi0KLXN0YXRpYyBpbnQgbmV0ZGV2X25pdDsKLQotLyoKICAqCUFkZCBhIHByb3RvY29sIElEIHRvIHRoZSBsaXN0LiBOb3cgdGhhdCB0aGUgaW5wdXQgaGFuZGxlciBpcwogICoJc21hcnRlciB3ZSBjYW4gZGlzcGVuc2Ugd2l0aCBhbGwgdGhlIG1lc3N5IHN0dWZmIHRoYXQgdXNlZCB0byBiZQogICoJaGVyZS4KQEAgLTI2NSwxMCArMjU5LDkgQEAKIAlpbnQgaGFzaDsKIAogCXNwaW5fbG9ja19iaCgmcHR5cGVfbG9jayk7Ci0JaWYgKHB0LT50eXBlID09IGh0b25zKEVUSF9QX0FMTCkpIHsKLQkJbmV0ZGV2X25pdCsrOworCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKQogCQlsaXN0X2FkZF9yY3UoJnB0LT5saXN0LCAmcHR5cGVfYWxsKTsKLQl9IGVsc2UgeworCWVsc2UgewogCQloYXNoID0gbnRvaHMocHQtPnR5cGUpICYgMTU7CiAJCWxpc3RfYWRkX3JjdSgmcHQtPmxpc3QsICZwdHlwZV9iYXNlW2hhc2hdKTsKIAl9CkBAIC0yOTUsMTAgKzI4OCw5IEBACiAKIAlzcGluX2xvY2tfYmgoJnB0eXBlX2xvY2spOwogCi0JaWYgKHB0LT50eXBlID09IGh0b25zKEVUSF9QX0FMTCkpIHsKLQkJbmV0ZGV2X25pdC0tOworCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKQogCQloZWFkID0gJnB0eXBlX2FsbDsKLQl9IGVsc2UKKwllbHNlCiAJCWhlYWQgPSAmcHR5cGVfYmFzZVtudG9ocyhwdC0+dHlwZSkgJiAxNV07CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0MSwgaGVhZCwgbGlzdCkgewpAQCAtODE3LDcgKzgwOSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogLyoqCiAgKglkZXZfb3BlbgktIHByZXBhcmUgYW4gaW50ZXJmYWNlIGZvciB1c2UuCiAgKglAZGV2OglkZXZpY2UgdG8gb3BlbgpAQCAtMTAzMSwyMyArMTAyMiwxMiBAQAogCWF0b21pY19kZWMoJm5ldHN0YW1wX25lZWRlZCk7CiB9CiAKLXZvaWQgX19uZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0KLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlza2Jfc2V0X3RpbWVzdGFtcChza2IsICZ0dik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fbmV0X3RpbWVzdGFtcCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKGF0b21pY19yZWFkKCZuZXRzdGFtcF9uZWVkZWQpKQogCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKLQllbHNlIHsKLQkJc2tiLT50c3RhbXAub2ZmX3NlYyA9IDA7Ci0JCXNrYi0+dHN0YW1wLm9mZl91c2VjID0gMDsKLQl9CisJZWxzZQorCQlza2ItPnRzdGFtcC50djY0ID0gMDsKIH0KIAogLyoKQEAgLTEwNzcsMTggKzEwNTcsMTggQEAKIAkJCSAgIHNldCBieSBzZW5kZXIsIHNvIHRoYXQgdGhlIHNlY29uZCBzdGF0ZW1lbnQgaXMKIAkJCSAgIGp1c3QgcHJvdGVjdGlvbiBhZ2FpbnN0IGJ1Z2d5IHByb3RvY29scy4KIAkJCSAqLwotCQkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPmRhdGE7CisJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IyKTsKIAotCQkJaWYgKHNrYjItPm5oLnJhdyA8IHNrYjItPmRhdGEgfHwKLQkJCSAgICBza2IyLT5uaC5yYXcgPiBza2IyLT50YWlsKSB7CisJCQlpZiAoc2tiX25ldHdvcmtfaGVhZGVyKHNrYjIpIDwgc2tiMi0+ZGF0YSB8fAorCQkJICAgIHNrYjItPm5ldHdvcmtfaGVhZGVyID4gc2tiMi0+dGFpbCkgewogCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQkJCXByaW50ayhLRVJOX0NSSVQgInByb3RvY29sICUwNHggaXMgIgogCQkJCQkgICAgICAgImJ1Z2d5LCBkZXYgJXNcbiIsCiAJCQkJCSAgICAgICBza2IyLT5wcm90b2NvbCwgZGV2LT5uYW1lKTsKLQkJCQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCQkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAkJCX0KIAotCQkJc2tiMi0+aC5yYXcgPSBza2IyLT5uaC5yYXc7CisJCQlza2IyLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiMi0+bmV0d29ya19oZWFkZXI7CiAJCQlza2IyLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVVRHT0lORzsKIAkJCXB0eXBlLT5mdW5jKHNrYjIsIHNrYi0+ZGV2LCBwdHlwZSwgc2tiLT5kZXYpOwogCQl9CkBAIC0xMTY3LDcgKzExNDcsNyBAQAogaW50IHNrYl9jaGVja3N1bV9oZWxwKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX193c3VtIGNzdW07Ci0JaW50IHJldCA9IDAsIG9mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJaW50IHJldCA9IDAsIG9mZnNldDsKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKIAkJZ290byBvdXRfc2V0X3N1bW1lZDsKQEAgLTExODMsMTUgKzExNjMsMTYgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAorCW9mZnNldCA9IHNrYi0+Y3N1bV9zdGFydCAtIHNrYl9oZWFkcm9vbShza2IpOwogCUJVR19PTihvZmZzZXQgPiAoaW50KXNrYi0+bGVuKTsKIAljc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbi1vZmZzZXQsIDApOwogCi0Jb2Zmc2V0ID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwlvZmZzZXQgPSBza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0OwogCUJVR19PTihvZmZzZXQgPD0gMCk7CiAJQlVHX09OKHNrYi0+Y3N1bV9vZmZzZXQgKyAyID4gb2Zmc2V0KTsKIAotCSooX19zdW0xNiopKHNrYi0+aC5yYXcgKyBza2ItPmNzdW1fb2Zmc2V0KSA9IGNzdW1fZm9sZChjc3VtKTsKLQorCSooX19zdW0xNiAqKShza2ItPmhlYWQgKyBza2ItPmNzdW1fc3RhcnQgKyBza2ItPmNzdW1fb2Zmc2V0KSA9CisJCWNzdW1fZm9sZChjc3VtKTsKIG91dF9zZXRfc3VtbWVkOgogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIG91dDoKQEAgLTEyMTcsMTEgKzExOTgsMTEgQEAKIAogCUJVR19PTihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7Ci0Jc2tiLT5tYWNfbGVuID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2ItPm1hY19sZW4gPSBza2ItPm5ldHdvcmtfaGVhZGVyIC0gc2tiLT5tYWNfaGVhZGVyOwogCV9fc2tiX3B1bGwoc2tiLCBza2ItPm1hY19sZW4pOwogCi0JaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpKSB7CisJaWYgKFdBUk5fT04oc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKIAkJICAgIChlcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpKQogCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTEyMzUsNyArMTIxNiw4IEBACiAJCQkJc2VncyA9IEVSUl9QVFIoZXJyKTsKIAkJCQlpZiAoZXJyIHx8IHNrYl9nc29fb2soc2tiLCBmZWF0dXJlcykpCiAJCQkJCWJyZWFrOwotCQkJCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJCQkJX19za2JfcHVzaChza2IsIChza2ItPmRhdGEgLQorCQkJCQkJIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKSk7CiAJCQl9CiAJCQlzZWdzID0gcHR5cGUtPmdzb19zZWdtZW50KHNrYiwgZmVhdHVyZXMpOwogCQkJYnJlYWs7CkBAIC0xMjQzLDcgKzEyMjUsNyBAQAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm1hYy5yYXcpOworCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKIAogCXJldHVybiBzZWdzOwogfQpAQCAtMTM0MCw3ICsxMzIyLDcgQEAKIGludCBkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaWYgKGxpa2VseSghc2tiLT5uZXh0KSkgewotCQlpZiAobmV0ZGV2X25pdCkKKwkJaWYgKCFsaXN0X2VtcHR5KCZwdHlwZV9hbGwpKQogCQkJZGV2X3F1ZXVlX3htaXRfbml0KHNrYiwgZGV2KTsKIAogCQlpZiAobmV0aWZfbmVlZHNfZ3NvKGRldiwgc2tiKSkgewpAQCAtMTQ0MiwxMiArMTQyNCwxNiBAQAogCS8qIElmIHBhY2tldCBpcyBub3QgY2hlY2tzdW1tZWQgYW5kIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0CiAJICogY2hlY2tzdW1taW5nIGZvciB0aGlzIHByb3RvY29sLCBjb21wbGV0ZSBjaGVja3N1bW1pbmcgaGVyZS4KIAkgKi8KLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCSAgICAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HRU5fQ1NVTSkgJiYKLQkgICAgICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pIHx8Ci0JICAgICAgc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpKSkKLQkJaWYgKHNrYl9jaGVja3N1bV9oZWxwKHNrYikpCi0JCQlnb3RvIG91dF9rZnJlZV9za2I7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgc2tiLT5jc3VtX3N0YXJ0IC0KKwkJCQkJICAgICAgc2tiX2hlYWRyb29tKHNrYikpOworCisJCWlmICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dFTl9DU1VNKSAmJgorCQkgICAgKCEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkgfHwKKwkJICAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkpCisJCQlpZiAoc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkKKwkJCQlnb3RvIG91dF9rZnJlZV9za2I7CisJfQogCiBnc286CiAJc3Bpbl9sb2NrX3ByZWZldGNoKCZkZXYtPnF1ZXVlX2xvY2spOwpAQCAtMTU0Myw5ICsxNTI5LDkgQEAKIAkJCVJlY2VpdmVyIHJvdXRpbmVzCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotaW50IG5ldGRldl9tYXhfYmFja2xvZyA9IDEwMDA7Ci1pbnQgbmV0ZGV2X2J1ZGdldCA9IDMwMDsKLWludCB3ZWlnaHRfcCA9IDY0OyAgICAgICAgICAgIC8qIG9sZCBiYWNrbG9nIHdlaWdodCAqLworaW50IG5ldGRldl9tYXhfYmFja2xvZyBfX3JlYWRfbW9zdGx5ID0gMTAwMDsKK2ludCBuZXRkZXZfYnVkZ2V0IF9fcmVhZF9tb3N0bHkgPSAzMDA7CitpbnQgd2VpZ2h0X3AgX19yZWFkX21vc3RseSA9IDY0OyAgICAgICAgICAgIC8qIG9sZCBiYWNrbG9nIHdlaWdodCAqLwogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbmV0aWZfcnhfc3RhdHMsIG5ldGRldl9yeF9zdGF0KSA9IHsgMCwgfTsKIApAQCAtMTU3Nyw3ICsxNTYzLDcgQEAKIAlpZiAobmV0cG9sbF9yeChza2IpKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAKLQlpZiAoIXNrYi0+dHN0YW1wLm9mZl9zZWMpCisJaWYgKCFza2ItPnRzdGFtcC50djY0KQogCQluZXRfdGltZXN0YW1wKHNrYik7CiAKIAkvKgpAQCAtMTY4NCw0MCArMTY3MCw0NiBAQAogCX0KIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGRlbGl2ZXJfc2tiKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0X3ByZXYsCi0JCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCitzdGF0aWMgaW5saW5lIGludCBkZWxpdmVyX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdF9wcmV2LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQogewogCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOwogCXJldHVybiBwdF9wcmV2LT5mdW5jKHNrYiwgc2tiLT5kZXYsIHB0X3ByZXYsIG9yaWdfZGV2KTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZCAoQ09ORklHX0JSSURHRV9NT0RVTEUpCi1pbnQgKCpicl9oYW5kbGVfZnJhbWVfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKKy8qIFRoZXNlIGhvb2tzIGRlZmluZWQgaGVyZSBmb3IgQVRNICovCiBzdHJ1Y3QgbmV0X2JyaWRnZTsKIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqKCpicl9mZGJfZ2V0X2hvb2spKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgKmFkZHIpOwotdm9pZCAoKmJyX2ZkYl9wdXRfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQpOwordm9pZCAoKmJyX2ZkYl9wdXRfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQpIF9fcmVhZF9tb3N0bHk7CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBoYW5kbGVfYnJpZGdlKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgc3RydWN0IHBhY2tldF90eXBlICoqcHRfcHJldiwgaW50ICpyZXQsCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKKy8qCisgKiBJZiBicmlkZ2UgbW9kdWxlIGlzIGxvYWRlZCBjYWxsIGJyaWRnaW5nIGhvb2suCisgKiAgcmV0dXJucyBOVUxMIGlmIHBhY2tldCB3YXMgY29uc3VtZWQuCisgKi8KK3N0cnVjdCBza19idWZmICooKmJyX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaGFuZGxlX2JyaWRnZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgc3RydWN0IHBhY2tldF90eXBlICoqcHRfcHJldiwgaW50ICpyZXQsCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydDsKIAotCWlmICgoKnBza2IpLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0sgfHwKLQkgICAgKHBvcnQgPSByY3VfZGVyZWZlcmVuY2UoKCpwc2tiKS0+ZGV2LT5icl9wb3J0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0xPT1BCQUNLIHx8CisJICAgIChwb3J0ID0gcmN1X2RlcmVmZXJlbmNlKHNrYi0+ZGV2LT5icl9wb3J0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIHNrYjsKIAogCWlmICgqcHRfcHJldikgewotCQkqcmV0ID0gZGVsaXZlcl9za2IoKnBza2IsICpwdF9wcmV2LCBvcmlnX2Rldik7CisJCSpyZXQgPSBkZWxpdmVyX3NrYihza2IsICpwdF9wcmV2LCBvcmlnX2Rldik7CiAJCSpwdF9wcmV2ID0gTlVMTDsKIAl9CiAKLQlyZXR1cm4gYnJfaGFuZGxlX2ZyYW1lX2hvb2socG9ydCwgcHNrYik7CisJcmV0dXJuIGJyX2hhbmRsZV9mcmFtZV9ob29rKHBvcnQsIHNrYik7CiB9CiAjZWxzZQotI2RlZmluZSBoYW5kbGVfYnJpZGdlKHNrYiwgcHRfcHJldiwgcmV0LCBvcmlnX2RldikJKDApCisjZGVmaW5lIGhhbmRsZV9icmlkZ2Uoc2tiLCBwdF9wcmV2LCByZXQsIG9yaWdfZGV2KQkoc2tiKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTE3NDcsMTAgKzE3MzksMTAgQEAKIAogCQlza2ItPnRjX3ZlcmQgPSBTRVRfVENfQVQoc2tiLT50Y192ZXJkLEFUX0lOR1JFU1MpOwogCi0JCXNwaW5fbG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZXYtPmluZ3Jlc3NfbG9jayk7CiAJCWlmICgocSA9IGRldi0+cWRpc2NfaW5ncmVzcykgIT0gTlVMTCkKIAkJCXJlc3VsdCA9IHEtPmVucXVldWUoc2tiLCBxKTsKLQkJc3Bpbl91bmxvY2soJmRldi0+cXVldWVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmluZ3Jlc3NfbG9jayk7CiAKIAl9CiAKQEAgLTE3NjksNyArMTc2MSw3IEBACiAJaWYgKHNrYi0+ZGV2LT5wb2xsICYmIG5ldHBvbGxfcngoc2tiKSkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCi0JaWYgKCFza2ItPnRzdGFtcC5vZmZfc2VjKQorCWlmICghc2tiLT50c3RhbXAudHY2NCkKIAkJbmV0X3RpbWVzdGFtcChza2IpOwogCiAJaWYgKCFza2ItPmlpZikKQEAgLTE3ODIsOCArMTc3NCw5IEBACiAKIAlfX2dldF9jcHVfdmFyKG5ldGRldl9yeF9zdGF0KS50b3RhbCsrOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwotCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmgucmF3IC0gc2tiLT5tYWMucmF3OworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiLT5tYWNfbGVuID0gc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlcjsKIAogCXB0X3ByZXYgPSBOVUxMOwogCkBAIC0xODIzLDcgKzE4MTYsOCBAQAogbmNsczoKICNlbmRpZgogCi0JaWYgKGhhbmRsZV9icmlkZ2UoJnNrYiwgJnB0X3ByZXYsICZyZXQsIG9yaWdfZGV2KSkKKwlza2IgPSBoYW5kbGVfYnJpZGdlKHNrYiwgJnB0X3ByZXYsICZyZXQsIG9yaWdfZGV2KTsKKwlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAl0eXBlID0gc2tiLT5wcm90b2NvbDsKQEAgLTIwNzYsNyArMjA3MCw3IEBACiAgKglUaGlzIGlzIGludm9rZWQgYnkgdGhlIC9wcm9jIGZpbGVzeXN0ZW0gaGFuZGxlciB0byBkaXNwbGF5IGEgZGV2aWNlCiAgKglpbiBkZXRhaWwuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2lkeChsb2ZmX3QgcG9zKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2lkeChsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJbG9mZl90IGk7CkBAIC0yMTA1LDkgKzIwOTksOSBAQAogCiBzdGF0aWMgdm9pZCBkZXZfc2VxX3ByaW50Zl9zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpZiAoZGV2LT5nZXRfc3RhdHMpIHsKLQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gZGV2LT5nZXRfc3RhdHMoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBkZXYtPmdldF9zdGF0cyhkZXYpOwogCisJaWYgKHN0YXRzKSB7CiAJCXNlcV9wcmludGYoc2VxLCAiJTZzOiU4bHUgJTdsdSAlNGx1ICU0bHUgJTRsdSAlNWx1ICUxMGx1ICU5bHUgIgogCQkJCSIlOGx1ICU3bHUgJTRsdSAlNGx1ICU0bHUgJTVsdSAlN2x1ICUxMGx1XG4iLAogCQkJICAgZGV2LT5uYW1lLCBzdGF0cy0+cnhfYnl0ZXMsIHN0YXRzLT5yeF9wYWNrZXRzLApAQCAtMjE4NSw3ICsyMTc5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGV2X3NlcV9vcHMgPSB7CiAJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKIAkubmV4dCAgPSBkZXZfc2VxX25leHQsCiAJLnN0b3AgID0gZGV2X3NlcV9zdG9wLApAQCAtMjIwNSw3ICsyMTk5LDcgQEAKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzb2Z0bmV0X3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNvZnRuZXRfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBzb2Z0bmV0X3NlcV9zdGFydCwKIAkubmV4dCAgPSBzb2Z0bmV0X3NlcV9uZXh0LAogCS5zdG9wICA9IHNvZnRuZXRfc2VxX3N0b3AsCkBAIC0yMjI1LDEyICsyMjE5LDEzNSBAQAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCiB9OwogCi0jaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVAotZXh0ZXJuIGludCB3aXJlbGVzc19wcm9jX2luaXQodm9pZCk7Ci0jZWxzZQotI2RlZmluZSB3aXJlbGVzc19wcm9jX2luaXQoKSAwCitzdGF0aWMgdm9pZCAqcHR5cGVfZ2V0X2lkeChsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHQgPSBOVUxMOworCWxvZmZfdCBpID0gMDsKKwlpbnQgdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0LCAmcHR5cGVfYWxsLCBsaXN0KSB7CisJCWlmIChpID09IHBvcykKKwkJCXJldHVybiBwdDsKKwkJKytpOworCX0KKworCWZvciAodCA9IDA7IHQgPCAxNjsgdCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0LCAmcHR5cGVfYmFzZVt0XSwgbGlzdCkgeworCQkJaWYgKGkgPT0gcG9zKQorCQkJCXJldHVybiBwdDsKKwkJCSsraTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnB0eXBlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmN1X3JlYWRfbG9jaygpOworCXJldHVybiAqcG9zID8gcHR5cGVfZ2V0X2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpwdHlwZV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHBhY2tldF90eXBlICpwdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpueHQ7CisJaW50IGhhc2g7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gcHR5cGVfZ2V0X2lkeCgwKTsKKworCXB0ID0gdjsKKwlueHQgPSBwdC0+bGlzdC5uZXh0OworCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKSB7CisJCWlmIChueHQgIT0gJnB0eXBlX2FsbCkKKwkJCWdvdG8gZm91bmQ7CisJCWhhc2ggPSAwOworCQlueHQgPSBwdHlwZV9iYXNlWzBdLm5leHQ7CisJfSBlbHNlCisJCWhhc2ggPSBudG9ocyhwdC0+dHlwZSkgJiAxNTsKKworCXdoaWxlIChueHQgPT0gJnB0eXBlX2Jhc2VbaGFzaF0pIHsKKwkJaWYgKCsraGFzaCA+PSAxNikKKwkJCXJldHVybiBOVUxMOworCQlueHQgPSBwdHlwZV9iYXNlW2hhc2hdLm5leHQ7CisJfQorZm91bmQ6CisJcmV0dXJuIGxpc3RfZW50cnkobnh0LCBzdHJ1Y3QgcGFja2V0X3R5cGUsIGxpc3QpOworfQorCitzdGF0aWMgdm9pZCBwdHlwZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgcHR5cGVfc2VxX2RlY29kZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqc3ltKQoreworI2lmZGVmIENPTkZJR19LQUxMU1lNUworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMCwgc3ltc2l6ZTsKKwljb25zdCBjaGFyICpzeW1uYW1lOworCWNoYXIgKm1vZG5hbWU7CisJY2hhciBuYW1lYnVmWzEyOF07CisKKwlzeW1uYW1lID0ga2FsbHN5bXNfbG9va3VwKCh1bnNpZ25lZCBsb25nKXN5bSwgJnN5bXNpemUsICZvZmZzZXQsCisJCQkJICAmbW9kbmFtZSwgbmFtZWJ1Zik7CisKKwlpZiAoc3ltbmFtZSkgeworCQljaGFyICpkZWxpbSA9ICI6IjsKKworCQlpZiAoIW1vZG5hbWUpCisJCQltb2RuYW1lID0gZGVsaW0gPSAiIjsKKwkJc2VxX3ByaW50ZihzZXEsICIlcyVzJXMlcysweCVseCIsIGRlbGltLCBtb2RuYW1lLCBkZWxpbSwKKwkJCSAgIHN5bW5hbWUsIG9mZnNldCk7CisJCXJldHVybjsKKwl9CiAjZW5kaWYKIAorCXNlcV9wcmludGYoc2VxLCAiWyVwXSIsIHN5bSk7Cit9CisKK3N0YXRpYyBpbnQgcHR5cGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHBhY2tldF90eXBlICpwdCA9IHY7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIlR5cGUgRGV2aWNlICAgICAgRnVuY3Rpb25cbiIpOworCWVsc2UgeworCQlpZiAocHQtPnR5cGUgPT0gaHRvbnMoRVRIX1BfQUxMKSkKKwkJCXNlcV9wdXRzKHNlcSwgIkFMTCAiKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIlMDR4IiwgbnRvaHMocHQtPnR5cGUpKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiAlLThzICIsCisJCQkgICBwdC0+ZGV2ID8gcHQtPmRldi0+bmFtZSA6ICIiKTsKKwkJcHR5cGVfc2VxX2RlY29kZShzZXEsICBwdC0+ZnVuYyk7CisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHR5cGVfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBwdHlwZV9zZXFfc3RhcnQsCisJLm5leHQgID0gcHR5cGVfc2VxX25leHQsCisJLnN0b3AgID0gcHR5cGVfc2VxX3N0b3AsCisJLnNob3cgID0gcHR5cGVfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHB0eXBlX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcHR5cGVfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB0eXBlX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IHB0eXBlX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKwogc3RhdGljIGludCBfX2luaXQgZGV2X3Byb2NfaW5pdCh2b2lkKQogewogCWludCByYyA9IC1FTk9NRU07CkBAIC0yMjM5LDEzICsyMzU2LDE4IEBACiAJCWdvdG8gb3V0OwogCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInNvZnRuZXRfc3RhdCIsIFNfSVJVR08sICZzb2Z0bmV0X3NlcV9mb3BzKSkKIAkJZ290byBvdXRfZGV2OwotCWlmICh3aXJlbGVzc19wcm9jX2luaXQoKSkKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJwdHlwZSIsIFNfSVJVR08sICZwdHlwZV9zZXFfZm9wcykpCisJCWdvdG8gb3V0X2RldjI7CisKKwlpZiAod2V4dF9wcm9jX2luaXQoKSkKIAkJZ290byBvdXRfc29mdG5ldDsKIAlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwogb3V0X3NvZnRuZXQ6CiAJcHJvY19uZXRfcmVtb3ZlKCJzb2Z0bmV0X3N0YXQiKTsKK291dF9kZXYyOgorCXByb2NfbmV0X3JlbW92ZSgicHR5cGUiKTsKIG91dF9kZXY6CiAJcHJvY19uZXRfcmVtb3ZlKCJkZXYiKTsKIAlnb3RvIG91dDsKQEAgLTI3OTUsMjkgKzI5MTcsOSBAQAogCQkJCQlyZXQgPSAtRUZBVUxUOwogCQkJCXJldHVybiByZXQ7CiAJCQl9Ci0jaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVAogCQkJLyogVGFrZSBjYXJlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMgKi8KLQkJCWlmIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpIHsKLQkJCQkvKiBJZiBjb21tYW5kIGlzIGBzZXQgYSBwYXJhbWV0ZXInLCBvcgotCQkJCSAqIGBnZXQgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMnLCBjaGVjayBpZgotCQkJCSAqIHRoZSB1c2VyIGhhcyB0aGUgcmlnaHQgdG8gZG8gaXQgKi8KLQkJCQlpZiAoSVdfSVNfU0VUKGNtZCkgfHwgY21kID09IFNJT0NHSVdFTkNPREUKLQkJCQkgICAgfHwgY21kID09IFNJT0NHSVdFTkNPREVFWFQpIHsKLQkJCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCQkJcmV0dXJuIC1FUEVSTTsKLQkJCQl9Ci0JCQkJZGV2X2xvYWQoaWZyLmlmcl9uYW1lKTsKLQkJCQlydG5sX2xvY2soKTsKLQkJCQkvKiBGb2xsb3cgbWUgaW4gbmV0L2NvcmUvd2lyZWxlc3MuYyAqLwotCQkJCXJldCA9IHdpcmVsZXNzX3Byb2Nlc3NfaW9jdGwoJmlmciwgY21kKTsKLQkJCQlydG5sX3VubG9jaygpOwotCQkJCWlmIChJV19JU19HRVQoY21kKSAmJgotCQkJCSAgICBjb3B5X3RvX3VzZXIoYXJnLCAmaWZyLAotCQkJCQkJIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSkKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotI2VuZGlmCS8qIENPTkZJR19XSVJFTEVTU19FWFQgKi8KKwkJCWlmIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpCisJCQkJcmV0dXJuIHdleHRfaGFuZGxlX2lvY3RsKCZpZnIsIGNtZCwgYXJnKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KQEAgLTI4NDcsNyArMjk0OSw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5ldF90b2RvX2xpc3RfbG9jayk7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBuZXRfdG9kb19saXN0ID0gTElTVF9IRUFEX0lOSVQobmV0X3RvZG9fbGlzdCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXRfc2V0X3RvZG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5ldF9zZXRfdG9kbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXNwaW5fbG9jaygmbmV0X3RvZG9fbGlzdF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPnRvZG9fbGlzdCwgJm5ldF90b2RvX2xpc3QpOwpAQCAtMjg4OCw5ICsyOTkwLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5xdWV1ZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5feG1pdF9sb2NrKTsKIAlkZXYtPnhtaXRfbG9ja19vd25lciA9IC0xOwotI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmluZ3Jlc3NfbG9jayk7Ci0jZW5kaWYKIAogCWRldi0+aWZsaW5rID0gLTE7CiAKQEAgLTMwMDIsNyArMzEwMiw3IEBACiAgKgljaGFpbi4gMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiBBIG5lZ2F0aXZlIGVycm5vIGNvZGUgaXMgcmV0dXJuZWQKICAqCW9uIGEgZmFpbHVyZSB0byBzZXQgdXAgdGhlIGRldmljZSwgb3IgaWYgdGhlIG5hbWUgaXMgYSBkdXBsaWNhdGUuCiAgKgotICoJVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHJlZ2lzdGVyX25ldGRldiB0aGF0IHRha2VzIHRoZSBydG5sIHNlbWFwaG9yZQorICoJVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHJlZ2lzdGVyX25ldGRldmljZSB0aGF0IHRha2VzIHRoZSBydG5sIHNlbWFwaG9yZQogICoJYW5kIGV4cGFuZHMgdGhlIGRldmljZSBuYW1lIGlmIHlvdSBwYXNzZWQgYSBmb3JtYXQgc3RyaW5nIHRvCiAgKglhbGxvY19uZXRkZXYuCiAgKi8KQEAgLTMxNTcsNiArMzI1NywxMyBAQAogCW11dGV4X3VubG9jaygmbmV0X3RvZG9fcnVuX211dGV4KTsKIH0KIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYXliZV9pbnRlcm5hbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JTlRFUk5BTF9TVEFUUykKKwkJcmV0dXJuICZkZXYtPnN0YXRzOworCXJldHVybiBOVUxMOworfQorCiAvKioKICAqCWFsbG9jX25ldGRldiAtIGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlCiAgKglAc2l6ZW9mX3ByaXY6CXNpemUgb2YgcHJpdmF0ZSBkYXRhIHRvIGFsbG9jYXRlIHNwYWNlIGZvcgpAQCAtMzE5Miw2ICszMjk5LDcgQEAKIAlpZiAoc2l6ZW9mX3ByaXYpCiAJCWRldi0+cHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKKwlkZXYtPmdldF9zdGF0cyA9IG1heWJlX2ludGVybmFsX3N0YXRzOwogCXNldHVwKGRldik7CiAJc3RyY3B5KGRldi0+bmFtZSwgbmFtZSk7CiAJcmV0dXJuIGRldjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldl9tY2FzdC5jIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKaW5kZXggNTZiMzEwYy4uN2Q1N2JmNyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2X21jYXN0LmMKKysrIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldl9tY19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZfbWNfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBkZXZfbWNfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IGRldl9tY19zZXFfbmV4dCwKIAkuc3RvcCAgPSBkZXZfbWNfc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9ldGh0b29sLmMgYi9uZXQvY29yZS9ldGh0b29sLmMKaW5kZXggNjE2OGVkZC4uOGQ1ZTVhMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZXRodG9vbC5jCisrKyBiL25ldC9jb3JlL2V0aHRvb2wuYwpAQCAtODM2LDcgKzgzNiw3IEBACiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KIAotCWlmKGRldi0+ZXRodG9vbF9vcHMtPmJlZ2luKQorCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5iZWdpbikKIAkJaWYgKChyYyA9IGRldi0+ZXRodG9vbF9vcHMtPmJlZ2luKGRldikpIDwgMCkKIAkJCXJldHVybiByYzsKIApAQCAtOTUyLDcgKzk1Miw3IEBACiAJCXJjID0gIC1FT1BOT1RTVVBQOwogCX0KIAotCWlmKGRldi0+ZXRodG9vbF9vcHMtPmNvbXBsZXRlKQorCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5jb21wbGV0ZSkKIAkJZGV2LT5ldGh0b29sX29wcy0+Y29tcGxldGUoZGV2KTsKIAogCWlmIChvbGRfZmVhdHVyZXMgIT0gZGV2LT5mZWF0dXJlcykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKaW5kZXggNzE3NGNlZC4uOGM1NDc0ZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTQ0LDYgKzQ0LDEyIEBACiAJCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CiB9CiAKK3N0YXRpYyB2b2lkIGZsdXNoX3JvdXRlX2NhY2hlKHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMpCit7CisJaWYgKG9wcy0+Zmx1c2hfY2FjaGUpCisJCW9wcy0+Zmx1c2hfY2FjaGUoKTsKK30KKwogaW50IGZpYl9ydWxlc19yZWdpc3RlcihzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzKQogewogCWludCBlcnIgPSAtRUVYSVNUOwpAQCAtMTMyLDEwICsxMzgsMjUgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShydWxlLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKK2p1bXBlZDoKIAkJaWYgKCFmaWJfcnVsZV9tYXRjaChydWxlLCBvcHMsIGZsLCBmbGFncykpCiAJCQljb250aW51ZTsKIAotCQllcnIgPSBvcHMtPmFjdGlvbihydWxlLCBmbCwgZmxhZ3MsIGFyZyk7CisJCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX0dPVE8pIHsKKwkJCXN0cnVjdCBmaWJfcnVsZSAqdGFyZ2V0OworCisJCQl0YXJnZXQgPSByY3VfZGVyZWZlcmVuY2UocnVsZS0+Y3RhcmdldCk7CisJCQlpZiAodGFyZ2V0ID09IE5VTEwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcnVsZSA9IHRhcmdldDsKKwkJCQlnb3RvIGp1bXBlZDsKKwkJCX0KKwkJfSBlbHNlIGlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX05PUCkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQllcnIgPSBvcHMtPmFjdGlvbihydWxlLCBmbCwgZmxhZ3MsIGFyZyk7CisKIAkJaWYgKGVyciAhPSAtRUFHQUlOKSB7CiAJCQlmaWJfcnVsZV9nZXQocnVsZSk7CiAJCQlhcmctPnJ1bGUgPSBydWxlOwpAQCAtMTc0LDEzICsxOTUsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZmliX3J1bGVfaGRyICpmcmggPSBubG1zZ19kYXRhKG5saCk7CiAJc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcyA9IE5VTEw7CiAJc3RydWN0IGZpYl9ydWxlICpydWxlLCAqciwgKmxhc3QgPSBOVUxMOwogCXN0cnVjdCBubGF0dHIgKnRiW0ZSQV9NQVgrMV07Ci0JaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGVyciA9IC1FSU5WQUwsIHVucmVzb2x2ZWQgPSAwOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgbmxtc2dfbXNnX3NpemUoc2l6ZW9mKCpmcmgpKSkKIAkJZ290byBlcnJvdXQ7CkBAIC0yMzcsNiArMjU4LDI4IEBACiAJaWYgKCFydWxlLT5wcmVmICYmIG9wcy0+ZGVmYXVsdF9wcmVmKQogCQlydWxlLT5wcmVmID0gb3BzLT5kZWZhdWx0X3ByZWYoKTsKIAorCWVyciA9IC1FSU5WQUw7CisJaWYgKHRiW0ZSQV9HT1RPXSkgeworCQlpZiAocnVsZS0+YWN0aW9uICE9IEZSX0FDVF9HT1RPKQorCQkJZ290byBlcnJvdXRfZnJlZTsKKworCQlydWxlLT50YXJnZXQgPSBubGFfZ2V0X3UzMih0YltGUkFfR09UT10pOworCQkvKiBCYWNrd2FyZCBqdW1wcyBhcmUgcHJvaGliaXRlZCB0byBhdm9pZCBlbmRsZXNzIGxvb3BzICovCisJCWlmIChydWxlLT50YXJnZXQgPD0gcnVsZS0+cHJlZikKKwkJCWdvdG8gZXJyb3V0X2ZyZWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChyLT5wcmVmID09IHJ1bGUtPnRhcmdldCkgeworCQkJCXJ1bGUtPmN0YXJnZXQgPSByOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHJ1bGUtPmN0YXJnZXQgPT0gTlVMTCkKKwkJCXVucmVzb2x2ZWQgPSAxOworCX0gZWxzZSBpZiAocnVsZS0+YWN0aW9uID09IEZSX0FDVF9HT1RPKQorCQlnb3RvIGVycm91dF9mcmVlOworCiAJZXJyID0gb3BzLT5jb25maWd1cmUocnVsZSwgc2tiLCBubGgsIGZyaCwgdGIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dF9mcmVlOwpAQCAtMjQ5LDEyICsyOTIsMzUgQEAKIAogCWZpYl9ydWxlX2dldChydWxlKTsKIAorCWlmIChvcHMtPnVucmVzb2x2ZWRfcnVsZXMpIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHVucmVzb2x2ZWQgZ290byBydWxlcyBpbiB0aGUgbGlzdCwgY2hlY2sgaWYKKwkJICogYW55IG9mIHRoZW0gYXJlIHBvaW50aW5nIHRvIHRoaXMgbmV3IHJ1bGUuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsIG9wcy0+cnVsZXNfbGlzdCwgbGlzdCkgeworCQkJaWYgKHItPmFjdGlvbiA9PSBGUl9BQ1RfR09UTyAmJgorCQkJICAgIHItPnRhcmdldCA9PSBydWxlLT5wcmVmKSB7CisJCQkJQlVHX09OKHItPmN0YXJnZXQgIT0gTlVMTCk7CisJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHItPmN0YXJnZXQsIHJ1bGUpOworCQkJCWlmICgtLW9wcy0+dW5yZXNvbHZlZF9ydWxlcyA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX0dPVE8pCisJCW9wcy0+bnJfZ290b19ydWxlcysrOworCisJaWYgKHVucmVzb2x2ZWQpCisJCW9wcy0+dW5yZXNvbHZlZF9ydWxlcysrOworCiAJaWYgKGxhc3QpCiAJCWxpc3RfYWRkX3JjdSgmcnVsZS0+bGlzdCwgJmxhc3QtPmxpc3QpOwogCWVsc2UKIAkJbGlzdF9hZGRfcmN1KCZydWxlLT5saXN0LCBvcHMtPnJ1bGVzX2xpc3QpOwogCiAJbm90aWZ5X3J1bGVfY2hhbmdlKFJUTV9ORVdSVUxFLCBydWxlLCBvcHMsIG5saCwgTkVUTElOS19DQihza2IpLnBpZCk7CisJZmx1c2hfcm91dGVfY2FjaGUob3BzKTsKIAlydWxlc19vcHNfcHV0KG9wcyk7CiAJcmV0dXJuIDA7CiAKQEAgLTI2NSwxMSArMzMxLDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGZpYl9ydWxlX2hkciAqZnJoID0gbmxtc2dfZGF0YShubGgpOwogCXN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMgPSBOVUxMOwotCXN0cnVjdCBmaWJfcnVsZSAqcnVsZTsKKwlzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsICp0bXA7CiAJc3RydWN0IG5sYXR0ciAqdGJbRlJBX01BWCsxXTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIApAQCAtMzIyLDEwICszODgsMzAgQEAKIAkJfQogCiAJCWxpc3RfZGVsX3JjdSgmcnVsZS0+bGlzdCk7CisKKwkJaWYgKHJ1bGUtPmFjdGlvbiA9PSBGUl9BQ1RfR09UTykKKwkJCW9wcy0+bnJfZ290b19ydWxlcy0tOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoaXMgcnVsZSBpcyBhIHRhcmdldCB0byBhbnkgb2YgdGhlbS4gSWYgc28sCisJCSAqIGRpc2FibGUgdGhlbS4gQXMgdGhpcyBvcGVyYXRpb24gaXMgZXZlbnR1YWxseSB2ZXJ5CisJCSAqIGV4cGVuc2l2ZSwgaXQgaXMgb25seSBwZXJmb3JtZWQgaWYgZ290byBydWxlcyBoYXZlCisJCSAqIGFjdHVhbGx5IGJlZW4gYWRkZWQuCisJCSAqLworCQlpZiAob3BzLT5ucl9nb3RvX3J1bGVzID4gMCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsIG9wcy0+cnVsZXNfbGlzdCwgbGlzdCkgeworCQkJCWlmICh0bXAtPmN0YXJnZXQgPT0gcnVsZSkgeworCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIodG1wLT5jdGFyZ2V0LCBOVUxMKTsKKwkJCQkJb3BzLT51bnJlc29sdmVkX3J1bGVzKys7CisJCQkJfQorCQkJfQorCQl9CisKIAkJc3luY2hyb25pemVfcmN1KCk7CiAJCW5vdGlmeV9ydWxlX2NoYW5nZShSVE1fREVMUlVMRSwgcnVsZSwgb3BzLCBubGgsCiAJCQkJICAgTkVUTElOS19DQihza2IpLnBpZCk7CiAJCWZpYl9ydWxlX3B1dChydWxlKTsKKwkJZmx1c2hfcm91dGVfY2FjaGUob3BzKTsKIAkJcnVsZXNfb3BzX3B1dChvcHMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNzEsOSArNDU3LDE2IEBACiAJZnJoLT5hY3Rpb24gPSBydWxlLT5hY3Rpb247CiAJZnJoLT5mbGFncyA9IHJ1bGUtPmZsYWdzOwogCi0JaWYgKHJ1bGUtPmlmbmFtZVswXSkKKwlpZiAocnVsZS0+YWN0aW9uID09IEZSX0FDVF9HT1RPICYmIHJ1bGUtPmN0YXJnZXQgPT0gTlVMTCkKKwkJZnJoLT5mbGFncyB8PSBGSUJfUlVMRV9VTlJFU09MVkVEOworCisJaWYgKHJ1bGUtPmlmbmFtZVswXSkgewogCQlOTEFfUFVUX1NUUklORyhza2IsIEZSQV9JRk5BTUUsIHJ1bGUtPmlmbmFtZSk7CiAKKwkJaWYgKHJ1bGUtPmlmaW5kZXggPT0gLTEpCisJCQlmcmgtPmZsYWdzIHw9IEZJQl9SVUxFX0RFVl9ERVRBQ0hFRDsKKwl9CisKIAlpZiAocnVsZS0+cHJlZikKIAkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfUFJJT1JJVFksIHJ1bGUtPnByZWYpOwogCkBAIC0zODMsNiArNDc2LDkgQEAKIAlpZiAocnVsZS0+bWFya19tYXNrIHx8IHJ1bGUtPm1hcmspCiAJCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0ZXTUFTSywgcnVsZS0+bWFya19tYXNrKTsKIAorCWlmIChydWxlLT50YXJnZXQpCisJCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0dPVE8sIHJ1bGUtPnRhcmdldCk7CisKIAlpZiAob3BzLT5maWxsKHJ1bGUsIHNrYiwgbmxoLCBmcmgpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTM5MywxOSArNDg5LDE0IEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAotaW50IGZpYl9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgZHVtcF9ydWxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgIHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMpCiB7CiAJaW50IGlkeCA9IDA7CiAJc3RydWN0IGZpYl9ydWxlICpydWxlOwotCXN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHM7CiAKLQlvcHMgPSBsb29rdXBfcnVsZXNfb3BzKGZhbWlseSk7Ci0JaWYgKG9wcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShydWxlLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGlkeCA8IGNiLT5hcmdzWzBdKQorCWxpc3RfZm9yX2VhY2hfZW50cnkocnVsZSwgb3BzLT5ydWxlc19saXN0LCBsaXN0KSB7CisJCWlmIChpZHggPCBjYi0+YXJnc1sxXSkKIAkJCWdvdG8gc2tpcDsKIAogCQlpZiAoZmliX25sX2ZpbGxfcnVsZShza2IsIHJ1bGUsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLApAQCAtNDE1LDE0ICs1MDYsNDQgQEAKIHNraXA6CiAJCWlkeCsrOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQljYi0+YXJnc1swXSA9IGlkeDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKIAlydWxlc19vcHNfcHV0KG9wcyk7CiAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGZpYl9ydWxlc19kdW1wKTsKK3N0YXRpYyBpbnQgZmliX25sX2R1bXBydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzOworCWludCBpZHggPSAwLCBmYW1pbHk7CisKKwlmYW1pbHkgPSBydG5sX21zZ19mYW1pbHkoY2ItPm5saCk7CisJaWYgKGZhbWlseSAhPSBBRl9VTlNQRUMpIHsKKwkJLyogUHJvdG9jb2wgc3BlY2lmaWMgZHVtcCByZXF1ZXN0ICovCisJCW9wcyA9IGxvb2t1cF9ydWxlc19vcHMoZmFtaWx5KTsKKwkJaWYgKG9wcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwkJcmV0dXJuIGR1bXBfcnVsZXMoc2tiLCBjYiwgb3BzKTsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob3BzLCAmcnVsZXNfb3BzLCBsaXN0KSB7CisJCWlmIChpZHggPCBjYi0+YXJnc1swXSB8fCAhdHJ5X21vZHVsZV9nZXQob3BzLT5vd25lcikpCisJCQlnb3RvIHNraXA7CisKKwkJaWYgKGR1bXBfcnVsZXMoc2tiLCBjYiwgb3BzKSA8IDApCisJCQlicmVhazsKKworCQljYi0+YXJnc1sxXSA9IDA7CisJc2tpcDoKKwkJaWR4Kys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQogCiBzdGF0aWMgdm9pZCBub3RpZnlfcnVsZV9jaGFuZ2UoaW50IGV2ZW50LCBzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsCiAJCQkgICAgICAgc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcywgc3RydWN0IG5sbXNnaGRyICpubGgsCkBAIC01MDEsNiArNjIyLDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZpYl9ydWxlc19pbml0KHZvaWQpCiB7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdSVUxFLCBmaWJfbmxfbmV3cnVsZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxSVUxFLCBmaWJfbmxfZGVscnVsZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRSVUxFLCBOVUxMLCBmaWJfbmxfZHVtcHJ1bGUpOworCiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZmliX3J1bGVzX25vdGlmaWVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCA4ZDE4NWEwLi5iZDkwM2FhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtNDIsMTEgKzQyLDExIEBACiAJdTggKnB0ciA9IE5VTEw7CiAKIAlpZiAoayA+PSBTS0ZfTkVUX09GRikKLQkJcHRyID0gc2tiLT5uaC5yYXcgKyBrIC0gU0tGX05FVF9PRkY7CisJCXB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgayAtIFNLRl9ORVRfT0ZGOwogCWVsc2UgaWYgKGsgPj0gU0tGX0xMX09GRikKLQkJcHRyID0gc2tiLT5tYWMucmF3ICsgayAtIFNLRl9MTF9PRkY7CisJCXB0ciA9IHNrYl9tYWNfaGVhZGVyKHNrYikgKyBrIC0gU0tGX0xMX09GRjsKIAotCWlmIChwdHIgPj0gc2tiLT5oZWFkICYmIHB0ciA8IHNrYi0+dGFpbCkKKwlpZiAocHRyID49IHNrYi0+aGVhZCAmJiBwdHIgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCXJldHVybiBwdHI7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9nZW5fc3RhdHMuYyBiL25ldC9jb3JlL2dlbl9zdGF0cy5jCmluZGV4IDI1OTQ3M2QuLmJjYzI1NTkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2dlbl9zdGF0cy5jCisrKyBiL25ldC9jb3JlL2dlbl9zdGF0cy5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3Bpbl9sb2NrX2JoKGxvY2spOwogCWQtPmxvY2sgPSBsb2NrOwogCWlmICh0eXBlKQotCQlkLT50YWlsID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOworCQlkLT50YWlsID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJZC0+c2tiID0gc2tiOwogCWQtPmNvbXBhdF90Y19zdGF0cyA9IHRjX3N0YXRzX3R5cGU7CiAJZC0+Y29tcGF0X3hzdGF0cyA9IHhzdGF0c190eXBlOwpAQCAtMjEyLDcgKzIxMiw3IEBACiBnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KHN0cnVjdCBnbmV0X2R1bXAgKmQpCiB7CiAJaWYgKGQtPnRhaWwpCi0JCWQtPnRhaWwtPnJ0YV9sZW4gPSBkLT5za2ItPnRhaWwgLSAodTggKikgZC0+dGFpbDsKKwkJZC0+dGFpbC0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoZC0+c2tiKSAtICh1OCAqKWQtPnRhaWw7CiAKIAlpZiAoZC0+Y29tcGF0X3RjX3N0YXRzKQogCQlpZiAoZ25ldF9zdGF0c19jb3B5KGQsIGQtPmNvbXBhdF90Y19zdGF0cywgJmQtPnRjX3N0YXRzLApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbGlua193YXRjaC5jIGIvbmV0L2NvcmUvbGlua193YXRjaC5jCmluZGV4IDhiNDVjOWQuLmUzYzI2YTkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2xpbmtfd2F0Y2guYworKysgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAljYXNlIElGX0xJTktfTU9ERV9ERUZBVUxUOgogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCX07CisJfQogCiAJZGV2LT5vcGVyc3RhdGUgPSBvcGVyc3RhdGU7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggODQxZTNmMy4uNmYzYmI3MyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTExMjUsNyArMTEyNSw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCi0JX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCiAJaWYgKGRldi0+aGFyZF9oZWFkZXIgJiYKIAkgICAgZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIE5VTEwsIE5VTEwsCkBAIC0xMTQ3LDcgKzExNDcsNyBAQAogCWlmICghZHN0IHx8ICEobmVpZ2ggPSBkc3QtPm5laWdoYm91cikpCiAJCWdvdG8gZGlzY2FyZDsKIAotCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAogCWlmICghbmVpZ2hfZXZlbnRfc2VuZChuZWlnaCwgc2tiKSkgewogCQlpbnQgZXJyOwpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCi0JX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCiAJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCkBAIC0xNDQxLDcgKzE0NDEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbmVpZ2hfZGVsZXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG5laWdoX2RlbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBuZG1zZyAqbmRtOwogCXN0cnVjdCBubGF0dHIgKmRzdF9hdHRyOwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbmVpZ2hfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG5laWdoX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBuZG1zZyAqbmRtOwogCXN0cnVjdCBubGF0dHIgKnRiW05EQV9NQVgrMV07CkBAIC0xNzg2LDcgKzE3ODYsNyBAQAogCVtORFRQQV9MT0NLVElNRV0JCT0geyAudHlwZSA9IE5MQV9VNjQgfSwKIH07CiAKLWludCBuZWlnaHRibF9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgbmVpZ2h0Ymxfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IG5laWdoX3RhYmxlICp0Ymw7CiAJc3RydWN0IG5kdG1zZyAqbmR0bXNnOwpAQCAtMTkxMCw3ICsxOTEwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbmVpZ2h0YmxfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgbmVpZ2h0YmxfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlpbnQgZmFtaWx5LCB0aWR4LCBuaWR4ID0gMDsKIAlpbnQgdGJsX3NraXAgPSBjYi0+YXJnc1swXTsKQEAgLTIwMzQsNyArMjAzNCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibDsKIAlpbnQgdCwgZmFtaWx5LCBzX3Q7CkBAIC0yMzkzLDcgKzIzOTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5laWdoX3N0YXRfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmVpZ2hfc3RhdF9zZXFfb3BzID0gewogCS5zdGFydAk9IG5laWdoX3N0YXRfc2VxX3N0YXJ0LAogCS5uZXh0CT0gbmVpZ2hfc3RhdF9zZXFfbmV4dCwKIAkuc3RvcAk9IG5laWdoX3N0YXRfc2VxX3N0b3AsCkBAIC0yNzQ2LDE0ICsyNzQ2LDI2IEBACiAKICNlbmRpZgkvKiBDT05GSUdfU1lTQ1RMICovCiAKK3N0YXRpYyBpbnQgX19pbml0IG5laWdoX2luaXQodm9pZCkKK3sKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV05FSUdILCBuZWlnaF9hZGQsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMTkVJR0gsIG5laWdoX2RlbGV0ZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRORUlHSCwgTlVMTCwgbmVpZ2hfZHVtcF9pbmZvKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUTkVJR0hUQkwsIE5VTEwsIG5laWdodGJsX2R1bXBfaW5mbyk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVRORUlHSFRCTCwgbmVpZ2h0Ymxfc2V0LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwobmVpZ2hfaW5pdCk7CisKIEVYUE9SVF9TWU1CT0woX19uZWlnaF9ldmVudF9zZW5kKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfY2hhbmdlYWRkcik7CiBFWFBPUlRfU1lNQk9MKG5laWdoX2NvbXBhdF9vdXRwdXQpOwogRVhQT1JUX1NZTUJPTChuZWlnaF9jb25uZWN0ZWRfb3V0cHV0KTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfY3JlYXRlKTsKLUVYUE9SVF9TWU1CT0wobmVpZ2hfZGVsZXRlKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfZGVzdHJveSk7Ci1FWFBPUlRfU1lNQk9MKG5laWdoX2R1bXBfaW5mbyk7CiBFWFBPUlRfU1lNQk9MKG5laWdoX2V2ZW50X25zKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfaWZkb3duKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfbG9va3VwKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggNGNiYjEyOS4uMjIxYTY0YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTM1Miw4ICszNTIsOCBAQAogCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlpZiAoZGV2X2lzYWxpdmUoZGV2KSkgewotCQlpZihkZXYtPndpcmVsZXNzX2hhbmRsZXJzICYmCi0JCSAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykKKwkJaWYgKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgJiYKKwkJICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykKIAkJCWl3ID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CiAJCWlmIChpdyAhPSBOVUxMKQogCQkJcmV0ID0gKCpmb3JtYXQpKGl3LCBidWYpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IDQ1ODFlY2UuLmIzMTY0MzUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlfX3dzdW0gcHN1bTsKIAotCWlmICh1aC0+Y2hlY2sgPT0gMCB8fCBza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKKwlpZiAodWgtPmNoZWNrID09IDAgfHwgc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJcmV0dXJuIDA7CiAKIAlwc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLCBkYWRkciwgdWxlbiwgSVBQUk9UT19VRFAsIDApOwpAQCAtMjkzLDEwICsyOTMsMTIgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuOwogCi0JbWVtY3B5KHNrYi0+ZGF0YSwgbXNnLCBsZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbXNnLCBsZW4pOwogCXNrYi0+bGVuICs9IGxlbjsKIAotCXNrYi0+aC51aCA9IHVkcGggPSAoc3RydWN0IHVkcGhkciAqKSBza2JfcHVzaChza2IsIHNpemVvZigqdWRwaCkpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCp1ZHBoKSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwl1ZHBoID0gdWRwX2hkcihza2IpOwogCXVkcGgtPnNvdXJjZSA9IGh0b25zKG5wLT5sb2NhbF9wb3J0KTsKIAl1ZHBoLT5kZXN0ID0gaHRvbnMobnAtPnJlbW90ZV9wb3J0KTsKIAl1ZHBoLT5sZW4gPSBodG9ucyh1ZHBfbGVuKTsKQEAgLTMwOCw3ICszMTAsOSBAQAogCWlmICh1ZHBoLT5jaGVjayA9PSAwKQogCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwogCi0Jc2tiLT5uaC5pcGggPSBpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCBzaXplb2YoKmlwaCkpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCppcGgpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAogCS8qIGlwaC0+dmVyc2lvbiA9IDQ7IGlwaC0+aWhsID0gNTsgKi8KIAlwdXRfdW5hbGlnbmVkKDB4NDUsICh1bnNpZ25lZCBjaGFyICopaXBoKTsKQEAgLTMyNCw3ICszMjgsNyBAQAogCWlwaC0+Y2hlY2sgICAgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBldGgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CiAJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIG5wLT5sb2NhbF9tYWMsIDYpOwogCW1lbWNweShldGgtPmhfZGVzdCwgbnAtPnJlbW90ZV9tYWMsIDYpOwpAQCAtMzU5LDggKzM2Myw5IEBACiAJCQkJICgyICogc2l6ZW9mKHUzMikpKSkpCiAJCXJldHVybjsKIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKLQlhcnAgPSBza2ItPm5oLmFycGg7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlhcnAgPSBhcnBfaGRyKHNrYik7CiAKIAlpZiAoKGFycC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikgJiYKIAkgICAgIGFycC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9JRUVFODAyKSkgfHwKQEAgLTM4OSw3ICszOTQsNyBAQAogCWlmICghc2VuZF9za2IpCiAJCXJldHVybjsKIAotCXNlbmRfc2tiLT5uaC5yYXcgPSBzZW5kX3NrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2VuZF9za2IpOwogCWFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNrYl9wdXQoc2VuZF9za2IsIHNpemUpOwogCXNlbmRfc2tiLT5kZXYgPSBza2ItPmRldjsKIAlzZW5kX3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOwpAQCAtNDQzLDcgKzQ0OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogY2hlY2sgaWYgbmV0cG9sbCBjbGllbnRzIG5lZWQgQVJQICovCi0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApICYmCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQVJQKSAmJgogCSAgICBhdG9taWNfcmVhZCgmdHJhcHBlZCkpIHsKIAkJc2tiX3F1ZXVlX3RhaWwoJm5waS0+YXJwX3R4LCBza2IpOwogCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggNGIwMTQ5Ni4uYjkyYTMyMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTE2NCwxNCArMTY0LDExIEBACiAKICNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42ODogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCiAKLS8qICNkZWZpbmUgUEdfREVCVUcoYSkgYSAqLwotI2RlZmluZSBQR19ERUJVRyhhKQotCiAvKiBUaGUgYnVja2V0cyBhcmUgZXhwb25lbnRpYWwgaW4gJ3dpZHRoJyAqLwogI2RlZmluZSBMQVRfQlVDS0VUU19NQVggMzIKICNkZWZpbmUgSVBfTkFNRV9TWiAzMgogI2RlZmluZSBNQVhfTVBMU19MQUJFTFMgMTYgLyogVGhpcyBpcyB0aGUgbWF4IGxhYmVsIHN0YWNrIGRlcHRoICovCi0jZGVmaW5lIE1QTFNfU1RBQ0tfQk9UVE9NIF9fY29uc3RhbnRfaHRvbmwoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBMU19TVEFDS19CT1RUT00gaHRvbmwoMHgwMDAwMDEwMCkKIAogLyogRGV2aWNlIGZsYWcgYml0cyAqLwogI2RlZmluZSBGX0lQU1JDX1JORCAgICgxPDwwKQkvKiBJUC1TcmMgUmFuZG9tICAqLwpAQCAtMjE0LDE1ICsyMTEsMTEgQEAKIH07CiAKIHN0cnVjdCBwa3RnZW5fZGV2IHsKLQogCS8qCiAJICogVHJ5IHRvIGtlZXAgZnJlcXVlbnQvaW5mcmVxdWVudCB1c2VkIHZhcnMuIHNlcGFyYXRlZC4KIAkgKi8KLQotCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKLQljaGFyIHJlc3VsdFs1MTJdOwotCi0Jc3RydWN0IHBrdGdlbl90aHJlYWQgKnBnX3RocmVhZDsJLyogdGhlIG93bmVyICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsJLyogcHJvYyBmaWxlICovCisJc3RydWN0IHBrdGdlbl90aHJlYWQgKnBnX3RocmVhZDsvKiB0aGUgb3duZXIgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBVc2VkIGZvciBjaGFpbmluZyBpbiB0aGUgdGhyZWFkJ3MgcnVuLXF1ZXVlICovCiAKIAlpbnQgcnVubmluZzsJCS8qIGlmIHRoaXMgY2hhbmdlcyB0byBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBzdG9wICovCkBAIC0zNDksNiArMzQyLDggQEAKIAl1bnNpZ25lZCBjZmxvd3M7CS8qIENvbmN1cnJlbnQgZmxvd3MgKGNvbmZpZykgKi8KIAl1bnNpZ25lZCBsZmxvdzsJCS8qIEZsb3cgbGVuZ3RoICAoY29uZmlnKSAqLwogCXVuc2lnbmVkIG5mbG93czsJLyogYWNjdW11bGF0ZWQgZmxvd3MgKHN0YXRzKSAqLworCisJY2hhciByZXN1bHRbNTEyXTsKIH07CiAKIHN0cnVjdCBwa3RnZW5faGRyIHsKQEAgLTQ2OCwxNyArNDYzLDYgQEAKIAlyZXR1cm4gdG1wOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBwa3RnZW5fcmFuZG9tKHZvaWQpCi17Ci0jaWYgMAotCV9fdTMyIG47Ci0JZ2V0X3JhbmRvbV9ieXRlcygmbiwgNCk7Ci0JcmV0dXJuIG47Ci0jZWxzZQotCXJldHVybiBuZXRfcmFuZG9tKCk7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSBfX3U2NCBnZXRDdXJNcyh2b2lkKQogewogCXN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtNTEyLDcgKzQ5Niw3IEBACiBzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7CiBzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCk7CiBzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpOwotc3RhdGljIGludCBwa3RnZW5fbWFya19kZXZpY2UoY29uc3QgY2hhciAqaWZuYW1lKTsKKwogc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2lwNihjb25zdCBjaGFyICpzLCBjaGFyIGlwWzE2XSk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGZtdF9pcDYoY2hhciAqcywgY29uc3QgY2hhciBpcFsxNl0pOwogCkBAIC02MDYsNyArNTkwLDcgQEAKIAkJICAgIiAgICAgZnJhZ3M6ICVkICBkZWxheTogJXUgIGNsb25lX3NrYjogJWQgIGlmbmFtZTogJXNcbiIsCiAJCSAgIHBrdF9kZXYtPm5mcmFncywKIAkJICAgMTAwMCAqIHBrdF9kZXYtPmRlbGF5X3VzICsgcGt0X2Rldi0+ZGVsYXlfbnMsCi0JCSAgIHBrdF9kZXYtPmNsb25lX3NrYiwgcGt0X2Rldi0+aWZuYW1lKTsKKwkJICAgcGt0X2Rldi0+Y2xvbmVfc2tiLCBwa3RfZGV2LT5vZGV2LT5uYW1lKTsKIAogCXNlcV9wcmludGYoc2VxLCAiICAgICBmbG93czogJXUgZmxvd2xlbjogJXVcbiIsIHBrdF9kZXYtPmNmbG93cywKIAkJICAgcGt0X2Rldi0+bGZsb3cpOwpAQCAtNjYxLDcgKzY0NSw3IEBACiAJaWYgKHBrdF9kZXYtPm5yX2xhYmVscykgewogCQl1bnNpZ25lZCBpOwogCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgbXBsczogIik7Ci0JCWZvcihpID0gMDsgaSA8IHBrdF9kZXYtPm5yX2xhYmVsczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBpKyspCiAJCQlzZXFfcHJpbnRmKHNlcSwgIiUwOHglcyIsIG50b2hsKHBrdF9kZXYtPmxhYmVsc1tpXSksCiAJCQkJICAgaSA9PSBwa3RfZGV2LT5ucl9sYWJlbHMtMSA/ICJcbiIgOiAiLCAiKTsKIAl9CkBAIC03NjYsNyArNzUwLDcgQEAKIAlpbnQgaSA9IDA7CiAJKm51bSA9IDA7CiAKLQlmb3IoOyBpIDwgbWF4bGVuOyBpKyspIHsKKwlmb3IgKDsgaSA8IG1heGxlbjsgaSsrKSB7CiAJCWNoYXIgYzsKIAkJKm51bSA8PD0gNDsKIAkJaWYgKGdldF91c2VyKGMsICZ1c2VyX2J1ZmZlcltpXSkpCkBAIC04MDIsNyArNzg2LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ290byBkb25lOwotCQl9OworCQl9CiAJfQogZG9uZToKIAlyZXR1cm4gaTsKQEAgLTg0NSw3ICs4MjksNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIGRvbmVfc3RyOgogCXJldHVybiBpOwpAQCAtODc0LDcgKzg1OCw3IEBACiAJCW4rKzsKIAkJaWYgKG4gPj0gTUFYX01QTFNfTEFCRUxTKQogCQkJcmV0dXJuIC1FMkJJRzsKLQl9IHdoaWxlKGMgPT0gJywnKTsKKwl9IHdoaWxlIChjID09ICcsJyk7CiAKIAlwa3RfZGV2LT5ucl9sYWJlbHMgPSBuOwogCXJldHVybiBpOwpAQCAtMTUwMyw3ICsxNDg3LDcgQEAKIAkJaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQogCQlpICs9IGxlbjsKIAkJb2Zmc2V0ID0gc3ByaW50ZihwZ19yZXN1bHQsICJPSzogbXBscz0iKTsKLQkJZm9yKG4gPSAwOyBuIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBuKyspCisJCWZvciAobiA9IDA7IG4gPCBwa3RfZGV2LT5ucl9sYWJlbHM7IG4rKykKIAkJCW9mZnNldCArPSBzcHJpbnRmKHBnX3Jlc3VsdCArIG9mZnNldCwKIAkJCQkJICAiJTA4eCVzIiwgbnRvaGwocGt0X2Rldi0+bGFiZWxzW25dKSwKIAkJCQkJICBuID09IHBrdF9kZXYtPm5yX2xhYmVscy0xID8gIiIgOiAiLCIpOwpAQCAtMTY5NywxMyArMTY4MSwxMyBAQAogCWlmX2xvY2sodCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwa3RfZGV2LCAmdC0+aWZfbGlzdCwgbGlzdCkKIAkJaWYgKHBrdF9kZXYtPnJ1bm5pbmcpCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPmlmbmFtZSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPm9kZXYtPm5hbWUpOwogCiAJc2VxX3ByaW50ZihzZXEsICJcblN0b3BwZWQ6ICIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwa3RfZGV2LCAmdC0+aWZfbGlzdCwgbGlzdCkKIAkJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKQotCQkJc2VxX3ByaW50ZihzZXEsICIlcyAiLCBwa3RfZGV2LT5pZm5hbWUpOworCQkJc2VxX3ByaW50ZihzZXEsICIlcyAiLCBwa3RfZGV2LT5vZGV2LT5uYW1lKTsKIAogCWlmICh0LT5yZXN1bHRbMF0pCiAJCXNlcV9wcmludGYoc2VxLCAiXG5SZXN1bHQ6ICVzXG4iLCB0LT5yZXN1bHQpOwpAQCAtMTg0OSwxNiArMTgzMywxNCBAQAogLyoKICAqIG1hcmsgYSBkZXZpY2UgZm9yIHJlbW92YWwKICAqLwotc3RhdGljIGludCBwa3RnZW5fbWFya19kZXZpY2UoY29uc3QgY2hhciAqaWZuYW1lKQorc3RhdGljIHZvaWQgcGt0Z2VuX21hcmtfZGV2aWNlKGNvbnN0IGNoYXIgKmlmbmFtZSkKIHsKIAlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CiAJY29uc3QgaW50IG1heF90cmllcyA9IDEwLCBtc2VjX3Blcl90cnkgPSAxMjU7CiAJaW50IGkgPSAwOwotCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmcGt0Z2VuX3RocmVhZF9sb2NrKTsKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogcGt0Z2VuX21hcmtfZGV2aWNlIG1hcmtpbmcgJXMgZm9yIHJlbW92YWxcbiIsCi0JCQlpZm5hbWUpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBwa3RnZW5fbWFya19kZXZpY2UgbWFya2luZyAlcyBmb3IgcmVtb3ZhbFxuIiwgaWZuYW1lKTsKIAogCXdoaWxlICgxKSB7CiAKQEAgLTE4NjcsOCArMTg0OSw4IEBACiAJCQlicmVhazsJLyogc3VjY2VzcyAqLwogCiAJCW11dGV4X3VubG9jaygmcGt0Z2VuX3RocmVhZF9sb2NrKTsKLQkJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IHBrdGdlbl9tYXJrX2RldmljZSB3YWl0aW5nIGZvciAlcyAiCi0JCQkJInRvIGRpc2FwcGVhci4uLi5cbiIsIGlmbmFtZSkpOworCQlwcl9kZWJ1ZygicGt0Z2VuOiBwa3RnZW5fbWFya19kZXZpY2Ugd2FpdGluZyBmb3IgJXMgIgorCQkJCSJ0byBkaXNhcHBlYXIuLi4uXG4iLCBpZm5hbWUpOwogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhtc2VjX3Blcl90cnkpKTsKIAkJbXV0ZXhfbG9jaygmcGt0Z2VuX3RocmVhZF9sb2NrKTsKIApAQCAtMTg3Niw3OSArMTg1OCw5MSBAQAogCQkJcHJpbnRrKCJwa3RnZW5fbWFya19kZXZpY2U6IHRpbWVkIG91dCBhZnRlciB3YWl0aW5nICIKIAkJCSAgICAgICAiJWQgbXNlYyBmb3IgZGV2aWNlICVzIHRvIGJlIHJlbW92ZWRcbiIsCiAJCQkgICAgICAgbXNlY19wZXJfdHJ5ICogaSwgaWZuYW1lKTsKLQkJCXJldCA9IDE7CiAJCQlicmVhazsKIAkJfQogCiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOworfQogCi0JcmV0dXJuIHJldDsKK3N0YXRpYyB2b2lkIHBrdGdlbl9jaGFuZ2VfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmcGt0Z2VuX3RocmVhZHMsIHRoX2xpc3QpIHsKKwkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwa3RfZGV2LCAmdC0+aWZfbGlzdCwgbGlzdCkgeworCQkJaWYgKHBrdF9kZXYtPm9kZXYgIT0gZGV2KQorCQkJCWNvbnRpbnVlOworCisJCQlyZW1vdmVfcHJvY19lbnRyeShwa3RfZGV2LT5lbnRyeS0+bmFtZSwgcGdfcHJvY19kaXIpOworCisJCQlwa3RfZGV2LT5lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgMDYwMCwKKwkJCQkJCQkgICBwZ19wcm9jX2Rpcik7CisJCQlpZiAoIXBrdF9kZXYtPmVudHJ5KQorCQkJCXByaW50ayhLRVJOX0VSUiAicGt0Z2VuOiBjYW4ndCBtb3ZlIHByb2MgIgorCQkJCSAgICAgICAiIGVudHJ5IGZvciAnJXMnXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CiB9CiAKIHN0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKShwdHIpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CiAKIAkvKiBJdCBpcyBPSyB0aGF0IHdlIGRvIG5vdCBob2xkIHRoZSBncm91cCBsb2NrIHJpZ2h0IG5vdywKIAkgKiBhcyB3ZSBydW4gdW5kZXIgdGhlIFJUTkwgbG9jay4KIAkgKi8KIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIE5FVERFVl9DSEFOR0VBRERSOgotCWNhc2UgTkVUREVWX0dPSU5HX0RPV046Ci0JY2FzZSBORVRERVZfRE9XTjoKLQljYXNlIE5FVERFVl9VUDoKLQkJLyogSWdub3JlIGZvciBub3cgKi8KKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQlwa3RnZW5fY2hhbmdlX25hbWUoZGV2KTsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgogCQlwa3RnZW5fbWFya19kZXZpY2UoZGV2LT5uYW1lKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKIC8qIEFzc29jaWF0ZSBwa3RnZW5fZGV2IHdpdGggYSBkZXZpY2UuICovCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcGt0Z2VuX3NldHVwX2RldihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKK3N0YXRpYyBpbnQgcGt0Z2VuX3NldHVwX2RldihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwgY29uc3QgY2hhciAqaWZuYW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2OworCWludCBlcnI7CiAKIAkvKiBDbGVhbiBvbGQgc2V0dXBzICovCi0KIAlpZiAocGt0X2Rldi0+b2RldikgewogCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOwogCQlwa3RfZGV2LT5vZGV2ID0gTlVMTDsKIAl9CiAKLQlvZGV2ID0gZGV2X2dldF9ieV9uYW1lKHBrdF9kZXYtPmlmbmFtZSk7Ci0KKwlvZGV2ID0gZGV2X2dldF9ieV9uYW1lKGlmbmFtZSk7CiAJaWYgKCFvZGV2KSB7Ci0JCXByaW50aygicGt0Z2VuOiBubyBzdWNoIG5ldGRldmljZTogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwotCQlnb3RvIG91dDsKKwkJcHJpbnRrKCJwa3RnZW46IG5vIHN1Y2ggbmV0ZGV2aWNlOiBcIiVzXCJcbiIsIGlmbmFtZSk7CisJCXJldHVybiAtRU5PREVWOwogCX0KKwogCWlmIChvZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikgewotCQlwcmludGsoInBrdGdlbjogbm90IGFuIGV0aGVybmV0IGRldmljZTogXCIlc1wiXG4iLAotCQkgICAgICAgcGt0X2Rldi0+aWZuYW1lKTsKLQkJZ290byBvdXRfcHV0OworCQlwcmludGsoInBrdGdlbjogbm90IGFuIGV0aGVybmV0IGRldmljZTogXCIlc1wiXG4iLCBpZm5hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoIW5ldGlmX3J1bm5pbmcob2RldikpIHsKKwkJcHJpbnRrKCJwa3RnZW46IGRldmljZSBpcyBkb3duOiBcIiVzXCJcbiIsIGlmbmFtZSk7CisJCWVyciA9IC1FTkVURE9XTjsKKwl9IGVsc2UgeworCQlwa3RfZGV2LT5vZGV2ID0gb2RldjsKKwkJcmV0dXJuIDA7CiAJfQotCWlmICghbmV0aWZfcnVubmluZyhvZGV2KSkgewotCQlwcmludGsoInBrdGdlbjogZGV2aWNlIGlzIGRvd246IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKLQkJZ290byBvdXRfcHV0OwotCX0KLQlwa3RfZGV2LT5vZGV2ID0gb2RldjsKIAotCXJldHVybiBwa3RfZGV2LT5vZGV2OwotCi1vdXRfcHV0OgogCWRldl9wdXQob2Rldik7Ci1vdXQ6Ci0JcmV0dXJuIE5VTEw7Ci0KKwlyZXR1cm4gZXJyOwogfQogCiAvKiBSZWFkIHBrdF9kZXYgZnJvbSB0aGUgaW50ZXJmYWNlIGFuZCBzZXQgdXAgaW50ZXJuYWwgcGt0Z2VuX2RldgpAQCAtMTk1NiwxMCArMTk1MCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBrdGdlbl9zZXR1cF9pbmplY3Qoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7Ci0JLyogVHJ5IG9uY2UgbW9yZSwganVzdCBpbiBjYXNlIGl0IHdvcmtzIG5vdy4gKi8KLQlpZiAoIXBrdF9kZXYtPm9kZXYpCi0JCXBrdGdlbl9zZXR1cF9kZXYocGt0X2Rldik7Ci0KIAlpZiAoIXBrdF9kZXYtPm9kZXYpIHsKIAkJcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LApAQCAtMjA5Niw3ICsyMDg2LDcgQEAKIAlpbnQgZmxvdyA9IDA7CiAKIAlpZiAocGt0X2Rldi0+Y2Zsb3dzKSB7Ci0JCWZsb3cgPSBwa3RnZW5fcmFuZG9tKCkgJSBwa3RfZGV2LT5jZmxvd3M7CisJCWZsb3cgPSByYW5kb20zMigpICUgcGt0X2Rldi0+Y2Zsb3dzOwogCiAJCWlmIChwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCA+IHBrdF9kZXYtPmxmbG93KQogCQkJcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgPSAwOwpAQCAtMjEwOCw3ICsyMDk4LDcgQEAKIAkJX191MzIgdG1wOwogCiAJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDU1JDX1JORCkKLQkJCW1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPnNyY19tYWNfY291bnQpOworCQkJbWMgPSByYW5kb20zMigpICUgcGt0X2Rldi0+c3JjX21hY19jb3VudDsKIAkJZWxzZSB7CiAJCQltYyA9IHBrdF9kZXYtPmN1cl9zcmNfbWFjX29mZnNldCsrOwogCQkJaWYgKHBrdF9kZXYtPmN1cl9zcmNfbWFjX29mZnNldCA+CkBAIC0yMTM0LDcgKzIxMjQsNyBAQAogCQlfX3UzMiB0bXA7CiAKIAkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNEU1RfUk5EKQotCQkJbWMgPSBwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+ZHN0X21hY19jb3VudCk7CisJCQltYyA9IHJhbmRvbTMyKCkgJSBwa3RfZGV2LT5kc3RfbWFjX2NvdW50OwogCiAJCWVsc2UgewogCQkJbWMgPSBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQrKzsKQEAgLTIxNTgsMjcgKzIxNDgsMjYgQEAKIAogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfTVBMU19STkQpIHsKIAkJdW5zaWduZWQgaTsKLQkJZm9yKGkgPSAwOyBpIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykKIAkJCWlmIChwa3RfZGV2LT5sYWJlbHNbaV0gJiBNUExTX1NUQUNLX0JPVFRPTSkKIAkJCQlwa3RfZGV2LT5sYWJlbHNbaV0gPSBNUExTX1NUQUNLX0JPVFRPTSB8Ci0JCQkJCSAgICAgKChfX2ZvcmNlIF9fYmUzMilwa3RnZW5fcmFuZG9tKCkgJgorCQkJCQkgICAgICgoX19mb3JjZSBfX2JlMzIpcmFuZG9tMzIoKSAmCiAJCQkJCQkgICAgICBodG9ubCgweDAwMGZmZmZmKSk7CiAJfQogCiAJaWYgKChwa3RfZGV2LT5mbGFncyAmIEZfVklEX1JORCkgJiYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKSkgewotCQlwa3RfZGV2LT52bGFuX2lkID0gcGt0Z2VuX3JhbmRvbSgpICUgNDA5NjsKKwkJcGt0X2Rldi0+dmxhbl9pZCA9IHJhbmRvbTMyKCkgJiAoNDA5Ni0xKTsKIAl9CiAKIAlpZiAoKHBrdF9kZXYtPmZsYWdzICYgRl9TVklEX1JORCkgJiYgKHBrdF9kZXYtPnN2bGFuX2lkICE9IDB4ZmZmZikpIHsKLQkJcGt0X2Rldi0+c3ZsYW5faWQgPSBwa3RnZW5fcmFuZG9tKCkgJSA0MDk2OworCQlwa3RfZGV2LT5zdmxhbl9pZCA9IHJhbmRvbTMyKCkgJiAoNDA5NiAtIDEpOwogCX0KIAogCWlmIChwa3RfZGV2LT51ZHBfc3JjX21pbiA8IHBrdF9kZXYtPnVkcF9zcmNfbWF4KSB7CiAJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQU1JDX1JORCkKLQkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjID0KLQkJCSAgICAoKHBrdGdlbl9yYW5kb20oKSAlCi0JCQkgICAgICAocGt0X2Rldi0+dWRwX3NyY19tYXggLSBwa3RfZGV2LT51ZHBfc3JjX21pbikpICsKLQkJCSAgICAgcGt0X2Rldi0+dWRwX3NyY19taW4pOworCQkJcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSByYW5kb20zMigpICUKKwkJCQkocGt0X2Rldi0+dWRwX3NyY19tYXggLSBwa3RfZGV2LT51ZHBfc3JjX21pbikKKwkJCQkrIHBrdF9kZXYtPnVkcF9zcmNfbWluOwogCiAJCWVsc2UgewogCQkJcGt0X2Rldi0+Y3VyX3VkcF9zcmMrKzsKQEAgLTIxODksMTAgKzIxNzgsOSBAQAogCiAJaWYgKHBrdF9kZXYtPnVkcF9kc3RfbWluIDwgcGt0X2Rldi0+dWRwX2RzdF9tYXgpIHsKIAkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBEU1RfUk5EKSB7Ci0JCQlwa3RfZGV2LT5jdXJfdWRwX2RzdCA9Ci0JCQkgICAgKChwa3RnZW5fcmFuZG9tKCkgJQotCQkJICAgICAgKHBrdF9kZXYtPnVkcF9kc3RfbWF4IC0gcGt0X2Rldi0+dWRwX2RzdF9taW4pKSArCi0JCQkgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWluKTsKKwkJCXBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gcmFuZG9tMzIoKSAlCisJCQkJKHBrdF9kZXYtPnVkcF9kc3RfbWF4IC0gcGt0X2Rldi0+dWRwX2RzdF9taW4pCisJCQkJKyBwa3RfZGV2LT51ZHBfZHN0X21pbjsKIAkJfSBlbHNlIHsKIAkJCXBrdF9kZXYtPmN1cl91ZHBfZHN0Kys7CiAJCQlpZiAocGt0X2Rldi0+Y3VyX3VkcF9kc3QgPj0gcGt0X2Rldi0+dWRwX2RzdF9tYXgpCkBAIC0yMjA3LDcgKzIxOTUsNyBAQAogCQkJCQkJCSAgICAgICBzYWRkcl9tYXgpKSkgewogCQkJX191MzIgdDsKIAkJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBTUkNfUk5EKQotCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArIGltbik7CisJCQkJdCA9IHJhbmRvbTMyKCkgJSAoaW14IC0gaW1uKSArIGltbjsKIAkJCWVsc2UgewogCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfc2FkZHIpOwogCQkJCXQrKzsKQEAgLTIyMjgsMTQgKzIyMTYsMTMgQEAKIAkJCQlfX2JlMzIgczsKIAkJCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQRFNUX1JORCkgewogCi0JCQkJCXQgPSBwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSArIGltbjsKKwkJCQkJdCA9IHJhbmRvbTMyKCkgJSAoaW14IC0gaW1uKSArIGltbjsKIAkJCQkJcyA9IGh0b25sKHQpOwogCiAJCQkJCXdoaWxlIChMT09QQkFDSyhzKSB8fCBNVUxUSUNBU1QocykKIAkJCQkJICAgICAgIHx8IEJBRENMQVNTKHMpIHx8IFpFUk9ORVQocykKIAkJCQkJICAgICAgIHx8IExPQ0FMX01DQVNUKHMpKSB7Ci0JCQkJCQl0ID0gKHBrdGdlbl9yYW5kb20oKSAlCi0JCQkJCQkgICAgICAoaW14IC0gaW1uKSkgKyBpbW47CisJCQkJCQl0ID0gcmFuZG9tMzIoKSAlIChpbXggLSBpbW4pICsgaW1uOwogCQkJCQkJcyA9IGh0b25sKHQpOwogCQkJCQl9CiAJCQkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IHM7CkBAIC0yMjY3LDcgKzIyNTQsNyBAQAogCiAJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQkJcGt0X2Rldi0+Y3VyX2luNl9kYWRkci5zNl9hZGRyMzJbaV0gPQotCQkJCSAgICAoKChfX2ZvcmNlIF9fYmUzMilwa3RnZW5fcmFuZG9tKCkgfAorCQkJCSAgICAoKChfX2ZvcmNlIF9fYmUzMilyYW5kb20zMigpIHwKIAkJCQkgICAgICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMltpXSkgJgogCQkJCSAgICAgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyMzJbaV0pOwogCQkJfQpAQCAtMjI3Nyw5ICsyMjY0LDkgQEAKIAlpZiAocGt0X2Rldi0+bWluX3BrdF9zaXplIDwgcGt0X2Rldi0+bWF4X3BrdF9zaXplKSB7CiAJCV9fdTMyIHQ7CiAJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfVFhTSVpFX1JORCkgewotCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUKLQkJCSAgICAgIChwa3RfZGV2LT5tYXhfcGt0X3NpemUgLSBwa3RfZGV2LT5taW5fcGt0X3NpemUpKQotCQkJICAgICArIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CisJCQl0ID0gcmFuZG9tMzIoKSAlCisJCQkJKHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSAtIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkKKwkJCQkrIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZTsKIAkJfSBlbHNlIHsKIAkJCXQgPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyAxOwogCQkJaWYgKHQgPiBwa3RfZGV2LT5tYXhfcGt0X3NpemUpCkBAIC0yMjk0LDcgKzIyODEsNyBAQAogc3RhdGljIHZvaWQgbXBsc19wdXNoKF9fYmUzMiAqbXBscywgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CiAJdW5zaWduZWQgaTsKLQlmb3IoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykgewogCQkqbXBscysrID0gcGt0X2Rldi0+bGFiZWxzW2ldICYgfk1QTFNfU1RBQ0tfQk9UVE9NOwogCX0KIAltcGxzLS07CkBAIC0yMzE2LDcgKzIzMDMsNyBAQAogCWludCBkYXRhbGVuLCBpcGxlbjsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgcGt0Z2VuX2hkciAqcGdoID0gTlVMTDsKLQlfX2JlMTYgcHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKKwlfX2JlMTYgcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJX19iZTMyICptcGxzOwogCV9fYmUxNiAqdmxhbl90Y2kgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogRW5jYXBzdWxhdGVzIHByaW9yaXR5IGFuZCBWTEFOIElEICovCiAJX19iZTE2ICp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IE5VTEw7ICAvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAob3IgbGVuKSBmb3IgVkxBTiB0YWcgKi8KQEAgLTIzMjUsMTAgKzIzMTIsMTAgQEAKIAogCiAJaWYgKHBrdF9kZXYtPm5yX2xhYmVscykKLQkJcHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX01QTFNfVUMpOworCQlwcm90b2NvbCA9IGh0b25zKEVUSF9QX01QTFNfVUMpOwogCiAJaWYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKQotCQlwcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOworCQlwcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAogCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCiAJICogZmllbGRzLgpAQCAtMjM1NCwyNCArMjM0MSwyOCBAQAogCQltcGxzX3B1c2gobXBscywgcGt0X2Rldik7CiAKIAlpZiAocGt0X2Rldi0+dmxhbl9pZCAhPSAweGZmZmYpIHsKLQkJaWYocGt0X2Rldi0+c3ZsYW5faWQgIT0gMHhmZmZmKSB7CisJCWlmIChwa3RfZGV2LT5zdmxhbl9pZCAhPSAweGZmZmYpIHsKIAkJCXN2bGFuX3RjaSA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkJKnN2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT5zdmxhbl9pZCwKIAkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX2NmaSwKIAkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX3ApOwogCQkJc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSk7CisJCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CiAJCXZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCSp2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT52bGFuX2lkLAogCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fY2ZpLAogCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fcCk7CiAJCXZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOworCQkqdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CiAJfQogCi0JaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7Ci0JdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+dGFpbDsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKworCWlwaCA9IGlwX2hkcihza2IpOworCXVkcGggPSB1ZHBfaGRyKHNrYik7CiAKIAltZW1jcHkoZXRoLCBwa3RfZGV2LT5oaCwgMTIpOwogCSooX19iZTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOwpAQCAtMjQwMCwxMiArMjM5MSwxMSBAQAogCWlwaC0+Y2hlY2sgPSAwOwogCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHZvaWQgKilpcGgsIGlwaC0+aWhsKTsKIAlza2ItPnByb3RvY29sID0gcHJvdG9jb2w7Ci0Jc2tiLT5tYWMucmF3ID0gKCh1OCAqKSBpcGgpIC0gMTQgLSBwa3RfZGV2LT5ucl9sYWJlbHMqc2l6ZW9mKHUzMikgLQotCQlWTEFOX1RBR19TSVpFKHBrdF9kZXYpIC0gU1ZMQU5fVEFHX1NJWkUocGt0X2Rldik7CisJc2tiLT5tYWNfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgLSBFVEhfSExFTiAtCisJCQkgICBwa3RfZGV2LT5ucl9sYWJlbHMgKiBzaXplb2YodTMyKSAtCisJCQkgICBWTEFOX1RBR19TSVpFKHBrdF9kZXYpIC0gU1ZMQU5fVEFHX1NJWkUocGt0X2RldikpOwogCXNrYi0+ZGV2ID0gb2RldjsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0Jc2tiLT5uaC5pcGggPSBpcGg7Ci0Jc2tiLT5oLnVoID0gdWRwaDsKIAogCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkKIAkJcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopc2tiX3B1dChza2IsIGRhdGFsZW4pOwpAQCAtMjY1NCw3ICsyNjQ0LDcgQEAKIAlpbnQgZGF0YWxlbjsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoOwogCXN0cnVjdCBwa3RnZW5faGRyICpwZ2ggPSBOVUxMOwotCV9fYmUxNiBwcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CisJX19iZTE2IHByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJX19iZTMyICptcGxzOwogCV9fYmUxNiAqdmxhbl90Y2kgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogRW5jYXBzdWxhdGVzIHByaW9yaXR5IGFuZCBWTEFOIElEICovCiAJX19iZTE2ICp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IE5VTEw7ICAvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAob3IgbGVuKSBmb3IgVkxBTiB0YWcgKi8KQEAgLTI2NjIsMTAgKzI2NTIsMTAgQEAKIAlfX2JlMTYgKnN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IE5VTEw7IC8qIHBhY2tldCB0eXBlIElEIGZpZWxkIChvciBsZW4pIGZvciBTVkxBTiB0YWcgKi8KIAogCWlmIChwa3RfZGV2LT5ucl9sYWJlbHMpCi0JCXByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9NUExTX1VDKTsKKwkJcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9NUExTX1VDKTsKIAogCWlmIChwa3RfZGV2LT52bGFuX2lkICE9IDB4ZmZmZikKLQkJcHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKTsKKwkJcHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDIxUSk7CiAKIAkvKiBVcGRhdGUgYW55IG9mIHRoZSB2YWx1ZXMsIHVzZWQgd2hlbiB3ZSdyZSBpbmNyZW1lbnRpbmcgdmFyaW91cwogCSAqIGZpZWxkcy4KQEAgLTI2OTAsMjQgKzI2ODAsMjggQEAKIAkJbXBsc19wdXNoKG1wbHMsIHBrdF9kZXYpOwogCiAJaWYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKSB7Ci0JCWlmKHBrdF9kZXYtPnN2bGFuX2lkICE9IDB4ZmZmZikgeworCQlpZiAocGt0X2Rldi0+c3ZsYW5faWQgIT0gMHhmZmZmKSB7CiAJCQlzdmxhbl90Y2kgPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKIAkJCSpzdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+c3ZsYW5faWQsCiAJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9jZmksCiAJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9wKTsKIAkJCXN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwotCQkJKnN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOworCQkJKnN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAkJfQogCQl2bGFuX3RjaSA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkqdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+dmxhbl9pZCwKIAkJCQkgICAgICBwa3RfZGV2LT52bGFuX2NmaSwKIAkJCQkgICAgICBwa3RfZGV2LT52bGFuX3ApOwogCQl2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwotCQkqdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOworCQkqdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKIAl9CiAKLQlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0JdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+dGFpbDsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisKKwlpcGggPSBpcHY2X2hkcihza2IpOworCXVkcGggPSB1ZHBfaGRyKHNrYik7CiAKIAltZW1jcHkoZXRoLCBwa3RfZGV2LT5oaCwgMTIpOwogCSooX19iZTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOwpAQCAtMjcyOSw3ICsyNzIzLDcgQEAKIAl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKIAl1ZHBoLT5jaGVjayA9IDA7CS8qIE5vIGNoZWNrc3VtICovCiAKLQkqKF9fYmUzMiAqKSBpcGggPSBfX2NvbnN0YW50X2h0b25sKDB4NjAwMDAwMDApOwkvKiBWZXJzaW9uICsgZmxvdyAqLworCSooX19iZTMyICopIGlwaCA9IGh0b25sKDB4NjAwMDAwMDApOwkvKiBWZXJzaW9uICsgZmxvdyAqLwogCiAJaWYgKHBrdF9kZXYtPnRyYWZmaWNfY2xhc3MpIHsKIAkJLyogVmVyc2lvbiArIHRyYWZmaWMgY2xhc3MgKyBmbG93ICgwKSAqLwpAQCAtMjc0NCwxMyArMjczOCwxMiBAQAogCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9kYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZwa3RfZGV2LT5jdXJfaW42X3NhZGRyKTsKIAotCXNrYi0+bWFjLnJhdyA9ICgodTggKikgaXBoKSAtIDE0IC0gcGt0X2Rldi0+bnJfbGFiZWxzKnNpemVvZih1MzIpIC0KLQkJVkxBTl9UQUdfU0laRShwa3RfZGV2KSAtIFNWTEFOX1RBR19TSVpFKHBrdF9kZXYpOworCXNrYi0+bWFjX2hlYWRlciA9IChza2ItPm5ldHdvcmtfaGVhZGVyIC0gRVRIX0hMRU4gLQorCQkJICAgcGt0X2Rldi0+bnJfbGFiZWxzICogc2l6ZW9mKHUzMikgLQorCQkJICAgVkxBTl9UQUdfU0laRShwa3RfZGV2KSAtIFNWTEFOX1RBR19TSVpFKHBrdF9kZXYpKTsKIAlza2ItPnByb3RvY29sID0gcHJvdG9jb2w7CiAJc2tiLT5kZXYgPSBvZGV2OwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQlza2ItPm5oLmlwdjZoID0gaXBoOwotCXNrYi0+aC51aCA9IHVkcGg7CiAKIAlpZiAocGt0X2Rldi0+bmZyYWdzIDw9IDApCiAJCXBnaCA9IChzdHJ1Y3QgcGt0Z2VuX2hkciAqKXNrYl9wdXQoc2tiLCBkYXRhbGVuKTsKQEAgLTI4NDgsNyArMjg0MSw3IEBACiAJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CiAJaW50IHN0YXJ0ZWQgPSAwOwogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9ydW4uICVwXG4iLCB0KSk7CisJcHJfZGVidWcoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bi4gJXBcbiIsIHQpOwogCiAJaWZfbG9jayh0KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdF9kZXYsICZ0LT5pZl9saXN0LCBsaXN0KSB7CkBAIC0yODgwLDcgKzI4NzMsNyBAQAogewogCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OwogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcy5cbiIpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnMuXG4iKTsKIAogCW11dGV4X2xvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7CiAKQEAgLTI5NDgsNyArMjk0MSw3IEBACiB7CiAJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcy5cbiIpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIik7CiAKIAltdXRleF9sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwogCkBAIC0zMDA2LDcgKzI5OTksNyBAQAogCiAJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKSB7CiAJCXByaW50aygicGt0Z2VuOiBpbnRlcmZhY2U6ICVzIGlzIGFscmVhZHkgc3RvcHBlZFxuIiwKLQkJICAgICAgIHBrdF9kZXYtPmlmbmFtZSk7CisJCSAgICAgICBwa3RfZGV2LT5vZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMDQwLDcgKzMwMzMsNyBAQAogewogCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2OwogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wXG4iKSk7CisJcHJfZGVidWcoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3BcbiIpOwogCiAJaWZfbG9jayh0KTsKIApAQCAtMzA2NCw3ICszMDU3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxLCAqbjsKIAlzdHJ1Y3QgcGt0Z2VuX2RldiAqY3VyOwogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9yZW1fb25lX2lmXG4iKSk7CisJcHJfZGVidWcoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3JlbV9vbmVfaWZcbiIpOwogCiAJaWZfbG9jayh0KTsKIApAQCAtMzA5Myw3ICszMDg2LDcgQEAKIAogCS8qIFJlbW92ZSBhbGwgZGV2aWNlcywgZnJlZSBtZW0gKi8KIAotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcmVtX2FsbF9pZnNcbiIpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcmVtX2FsbF9pZnNcbiIpOwogCWlmX2xvY2sodCk7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocSwgbiwgJnQtPmlmX2xpc3QpIHsKQEAgLTMyNzYsNyArMzI2OSw3IEBACiAKIAl0LT5waWQgPSBjdXJyZW50LT5waWQ7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogc3RhcnRpbmcgcGt0Z2VuLyVkOiAgcGlkPSVkXG4iLCBjcHUsIGN1cnJlbnQtPnBpZCkpOworCXByX2RlYnVnKCJwa3RnZW46IHN0YXJ0aW5nIHBrdGdlbi8lZDogIHBpZD0lZFxuIiwgY3B1LCBjdXJyZW50LT5waWQpOwogCiAJbWF4X2JlZm9yZV9zb2Z0aXJxID0gdC0+bWF4X2JlZm9yZV9zb2Z0aXJxOwogCkBAIC0zMzM5LDEzICszMzMyLDEzIEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46ICVzIHN0b3BwaW5nIGFsbCBkZXZpY2VcbiIsIHQtPnRzay0+Y29tbSkpOworCXByX2RlYnVnKCJwa3RnZW46ICVzIHN0b3BwaW5nIGFsbCBkZXZpY2VcbiIsIHQtPnRzay0+Y29tbSk7CiAJcGt0Z2VuX3N0b3AodCk7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKSk7CisJcHJfZGVidWcoInBrdGdlbjogJXMgcmVtb3ZpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKTsKIAlwa3RnZW5fcmVtX2FsbF9pZnModCk7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgdGhyZWFkLlxuIiwgdC0+dHNrLT5jb21tKSk7CisJcHJfZGVidWcoInBrdGdlbjogJXMgcmVtb3ZpbmcgdGhyZWFkLlxuIiwgdC0+dHNrLT5jb21tKTsKIAlwa3RnZW5fcmVtX3RocmVhZCh0KTsKIAogCXJldHVybiAwOwpAQCAtMzM1OCwxMyArMzM1MSwxMyBAQAogCWlmX2xvY2sodCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0LT5pZl9saXN0LCBsaXN0KQotCQlpZiAoc3RybmNtcChwLT5pZm5hbWUsIGlmbmFtZSwgSUZOQU1TSVopID09IDApIHsKKwkJaWYgKHN0cm5jbXAocC0+b2Rldi0+bmFtZSwgaWZuYW1lLCBJRk5BTVNJWikgPT0gMCkgewogCQkJcGt0X2RldiA9IHA7CiAJCQlicmVhazsKIAkJfQogCiAJaWZfdW5sb2NrKHQpOwotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBmaW5kX2RldiglcykgcmV0dXJuaW5nICVwXG4iLCBpZm5hbWUsIHBrdF9kZXYpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBmaW5kX2RldiglcykgcmV0dXJuaW5nICVwXG4iLCBpZm5hbWUsIHBrdF9kZXYpOwogCXJldHVybiBwa3RfZGV2OwogfQogCkBAIC0zMzk5LDcgKzMzOTIsNyBAQAogc3RhdGljIGludCBwa3RnZW5fYWRkX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgY29uc3QgY2hhciAqaWZuYW1lKQogewogCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2OwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisJaW50IGVycjsKIAogCS8qIFdlIGRvbid0IGFsbG93IGEgZGV2aWNlIHRvIGJlIG9uIHNldmVyYWwgdGhyZWFkcyAqLwogCkBAIC0zNDQxLDI5ICszNDM0LDI4IEBACiAJcGt0X2Rldi0+c3ZsYW5fY2ZpID0gMDsKIAlwa3RfZGV2LT5zdmxhbl9pZCA9IDB4ZmZmZjsKIAotCXN0cm5jcHkocGt0X2Rldi0+aWZuYW1lLCBpZm5hbWUsIElGTkFNU0laKTsKKwllcnIgPSBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYsIGlmbmFtZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOwogCi0JaWYgKCFwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpKSB7Ci0JCXByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0Z2VuX3NldHVwX2RldiBmYWlsZWQuXG4iKTsKLQkJaWYgKHBrdF9kZXYtPmZsb3dzKQotCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwotCQlrZnJlZShwa3RfZGV2KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcGUgPSBjcmVhdGVfcHJvY19lbnRyeShpZm5hbWUsIDA2MDAsIHBnX3Byb2NfZGlyKTsKLQlpZiAoIXBlKSB7CisJcGt0X2Rldi0+ZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShpZm5hbWUsIDA2MDAsIHBnX3Byb2NfZGlyKTsKKwlpZiAoIXBrdF9kZXYtPmVudHJ5KSB7CiAJCXByaW50aygicGt0Z2VuOiBjYW5ub3QgY3JlYXRlICVzLyVzIHByb2NmcyBlbnRyeS5cbiIsCiAJCSAgICAgICBQR19QUk9DX0RJUiwgaWZuYW1lKTsKLQkJaWYgKHBrdF9kZXYtPmZsb3dzKQotCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwotCQlrZnJlZShwa3RfZGV2KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0MjsKIAl9Ci0JcGUtPnByb2NfZm9wcyA9ICZwa3RnZW5faWZfZm9wczsKLQlwZS0+ZGF0YSA9IHBrdF9kZXY7CisJcGt0X2Rldi0+ZW50cnktPnByb2NfZm9wcyA9ICZwa3RnZW5faWZfZm9wczsKKwlwa3RfZGV2LT5lbnRyeS0+ZGF0YSA9IHBrdF9kZXY7CiAKIAlyZXR1cm4gYWRkX2Rldl90b190aHJlYWQodCwgcGt0X2Rldik7CitvdXQyOgorCWRldl9wdXQocGt0X2Rldi0+b2Rldik7CitvdXQxOgorCWlmIChwa3RfZGV2LT5mbG93cykKKwkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOworCWtmcmVlKHBrdF9kZXYpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBrdGdlbl9jcmVhdGVfdGhyZWFkKGludCBjcHUpCkBAIC0zNTMzLDcgKzM1MjUsNyBAQAogCQkJCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQogewogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IHJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2RldikpOworCXByX2RlYnVnKCJwa3RnZW46IHJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2Rldik7CiAKIAlpZiAocGt0X2Rldi0+cnVubmluZykgewogCQlwcmludGsoInBrdGdlbjpXQVJOSU5HOiB0cnlpbmcgdG8gcmVtb3ZlIGEgcnVubmluZyBpbnRlcmZhY2UsIHN0b3BwaW5nIGl0IG5vdy5cbiIpOwpAQCAtMzU1MSw5ICszNTQzLDggQEAKIAogCV9yZW1fZGV2X2Zyb21faWZfbGlzdCh0LCBwa3RfZGV2KTsKIAotCS8qIENsZWFuIHVwIHByb2MgZmlsZSBzeXN0ZW0gKi8KLQotCXJlbW92ZV9wcm9jX2VudHJ5KHBrdF9kZXYtPmlmbmFtZSwgcGdfcHJvY19kaXIpOworCWlmIChwa3RfZGV2LT5lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkocGt0X2Rldi0+ZW50cnktPm5hbWUsIHBnX3Byb2NfZGlyKTsKIAogCWlmIChwa3RfZGV2LT5mbG93cykKIAkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCAzM2VhOGVhLi5jZWMxMTExIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtNTAsMTEgKzUwLDEzIEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgotI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+Ci0jaWZkZWYgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksKLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jZW5kaWYJLyogQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgKi8KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CisKK3N0cnVjdCBydG5sX2xpbmsKK3sKKwlydG5sX2RvaXRfZnVuYwkJZG9pdDsKKwlydG5sX2R1bXBpdF9mdW5jCWR1bXBpdDsKK307CiAKIHN0YXRpYyBERUZJTkVfTVVURVgocnRubF9tdXRleCk7CiBzdGF0aWMgc3RydWN0IHNvY2sgKnJ0bmw7CkBAIC05NSw3ICs5NywxNTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHJ0bmV0bGlua19saW5rICogcnRuZXRsaW5rX2xpbmtzW05QUk9UT107CitzdGF0aWMgc3RydWN0IHJ0bmxfbGluayAqcnRubF9tc2dfaGFuZGxlcnNbTlBST1RPXTsKKworc3RhdGljIGlubGluZSBpbnQgcnRtX21zZ2luZGV4KGludCBtc2d0eXBlKQoreworCWludCBtc2dpbmRleCA9IG1zZ3R5cGUgLSBSVE1fQkFTRTsKKworCS8qCisJICogbXNnaW5kZXggPCAwIGltcGxpZXMgc29tZW9uZSB0cmllZCB0byByZWdpc3RlciBhIG5ldGxpbmsKKwkgKiBjb250cm9sIGNvZGUuIG1zZ2luZGV4ID49IFJUTV9OUl9NU0dUWVBFUyBtYXkgaW5kaWNhdGUgdGhhdAorCSAqIHRoZSBtZXNzYWdlIHR5cGUgaGFzIG5vdCBiZWVuIGFkZGVkIHRvIGxpbnV4L3J0bmV0bGluay5oCisJICovCisJQlVHX09OKG1zZ2luZGV4IDwgMCB8fCBtc2dpbmRleCA+PSBSVE1fTlJfTVNHVFlQRVMpOworCisJcmV0dXJuIG1zZ2luZGV4OworfQorCitzdGF0aWMgcnRubF9kb2l0X2Z1bmMgcnRubF9nZXRfZG9pdChpbnQgcHJvdG9jb2wsIGludCBtc2dpbmRleCkKK3sKKwlzdHJ1Y3QgcnRubF9saW5rICp0YWI7CisKKwl0YWIgPSBydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF07CisJaWYgKHRhYiA9PSBOVUxMIHx8IHRhYlttc2dpbmRleF0uZG9pdCA9PSBOVUxMKQorCQl0YWIgPSBydG5sX21zZ19oYW5kbGVyc1tQRl9VTlNQRUNdOworCisJcmV0dXJuIHRhYiA/IHRhYlttc2dpbmRleF0uZG9pdCA6IE5VTEw7Cit9CisKK3N0YXRpYyBydG5sX2R1bXBpdF9mdW5jIHJ0bmxfZ2V0X2R1bXBpdChpbnQgcHJvdG9jb2wsIGludCBtc2dpbmRleCkKK3sKKwlzdHJ1Y3QgcnRubF9saW5rICp0YWI7CisKKwl0YWIgPSBydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF07CisJaWYgKHRhYiA9PSBOVUxMIHx8IHRhYlttc2dpbmRleF0uZHVtcGl0ID09IE5VTEwpCisJCXRhYiA9IHJ0bmxfbXNnX2hhbmRsZXJzW1BGX1VOU1BFQ107CisKKwlyZXR1cm4gdGFiID8gdGFiW21zZ2luZGV4XS5kdW1waXQgOiBOVUxMOworfQorCisvKioKKyAqIF9fcnRubF9yZWdpc3RlciAtIFJlZ2lzdGVyIGEgcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZQorICogQHByb3RvY29sOiBQcm90b2NvbCBmYW1pbHkgb3IgUEZfVU5TUEVDCisgKiBAbXNndHlwZTogcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZQorICogQGRvaXQ6IEZ1bmN0aW9uIHBvaW50ZXIgY2FsbGVkIGZvciBlYWNoIHJlcXVlc3QgbWVzc2FnZQorICogQGR1bXBpdDogRnVuY3Rpb24gcG9pbnRlciBjYWxsZWQgZm9yIGVhY2ggZHVtcCByZXF1ZXN0IChOTE1fRl9EVU1QKSBtZXNzYWdlCisgKgorICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gcG9pbnRlcnMgKGF0IGxlYXN0IG9uZSBvZiB0aGVtIGhhcworICogdG8gYmUgbm9uLU5VTEwpIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhIHJlcXVlc3QgbWVzc2FnZSBmb3IgdGhlCisgKiBzcGVjaWZpZWQgcHJvdG9jb2wgZmFtaWx5IGFuZCBtZXNzYWdlIHR5cGUgaXMgcmVjZWl2ZWQuCisgKgorICogVGhlIHNwZWNpYWwgcHJvdG9jb2wgZmFtaWx5IFBGX1VOU1BFQyBtYXkgYmUgdXNlZCB0byBkZWZpbmUgZmFsbGJhY2sKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgY2FzZSB3aGVuIG5vIGVudHJ5IGZvciB0aGUgc3BlY2lmaWMgcHJvdG9jb2wKKyAqIGZhbWlseSBleGlzdHMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgX19ydG5sX3JlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUsCisJCSAgICBydG5sX2RvaXRfZnVuYyBkb2l0LCBydG5sX2R1bXBpdF9mdW5jIGR1bXBpdCkKK3sKKwlzdHJ1Y3QgcnRubF9saW5rICp0YWI7CisJaW50IG1zZ2luZGV4OworCisJQlVHX09OKHByb3RvY29sIDwgMCB8fCBwcm90b2NvbCA+PSBOUFJPVE8pOworCW1zZ2luZGV4ID0gcnRtX21zZ2luZGV4KG1zZ3R5cGUpOworCisJdGFiID0gcnRubF9tc2dfaGFuZGxlcnNbcHJvdG9jb2xdOworCWlmICh0YWIgPT0gTlVMTCkgeworCQl0YWIgPSBrY2FsbG9jKFJUTV9OUl9NU0dUWVBFUywgc2l6ZW9mKCp0YWIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRhYiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCisJCXJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXSA9IHRhYjsKKwl9CisKKwlpZiAoZG9pdCkKKwkJdGFiW21zZ2luZGV4XS5kb2l0ID0gZG9pdDsKKworCWlmIChkdW1waXQpCisJCXRhYlttc2dpbmRleF0uZHVtcGl0ID0gZHVtcGl0OworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKF9fcnRubF9yZWdpc3Rlcik7CisKKy8qKgorICogcnRubF9yZWdpc3RlciAtIFJlZ2lzdGVyIGEgcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZQorICoKKyAqIElkZW50aWNhbCB0byBfX3J0bmxfcmVnaXN0ZXIoKSBidXQgcGFuaWNzIG9uIGZhaWx1cmUuIFRoaXMgaXMgdXNlZnVsCisgKiBhcyBmYWlsdXJlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSB1bmxpa2VseSwgaXQgY2FuIG9ubHkgaGFwcGVuIGR1ZQorICogdG8gbGFjayBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIHRoZSBjaGFpbiB0byBzdG9yZSBhbGwgbWVzc2FnZQorICogaGFuZGxlcnMgZm9yIGEgcHJvdG9jb2wuIE1lYW50IGZvciB1c2UgaW4gaW5pdCBmdW5jdGlvbnMgd2hlcmUgbGFjaworICogb2YgbWVtb3J5IGltcGxpZXMgbm8gc2Vuc2UgaW4gY29udGludWVpbmcuCisgKi8KK3ZvaWQgcnRubF9yZWdpc3RlcihpbnQgcHJvdG9jb2wsIGludCBtc2d0eXBlLAorCQkgICBydG5sX2RvaXRfZnVuYyBkb2l0LCBydG5sX2R1bXBpdF9mdW5jIGR1bXBpdCkKK3sKKwlpZiAoX19ydG5sX3JlZ2lzdGVyKHByb3RvY29sLCBtc2d0eXBlLCBkb2l0LCBkdW1waXQpIDwgMCkKKwkJcGFuaWMoIlVuYWJsZSB0byByZWdpc3RlciBydG5ldGxpbmsgbWVzc2FnZSBoYW5kbGVyLCAiCisJCSAgICAgICJwcm90b2NvbCA9ICVkLCBtZXNzYWdlIHR5cGUgPSAlZFxuIiwKKwkJICAgICAgcHJvdG9jb2wsIG1zZ3R5cGUpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydG5sX3JlZ2lzdGVyKTsKKworLyoqCisgKiBydG5sX3VucmVnaXN0ZXIgLSBVbnJlZ2lzdGVyIGEgcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZQorICogQHByb3RvY29sOiBQcm90b2NvbCBmYW1pbHkgb3IgUEZfVU5TUEVDCisgKiBAbXNndHlwZTogcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHJ0bmxfdW5yZWdpc3RlcihpbnQgcHJvdG9jb2wsIGludCBtc2d0eXBlKQoreworCWludCBtc2dpbmRleDsKKworCUJVR19PTihwcm90b2NvbCA8IDAgfHwgcHJvdG9jb2wgPj0gTlBST1RPKTsKKwltc2dpbmRleCA9IHJ0bV9tc2dpbmRleChtc2d0eXBlKTsKKworCWlmIChydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF1bbXNnaW5kZXhdLmRvaXQgPSBOVUxMOworCXJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXVttc2dpbmRleF0uZHVtcGl0ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydG5sX3VucmVnaXN0ZXIpOworCisvKioKKyAqIHJ0bmxfdW5yZWdpc3Rlcl9hbGwgLSBVbnJlZ2lzdGVyIGFsbCBydG5ldGxpbmsgbWVzc2FnZSB0eXBlIG9mIGEgcHJvdG9jb2wKKyAqIEBwcm90b2NvbCA6IFByb3RvY29sIGZhbWlseSBvciBQRl9VTlNQRUMKKyAqCisgKiBJZGVudGljYWwgdG8gY2FsbGluZyBydG5sX3VucmVnc3RlcigpIGZvciBhbGwgcmVnaXN0ZXJlZCBtZXNzYWdlIHR5cGVzCisgKiBvZiBhIGNlcnRhaW4gcHJvdG9jb2wgZmFtaWx5LgorICovCit2b2lkIHJ0bmxfdW5yZWdpc3Rlcl9hbGwoaW50IHByb3RvY29sKQoreworCUJVR19PTihwcm90b2NvbCA8IDAgfHwgcHJvdG9jb2wgPj0gTlBST1RPKTsKKworCWtmcmVlKHJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXSk7CisJcnRubF9tc2dfaGFuZGxlcnNbcHJvdG9jb2xdID0gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnRubF91bnJlZ2lzdGVyX2FsbCk7CiAKIHN0YXRpYyBjb25zdCBpbnQgcnRtX21pbltSVE1fTlJfRkFNSUxJRVNdID0KIHsKQEAgLTI0OSw3ICszOTUsNyBAQAogCQkgICAgb3BlcnN0YXRlID09IElGX09QRVJfVU5LTk9XTikKIAkJCW9wZXJzdGF0ZSA9IElGX09QRVJfRE9STUFOVDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlpZiAoZGV2LT5vcGVyc3RhdGUgIT0gb3BlcnN0YXRlKSB7CiAJCXdyaXRlX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOwpAQCAtMzkzLDcgKzUzOSw2IEBACiAJaW50IHNfaWR4ID0gY2ItPmFyZ3NbMF07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJZm9yIChkZXY9ZGV2X2Jhc2UsIGlkeD0wOyBkZXY7IGRldiA9IGRldi0+bmV4dCwgaWR4KyspIHsKIAkJaWYgKGlkeCA8IHNfaWR4KQogCQkJY29udGludWU7CkBAIC00MDIsNyArNTQ3LDYgQEAKIAkJCQkgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgMCwgTkxNX0ZfTVVMVEkpIDw9IDApCiAJCQlicmVhazsKIAl9Ci0JcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwogCWNiLT5hcmdzWzBdID0gaWR4OwogCiAJcmV0dXJuIHNrYi0+bGVuOwpAQCAtNTM2LDE3ICs2ODAsNiBAQAogCQltb2RpZmllZCA9IDE7CiAJfQogCi0jaWZkZWYgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksKLQlpZiAodGJbSUZMQV9XSVJFTEVTU10pIHsKLQkJLyogQ2FsbCBXaXJlbGVzcyBFeHRlbnNpb25zLgotCQkgKiBWYXJpb3VzIHN0dWZmIGNoZWNrZWQgaW4gdGhlcmUuLi4gKi8KLQkJZXJyID0gd2lyZWxlc3NfcnRuZXRsaW5rX3NldChkZXYsIG5sYV9kYXRhKHRiW0lGTEFfV0lSRUxFU1NdKSwKLQkJCQkJICAgICBubGFfbGVuKHRiW0lGTEFfV0lSRUxFU1NdKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvdXRfZGV2OwotCX0KLSNlbmRpZgkvKiBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSyAqLwotCiAJaWYgKHRiW0lGTEFfQlJPQURDQVNUXSkgewogCQlubGFfbWVtY3B5KGRldi0+YnJvYWRjYXN0LCB0YltJRkxBX0JST0FEQ0FTVF0sIGRldi0+YWRkcl9sZW4pOwogCQlzZW5kX2FkZHJfbm90aWZ5ID0gMTsKQEAgLTYxMCwyMiArNzQzLDYgQEAKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQotI2lmZGVmIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LCi0JaWYgKHRiW0lGTEFfV0lSRUxFU1NdKSB7Ci0JCS8qIENhbGwgV2lyZWxlc3MgRXh0ZW5zaW9ucy4gV2UgbmVlZCB0byBrbm93IHRoZSBzaXplIGJlZm9yZQotCQkgKiB3ZSBjYW4gYWxsb2MuIFZhcmlvdXMgc3R1ZmYgY2hlY2tlZCBpbiB0aGVyZS4uLiAqLwotCQllcnIgPSB3aXJlbGVzc19ydG5ldGxpbmtfZ2V0KGRldiwgbmxhX2RhdGEodGJbSUZMQV9XSVJFTEVTU10pLAotCQkJCQkgICAgIG5sYV9sZW4odGJbSUZMQV9XSVJFTEVTU10pLAotCQkJCQkgICAgICZpd19idWYsICZpd19idWZfbGVuKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycm91dDsKLQotCQkvKiBQYXlsb2FkIGlzIGF0IGFuIG9mZnNldCBpbiBidWZmZXIgKi8KLQkJaXcgPSBpd19idWYgKyBJV19FVl9QT0lOVF9PRkY7Ci0JfQotI2VuZGlmCS8qIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LICovCi0KIAluc2tiID0gbmxtc2dfbmV3KGlmX25sbXNnX3NpemUoaXdfYnVmX2xlbiksIEdGUF9LRVJORUwpOwogCWlmIChuc2tiID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT0JVRlM7CkBAIC02NTksMTIgKzc3NiwxMiBAQAogCQlpbnQgdHlwZSA9IGNiLT5ubGgtPm5sbXNnX3R5cGUtUlRNX0JBU0U7CiAJCWlmIChpZHggPCBzX2lkeCB8fCBpZHggPT0gUEZfUEFDS0VUKQogCQkJY29udGludWU7Ci0JCWlmIChydG5ldGxpbmtfbGlua3NbaWR4XSA9PSBOVUxMIHx8Ci0JCSAgICBydG5ldGxpbmtfbGlua3NbaWR4XVt0eXBlXS5kdW1waXQgPT0gTlVMTCkKKwkJaWYgKHJ0bmxfbXNnX2hhbmRsZXJzW2lkeF0gPT0gTlVMTCB8fAorCQkgICAgcnRubF9tc2dfaGFuZGxlcnNbaWR4XVt0eXBlXS5kdW1waXQgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaWR4ID4gc19pZHgpCiAJCQltZW1zZXQoJmNiLT5hcmdzWzBdLCAwLCBzaXplb2YoY2ItPmFyZ3MpKTsKLQkJaWYgKHJ0bmV0bGlua19saW5rc1tpZHhdW3R5cGVdLmR1bXBpdChza2IsIGNiKSkKKwkJaWYgKHJ0bmxfbXNnX2hhbmRsZXJzW2lkeF1bdHlwZV0uZHVtcGl0KHNrYiwgY2IpKQogCQkJYnJlYWs7CiAJfQogCWNiLT5mYW1pbHkgPSBpZHg7CkBAIC03MDAsMzAgKzgxNywxOCBAQAogCiAvKiBQcm9jZXNzIG9uZSBydG5ldGxpbmsgbWVzc2FnZS4gKi8KIAotc3RhdGljIF9faW5saW5lX18gaW50Ci1ydG5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQorc3RhdGljIGludCBydG5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKLQlzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKmxpbms7Ci0Jc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3RhYjsKKwlydG5sX2RvaXRfZnVuYyBkb2l0OwogCWludCBzel9pZHgsIGtpbmQ7CiAJaW50IG1pbl9sZW47CiAJaW50IGZhbWlseTsKIAlpbnQgdHlwZTsKIAlpbnQgZXJyOwogCi0JLyogT25seSByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieSBrZXJuZWwgbm93ICovCi0JaWYgKCEobmxoLT5ubG1zZ19mbGFncyZOTE1fRl9SRVFVRVNUKSkKLQkJcmV0dXJuIDA7Ci0KIAl0eXBlID0gbmxoLT5ubG1zZ190eXBlOwotCi0JLyogQSBjb250cm9sIG1lc3NhZ2U6IGlnbm9yZSB0aGVtICovCi0JaWYgKHR5cGUgPCBSVE1fQkFTRSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBVbmtub3duIG1lc3NhZ2U6IHJlcGx5IHdpdGggRUlOVkFMICovCiAJaWYgKHR5cGUgPiBSVE1fTUFYKQotCQlnb3RvIGVycl9pbnZhbDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJdHlwZSAtPSBSVE1fQkFTRTsKIApAQCAtNzMyLDQ1ICs4MzcsMzMgQEAKIAkJcmV0dXJuIDA7CiAKIAlmYW1pbHkgPSAoKHN0cnVjdCBydGdlbm1zZyopTkxNU0dfREFUQShubGgpKS0+cnRnZW5fZmFtaWx5OwotCWlmIChmYW1pbHkgPj0gTlBST1RPKSB7Ci0JCSplcnJwID0gLUVBRk5PU1VQUE9SVDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWxpbmtfdGFiID0gcnRuZXRsaW5rX2xpbmtzW2ZhbWlseV07Ci0JaWYgKGxpbmtfdGFiID09IE5VTEwpCi0JCWxpbmtfdGFiID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107Ci0JbGluayA9ICZsaW5rX3RhYlt0eXBlXTsKKwlpZiAoZmFtaWx5ID49IE5QUk9UTykKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CiAKIAlzel9pZHggPSB0eXBlPj4yOwogCWtpbmQgPSB0eXBlJjM7CiAKLQlpZiAoa2luZCAhPSAyICYmIHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKSB7Ci0JCSplcnJwID0gLUVQRVJNOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmIChraW5kICE9IDIgJiYgc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoa2luZCA9PSAyICYmIG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfRFVNUCkgewotCQlpZiAobGluay0+ZHVtcGl0ID09IE5VTEwpCi0JCQlsaW5rID0gJihydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXVt0eXBlXSk7CisJCXJ0bmxfZHVtcGl0X2Z1bmMgZHVtcGl0OwogCi0JCWlmIChsaW5rLT5kdW1waXQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX2ludmFsOworCQlkdW1waXQgPSBydG5sX2dldF9kdW1waXQoZmFtaWx5LCB0eXBlKTsKKwkJaWYgKGR1bXBpdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCWlmICgoKmVycnAgPSBuZXRsaW5rX2R1bXBfc3RhcnQocnRubCwgc2tiLCBubGgsCi0JCQkJCQlsaW5rLT5kdW1waXQsIE5VTEwpKSAhPSAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQluZXRsaW5rX3F1ZXVlX3NraXAobmxoLCBza2IpOwotCQlyZXR1cm4gLTE7CisJCV9fcnRubF91bmxvY2soKTsKKwkJZXJyID0gbmV0bGlua19kdW1wX3N0YXJ0KHJ0bmwsIHNrYiwgbmxoLCBkdW1waXQsIE5VTEwpOworCQlydG5sX2xvY2soKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAltZW1zZXQocnRhX2J1ZiwgMCwgKHJ0YXR0cl9tYXggKiBzaXplb2Yoc3RydWN0IHJ0YXR0ciAqKSkpOwogCiAJbWluX2xlbiA9IHJ0bV9taW5bc3pfaWR4XTsKIAlpZiAobmxoLT5ubG1zZ19sZW4gPCBtaW5fbGVuKQotCQlnb3RvIGVycl9pbnZhbDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobmxoLT5ubG1zZ19sZW4gPiBtaW5fbGVuKSB7CiAJCWludCBhdHRybGVuID0gbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19BTElHTihtaW5fbGVuKTsKQEAgLTc4MCwyNSArODczLDE4IEBACiAJCQl1bnNpZ25lZCBmbGF2b3IgPSBhdHRyLT5ydGFfdHlwZTsKIAkJCWlmIChmbGF2b3IpIHsKIAkJCQlpZiAoZmxhdm9yID4gcnRhX21heFtzel9pZHhdKQotCQkJCQlnb3RvIGVycl9pbnZhbDsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJcnRhX2J1ZltmbGF2b3ItMV0gPSBhdHRyOwogCQkJfQogCQkJYXR0ciA9IFJUQV9ORVhUKGF0dHIsIGF0dHJsZW4pOwogCQl9CiAJfQogCi0JaWYgKGxpbmstPmRvaXQgPT0gTlVMTCkKLQkJbGluayA9ICYocnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ11bdHlwZV0pOwotCWlmIChsaW5rLT5kb2l0ID09IE5VTEwpCi0JCWdvdG8gZXJyX2ludmFsOwotCWVyciA9IGxpbmstPmRvaXQoc2tiLCBubGgsICh2b2lkICopJnJ0YV9idWZbMF0pOworCWRvaXQgPSBydG5sX2dldF9kb2l0KGZhbWlseSwgdHlwZSk7CisJaWYgKGRvaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JKmVycnAgPSBlcnI7Ci0JcmV0dXJuIGVycjsKLQotZXJyX2ludmFsOgotCSplcnJwID0gLUVJTlZBTDsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGRvaXQoc2tiLCBubGgsICh2b2lkICopJnJ0YV9idWZbMF0pOwogfQogCiBzdGF0aWMgdm9pZCBydG5ldGxpbmtfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKQEAgLTgxNCwyNSArOTAwLDYgQEAKIAl9IHdoaWxlIChxbGVuKTsKIH0KIAotc3RhdGljIHN0cnVjdCBydG5ldGxpbmtfbGluayBsaW5rX3J0bmV0bGlua190YWJsZVtSVE1fTlJfTVNHVFlQRVNdID0KLXsKLQlbUlRNX0dFVExJTksgICAgIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gcnRubF9nZXRsaW5rLAotCQkJCQkgLmR1bXBpdCA9IHJ0bmxfZHVtcF9pZmluZm8JIH0sCi0JW1JUTV9TRVRMSU5LICAgICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IHJ0bmxfc2V0bGluawkJIH0sCi0JW1JUTV9HRVRBRERSICAgICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IHJ0bmxfZHVtcF9hbGwJIH0sCi0JW1JUTV9HRVRST1VURSAgICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IHJ0bmxfZHVtcF9hbGwJIH0sCi0JW1JUTV9ORVdORUlHSCAgICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IG5laWdoX2FkZAkJIH0sCi0JW1JUTV9ERUxORUlHSCAgICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IG5laWdoX2RlbGV0ZQkJIH0sCi0JW1JUTV9HRVRORUlHSCAgICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IG5laWdoX2R1bXBfaW5mbwkgfSwKLSNpZmRlZiBDT05GSUdfRklCX1JVTEVTCi0JW1JUTV9ORVdSVUxFICAgICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IGZpYl9ubF9uZXdydWxlCSB9LAotCVtSVE1fREVMUlVMRSAgICAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0ICAgPSBmaWJfbmxfZGVscnVsZQkgfSwKLSNlbmRpZgotCVtSVE1fR0VUUlVMRSAgICAgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQgPSBydG5sX2R1bXBfYWxsCSB9LAotCVtSVE1fR0VUTkVJR0hUQkwgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQgPSBuZWlnaHRibF9kdW1wX2luZm8JIH0sCi0JW1JUTV9TRVRORUlHSFRCTCAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IG5laWdodGJsX3NldAkJIH0sCi19OwotCiBzdGF0aWMgaW50IHJ0bmV0bGlua19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOwpAQCAtODc0LDE5ICs5NDEsMjIgQEAKIAkJcGFuaWMoInJ0bmV0bGlua19pbml0OiBjYW5ub3QgYWxsb2NhdGUgcnRhX2J1ZlxuIik7CiAKIAlydG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfUk9VVEUsIFJUTkxHUlBfTUFYLCBydG5ldGxpbmtfcmN2LAotCQkJCSAgICAgVEhJU19NT0RVTEUpOworCQkJCSAgICAgJnJ0bmxfbXV0ZXgsIFRISVNfTU9EVUxFKTsKIAlpZiAocnRubCA9PSBOVUxMKQogCQlwYW5pYygicnRuZXRsaW5rX2luaXQ6IGNhbm5vdCBpbml0aWFsaXplIHJ0bmV0bGlua1xuIik7CiAJbmV0bGlua19zZXRfbm9ucm9vdChORVRMSU5LX1JPVVRFLCBOTF9OT05ST09UX1JFQ1YpOwogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcnRuZXRsaW5rX2Rldl9ub3RpZmllcik7Ci0JcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ10gPSBsaW5rX3J0bmV0bGlua190YWJsZTsKLQlydG5ldGxpbmtfbGlua3NbUEZfUEFDS0VUXSA9IGxpbmtfcnRuZXRsaW5rX3RhYmxlOworCisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRMSU5LLCBydG5sX2dldGxpbmssIHJ0bmxfZHVtcF9pZmluZm8pOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fU0VUTElOSywgcnRubF9zZXRsaW5rLCBOVUxMKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUQUREUiwgTlVMTCwgcnRubF9kdW1wX2FsbCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRST1VURSwgTlVMTCwgcnRubF9kdW1wX2FsbCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woX19ydGFfZmlsbCk7CiBFWFBPUlRfU1lNQk9MKHJ0YXR0cl9zdHJsY3B5KTsKIEVYUE9SVF9TWU1CT0wocnRhdHRyX3BhcnNlKTsKLUVYUE9SVF9TWU1CT0wocnRuZXRsaW5rX2xpbmtzKTsKIEVYUE9SVF9TWU1CT0wocnRuZXRsaW5rX3B1dF9tZXRyaWNzKTsKIEVYUE9SVF9TWU1CT0wocnRubF9sb2NrKTsKIEVYUE9SVF9TWU1CT0wocnRubF90cnlsb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggMzM2OTU4Zi4uMzJmMDg3YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgpAQCAtODcsOCArODgsOSBAQAogdm9pZCBza2Jfb3Zlcl9wYW5pYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc3osIHZvaWQgKmhlcmUpCiB7CiAJcHJpbnRrKEtFUk5fRU1FUkcgInNrYl9vdmVyX3BhbmljOiB0ZXh0OiVwIGxlbjolZCBwdXQ6JWQgaGVhZDolcCAiCi0JCQkgICJkYXRhOiVwIHRhaWw6JXAgZW5kOiVwIGRldjolc1xuIiwKLQkgICAgICAgaGVyZSwgc2tiLT5sZW4sIHN6LCBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT50YWlsLCBza2ItPmVuZCwKKwkJCSAgImRhdGE6JXAgdGFpbDolI2x4IGVuZDolI2x4IGRldjolc1xuIiwKKwkgICAgICAgaGVyZSwgc2tiLT5sZW4sIHN6LCBza2ItPmhlYWQsIHNrYi0+ZGF0YSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpc2tiLT50YWlsLCAodW5zaWduZWQgbG9uZylza2ItPmVuZCwKIAkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICI8TlVMTD4iKTsKIAlCVUcoKTsKIH0KQEAgLTEwNSw4ICsxMDcsOSBAQAogdm9pZCBza2JfdW5kZXJfcGFuaWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHN6LCB2b2lkICpoZXJlKQogewogCXByaW50ayhLRVJOX0VNRVJHICJza2JfdW5kZXJfcGFuaWM6IHRleHQ6JXAgbGVuOiVkIHB1dDolZCBoZWFkOiVwICIKLQkJCSAgImRhdGE6JXAgdGFpbDolcCBlbmQ6JXAgZGV2OiVzXG4iLAotCSAgICAgICBoZXJlLCBza2ItPmxlbiwgc3osIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPnRhaWwsIHNrYi0+ZW5kLAorCQkJICAiZGF0YTolcCB0YWlsOiUjbHggZW5kOiUjbHggZGV2OiVzXG4iLAorCSAgICAgICBoZXJlLCBza2ItPmxlbiwgc3osIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAorCSAgICAgICAodW5zaWduZWQgbG9uZylza2ItPnRhaWwsICh1bnNpZ25lZCBsb25nKXNrYi0+ZW5kLAogCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOwogCUJVRygpOwogfQpAQCAtMTU1LDIwICsxNTgsMjIgQEAKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKLQkvKiBHZXQgdGhlIERBVEEuIFNpemUgbXVzdCBtYXRjaCBza2JfYWRkX210dSgpLiAqLwogCXNpemUgPSBTS0JfREFUQV9BTElHTihzaXplKTsKIAlkYXRhID0ga21hbGxvY19ub2RlX3RyYWNrX2NhbGxlcihzaXplICsgc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pLAogCQkJZ2ZwX21hc2ssIG5vZGUpOwogCWlmICghZGF0YSkKIAkJZ290byBub2RhdGE7CiAKLQltZW1zZXQoc2tiLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdHJ1ZXNpemUpKTsKKwkvKgorCSAqIFNlZSBjb21tZW50IGluIHNrX2J1ZmYgZGVmaW5pdGlvbiwganVzdCBiZWZvcmUgdGhlICd0YWlsJyBtZW1iZXIKKwkgKi8KKwltZW1zZXQoc2tiLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdGFpbCkpOwogCXNrYi0+dHJ1ZXNpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKTsKIAlhdG9taWNfc2V0KCZza2ItPnVzZXJzLCAxKTsKIAlza2ItPmhlYWQgPSBkYXRhOwogCXNrYi0+ZGF0YSA9IGRhdGE7Ci0Jc2tiLT50YWlsID0gZGF0YTsKLQlza2ItPmVuZCAgPSBkYXRhICsgc2l6ZTsKKwlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CisJc2tiLT5lbmQgPSBza2ItPnRhaWwgKyBzaXplOwogCS8qIG1ha2Ugc3VyZSB3ZSBpbml0aWFsaXplIHNoaW5mbyBzZXF1ZW50aWFsbHkgKi8KIAlzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7CiAJYXRvbWljX3NldCgmc2hpbmZvLT5kYXRhcmVmLCAxKTsKQEAgLTI5OSw3ICszMDQsNyBAQAogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChmY2xvbmVfcmVmKSkKIAkJCWttZW1fY2FjaGVfZnJlZShza2J1ZmZfZmNsb25lX2NhY2hlLCBvdGhlcik7CiAJCWJyZWFrOwotCX07CisJfQogfQogCiAvKioKQEAgLTMyMSwxNSArMzI2LDEzIEBACiAJCVdBUk5fT04oaW5faXJxKCkpOwogCQlza2ItPmRlc3RydWN0b3Ioc2tiKTsKIAl9Ci0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCW5mX2Nvbm50cmFja19wdXQoc2tiLT5uZmN0KTsKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisJbmZfY29ubnRyYWNrX3B1dChza2ItPm5mY3QpOwogCW5mX2Nvbm50cmFja19wdXRfcmVhc20oc2tiLT5uZmN0X3JlYXNtKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCiAJbmZfYnJpZGdlX3B1dChza2ItPm5mX2JyaWRnZSk7CiAjZW5kaWYKLSNlbmRpZgogLyogWFhYOiBJUyB0aGlzIHN0aWxsIG5lY2Vzc2FyeT8gLSBKSFMgKi8KICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJc2tiLT50Y19pbmRleCA9IDA7CkBAIC0zOTYsOSArMzk5LDkgQEAKIAluLT5zayA9IE5VTEw7CiAJQyh0c3RhbXApOwogCUMoZGV2KTsKLQlDKGgpOwotCUMobmgpOwotCUMobWFjKTsKKwlDKHRyYW5zcG9ydF9oZWFkZXIpOworCUMobmV0d29ya19oZWFkZXIpOworCUMobWFjX2hlYWRlcik7CiAJQyhkc3QpOwogCWRzdF9jbG9uZShza2ItPmRzdCk7CiAJQyhzcCk7CkBAIC00MjIsMTkgKzQyNSw3IEBACiAJQyhwcm90b2NvbCk7CiAJbi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CiAJQyhtYXJrKTsKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JQyhuZmN0KTsKLQluZl9jb25udHJhY2tfZ2V0KHNrYi0+bmZjdCk7Ci0JQyhuZmN0aW5mbyk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQotCUMobmZjdF9yZWFzbSk7Ci0JbmZfY29ubnRyYWNrX2dldF9yZWFzbShza2ItPm5mY3RfcmVhc20pOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKLQlDKG5mX2JyaWRnZSk7Ci0JbmZfYnJpZGdlX2dldChza2ItPm5mX2JyaWRnZSk7Ci0jZW5kaWYKLSNlbmRpZiAvKkNPTkZJR19ORVRGSUxURVIqLworCV9fbmZfY29weShuLCBza2IpOwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlDKHRjX2luZGV4KTsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTQ2MCwxMSArNDUxLDEyIEBACiAKIHN0YXRpYyB2b2lkIGNvcHlfc2tiX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqbmV3LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb2xkKQogeworI2lmbmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKIAkvKgogCSAqCVNoaWZ0IGJldHdlZW4gdGhlIHR3byBkYXRhIGFyZWFzIGluIGJ5dGVzCiAJICovCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBuZXctPmRhdGEgLSBvbGQtPmRhdGE7Ci0KKyNlbmRpZgogCW5ldy0+c2sJCT0gTlVMTDsKIAluZXctPmRldgk9IG9sZC0+ZGV2OwogCW5ldy0+cHJpb3JpdHkJPSBvbGQtPnByaW9yaXR5OwpAQCAtNDczLDkgKzQ2NSwxNSBAQAogI2lmZGVmIENPTkZJR19JTkVUCiAJbmV3LT5zcAkJPSBzZWNwYXRoX2dldChvbGQtPnNwKTsKICNlbmRpZgotCW5ldy0+aC5yYXcJPSBvbGQtPmgucmF3ICsgb2Zmc2V0OwotCW5ldy0+bmgucmF3CT0gb2xkLT5uaC5yYXcgKyBvZmZzZXQ7Ci0JbmV3LT5tYWMucmF3CT0gb2xkLT5tYWMucmF3ICsgb2Zmc2V0OworCW5ldy0+dHJhbnNwb3J0X2hlYWRlciA9IG9sZC0+dHJhbnNwb3J0X2hlYWRlcjsKKwluZXctPm5ldHdvcmtfaGVhZGVyICAgPSBvbGQtPm5ldHdvcmtfaGVhZGVyOworCW5ldy0+bWFjX2hlYWRlcgkgICAgICA9IG9sZC0+bWFjX2hlYWRlcjsKKyNpZm5kZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJLyoge3RyYW5zcG9ydCxuZXR3b3JrLG1hY31faGVhZGVyIGFyZSByZWxhdGl2ZSB0byBza2ItPmhlYWQgKi8KKwluZXctPnRyYW5zcG9ydF9oZWFkZXIgKz0gb2Zmc2V0OworCW5ldy0+bmV0d29ya19oZWFkZXIgICArPSBvZmZzZXQ7CisJbmV3LT5tYWNfaGVhZGVyCSAgICAgICs9IG9mZnNldDsKKyNlbmRpZgogCW1lbWNweShuZXctPmNiLCBvbGQtPmNiLCBzaXplb2Yob2xkLT5jYikpOwogCW5ldy0+bG9jYWxfZGYJPSBvbGQtPmxvY2FsX2RmOwogCW5ldy0+ZmNsb25lCT0gU0tCX0ZDTE9ORV9VTkFWQUlMQUJMRTsKQEAgLTQ4MywyMiArNDgxLDEwIEBACiAJbmV3LT50c3RhbXAJPSBvbGQtPnRzdGFtcDsKIAluZXctPmRlc3RydWN0b3IgPSBOVUxMOwogCW5ldy0+bWFyawk9IG9sZC0+bWFyazsKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JbmV3LT5uZmN0CT0gb2xkLT5uZmN0OwotCW5mX2Nvbm50cmFja19nZXQob2xkLT5uZmN0KTsKLQluZXctPm5mY3RpbmZvCT0gb2xkLT5uZmN0aW5mbzsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCi0JbmV3LT5uZmN0X3JlYXNtID0gb2xkLT5uZmN0X3JlYXNtOwotCW5mX2Nvbm50cmFja19nZXRfcmVhc20ob2xkLT5uZmN0X3JlYXNtKTsKLSNlbmRpZgorCV9fbmZfY29weShuZXcsIG9sZCk7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBfVlMpIHx8IGRlZmluZWQoQ09ORklHX0lQX1ZTX01PRFVMRSkKIAluZXctPmlwdnNfcHJvcGVydHkgPSBvbGQtPmlwdnNfcHJvcGVydHk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCW5ldy0+bmZfYnJpZGdlCT0gb2xkLT5uZl9icmlkZ2U7Ci0JbmZfYnJpZGdlX2dldChvbGQtPm5mX2JyaWRnZSk7Ci0jZW5kaWYKLSNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAluZXctPnRjX3ZlcmQgPSBvbGQtPnRjX3ZlcmQ7CkBAIC01MzUsOCArNTIxLDEyIEBACiAJLyoKIAkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKIAkgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IGFsbG9jX3NrYihza2ItPmVuZCAtIHNrYi0+aGVhZCArIHNrYi0+ZGF0YV9sZW4sCi0JCQkJICAgICAgZ2ZwX21hc2spOworCXN0cnVjdCBza19idWZmICpuOworI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorCW4gPSBhbGxvY19za2Ioc2tiLT5lbmQgKyBza2ItPmRhdGFfbGVuLCBnZnBfbWFzayk7CisjZWxzZQorCW4gPSBhbGxvY19za2Ioc2tiLT5lbmQgLSBza2ItPmhlYWQgKyBza2ItPmRhdGFfbGVuLCBnZnBfbWFzayk7CisjZW5kaWYKIAlpZiAoIW4pCiAJCXJldHVybiBOVUxMOwogCkBAIC01NzMsOCArNTYzLDEyIEBACiAJLyoKIAkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKIAkgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IGFsbG9jX3NrYihza2ItPmVuZCAtIHNrYi0+aGVhZCwgZ2ZwX21hc2spOwotCisJc3RydWN0IHNrX2J1ZmYgKm47CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJbiA9IGFsbG9jX3NrYihza2ItPmVuZCwgZ2ZwX21hc2spOworI2Vsc2UKKwluID0gYWxsb2Nfc2tiKHNrYi0+ZW5kIC0gc2tiLT5oZWFkLCBnZnBfbWFzayk7CisjZW5kaWYKIAlpZiAoIW4pCiAJCWdvdG8gb3V0OwogCkBAIC01ODMsNyArNTc3LDcgQEAKIAkvKiBTZXQgdGhlIHRhaWwgcG9pbnRlciBhbmQgbGVuZ3RoICovCiAJc2tiX3B1dChuLCBza2JfaGVhZGxlbihza2IpKTsKIAkvKiBDb3B5IHRoZSBieXRlcyAqLwotCW1lbWNweShuLT5kYXRhLCBza2ItPmRhdGEsIG4tPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG4tPmRhdGEsIG4tPmxlbik7CiAJbi0+Y3N1bQkgICAgID0gc2tiLT5jc3VtOwogCW4tPmlwX3N1bW1lZCA9IHNrYi0+aXBfc3VtbWVkOwogCkBAIC02MzIsNyArNjI2LDExIEBACiB7CiAJaW50IGk7CiAJdTggKmRhdGE7CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJaW50IHNpemUgPSBuaGVhZCArIHNrYi0+ZW5kICsgbnRhaWw7CisjZWxzZQogCWludCBzaXplID0gbmhlYWQgKyAoc2tiLT5lbmQgLSBza2ItPmhlYWQpICsgbnRhaWw7CisjZW5kaWYKIAlsb25nIG9mZjsKIAogCWlmIChza2Jfc2hhcmVkKHNrYikpCkBAIC02NDYsOCArNjQ0LDE0IEBACiAKIAkvKiBDb3B5IG9ubHkgcmVhbCBkYXRhLi4uIGFuZCwgYWxhcywgaGVhZGVyLiBUaGlzIHNob3VsZCBiZQogCSAqIG9wdGltaXplZCBmb3IgdGhlIGNhc2VzIHdoZW4gaGVhZGVyIGlzIHZvaWQuICovCi0JbWVtY3B5KGRhdGEgKyBuaGVhZCwgc2tiLT5oZWFkLCBza2ItPnRhaWwgLSBza2ItPmhlYWQpOwotCW1lbWNweShkYXRhICsgc2l6ZSwgc2tiLT5lbmQsIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CisJbWVtY3B5KGRhdGEgKyBuaGVhZCwgc2tiLT5oZWFkLAorI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorCQlza2ItPnRhaWwpOworI2Vsc2UKKwkJc2tiLT50YWlsIC0gc2tiLT5oZWFkKTsKKyNlbmRpZgorCW1lbWNweShkYXRhICsgc2l6ZSwgc2tiX2VuZF9wb2ludGVyKHNrYiksCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQogCQlnZXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UpOwpAQCAtNjYwLDEyICs2NjQsMTggQEAKIAlvZmYgPSAoZGF0YSArIG5oZWFkKSAtIHNrYi0+aGVhZDsKIAogCXNrYi0+aGVhZCAgICAgPSBkYXRhOwotCXNrYi0+ZW5kICAgICAgPSBkYXRhICsgc2l6ZTsKIAlza2ItPmRhdGEgICAgKz0gb2ZmOwotCXNrYi0+dGFpbCAgICArPSBvZmY7Ci0Jc2tiLT5tYWMucmF3ICs9IG9mZjsKLQlza2ItPmgucmF3ICAgKz0gb2ZmOwotCXNrYi0+bmgucmF3ICArPSBvZmY7CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJc2tiLT5lbmQgICAgICA9IHNpemU7CisJb2ZmICAgICAgICAgICA9IG5oZWFkOworI2Vsc2UKKwlza2ItPmVuZCAgICAgID0gc2tiLT5oZWFkICsgc2l6ZTsKKyNlbmRpZgorCS8qIHt0cmFuc3BvcnQsbmV0d29yayxtYWN9X2hlYWRlciBhbmQgdGFpbCBhcmUgcmVsYXRpdmUgdG8gc2tiLT5oZWFkICovCisJc2tiLT50YWlsCSAgICAgICs9IG9mZjsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgKz0gb2ZmOworCXNrYi0+bmV0d29ya19oZWFkZXIgICArPSBvZmY7CisJc2tiLT5tYWNfaGVhZGVyCSAgICAgICs9IG9mZjsKIAlza2ItPmNsb25lZCAgID0gMDsKIAlza2ItPm5vaGRyICAgID0gMDsKIAlhdG9taWNfc2V0KCZza2Jfc2hpbmZvKHNrYiktPmRhdGFyZWYsIDEpOwpAQCAtNzI2LDcgKzczNiw5IEBACiAJICovCiAJc3RydWN0IHNrX2J1ZmYgKm4gPSBhbGxvY19za2IobmV3aGVhZHJvb20gKyBza2ItPmxlbiArIG5ld3RhaWxyb29tLAogCQkJCSAgICAgIGdmcF9tYXNrKTsKKwlpbnQgb2xkaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKIAlpbnQgaGVhZF9jb3B5X2xlbiwgaGVhZF9jb3B5X29mZjsKKwlpbnQgb2ZmID0gMDsKIAogCWlmICghbikKIAkJcmV0dXJuIE5VTEw7CkBAIC03MzYsNyArNzQ4LDcgQEAKIAkvKiBTZXQgdGhlIHRhaWwgcG9pbnRlciBhbmQgbGVuZ3RoICovCiAJc2tiX3B1dChuLCBza2ItPmxlbik7CiAKLQloZWFkX2NvcHlfbGVuID0gc2tiX2hlYWRyb29tKHNrYik7CisJaGVhZF9jb3B5X2xlbiA9IG9sZGhlYWRyb29tOwogCWhlYWRfY29weV9vZmYgPSAwOwogCWlmIChuZXdoZWFkcm9vbSA8PSBoZWFkX2NvcHlfbGVuKQogCQloZWFkX2NvcHlfbGVuID0gbmV3aGVhZHJvb207CkBAIC03NTAsNiArNzYyLDEzIEBACiAKIAljb3B5X3NrYl9oZWFkZXIobiwgc2tiKTsKIAorI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorCW9mZiAgICAgICAgICAgICAgICAgID0gbmV3aGVhZHJvb20gLSBvbGRoZWFkcm9vbTsKKyNlbmRpZgorCW4tPnRyYW5zcG9ydF9oZWFkZXIgKz0gb2ZmOworCW4tPm5ldHdvcmtfaGVhZGVyICAgKz0gb2ZmOworCW4tPm1hY19oZWFkZXIJICAgICs9IG9mZjsKKwogCXJldHVybiBuOwogfQogCkBAIC04NzcsNyArODk2LDcgQEAKIAl9IGVsc2UgewogCQlza2ItPmxlbiAgICAgICA9IGxlbjsKIAkJc2tiLT5kYXRhX2xlbiAgPSAwOwotCQlza2ItPnRhaWwgICAgICA9IHNrYi0+ZGF0YSArIGxlbjsKKwkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBsZW4pOwogCX0KIAogCXJldHVybiAwOwpAQCAtOTIyLDcgKzk0MSw3IEBACiAJCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNrYl9oZWFkbGVuKHNrYiksIHNrYi0+dGFpbCwgZGVsdGEpKQorCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBkZWx0YSkpCiAJCUJVRygpOwogCiAJLyogT3B0aW1pemF0aW9uOiBubyBmcmFnbWVudHMsIG5vIHJlYXNvbnMgdG8gcHJlZXN0aW1hdGUKQEAgLTEwMTgsNyArMTAzNyw3IEBACiAJc2tiLT50YWlsICAgICArPSBkZWx0YTsKIAlza2ItPmRhdGFfbGVuIC09IGRlbHRhOwogCi0JcmV0dXJuIHNrYi0+dGFpbDsKKwlyZXR1cm4gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogfQogCiAvKiBDb3B5IHNvbWUgZGF0YSBiaXRzIGZyb20gc2tiIHRvIGtlcm5lbCBidWZmZXIuICovCkBAIC0xMDI2LDE2ICsxMDQ1LDE2IEBACiBpbnQgc2tiX2NvcHlfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCB2b2lkICp0bywgaW50IGxlbikKIHsKIAlpbnQgaSwgY29weTsKLQlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOwogCiAJaWYgKG9mZnNldCA+IChpbnQpc2tiLT5sZW4gLSBsZW4pCiAJCWdvdG8gZmF1bHQ7CiAKIAkvKiBDb3B5IGhlYWRlci4gKi8KLQlpZiAoKGNvcHkgPSBzdGFydCAtIG9mZnNldCkgPiAwKSB7CisJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKIAkJaWYgKGNvcHkgPiBsZW4pCiAJCQljb3B5ID0gbGVuOwotCQltZW1jcHkodG8sIHNrYi0+ZGF0YSArIG9mZnNldCwgY29weSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgb2Zmc2V0LCB0bywgY29weSk7CiAJCWlmICgobGVuIC09IGNvcHkpID09IDApCiAJCQlyZXR1cm4gMDsKIAkJb2Zmc2V0ICs9IGNvcHk7CkBAIC0xMDQzLDExICsxMDYyLDkgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWludCBlbmQ7CisJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQllbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQl1OCAqdmFkZHI7CiAKQEAgLTEwNTYsOCArMTA3Myw4IEBACiAKIAkJCXZhZGRyID0ga21hcF9za2JfZnJhZygmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSk7CiAJCQltZW1jcHkodG8sCi0JCQkgICAgICAgdmFkZHIgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0KwotCQkJICAgICAgIG9mZnNldCAtIHN0YXJ0LCBjb3B5KTsKKwkJCSAgICAgICB2YWRkciArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQsCisJCQkgICAgICAgY29weSk7CiAJCQlrdW5tYXBfc2tiX2ZyYWcodmFkZHIpOwogCiAJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQpAQCAtMTA2NSwzMCArMTA4MiwyNSBAQAogCQkJb2Zmc2V0ICs9IGNvcHk7CiAJCQl0byAgICAgKz0gY29weTsKIAkJfQotCQlzdGFydCA9IGVuZDsKIAl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAogCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCWludCBlbmQ7CisJCQlCVUdfVFJBUChsZW4gPj0gMCk7CiAKLQkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJZW5kID0gb2Zmc2V0ICsgbGlzdC0+bGVuOwogCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKIAkJCQlpZiAoY29weSA+IGxlbikKIAkJCQkJY29weSA9IGxlbjsKLQkJCQlpZiAoc2tiX2NvcHlfYml0cyhsaXN0LCBvZmZzZXQgLSBzdGFydCwKLQkJCQkJCSAgdG8sIGNvcHkpKQorCQkJCWlmIChza2JfY29weV9iaXRzKGxpc3QsIDAsIHRvLCBjb3B5KSkKIAkJCQkJZ290byBmYXVsdDsKIAkJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQogCQkJCQlyZXR1cm4gMDsKIAkJCQlvZmZzZXQgKz0gY29weTsKIAkJCQl0byAgICAgKz0gY29weTsKIAkJCX0KLQkJCXN0YXJ0ID0gZW5kOwogCQl9CiAJfQogCWlmICghbGVuKQpAQCAtMTExMCwxOCArMTEyMiwxOCBAQAogICoJdHJhdmVyc2luZyBmcmFnbWVudCBsaXN0cyBhbmQgc3VjaC4KICAqLwogCi1pbnQgc2tiX3N0b3JlX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgdm9pZCAqZnJvbSwgaW50IGxlbikKK2ludCBza2Jfc3RvcmVfYml0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQogewogCWludCBpLCBjb3B5OwotCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CisJaW50IGVuZCA9IHNrYl9oZWFkbGVuKHNrYik7CiAKIAlpZiAob2Zmc2V0ID4gKGludClza2ItPmxlbiAtIGxlbikKIAkJZ290byBmYXVsdDsKIAotCWlmICgoY29weSA9IHN0YXJ0IC0gb2Zmc2V0KSA+IDApIHsKKwlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQlpZiAoY29weSA+IGxlbikKIAkJCWNvcHkgPSBsZW47Ci0JCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsIGZyb20sIGNvcHkpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsIGZyb20sIGNvcHkpOwogCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCW9mZnNldCArPSBjb3B5OwpAQCAtMTEzMCwxMSArMTE0Miw5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CiAJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQkJaW50IGVuZDsKKwkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJZW5kID0gc3RhcnQgKyBmcmFnLT5zaXplOworCQllbmQgPSBvZmZzZXQgKyBmcmFnLT5zaXplOwogCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJdTggKnZhZGRyOwogCkBAIC0xMTQyLDggKzExNTIsNyBAQAogCQkJCWNvcHkgPSBsZW47CiAKIAkJCXZhZGRyID0ga21hcF9za2JfZnJhZyhmcmFnKTsKLQkJCW1lbWNweSh2YWRkciArIGZyYWctPnBhZ2Vfb2Zmc2V0ICsgb2Zmc2V0IC0gc3RhcnQsCi0JCQkgICAgICAgZnJvbSwgY29weSk7CisJCQltZW1jcHkodmFkZHIgKyBmcmFnLT5wYWdlX29mZnNldCwgZnJvbSwgY29weSk7CiAJCQlrdW5tYXBfc2tiX2ZyYWcodmFkZHIpOwogCiAJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQpAQCAtMTE1MSwzMCArMTE2MCwyNSBAQAogCQkJb2Zmc2V0ICs9IGNvcHk7CiAJCQlmcm9tICs9IGNvcHk7CiAJCX0KLQkJc3RhcnQgPSBlbmQ7CiAJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CiAJCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CiAKIAkJZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7Ci0JCQlpbnQgZW5kOworCQkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKKwkJCWVuZCA9IG9mZnNldCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQkJaWYgKGNvcHkgPiBsZW4pCiAJCQkJCWNvcHkgPSBsZW47Ci0JCQkJaWYgKHNrYl9zdG9yZV9iaXRzKGxpc3QsIG9mZnNldCAtIHN0YXJ0LAotCQkJCQkJICAgZnJvbSwgY29weSkpCisJCQkJaWYgKHNrYl9zdG9yZV9iaXRzKGxpc3QsIDAsIGZyb20sIGNvcHkpKQogCQkJCQlnb3RvIGZhdWx0OwogCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCiAJCQkJCXJldHVybiAwOwogCQkJCW9mZnNldCArPSBjb3B5OwogCQkJCWZyb20gKz0gY29weTsKIAkJCX0KLQkJCXN0YXJ0ID0gZW5kOwogCQl9CiAJfQogCWlmICghbGVuKQpAQCAtMTE5MSw4ICsxMTk1LDggQEAKIF9fd3N1bSBza2JfY2hlY2tzdW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCSAgaW50IGxlbiwgX193c3VtIGNzdW0pCiB7Ci0JaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKLQlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gZW5kIC0gb2Zmc2V0OwogCWludCBwb3MgPSAwOwogCiAJLyogQ2hlY2tzdW0gaGVhZGVyLiAqLwpAQCAtMTIwNywxMSArMTIxMSw5IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewotCQlpbnQgZW5kOworCQlCVUdfVFJBUChsZW4gPj0gMCk7CiAKLQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJZW5kID0gb2Zmc2V0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwogCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJX193c3VtIGNzdW0yOwogCQkJdTggKnZhZGRyOwpAQCAtMTIyMCw4ICsxMjIyLDggQEAKIAkJCWlmIChjb3B5ID4gbGVuKQogCQkJCWNvcHkgPSBsZW47CiAJCQl2YWRkciA9IGttYXBfc2tiX2ZyYWcoZnJhZyk7Ci0JCQljc3VtMiA9IGNzdW1fcGFydGlhbCh2YWRkciArIGZyYWctPnBhZ2Vfb2Zmc2V0ICsKLQkJCQkJICAgICBvZmZzZXQgLSBzdGFydCwgY29weSwgMCk7CisJCQljc3VtMiA9IGNzdW1fcGFydGlhbCh2YWRkciArIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgIGNvcHksIDApOwogCQkJa3VubWFwX3NrYl9mcmFnKHZhZGRyKTsKIAkJCWNzdW0gPSBjc3VtX2Jsb2NrX2FkZChjc3VtLCBjc3VtMiwgcG9zKTsKIAkJCWlmICghKGxlbiAtPSBjb3B5KSkKQEAgLTEyMjksMzEgKzEyMzEsMjYgQEAKIAkJCW9mZnNldCArPSBjb3B5OwogCQkJcG9zICAgICs9IGNvcHk7CiAJCX0KLQkJc3RhcnQgPSBlbmQ7CiAJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CiAJCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CiAKIAkJZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7Ci0JCQlpbnQgZW5kOworCQkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKKwkJCWVuZCA9IG9mZnNldCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQkJX193c3VtIGNzdW0yOwogCQkJCWlmIChjb3B5ID4gbGVuKQogCQkJCQljb3B5ID0gbGVuOwotCQkJCWNzdW0yID0gc2tiX2NoZWNrc3VtKGxpc3QsIG9mZnNldCAtIHN0YXJ0LAotCQkJCQkJICAgICBjb3B5LCAwKTsKKwkJCQljc3VtMiA9IHNrYl9jaGVja3N1bShsaXN0LCAwLCBjb3B5LCAwKTsKIAkJCQljc3VtID0gY3N1bV9ibG9ja19hZGQoY3N1bSwgY3N1bTIsIHBvcyk7CiAJCQkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKIAkJCQkJcmV0dXJuIGNzdW07CiAJCQkJb2Zmc2V0ICs9IGNvcHk7CiAJCQkJcG9zICAgICs9IGNvcHk7CiAJCQl9Ci0JCQlzdGFydCA9IGVuZDsKIAkJfQogCX0KIAlCVUdfT04obGVuKTsKQEAgLTEyNjYsOCArMTI2Myw4IEBACiBfX3dzdW0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJCSAgICB1OCAqdG8sIGludCBsZW4sIF9fd3N1bSBjc3VtKQogewotCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7Ci0JaW50IGksIGNvcHkgPSBzdGFydCAtIG9mZnNldDsKKwlpbnQgZW5kID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgaSwgY29weSA9IGVuZCAtIG9mZnNldDsKIAlpbnQgcG9zID0gMDsKIAogCS8qIENvcHkgaGVhZGVyLiAqLwpAQCAtMTI4NCwxMSArMTI4MSw5IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewotCQlpbnQgZW5kOworCQlCVUdfVFJBUChsZW4gPj0gMCk7CiAKLQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJZW5kID0gb2Zmc2V0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwogCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJX193c3VtIGNzdW0yOwogCQkJdTggKnZhZGRyOwpAQCAtMTI5OCw5ICsxMjkzLDggQEAKIAkJCQljb3B5ID0gbGVuOwogCQkJdmFkZHIgPSBrbWFwX3NrYl9mcmFnKGZyYWcpOwogCQkJY3N1bTIgPSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHZhZGRyICsKLQkJCQkJCQkgIGZyYWctPnBhZ2Vfb2Zmc2V0ICsKLQkJCQkJCQkgIG9mZnNldCAtIHN0YXJ0LCB0bywKLQkJCQkJCQkgIGNvcHksIDApOworCQkJCQkJCSAgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCQkJICB0bywgY29weSwgMCk7CiAJCQlrdW5tYXBfc2tiX2ZyYWcodmFkZHIpOwogCQkJY3N1bSA9IGNzdW1fYmxvY2tfYWRkKGNzdW0sIGNzdW0yLCBwb3MpOwogCQkJaWYgKCEobGVuIC09IGNvcHkpKQpAQCAtMTMwOSw3ICsxMzAzLDYgQEAKIAkJCXRvICAgICArPSBjb3B5OwogCQkJcG9zICAgICs9IGNvcHk7CiAJCX0KLQkJc3RhcnQgPSBlbmQ7CiAJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CkBAIC0xMzE3LDE2ICsxMzEwLDEzIEBACiAKIAkJZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CiAJCQlfX3dzdW0gY3N1bTI7Ci0JCQlpbnQgZW5kOworCQkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKKwkJCWVuZCA9IG9mZnNldCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQkJaWYgKGNvcHkgPiBsZW4pCiAJCQkJCWNvcHkgPSBsZW47Ci0JCQkJY3N1bTIgPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKGxpc3QsCi0JCQkJCQkJICAgICAgIG9mZnNldCAtIHN0YXJ0LAorCQkJCWNzdW0yID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhsaXN0LCAwLAogCQkJCQkJCSAgICAgICB0bywgY29weSwgMCk7CiAJCQkJY3N1bSA9IGNzdW1fYmxvY2tfYWRkKGNzdW0sIGNzdW0yLCBwb3MpOwogCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCkBAIC0xMzM1LDcgKzEzMjUsNiBAQAogCQkJCXRvICAgICArPSBjb3B5OwogCQkJCXBvcyAgICArPSBjb3B5OwogCQkJfQotCQkJc3RhcnQgPSBlbmQ7CiAJCX0KIAl9CiAJQlVHX09OKGxlbik7CkBAIC0xMzQ4LDEzICsxMzM3LDEzIEBACiAJbG9uZyBjc3N0YXJ0OwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0JCWNzc3RhcnQgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCQljc3N0YXJ0ID0gc2tiLT5jc3VtX3N0YXJ0IC0gc2tiX2hlYWRyb29tKHNrYik7CiAJZWxzZQogCQljc3N0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKIAogCUJVR19PTihjc3N0YXJ0ID4gc2tiX2hlYWRsZW4oc2tiKSk7CiAKLQltZW1jcHkodG8sIHNrYi0+ZGF0YSwgY3NzdGFydCk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRvLCBjc3N0YXJ0KTsKIAogCWNzdW0gPSAwOwogCWlmIChjc3N0YXJ0ICE9IHNrYi0+bGVuKQpAQCAtMTUyMiwyNyArMTUxMSwxNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKIH0KIAotI2lmIDAKLS8qCi0gKiAJVHVuZSB0aGUgbWVtb3J5IGFsbG9jYXRvciBmb3IgYSBuZXcgTVRVIHNpemUuCi0gKi8KLXZvaWQgc2tiX2FkZF9tdHUoaW50IG10dSkKLXsKLQkvKiBNdXN0IG1hdGNoIGFsbG9jYXRpb24gaW4gYWxsb2Nfc2tiICovCi0JbXR1ID0gU0tCX0RBVEFfQUxJR04obXR1KSArIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKTsKLQotCWttZW1fYWRkX2NhY2hlX3NpemUobXR1KTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NwbGl0X2luc2lkZV9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYqIHNrYjEsCiAJCQkJCSAgIGNvbnN0IHUzMiBsZW4sIGNvbnN0IGludCBwb3MpCiB7CiAJaW50IGk7CiAKLQltZW1jcHkoc2tiX3B1dChza2IxLCBwb3MgLSBsZW4pLCBza2ItPmRhdGEgKyBsZW4sIHBvcyAtIGxlbik7Ci0KKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGxlbiwgc2tiX3B1dChza2IxLCBwb3MgLSBsZW4pLAorCQkJCQkgcG9zIC0gbGVuKTsKIAkvKiBBbmQgbW92ZSBkYXRhIGFwcGVuZGl4IGFzIGlzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspCiAJCXNrYl9zaGluZm8oc2tiMSktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKQEAgLTE1NTMsNyArMTUyOSw3IEBACiAJc2tiMS0+bGVuCQkgICArPSBza2IxLT5kYXRhX2xlbjsKIAlza2ItPmRhdGFfbGVuCQkgICA9IDA7CiAJc2tiLT5sZW4JCSAgID0gbGVuOwotCXNrYi0+dGFpbAkJICAgPSBza2ItPmRhdGEgKyBsZW47CisJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBsZW4pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NwbGl0X25vX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTg3OCw3ICsxODU0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnRhaWwgPSBOVUxMOwogCXVuc2lnbmVkIGludCBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwotCXVuc2lnbmVkIGludCBkb2Zmc2V0ID0gc2tiLT5kYXRhIC0gc2tiLT5tYWMucmF3OworCXVuc2lnbmVkIGludCBkb2Zmc2V0ID0gc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZG9mZnNldDsKIAl1bnNpZ25lZCBpbnQgaGVhZHJvb207CiAJdW5zaWduZWQgaW50IGxlbjsKQEAgLTE5MjgsMTEgKzE5MDQsMTIgQEAKIAkJbnNrYi0+bWFjX2xlbiA9IHNrYi0+bWFjX2xlbjsKIAogCQlza2JfcmVzZXJ2ZShuc2tiLCBoZWFkcm9vbSk7Ci0JCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5kYXRhOwotCQluc2tiLT5uaC5yYXcgPSBuc2tiLT5kYXRhICsgc2tiLT5tYWNfbGVuOwotCQluc2tiLT5oLnJhdyA9IG5za2ItPm5oLnJhdyArIChza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOwotCQltZW1jcHkoc2tiX3B1dChuc2tiLCBkb2Zmc2V0KSwgc2tiLT5kYXRhLCBkb2Zmc2V0KTsKLQorCQlza2JfcmVzZXRfbWFjX2hlYWRlcihuc2tiKTsKKwkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihuc2tiLCBza2ItPm1hY19sZW4pOworCQluc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gKG5za2ItPm5ldHdvcmtfaGVhZGVyICsKKwkJCQkJICBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChuc2tiLCBkb2Zmc2V0KSwKKwkJCQkJICBkb2Zmc2V0KTsKIAkJaWYgKCFzZykgewogCQkJbnNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiLCBvZmZzZXQsCiAJCQkJCQkJICAgIHNrYl9wdXQobnNrYiwgbGVuKSwKQEAgLTE5NDUsNyArMTkyMiw4IEBACiAKIAkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJbnNrYi0+Y3N1bSA9IHNrYi0+Y3N1bTsKLQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgaHNpemUpLCBza2ItPmRhdGEgKyBvZmZzZXQsIGhzaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsCisJCQkJCQkgc2tiX3B1dChuc2tiLCBoc2l6ZSksIGhzaXplKTsKIAogCQl3aGlsZSAocG9zIDwgb2Zmc2V0ICsgbGVuKSB7CiAJCQlCVUdfT04oaSA+PSBuZnJhZ3MpOwpAQCAtMjAwNSw2ICsxOTgzLDE4NCBAQAogCQkJCQkJTlVMTCwgTlVMTCk7CiB9CiAKKy8qKgorICoJc2tiX3RvX3NndmVjIC0gRmlsbCBhIHNjYXR0ZXItZ2F0aGVyIGxpc3QgZnJvbSBhIHNvY2tldCBidWZmZXIKKyAqCUBza2I6IFNvY2tldCBidWZmZXIgY29udGFpbmluZyB0aGUgYnVmZmVycyB0byBiZSBtYXBwZWQKKyAqCUBzZzogVGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgdG8gbWFwIGludG8KKyAqCUBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyJ3MgY29udGVudHMgdG8gc3RhcnQgbWFwcGluZworICoJQGxlbjogTGVuZ3RoIG9mIGJ1ZmZlciBzcGFjZSB0byBiZSBtYXBwZWQKKyAqCisgKglGaWxsIHRoZSBzcGVjaWZpZWQgc2NhdHRlci1nYXRoZXIgbGlzdCB3aXRoIG1hcHBpbmdzL3BvaW50ZXJzIGludG8gYQorICoJcmVnaW9uIG9mIHRoZSBidWZmZXIgc3BhY2UgYXR0YWNoZWQgdG8gYSBzb2NrZXQgYnVmZmVyLgorICovCitpbnQKK3NrYl90b19zZ3ZlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQoreworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gZW5kIC0gb2Zmc2V0OworCWludCBlbHQgPSAwOworCisJaWYgKGNvcHkgPiAwKSB7CisJCWlmIChjb3B5ID4gbGVuKQorCQkJY29weSA9IGxlbjsKKwkJc2dbZWx0XS5wYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArIG9mZnNldCk7CisJCXNnW2VsdF0ub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCkgJSBQQUdFX1NJWkU7CisJCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKKwkJZWx0Kys7CisJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQlyZXR1cm4gZWx0OworCQlvZmZzZXQgKz0gY29weTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCUJVR19UUkFQKGxlbiA+PSAwKTsKKworCQllbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJCWlmIChjb3B5ID4gbGVuKQorCQkJCWNvcHkgPSBsZW47CisJCQlzZ1tlbHRdLnBhZ2UgPSBmcmFnLT5wYWdlOworCQkJc2dbZWx0XS5vZmZzZXQgPSBmcmFnLT5wYWdlX29mZnNldDsKKwkJCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKKwkJCWVsdCsrOworCQkJaWYgKCEobGVuIC09IGNvcHkpKQorCQkJCXJldHVybiBlbHQ7CisJCQlvZmZzZXQgKz0gY29weTsKKwkJfQorCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJQlVHX1RSQVAobGVuID49IDApOworCisJCQllbmQgPSBvZmZzZXQgKyBsaXN0LT5sZW47CisJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJCWlmIChjb3B5ID4gbGVuKQorCQkJCQljb3B5ID0gbGVuOworCQkJCWVsdCArPSBza2JfdG9fc2d2ZWMobGlzdCwgc2crZWx0LCAwLCBjb3B5KTsKKwkJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQorCQkJCQlyZXR1cm4gZWx0OworCQkJCW9mZnNldCArPSBjb3B5OworCQkJfQorCQl9CisJfQorCUJVR19PTihsZW4pOworCXJldHVybiBlbHQ7Cit9CisKKy8qKgorICoJc2tiX2Nvd19kYXRhIC0gQ2hlY2sgdGhhdCBhIHNvY2tldCBidWZmZXIncyBkYXRhIGJ1ZmZlcnMgYXJlIHdyaXRhYmxlCisgKglAc2tiOiBUaGUgc29ja2V0IGJ1ZmZlciB0byBjaGVjay4KKyAqCUB0YWlsYml0czogQW1vdW50IG9mIHRyYWlsaW5nIHNwYWNlIHRvIGJlIGFkZGVkCisgKglAdHJhaWxlcjogUmV0dXJuZWQgcG9pbnRlciB0byB0aGUgc2tiIHdoZXJlIHRoZSBAdGFpbGJpdHMgc3BhY2UgYmVnaW5zCisgKgorICoJTWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgYnVmZmVycyBhdHRhY2hlZCB0byBhIHNvY2tldCBidWZmZXIgYXJlCisgKgl3cml0YWJsZS4gSWYgdGhleSBhcmUgbm90LCBwcml2YXRlIGNvcGllcyBhcmUgbWFkZSBvZiB0aGUgZGF0YSBidWZmZXJzCisgKglhbmQgdGhlIHNvY2tldCBidWZmZXIgaXMgc2V0IHRvIHVzZSB0aGVzZSBpbnN0ZWFkLgorICoKKyAqCUlmIEB0YWlsYml0cyBpcyBnaXZlbiwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgc3BhY2UgdG8gd3JpdGUgQHRhaWxiaXRzCisgKglieXRlcyBvZiBkYXRhIGJleW9uZCBjdXJyZW50IGVuZCBvZiBzb2NrZXQgYnVmZmVyLiAgQHRyYWlsZXIgd2lsbCBiZQorICoJc2V0IHRvIHBvaW50IHRvIHRoZSBza2IgaW4gd2hpY2ggdGhpcyBzcGFjZSBiZWdpbnMuCisgKgorICoJVGhlIG51bWJlciBvZiBzY2F0dGVybGlzdCBlbGVtZW50cyByZXF1aXJlZCB0byBjb21wbGV0ZWx5IG1hcCB0aGUKKyAqCUNPVydkIGFuZCBleHRlbmRlZCBzb2NrZXQgYnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK2ludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpCit7CisJaW50IGNvcHlmbGFnOworCWludCBlbHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjEsICoqc2tiX3A7CisKKwkvKiBJZiBza2IgaXMgY2xvbmVkIG9yIGl0cyBoZWFkIGlzIHBhZ2VkLCByZWFsbG9jYXRlCisJICogaGVhZCBwdWxsaW5nIG91dCBhbGwgdGhlIHBhZ2VzIChwYWdlcyBhcmUgY29uc2lkZXJlZCBub3Qgd3JpdGFibGUKKwkgKiBhdCB0aGUgbW9tZW50IGV2ZW4gaWYgdGhleSBhcmUgYW5vbnltb3VzKS4KKwkgKi8KKwlpZiAoKHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSAmJgorCSAgICBfX3Bza2JfcHVsbF90YWlsKHNrYiwgc2tiX3BhZ2VsZW4oc2tiKS1za2JfaGVhZGxlbihza2IpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEVhc3kgY2FzZS4gTW9zdCBvZiBwYWNrZXRzIHdpbGwgZ28gdGhpcyB3YXkuICovCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQkvKiBBIGxpdHRsZSBvZiB0cm91YmxlLCBub3QgZW5vdWdoIG9mIHNwYWNlIGZvciB0cmFpbGVyLgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB3aGVuIHN0YWNrIGlzIHR1bmVkIHRvIGdlbmVyYXRlCisJCSAqIGdvb2QgZnJhbWVzLiBPSywgb24gbWlzcyB3ZSByZWFsbG9jYXRlIGFuZCByZXNlcnZlIGV2ZW4gbW9yZQorCQkgKiBzcGFjZSwgMTI4IGJ5dGVzIGlzIGZhaXIuICovCisKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgdGFpbGJpdHMgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCB0YWlsYml0cy1za2JfdGFpbHJvb20oc2tiKSsxMjgsIEdGUF9BVE9NSUMpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogVm9pbGEhICovCisJCSp0cmFpbGVyID0gc2tiOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBNaXNlcnkuIFdlIGFyZSBpbiB0cm91YmxlcywgZ29pbmcgdG8gbWluY2VyIGZyYWdtZW50cy4uLiAqLworCisJZWx0ID0gMTsKKwlza2JfcCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwljb3B5ZmxhZyA9IDA7CisKKwl3aGlsZSAoKHNrYjEgPSAqc2tiX3ApICE9IE5VTEwpIHsKKwkJaW50IG50YWlsID0gMDsKKworCQkvKiBUaGUgZnJhZ21lbnQgaXMgcGFydGlhbGx5IHB1bGxlZCBieSBzb21lb25lLAorCQkgKiB0aGlzIGNhbiBoYXBwZW4gb24gaW5wdXQuIENvcHkgaXQgYW5kIGV2ZXJ5dGhpbmcKKwkJICogYWZ0ZXIgaXQuICovCisKKwkJaWYgKHNrYl9zaGFyZWQoc2tiMSkpCisJCQljb3B5ZmxhZyA9IDE7CisKKwkJLyogSWYgdGhlIHNrYiBpcyB0aGUgbGFzdCwgd29ycnkgYWJvdXQgdHJhaWxlci4gKi8KKworCQlpZiAoc2tiMS0+bmV4dCA9PSBOVUxMICYmIHRhaWxiaXRzKSB7CisJCQlpZiAoc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJCSAgICBza2Jfc2hpbmZvKHNrYjEpLT5mcmFnX2xpc3QgfHwKKwkJCSAgICBza2JfdGFpbHJvb20oc2tiMSkgPCB0YWlsYml0cykKKwkJCQludGFpbCA9IHRhaWxiaXRzICsgMTI4OworCQl9CisKKwkJaWYgKGNvcHlmbGFnIHx8CisJCSAgICBza2JfY2xvbmVkKHNrYjEpIHx8CisJCSAgICBudGFpbCB8fAorCQkgICAgc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJICAgIHNrYl9zaGluZm8oc2tiMSktPmZyYWdfbGlzdCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJCS8qIEZ1Y2ssIHdlIGFyZSBtaXNlcmFibGUgcG9vciBndXlzLi4uICovCisJCQlpZiAobnRhaWwgPT0gMCkKKwkJCQlza2IyID0gc2tiX2NvcHkoc2tiMSwgR0ZQX0FUT01JQyk7CisJCQllbHNlCisJCQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IxLAorCQkJCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IxKSwKKwkJCQkJCSAgICAgICBudGFpbCwKKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShza2IyID09IE5VTEwpKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlpZiAoc2tiMS0+c2spCisJCQkJc2tiX3NldF9vd25lcl93KHNrYjIsIHNrYjEtPnNrKTsKKworCQkJLyogTG9va2luZyBhcm91bmQuIEFyZSB3ZSBzdGlsbCBhbGl2ZT8KKwkJCSAqIE9LLCBsaW5rIG5ldyBza2IsIGRyb3Agb2xkIG9uZSAqLworCisJCQlza2IyLT5uZXh0ID0gc2tiMS0+bmV4dDsKKwkJCSpza2JfcCA9IHNrYjI7CisJCQlrZnJlZV9za2Ioc2tiMSk7CisJCQlza2IxID0gc2tiMjsKKwkJfQorCQllbHQrKzsKKwkJKnRyYWlsZXIgPSBza2IxOworCQlza2JfcCA9ICZza2IxLT5uZXh0OworCX0KKworCXJldHVybiBlbHQ7Cit9CisKIEVYUE9SVF9TWU1CT0woX19fcHNrYl90cmltKTsKIEVYUE9SVF9TWU1CT0woX19rZnJlZV9za2IpOwogRVhQT1JUX1NZTUJPTChrZnJlZV9za2IpOwpAQCAtMjAzOSwzICsyMTk1LDYgQEAKIEVYUE9SVF9TWU1CT0woc2tiX2Fib3J0X3NlcV9yZWFkKTsKIEVYUE9SVF9TWU1CT0woc2tiX2ZpbmRfdGV4dCk7CiBFWFBPUlRfU1lNQk9MKHNrYl9hcHBlbmRfZGF0YXRvX2ZyYWdzKTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3RvX3NndmVjKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNrYl9jb3dfZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggMjdjNGY2Mi4uMjIxODNjMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTU0LDcgKzE1NCw4IEBACiAgICJza19sb2NrLTIxIiAgICAgICAsICJza19sb2NrLUFGX1NOQSIgICAgICAsICJza19sb2NrLUFGX0lSREEiICAgICAsCiAgICJza19sb2NrLUFGX1BQUE9YIiAsICJza19sb2NrLUFGX1dBTlBJUEUiICAsICJza19sb2NrLUFGX0xMQyIgICAgICAsCiAgICJza19sb2NrLTI3IiAgICAgICAsICJza19sb2NrLTI4IiAgICAgICAgICAsICJza19sb2NrLTI5IiAgICAgICAgICAsCi0gICJza19sb2NrLUFGX1RJUEMiICAsICJza19sb2NrLUFGX0JMVUVUT09USCIsICJza19sb2NrLUFGX01BWCIKKyAgInNrX2xvY2stQUZfVElQQyIgICwgInNrX2xvY2stQUZfQkxVRVRPT1RIIiwgInNrX2xvY2stSVVDViIgICAgICAgICwKKyAgInNrX2xvY2stQUZfUlhSUEMiICwgInNrX2xvY2stQUZfTUFYIgogfTsKIHN0YXRpYyBjb25zdCBjaGFyICphZl9mYW1pbHlfc2xvY2tfa2V5X3N0cmluZ3NbQUZfTUFYKzFdID0gewogICAic2xvY2stQUZfVU5TUEVDIiwgInNsb2NrLUFGX1VOSVgiICAgICAsICJzbG9jay1BRl9JTkVUIiAgICAgLApAQCAtMTY3LDcgKzE2OCw4IEBACiAgICJzbG9jay0yMSIgICAgICAgLCAic2xvY2stQUZfU05BIiAgICAgICwgInNsb2NrLUFGX0lSREEiICAgICAsCiAgICJzbG9jay1BRl9QUFBPWCIgLCAic2xvY2stQUZfV0FOUElQRSIgICwgInNsb2NrLUFGX0xMQyIgICAgICAsCiAgICJzbG9jay0yNyIgICAgICAgLCAic2xvY2stMjgiICAgICAgICAgICwgInNsb2NrLTI5IiAgICAgICAgICAsCi0gICJzbG9jay1BRl9USVBDIiAgLCAic2xvY2stQUZfQkxVRVRPT1RIIiwgInNsb2NrLUFGX01BWCIKKyAgInNsb2NrLUFGX1RJUEMiICAsICJzbG9jay1BRl9CTFVFVE9PVEgiLCAic2xvY2stQUZfSVVDViIgICAgICwKKyAgInNsb2NrLUFGX1JYUlBDIiAsICJzbG9jay1BRl9NQVgiCiB9OwogI2VuZGlmCiAKQEAgLTM2MSw4ICszNjMsOCBAQAogCX0KICNlbmRpZgogCi0JaWYob3B0bGVuPHNpemVvZihpbnQpKQotCQlyZXR1cm4oLUVJTlZBTCk7CisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zNzEsMjY1ICszNzMsMjcwIEBACiAKIAlsb2NrX3NvY2soc2spOwogCi0Jc3dpdGNoKG9wdG5hbWUpCi0JewotCQljYXNlIFNPX0RFQlVHOgotCQkJaWYodmFsICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJewotCQkJCXJldCA9IC1FQUNDRVM7Ci0JCQl9Ci0JCQllbHNlIGlmICh2YWxib29sKQotCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREJHKTsKLQkJCWVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfREJHKTsKLQkJCWJyZWFrOwotCQljYXNlIFNPX1JFVVNFQUREUjoKLQkJCXNrLT5za19yZXVzZSA9IHZhbGJvb2w7Ci0JCQlicmVhazsKLQkJY2FzZSBTT19UWVBFOgotCQljYXNlIFNPX0VSUk9SOgotCQkJcmV0ID0gLUVOT1BST1RPT1BUOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09fRE9OVFJPVVRFOgotCQkJaWYgKHZhbGJvb2wpCi0JCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MT0NBTFJPVVRFKTsKLQkJCWVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTT19CUk9BRENBU1Q6Ci0JCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19CUk9BRENBU1QsIHZhbGJvb2wpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09fU05EQlVGOgotCQkJLyogRG9uJ3QgZXJyb3Igb24gdGhpcyBCU0QgZG9lc24ndCBhbmQgaWYgeW91IHRoaW5rCi0JCQkgICBhYm91dCBpdCB0aGlzIGlzIHJpZ2h0LiBPdGhlcndpc2UgYXBwcyBoYXZlIHRvCi0JCQkgICBwbGF5ICdndWVzcyB0aGUgYmlnZ2VzdCBzaXplJyBnYW1lcy4gUkNWQlVGL1NOREJVRgotCQkJICAgYXJlIHRyZWF0ZWQgaW4gQlNEIGFzIGhpbnRzICovCisJc3dpdGNoKG9wdG5hbWUpIHsKKwljYXNlIFNPX0RFQlVHOgorCQlpZiAodmFsICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRUFDQ0VTOworCQl9CisJCWVsc2UgaWYgKHZhbGJvb2wpCisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RCRyk7CisJCWVsc2UKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19EQkcpOworCQlicmVhazsKKwljYXNlIFNPX1JFVVNFQUREUjoKKwkJc2stPnNrX3JldXNlID0gdmFsYm9vbDsKKwkJYnJlYWs7CisJY2FzZSBTT19UWVBFOgorCWNhc2UgU09fRVJST1I6CisJCXJldCA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJY2FzZSBTT19ET05UUk9VVEU6CisJCWlmICh2YWxib29sKQorCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MT0NBTFJPVVRFKTsKKwkJZWxzZQorCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xPQ0FMUk9VVEUpOworCQlicmVhazsKKwljYXNlIFNPX0JST0FEQ0FTVDoKKwkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNULCB2YWxib29sKTsKKwkJYnJlYWs7CisJY2FzZSBTT19TTkRCVUY6CisJCS8qIERvbid0IGVycm9yIG9uIHRoaXMgQlNEIGRvZXNuJ3QgYW5kIGlmIHlvdSB0aGluaworCQkgICBhYm91dCBpdCB0aGlzIGlzIHJpZ2h0LiBPdGhlcndpc2UgYXBwcyBoYXZlIHRvCisJCSAgIHBsYXkgJ2d1ZXNzIHRoZSBiaWdnZXN0IHNpemUnIGdhbWVzLiBSQ1ZCVUYvU05EQlVGCisJCSAgIGFyZSB0cmVhdGVkIGluIEJTRCBhcyBoaW50cyAqLwogCi0JCQlpZiAodmFsID4gc3lzY3RsX3dtZW1fbWF4KQotCQkJCXZhbCA9IHN5c2N0bF93bWVtX21heDsKKwkJaWYgKHZhbCA+IHN5c2N0bF93bWVtX21heCkKKwkJCXZhbCA9IHN5c2N0bF93bWVtX21heDsKIHNldF9zbmRidWY6Ci0JCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfU05EQlVGX0xPQ0s7Ci0JCQlpZiAoKHZhbCAqIDIpIDwgU09DS19NSU5fU05EQlVGKQotCQkJCXNrLT5za19zbmRidWYgPSBTT0NLX01JTl9TTkRCVUY7Ci0JCQllbHNlCi0JCQkJc2stPnNrX3NuZGJ1ZiA9IHZhbCAqIDI7CisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19TTkRCVUZfTE9DSzsKKwkJaWYgKCh2YWwgKiAyKSA8IFNPQ0tfTUlOX1NOREJVRikKKwkJCXNrLT5za19zbmRidWYgPSBTT0NLX01JTl9TTkRCVUY7CisJCWVsc2UKKwkJCXNrLT5za19zbmRidWYgPSB2YWwgKiAyOwogCi0JCQkvKgotCQkJICoJV2FrZSB1cCBzZW5kaW5nIHRhc2tzIGlmIHdlCi0JCQkgKgl1cHBlZCB0aGUgdmFsdWUuCi0JCQkgKi8KLQkJCXNrLT5za193cml0ZV9zcGFjZShzayk7Ci0JCQlicmVhazsKKwkJLyoKKwkJICoJV2FrZSB1cCBzZW5kaW5nIHRhc2tzIGlmIHdlCisJCSAqCXVwcGVkIHRoZSB2YWx1ZS4KKwkJICovCisJCXNrLT5za193cml0ZV9zcGFjZShzayk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fU05EQlVGRk9SQ0U6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIHNldF9zbmRidWY7Ci0KLQkJY2FzZSBTT19SQ1ZCVUY6Ci0JCQkvKiBEb24ndCBlcnJvciBvbiB0aGlzIEJTRCBkb2Vzbid0IGFuZCBpZiB5b3UgdGhpbmsKLQkJCSAgIGFib3V0IGl0IHRoaXMgaXMgcmlnaHQuIE90aGVyd2lzZSBhcHBzIGhhdmUgdG8KLQkJCSAgIHBsYXkgJ2d1ZXNzIHRoZSBiaWdnZXN0IHNpemUnIGdhbWVzLiBSQ1ZCVUYvU05EQlVGCi0JCQkgICBhcmUgdHJlYXRlZCBpbiBCU0QgYXMgaGludHMgKi8KLQotCQkJaWYgKHZhbCA+IHN5c2N0bF9ybWVtX21heCkKLQkJCQl2YWwgPSBzeXNjdGxfcm1lbV9tYXg7Ci1zZXRfcmN2YnVmOgotCQkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOwotCQkJLyoKLQkJCSAqIFdlIGRvdWJsZSBpdCBvbiB0aGUgd2F5IGluIHRvIGFjY291bnQgZm9yCi0JCQkgKiAic3RydWN0IHNrX2J1ZmYiIGV0Yy4gb3ZlcmhlYWQuICAgQXBwbGljYXRpb25zCi0JCQkgKiBhc3N1bWUgdGhhdCB0aGUgU09fUkNWQlVGIHNldHRpbmcgdGhleSBtYWtlIHdpbGwKLQkJCSAqIGFsbG93IHRoYXQgbXVjaCBhY3R1YWwgZGF0YSB0byBiZSByZWNlaXZlZCBvbiB0aGF0Ci0JCQkgKiBzb2NrZXQuCi0JCQkgKgotCQkJICogQXBwbGljYXRpb25zIGFyZSB1bmF3YXJlIHRoYXQgInN0cnVjdCBza19idWZmIiBhbmQKLQkJCSAqIG90aGVyIG92ZXJoZWFkcyBhbGxvY2F0ZSBmcm9tIHRoZSByZWNlaXZlIGJ1ZmZlcgotCQkJICogZHVyaW5nIHNvY2tldCBidWZmZXIgYWxsb2NhdGlvbi4KLQkJCSAqCi0JCQkgKiBBbmQgYWZ0ZXIgY29uc2lkZXJpbmcgdGhlIHBvc3NpYmxlIGFsdGVybmF0aXZlcywKLQkJCSAqIHJldHVybmluZyB0aGUgdmFsdWUgd2UgYWN0dWFsbHkgdXNlZCBpbiBnZXRzb2Nrb3B0Ci0JCQkgKiBpcyB0aGUgbW9zdCBkZXNpcmFibGUgYmVoYXZpb3IuCi0JCQkgKi8KLQkJCWlmICgodmFsICogMikgPCBTT0NLX01JTl9SQ1ZCVUYpCi0JCQkJc2stPnNrX3JjdmJ1ZiA9IFNPQ0tfTUlOX1JDVkJVRjsKLQkJCWVsc2UKLQkJCQlzay0+c2tfcmN2YnVmID0gdmFsICogMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUkNWQlVGRk9SQ0U6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIHNldF9yY3ZidWY7Ci0KLQkJY2FzZSBTT19LRUVQQUxJVkU6Ci0jaWZkZWYgQ09ORklHX0lORVQKLQkJCWlmIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCi0JCQkJdGNwX3NldF9rZWVwYWxpdmUoc2ssIHZhbGJvb2wpOwotI2VuZGlmCi0JCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19LRUVQT1BFTiwgdmFsYm9vbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX09PQklOTElORToKLQkJCXNvY2tfdmFsYm9vbF9mbGFnKHNrLCBTT0NLX1VSR0lOTElORSwgdmFsYm9vbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX05PX0NIRUNLOgotCQkJc2stPnNrX25vX2NoZWNrID0gdmFsYm9vbDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUFJJT1JJVFk6Ci0JCQlpZiAoKHZhbCA+PSAwICYmIHZhbCA8PSA2KSB8fCBjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCXNrLT5za19wcmlvcml0eSA9IHZhbDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0xJTkdFUjoKLQkJCWlmKG9wdGxlbjxzaXplb2YobGluZykpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwkvKiAxMDAzLjFnICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmcsb3B0dmFsLHNpemVvZihsaW5nKSkpIHsKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFsaW5nLmxfb25vZmYpCi0JCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7Ci0JCQllbHNlIHsKLSNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKLQkJCQlpZiAoKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyID49IE1BWF9TQ0hFRFVMRV9USU1FT1VUL0haKQotCQkJCQlzay0+c2tfbGluZ2VydGltZSA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCQkJCWVsc2UKLSNlbmRpZgotCQkJCQlzay0+c2tfbGluZ2VydGltZSA9ICh1bnNpZ25lZCBpbnQpbGluZy5sX2xpbmdlciAqIEhaOwotCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTElOR0VSKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fQlNEQ09NUEFUOgotCQkJc29ja193YXJuX29ic29sZXRlX2JzZGlzbSgic2V0c29ja29wdCIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19QQVNTQ1JFRDoKLQkJCWlmICh2YWxib29sKQotCQkJCXNldF9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKLQkJCWVsc2UKLQkJCQljbGVhcl9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fVElNRVNUQU1QOgotCQkJaWYgKHZhbGJvb2wpICB7Ci0JCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOwotCQkJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7Ci0JCQl9IGVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUkNWTE9XQVQ6Ci0JCQlpZiAodmFsIDwgMCkKLQkJCQl2YWwgPSBJTlRfTUFYOwotCQkJc2stPnNrX3Jjdmxvd2F0ID0gdmFsID8gOiAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19SQ1ZUSU1FTzoKLQkJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19yY3Z0aW1lbywgb3B0dmFsLCBvcHRsZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19TTkRUSU1FTzoKLQkJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19zbmR0aW1lbywgb3B0dmFsLCBvcHRsZW4pOwotCQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfTkVUREVWSUNFUwotCQljYXNlIFNPX0JJTkRUT0RFVklDRToKLQkJewotCQkJY2hhciBkZXZuYW1lW0lGTkFNU0laXTsKLQotCQkJLyogU29ycnkuLi4gKi8KLQkJCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIEJpbmQgdGhpcyBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBsaWtlICJldGgwIiwKLQkJCSAqIGFzIHNwZWNpZmllZCBpbiB0aGUgcGFzc2VkIGludGVyZmFjZSBuYW1lLiBJZiB0aGUKLQkJCSAqIG5hbWUgaXMgIiIgb3IgdGhlIG9wdGlvbiBsZW5ndGggaXMgemVybyB0aGUgc29ja2V0Ci0JCQkgKiBpcyBub3QgYm91bmQuCi0JCQkgKi8KLQotCQkJaWYgKCF2YWxib29sKSB7Ci0JCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvcHRsZW4gPiBJRk5BTVNJWiAtIDEpCi0JCQkJCW9wdGxlbiA9IElGTkFNU0laIC0gMTsKLQkJCQltZW1zZXQoZGV2bmFtZSwgMCwgc2l6ZW9mKGRldm5hbWUpKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZGV2bmFtZSwgb3B0dmFsLCBvcHRsZW4pKSB7Ci0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIFJlbW92ZSBhbnkgY2FjaGVkIHJvdXRlIGZvciB0aGlzIHNvY2tldC4gKi8KLQkJCQlza19kc3RfcmVzZXQoc2spOwotCi0JCQkJaWYgKGRldm5hbWVbMF0gPT0gJ1wwJykgewotCQkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOwotCQkJCQlpZiAoIWRldikgewotCQkJCQkJcmV0ID0gLUVOT0RFVjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSBkZXYtPmlmaW5kZXg7Ci0JCQkJCWRldl9wdXQoZGV2KTsKLQkJCQl9Ci0JCQl9CisJY2FzZSBTT19TTkRCVUZGT1JDRToKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQorCQlnb3RvIHNldF9zbmRidWY7CisKKwljYXNlIFNPX1JDVkJVRjoKKwkJLyogRG9uJ3QgZXJyb3Igb24gdGhpcyBCU0QgZG9lc24ndCBhbmQgaWYgeW91IHRoaW5rCisJCSAgIGFib3V0IGl0IHRoaXMgaXMgcmlnaHQuIE90aGVyd2lzZSBhcHBzIGhhdmUgdG8KKwkJICAgcGxheSAnZ3Vlc3MgdGhlIGJpZ2dlc3Qgc2l6ZScgZ2FtZXMuIFJDVkJVRi9TTkRCVUYKKwkJICAgYXJlIHRyZWF0ZWQgaW4gQlNEIGFzIGhpbnRzICovCisKKwkJaWYgKHZhbCA+IHN5c2N0bF9ybWVtX21heCkKKwkJCXZhbCA9IHN5c2N0bF9ybWVtX21heDsKK3NldF9yY3ZidWY6CisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSzsKKwkJLyoKKwkJICogV2UgZG91YmxlIGl0IG9uIHRoZSB3YXkgaW4gdG8gYWNjb3VudCBmb3IKKwkJICogInN0cnVjdCBza19idWZmIiBldGMuIG92ZXJoZWFkLiAgIEFwcGxpY2F0aW9ucworCQkgKiBhc3N1bWUgdGhhdCB0aGUgU09fUkNWQlVGIHNldHRpbmcgdGhleSBtYWtlIHdpbGwKKwkJICogYWxsb3cgdGhhdCBtdWNoIGFjdHVhbCBkYXRhIHRvIGJlIHJlY2VpdmVkIG9uIHRoYXQKKwkJICogc29ja2V0LgorCQkgKgorCQkgKiBBcHBsaWNhdGlvbnMgYXJlIHVuYXdhcmUgdGhhdCAic3RydWN0IHNrX2J1ZmYiIGFuZAorCQkgKiBvdGhlciBvdmVyaGVhZHMgYWxsb2NhdGUgZnJvbSB0aGUgcmVjZWl2ZSBidWZmZXIKKwkJICogZHVyaW5nIHNvY2tldCBidWZmZXIgYWxsb2NhdGlvbi4KKwkJICoKKwkJICogQW5kIGFmdGVyIGNvbnNpZGVyaW5nIHRoZSBwb3NzaWJsZSBhbHRlcm5hdGl2ZXMsCisJCSAqIHJldHVybmluZyB0aGUgdmFsdWUgd2UgYWN0dWFsbHkgdXNlZCBpbiBnZXRzb2Nrb3B0CisJCSAqIGlzIHRoZSBtb3N0IGRlc2lyYWJsZSBiZWhhdmlvci4KKwkJICovCisJCWlmICgodmFsICogMikgPCBTT0NLX01JTl9SQ1ZCVUYpCisJCQlzay0+c2tfcmN2YnVmID0gU09DS19NSU5fUkNWQlVGOworCQllbHNlCisJCQlzay0+c2tfcmN2YnVmID0gdmFsICogMjsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1JDVkJVRkZPUkNFOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gc2V0X3JjdmJ1ZjsKKworCWNhc2UgU09fS0VFUEFMSVZFOgorI2lmZGVmIENPTkZJR19JTkVUCisJCWlmIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQl0Y3Bfc2V0X2tlZXBhbGl2ZShzaywgdmFsYm9vbCk7CisjZW5kaWYKKwkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfS0VFUE9QRU4sIHZhbGJvb2wpOworCQlicmVhazsKKworCWNhc2UgU09fT09CSU5MSU5FOgorCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19VUkdJTkxJTkUsIHZhbGJvb2wpOworCQlicmVhazsKKworCWNhc2UgU09fTk9fQ0hFQ0s6CisJCXNrLT5za19ub19jaGVjayA9IHZhbGJvb2w7CisJCWJyZWFrOworCisJY2FzZSBTT19QUklPUklUWToKKwkJaWYgKCh2YWwgPj0gMCAmJiB2YWwgPD0gNikgfHwgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXNrLT5za19wcmlvcml0eSA9IHZhbDsKKwkJZWxzZQorCQkJcmV0ID0gLUVQRVJNOworCQlicmVhazsKKworCWNhc2UgU09fTElOR0VSOgorCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGxpbmcpKSB7CisJCQlyZXQgPSAtRUlOVkFMOwkvKiAxMDAzLjFnICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmcsb3B0dmFsLHNpemVvZihsaW5nKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWxpbmcubF9vbm9mZikKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19MSU5HRVIpOworCQllbHNlIHsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwkJCWlmICgodW5zaWduZWQgaW50KWxpbmcubF9saW5nZXIgPj0gTUFYX1NDSEVEVUxFX1RJTUVPVVQvSFopCisJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCXNrLT5za19saW5nZXJ0aW1lID0gKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyICogSFo7CisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNPX0JTRENPTVBBVDoKKwkJc29ja193YXJuX29ic29sZXRlX2JzZGlzbSgic2V0c29ja29wdCIpOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU0NSRUQ6CisJCWlmICh2YWxib29sKQorCQkJc2V0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1RJTUVTVEFNUDoKKwljYXNlIFNPX1RJTUVTVEFNUE5TOgorCQlpZiAodmFsYm9vbCkgIHsKKwkJCWlmIChvcHRuYW1lID09IFNPX1RJTUVTVEFNUCkKKwkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QTlMpOworCQkJZWxzZQorCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QTlMpOworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKKwkJfSBlbHNlIHsKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUE5TKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09fUkNWTE9XQVQ6CisJCWlmICh2YWwgPCAwKQorCQkJdmFsID0gSU5UX01BWDsKKwkJc2stPnNrX3Jjdmxvd2F0ID0gdmFsID8gOiAxOworCQlicmVhazsKKworCWNhc2UgU09fUkNWVElNRU86CisJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19yY3Z0aW1lbywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworCWNhc2UgU09fU05EVElNRU86CisJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19zbmR0aW1lbywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19ORVRERVZJQ0VTCisJY2FzZSBTT19CSU5EVE9ERVZJQ0U6CisJeworCQljaGFyIGRldm5hbWVbSUZOQU1TSVpdOworCisJCS8qIFNvcnJ5Li4uICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQmluZCB0aGlzIHNvY2tldCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIGxpa2UgImV0aDAiLAorCQkgKiBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhc3NlZCBpbnRlcmZhY2UgbmFtZS4gSWYgdGhlCisJCSAqIG5hbWUgaXMgIiIgb3IgdGhlIG9wdGlvbiBsZW5ndGggaXMgemVybyB0aGUgc29ja2V0CisJCSAqIGlzIG5vdCBib3VuZC4KKwkJICovCisKKwkJaWYgKCF2YWxib29sKSB7CisJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcHRsZW4gPiBJRk5BTVNJWiAtIDEpCisJCQkJb3B0bGVuID0gSUZOQU1TSVogLSAxOworCQkJbWVtc2V0KGRldm5hbWUsIDAsIHNpemVvZihkZXZuYW1lKSk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGV2bmFtZSwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogUmVtb3ZlIGFueSBjYWNoZWQgcm91dGUgZm9yIHRoaXMgc29ja2V0LiAqLworCQkJc2tfZHN0X3Jlc2V0KHNrKTsKKworCQkJaWYgKGRldm5hbWVbMF0gPT0gJ1wwJykgeworCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCQkJCWlmICghZGV2KSB7CisJCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gZGV2LT5pZmluZGV4OworCQkJCWRldl9wdXQoZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CiAjZW5kaWYKIAogCi0JCWNhc2UgU09fQVRUQUNIX0ZJTFRFUjoKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlpZiAob3B0bGVuID09IHNpemVvZihzdHJ1Y3Qgc29ja19mcHJvZykpIHsKLQkJCQlzdHJ1Y3Qgc29ja19mcHJvZyBmcHJvZzsKKwljYXNlIFNPX0FUVEFDSF9GSUxURVI6CisJCXJldCA9IC1FSU5WQUw7CisJCWlmIChvcHRsZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSkgeworCQkJc3RydWN0IHNvY2tfZnByb2cgZnByb2c7CiAKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZnByb2csIG9wdHZhbCwgc2l6ZW9mKGZwcm9nKSkpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gc2tfYXR0YWNoX2ZpbHRlcigmZnByb2csIHNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fREVUQUNIX0ZJTFRFUjoKLQkJCXJjdV9yZWFkX2xvY2tfYmgoKTsKLQkJCWZpbHRlciA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfZmlsdGVyKTsKLQkJCWlmIChmaWx0ZXIpIHsKLQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoc2stPnNrX2ZpbHRlciwgTlVMTCk7Ci0JCQkJc2tfZmlsdGVyX3JlbGVhc2Uoc2ssIGZpbHRlcik7Ci0JCQkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHJvZywgb3B0dmFsLCBzaXplb2YoZnByb2cpKSkKIAkJCQlicmVhazsKLQkJCX0KLQkJCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCQkJcmV0ID0gLUVOT05FVDsKLQkJCWJyZWFrOwogCi0JCWNhc2UgU09fUEFTU1NFQzoKLQkJCWlmICh2YWxib29sKQotCQkJCXNldF9iaXQoU09DS19QQVNTU0VDLCAmc29jay0+ZmxhZ3MpOwotCQkJZWxzZQotCQkJCWNsZWFyX2JpdChTT0NLX1BBU1NTRUMsICZzb2NrLT5mbGFncyk7CisJCQlyZXQgPSBza19hdHRhY2hfZmlsdGVyKCZmcHJvZywgc2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTT19ERVRBQ0hfRklMVEVSOgorCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCWZpbHRlciA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfZmlsdGVyKTsKKwkJaWYgKGZpbHRlcikgeworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNrLT5za19maWx0ZXIsIE5VTEwpOworCQkJc2tfZmlsdGVyX3JlbGVhc2Uoc2ssIGZpbHRlcik7CisJCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAkJCWJyZWFrOworCQl9CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQlyZXQgPSAtRU5PTkVUOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU1NFQzoKKwkJaWYgKHZhbGJvb2wpCisJCQlzZXRfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKTsKKwkJYnJlYWs7CiAKIAkJLyogV2UgaW1wbGVtZW50IHRoZSBTT19TTkRMT1dBVCBldGMgdG8KIAkJICAgbm90IGJlIHNldHRhYmxlICgxMDAzLjFnIDUuMykgKi8KLQkJZGVmYXVsdDoKLQkJCXJldCA9IC1FTk9QUk9UT09QVDsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CiAJfQogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIHJldDsKQEAgLTY0MSw4ICs2NDgsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCi0JdW5pb24KLQl7CisJdW5pb24gewogCQlpbnQgdmFsOwogCQlzdHJ1Y3QgbGluZ2VyIGxpbmc7CiAJCXN0cnVjdCB0aW1ldmFsIHRtOwpAQCAtNjUxLDE0OCArNjU3LDE1MyBAQAogCXVuc2lnbmVkIGludCBsdiA9IHNpemVvZihpbnQpOwogCWludCBsZW47CiAKLQlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZihsZW4gPCAwKQorCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaChvcHRuYW1lKQotCXsKLQkJY2FzZSBTT19ERUJVRzoKLQkJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX0RCRyk7Ci0JCQlicmVhazsKKwlzd2l0Y2gob3B0bmFtZSkgeworCWNhc2UgU09fREVCVUc6CisJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX0RCRyk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fRE9OVFJPVVRFOgotCQkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7Ci0JCQlicmVhazsKKwljYXNlIFNPX0RPTlRST1VURToKKwkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fQlJPQURDQVNUOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19CUk9BRENBU1QpOwotCQkJYnJlYWs7CisJY2FzZSBTT19CUk9BRENBU1Q6CisJCXYudmFsID0gISFzb2NrX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNUKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19TTkRCVUY6Ci0JCQl2LnZhbCA9IHNrLT5za19zbmRidWY7Ci0JCQlicmVhazsKKwljYXNlIFNPX1NOREJVRjoKKwkJdi52YWwgPSBzay0+c2tfc25kYnVmOworCQlicmVhazsKIAotCQljYXNlIFNPX1JDVkJVRjoKLQkJCXYudmFsID0gc2stPnNrX3JjdmJ1ZjsKLQkJCWJyZWFrOworCWNhc2UgU09fUkNWQlVGOgorCQl2LnZhbCA9IHNrLT5za19yY3ZidWY7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUkVVU0VBRERSOgotCQkJdi52YWwgPSBzay0+c2tfcmV1c2U7Ci0JCQlicmVhazsKKwljYXNlIFNPX1JFVVNFQUREUjoKKwkJdi52YWwgPSBzay0+c2tfcmV1c2U7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fS0VFUEFMSVZFOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTik7Ci0JCQlicmVhazsKKwljYXNlIFNPX0tFRVBBTElWRToKKwkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTik7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fVFlQRToKLQkJCXYudmFsID0gc2stPnNrX3R5cGU7Ci0JCQlicmVhazsKKwljYXNlIFNPX1RZUEU6CisJCXYudmFsID0gc2stPnNrX3R5cGU7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fRVJST1I6Ci0JCQl2LnZhbCA9IC1zb2NrX2Vycm9yKHNrKTsKLQkJCWlmKHYudmFsPT0wKQotCQkJCXYudmFsID0geGNoZygmc2stPnNrX2Vycl9zb2Z0LCAwKTsKLQkJCWJyZWFrOworCWNhc2UgU09fRVJST1I6CisJCXYudmFsID0gLXNvY2tfZXJyb3Ioc2spOworCQlpZiAodi52YWw9PTApCisJCQl2LnZhbCA9IHhjaGcoJnNrLT5za19lcnJfc29mdCwgMCk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fT09CSU5MSU5FOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpOwotCQkJYnJlYWs7CisJY2FzZSBTT19PT0JJTkxJTkU6CisJCXYudmFsID0gISFzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19OT19DSEVDSzoKLQkJCXYudmFsID0gc2stPnNrX25vX2NoZWNrOwotCQkJYnJlYWs7CisJY2FzZSBTT19OT19DSEVDSzoKKwkJdi52YWwgPSBzay0+c2tfbm9fY2hlY2s7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUFJJT1JJVFk6Ci0JCQl2LnZhbCA9IHNrLT5za19wcmlvcml0eTsKLQkJCWJyZWFrOworCWNhc2UgU09fUFJJT1JJVFk6CisJCXYudmFsID0gc2stPnNrX3ByaW9yaXR5OworCQlicmVhazsKIAotCQljYXNlIFNPX0xJTkdFUjoKLQkJCWx2CQk9IHNpemVvZih2LmxpbmcpOwotCQkJdi5saW5nLmxfb25vZmYJPSAhIXNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpOwotCQkJdi5saW5nLmxfbGluZ2VyCT0gc2stPnNrX2xpbmdlcnRpbWUgLyBIWjsKLQkJCWJyZWFrOworCWNhc2UgU09fTElOR0VSOgorCQlsdgkJPSBzaXplb2Yodi5saW5nKTsKKwkJdi5saW5nLmxfb25vZmYJPSAhIXNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpOworCQl2LmxpbmcubF9saW5nZXIJPSBzay0+c2tfbGluZ2VydGltZSAvIEhaOworCQlicmVhazsKIAotCQljYXNlIFNPX0JTRENPTVBBVDoKLQkJCXNvY2tfd2Fybl9vYnNvbGV0ZV9ic2Rpc20oImdldHNvY2tvcHQiKTsKLQkJCWJyZWFrOworCWNhc2UgU09fQlNEQ09NUEFUOgorCQlzb2NrX3dhcm5fb2Jzb2xldGVfYnNkaXNtKCJnZXRzb2Nrb3B0Iik7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fVElNRVNUQU1QOgotCQkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKTsKLQkJCWJyZWFrOworCWNhc2UgU09fVElNRVNUQU1QOgorCQl2LnZhbCA9IHNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApICYmCisJCQkJIXNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVBOUyk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUkNWVElNRU86Ci0JCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOwotCQkJaWYgKHNrLT5za19yY3Z0aW1lbyA9PSBNQVhfU0NIRURVTEVfVElNRU9VVCkgewotCQkJCXYudG0udHZfc2VjID0gMDsKLQkJCQl2LnRtLnR2X3VzZWMgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQl2LnRtLnR2X3NlYyA9IHNrLT5za19yY3Z0aW1lbyAvIEhaOwotCQkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3JjdnRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKLQkJCX0KLQkJCWJyZWFrOworCWNhc2UgU09fVElNRVNUQU1QTlM6CisJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUE5TKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19TTkRUSU1FTzoKLQkJCWx2PXNpemVvZihzdHJ1Y3QgdGltZXZhbCk7Ci0JCQlpZiAoc2stPnNrX3NuZHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7Ci0JCQkJdi50bS50dl9zZWMgPSAwOwotCQkJCXYudG0udHZfdXNlYyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXYudG0udHZfc2VjID0gc2stPnNrX3NuZHRpbWVvIC8gSFo7Ci0JCQkJdi50bS50dl91c2VjID0gKChzay0+c2tfc25kdGltZW8gJSBIWikgKiAxMDAwMDAwKSAvIEhaOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19SQ1ZMT1dBVDoKLQkJCXYudmFsID0gc2stPnNrX3Jjdmxvd2F0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19TTkRMT1dBVDoKLQkJCXYudmFsPTE7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX1BBU1NDUkVEOgotCQkJdi52YWwgPSB0ZXN0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpID8gMSA6IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX1BFRVJDUkVEOgotCQkJaWYgKGxlbiA+IHNpemVvZihzay0+c2tfcGVlcmNyZWQpKQotCQkJCWxlbiA9IHNpemVvZihzay0+c2tfcGVlcmNyZWQpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZzay0+c2tfcGVlcmNyZWQsIGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlnb3RvIGxlbm91dDsKLQotCQljYXNlIFNPX1BFRVJOQU1FOgotCQl7Ci0JCQljaGFyIGFkZHJlc3NbMTI4XTsKLQotCQkJaWYgKHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmVzcywgJmx2LCAyKSkKLQkJCQlyZXR1cm4gLUVOT1RDT05OOwotCQkJaWYgKGx2IDwgbGVuKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGFkZHJlc3MsIGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlnb3RvIGxlbm91dDsKKwljYXNlIFNPX1JDVlRJTUVPOgorCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQlpZiAoc2stPnNrX3JjdnRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQl2LnRtLnR2X3NlYyA9IDA7CisJCQl2LnRtLnR2X3VzZWMgPSAwOworCQl9IGVsc2UgeworCQkJdi50bS50dl9zZWMgPSBzay0+c2tfcmN2dGltZW8gLyBIWjsKKwkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3JjdnRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKIAkJfQorCQlicmVhazsKIAotCQkvKiBEdWJpb3VzIEJTRCB0aGluZy4uLiBQcm9iYWJseSBub2JvZHkgZXZlbiB1c2VzIGl0LCBidXQKLQkJICogdGhlIFVOSVggc3RhbmRhcmQgd2FudHMgaXQgZm9yIHdoYXRldmVyIHJlYXNvbi4uLiAtRGF2ZU0KLQkJICovCi0JCWNhc2UgU09fQUNDRVBUQ09OTjoKLQkJCXYudmFsID0gc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU47Ci0JCQlicmVhazsKKwljYXNlIFNPX1NORFRJTUVPOgorCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQlpZiAoc2stPnNrX3NuZHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQl2LnRtLnR2X3NlYyA9IDA7CisJCQl2LnRtLnR2X3VzZWMgPSAwOworCQl9IGVsc2UgeworCQkJdi50bS50dl9zZWMgPSBzay0+c2tfc25kdGltZW8gLyBIWjsKKwkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3NuZHRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIFNPX1BBU1NTRUM6Ci0JCQl2LnZhbCA9IHRlc3RfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKSA/IDEgOiAwOwotCQkJYnJlYWs7CisJY2FzZSBTT19SQ1ZMT1dBVDoKKwkJdi52YWwgPSBzay0+c2tfcmN2bG93YXQ7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUEVFUlNFQzoKLQkJCXJldHVybiBzZWN1cml0eV9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc29jaywgb3B0dmFsLCBvcHRsZW4sIGxlbik7CisJY2FzZSBTT19TTkRMT1dBVDoKKwkJdi52YWw9MTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybigtRU5PUFJPVE9PUFQpOworCWNhc2UgU09fUEFTU0NSRUQ6CisJCXYudmFsID0gdGVzdF9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKSA/IDEgOiAwOworCQlicmVhazsKKworCWNhc2UgU09fUEVFUkNSRUQ6CisJCWlmIChsZW4gPiBzaXplb2Yoc2stPnNrX3BlZXJjcmVkKSkKKwkJCWxlbiA9IHNpemVvZihzay0+c2tfcGVlcmNyZWQpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnNrLT5za19wZWVyY3JlZCwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlnb3RvIGxlbm91dDsKKworCWNhc2UgU09fUEVFUk5BTUU6CisJeworCQljaGFyIGFkZHJlc3NbMTI4XTsKKworCQlpZiAoc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCAmbHYsIDIpKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJaWYgKGx2IDwgbGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBhZGRyZXNzLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gbGVub3V0OwogCX0KKworCS8qIER1YmlvdXMgQlNEIHRoaW5nLi4uIFByb2JhYmx5IG5vYm9keSBldmVuIHVzZXMgaXQsIGJ1dAorCSAqIHRoZSBVTklYIHN0YW5kYXJkIHdhbnRzIGl0IGZvciB3aGF0ZXZlciByZWFzb24uLi4gLURhdmVNCisJICovCisJY2FzZSBTT19BQ0NFUFRDT05OOgorCQl2LnZhbCA9IHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU1NFQzoKKwkJdi52YWwgPSB0ZXN0X2JpdChTT0NLX1BBU1NTRUMsICZzb2NrLT5mbGFncykgPyAxIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1BFRVJTRUM6CisJCXJldHVybiBzZWN1cml0eV9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc29jaywgb3B0dmFsLCBvcHRsZW4sIGxlbik7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKwogCWlmIChsZW4gPiBsdikKIAkJbGVuID0gbHY7CiAJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2LCBsZW4pKQpAQCAtOTA0LDYgKzkxNSw3IEBACiAJCXNrX25vZGVfaW5pdCgmbmV3c2stPnNrX25vZGUpOwogCQlzb2NrX2xvY2tfaW5pdChuZXdzayk7CiAJCWJoX2xvY2tfc29jayhuZXdzayk7CisJCW5ld3NrLT5za19iYWNrbG9nLmhlYWQJPSBuZXdzay0+c2tfYmFja2xvZy50YWlsID0gTlVMTDsKIAogCQlhdG9taWNfc2V0KCZuZXdzay0+c2tfcm1lbV9hbGxvYywgMCk7CiAJCWF0b21pY19zZXQoJm5ld3NrLT5za193bWVtX2FsbG9jLCAwKTsKQEAgLTkyMyw3ICs5MzUsNiBAQAogCQluZXdzay0+c2tfd21lbV9xdWV1ZWQJPSAwOwogCQluZXdzay0+c2tfZm9yd2FyZF9hbGxvYyA9IDA7CiAJCW5ld3NrLT5za19zZW5kX2hlYWQJPSBOVUxMOwotCQluZXdzay0+c2tfYmFja2xvZy5oZWFkCT0gbmV3c2stPnNrX2JhY2tsb2cudGFpbCA9IE5VTEw7CiAJCW5ld3NrLT5za191c2VybG9ja3MJPSBzay0+c2tfdXNlcmxvY2tzICYgflNPQ0tfQklORFBPUlRfTE9DSzsKIAogCQlzb2NrX3Jlc2V0X2ZsYWcobmV3c2ssIFNPQ0tfRE9ORSk7CkBAIC05NzAsNiArOTgxLDIxIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHNrX2Nsb25lKTsKIAordm9pZCBza19zZXR1cF9jYXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCV9fc2tfZHN0X3NldChzaywgZHN0KTsKKwlzay0+c2tfcm91dGVfY2FwcyA9IGRzdC0+ZGV2LT5mZWF0dXJlczsKKwlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0dTTykKKwkJc2stPnNrX3JvdXRlX2NhcHMgfD0gTkVUSUZfRl9HU09fTUFTSzsKKwlpZiAoc2tfY2FuX2dzbyhzaykpIHsKKwkJaWYgKGRzdC0+aGVhZGVyX2xlbikKKwkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX0dTT19NQVNLOworCQllbHNlCisJCQlzay0+c2tfcm91dGVfY2FwcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrX3NldHVwX2NhcHMpOworCiB2b2lkIF9faW5pdCBza19pbml0KHZvaWQpCiB7CiAJaWYgKG51bV9waHlzcGFnZXMgPD0gNDA5NikgewpAQCAtMTIyMCwxMyArMTI0NiwxMyBAQAogewogCURFRklORV9XQUlUKHdhaXQpOwogCi0JZm9yKDs7KSB7CisJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZzay0+c2tfbG9jay53cSwgJndhaXQsCiAJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19sb2NrLnNsb2NrKTsKIAkJc2NoZWR1bGUoKTsKIAkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfbG9jay5zbG9jayk7Ci0JCWlmKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpCiAJCQlicmVhazsKIAl9CiAJZmluaXNoX3dhaXQoJnNrLT5za19sb2NrLndxLCAmd2FpdCk7CkBAIC0xMjU4LDcgKzEyODQsNyBAQAogCQl9IHdoaWxlIChza2IgIT0gTlVMTCk7CiAKIAkJYmhfbG9ja19zb2NrKHNrKTsKLQl9IHdoaWxlKChza2IgPSBzay0+c2tfYmFja2xvZy5oZWFkKSAhPSBOVUxMKTsKKwl9IHdoaWxlICgoc2tiID0gc2stPnNrX2JhY2tsb2cuaGVhZCkgIT0gTlVMTCk7CiB9CiAKIC8qKgpAQCAtMTQyMCw3ICsxNDQ2LDcgQEAKIAkvKiBEbyBub3Qgd2FrZSB1cCBhIHdyaXRlciB1bnRpbCBoZSBjYW4gbWFrZSAic2lnbmlmaWNhbnQiCiAJICogcHJvZ3Jlc3MuICAtLURhdmVNCiAJICovCi0JaWYoKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPDwgMSkgPD0gc2stPnNrX3NuZGJ1ZikgeworCWlmICgoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8PCAxKSA8PSBzay0+c2tfc25kYnVmKSB7CiAJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CiAKQEAgLTE0ODIsOCArMTUwOCw3IEBACiAKIAlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAKLQlpZihzb2NrKQotCXsKKwlpZiAoc29jaykgewogCQlzay0+c2tfdHlwZQk9CXNvY2stPnR5cGU7CiAJCXNrLT5za19zbGVlcAk9CSZzb2NrLT53YWl0OwogCQlzb2NrLT5zawk9CXNrOwpAQCAtMTUxMiw4ICsxNTM3LDcgQEAKIAlzay0+c2tfcmN2dGltZW8JCT0JTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJc2stPnNrX3NuZHRpbWVvCQk9CU1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCi0Jc2stPnNrX3N0YW1wLnR2X3NlYyAgICAgPSAtMUw7Ci0Jc2stPnNrX3N0YW1wLnR2X3VzZWMgICAgPSAtMUw7CisJc2stPnNrX3N0YW1wID0ga3RpbWVfc2V0KC0xTCwgLTFMKTsKIAogCWF0b21pY19zZXQoJnNrLT5za19yZWZjbnQsIDEpOwogfQpAQCAtMTU1NCwxNyArMTU3OCwzNiBAQAogCiBpbnQgc29ja19nZXRfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgX191c2VyICp1c2Vyc3RhbXApCiB7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QKSkKIAkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKLQlpZiAoc2stPnNrX3N0YW1wLnR2X3NlYyA9PSAtMSkKKwl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2stPnNrX3N0YW1wKTsKKwlpZiAodHYudHZfc2VjID09IC0xKQogCQlyZXR1cm4gLUVOT0VOVDsKLQlpZiAoc2stPnNrX3N0YW1wLnR2X3NlYyA9PSAwKQotCQlkb19nZXR0aW1lb2ZkYXkoJnNrLT5za19zdGFtcCk7Ci0JcmV0dXJuIGNvcHlfdG9fdXNlcih1c2Vyc3RhbXAsICZzay0+c2tfc3RhbXAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpID8KLQkJLUVGQVVMVCA6IDA7CisJaWYgKHR2LnR2X3NlYyA9PSAwKSB7CisJCXNrLT5za19zdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXR2ID0ga3RpbWVfdG9fdGltZXZhbChzay0+c2tfc3RhbXApOworCX0KKwlyZXR1cm4gY29weV90b191c2VyKHVzZXJzdGFtcCwgJnR2LCBzaXplb2YodHYpKSA/IC1FRkFVTFQgOiAwOwogfQogRVhQT1JUX1NZTUJPTChzb2NrX2dldF90aW1lc3RhbXApOwogCitpbnQgc29ja19nZXRfdGltZXN0YW1wbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1c2Vyc3RhbXApCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpCisJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7CisJdHMgPSBrdGltZV90b190aW1lc3BlYyhzay0+c2tfc3RhbXApOworCWlmICh0cy50dl9zZWMgPT0gLTEpCisJCXJldHVybiAtRU5PRU5UOworCWlmICh0cy50dl9zZWMgPT0gMCkgeworCQlzay0+c2tfc3RhbXAgPSBrdGltZV9nZXRfcmVhbCgpOworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHNrLT5za19zdGFtcCk7CisJfQorCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcnN0YW1wLCAmdHMsIHNpemVvZih0cykpID8gLUVGQVVMVCA6IDA7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfZ2V0X3RpbWVzdGFtcG5zKTsKKwogdm9pZCBzb2NrX2VuYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrKQogewogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpIHsKQEAgLTE4OTksNyArMTk0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvdG9fc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvdG9fc2VxX29wcyA9IHsKIAkuc3RhcnQgID0gcHJvdG9fc2VxX3N0YXJ0LAogCS5uZXh0ICAgPSBwcm90b19zZXFfbmV4dCwKIAkuc3RvcCAgID0gcHJvdG9fc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IDFlNzViMTUuLmIyOTcxMjAgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC0xMzYsNiArMTM2LDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9XQVJOSU5HUywKKwkJLnByb2NuYW1lCT0gIndhcm5pbmdzIiwKKwkJLmRhdGEJCT0gJm5ldF9tc2dfd2FybiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdXNlcl9kbWEuYyBiL25ldC9jb3JlL3VzZXJfZG1hLmMKaW5kZXggMGFkMWNkNS4uODkyNDFjZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdXNlcl9kbWEuYworKysgYi9uZXQvY29yZS91c2VyX2RtYS5jCkBAIC00OSw4ICs0OSw4IEBACiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgaW92ZWMgKnRvLAogCQkJc2l6ZV90IGxlbiwgc3RydWN0IGRtYV9waW5uZWRfbGlzdCAqcGlubmVkX2xpc3QpCiB7Ci0JaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKLQlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCWludCBlbmQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gZW5kIC0gb2Zmc2V0OwogCWRtYV9jb29raWVfdCBjb29raWUgPSAwOwogCiAJLyogQ29weSBoZWFkZXIuICovCkBAIC02OSwxMSArNjksOSBAQAogCiAJLyogQ29weSBwYWdlZCBhcHBlbmRpeC4gSG1tLi4uIHdoeSBkb2VzIHRoaXMgbG9vayBzbyBjb21wbGljYXRlZD8gKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWludCBlbmQ7CisJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQllbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWNvcHkgPSBlbmQgLSBvZmZzZXQ7CiAJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CiAJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CkBAIC04Miw4ICs4MCw4IEBACiAJCQlpZiAoY29weSA+IGxlbikKIAkJCQljb3B5ID0gbGVuOwogCi0JCQljb29raWUgPSBkbWFfbWVtY3B5X3BnX3RvX2lvdmVjKGNoYW4sIHRvLCBwaW5uZWRfbGlzdCwgcGFnZSwKLQkJCQkJZnJhZy0+cGFnZV9vZmZzZXQgKyBvZmZzZXQgLSBzdGFydCwgY29weSk7CisJCQljb29raWUgPSBkbWFfbWVtY3B5X3BnX3RvX2lvdmVjKGNoYW4sIHRvLCBwaW5uZWRfbGlzdCwKKwkJCQkJcGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsIGNvcHkpOwogCQkJaWYgKGNvb2tpZSA8IDApCiAJCQkJZ290byBmYXVsdDsKIAkJCWxlbiAtPSBjb3B5OwpAQCAtOTEsMjUgKzg5LDIxIEBACiAJCQkJZ290byBlbmQ7CiAJCQlvZmZzZXQgKz0gY29weTsKIAkJfQotCQlzdGFydCA9IGVuZDsKIAl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAogCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCWludCBlbmQ7CisJCQlCVUdfVFJBUChsZW4gPj0gMCk7CiAKLQkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJZW5kID0gb2Zmc2V0ICsgbGlzdC0+bGVuOwogCQkJY29weSA9IGVuZCAtIG9mZnNldDsKIAkJCWlmIChjb3B5ID4gMCkgewogCQkJCWlmIChjb3B5ID4gbGVuKQogCQkJCQljb3B5ID0gbGVuOwogCQkJCWNvb2tpZSA9IGRtYV9za2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhjaGFuLCBsaXN0LAotCQkJCQkJb2Zmc2V0IC0gc3RhcnQsIHRvLCBjb3B5LAotCQkJCQkJcGlubmVkX2xpc3QpOworCQkJCQkJMCwgdG8sIGNvcHksIHBpbm5lZF9saXN0KTsKIAkJCQlpZiAoY29va2llIDwgMCkKIAkJCQkJZ290byBmYXVsdDsKIAkJCQlsZW4gLT0gY29weTsKQEAgLTExNyw3ICsxMTEsNiBAQAogCQkJCQlnb3RvIGVuZDsKIAkJCQlvZmZzZXQgKz0gY29weTsKIAkJCX0KLQkJCXN0YXJ0ID0gZW5kOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS91dGlscy5jIGIvbmV0L2NvcmUvdXRpbHMuYwppbmRleCAwNzIzNmMxLi5hZGVjZmQyIDEwMDY0NAotLS0gYS9uZXQvY29yZS91dGlscy5jCisrKyBiL25ldC9jb3JlL3V0aWxzLmMKQEAgLTMwLDggKzMwLDEwIEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLWludCBuZXRfbXNnX2Nvc3QgPSA1KkhaOwotaW50IG5ldF9tc2dfYnVyc3QgPSAxMDsKK2ludCBuZXRfbXNnX2Nvc3QgX19yZWFkX21vc3RseSA9IDUqSFo7CitpbnQgbmV0X21zZ19idXJzdCBfX3JlYWRfbW9zdGx5ID0gMTA7CitpbnQgbmV0X21zZ193YXJuIF9fcmVhZF9tb3N0bHkgPSAxOworRVhQT1JUX1NZTUJPTChuZXRfbXNnX3dhcm4pOwogCiAvKgogICogQWxsIG5ldCB3YXJuaW5nIHByaW50aygpcyBzaG91bGQgYmUgZ3VhcmRlZCBieSB0aGlzIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvd2lyZWxlc3MuYyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2ZlMjcuLjAwMDAwMDAKLS0tIGEvbmV0L2NvcmUvd2lyZWxlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNzEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgQVBJcy4KLSAqCi0gKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNyBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogKEFzIGFsbCBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoaXMgZmlsZSBpcyBHUEwpCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQVBJIGRlZmluaXRpb24gOgotICogLS0tLS0tLS0tLS0tLS0KLSAqIFNlZSA8bGludXgvd2lyZWxlc3MuaD4gZm9yIGRldGFpbHMgb2YgdGhlIEFQSXMgYW5kIHRoZSByZXN0LgotICoKLSAqIEhpc3RvcnkgOgotICogLS0tLS0tLQotICoKLSAqIHYxIC0gNS4xMi4wMSAtIEplYW4gSUkKLSAqCW8gQ3JlYXRlZCB0aGlzIGZpbGUuCi0gKgotICogdjIgLSAxMy4xMi4wMSAtIEplYW4gSUkKLSAqCW8gTW92ZSAvcHJvYy9uZXQvd2lyZWxlc3Mgc3R1ZmYgZnJvbSBuZXQvY29yZS9kZXYuYyB0byBoZXJlCi0gKglvIE1ha2UgV2lyZWxlc3MgRXh0ZW5zaW9uIElPQ1RMcyBnbyB0aHJvdWdoIGhlcmUKLSAqCW8gQWRkZWQgaXdfaGFuZGxlciBoYW5kbGluZyA7LSkKLSAqCW8gQWRkZWQgc3RhbmRhcmQgaW9jdGwgZGVzY3JpcHRpb24KLSAqCW8gSW5pdGlhbCBkdW1iIGNvbW1pdCBzdHJhdGVneSBiYXNlZCBvbiBvcmlub2NvLmMKLSAqCi0gKiB2MyAtIDE5LjEyLjAxIC0gSmVhbiBJSQotICoJbyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gb3V0IG9mIHN0YW5kYXJkX2lvY3RsW10gaW4gaW9jdGxfc3RhbmRhcmRfY2FsbAotICoJbyBBZGQgZXZlbnQgZGlzcGF0Y2hlciBmdW5jdGlvbgotICoJbyBBZGQgZXZlbnQgZGVzY3JpcHRpb24KLSAqCW8gUHJvcGFnYXRlIGV2ZW50cyBhcyBydG5ldGxpbmsgSUZMQV9XSVJFTEVTUyBvcHRpb24KLSAqCW8gR2VuZXJhdGUgZXZlbnQgb24gc2VsZWN0ZWQgU0VUIHJlcXVlc3RzCi0gKgotICogdjQgLSAxOC4wNC4wMiAtIEplYW4gSUkKLSAqCW8gRml4IHN0dXBpZCBvZmYgYnkgb25lIGluIGl3X2lvY3RsX2Rlc2NyaXB0aW9uIDogSVdfRVNTSURfTUFYX1NJWkUgKyAxCi0gKgotICogdjUgLSAyMS4wNi4wMiAtIEplYW4gSUkKLSAqCW8gQWRkIElXX1BSSVZfVFlQRV9BRERSIGluIHByaXZfdHlwZV9zaXplICgrY2xlYW51cCkKLSAqCW8gUmVzaHVmZmxlIElXX0hFQURFUl9UWVBFX1hYWCB0byBtYXAgSVdfUFJJVl9UWVBFX1hYWCBjaGFuZ2VzCi0gKglvIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KLSAqCW8gVHVybiBvbiBXRV9TVFJJQ1RfV1JJVEUgYnkgZGVmYXVsdCArIGtlcm5lbCB3YXJuaW5nCi0gKglvIEZpeCBXRV9TVFJJQ1RfV1JJVEUgaW4gaW9jdGxfZXhwb3J0X3ByaXZhdGUoKSAoMzIgPT4gaXdfbnVtKQotICoJbyBGaXggb2ZmLWJ5LW9uZSBpbiB0ZXN0IChleHRyYV9zaXplIDw9IElGTkFNU0laKQotICoKLSAqIHY2IC0gOS4wMS4wMyAtIEplYW4gSUkKLSAqCW8gQWRkIGNvbW1vbiBzcHkgc3VwcG9ydCA6IGl3X2hhbmRsZXJfc2V0X3NweSgpLCB3aXJlbGVzc19zcHlfdXBkYXRlKCkKLSAqCW8gQWRkIGVuaGFuY2VkIHNweSBzdXBwb3J0IDogaXdfaGFuZGxlcl9zZXRfdGhyc3B5KCkgYW5kIGV2ZW50LgotICoJbyBBZGQgV0lSRUxFU1NfRVhUIHZlcnNpb24gZGlzcGxheSBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKLSAqCi0gKiB2NiAtIDE4LjA2LjA0IC0gSmVhbiBJSQotICoJbyBDaGFuZ2UgZ2V0X3NweWRhdGEoKSBtZXRob2QgZm9yIGFkZGVkIHNhZmV0eQotICoJbyBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQotICoJbyBBbGxvdyBhbnkgc2l6ZSBHRVQgcmVxdWVzdCBpZiB1c2VyIHNwZWNpZmllcyBsZW5ndGggPiBtYXgKLSAqCQlhbmQgaWYgcmVxdWVzdCBoYXMgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIG9yIGlzIFNJT0NHSVdQUklWCi0gKglvIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCi0gKglvIEFkZCB3bWIoKSBpbiBpd19oYW5kbGVyX3NldF9zcHkoKSBmb3Igbm9uLWNvaGVyZW50IGFyY2hzL2NwdXMKLSAqIEJhc2VkIG9uIHBhdGNoIGZyb20gUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gOgotICoJbyBGaXgga2VybmVsIGRhdGEgbGVhayB0byB1c2VyIHNwYWNlIGluIHByaXZhdGUgaGFuZGxlciBoYW5kbGluZwotICoKLSAqIHY3IC0gMTguMy4wNSAtIEplYW4gSUkKLSAqCW8gUmVtb3ZlIChzdHJ1Y3QgaXdfcG9pbnQgKiktPnBvaW50ZXIgZnJvbSBldmVudHMgYW5kIHN0cmVhbXMKLSAqCW8gUmVtb3ZlIHNweV9vZmZzZXQgZnJvbSBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYKLSAqCW8gU3RhcnQgZGVwcmVjYXRpbmcgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMsIG91dHB1dCBhIHdhcm5pbmcKLSAqCW8gSWYgSVdfUVVBTF9EQk0gaXMgc2V0LCBzaG93IGRCbSB2YWx1ZXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCi0gKglvIERvbid0IGxvb3NlIElOVkFMSUQvREJNIGZsYWdzIHdoZW4gY2xlYXJpbmcgVVBEQVRFRCBmbGFncyAoaXdzdGF0cykKLSAqCi0gKiB2OCAtIDE3LjAyLjA2IC0gSmVhbiBJSQotICoJbyBSdE5ldGxpbmsgcmVxdWVzdHMgc3VwcG9ydCAoU0VUL0dFVCkKLSAqCi0gKiB2OGIgLSAwMy4wOC4wNiAtIEhlcmJlcnQgWHUKLSAqCW8gRml4IFdpcmVsZXNzIEV2ZW50IGxvY2tpbmcgaXNzdWVzLgotICoKLSAqIHY5IC0gMTQuMy4wNiAtIEplYW4gSUkKLSAqCW8gQ2hhbmdlIGxlbmd0aCBpbiBFU1NJRCBhbmQgTklDSyB0byBzdHJsZW4oKSBpbnN0ZWFkIG9mIHN0cmxlbigpKzEKLSAqCW8gTWFrZSBzdGFuZGFyZF9pb2N0bF9udW0gYW5kIHN0YW5kYXJkX2V2ZW50X251bSB1bnNpZ25lZAotICoJbyBSZW1vdmUgKHN0cnVjdCBuZXRfZGV2aWNlICopLT5nZXRfd2lyZWxlc3Nfc3RhdHMoKQotICoKLSAqIHYxMCAtIDE2LjMuMDcgLSBKZWFuIElJCi0gKglvIFByZXZlbnQgbGVha2luZyBvZiBrZXJuZWwgc3BhY2UgaW4gc3RyZWFtIG9uIDY0IGJpdHMuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIG9mZl90ICovCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CQkvKiBzdHJ1Y3QgaWZyZXEsIGRldl9nZXRfYnlfbmFtZSgpICovCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkJLyogcnRuZXRsaW5rIHN0dWZmICovCi0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkJLyogZm9yIF9faW5pdCAqLwotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkJLyogQVJQSFJEX0VUSEVSICovCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGNvbXBhcmVfZXRoZXJfYWRkciAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFByZXR0eSBvYnZpb3VzICovCi0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIE5ldyBkcml2ZXIgQVBJICovCi0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CQkvKiBjb3B5X3RvX3VzZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGVidWdnaW5nIHN0dWZmICovCi0jdW5kZWYgV0VfSU9DVExfREVCVUcJCS8qIERlYnVnIElPQ1RMIEFQSSAqLwotI3VuZGVmIFdFX1JUTkVUTElOS19ERUJVRwkvKiBEZWJ1ZyBSdE5ldGxpbmsgQVBJICovCi0jdW5kZWYgV0VfRVZFTlRfREVCVUcJCS8qIERlYnVnIEV2ZW50IGRpc3BhdGNoZXIgKi8KLSN1bmRlZiBXRV9TUFlfREVCVUcJCS8qIERlYnVnIGVuaGFuY2VkIHNweSBzdXBwb3J0ICovCi0KLS8qIE9wdGlvbnMgKi8KLS8vQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksJLyogV2lyZWxlc3MgcmVxdWVzdHMgb3ZlciBSdE5ldGxpbmsgKi8KLSNkZWZpbmUgV0VfRVZFTlRfUlRORVRMSU5LCS8qIFByb3BhZ2F0ZSBldmVudHMgdXNpbmcgUnROZXRsaW5rICovCi0jZGVmaW5lIFdFX1NFVF9FVkVOVAkJLyogR2VuZXJhdGUgYW4gZXZlbnQgb24gc29tZSBzZXQgY29tbWFuZHMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogR0xPQkFMIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFlvdSBzaG91bGQgbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLCBiZWNhdXNlIG9mIHJlLWVudHJhbmN5LgotICogT24gb3VyIGNhc2UsIGl0J3Mgb25seSBjb25zdCwgc28gaXQncyBPSy4uLgotICovCi0vKgotICogTWV0YS1kYXRhIGFib3V0IGFsbCB0aGUgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIHJlcXVlc3Qgd2UKLSAqIGtub3cgYWJvdXQuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24gc3RhbmRhcmRfaW9jdGxbXSA9IHsKLQlbU0lPQ1NJV0NPTU1JVAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKLQl9LAotCVtTSU9DR0lXTkFNRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQ0hBUiwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXTldJRAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAotCX0sCi0JW1NJT0NHSVdOV0lECS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXRlJFUQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfRlJFUSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQsCi0JfSwKLQlbU0lPQ0dJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0ZSRVEsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV01PREUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1VJTlQsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAotCX0sCi0JW1NJT0NHSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9VSU5ULAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAotCX0sCi0JW1NJT0NTSVdTRU5TCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DR0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ1NJV1JBTkdFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9OVUxMLAotCX0sCi0JW1NJT0NHSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXUFJJVgktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKLQl9LAotCVtTSU9DR0lXUFJJVgktIFNJT0NJV0ZJUlNUXSA9IHsgLyogKGhhbmRsZWQgZGlyZWN0bHkgYnkgdXMpICovCi0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKLQkJLm1heF90b2tlbnMJPSAxNiwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfTk9NQVgsCi0JfSwKLQlbU0lPQ1NJV1NUQVRTCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9OVUxMLAotCX0sCi0JW1NJT0NHSVdTVEFUUwktIFNJT0NJV0ZJUlNUXSA9IHsgLyogKGhhbmRsZWQgZGlyZWN0bHkgYnkgdXMpICovCi0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXU1BZCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSwKLQkJLm1heF90b2tlbnMJPSBJV19NQVhfU1BZLAotCX0sCi0JW1NJT0NHSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksCi0JCS5tYXhfdG9rZW5zCT0gSVdfTUFYX1NQWSwKLQl9LAotCVtTSU9DU0lXVEhSU1BZCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3RocnNweSksCi0JCS5taW5fdG9rZW5zCT0gMSwKLQkJLm1heF90b2tlbnMJPSAxLAotCX0sCi0JW1NJT0NHSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXdfdGhyc3B5KSwKLQkJLm1pbl90b2tlbnMJPSAxLAotCQkubWF4X3Rva2Vucwk9IDEsCi0JfSwKLQlbU0lPQ1NJV0FQCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAotCX0sCi0JW1NJT0NHSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXTUxNRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21sbWUpLAotCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfbWxtZSksCi0JfSwKLQlbU0lPQ0dJV0FQTElTVAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKwotCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSwKLQkJLm1heF90b2tlbnMJPSBJV19NQVhfQVAsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAotCX0sCi0JW1NJT0NTSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWluX3Rva2Vucwk9IDAsCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19zY2FuX3JlcSksCi0JfSwKLQlbU0lPQ0dJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfU0NBTl9NQVhfREFUQSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfTk9NQVgsCi0JfSwKLQlbU0lPQ1NJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKLQl9LAotCVtTSU9DR0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfRVNTSURfTUFYX1NJWkUsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV05JQ0tOCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFLAotCX0sCi0JW1NJT0NHSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKLQl9LAotCVtTSU9DU0lXUkFURQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdSVFMJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NHSVdSVFMJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdGUkFHCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DR0lXRlJBRwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ1NJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DR0lXVFhQT1cJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdSRVRSWQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV1JFVFJZCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DU0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0VOQ09ESU5HX1RPS0VOX01BWCwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQgfCBJV19ERVNDUl9GTEFHX1JFU1RSSUNULAotCX0sCi0JW1NJT0NHSVdFTkNPREUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfRU5DT0RJTkdfVE9LRU5fTUFYLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QIHwgSVdfREVTQ1JfRkxBR19SRVNUUklDVCwKLQl9LAotCVtTSU9DU0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NHSVdQT1dFUgktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ1NJV0dFTklFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0dFTkVSSUNfSUVfTUFYLAotCX0sCi0JW1NJT0NHSVdHRU5JRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKLQl9LAotCVtTSU9DU0lXQVVUSAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV0FVVEgJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdFTkNPREVFWFQgLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5taW5fdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19lbmNvZGVfZXh0KSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X2VuY29kZV9leHQpICsKLQkJCQkgIElXX0VOQ09ESU5HX1RPS0VOX01BWCwKLQl9LAotCVtTSU9DR0lXRU5DT0RFRVhUIC0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWluX3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCksCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19lbmNvZGVfZXh0KSArCi0JCQkJICBJV19FTkNPRElOR19UT0tFTl9NQVgsCi0JfSwKLQlbU0lPQ1NJV1BNS1NBIC0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWluX3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfcG1rc2EpLAotCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfcG1rc2EpLAotCX0sCi19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN0YW5kYXJkX2lvY3RsX251bSA9IChzaXplb2Yoc3RhbmRhcmRfaW9jdGwpIC8KLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24pKTsKLQotLyoKLSAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIGFkZGl0aW9uYWwgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGV2ZW50cwotICogd2Uga25vdyBhYm91dC4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiBzdGFuZGFyZF9ldmVudFtdID0gewotCVtJV0VWVFhEUk9QCS0gSVdFVkZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKLQl9LAotCVtJV0VWUVVBTAktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1FVQUwsCi0JfSwKLQlbSVdFVkNVU1RPTQktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfQ1VTVE9NX01BWCwKLQl9LAotCVtJV0VWUkVHSVNURVJFRAktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCi0JfSwKLQlbSVdFVkVYUElSRUQJLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAotCX0sCi0JW0lXRVZHRU5JRQktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCi0JfSwKLQlbSVdFVk1JQ0hBRUxNSUNGQUlMVVJFCS0gSVdFVkZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlKSwKLQl9LAotCVtJV0VWQVNTT0NSRVFJRQktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCi0JfSwKLQlbSVdFVkFTU09DUkVTUElFCS0gSVdFVkZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKLQl9LAotCVtJV0VWUE1LSURDQU5ECS0gSVdFVkZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta2lkX2NhbmQpLAotCX0sCi19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN0YW5kYXJkX2V2ZW50X251bSA9IChzaXplb2Yoc3RhbmRhcmRfZXZlbnQpIC8KLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24pKTsKLQotLyogU2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSB2YXJpb3VzIHByaXZhdGUgZGF0YSB0eXBlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgaXdfcHJpdl90eXBlX3NpemVbXSA9IHsKLQkwLAkJCQkvKiBJV19QUklWX1RZUEVfTk9ORSAqLwotCTEsCQkJCS8qIElXX1BSSVZfVFlQRV9CWVRFICovCi0JMSwJCQkJLyogSVdfUFJJVl9UWVBFX0NIQVIgKi8KLQkwLAkJCQkvKiBOb3QgZGVmaW5lZCAqLwotCXNpemVvZihfX3UzMiksCQkJLyogSVdfUFJJVl9UWVBFX0lOVCAqLwotCXNpemVvZihzdHJ1Y3QgaXdfZnJlcSksCQkvKiBJV19QUklWX1RZUEVfRkxPQVQgKi8KLQlzaXplb2Yoc3RydWN0IHNvY2thZGRyKSwJLyogSVdfUFJJVl9UWVBFX0FERFIgKi8KLQkwLAkJCQkvKiBOb3QgZGVmaW5lZCAqLwotfTsKLQotLyogU2l6ZSAoaW4gYnl0ZXMpIG9mIHZhcmlvdXMgZXZlbnRzICovCi1zdGF0aWMgY29uc3QgaW50IGV2ZW50X3R5cGVfc2l6ZVtdID0gewotCUlXX0VWX0xDUF9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfTlVMTCAqLwotCTAsCi0JSVdfRVZfQ0hBUl9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfQ0hBUiAqLwotCTAsCi0JSVdfRVZfVUlOVF9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfVUlOVCAqLwotCUlXX0VWX0ZSRVFfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX0ZSRVEgKi8KLQlJV19FVl9BRERSX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9BRERSICovCi0JMCwKLQlJV19FVl9QT0lOVF9MRU4sCQkvKiBXaXRob3V0IHZhcmlhYmxlIHBheWxvYWQgKi8KLQlJV19FVl9QQVJBTV9MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9QQVJBTSAqLwotCUlXX0VWX1FVQUxfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX1FVQUwgKi8KLX07Ci0KLS8qIFNpemUgKGluIGJ5dGVzKSBvZiB2YXJpb3VzIGV2ZW50cywgYXMgcGFja2VkICovCi1zdGF0aWMgY29uc3QgaW50IGV2ZW50X3R5cGVfcGtfc2l6ZVtdID0gewotCUlXX0VWX0xDUF9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9OVUxMICovCi0JMCwKLQlJV19FVl9DSEFSX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX0NIQVIgKi8KLQkwLAotCUlXX0VWX1VJTlRfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfVUlOVCAqLwotCUlXX0VWX0ZSRVFfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfRlJFUSAqLwotCUlXX0VWX0FERFJfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfQUREUiAqLwotCTAsCi0JSVdfRVZfUE9JTlRfUEtfTEVOLAkJLyogV2l0aG91dCB2YXJpYWJsZSBwYXlsb2FkICovCi0JSVdfRVZfUEFSQU1fUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfUEFSQU0gKi8KLQlJV19FVl9RVUFMX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX1FVQUwgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogQ09NTU9OIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBTdHVmZiB0aGF0IG1heSBiZSB1c2VkIGluIHZhcmlvdXMgcGxhY2Ugb3IgZG9lc24ndCBmaXQgaW4gb25lCi0gKiBvZiB0aGUgc2VjdGlvbiBiZWxvdy4KLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUmV0dXJuIHRoZSBkcml2ZXIgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBXaXJlbGVzcyBFeHRlbnNpb24uCi0gKiBDYWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlLCBzbyBtYWtlIHN1cmUgaXQgcmVtYWlucyBlZmZpY2llbnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaXdfaGFuZGxlciBnZXRfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCkKLXsKLQkvKiBEb24ndCAib3B0aW1pc2UiIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIGl0IHdpbGwgY3Jhc2ggKi8KLQl1bnNpZ25lZCBpbnQJaW5kZXg7CQkvKiAqTVVTVCogYmUgdW5zaWduZWQgKi8KLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgc29tZSB3aXJlbGVzcyBoYW5kbGVycyBkZWZpbmVkICovCi0JaWYoZGV2LT53aXJlbGVzc19oYW5kbGVycyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIFRyeSBhcyBhIHN0YW5kYXJkIGNvbW1hbmQgKi8KLQlpbmRleCA9IGNtZCAtIFNJT0NJV0ZJUlNUOwotCWlmKGluZGV4IDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3N0YW5kYXJkKQotCQlyZXR1cm4gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbaW5kZXhdOwotCi0JLyogVHJ5IGFzIGEgcHJpdmF0ZSBjb21tYW5kICovCi0JaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVFBSSVY7Ci0JaWYoaW5kZXggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZSkKLQkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVbaW5kZXhdOwotCi0JLyogTm90IGZvdW5kICovCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBHZXQgc3RhdGlzdGljcyBvdXQgb2YgdGhlIGRyaXZlcgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpd19zdGF0aXN0aWNzICpnZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBOZXcgbG9jYXRpb24gKi8KLQlpZigoZGV2LT53aXJlbGVzc19oYW5kbGVycyAhPSBOVUxMKSAmJgotCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMgIT0gTlVMTCkpCi0JCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKLQotCS8qIE5vdCBmb3VuZCAqLwotCXJldHVybiAoc3RydWN0IGl3X3N0YXRpc3RpY3MgKikgTlVMTDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIENhbGwgdGhlIGNvbW1pdCBoYW5kbGVyIGluIHRoZSBkcml2ZXIKLSAqIChpZiBleGlzdCBhbmQgaWYgY29uZGl0aW9ucyBhcmUgcmlnaHQpCi0gKgotICogTm90ZSA6IG91ciBjdXJyZW50IGNvbW1pdCBzdHJhdGVneSBpcyBjdXJyZW50bHkgcHJldHR5IGR1bWIsCi0gKiBidXQgd2Ugd2lsbCBiZSBhYmxlIHRvIGltcHJvdmUgb24gdGhhdC4uLgotICogVGhlIGdvYWwgaXMgdG8gdHJ5IHRvIGFncmVhZ2F0ZSBhcyBtYW55IGNoYW5nZXMgYXMgcG9zc2libGUKLSAqIGJlZm9yZSBkb2luZyB0aGUgY29tbWl0LiBEcml2ZXJzIHRoYXQgd2lsbCBkZWZpbmUgYSBjb21taXQgaGFuZGxlcgotICogYXJlIHVzdWFsbHkgdGhvc2UgdGhhdCBuZWVkIGEgcmVzZXQgYWZ0ZXIgY2hhbmdpbmcgcGFyYW1ldGVycywgc28KLSAqIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIG51bWJlciBvZiByZXNldC4KLSAqIEEgY29vbCBpZGVhIGlzIHRvIHVzZSBhIHRpbWVyIDogYXQgZWFjaCAic2V0IiBjb21tYW5kLCB3ZSByZS1zZXQgdGhlCi0gKiB0aW1lciwgd2hlbiB0aGUgdGltZXIgZXZlbnR1YWxseSBmaXJlcywgd2UgY2FsbCB0aGUgZHJpdmVyLgotICogSG9wZWZ1bGx5LCBtb3JlIG9uIHRoYXQgbGF0ZXIuCi0gKgotICogQWxzbywgSSdtIHdhaXRpbmcgdG8gc2VlIGhvdyBtYW55IHBlb3BsZSB3aWxsIGNvbXBsYWluIGFib3V0IHRoZQotICogbmV0aWZfcnVubmluZyhkZXYpIHRlc3QuIEknbSBvcGVuIG9uIHRoYXQgb25lLi4uCi0gKiBIb3BlZnVsbHksIHRoZSBkcml2ZXIgd2lsbCByZW1lbWJlciB0byBkbyBhIGNvbW1pdCBpbiAib3BlbigpIiA7LSkKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2FsbF9jb21taXRfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKLXsKLQlpZigobmV0aWZfcnVubmluZyhkZXYpKSAmJgotCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zdGFuZGFyZFswXSAhPSBOVUxMKSkgewotCQkvKiBDYWxsIHRoZSBjb21taXQgaGFuZGxlciBvbiB0aGUgZHJpdmVyICovCi0JCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zdGFuZGFyZFswXShkZXYsIE5VTEwsCi0JCQkJCQkJICAgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlCi0JCXJldHVybiAwOwkJLyogQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCi19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBDYWxjdWxhdGUgc2l6ZSBvZiBwcml2YXRlIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfcHJpdl9zaXplKF9fdTE2CWFyZ3MpCi17Ci0JaW50CW51bSA9IGFyZ3MgJiBJV19QUklWX1NJWkVfTUFTSzsKLQlpbnQJdHlwZSA9IChhcmdzICYgSVdfUFJJVl9UWVBFX01BU0spID4+IDEyOwotCi0JcmV0dXJuIG51bSAqIGl3X3ByaXZfdHlwZV9zaXplW3R5cGVdOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUmUtY2FsY3VsYXRlIHRoZSBzaXplIG9mIHByaXZhdGUgYXJndW1lbnRzCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFkanVzdF9wcml2X3NpemUoX191MTYJCWFyZ3MsCi0JCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUpCi17Ci0JaW50CW51bSA9IHdycXUtPmRhdGEubGVuZ3RoOwotCWludAltYXggPSBhcmdzICYgSVdfUFJJVl9TSVpFX01BU0s7Ci0JaW50CXR5cGUgPSAoYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSA+PiAxMjsKLQotCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGRvZXNuJ3QgZ29vZiB1cCAqLwotCWlmIChtYXggPCBudW0pCi0JCW51bSA9IG1heDsKLQotCXJldHVybiBudW0gKiBpd19wcml2X3R5cGVfc2l6ZVt0eXBlXTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgd2lyZWxlc3Mgc3RhdHMKLSAqCUFsbG93IHByb2dyYW1hdGljIGFjY2VzcyB0byAvcHJvYy9uZXQvd2lyZWxlc3MgZXZlbiBpZiAvcHJvYwotICoJZG9lc24ndCBleGlzdC4uLiBBbHNvIG1vcmUgZWZmaWNpZW50Li4uCi0gKi8KLXN0YXRpYyBpbnQgaXdfaGFuZGxlcl9nZXRfaXdzdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCi0JCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKLQkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgkJd3JxdSwKLQkJCQkgIGNoYXIgKgkJCWV4dHJhKQotewotCS8qIEdldCBzdGF0cyBmcm9tIHRoZSBkcml2ZXIgKi8KLQlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqc3RhdHM7Ci0KLQlzdGF0cyA9IGdldF93aXJlbGVzc19zdGF0cyhkZXYpOwotCWlmIChzdGF0cyAhPSAoc3RydWN0IGl3X3N0YXRpc3RpY3MgKikgTlVMTCkgewotCi0JCS8qIENvcHkgc3RhdGlzdGljcyB0byBleHRyYSAqLwotCQltZW1jcHkoZXh0cmEsIHN0YXRzLCBzaXplb2Yoc3RydWN0IGl3X3N0YXRpc3RpY3MpKTsKLQkJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3N0YXRpc3RpY3MpOwotCi0JCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHVwZGF0ZWQgZmxhZyAqLwotCQlpZih3cnF1LT5kYXRhLmZsYWdzICE9IDApCi0JCQlzdGF0cy0+cXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IGdldCBpd3ByaXYgZGVmaW5pdGlvbnMKLSAqIEV4cG9ydCB0aGUgZHJpdmVyIHByaXZhdGUgaGFuZGxlciBkZWZpbml0aW9uCi0gKiBUaGV5IHdpbGwgYmUgcGlja2VkIHVwIGJ5IHRvb2xzIGxpa2UgaXdwcml2Li4uCi0gKi8KLXN0YXRpYyBpbnQgaXdfaGFuZGxlcl9nZXRfcHJpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCi0JCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKLQkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgkJd3JxdSwKLQkJCQkgIGNoYXIgKgkJCWV4dHJhKQotewotCS8qIENoZWNrIGlmIHRoZSBkcml2ZXIgaGFzIHNvbWV0aGluZyB0byBleHBvcnQgKi8KLQlpZigoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJncyA9PSAwKSB8fAotCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MgPT0gTlVMTCkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgdXAgdGhlcmUgKi8KLQlpZih3cnF1LT5kYXRhLmxlbmd0aCA8IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3MpIHsKLQkJLyogVXNlciBzcGFjZSBjYW4ndCBrbm93IGluIGFkdmFuY2UgaG93IGxhcmdlIHRoZSBidWZmZXIKLQkJICogbmVlZHMgdG8gYmUuIEdpdmUgaXQgYSBoaW50LCBzbyB0aGF0IHdlIGNhbiBzdXBwb3J0Ci0JCSAqIGFueSBzaXplIGJ1ZmZlciB3ZSB3YW50IHNvbWV3aGF0IGVmZmljaWVudGx5Li4uICovCi0JCXdycXUtPmRhdGEubGVuZ3RoID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsKLQkJcmV0dXJuIC1FMkJJRzsKLQl9Ci0KLQkvKiBTZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW9jdGxzLiAqLwotCXdycXUtPmRhdGEubGVuZ3RoID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsKLQotCS8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlci4gKi8KLQltZW1jcHkoZXh0cmEsIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJncywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpICogd3JxdS0+ZGF0YS5sZW5ndGgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqIC9wcm9jL25ldC93aXJlbGVzcyBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFRoZSAvcHJvYy9uZXQvd2lyZWxlc3MgZmlsZSBpcyBhIGh1bWFuIHJlYWRhYmxlIHVzZXItc3BhY2UgaW50ZXJmYWNlCi0gKiBleHBvcnRpbmcgdmFyaW91cyB3aXJlbGVzcyBzcGVjaWZpYyBzdGF0aXN0aWNzIGZyb20gdGhlIHdpcmVsZXNzIGRldmljZXMuCi0gKiBUaGlzIGlzIHRoZSBtb3N0IHBvcHVsYXIgcGFydCBvZiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyA7LSkKLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBhIHB1cmUgY2xvbmUgb2YgL3Byb2MvbmV0L2RldiAoaW4gbmV0L2NvcmUvZGV2LmMpLgotICogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMgYmFzaWNhbGx5IHRoZSBjb250ZW50IG9mICJzdHJ1Y3QgaXdfc3RhdGlzdGljcyIuCi0gKi8KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBQcmludCBvbmUgZW50cnkgKGxpbmUpIG9mIC9wcm9jL25ldC93aXJlbGVzcwotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHdpcmVsZXNzX3NlcV9wcmludGZfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBHZXQgc3RhdHMgZnJvbSB0aGUgZHJpdmVyICovCi0Jc3RydWN0IGl3X3N0YXRpc3RpY3MgKnN0YXRzID0gZ2V0X3dpcmVsZXNzX3N0YXRzKGRldik7Ci0KLQlpZiAoc3RhdHMpIHsKLQkJc2VxX3ByaW50ZihzZXEsICIlNnM6ICUwNHggICUzZCVjICAlM2QlYyAgJTNkJWMgICU2ZCAlNmQgJTZkICIKLQkJCQkiJTZkICU2ZCAgICU2ZFxuIiwKLQkJCSAgIGRldi0+bmFtZSwgc3RhdHMtPnN0YXR1cywgc3RhdHMtPnF1YWwucXVhbCwKLQkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX1FVQUxfVVBEQVRFRAotCQkJICAgPyAnLicgOiAnICcsCi0JCQkgICAoKF9fczMyKSBzdGF0cy0+cXVhbC5sZXZlbCkgLQotCQkJICAgKChzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9EQk0pID8gMHgxMDAgOiAwKSwKLQkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0xFVkVMX1VQREFURUQKLQkJCSAgID8gJy4nIDogJyAnLAotCQkJICAgKChfX3MzMikgc3RhdHMtPnF1YWwubm9pc2UpIC0KLQkJCSAgICgoc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfREJNKSA/IDB4MTAwIDogMCksCi0JCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9OT0lTRV9VUERBVEVECi0JCQkgICA/ICcuJyA6ICcgJywKLQkJCSAgIHN0YXRzLT5kaXNjYXJkLm53aWQsIHN0YXRzLT5kaXNjYXJkLmNvZGUsCi0JCQkgICBzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCwgc3RhdHMtPmRpc2NhcmQucmV0cmllcywKLQkJCSAgIHN0YXRzLT5kaXNjYXJkLm1pc2MsIHN0YXRzLT5taXNzLmJlYWNvbik7Ci0JCXN0YXRzLT5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfQUxMX1VQREFURUQ7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUHJpbnQgaW5mbyBmb3IgL3Byb2MvbmV0L3dpcmVsZXNzIChwcmludCBhbGwgZW50cmllcykKLSAqLwotc3RhdGljIGludCB3aXJlbGVzc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXNlcV9wcmludGYoc2VxLCAiSW50ZXItfCBzdGEtfCAgIFF1YWxpdHkgICAgICAgIHwgICBEaXNjYXJkZWQgIgotCQkJCSJwYWNrZXRzICAgICAgICAgICAgICAgfCBNaXNzZWQgfCBXRVxuIgotCQkJCSIgZmFjZSB8IHR1cyB8IGxpbmsgbGV2ZWwgbm9pc2UgfCAgbndpZCAgIgotCQkJCSJjcnlwdCAgIGZyYWcgIHJldHJ5ICAgbWlzYyB8IGJlYWNvbiB8ICVkXG4iLAotCQkJICAgV0lSRUxFU1NfRVhUKTsKLQllbHNlCi0JCXdpcmVsZXNzX3NlcV9wcmludGZfc3RhdHMoc2VxLCB2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3aXJlbGVzc19zZXFfb3BzID0gewotCS5zdGFydCA9IGRldl9zZXFfc3RhcnQsCi0JLm5leHQgID0gZGV2X3NlcV9uZXh0LAotCS5zdG9wICA9IGRldl9zZXFfc3RvcCwKLQkuc2hvdyAgPSB3aXJlbGVzc19zZXFfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgd2lyZWxlc3Nfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ3aXJlbGVzc19zZXFfb3BzKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2lyZWxlc3Nfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyCSA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gd2lyZWxlc3Nfc2VxX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAotfTsKLQotaW50IF9faW5pdCB3aXJlbGVzc19wcm9jX2luaXQodm9pZCkKLXsKLQkvKiBDcmVhdGUgL3Byb2MvbmV0L3dpcmVsZXNzIGVudHJ5ICovCi0JaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgid2lyZWxlc3MiLCBTX0lSVUdPLCAmd2lyZWxlc3Nfc2VxX2ZvcHMpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCS8qIENPTkZJR19QUk9DX0ZTICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJT0NUTCBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFRoZSBvcmlnaW5hbCB1c2VyIHNwYWNlIEFQSSB0byBjb25maWd1cmUgYWxsIHRob3NlIFdpcmVsZXNzIEV4dGVuc2lvbnMKLSAqIGlzIHRocm91Z2ggSU9DVExzLgotICogSW4gdGhlcmUsIHdlIGNoZWNrIGlmIHdlIG5lZWQgdG8gY2FsbCB0aGUgbmV3IGRyaXZlciBBUEkgKGl3X2hhbmRsZXIpCi0gKiBvciBqdXN0IGNhbGwgdGhlIGRyaXZlciBpb2N0bCBoYW5kbGVyLgotICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBXcmFwcGVyIHRvIGNhbGwgYSBzdGFuZGFyZCBXaXJlbGVzcyBFeHRlbnNpb24gaGFuZGxlci4KLSAqIFdlIGRvIHZhcmlvdXMgY2hlY2tzIGFuZCBhbHNvIHRha2UgY2FyZSBvZiBtb3ZpbmcgZGF0YSBiZXR3ZWVuCi0gKiB1c2VyIHNwYWNlIGFuZCBrZXJuZWwgc3BhY2UuCi0gKi8KLXN0YXRpYyBpbnQgaW9jdGxfc3RhbmRhcmRfY2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaWZyZXEgKgkJaWZyLAotCQkJICAgICAgIHVuc2lnbmVkIGludAkJY21kLAotCQkJICAgICAgIGl3X2hhbmRsZXIJCWhhbmRsZXIpCi17Ci0Jc3RydWN0IGl3cmVxICoJCQkJaXdyID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7Ci0JY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uICoJZGVzY3I7Ci0Jc3RydWN0IGl3X3JlcXVlc3RfaW5mbwkJCWluZm87Ci0JaW50CQkJCQlyZXQgPSAtRUlOVkFMOwotCi0JLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KLQlpZigoY21kIC0gU0lPQ0lXRklSU1QpID49IHN0YW5kYXJkX2lvY3RsX251bSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWRlc2NyID0gJihzdGFuZGFyZF9pb2N0bFtjbWQgLSBTSU9DSVdGSVJTVF0pOwotCi0jaWZkZWYgV0VfSU9DVExfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEZvdW5kIHN0YW5kYXJkIGhhbmRsZXIgZm9yIDB4JTA0WFxuIiwKLQkgICAgICAgaWZyLT5pZnJfbmFtZSwgY21kKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEhlYWRlciB0eXBlIDogJWQsIFRva2VuIHR5cGUgOiAlZCwgc2l6ZSA6ICVkLCB0b2tlbiA6ICVkXG4iLCBkZXYtPm5hbWUsIGRlc2NyLT5oZWFkZXJfdHlwZSwgZGVzY3ItPnRva2VuX3R5cGUsIGRlc2NyLT50b2tlbl9zaXplLCBkZXNjci0+bWF4X3Rva2Vucyk7Ci0jZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KLQotCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KLQlpbmZvLmNtZCA9IGNtZDsKLQlpbmZvLmZsYWdzID0gMDsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QgKi8KLQlpZihkZXNjci0+aGVhZGVyX3R5cGUgIT0gSVdfSEVBREVSX1RZUEVfUE9JTlQpIHsKLQotCQkvKiBObyBleHRyYSBhcmd1bWVudHMuIFRyaXZpYWwgdG8gaGFuZGxlICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCBOVUxMKTsKLQotI2lmZGVmIFdFX1NFVF9FVkVOVAotCQkvKiBHZW5lcmF0ZSBhbiBldmVudCB0byBub3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UgKi8KLQkJaWYoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCi0JCSAgICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVJV0NPTU1JVCkpKQotCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLCBOVUxMKTsKLSNlbmRpZgkvKiBXRV9TRVRfRVZFTlQgKi8KLQl9IGVsc2UgewotCQljaGFyICoJZXh0cmE7Ci0JCWludAlleHRyYV9zaXplOwotCQlpbnQJdXNlcl9sZW5ndGggPSAwOwotCQlpbnQJZXJyOwotCQlpbnQJZXNzaWRfY29tcGF0ID0gMDsKLQotCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCi0JCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLwotCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKLQotCQkvKiBDaGVjayBuZWVkIGZvciBFU1NJRCBjb21wYXRpYmlsaXR5IGZvciBXRSA8IDIxICovCi0JCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgU0lPQ1NJV0VTU0lEOgotCQljYXNlIFNJT0NHSVdFU1NJRDoKLQkJY2FzZSBTSU9DU0lXTklDS046Ci0JCWNhc2UgU0lPQ0dJV05JQ0tOOgotCQkJaWYgKGl3ci0+dS5kYXRhLmxlbmd0aCA9PSBkZXNjci0+bWF4X3Rva2VucyArIDEpCi0JCQkJZXNzaWRfY29tcGF0ID0gMTsKLQkJCWVsc2UgaWYgKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKLQkJCQljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07Ci0KLQkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdyLT51LmRhdGEucG9pbnRlciwKLQkJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKLQkJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJaWYgKGVzc2lkW2l3ci0+dS5kYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCi0JCQkJCWVzc2lkX2NvbXBhdCA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaXdyLT51LmRhdGEubGVuZ3RoIC09IGVzc2lkX2NvbXBhdDsKLQotCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCi0JCWlmKElXX0lTX1NFVChjbWQpKSB7Ci0JCQkvKiBDaGVjayBOVUxMIHBvaW50ZXIgKi8KLQkJCWlmKChpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpICYmCi0JCQkgICAoaXdyLT51LmRhdGEubGVuZ3RoICE9IDApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIHRva2VuIGZpdHMgd2l0aGluIGJvdW5kcyAqLwotCQkJaWYoaXdyLT51LmRhdGEubGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWlmKGl3ci0+dS5kYXRhLmxlbmd0aCA8IGRlc2NyLT5taW5fdG9rZW5zKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9IGVsc2UgewotCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCi0JCQlpZihpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkvKiBTYXZlIHVzZXIgc3BhY2UgYnVmZmVyIHNpemUgZm9yIGNoZWNraW5nICovCi0JCQl1c2VyX2xlbmd0aCA9IGl3ci0+dS5kYXRhLmxlbmd0aDsKLQotCQkJLyogRG9uJ3QgY2hlY2sgaWYgdXNlcl9sZW5ndGggPiBtYXggdG8gYWxsb3cgZm9yd2FyZAotCQkJICogY29tcGF0aWJpbGl0eS4gVGhlIHRlc3QgdXNlcl9sZW5ndGggPCBtaW4gaXMKLQkJCSAqIGltcGxpZWQgYnkgdGhlIHRlc3QgYXQgdGhlIGVuZC4gKi8KLQotCQkJLyogU3VwcG9ydCBmb3IgdmVyeSBsYXJnZSByZXF1ZXN0cyAqLwotCQkJaWYoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfTk9NQVgpICYmCi0JCQkgICAodXNlcl9sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykpIHsKLQkJCQkvKiBBbGxvdyB1c2Vyc3BhY2UgdG8gR0VUIG1vcmUgdGhhbiBtYXggc28KLQkJCQkgKiB3ZSBjYW4gc3VwcG9ydCBhbnkgc2l6ZSBHRVQgcmVxdWVzdHMuCi0JCQkJICogVGhlcmUgaXMgc3RpbGwgYSBsaW1pdCA6IC1FTk9NRU0uICovCi0JCQkJZXh0cmFfc2l6ZSA9IHVzZXJfbGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7Ci0JCQkJLyogTm90ZSA6IHVzZXJfbGVuZ3RoIGlzIG9yaWdpbmFsbHkgYSBfX3UxNiwKLQkJCQkgKiBhbmQgdG9rZW5fc2l6ZSBpcyBjb250cm9sbGVkIGJ5IHVzLAotCQkJCSAqIHNvIGV4dHJhX3NpemUgd29uJ3QgZ2V0IG5lZ2F0aXZlIGFuZAotCQkJCSAqIHdvbid0IG92ZXJmbG93Li4uICovCi0JCQl9Ci0JCX0KLQotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogTWFsbG9jICVkIGJ5dGVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKLSNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLwotCi0JCS8qIENyZWF0ZSB0aGUga2VybmVsIGJ1ZmZlciAqLwotCQkvKiAgICBremFsbG9jIGVuc3VyZXMgTlVMTC10ZXJtaW5hdGlvbiBmb3IgZXNzaWRfY29tcGF0ICovCi0JCWV4dHJhID0ga3phbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGV4dHJhID09IE5VTEwpIHsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJLyogSWYgaXQgaXMgYSBTRVQsIGdldCBhbGwgdGhlIGV4dHJhIGRhdGEgaW4gaGVyZSAqLwotCQlpZihJV19JU19TRVQoY21kKSAmJiAoaXdyLT51LmRhdGEubGVuZ3RoICE9IDApKSB7Ci0JCQllcnIgPSBjb3B5X2Zyb21fdXNlcihleHRyYSwgaXdyLT51LmRhdGEucG9pbnRlciwKLQkJCQkJICAgICBpd3ItPnUuZGF0YS5sZW5ndGggKgotCQkJCQkgICAgIGRlc2NyLT50b2tlbl9zaXplKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlrZnJlZShleHRyYSk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0jaWZkZWYgV0VfSU9DVExfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogR290ICVkIGJ5dGVzXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwKLQkJCSAgICAgICBpd3ItPnUuZGF0YS5sZW5ndGggKiBkZXNjci0+dG9rZW5fc2l6ZSk7Ci0jZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KLQkJfQotCi0JCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIGV4dHJhKTsKLQotCQlpd3ItPnUuZGF0YS5sZW5ndGggKz0gZXNzaWRfY29tcGF0OwotCi0JCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHJldHVybiB0byB0aGUgdXNlciAqLwotCQlpZiAoIXJldCAmJiBJV19JU19HRVQoY21kKSkgewotCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciB1cCB0aGVyZSAqLwotCQkJaWYodXNlcl9sZW5ndGggPCBpd3ItPnUuZGF0YS5sZW5ndGgpIHsKLQkJCQlrZnJlZShleHRyYSk7Ci0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCX0KLQotCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAotCQkJCQkgICBpd3ItPnUuZGF0YS5sZW5ndGggKgotCQkJCQkgICBkZXNjci0+dG9rZW5fc2l6ZSk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldCA9ICAtRUZBVUxUOwotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IFdyb3RlICVkIGJ5dGVzXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwKLQkJCSAgICAgICBpd3ItPnUuZGF0YS5sZW5ndGggKiBkZXNjci0+dG9rZW5fc2l6ZSk7Ci0jZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KLQkJfQotCi0jaWZkZWYgV0VfU0VUX0VWRU5UCi0JCS8qIEdlbmVyYXRlIGFuIGV2ZW50IHRvIG5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZSAqLwotCQlpZigoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19FVkVOVCkgJiYKLQkJICAgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtRUlXQ09NTUlUKSkpIHsKLQkJCWlmKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfUkVTVFJJQ1QpCi0JCQkJLyogSWYgdGhlIGV2ZW50IGlzIHJlc3RyaWN0ZWQsIGRvbid0Ci0JCQkJICogZXhwb3J0IHRoZSBwYXlsb2FkICovCi0JCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLCBOVUxMKTsKLQkJCWVsc2UKLQkJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgY21kLCAmKGl3ci0+dSksCi0JCQkJCQkgICAgZXh0cmEpOwotCQl9Ci0jZW5kaWYJLyogV0VfU0VUX0VWRU5UICovCi0KLQkJLyogQ2xlYW51cCAtIEkgdG9sZCB5b3UgaXQgd2Fzbid0IHRoYXQgbG9uZyA7LSkgKi8KLQkJa2ZyZWUoZXh0cmEpOwotCX0KLQotCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgaWYgbmVlZGVkIGFuZCBkZWZpbmVkICovCi0JaWYocmV0ID09IC1FSVdDT01NSVQpCi0JCXJldCA9IGNhbGxfY29tbWl0X2hhbmRsZXIoZGV2KTsKLQotCS8qIEhlcmUsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lZWRlZCAqLwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFdyYXBwZXIgdG8gY2FsbCBhIHByaXZhdGUgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXIuCi0gKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgbW92aW5nIGRhdGEgYmV0d2VlbgotICogdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLgotICogSXQncyBub3QgYXMgbmljZSBhbmQgc2xpbWxpbmUgYXMgdGhlIHN0YW5kYXJkIHdyYXBwZXIuIFRoZSBjYXVzZQotICogaXMgc3RydWN0IGl3X3ByaXZfYXJncywgd2hpY2ggd2FzIG5vdCByZWFsbHkgZGVzaWduZWQgZm9yIHRoZQotICogam9iIHdlIGFyZSBnb2luZyBoZXJlLgotICoKLSAqIElNUE9SVEFOVCA6IFRoaXMgZnVuY3Rpb24gcHJldmVudCB0byBzZXQgYW5kIGdldCBkYXRhIG9uIHRoZSBzYW1lCi0gKiBJT0NUTCBhbmQgZW5mb3JjZSB0aGUgU0VUL0dFVCBjb252ZW50aW9uLiBOb3QgZG9pbmcgaXQgd291bGQgYmUKLSAqIGZhciB0b28gaGFpcnkuLi4KLSAqIElmIHlvdSBuZWVkIHRvIHNldCBhbmQgZ2V0IGRhdGEgYXQgdGhlIHNhbWUgdGltZSwgcGxlYXNlIGRvbid0IHVzZQotICogYSBpd19oYW5kbGVyIGJ1dCBwcm9jZXNzIGl0IGluIHlvdXIgaW9jdGwgaGFuZGxlciAoaS5lLiB1c2UgdGhlCi0gKiBvbGQgZHJpdmVyIEFQSSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlvY3RsX3ByaXZhdGVfY2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkgICAgIHN0cnVjdCBpZnJlcSAqCQlpZnIsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQJCWNtZCwKLQkJCQkgICAgIGl3X2hhbmRsZXIJCWhhbmRsZXIpCi17Ci0Jc3RydWN0IGl3cmVxICoJCQlpd3IgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKLQljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJZGVzY3IgPSBOVUxMOwotCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCWluZm87Ci0JaW50CQkJCWV4dHJhX3NpemUgPSAwOwotCWludAkJCQlpOwotCWludAkJCQlyZXQgPSAtRUlOVkFMOwotCi0JLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KLQlmb3IoaSA9IDA7IGkgPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZV9hcmdzOyBpKyspCi0JCWlmKGNtZCA9PSBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3NbaV0uY21kKSB7Ci0JCQlkZXNjciA9ICYoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzW2ldKTsKLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBXRV9JT0NUTF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRm91bmQgcHJpdmF0ZSBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGlmci0+aWZyX25hbWUsIGNtZCk7Ci0JaWYoZGVzY3IpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBOYW1lICVzLCBzZXQgJVgsIGdldCAlWFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZGVzY3ItPm5hbWUsCi0JCSAgICAgICBkZXNjci0+c2V0X2FyZ3MsIGRlc2NyLT5nZXRfYXJncyk7Ci0JfQotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0KLQkvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzZXQvZ2V0IGFyZ3VtZW50cyAqLwotCWlmKGRlc2NyICE9IE5VTEwpIHsKLQkJaWYoSVdfSVNfU0VUKGNtZCkpIHsKLQkJCWludAlvZmZzZXQgPSAwOwkvKiBGb3Igc3ViLWlvY3RscyAqLwotCQkJLyogQ2hlY2sgZm9yIHN1Yi1pb2N0bCBoYW5kbGVyICovCi0JCQlpZihkZXNjci0+bmFtZVswXSA9PSAnXDAnKQotCQkJCS8qIFJlc2VydmUgb25lIGludCBmb3Igc3ViLWlvY3RsIGluZGV4ICovCi0JCQkJb2Zmc2V0ID0gc2l6ZW9mKF9fdTMyKTsKLQotCQkJLyogU2l6ZSBvZiBzZXQgYXJndW1lbnRzICovCi0JCQlleHRyYV9zaXplID0gZ2V0X3ByaXZfc2l6ZShkZXNjci0+c2V0X2FyZ3MpOwotCi0JCQkvKiBEb2VzIGl0IGZpdHMgaW4gaXdyID8gKi8KLQkJCWlmKChkZXNjci0+c2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpICYmCi0JCQkgICAoKGV4dHJhX3NpemUgKyBvZmZzZXQpIDw9IElGTkFNU0laKSkKLQkJCQlleHRyYV9zaXplID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIFNpemUgb2YgZ2V0IGFyZ3VtZW50cyAqLwotCQkJZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzKTsKLQotCQkJLyogRG9lcyBpdCBmaXRzIGluIGl3ciA/ICovCi0JCQlpZigoZGVzY3ItPmdldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSAmJgotCQkJICAgKGV4dHJhX3NpemUgPD0gSUZOQU1TSVopKQotCQkJCWV4dHJhX3NpemUgPSAwOwotCQl9Ci0JfQotCi0JLyogUHJlcGFyZSB0aGUgY2FsbCAqLwotCWluZm8uY21kID0gY21kOwotCWluZm8uZmxhZ3MgPSAwOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHBvaW50ZXIgdG8gdXNlciBzcGFjZSBkYXRhIG9yIG5vdC4gKi8KLQlpZihleHRyYV9zaXplID09IDApIHsKLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgKGNoYXIgKikgJihpd3ItPnUpKTsKLQl9IGVsc2UgewotCQljaGFyICoJZXh0cmE7Ci0JCWludAllcnI7Ci0KLQkJLyogQ2hlY2sgd2hhdCB1c2VyIHNwYWNlIGlzIGdpdmluZyB1cyAqLwotCQlpZihJV19JU19TRVQoY21kKSkgewotCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCi0JCQlpZigoaXdyLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKSAmJgotCQkJICAgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJLyogRG9lcyBpdCBmaXRzIHdpdGhpbiBib3VuZHMgPyAqLwotCQkJaWYoaXdyLT51LmRhdGEubGVuZ3RoID4gKGRlc2NyLT5zZXRfYXJncyAmCi0JCQkJCQkgSVdfUFJJVl9TSVpFX01BU0spKQotCQkJCXJldHVybiAtRTJCSUc7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBDaGVjayBOVUxMIHBvaW50ZXIgKi8KLQkJCWlmKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0jaWZkZWYgV0VfSU9DVExfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBNYWxsb2MgJWQgYnl0ZXNcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUpOwotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0KLQkJLyogQWx3YXlzIGFsbG9jYXRlIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QKLQkJICogbG9uZy4uLiAqLwotCQlleHRyYSA9IGttYWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChleHRyYSA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIElmIGl0IGlzIGEgU0VULCBnZXQgYWxsIHRoZSBleHRyYSBkYXRhIGluIGhlcmUgKi8KLQkJaWYoSVdfSVNfU0VUKGNtZCkgJiYgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkgewotCQkJZXJyID0gY29weV9mcm9tX3VzZXIoZXh0cmEsIGl3ci0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCSAgICAgZXh0cmFfc2l6ZSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJa2ZyZWUoZXh0cmEpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEdvdCAlZCBlbGVtXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgaXdyLT51LmRhdGEubGVuZ3RoKTsKLSNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLwotCQl9Ci0KLQkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgZXh0cmEpOwotCi0JCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHJldHVybiB0byB0aGUgdXNlciAqLwotCQlpZiAoIXJldCAmJiBJV19JU19HRVQoY21kKSkgewotCi0JCQkvKiBBZGp1c3QgZm9yIHRoZSBhY3R1YWwgbGVuZ3RoIGlmIGl0J3MgdmFyaWFibGUsCi0JCQkgKiBhdm9pZCBsZWFraW5nIGtlcm5lbCBiaXRzIG91dHNpZGUuICovCi0JCQlpZiAoIShkZXNjci0+Z2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKSB7Ci0JCQkJZXh0cmFfc2l6ZSA9IGFkanVzdF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzLAotCQkJCQkJCSAgICAgICYoaXdyLT51KSk7Ci0JCQl9Ci0KLQkJCWVyciA9IGNvcHlfdG9fdXNlcihpd3ItPnUuZGF0YS5wb2ludGVyLCBleHRyYSwKLQkJCQkJICAgZXh0cmFfc2l6ZSk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldCA9ICAtRUZBVUxUOwotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IFdyb3RlICVkIGVsZW1cbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBpd3ItPnUuZGF0YS5sZW5ndGgpOwotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0JCX0KLQotCQkvKiBDbGVhbnVwIC0gSSB0b2xkIHlvdSBpdCB3YXNuJ3QgdGhhdCBsb25nIDstKSAqLwotCQlrZnJlZShleHRyYSk7Ci0JfQotCi0KLQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLwotCWlmKHJldCA9PSAtRUlXQ09NTUlUKQotCQlyZXQgPSBjYWxsX2NvbW1pdF9oYW5kbGVyKGRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogTWFpbiBJT0NUbCBkaXNwYXRjaGVyLiBDYWxsZWQgZnJvbSB0aGUgbWFpbiBuZXR3b3JraW5nIGNvZGUKLSAqIChkZXZfaW9jdGwoKSBpbiBuZXQvY29yZS9kZXYuYykuCi0gKiBDaGVjayB0aGUgdHlwZSBvZiBJT0NUTCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlci4uLgotICovCi1pbnQgd2lyZWxlc3NfcHJvY2Vzc19pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdW5zaWduZWQgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWl3X2hhbmRsZXIJaGFuZGxlcjsKLQotCS8qIFBlcm1pc3Npb25zIGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gZGV2X2lvY3RsKCkgYmVmb3JlIGNhbGxpbmcgdXMuCi0JICogVGhlIGNvcHlfdG8vZnJvbV91c2VyKCkgb2YgaWZyIGlzIGFsc28gZGVhbHQgd2l0aCBpbiB0aGVyZSAqLwotCi0JLyogTWFrZSBzdXJlIHRoZSBkZXZpY2UgZXhpc3QgKi8KLQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIEEgYnVuY2ggb2Ygc3BlY2lhbCBjYXNlcywgdGhlbiB0aGUgZ2VuZXJpYyBjYXNlLi4uCi0JICogTm90ZSB0aGF0ICdjbWQnIGlzIGFscmVhZHkgZmlsdGVyZWQgaW4gZGV2X2lvY3RsKCkgd2l0aAotCSAqIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpICovCi0Jc3dpdGNoKGNtZCkKLQl7Ci0JCWNhc2UgU0lPQ0dJV1NUQVRTOgotCQkJLyogR2V0IFdpcmVsZXNzIFN0YXRzICovCi0JCQlyZXR1cm4gaW9jdGxfc3RhbmRhcmRfY2FsbChkZXYsCi0JCQkJCQkgICBpZnIsCi0JCQkJCQkgICBjbWQsCi0JCQkJCQkgICAmaXdfaGFuZGxlcl9nZXRfaXdzdGF0cyk7Ci0KLQkJY2FzZSBTSU9DR0lXUFJJVjoKLQkJCS8qIENoZWNrIGlmIHdlIGhhdmUgc29tZSB3aXJlbGVzcyBoYW5kbGVycyBkZWZpbmVkICovCi0JCQlpZihkZXYtPndpcmVsZXNzX2hhbmRsZXJzICE9IE5VTEwpIHsKLQkJCQkvKiBXZSBleHBvcnQgdG8gdXNlciBzcGFjZSB0aGUgZGVmaW5pdGlvbiBvZgotCQkJCSAqIHRoZSBwcml2YXRlIGhhbmRsZXIgb3Vyc2VsdmVzICovCi0JCQkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LAotCQkJCQkJCSAgIGlmciwKLQkJCQkJCQkgICBjbWQsCi0JCQkJCQkJICAgJml3X2hhbmRsZXJfZ2V0X3ByaXZhdGUpOwotCQkJfQotCQkJLy8gIyMgRmFsbC10aHJvdWdoIGZvciBvbGQgQVBJICMjCi0JCWRlZmF1bHQ6Ci0JCQkvKiBHZW5lcmljIElPQ1RMICovCi0JCQkvKiBCYXNpYyBjaGVjayAqLwotCQkJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQotCQkJCXJldHVybiAtRU5PREVWOwotCQkJLyogTmV3IGRyaXZlciBBUEkgOiB0cnkgdG8gZmluZCB0aGUgaGFuZGxlciAqLwotCQkJaGFuZGxlciA9IGdldF9oYW5kbGVyKGRldiwgY21kKTsKLQkJCWlmKGhhbmRsZXIgIT0gTlVMTCkgewotCQkJCS8qIFN0YW5kYXJkIGFuZCBwcml2YXRlIGFyZSBub3QgdGhlIHNhbWUgKi8KLQkJCQlpZihjbWQgPCBTSU9DSVdGSVJTVFBSSVYpCi0JCQkJCXJldHVybiBpb2N0bF9zdGFuZGFyZF9jYWxsKGRldiwKLQkJCQkJCQkJICAgaWZyLAotCQkJCQkJCQkgICBjbWQsCi0JCQkJCQkJCSAgIGhhbmRsZXIpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGlvY3RsX3ByaXZhdGVfY2FsbChkZXYsCi0JCQkJCQkJCSAgaWZyLAotCQkJCQkJCQkgIGNtZCwKLQkJCQkJCQkJICBoYW5kbGVyKTsKLQkJCX0KLQkJCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLwotCQkJaWYgKGRldi0+ZG9faW9jdGwpIHsKLQkJCQlyZXR1cm4gZGV2LT5kb19pb2N0bChkZXYsIGlmciwgY21kKTsKLQkJCX0KLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0JLyogTm90IHJlYWNoZWQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUlRORVRMSU5LIFJFUVVFU1QgQVBJICoqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogVGhlIGFsdGVybmF0ZSB1c2VyIHNwYWNlIEFQSSB0byBjb25maWd1cmUgYWxsIHRob3NlIFdpcmVsZXNzIEV4dGVuc2lvbnMKLSAqIGlzIHRocm91Z2ggUnROZXRsaW5rLgotICogVGhpcyBBUEkgc3VwcG9ydCBvbmx5IHRoZSBuZXcgZHJpdmVyIEFQSSAoaXdfaGFuZGxlcikuCi0gKgotICogVGhpcyBSdE5ldGxpbmsgQVBJIHVzZSB0aGUgc2FtZSBxdWVyeS9yZXBseSBtb2RlbCBhcyB0aGUgaW9jdGwgQVBJLgotICogTWF4aW11bSBlZmZvcnQgaGFzIGJlZW4gZG9uZSB0byBmaXQgaW4gdGhlIFJ0TmV0bGluayBtb2RlbCwgYW5kCi0gKiB3ZSBzdXBwb3J0IGJvdGggUnROZXRsaW5rIFNldCBhbmQgUnROZWxpbmsgR2V0IG9wZXJhdGlvbnMuCi0gKiBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgb2ZmZXIgRHVtcCBvcGVyYXRpb25zIGJlY2F1c2Ugb2YgdGhlCi0gKiBmb2xsb3dpbmcgcmVhc29ucyA6Ci0gKglvIExhcmdlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBtb3N0IG9wdGlvbmFsCi0gKglvIExhcmdlIHNpemUgb2Ygc29tZSBwYXJhbWV0ZXJzICg+IDEwMCBieXRlcykKLSAqCW8gRWFjaCBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgZXh0cmFjdGVkIGZyb20gaGFyZHdhcmUKLSAqCW8gU2NhbiByZXF1ZXN0cyBjYW4gdGFrZSBzZWNvbmRzIGFuZCBkaXNhYmxlIG5ldHdvcmsgYWN0aXZpdHkuCi0gKiBCZWNhdXNlIG9mIHRoaXMgaGlnaCBjb3N0L292ZXJoZWFkLCB3ZSB3YW50IHRvIHJldHVybiBvbmx5IHRoZQotICogcGFyYW1ldGVycyB0aGUgdXNlciBhcHBsaWNhdGlvbiBpcyByZWFsbHkgaW50ZXJlc3RlZCBpbi4KLSAqIFdlIGNvdWxkIG9mZmVyIHBhcnRpYWwgRHVtcCB1c2luZyB0aGUgSVdfREVTQ1JfRkxBR19EVU1QIGZsYWcuCi0gKgotICogVGhlIEFQSSB1c2VzIHRoZSBzdGFuZGFyZCBSdE5ldGxpbmsgc29ja2V0LiBXaGVuIHRoZSBSdE5ldGxpbmsgY29kZQotICogZmluZCBhIElGTEFfV0lSRUxFU1MgZmllbGQgaW4gYSBSdE5ldGxpbmsgU0VUX0xJTksgcmVxdWVzdCwKLSAqIGl0IGNhbGxzIGhlcmUuCi0gKi8KLQotI2lmZGVmIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIEdFVCBoYW5kbGVyLgotICogV2UgZG8gdmFyaW91cyBjaGVja3MgYW5kIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCB0aGUgcHJvcGVyIGFyZ3MuCi0gKi8KLXN0YXRpYyBpbnQgcnRuZXRsaW5rX3N0YW5kYXJkX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkgIHN0cnVjdCBpd19ldmVudCAqCXJlcXVlc3QsCi0JCQkJICBpbnQJCQlyZXF1ZXN0X2xlbiwKLQkJCQkgIGl3X2hhbmRsZXIJCWhhbmRsZXIsCi0JCQkJICBjaGFyICoqCQlwX2J1ZiwKLQkJCQkgIGludCAqCQkJcF9sZW4pCi17Ci0JY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uICoJZGVzY3IgPSBOVUxMOwotCXVuc2lnbmVkIGludAkJCQljbWQ7Ci0JdW5pb24gaXdyZXFfZGF0YSAqCQkJd3JxdTsKLQlpbnQJCQkJCWhkcl9sZW47Ci0Jc3RydWN0IGl3X3JlcXVlc3RfaW5mbwkJCWluZm87Ci0JY2hhciAqCQkJCQlidWZmZXIgPSBOVUxMOwotCWludAkJCQkJYnVmZmVyX3NpemUgPSAwOwotCWludAkJCQkJcmV0ID0gLUVJTlZBTDsKLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIFJlcXVlc3QgKi8KLQljbWQgPSByZXF1ZXN0LT5jbWQ7Ci0JaWYoKGNtZCAtIFNJT0NJV0ZJUlNUKSA+PSBzdGFuZGFyZF9pb2N0bF9udW0pCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQlkZXNjciA9ICYoc3RhbmRhcmRfaW9jdGxbY21kIC0gU0lPQ0lXRklSU1RdKTsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBGb3VuZCBzdGFuZGFyZCBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgY21kKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogSGVhZGVyIHR5cGUgOiAlZCwgVG9rZW4gdHlwZSA6ICVkLCBzaXplIDogJWQsIHRva2VuIDogJWRcbiIsIGRldi0+bmFtZSwgZGVzY3ItPmhlYWRlcl90eXBlLCBkZXNjci0+dG9rZW5fdHlwZSwgZGVzY3ItPnRva2VuX3NpemUsIGRlc2NyLT5tYXhfdG9rZW5zKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCS8qIENoZWNrIGlmIHdycXUgaXMgY29tcGxldGUgKi8KLQloZHJfbGVuID0gZXZlbnRfdHlwZV9zaXplW2Rlc2NyLT5oZWFkZXJfdHlwZV07Ci0JaWYocmVxdWVzdF9sZW4gPCBoZHJfbGVuKSB7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiJXMgKFdFLnIpIDogV2lyZWxlc3MgcmVxdWVzdCB0b28gc2hvcnQgKCVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVxdWVzdF9sZW4pOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBQcmVwYXJlIHRoZSBjYWxsICovCi0JaW5mby5jbWQgPSBjbWQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGV4dHJhIGRhdGEgaW4gdGhlIHJlcGx5IG9yIG5vdCAqLwotCWlmKGRlc2NyLT5oZWFkZXJfdHlwZSAhPSBJV19IRUFERVJfVFlQRV9QT0lOVCkgewotCi0JCS8qIENyZWF0ZSB0aGUga2VybmVsIGJ1ZmZlciB0aGF0IHdlIHdpbGwgcmV0dXJuLgotCQkgKiBJdCdzIGF0IGFuIG9mZnNldCB0byBtYXRjaCB0aGUgVFlQRV9QT0lOVCBjYXNlLi4uICovCi0JCWJ1ZmZlcl9zaXplID0gcmVxdWVzdF9sZW4gKyBJV19FVl9QT0lOVF9PRkY7Ci0JCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCS8qIENvcHkgZXZlbnQgZGF0YSAqLwotCQltZW1jcHkoYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGLCByZXF1ZXN0LCByZXF1ZXN0X2xlbik7Ci0JCS8qIFVzZSBvdXIgb3duIGNvcHkgb2Ygd3JxdSAqLwotCQl3cnF1ID0gKHVuaW9uIGl3cmVxX2RhdGEgKikgKGJ1ZmZlciArIElXX0VWX1BPSU5UX09GRgotCQkJCQkgICAgICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sIHdycXUsIE5VTEwpOwotCi0JfSBlbHNlIHsKLQkJdW5pb24gaXdyZXFfZGF0YQl3cnF1X3BvaW50OwotCQljaGFyICoJCQlleHRyYSA9IE5VTEw7Ci0JCWludAkJCWV4dHJhX3NpemUgPSAwOwotCi0JCS8qIEdldCBhIHRlbXAgY29weSBvZiB3cnF1IChza2lwIHBvaW50ZXIpICovCi0JCW1lbWNweSgoKGNoYXIgKikgJndycXVfcG9pbnQpICsgSVdfRVZfUE9JTlRfT0ZGLAotCQkgICAgICAgKChjaGFyICopIHJlcXVlc3QpICsgSVdfRVZfTENQX1BLX0xFTiwKLQkJICAgICAgIElXX0VWX1BPSU5UX0xFTiAtIElXX0VWX0xDUF9QS19MRU4pOwotCi0JCS8qIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgYnkgYXJndW1lbnRzLiBBbHdheXMgYWxsb2NhdGUKLQkJICogZm9yIG1heCBzcGFjZS4gRWFzaWVyLCBhbmQgd29uJ3QgbGFzdCBsb25nLi4uICovCi0JCWV4dHJhX3NpemUgPSBkZXNjci0+bWF4X3Rva2VucyAqIGRlc2NyLT50b2tlbl9zaXplOwotCQkvKiBTdXBwb3J0IGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzICovCi0JCWlmKChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX05PTUFYKSAmJgotCQkgICAod3JxdV9wb2ludC5kYXRhLmxlbmd0aCA+IGRlc2NyLT5tYXhfdG9rZW5zKSkKLQkJCWV4dHJhX3NpemUgPSAod3JxdV9wb2ludC5kYXRhLmxlbmd0aAotCQkJCSAgICAgICogZGVzY3ItPnRva2VuX3NpemUpOwotCQlidWZmZXJfc2l6ZSA9IGV4dHJhX3NpemUgKyBJV19FVl9QT0lOVF9QS19MRU4gKyBJV19FVl9QT0lOVF9PRkY7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBNYWxsb2MgJWQgYnl0ZXMgKCVkIGJ5dGVzKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZXh0cmFfc2l6ZSwgYnVmZmVyX3NpemUpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCi0JCS8qIENyZWF0ZSB0aGUga2VybmVsIGJ1ZmZlciB0aGF0IHdlIHdpbGwgcmV0dXJuICovCi0JCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJLyogUHV0IHdycXUgaW4gdGhlIHJpZ2h0IHBsYWNlIChqdXN0IGJlZm9yZSBleHRyYSkuCi0JCSAqIExlYXZlIHNwYWNlIGZvciBJV0UgaGVhZGVyIGFuZCBkdW1teSBwb2ludGVyLi4uCi0JCSAqIE5vdGUgdGhhdCBJV19FVl9MQ1BfUEtfTEVOPT00IGJ5dGVzLCBzbyBpdCdzIHN0aWxsIGFsaWduZWQuCi0JCSAqLwotCQltZW1jcHkoYnVmZmVyICsgSVdfRVZfTENQX1BLX0xFTiArIElXX0VWX1BPSU5UX09GRiwKLQkJICAgICAgICgoY2hhciAqKSAmd3JxdV9wb2ludCkgKyBJV19FVl9QT0lOVF9PRkYsCi0JCSAgICAgICBJV19FVl9QT0lOVF9QS19MRU4gLSBJV19FVl9MQ1BfUEtfTEVOKTsKLQkJd3JxdSA9ICh1bmlvbiBpd3JlcV9kYXRhICopIChidWZmZXIgKyBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCQkvKiBFeHRyYSBjb21lcyBsb2dpY2FsbHkgYWZ0ZXIgdGhhdC4gT2Zmc2V0ICsxMiBieXRlcy4gKi8KLQkJZXh0cmEgPSBidWZmZXIgKyBJV19FVl9QT0lOVF9PRkYgKyBJV19FVl9QT0lOVF9QS19MRU47Ci0KLQkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sIHdycXUsIGV4dHJhKTsKLQotCQkvKiBDYWxjdWxhdGUgcmVhbCByZXR1cm5lZCBsZW5ndGggKi8KLQkJZXh0cmFfc2l6ZSA9ICh3cnF1LT5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplKTsKLQkJLyogUmUtYWRqdXN0IHJlcGx5IHNpemUgKi8KLQkJcmVxdWVzdC0+bGVuID0gZXh0cmFfc2l6ZSArIElXX0VWX1BPSU5UX1BLX0xFTjsKLQotCQkvKiBQdXQgdGhlIGl3ZSBoZWFkZXIgd2hlcmUgaXQgc2hvdWxkLCBpLmUuIHNjcmFwIHRoZQotCQkgKiBkdW1teSBwb2ludGVyLiAqLwotCQltZW1jcHkoYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGLCByZXF1ZXN0LCBJV19FVl9MQ1BfUEtfTEVOKTsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogUmVwbHkgMHglMDRYLCBoZHJfbGVuICVkLCB0b2tlbnMgJWQsIGV4dHJhX3NpemUgJWQsIGJ1ZmZlcl9zaXplICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgaGRyX2xlbiwgd3JxdS0+ZGF0YS5sZW5ndGgsIGV4dHJhX3NpemUsIGJ1ZmZlcl9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHVwIHRoZXJlICovCi0JCWlmKHdycXVfcG9pbnQuZGF0YS5sZW5ndGggPCB3cnF1LT5kYXRhLmxlbmd0aCkKLQkJCXJldCA9IC1FMkJJRzsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY2FsbGVyICovCi0JaWYgKCFyZXQpIHsKLQkJKnBfYnVmID0gYnVmZmVyOwotCQkqcF9sZW4gPSByZXF1ZXN0LT5sZW47Ci0JfSBlbHNlIHsKLQkJLyogQ2xlYW51cCAqLwotCQlpZihidWZmZXIpCi0JCQlrZnJlZShidWZmZXIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBXcmFwcGVyIHRvIGNhbGwgYSBzdGFuZGFyZCBXaXJlbGVzcyBFeHRlbnNpb24gU0VUIGhhbmRsZXIuCi0gKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgY2FsbCB0aGUgaGFuZGxlciB3aXRoIHRoZSBwcm9wZXIgYXJncy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcnRuZXRsaW5rX3N0YW5kYXJkX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkJIHN0cnVjdCBpd19ldmVudCAqCXJlcXVlc3QsCi0JCQkJCSBpbnQJCQlyZXF1ZXN0X2xlbiwKLQkJCQkJIGl3X2hhbmRsZXIJCWhhbmRsZXIpCi17Ci0JY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uICoJZGVzY3IgPSBOVUxMOwotCXVuc2lnbmVkIGludAkJCQljbWQ7Ci0JdW5pb24gaXdyZXFfZGF0YSAqCQkJd3JxdTsKLQl1bmlvbiBpd3JlcV9kYXRhCQkJd3JxdV9wb2ludDsKLQlpbnQJCQkJCWhkcl9sZW47Ci0JY2hhciAqCQkJCQlleHRyYSA9IE5VTEw7Ci0JaW50CQkJCQlleHRyYV9zaXplID0gMDsKLQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCQkJaW5mbzsKLQlpbnQJCQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBSZXF1ZXN0ICovCi0JY21kID0gcmVxdWVzdC0+Y21kOwotCWlmKChjbWQgLSBTSU9DSVdGSVJTVCkgPj0gc3RhbmRhcmRfaW9jdGxfbnVtKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZCAtIFNJT0NJV0ZJUlNUXSk7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogRm91bmQgc3RhbmRhcmQgU0VUIGhhbmRsZXIgZm9yIDB4JTA0WFxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBIZWFkZXIgdHlwZSA6ICVkLCBUb2tlbiB0eXBlIDogJWQsIHNpemUgOiAlZCwgdG9rZW4gOiAlZFxuIiwgZGV2LT5uYW1lLCBkZXNjci0+aGVhZGVyX3R5cGUsIGRlc2NyLT50b2tlbl90eXBlLCBkZXNjci0+dG9rZW5fc2l6ZSwgZGVzY3ItPm1heF90b2tlbnMpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCi0JLyogRXh0cmFjdCBmaXhlZCBoZWFkZXIgZnJvbSByZXF1ZXN0LiBUaGlzIGlzIHByb3Blcmx5IGFsaWduZWQuICovCi0Jd3JxdSA9ICh1bmlvbiBpd3JlcV9kYXRhICopICgoKGNoYXIgKikgcmVxdWVzdCkgKyBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCS8qIENoZWNrIGlmIHdycXUgaXMgY29tcGxldGUgKi8KLQloZHJfbGVuID0gZXZlbnRfdHlwZV9wa19zaXplW2Rlc2NyLT5oZWFkZXJfdHlwZV07Ci0JaWYocmVxdWVzdF9sZW4gPCBoZHJfbGVuKSB7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiJXMgKFdFLnIpIDogV2lyZWxlc3MgcmVxdWVzdCB0b28gc2hvcnQgKCVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVxdWVzdF9sZW4pOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBQcmVwYXJlIHRoZSBjYWxsICovCi0JaW5mby5jbWQgPSBjbWQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGV4dHJhIGRhdGEgaW4gdGhlIHJlcXVlc3Qgb3Igbm90ICovCi0JaWYoZGVzY3ItPmhlYWRlcl90eXBlICE9IElXX0hFQURFUl9UWVBFX1BPSU5UKSB7Ci0KLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sIHdycXUsIE5VTEwpOwotCi0JfSBlbHNlIHsKLQkJaW50CWV4dHJhX2xlbjsKLQotCQkvKiBQdXQgd3JxdSBpbiB0aGUgcmlnaHQgcGxhY2UgKHNraXAgcG9pbnRlcikgKi8KLQkJbWVtY3B5KCgoY2hhciAqKSAmd3JxdV9wb2ludCkgKyBJV19FVl9QT0lOVF9PRkYsCi0JCSAgICAgICB3cnF1LCBJV19FVl9QT0lOVF9QS19MRU4gLSBJV19FVl9MQ1BfUEtfTEVOKTsKLQkJLyogRG9uJ3QgZm9yZ2V0IGFib3V0IHRoZSBldmVudCBjb2RlLi4uICovCi0JCXdycXUgPSAmd3JxdV9wb2ludDsKLQotCQkvKiBDaGVjayBpZiBudW1iZXIgb2YgdG9rZW4gZml0cyB3aXRoaW4gYm91bmRzICovCi0JCWlmKHdycXVfcG9pbnQuZGF0YS5sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykKLQkJCXJldHVybiAtRTJCSUc7Ci0JCWlmKHdycXVfcG9pbnQuZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIFJlYWwgbGVuZ3RoIG9mIHBheWxvYWQgKi8KLQkJZXh0cmFfbGVuID0gd3JxdV9wb2ludC5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOwotCi0JCS8qIENoZWNrIGlmIHJlcXVlc3QgaXMgc2VsZiBjb25zaXN0ZW50ICovCi0JCWlmKChyZXF1ZXN0X2xlbiAtIGhkcl9sZW4pIDwgZXh0cmFfbGVuKSB7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogV2lyZWxlc3MgcmVxdWVzdCBkYXRhIHRvbyBzaG9ydCAoJWQpXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgZXh0cmFfc2l6ZSk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBNYWxsb2MgJWQgYnl0ZXNcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCi0JCS8qIEFsd2F5cyBhbGxvY2F0ZSBmb3IgbWF4IHNwYWNlLiBFYXNpZXIsIGFuZCB3b24ndCBsYXN0Ci0JCSAqIGxvbmcuLi4gKi8KLQkJZXh0cmFfc2l6ZSA9IGRlc2NyLT5tYXhfdG9rZW5zICogZGVzY3ItPnRva2VuX3NpemU7Ci0JCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGV4dHJhID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBDb3B5IGV4dHJhIGluIGFsaWduZWQgYnVmZmVyICovCi0JCW1lbWNweShleHRyYSwgKChjaGFyICopIHJlcXVlc3QpICsgaGRyX2xlbiwgZXh0cmFfbGVuKTsKLQotCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJndycXVfcG9pbnQsIGV4dHJhKTsKLQl9Ci0KLSNpZmRlZiBXRV9TRVRfRVZFTlQKLQkvKiBHZW5lcmF0ZSBhbiBldmVudCB0byBub3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UgKi8KLQlpZigoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19FVkVOVCkgJiYKLQkgICAoKHJldCA9PSAwKSB8fCAocmV0ID09IC1FSVdDT01NSVQpKSkgewotCQlpZihkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX1JFU1RSSUNUKQotCQkJLyogSWYgdGhlIGV2ZW50IGlzIHJlc3RyaWN0ZWQsIGRvbid0Ci0JCQkgKiBleHBvcnQgdGhlIHBheWxvYWQgKi8KLQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsIHdycXUsIE5VTEwpOwotCQllbHNlCi0JCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgY21kLCB3cnF1LCBleHRyYSk7Ci0JfQotI2VuZGlmCS8qIFdFX1NFVF9FVkVOVCAqLwotCi0JLyogQ2xlYW51cCAtIEkgdG9sZCB5b3UgaXQgd2Fzbid0IHRoYXQgbG9uZyA7LSkgKi8KLQlpZihleHRyYSkKLQkJa2ZyZWUoZXh0cmEpOwotCi0JLyogQ2FsbCBjb21taXQgaGFuZGxlciBpZiBuZWVkZWQgYW5kIGRlZmluZWQgKi8KLQlpZihyZXQgPT0gLUVJV0NPTU1JVCkKLQkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFdyYXBwZXIgdG8gY2FsbCBhIHByaXZhdGUgV2lyZWxlc3MgRXh0ZW5zaW9uIEdFVCBoYW5kbGVyLgotICogU2FtZSBhcyBhYm92ZS4uLgotICogSXQncyBub3QgYXMgbmljZSBhbmQgc2xpbWxpbmUgYXMgdGhlIHN0YW5kYXJkIHdyYXBwZXIuIFRoZSBjYXVzZQotICogaXMgc3RydWN0IGl3X3ByaXZfYXJncywgd2hpY2ggd2FzIG5vdCByZWFsbHkgZGVzaWduZWQgZm9yIHRoZQotICogam9iIHdlIGFyZSBnb2luZyBoZXJlLgotICoKLSAqIElNUE9SVEFOVCA6IFRoaXMgZnVuY3Rpb24gcHJldmVudCB0byBzZXQgYW5kIGdldCBkYXRhIG9uIHRoZSBzYW1lCi0gKiBJT0NUTCBhbmQgZW5mb3JjZSB0aGUgU0VUL0dFVCBjb252ZW50aW9uLiBOb3QgZG9pbmcgaXQgd291bGQgYmUKLSAqIGZhciB0b28gaGFpcnkuLi4KLSAqIElmIHlvdSBuZWVkIHRvIHNldCBhbmQgZ2V0IGRhdGEgYXQgdGhlIHNhbWUgdGltZSwgcGxlYXNlIGRvbid0IHVzZQotICogYSBpd19oYW5kbGVyIGJ1dCBwcm9jZXNzIGl0IGluIHlvdXIgaW9jdGwgaGFuZGxlciAoaS5lLiB1c2UgdGhlCi0gKiBvbGQgZHJpdmVyIEFQSSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJ0bmV0bGlua19wcml2YXRlX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkJc3RydWN0IGl3X2V2ZW50ICoJcmVxdWVzdCwKLQkJCQkJaW50CQkJcmVxdWVzdF9sZW4sCi0JCQkJCWl3X2hhbmRsZXIJCWhhbmRsZXIsCi0JCQkJCWNoYXIgKioJCQlwX2J1ZiwKLQkJCQkJaW50ICoJCQlwX2xlbikKLXsKLQljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJZGVzY3IgPSBOVUxMOwotCXVuc2lnbmVkIGludAkJCWNtZDsKLQl1bmlvbiBpd3JlcV9kYXRhICoJCXdycXU7Ci0JaW50CQkJCWhkcl9sZW47Ci0Jc3RydWN0IGl3X3JlcXVlc3RfaW5mbwkJaW5mbzsKLQlpbnQJCQkJZXh0cmFfc2l6ZSA9IDA7Ci0JaW50CQkJCWk7Ci0JY2hhciAqCQkJCWJ1ZmZlciA9IE5VTEw7Ci0JaW50CQkJCWJ1ZmZlcl9zaXplID0gMDsKLQlpbnQJCQkJcmV0ID0gLUVJTlZBTDsKLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIFJlcXVlc3QgKi8KLQljbWQgPSByZXF1ZXN0LT5jbWQ7Ci0JZm9yKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQotCQlpZihjbWQgPT0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzW2ldLmNtZCkgewotCQkJZGVzY3IgPSAmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXSk7Ci0JCQlicmVhazsKLQkJfQotCWlmKGRlc2NyID09IE5VTEwpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBGb3VuZCBwcml2YXRlIGhhbmRsZXIgZm9yIDB4JTA0WFxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBOYW1lICVzLCBzZXQgJVgsIGdldCAlWFxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBkZXNjci0+bmFtZSwgZGVzY3ItPnNldF9hcmdzLCBkZXNjci0+Z2V0X2FyZ3MpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCi0JLyogQ29tcHV0ZSB0aGUgbWF4IHNpemUgb2YgdGhlIGdldCBhcmd1bWVudHMgKi8KLQlleHRyYV9zaXplID0gZ2V0X3ByaXZfc2l6ZShkZXNjci0+Z2V0X2FyZ3MpOwotCi0JLyogRG9lcyBpdCBmaXRzIGluIHdycXUgPyAqLwotCWlmKChkZXNjci0+Z2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpICYmCi0JICAgKGV4dHJhX3NpemUgPD0gSUZOQU1TSVopKSB7Ci0JCWhkcl9sZW4gPSBleHRyYV9zaXplOwotCQlleHRyYV9zaXplID0gMDsKLQl9IGVsc2UgewotCQloZHJfbGVuID0gSVdfRVZfUE9JTlRfUEtfTEVOOwotCX0KLQotCS8qIENoZWNrIGlmIHdycXUgaXMgY29tcGxldGUgKi8KLQlpZihyZXF1ZXN0X2xlbiA8IGhkcl9sZW4pIHsKLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJICAgICAgICIlcyAoV0UucikgOiBXaXJlbGVzcyByZXF1ZXN0IHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCByZXF1ZXN0X2xlbik7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KLQlpbmZvLmNtZCA9IGNtZDsKLQlpbmZvLmZsYWdzID0gMDsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCi0JaWYoZXh0cmFfc2l6ZSA9PSAwKSB7Ci0KLQkJLyogQ3JlYXRlIHRoZSBrZXJuZWwgYnVmZmVyIHRoYXQgd2Ugd2lsbCByZXR1cm4uCi0JCSAqIEl0J3MgYXQgYW4gb2Zmc2V0IHRvIG1hdGNoIHRoZSBUWVBFX1BPSU5UIGNhc2UuLi4gKi8KLQkJYnVmZmVyX3NpemUgPSByZXF1ZXN0X2xlbiArIElXX0VWX1BPSU5UX09GRjsKLQkJYnVmZmVyID0ga21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJLyogQ29weSBldmVudCBkYXRhICovCi0JCW1lbWNweShidWZmZXIgKyBJV19FVl9QT0lOVF9PRkYsIHJlcXVlc3QsIHJlcXVlc3RfbGVuKTsKLQkJLyogVXNlIG91ciBvd24gY29weSBvZiB3cnF1ICovCi0JCXdycXUgPSAodW5pb24gaXdyZXFfZGF0YSAqKSAoYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGCi0JCQkJCSAgICAgKyBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCQkvKiBObyBleHRyYSBhcmd1bWVudHMuIFRyaXZpYWwgdG8gaGFuZGxlICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgd3JxdSwgKGNoYXIgKikgd3JxdSk7Ci0KLQl9IGVsc2UgewotCQljaGFyICoJZXh0cmE7Ci0KLQkJLyogQnVmZmVyIGZvciBmdWxsIHJlcGx5ICovCi0JCWJ1ZmZlcl9zaXplID0gZXh0cmFfc2l6ZSArIElXX0VWX1BPSU5UX1BLX0xFTiArIElXX0VWX1BPSU5UX09GRjsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTWFsbG9jICVkIGJ5dGVzICglZCBieXRlcylcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUsIGJ1ZmZlcl9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgdGhhdCB3ZSB3aWxsIHJldHVybiAqLwotCQlidWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIFB1dCB3cnF1IGluIHRoZSByaWdodCBwbGFjZSAoanVzdCBiZWZvcmUgZXh0cmEpLgotCQkgKiBMZWF2ZSBzcGFjZSBmb3IgSVdFIGhlYWRlciBhbmQgZHVtbXkgcG9pbnRlci4uLgotCQkgKiBOb3RlIHRoYXQgSVdfRVZfTENQX1BLX0xFTj09NCBieXRlcywgc28gaXQncyBzdGlsbCBhbGlnbmVkLgotCQkgKi8KLQkJbWVtY3B5KGJ1ZmZlciArIElXX0VWX0xDUF9QS19MRU4gKyBJV19FVl9QT0lOVF9PRkYsCi0JCSAgICAgICAoKGNoYXIgKikgcmVxdWVzdCkgKyBJV19FVl9MQ1BfUEtfTEVOLAotCQkgICAgICAgSVdfRVZfUE9JTlRfUEtfTEVOIC0gSVdfRVZfTENQX1BLX0xFTik7Ci0JCXdycXUgPSAodW5pb24gaXdyZXFfZGF0YSAqKSAoYnVmZmVyICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkJLyogRXh0cmEgY29tZXMgbG9naWNhbGx5IGFmdGVyIHRoYXQuIE9mZnNldCArMTIgYnl0ZXMuICovCi0JCWV4dHJhID0gYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGICsgSVdfRVZfUE9JTlRfUEtfTEVOOwotCi0JCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCB3cnF1LCBleHRyYSk7Ci0KLQkJLyogQWRqdXN0IGZvciB0aGUgYWN0dWFsIGxlbmd0aCBpZiBpdCdzIHZhcmlhYmxlLAotCQkgKiBhdm9pZCBsZWFraW5nIGtlcm5lbCBiaXRzIG91dHNpZGUuICovCi0JCWlmICghKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkpCi0JCQlleHRyYV9zaXplID0gYWRqdXN0X3ByaXZfc2l6ZShkZXNjci0+Z2V0X2FyZ3MsIHdycXUpOwotCQkvKiBSZS1hZGp1c3QgcmVwbHkgc2l6ZSAqLwotCQlyZXF1ZXN0LT5sZW4gPSBleHRyYV9zaXplICsgSVdfRVZfUE9JTlRfUEtfTEVOOwotCi0JCS8qIFB1dCB0aGUgaXdlIGhlYWRlciB3aGVyZSBpdCBzaG91bGQsIGkuZS4gc2NyYXAgdGhlCi0JCSAqIGR1bW15IHBvaW50ZXIuICovCi0JCW1lbWNweShidWZmZXIgKyBJV19FVl9QT0lOVF9PRkYsIHJlcXVlc3QsIElXX0VWX0xDUF9QS19MRU4pOwotCi0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBSZXBseSAweCUwNFgsIGhkcl9sZW4gJWQsIHRva2VucyAlZCwgZXh0cmFfc2l6ZSAlZCwgYnVmZmVyX3NpemUgJWRcbiIsIGRldi0+bmFtZSwgY21kLCBoZHJfbGVuLCB3cnF1LT5kYXRhLmxlbmd0aCwgZXh0cmFfc2l6ZSwgYnVmZmVyX3NpemUpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCX0KLQotCS8qIFJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBjYWxsZXIgKi8KLQlpZiAoIXJldCkgewotCQkqcF9idWYgPSBidWZmZXI7Ci0JCSpwX2xlbiA9IHJlcXVlc3QtPmxlbjsKLQl9IGVsc2UgewotCQkvKiBDbGVhbnVwICovCi0JCWlmKGJ1ZmZlcikKLQkJCWtmcmVlKGJ1ZmZlcik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFdyYXBwZXIgdG8gY2FsbCBhIHByaXZhdGUgV2lyZWxlc3MgRXh0ZW5zaW9uIFNFVCBoYW5kbGVyLgotICogU2FtZSBhcyBhYm92ZS4uLgotICogSXQncyBub3QgYXMgbmljZSBhbmQgc2xpbWxpbmUgYXMgdGhlIHN0YW5kYXJkIHdyYXBwZXIuIFRoZSBjYXVzZQotICogaXMgc3RydWN0IGl3X3ByaXZfYXJncywgd2hpY2ggd2FzIG5vdCByZWFsbHkgZGVzaWduZWQgZm9yIHRoZQotICogam9iIHdlIGFyZSBnb2luZyBoZXJlLgotICoKLSAqIElNUE9SVEFOVCA6IFRoaXMgZnVuY3Rpb24gcHJldmVudCB0byBzZXQgYW5kIGdldCBkYXRhIG9uIHRoZSBzYW1lCi0gKiBJT0NUTCBhbmQgZW5mb3JjZSB0aGUgU0VUL0dFVCBjb252ZW50aW9uLiBOb3QgZG9pbmcgaXQgd291bGQgYmUKLSAqIGZhciB0b28gaGFpcnkuLi4KLSAqIElmIHlvdSBuZWVkIHRvIHNldCBhbmQgZ2V0IGRhdGEgYXQgdGhlIHNhbWUgdGltZSwgcGxlYXNlIGRvbid0IHVzZQotICogYSBpd19oYW5kbGVyIGJ1dCBwcm9jZXNzIGl0IGluIHlvdXIgaW9jdGwgaGFuZGxlciAoaS5lLiB1c2UgdGhlCi0gKiBvbGQgZHJpdmVyIEFQSSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJ0bmV0bGlua19wcml2YXRlX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkJc3RydWN0IGl3X2V2ZW50ICoJcmVxdWVzdCwKLQkJCQkJaW50CQkJcmVxdWVzdF9sZW4sCi0JCQkJCWl3X2hhbmRsZXIJCWhhbmRsZXIpCi17Ci0JY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyAqCWRlc2NyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCQljbWQ7Ci0JdW5pb24gaXdyZXFfZGF0YSAqCQl3cnF1OwotCXVuaW9uIGl3cmVxX2RhdGEJCXdycXVfcG9pbnQ7Ci0JaW50CQkJCWhkcl9sZW47Ci0JY2hhciAqCQkJCWV4dHJhID0gTlVMTDsKLQlpbnQJCQkJZXh0cmFfc2l6ZSA9IDA7Ci0JaW50CQkJCW9mZnNldCA9IDA7CS8qIEZvciBzdWItaW9jdGxzICovCi0Jc3RydWN0IGl3X3JlcXVlc3RfaW5mbwkJaW5mbzsKLQlpbnQJCQkJaTsKLQlpbnQJCQkJcmV0ID0gLUVJTlZBTDsKLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIFJlcXVlc3QgKi8KLQljbWQgPSByZXF1ZXN0LT5jbWQ7Ci0JZm9yKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQotCQlpZihjbWQgPT0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzW2ldLmNtZCkgewotCQkJZGVzY3IgPSAmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXSk7Ci0JCQlicmVhazsKLQkJfQotCWlmKGRlc2NyID09IE5VTEwpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBGb3VuZCBwcml2YXRlIGhhbmRsZXIgZm9yIDB4JTA0WFxuIiwKLQkgICAgICAgaWZyLT5pZnJfbmFtZSwgY21kKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTmFtZSAlcywgc2V0ICVYLCBnZXQgJVhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgZGVzY3ItPm5hbWUsIGRlc2NyLT5zZXRfYXJncywgZGVzY3ItPmdldF9hcmdzKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNldCBhcmd1bWVudHMgKi8KLQkvKiBDaGVjayBmb3Igc3ViLWlvY3RsIGhhbmRsZXIgKi8KLQlpZihkZXNjci0+bmFtZVswXSA9PSAnXDAnKQotCQkvKiBSZXNlcnZlIG9uZSBpbnQgZm9yIHN1Yi1pb2N0bCBpbmRleCAqLwotCQlvZmZzZXQgPSBzaXplb2YoX191MzIpOwotCi0JLyogU2l6ZSBvZiBzZXQgYXJndW1lbnRzICovCi0JZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPnNldF9hcmdzKTsKLQotCS8qIERvZXMgaXQgZml0cyBpbiB3cnF1ID8gKi8KLQlpZigoZGVzY3ItPnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSAmJgotCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkgewotCQloZHJfbGVuID0gSVdfRVZfTENQX1BLX0xFTiArIGV4dHJhX3NpemU7Ci0JCWV4dHJhX3NpemUgPSAwOwotCX0gZWxzZSB7Ci0JCWhkcl9sZW4gPSBJV19FVl9QT0lOVF9QS19MRU47Ci0JfQotCi0JLyogRXh0cmFjdCBmaXhlZCBoZWFkZXIgZnJvbSByZXF1ZXN0LiBUaGlzIGlzIHByb3Blcmx5IGFsaWduZWQuICovCi0Jd3JxdSA9ICh1bmlvbiBpd3JlcV9kYXRhICopICgoKGNoYXIgKikgcmVxdWVzdCkgKyBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCS8qIENoZWNrIGlmIHdycXUgaXMgY29tcGxldGUgKi8KLQlpZihyZXF1ZXN0X2xlbiA8IGhkcl9sZW4pIHsKLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJICAgICAgICIlcyAoV0UucikgOiBXaXJlbGVzcyByZXF1ZXN0IHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCByZXF1ZXN0X2xlbik7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KLQlpbmZvLmNtZCA9IGNtZDsKLQlpbmZvLmZsYWdzID0gMDsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCi0JaWYoZXh0cmFfc2l6ZSA9PSAwKSB7Ci0KLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sIHdycXUsIChjaGFyICopIHdycXUpOwotCi0JfSBlbHNlIHsKLQkJaW50CWV4dHJhX2xlbjsKLQotCQkvKiBQdXQgd3JxdSBpbiB0aGUgcmlnaHQgcGxhY2UgKHNraXAgcG9pbnRlcikgKi8KLQkJbWVtY3B5KCgoY2hhciAqKSAmd3JxdV9wb2ludCkgKyBJV19FVl9QT0lOVF9PRkYsCi0JCSAgICAgICB3cnF1LCBJV19FVl9QT0lOVF9QS19MRU4gLSBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCQkvKiBEb2VzIGl0IGZpdHMgd2l0aGluIGJvdW5kcyA/ICovCi0JCWlmKHdycXVfcG9pbnQuZGF0YS5sZW5ndGggPiAoZGVzY3ItPnNldF9hcmdzICYKLQkJCQkJICAgICBJV19QUklWX1NJWkVfTUFTSykpCi0JCQlyZXR1cm4gLUUyQklHOwotCi0JCS8qIFJlYWwgbGVuZ3RoIG9mIHBheWxvYWQgKi8KLQkJZXh0cmFfbGVuID0gYWRqdXN0X3ByaXZfc2l6ZShkZXNjci0+c2V0X2FyZ3MsICZ3cnF1X3BvaW50KTsKLQotCQkvKiBDaGVjayBpZiByZXF1ZXN0IGlzIHNlbGYgY29uc2lzdGVudCAqLwotCQlpZigocmVxdWVzdF9sZW4gLSBoZHJfbGVuKSA8IGV4dHJhX2xlbikgewotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFdpcmVsZXNzIHJlcXVlc3QgZGF0YSB0b28gc2hvcnQgKCVkKVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTWFsbG9jICVkIGJ5dGVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCQkvKiBBbHdheXMgYWxsb2NhdGUgZm9yIG1heCBzcGFjZS4gRWFzaWVyLCBhbmQgd29uJ3QgbGFzdAotCQkgKiBsb25nLi4uICovCi0JCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGV4dHJhID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBDb3B5IGV4dHJhIGluIGFsaWduZWQgYnVmZmVyICovCi0JCW1lbWNweShleHRyYSwgKChjaGFyICopIHJlcXVlc3QpICsgaGRyX2xlbiwgZXh0cmFfbGVuKTsKLQotCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJndycXVfcG9pbnQsIGV4dHJhKTsKLQotCQkvKiBDbGVhbnVwIC0gSSB0b2xkIHlvdSBpdCB3YXNuJ3QgdGhhdCBsb25nIDstKSAqLwotCQlrZnJlZShleHRyYSk7Ci0JfQotCi0JLyogQ2FsbCBjb21taXQgaGFuZGxlciBpZiBuZWVkZWQgYW5kIGRlZmluZWQgKi8KLQlpZihyZXQgPT0gLUVJV0NPTU1JVCkKLQkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIE1haW4gUnROZXRsaW5rIGRpc3BhdGNoZXIuIENhbGxlZCBmcm9tIHRoZSBtYWluIG5ldHdvcmtpbmcgY29kZQotICogKGRvX2dldGxpbmsoKSBpbiBuZXQvY29yZS9ydG5ldGxpbmsuYykuCi0gKiBDaGVjayB0aGUgdHlwZSBvZiBSZXF1ZXN0IGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyLi4uCi0gKi8KLWludCB3aXJlbGVzc19ydG5ldGxpbmtfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkJICAgY2hhciAqCQlkYXRhLAotCQkJICAgaW50CQkJbGVuLAotCQkJICAgY2hhciAqKgkJcF9idWYsCi0JCQkgICBpbnQgKgkJcF9sZW4pCi17Ci0Jc3RydWN0IGl3X2V2ZW50ICoJcmVxdWVzdCA9IChzdHJ1Y3QgaXdfZXZlbnQgKikgZGF0YTsKLQlpd19oYW5kbGVyCQloYW5kbGVyOwotCi0JLyogQ2hlY2sgbGVuZ3RoICovCi0JaWYobGVuIDwgSVdfRVZfTENQX1BLX0xFTikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogUnROZXRsaW5rIHJlcXVlc3QgdG9vIHNob3J0ICglZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJlQ2hlY2sgbGVuZ3RoIChsZW4gbWF5IGhhdmUgcGFkZGluZykgKi8KLQlpZihyZXF1ZXN0LT5sZW4gPiBsZW4pIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFJ0TmV0bGluayByZXF1ZXN0IGxlbiBpbnZhbGlkICglZC0lZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHJlcXVlc3QtPmxlbiwgbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogT25seSBhY2NlcHQgR0VUIHJlcXVlc3RzIGluIGhlcmUgKi8KLQlpZighSVdfSVNfR0VUKHJlcXVlc3QtPmNtZCkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIElmIGNvbW1hbmQgaXMgYGdldCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycycsIGNoZWNrIGlmCi0JICogdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBkbyBpdCAqLwotCWlmIChyZXF1ZXN0LT5jbWQgPT0gU0lPQ0dJV0VOQ09ERSB8fAotCSAgICByZXF1ZXN0LT5jbWQgPT0gU0lPQ0dJV0VOQ09ERUVYVCkgewotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCS8qIFNwZWNpYWwgY2FzZXMgKi8KLQlpZihyZXF1ZXN0LT5jbWQgPT0gU0lPQ0dJV1NUQVRTKQotCQkvKiBHZXQgV2lyZWxlc3MgU3RhdHMgKi8KLQkJcmV0dXJuIHJ0bmV0bGlua19zdGFuZGFyZF9nZXQoZGV2LAotCQkJCQkgICAgICByZXF1ZXN0LAotCQkJCQkgICAgICByZXF1ZXN0LT5sZW4sCi0JCQkJCSAgICAgICZpd19oYW5kbGVyX2dldF9pd3N0YXRzLAotCQkJCQkgICAgICBwX2J1ZiwgcF9sZW4pOwotCWlmKHJlcXVlc3QtPmNtZCA9PSBTSU9DR0lXUFJJVikgewotCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgd2lyZWxlc3MgaGFuZGxlcnMgZGVmaW5lZCAqLwotCQlpZihkZXYtPndpcmVsZXNzX2hhbmRsZXJzID09IE5VTEwpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCS8qIEdldCBXaXJlbGVzcyBTdGF0cyAqLwotCQlyZXR1cm4gcnRuZXRsaW5rX3N0YW5kYXJkX2dldChkZXYsCi0JCQkJCSAgICAgIHJlcXVlc3QsCi0JCQkJCSAgICAgIHJlcXVlc3QtPmxlbiwKLQkJCQkJICAgICAgJml3X2hhbmRsZXJfZ2V0X3ByaXZhdGUsCi0JCQkJCSAgICAgIHBfYnVmLCBwX2xlbik7Ci0JfQotCi0JLyogQmFzaWMgY2hlY2sgKi8KLQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogVHJ5IHRvIGZpbmQgdGhlIGhhbmRsZXIgKi8KLQloYW5kbGVyID0gZ2V0X2hhbmRsZXIoZGV2LCByZXF1ZXN0LT5jbWQpOwotCWlmKGhhbmRsZXIgIT0gTlVMTCkgewotCQkvKiBTdGFuZGFyZCBhbmQgcHJpdmF0ZSBhcmUgbm90IHRoZSBzYW1lICovCi0JCWlmKHJlcXVlc3QtPmNtZCA8IFNJT0NJV0ZJUlNUUFJJVikKLQkJCXJldHVybiBydG5ldGxpbmtfc3RhbmRhcmRfZ2V0KGRldiwKLQkJCQkJCSAgICAgIHJlcXVlc3QsCi0JCQkJCQkgICAgICByZXF1ZXN0LT5sZW4sCi0JCQkJCQkgICAgICBoYW5kbGVyLAotCQkJCQkJICAgICAgcF9idWYsIHBfbGVuKTsKLQkJZWxzZQotCQkJcmV0dXJuIHJ0bmV0bGlua19wcml2YXRlX2dldChkZXYsCi0JCQkJCQkgICAgIHJlcXVlc3QsCi0JCQkJCQkgICAgIHJlcXVlc3QtPmxlbiwKLQkJCQkJCSAgICAgaGFuZGxlciwKLQkJCQkJCSAgICAgcF9idWYsIHBfbGVuKTsKLQl9Ci0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBNYWluIFJ0TmV0bGluayBkaXNwYXRjaGVyLiBDYWxsZWQgZnJvbSB0aGUgbWFpbiBuZXR3b3JraW5nIGNvZGUKLSAqIChkb19zZXRsaW5rKCkgaW4gbmV0L2NvcmUvcnRuZXRsaW5rLmMpLgotICogQ2hlY2sgdGhlIHR5cGUgb2YgUmVxdWVzdCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlci4uLgotICovCi1pbnQgd2lyZWxlc3NfcnRuZXRsaW5rX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSAgIGNoYXIgKgkJZGF0YSwKLQkJCSAgIGludAkJCWxlbikKLXsKLQlzdHJ1Y3QgaXdfZXZlbnQgKglyZXF1ZXN0ID0gKHN0cnVjdCBpd19ldmVudCAqKSBkYXRhOwotCWl3X2hhbmRsZXIJCWhhbmRsZXI7Ci0KLQkvKiBDaGVjayBsZW5ndGggKi8KLQlpZihsZW4gPCBJV19FVl9MQ1BfUEtfTEVOKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBSdE5ldGxpbmsgcmVxdWVzdCB0b28gc2hvcnQgKCVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUmVDaGVjayBsZW5ndGggKGxlbiBtYXkgaGF2ZSBwYWRkaW5nKSAqLwotCWlmKHJlcXVlc3QtPmxlbiA+IGxlbikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogUnROZXRsaW5rIHJlcXVlc3QgbGVuIGludmFsaWQgKCVkLSVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVxdWVzdC0+bGVuLCBsZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBPbmx5IGFjY2VwdCBTRVQgcmVxdWVzdHMgaW4gaGVyZSAqLwotCWlmKCFJV19JU19TRVQocmVxdWVzdC0+Y21kKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogQmFzaWMgY2hlY2sgKi8KLQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogTmV3IGRyaXZlciBBUEkgOiB0cnkgdG8gZmluZCB0aGUgaGFuZGxlciAqLwotCWhhbmRsZXIgPSBnZXRfaGFuZGxlcihkZXYsIHJlcXVlc3QtPmNtZCk7Ci0JaWYoaGFuZGxlciAhPSBOVUxMKSB7Ci0JCS8qIFN0YW5kYXJkIGFuZCBwcml2YXRlIGFyZSBub3QgdGhlIHNhbWUgKi8KLQkJaWYocmVxdWVzdC0+Y21kIDwgU0lPQ0lXRklSU1RQUklWKQotCQkJcmV0dXJuIHJ0bmV0bGlua19zdGFuZGFyZF9zZXQoZGV2LAotCQkJCQkJICAgICAgcmVxdWVzdCwKLQkJCQkJCSAgICAgIHJlcXVlc3QtPmxlbiwKLQkJCQkJCSAgICAgIGhhbmRsZXIpOwotCQllbHNlCi0JCQlyZXR1cm4gcnRuZXRsaW5rX3ByaXZhdGVfc2V0KGRldiwKLQkJCQkJCSAgICAgcmVxdWVzdCwKLQkJCQkJCSAgICAgcmVxdWVzdC0+bGVuLAotCQkJCQkJICAgICBoYW5kbGVyKTsKLQl9Ci0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0jZW5kaWYJLyogQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFVkVOVCBQUk9DRVNTSU5HICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUHJvY2VzcyBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSB3aXJlbGVzcyBsYXllciBvciB0aGUgZHJpdmVyLgotICogTW9zdCBvZnRlbiwgdGhlIGV2ZW50IHdpbGwgYmUgcHJvcGFnYXRlZCB0aHJvdWdoIHJ0bmV0bGluawotICovCi0KLSNpZmRlZiBXRV9FVkVOVF9SVE5FVExJTksKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBMb2NraW5nLi4uCi0gKiAtLS0tLS0tLS0tCi0gKgotICogVGhhbmtzIHRvIEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4gZm9yIGZpeGluZwotICogdGhlIGxvY2tpbmcgaXNzdWUgaW4gaGVyZSBhbmQgaW1wbGVtZW50aW5nIHRoaXMgY29kZSAhCi0gKgotICogVGhlIGlzc3VlIDogd2lyZWxlc3Nfc2VuZF9ldmVudCgpIGlzIG9mdGVuIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCwKLSAqIHdoaWxlIHRoZSBOZXRsaW5rIGxheWVyIGNhbiBuZXZlciBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCi0gKiBUaGUgZnVsbHkgZm9ybWVkIFJ0TmV0bGluayBldmVudHMgYXJlIHF1ZXVlZCwgYW5kIHRoZW4gYSB0YXNrbGV0IGlzIHJ1bgotICogdG8gZmVlZCB0aG9zZSB0byBOZXRsaW5rLgotICogVGhlIHNrYl9xdWV1ZSBpcyBpbnRlcnJ1cHQgc2FmZSwgYW5kIGl0cyBsb2NrIGlzIG5vdCBoZWxkIHdoaWxlIGNhbGxpbmcKLSAqIE5ldGxpbmssIHNvIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIGRlYWxvY2suCi0gKiBKZWFuIElJCi0gKi8KLQotc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgd2lyZWxlc3NfbmxldmVudF9xdWV1ZTsKLQotc3RhdGljIGludCBfX2luaXQgd2lyZWxlc3NfbmxldmVudF9pbml0KHZvaWQpCi17Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2lyZWxlc3NfbmxldmVudF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbCh3aXJlbGVzc19ubGV2ZW50X2luaXQpOwotCi1zdGF0aWMgdm9pZCB3aXJlbGVzc19ubGV2ZW50X3Byb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3aXJlbGVzc19ubGV2ZW50X3F1ZXVlKSkpCi0JCXJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9MSU5LLCBOVUxMLCBHRlBfQVRPTUlDKTsKLX0KLQotc3RhdGljIERFQ0xBUkVfVEFTS0xFVCh3aXJlbGVzc19ubGV2ZW50X3Rhc2tsZXQsIHdpcmVsZXNzX25sZXZlbnRfcHJvY2VzcywgMCk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBGaWxsIGEgcnRuZXRsaW5rIG1lc3NhZ2Ugd2l0aCBvdXIgZXZlbnQgZGF0YS4KLSAqIE5vdGUgdGhhdCB3ZSBwcm9wYWdlIG9ubHkgdGhlIHNwZWNpZmllZCBldmVudCBhbmQgZG9uJ3QgZHVtcCB0aGUKLSAqIGN1cnJlbnQgd2lyZWxlc3MgY29uZmlnLiBEdW1waW5nIHRoZSB3aXJlbGVzcyBjb25maWcgaXMgZmFyIHRvbwotICogZXhwZW5zaXZlIChmb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSBkcml2ZXIgbmVlZCB0byBxdWVyeSB0aGUgaGFyZHdhcmUpLgotICovCi1zdGF0aWMgaW5saW5lIGludCBydG5ldGxpbmtfZmlsbF9pd2luZm8oc3RydWN0IHNrX2J1ZmYgKglza2IsCi0JCQkJCXN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkJCQlpbnQJCQl0eXBlLAotCQkJCQljaGFyICoJCQlldmVudCwKLQkJCQkJaW50CQkJZXZlbnRfbGVuKQotewotCXN0cnVjdCBpZmluZm9tc2cgKnI7Ci0Jc3RydWN0IG5sbXNnaGRyICAqbmxoOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOwotCi0JbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgdHlwZSwgc2l6ZW9mKCpyKSk7Ci0JciA9IE5MTVNHX0RBVEEobmxoKTsKLQlyLT5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOwotCXItPl9faWZpX3BhZCA9IDA7Ci0Jci0+aWZpX3R5cGUgPSBkZXYtPnR5cGU7Ci0Jci0+aWZpX2luZGV4ID0gZGV2LT5pZmluZGV4OwotCXItPmlmaV9mbGFncyA9IGRldl9nZXRfZmxhZ3MoZGV2KTsKLQlyLT5pZmlfY2hhbmdlID0gMDsJLyogV2lyZWxlc3MgY2hhbmdlcyBkb24ndCBhZmZlY3QgdGhvc2UgZmxhZ3MgKi8KLQotCS8qIEFkZCB0aGUgd2lyZWxlc3MgZXZlbnRzIGluIHRoZSBuZXRsaW5rIHBhY2tldCAqLwotCVJUQV9QVVQoc2tiLCBJRkxBX1dJUkVMRVNTLCBldmVudF9sZW4sIGV2ZW50KTsKLQotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKLQlyZXR1cm4gc2tiLT5sZW47Ci0KLW5sbXNnX2ZhaWx1cmU6Ci1ydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIENyZWF0ZSBhbmQgYnJvYWRjYXN0IGFuZCBzZW5kIGl0IG9uIHRoZSBzdGFuZGFyZCBydG5ldGxpbmsgc29ja2V0Ci0gKiBUaGlzIGlzIGEgcHVyZSBjbG9uZSBydG1zZ19pZmluZm8oKSBpbiBuZXQvY29yZS9ydG5ldGxpbmsuYwotICogQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiBtYW5kYXRlZCB0aGF0IEkgdXNlZCBhIElGTEFfWFhYIGZpZWxkCi0gKiB3aXRoaW4gYSBSVE1fTkVXTElOSyBldmVudC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ0bXNnX2l3aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQljaGFyICoJCQlldmVudCwKLQkJCQlpbnQJCQlldmVudF9sZW4pCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgc2l6ZSA9IE5MTVNHX0dPT0RTSVpFOwotCi0Jc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICghc2tiKQotCQlyZXR1cm47Ci0KLQlpZiAocnRuZXRsaW5rX2ZpbGxfaXdpbmZvKHNrYiwgZGV2LCBSVE1fTkVXTElOSywKLQkJCQkgIGV2ZW50LCBldmVudF9sZW4pIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOwotCX0KLQlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gUlROTEdSUF9MSU5LOwotCXNrYl9xdWV1ZV90YWlsKCZ3aXJlbGVzc19ubGV2ZW50X3F1ZXVlLCBza2IpOwotCXRhc2tsZXRfc2NoZWR1bGUoJndpcmVsZXNzX25sZXZlbnRfdGFza2xldCk7Ci19Ci0KLSNlbmRpZgkvKiBXRV9FVkVOVF9SVE5FVExJTksgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIE1haW4gZXZlbnQgZGlzcGF0Y2hlci4gQ2FsbGVkIGZyb20gb3RoZXIgcGFydHMgYW5kIGRyaXZlcnMuCi0gKiBTZW5kIHRoZSBldmVudCBvbiB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbHMuCi0gKiBNYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCi0gKi8KLXZvaWQgd2lyZWxlc3Nfc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSB1bnNpZ25lZCBpbnQJCWNtZCwKLQkJCSB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKLQkJCSBjaGFyICoJCQlleHRyYSkKLXsKLQljb25zdCBzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24gKglkZXNjciA9IE5VTEw7Ci0JaW50IGV4dHJhX2xlbiA9IDA7Ci0Jc3RydWN0IGl3X2V2ZW50ICAqZXZlbnQ7CQkvKiBNYWxsb2NhdGVkIHdob2xlIGV2ZW50ICovCi0JaW50IGV2ZW50X2xlbjsJCQkJLyogSXRzIHNpemUgKi8KLQlpbnQgaGRyX2xlbjsJCQkJLyogU2l6ZSBvZiB0aGUgZXZlbnQgaGVhZGVyICovCi0JaW50IHdycXVfb2ZmID0gMDsJCQkvKiBPZmZzZXQgaW4gd3JxdSAqLwotCS8qIERvbid0ICJvcHRpbWlzZSIgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSwgaXQgd2lsbCBjcmFzaCAqLwotCXVuc2lnbmVkCWNtZF9pbmRleDsJCS8qICpNVVNUKiBiZSB1bnNpZ25lZCAqLwotCi0JLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRXZlbnQgKi8KLQlpZihjbWQgPD0gU0lPQ0lXTEFTVCkgewotCQljbWRfaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKLQkJaWYoY21kX2luZGV4IDwgc3RhbmRhcmRfaW9jdGxfbnVtKQotCQkJZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZF9pbmRleF0pOwotCX0gZWxzZSB7Ci0JCWNtZF9pbmRleCA9IGNtZCAtIElXRVZGSVJTVDsKLQkJaWYoY21kX2luZGV4IDwgc3RhbmRhcmRfZXZlbnRfbnVtKQotCQkJZGVzY3IgPSAmKHN0YW5kYXJkX2V2ZW50W2NtZF9pbmRleF0pOwotCX0KLQkvKiBEb24ndCBhY2NlcHQgdW5rbm93biBldmVudHMgKi8KLQlpZihkZXNjciA9PSBOVUxMKSB7Ci0JCS8qIE5vdGUgOiB3ZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGRyaXZlciwgYmVjYXVzZQotCQkgKiB0aGUgZHJpdmVyIHdvdWxkIG5vdCBrbm93IHdoYXQgdG8gZG8gYWJvdXQgaXQuIEl0IGNhbid0Ci0JCSAqIHJldHVybiBhbiBlcnJvciB0byB0aGUgdXNlciwgYmVjYXVzZSB0aGUgZXZlbnQgaXMgbm90Ci0JCSAqIGluaXRpYXRlZCBieSBhIHVzZXIgcmVxdWVzdC4KLQkJICogVGhlIGJlc3QgdGhlIGRyaXZlciBjb3VsZCBkbyBpcyB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZS4KLQkJICogV2Ugd2lsbCBkbyBpdCBvdXJzZWx2ZXMgaW5zdGVhZC4uLgotCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogSW52YWxpZC9Vbmtub3duIFdpcmVsZXNzIEV2ZW50ICgweCUwNFgpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOwotCQlyZXR1cm47Ci0JfQotI2lmZGVmIFdFX0VWRU5UX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBHb3QgZXZlbnQgMHglMDRYXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGNtZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBIZWFkZXIgdHlwZSA6ICVkLCBUb2tlbiB0eXBlIDogJWQsIHNpemUgOiAlZCwgdG9rZW4gOiAlZFxuIiwgZGV2LT5uYW1lLCBkZXNjci0+aGVhZGVyX3R5cGUsIGRlc2NyLT50b2tlbl90eXBlLCBkZXNjci0+dG9rZW5fc2l6ZSwgZGVzY3ItPm1heF90b2tlbnMpOwotI2VuZGlmCS8qIFdFX0VWRU5UX0RFQlVHICovCi0KLQkvKiBDaGVjayBleHRyYSBwYXJhbWV0ZXJzIGFuZCBzZXQgZXh0cmFfbGVuICovCi0JaWYoZGVzY3ItPmhlYWRlcl90eXBlID09IElXX0hFQURFUl9UWVBFX1BPSU5UKSB7Ci0JCS8qIENoZWNrIGlmIG51bWJlciBvZiB0b2tlbiBmaXRzIHdpdGhpbiBib3VuZHMgKi8KLQkJaWYod3JxdS0+ZGF0YS5sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIGJpZyAoJWQpXG4iLCBkZXYtPm5hbWUsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZih3cnF1LT5kYXRhLmxlbmd0aCA8IGRlc2NyLT5taW5fdG9rZW5zKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIChXRSkgOiBXaXJlbGVzcyBFdmVudCB0b28gc21hbGwgKCVkKVxuIiwgZGV2LT5uYW1lLCB3cnF1LT5kYXRhLmxlbmd0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogQ2FsY3VsYXRlIGV4dHJhX2xlbiAtIGV4dHJhIGlzIE5VTEwgZm9yIHJlc3RyaWN0ZWQgZXZlbnRzICovCi0JCWlmKGV4dHJhICE9IE5VTEwpCi0JCQlleHRyYV9sZW4gPSB3cnF1LT5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOwotCQkvKiBBbHdheXMgYXQgYW4gb2Zmc2V0IGluIHdycXUgKi8KLQkJd3JxdV9vZmYgPSBJV19FVl9QT0lOVF9PRkY7Ci0jaWZkZWYgV0VfRVZFTlRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBFdmVudCAweCUwNFgsIHRva2VucyAlZCwgZXh0cmFfbGVuICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgd3JxdS0+ZGF0YS5sZW5ndGgsIGV4dHJhX2xlbik7Ci0jZW5kaWYJLyogV0VfRVZFTlRfREVCVUcgKi8KLQl9Ci0KLQkvKiBUb3RhbCBsZW5ndGggb2YgdGhlIGV2ZW50ICovCi0JaGRyX2xlbiA9IGV2ZW50X3R5cGVfc2l6ZVtkZXNjci0+aGVhZGVyX3R5cGVdOwotCWV2ZW50X2xlbiA9IGhkcl9sZW4gKyBleHRyYV9sZW47Ci0KLSNpZmRlZiBXRV9FVkVOVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRXZlbnQgMHglMDRYLCBoZHJfbGVuICVkLCB3cnF1X29mZiAlZCwgZXZlbnRfbGVuICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgaGRyX2xlbiwgd3JxdV9vZmYsIGV2ZW50X2xlbik7Ci0jZW5kaWYJLyogV0VfRVZFTlRfREVCVUcgKi8KLQotCS8qIENyZWF0ZSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgdGhlIGV2ZW50ICovCi0JZXZlbnQgPSBrbWFsbG9jKGV2ZW50X2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYoZXZlbnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogRmlsbCBldmVudCAqLwotCWV2ZW50LT5sZW4gPSBldmVudF9sZW47Ci0JZXZlbnQtPmNtZCA9IGNtZDsKLQltZW1jcHkoJmV2ZW50LT51LCAoKGNoYXIgKikgd3JxdSkgKyB3cnF1X29mZiwgaGRyX2xlbiAtIElXX0VWX0xDUF9MRU4pOwotCWlmKGV4dHJhICE9IE5VTEwpCi0JCW1lbWNweSgoKGNoYXIgKikgZXZlbnQpICsgaGRyX2xlbiwgZXh0cmEsIGV4dHJhX2xlbik7Ci0KLSNpZmRlZiBXRV9FVkVOVF9SVE5FVExJTksKLQkvKiBTZW5kIHZpYSB0aGUgUnROZXRsaW5rIGV2ZW50IGNoYW5uZWwgKi8KLQlydG1zZ19pd2luZm8oZGV2LCAoY2hhciAqKSBldmVudCwgZXZlbnRfbGVuKTsKLSNlbmRpZgkvKiBXRV9FVkVOVF9SVE5FVExJTksgKi8KLQotCS8qIENsZWFudXAgKi8KLQlrZnJlZShldmVudCk7Ci0KLQlyZXR1cm47CQkvKiBBbHdheXMgc3VjY2VzcywgSSBndWVzcyA7LSkgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRU5IQU5DRUQgSVdTUFkgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEluIHRoZSBvbGQgZGF5cywgdGhlIGRyaXZlciB3YXMgaGFuZGxpbmcgc3B5IHN1cHBvcnQgYWxsIGJ5IGl0c2VsZi4KLSAqIE5vdywgdGhlIGRyaXZlciBjYW4gZGVsZWdhdGUgdGhpcyB0YXNrIHRvIFdpcmVsZXNzIEV4dGVuc2lvbnMuCi0gKiBJdCBuZWVkcyB0byB1c2UgdGhvc2Ugc3RhbmRhcmQgc3B5IGl3X2hhbmRsZXIgaW4gc3RydWN0IGl3X2hhbmRsZXJfZGVmLAotICogcHVzaCBkYXRhIHRvIHVzIHZpYSB3aXJlbGVzc19zcHlfdXBkYXRlKCkgYW5kIGluY2x1ZGUgc3RydWN0IGl3X3NweV9kYXRhCi0gKiBpbiBpdHMgcHJpdmF0ZSBwYXJ0IChhbmQgZXhwb3J0IGl0IGluIG5ldF9kZXZpY2UtPndpcmVsZXNzX2RhdGEtPnNweV9kYXRhKS4KLSAqIE9uZSBvZiB0aGUgbWFpbiBhZHZhbnRhZ2Ugb2YgY2VudHJhbGlzaW5nIHNweSBzdXBwb3J0IGhlcmUgaXMgdGhhdAotICogaXQgYmVjb21lcyBtdWNoIGVhc2llciB0byBpbXByb3ZlIGFuZCBleHRlbmQgaXQgd2l0aG91dCBoYXZpbmcgdG8gdG91Y2gKLSAqIHRoZSBkcml2ZXJzLiBPbmUgZXhhbXBsZSBpcyB0aGUgYWRkaXRpb24gb2YgdGhlIFNweS1UaHJlc2hvbGQgZXZlbnRzLgotICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIHNweSBkYXRhIGluIHRoZSBkcml2ZXIuCi0gKiBCZWNhdXNlIHRoaXMgaXMgY2FsbGVkIG9uIHRoZSBSeCBwYXRoIHZpYSB3aXJlbGVzc19zcHlfdXBkYXRlKCksCi0gKiB3ZSB3YW50IGl0IHRvIGJlIGVmZmljaWVudC4uLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpd19zcHlfZGF0YSAqIGdldF9zcHlkYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogVGhpcyBpcyB0aGUgbmV3IHdheSAqLwotCWlmKGRldi0+d2lyZWxlc3NfZGF0YSkKLQkJcmV0dXJuKGRldi0+d2lyZWxlc3NfZGF0YS0+c3B5X2RhdGEpOwotCXJldHVybiBOVUxMOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IHNldCBTcHkgTGlzdAotICovCi1pbnQgaXdfaGFuZGxlcl9zZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqCWluZm8sCi0JCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKLQkJICAgICAgIGNoYXIgKgkJCWV4dHJhKQotewotCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOwotCXN0cnVjdCBzb2NrYWRkciAqCWFkZHJlc3MgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwotCi0JLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KLQlpZighc3B5ZGF0YSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogRGlzYWJsZSBzcHkgY29sbGVjdGlvbiB3aGlsZSB3ZSBjb3B5IHRoZSBhZGRyZXNzZXMuCi0JICogV2hpbGUgd2UgY29weSBhZGRyZXNzZXMsIGFueSBjYWxsIHRvIHdpcmVsZXNzX3NweV91cGRhdGUoKQotCSAqIHdpbGwgTk9QLiBUaGlzIGlzIE9LLCBhcyBhbnl3YXkgdGhlIGFkZHJlc3NlcyBhcmUgY2hhbmdpbmcuICovCi0Jc3B5ZGF0YS0+c3B5X251bWJlciA9IDA7Ci0KLQkvKiBXZSB3YW50IHRvIG9wZXJhdGUgd2l0aG91dCBsb2NraW5nLCBiZWNhdXNlIHdpcmVsZXNzX3NweV91cGRhdGUoKQotCSAqIG1vc3QgbGlrZWx5IHdpbGwgaGFwcGVuIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYW5kIHRoZXJlZm9yZQotCSAqIGhhdmUgaXRzIG93biBsb2NraW5nIGNvbnN0cmFpbnRzIGFuZCBuZWVkcyBwZXJmb3JtYW5jZS4KLQkgKiBUaGUgcnRubF9sb2NrKCkgbWFrZSBzdXJlIHdlIGRvbid0IHJhY2Ugd2l0aCB0aGUgb3RoZXIgaXdfaGFuZGxlcnMuCi0JICogVGhpcyBtYWtlIHN1cmUgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpICJzZWUiIHRoYXQgdGhlIHNweSBsaXN0Ci0JICogaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQuICovCi0Jc21wX3dtYigpOwotCi0JLyogQXJlIHRoZXJlIGFyZSBhZGRyZXNzZXMgdG8gY29weT8gKi8KLQlpZih3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKLQkJaW50IGk7Ci0KLQkJLyogQ29weSBhZGRyZXNzZXMgKi8KLQkJZm9yKGkgPSAwOyBpIDwgd3JxdS0+ZGF0YS5sZW5ndGg7IGkrKykKLQkJCW1lbWNweShzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLAotCQkJICAgICAgIEVUSF9BTEVOKTsKLQkJLyogUmVzZXQgc3RhdHMgKi8KLQkJbWVtc2V0KHNweWRhdGEtPnNweV9zdGF0LCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9TUFkpOwotCi0jaWZkZWYgV0VfU1BZX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJpd19oYW5kbGVyX3NldF9zcHkoKSA6ICB3aXJlbGVzc19kYXRhICVwLCBzcHlkYXRhICVwLCBudW0gJWRcbiIsIGRldi0+d2lyZWxlc3NfZGF0YSwgc3B5ZGF0YSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwotCQlmb3IgKGkgPSAwOyBpIDwgd3JxdS0+ZGF0YS5sZW5ndGg7IGkrKykKLQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkgICAgICAgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIFxuIiwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVswXSwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVsxXSwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVsyXSwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVszXSwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVs0XSwKLQkJCSAgICAgICBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXVs1XSk7Ci0jZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCi0JfQotCi0JLyogTWFrZSBzdXJlIGFib3ZlIGlzIHVwZGF0ZWQgYmVmb3JlIHJlLWVuYWJsaW5nICovCi0Jc21wX3dtYigpOwotCi0JLyogRW5hYmxlIGFkZHJlc3NlcyAqLwotCXNweWRhdGEtPnNweV9udW1iZXIgPSB3cnF1LT5kYXRhLmxlbmd0aDsKLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IGdldCBTcHkgTGlzdAotICovCi1pbnQgaXdfaGFuZGxlcl9nZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqCWluZm8sCi0JCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKLQkJICAgICAgIGNoYXIgKgkJCWV4dHJhKQotewotCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOwotCXN0cnVjdCBzb2NrYWRkciAqCWFkZHJlc3MgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwotCWludAkJCWk7Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLwotCWlmKCFzcHlkYXRhKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQl3cnF1LT5kYXRhLmxlbmd0aCA9IHNweWRhdGEtPnNweV9udW1iZXI7Ci0KLQkvKiBDb3B5IGFkZHJlc3Nlcy4gKi8KLQlmb3IoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspIAl7Ci0JCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIHNweWRhdGEtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTik7Ci0JCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQUZfVU5JWDsKLQl9Ci0JLyogQ29weSBzdGF0cyB0byB0aGUgdXNlciBidWZmZXIgKGp1c3QgYWZ0ZXIpLiAqLwotCWlmKHNweWRhdGEtPnNweV9udW1iZXIgPiAwKQotCQltZW1jcHkoZXh0cmEgICsgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICpzcHlkYXRhLT5zcHlfbnVtYmVyKSwKLQkJICAgICAgIHNweWRhdGEtPnNweV9zdGF0LAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIHNweWRhdGEtPnNweV9udW1iZXIpOwotCS8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MuICovCi0JZm9yKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQotCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzcHkgdGhyZXNob2xkCi0gKi8KLWludCBpd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAotCQkJICBjaGFyICoJCWV4dHJhKQotewotCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOwotCXN0cnVjdCBpd190aHJzcHkgKgl0aHJlc2hvbGQgPSAoc3RydWN0IGl3X3RocnNweSAqKSBleHRyYTsKLQotCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCi0JaWYoIXNweWRhdGEpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIEp1c3QgZG8gaXQgKi8KLQltZW1jcHkoJihzcHlkYXRhLT5zcHlfdGhyX2xvdyksICYodGhyZXNob2xkLT5sb3cpLAotCSAgICAgICAyICogc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7Ci0KLQkvKiBDbGVhciBmbGFnICovCi0JbWVtc2V0KHNweWRhdGEtPnNweV90aHJfdW5kZXIsICdcMCcsIHNpemVvZihzcHlkYXRhLT5zcHlfdGhyX3VuZGVyKSk7Ci0KLSNpZmRlZiBXRV9TUFlfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiaXdfaGFuZGxlcl9zZXRfdGhyc3B5KCkgOiAgbG93ICVkIDsgaGlnaCAlZFxuIiwgc3B5ZGF0YS0+c3B5X3Rocl9sb3cubGV2ZWwsIHNweWRhdGEtPnNweV90aHJfaGlnaC5sZXZlbCk7Ci0jZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgc3B5IHRocmVzaG9sZAotICovCi1pbnQgaXdfaGFuZGxlcl9nZXRfdGhyc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKLQkJCSAgY2hhciAqCQlleHRyYSkKLXsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKLQlzdHJ1Y3QgaXdfdGhyc3B5ICoJdGhyZXNob2xkID0gKHN0cnVjdCBpd190aHJzcHkgKikgZXh0cmE7Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLwotCWlmKCFzcHlkYXRhKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBKdXN0IGRvIGl0ICovCi0JbWVtY3B5KCYodGhyZXNob2xkLT5sb3cpLCAmKHNweWRhdGEtPnNweV90aHJfbG93KSwKLQkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiBQcmVwYXJlIGFuZCBzZW5kIGEgU3B5IFRocmVzaG9sZCBldmVudAotICovCi1zdGF0aWMgdm9pZCBpd19zZW5kX3RocnNweV9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkgc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSwKLQkJCQkgdW5zaWduZWQgY2hhciAqCWFkZHJlc3MsCi0JCQkJIHN0cnVjdCBpd19xdWFsaXR5ICoJd3N0YXRzKQotewotCXVuaW9uIGl3cmVxX2RhdGEJd3JxdTsKLQlzdHJ1Y3QgaXdfdGhyc3B5CXRocmVzaG9sZDsKLQotCS8qIEluaXQgKi8KLQl3cnF1LmRhdGEubGVuZ3RoID0gMTsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCS8qIENvcHkgYWRkcmVzcyAqLwotCW1lbWNweSh0aHJlc2hvbGQuYWRkci5zYV9kYXRhLCBhZGRyZXNzLCBFVEhfQUxFTik7Ci0JdGhyZXNob2xkLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCS8qIENvcHkgc3RhdHMgKi8KLQltZW1jcHkoJih0aHJlc2hvbGQucXVhbCksIHdzdGF0cywgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7Ci0JLyogQ29weSBhbHNvIHRocmVzaG9sZHMgKi8KLQltZW1jcHkoJih0aHJlc2hvbGQubG93KSwgJihzcHlkYXRhLT5zcHlfdGhyX2xvdyksCi0JICAgICAgIDIgKiBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKLQotI2lmZGVmIFdFX1NQWV9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJpd19zZW5kX3RocnNweV9ldmVudCgpIDogYWRkcmVzcyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCwgbGV2ZWwgJWQsIHVwID0gJWRcbiIsCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbMF0sCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbMV0sCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbMl0sCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbM10sCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbNF0sCi0JICAgICAgIHRocmVzaG9sZC5hZGRyLnNhX2RhdGFbNV0sIHRocmVzaG9sZC5xdWFsLmxldmVsKTsKLSNlbmRpZgkvKiBXRV9TUFlfREVCVUcgKi8KLQotCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLwotCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXVEhSU1BZLCAmd3JxdSwgKGNoYXIgKikgJnRocmVzaG9sZCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBDYWxsIGZvciB0aGUgZHJpdmVyIHRvIHVwZGF0ZSB0aGUgc3B5IGRhdGEuCi0gKiBGb3Igbm93LCB0aGUgc3B5IGRhdGEgaXMgYSBzaW1wbGUgYXJyYXkuIEFzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBpcwotICogc21hbGwsIHRoaXMgaXMgZ29vZCBlbm91Z2guIElmIHdlIHdhbnRlZCB0byBzdXBwb3J0IGxhcmdlciBudW1iZXIgb2YKLSAqIHNweSBhZGRyZXNzZXMsIHdlIHNob3VsZCB1c2Ugc29tZXRoaW5nIG1vcmUgZWZmaWNpZW50Li4uCi0gKi8KLXZvaWQgd2lyZWxlc3Nfc3B5X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSB1bnNpZ25lZCBjaGFyICoJYWRkcmVzcywKLQkJCSBzdHJ1Y3QgaXdfcXVhbGl0eSAqCXdzdGF0cykKLXsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKLQlpbnQJCQlpOwotCWludAkJCW1hdGNoID0gLTE7Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLwotCWlmKCFzcHlkYXRhKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBXRV9TUFlfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3Nfc3B5X3VwZGF0ZSgpIDogIHdpcmVsZXNzX2RhdGEgJXAsIHNweWRhdGEgJXAsIGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsIGRldi0+d2lyZWxlc3NfZGF0YSwgc3B5ZGF0YSwgYWRkcmVzc1swXSwgYWRkcmVzc1sxXSwgYWRkcmVzc1syXSwgYWRkcmVzc1szXSwgYWRkcmVzc1s0XSwgYWRkcmVzc1s1XSk7Ci0jZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCi0KLQkvKiBVcGRhdGUgYWxsIHJlY29yZHMgdGhhdCBtYXRjaCAqLwotCWZvcihpID0gMDsgaSA8IHNweWRhdGEtPnNweV9udW1iZXI7IGkrKykKLQkJaWYoIWNvbXBhcmVfZXRoZXJfYWRkcihhZGRyZXNzLCBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSkpIHsKLQkJCW1lbWNweSgmKHNweWRhdGEtPnNweV9zdGF0W2ldKSwgd3N0YXRzLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwotCQkJbWF0Y2ggPSBpOwotCQl9Ci0KLQkvKiBHZW5lcmF0ZSBhbiBldmVudCBpZiB3ZSBjcm9zcyB0aGUgc3B5IHRocmVzaG9sZC4KLQkgKiBUbyBhdm9pZCBldmVudCBzdG9ybXMsIHdlIGhhdmUgYSBzaW1wbGUgaHlzdGVyZXNpcyA6IHdlIGdlbmVyYXRlCi0JICogZXZlbnQgb25seSB3aGVuIHdlIGdvIHVuZGVyIHRoZSBsb3cgdGhyZXNob2xkIG9yIGFib3ZlIHRoZQotCSAqIGhpZ2ggdGhyZXNob2xkLiAqLwotCWlmKG1hdGNoID49IDApIHsKLQkJaWYoc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0pIHsKLQkJCWlmKHdzdGF0cy0+bGV2ZWwgPiBzcHlkYXRhLT5zcHlfdGhyX2hpZ2gubGV2ZWwpIHsKLQkJCQlzcHlkYXRhLT5zcHlfdGhyX3VuZGVyW21hdGNoXSA9IDA7Ci0JCQkJaXdfc2VuZF90aHJzcHlfZXZlbnQoZGV2LCBzcHlkYXRhLAotCQkJCQkJICAgICBhZGRyZXNzLCB3c3RhdHMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYod3N0YXRzLT5sZXZlbCA8IHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsKSB7Ci0JCQkJc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0gPSAxOwotCQkJCWl3X3NlbmRfdGhyc3B5X2V2ZW50KGRldiwgc3B5ZGF0YSwKLQkJCQkJCSAgICAgYWRkcmVzcywgd3N0YXRzKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF9zcHkpOwotRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF90aHJzcHkpOwotRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX3NldF9zcHkpOwotRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX3NldF90aHJzcHkpOwotRVhQT1JUX1NZTUJPTCh3aXJlbGVzc19zZW5kX2V2ZW50KTsKLUVYUE9SVF9TWU1CT0wod2lyZWxlc3Nfc3B5X3VwZGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuYyBiL25ldC9kY2NwL2Fja3ZlYy5jCmluZGV4IGEwODZjNjMuLjAxMDMwZjMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5jCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogCWlmIChhdiAhPSBOVUxMKSB7CiAJCWF2LT5kY2NwYXZfYnVmX2hlYWQJPSBEQ0NQX01BWF9BQ0tWRUNfTEVOIC0gMTsKLQkJYXYtPmRjY3Bhdl9idWZfYWNrbm8JPSBEQ0NQX01BWF9TRVFOTyArIDE7CisJCWF2LT5kY2NwYXZfYnVmX2Fja25vCT0gVUlOVDQ4X01BWCArIDE7CiAJCWF2LT5kY2NwYXZfYnVmX25vbmNlID0gYXYtPmRjY3Bhdl9idWZfbm9uY2UgPSAwOwogCQlhdi0+ZGNjcGF2X3RpbWUudHZfc2VjCT0gMDsKIAkJYXYtPmRjY3Bhdl90aW1lLnR2X3VzZWMJPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKaW5kZXggNzQ2Zjc5ZC4uZDdkOWNlNyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCkBAIC0zMyw3ICszMyw2IEBACiAgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwotCiAjaW5jbHVkZSAiLi4vY2NpZC5oIgogI2luY2x1ZGUgIi4uL2RjY3AuaCIKICNpbmNsdWRlICJsaWIvcGFja2V0X2hpc3RvcnkuaCIKQEAgLTUyLDYgKzUxLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpjY2lkM19yeF9oaXN0Owogc3RhdGljIHN0cnVjdCBkY2NwX2xpX2hpc3QgKmNjaWQzX2xpX2hpc3Q7CiAKKy8qCisgKglUcmFuc21pdHRlciBIYWxmLUNvbm5lY3Rpb24gUm91dGluZXMKKyAqLwogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciAqY2NpZDNfdHhfc3RhdGVfbmFtZShlbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyBzdGF0ZSkKIHsKQEAgLTgwLDIzICs4MiwzNyBAQAogfQogCiAvKgotICogUmVjYWxjdWxhdGUgc2NoZWR1bGVkIG5vbWluYWwgc2VuZCB0aW1lIHRfbm9tLCBpbnRlci1wYWNrZXQgaW50ZXJ2YWwKLSAqIHRfaXBpLCBhbmQgZGVsdGEgdmFsdWUuIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UgdG8gWC4KKyAqIENvbXB1dGUgdGhlIGluaXRpYWwgc2VuZGluZyByYXRlIFhfaW5pdCBhY2NvcmRpbmcgdG8gUkZDIDMzOTA6CisgKgl3X2luaXQgICA9ICAgIG1pbig0ICogTVNTLCBtYXgoMiAqIE1TUywgNDM4MCBieXRlcykpCisgKglYX2luaXQgICA9ICAgIHdfaW5pdCAvIFJUVAorICogRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUsIFhfaW5pdCBpcyBzY2FsZWQgYnkgMl42LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfdXBkYXRlX3NlbmRfdGltZShzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCkKK3N0YXRpYyBpbmxpbmUgdTY0IHJmYzMzOTBfaW5pdGlhbF9yYXRlKHN0cnVjdCBzb2NrICpzaykKIHsKLQl0aW1ldmFsX3N1Yl91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOworCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJY29uc3QgX191MzIgd19pbml0ID0gbWluKDQgKiBkcC0+ZGNjcHNfbXNzX2NhY2hlLAorCQkJCSBtYXgoMiAqIGRwLT5kY2Nwc19tc3NfY2FjaGUsIDQzODBVKSk7CiAKKwlyZXR1cm4gc2NhbGVkX2Rpdih3X2luaXQgPDwgNiwgY2NpZDNfaGNfdHhfc2soc2spLT5jY2lkM2hjdHhfcnR0KTsKK30KKworLyoKKyAqIFJlY2FsY3VsYXRlIHRfaXBpIGFuZCBkZWx0YSAoc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBYIGNoYW5nZXMpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjY2lkM191cGRhdGVfc2VuZF9pbnRlcnZhbChzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCkKK3sKIAkvKiBDYWxjdWxhdGUgbmV3IHRfaXBpID0gcyAvIFhfaW5zdCAoWF9pbnN0IGlzIGluIDY0ICogYnl0ZXMvc2Vjb25kKSAqLwotCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IHNjYWxlZF9kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCSAgIGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpOwotCi0JLyogVXBkYXRlIG5vbWluYWwgc2VuZCB0aW1lIHdpdGggcmVnYXJkIHRvIHRoZSBuZXcgdF9pcGkgKi8KLQl0aW1ldmFsX2FkZF91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOworCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IHNjYWxlZF9kaXYzMigoKHU2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNiwKKwkJCQkJICAgICBoY3R4LT5jY2lkM2hjdHhfeCk7CiAKIAkvKiBDYWxjdWxhdGUgbmV3IGRlbHRhIGJ5IGRlbHRhID0gbWluKHRfaXBpIC8gMiwgdF9ncmFuIC8gMikgKi8KIAloY3R4LT5jY2lkM2hjdHhfZGVsdGEgPSBtaW5fdCh1MzIsIGhjdHgtPmNjaWQzaGN0eF90X2lwaSAvIDIsCiAJCQkJCSAgIFRGUkNfT1BTWVNfSEFMRl9USU1FX0dSQU4pOworCisJY2NpZDNfcHJfZGVidWcoInRfaXBpPSV1LCBkZWx0YT0ldSwgcz0ldSwgWD0ldVxuIiwKKwkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF90X2lwaSwgaGN0eC0+Y2NpZDNoY3R4X2RlbHRhLAorCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3MsICh1bnNpZ25lZCkoaGN0eC0+Y2NpZDNoY3R4X3ggPj4gNikpOworCiB9CiAvKgogICogVXBkYXRlIFggYnkKQEAgLTExMiwxOSArMTI4LDI4IEBACiAgKiAgICAgICBmaW5lLWdyYWluZWQgcmVzb2x1dGlvbiBvZiBzZW5kaW5nIHJhdGVzLiBUaGlzIHJlcXVpcmVzIHNjYWxpbmcgYnkgMl42CiAgKiAgICAgICB0aHJvdWdob3V0IHRoZSBjb2RlLiBPbmx5IFhfY2FsYyBpcyB1bnNjYWxlZCAoaW4gYnl0ZXMvc2Vjb25kKS4KICAqCi0gKiBJZiBYIGhhcyBjaGFuZ2VkLCB3ZSBhbHNvIHVwZGF0ZSB0aGUgc2NoZWR1bGVkIHNlbmQgdGltZSB0X25vdywKLSAqIHRoZSBpbnRlci1wYWNrZXQgaW50ZXJ2YWwgdF9pcGksIGFuZCB0aGUgZGVsdGEgdmFsdWUuCiAgKi8KIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV94KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKm5vdykKIAogewogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCV9fdTY0IG1pbl9yYXRlID0gMiAqIGhjdHgtPmNjaWQzaGN0eF94X3JlY3Y7CiAJY29uc3QgIF9fdTY0IG9sZF94ID0gaGN0eC0+Y2NpZDNoY3R4X3g7CiAKKwkvKgorCSAqIEhhbmRsZSBJRExFIHBlcmlvZHM6IGRvIG5vdCByZWR1Y2UgYmVsb3cgUkZDMzM5MCBpbml0aWFsIHNlbmRpbmcgcmF0ZQorCSAqIHdoZW4gaWRsaW5nIFtSRkMgNDM0MiwgNS4xXS4gU2VlIGFsc28gZHJhZnQtaWV0Zi1kY2NwLXJmYzM0NDhiaXMuCisJICogRm9yIGNvbnNpc3RlbmN5IHdpdGggWCBhbmQgWF9yZWN2LCBtaW5fcmF0ZSBpcyBhbHNvIHNjYWxlZCBieSAyXjYuCisJICovCisJaWYgKHVubGlrZWx5KGhjdHgtPmNjaWQzaGN0eF9pZGxlKSkgeworCQltaW5fcmF0ZSA9IHJmYzMzOTBfaW5pdGlhbF9yYXRlKHNrKTsKKwkJbWluX3JhdGUgPSBtYXgobWluX3JhdGUsIDIgKiBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2KTsKKwl9CisKIAlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPiAwKSB7CiAKIAkJaGN0eC0+Y2NpZDNoY3R4X3ggPSBtaW4oKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfeF9jYWxjKSA8PCA2LAotCQkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ICogMik7CisJCQkJCW1pbl9yYXRlKTsKIAkJaGN0eC0+Y2NpZDNoY3R4X3ggPSBtYXgoaGN0eC0+Y2NpZDNoY3R4X3gsCiAJCQkJCSgoKF9fdTY0KWhjdHgtPmNjaWQzaGN0eF9zKSA8PCA2KSAvCiAJCQkJCQkJCVRGUkNfVF9NQkkpOwpAQCAtMTMzLDE0ICsxNTgsMjEgQEAKIAkJCShzdXNlY29uZHNfdCloY3R4LT5jY2lkM2hjdHhfcnR0ID49IDApIHsKIAogCQloY3R4LT5jY2lkM2hjdHhfeCA9Ci0JCQltYXgoMiAqIG1pbihoY3R4LT5jY2lkM2hjdHhfeCwgaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiksCisJCQltYXgobWluKDIgKiBoY3R4LT5jY2lkM2hjdHhfeCwgbWluX3JhdGUpLAogCQkJICAgIHNjYWxlZF9kaXYoKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNiwKIAkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3J0dCkpOwogCQloY3R4LT5jY2lkM2hjdHhfdF9sZCA9ICpub3c7CiAJfQogCi0JaWYgKGhjdHgtPmNjaWQzaGN0eF94ICE9IG9sZF94KQotCQljY2lkM191cGRhdGVfc2VuZF90aW1lKGhjdHgpOworCWlmIChoY3R4LT5jY2lkM2hjdHhfeCAhPSBvbGRfeCkgeworCQljY2lkM19wcl9kZWJ1ZygiWF9wcmV2PSV1LCBYX25vdz0ldSwgWF9jYWxjPSV1LCAiCisJCQkgICAgICAgIlhfcmVjdj0ldVxuIiwgKHVuc2lnbmVkKShvbGRfeCA+PiA2KSwKKwkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpLAorCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF94X2NhbGMsCisJCQkgICAgICAgKHVuc2lnbmVkKShoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID4+IDYpKTsKKworCQljY2lkM191cGRhdGVfc2VuZF9pbnRlcnZhbChoY3R4KTsKKwl9CiB9CiAKIC8qCkBAIC0xNDksMTcgKzE4MSwxMiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfaGNfdHhfdXBkYXRlX3Moc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgsIGludCBsZW4pCiB7Ci0JaWYgKHVubGlrZWx5KGxlbiA9PSAwKSkKLQkJY2NpZDNfcHJfZGVidWcoIlBhY2tldCBwYXlsb2FkIGxlbmd0aCBpcyAwIC0gbm90IHVwZGF0aW5nXG4iKTsKLQllbHNlCi0JCWhjdHgtPmNjaWQzaGN0eF9zID0gaGN0eC0+Y2NpZDNoY3R4X3MgPT0gMCA/IGxlbiA6Ci0JCQkJICAgICg5ICogaGN0eC0+Y2NpZDNoY3R4X3MgKyBsZW4pIC8gMTA7Ci0JLyoKLQkgKiBOb3RlOiBXZSBjb3VsZCBkbyBhIHBvdGVudGlhbCBvcHRpbWlzYXRpb24gaGVyZSAtIHdoZW4gYHMnIGNoYW5nZXMsCi0JICoJIHJlY2FsY3VsYXRlIHNlbmRpbmcgcmF0ZSBhbmQgY29uc2VxdWVudGx5IHRfaXBpLCB0X2RlbHRhLCBhbmQKLQkgKgkgdF9ub3cuIFRoaXMgaXMgaG93ZXZlciBub24tc3RhbmRhcmQsIGFuZCB0aGUgYmVuZWZpdHMgYXJlIG5vdAotCSAqCSBjbGVhciwgc28gaXQgaXMgY3VycmVudGx5IGxlZnQgb3V0LgotCSAqLworCWNvbnN0IHUxNiBvbGRfcyA9IGhjdHgtPmNjaWQzaGN0eF9zOworCisJaGN0eC0+Y2NpZDNoY3R4X3MgPSBvbGRfcyA9PSAwID8gbGVuIDogKDkgKiBvbGRfcyArIGxlbikgLyAxMDsKKworCWlmIChoY3R4LT5jY2lkM2hjdHhfcyAhPSBvbGRfcykKKwkJY2NpZDNfdXBkYXRlX3NlbmRfaW50ZXJ2YWwoaGN0eCk7CiB9CiAKIC8qCkBAIC0xOTMsNiArMjIwLDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1bnNpZ25lZCBsb25nIHRfbmZiID0gVVNFQ19QRVJfU0VDIC8gNTsKIAogCWJoX2xvY2tfc29jayhzayk7CkBAIC0yMDUsNiArMjMzLDggQEAKIAljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSAtIGVudHJ5IFxuIiwgZGNjcF9yb2xlKHNrKSwgc2ssCiAJCSAgICAgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkpOwogCisJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAxOworCiAJc3dpdGNoIChoY3R4LT5jY2lkM2hjdHhfc3RhdGUpIHsKIAljYXNlIFRGUkNfU1NUQVRFX05PX0ZCQUNLOgogCQkvKiBSRkMgMzQ0OCwgNC40OiBIYWx2ZSBzZW5kIHJhdGUgZGlyZWN0bHkgKi8KQEAgLTIxOSw1MyArMjQ5LDM3IEBACiAJCS8qIFRoZSB2YWx1ZSBvZiBSIGlzIHN0aWxsIHVuZGVmaW5lZCBhbmQgc28gd2UgY2FuIG5vdCByZWNvbXB1dGUKIAkJICogdGhlIHRpbW91dCB2YWx1ZS4gS2VlcCBpbml0aWFsIHZhbHVlIGFzIHBlciBbUkZDIDQzNDIsIDVdLiAqLwogCQl0X25mYiA9IFRGUkNfSU5JVElBTF9USU1FT1VUOwotCQljY2lkM191cGRhdGVfc2VuZF90aW1lKGhjdHgpOworCQljY2lkM191cGRhdGVfc2VuZF9pbnRlcnZhbChoY3R4KTsKIAkJYnJlYWs7CiAJY2FzZSBURlJDX1NTVEFURV9GQkFDSzoKIAkJLyoKLQkJICogQ2hlY2sgaWYgSURMRSBzaW5jZSBsYXN0IHRpbWVvdXQgYW5kIHJlY3YgcmF0ZSBpcyBsZXNzIHRoYW4KLQkJICogNCBwYWNrZXRzIChpbiB1bml0cyBvZiA2NCpieXRlcy9zZWMpIHBlciBSVFQKKwkJICogIE1vZGlmeSB0aGUgY2FjaGVkIHZhbHVlIG9mIFhfcmVjdiBbUkZDIDM0NDgsIDQuNF0KKwkJICoKKwkJICogIElmIChwID09IDAgfHwgWF9jYWxjID4gMiAqIFhfcmVjdikKKwkJICogICAgWF9yZWN2ID0gbWF4KFhfcmVjdiAvIDIsIHMgLyAoMiAqIHRfbWJpKSk7CisJCSAqICBFbHNlCisJCSAqICAgIFhfcmVjdiA9IFhfY2FsYyAvIDQ7CisJCSAqCisJCSAqICBOb3RlIHRoYXQgWF9yZWN2IGlzIHNjYWxlZCBieSAyXjYgd2hpbGUgWF9jYWxjIGlzIG5vdAogCQkgKi8KLQkJaWYgKCFoY3R4LT5jY2lkM2hjdHhfaWRsZSB8fAotCQkgICAgKGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPj0gNCAqCi0JCSAgICAgc2NhbGVkX2RpdigoKF9fdTY0KWhjdHgtPmNjaWQzaGN0eF9zKSA8PCA2LAotCQkJCWhjdHgtPmNjaWQzaGN0eF9ydHQpKSkgewotCQkJc3RydWN0IHRpbWV2YWwgbm93OworCQlCVUdfT04oaGN0eC0+Y2NpZDNoY3R4X3AgJiYgIWhjdHgtPmNjaWQzaGN0eF94X2NhbGMpOwogCi0JCQljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSwgbm90IGlkbGVcbiIsCi0JCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAotCQkJCSAgIGNjaWQzX3R4X3N0YXRlX25hbWUoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSk7CisJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA9PSAwIHx8CisJCSAgICAoaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyA+IChoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID4+IDUpKSkgewogCi0JCQkvKgotCQkJICogIE1vZGlmeSB0aGUgY2FjaGVkIHZhbHVlIG9mIFhfcmVjdiBbUkZDIDM0NDgsIDQuNF0KLQkJCSAqCi0JCQkgKiAgSWYgKHAgPT0gMCB8fCBYX2NhbGMgPiAyICogWF9yZWN2KQotCQkJICogICAgWF9yZWN2ID0gbWF4KFhfcmVjdiAvIDIsIHMgLyAoMiAqIHRfbWJpKSk7Ci0JCQkgKiAgRWxzZQotCQkJICogICAgWF9yZWN2ID0gWF9jYWxjIC8gNDsKLQkJCSAqCi0JCQkgKiAgTm90ZSB0aGF0IFhfcmVjdiBpcyBzY2FsZWQgYnkgMl42IHdoaWxlIFhfY2FsYyBpcyBub3QKLQkJCSAqLwotCQkJQlVHX09OKGhjdHgtPmNjaWQzaGN0eF9wICYmICFoY3R4LT5jY2lkM2hjdHhfeF9jYWxjKTsKKwkJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPQorCQkJCW1heChoY3R4LT5jY2lkM2hjdHhfeF9yZWN2IC8gMiwKKwkJCQkgICAgKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYpIC8KKwkJCQkJCQkgICAgICAoMiAqIFRGUkNfVF9NQkkpKTsKIAotCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wICA9PSAwIHx8Ci0JCQkgICAgKGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPgotCQkJICAgICAoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PiA1KSkpIHsKLQotCQkJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPQotCQkJCQltYXgoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiAvIDIsCi0JCQkJCSAgICAoKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNikgLwotCQkJCQkJCSAgKDIgKiBURlJDX1RfTUJJKSk7Ci0KLQkJCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPT0gMCkKLQkJCQkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwotCQkJfSBlbHNlIHsKLQkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0gaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYzsKLQkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2IDw8PSA0OwotCQkJfQotCQkJLyogTm93IHJlY2FsY3VsYXRlIFggW1JGQyAzNDQ4LCA0LjMsIHN0ZXAgKDQpXSAqLwotCQkJY2NpZDNfaGNfdHhfdXBkYXRlX3goc2ssICZub3cpOworCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wID09IDApCisJCQkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCQl9IGVsc2UgeworCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IGhjdHgtPmNjaWQzaGN0eF94X2NhbGM7CisJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2IDw8PSA0OwogCQl9CisJCS8qIE5vdyByZWNhbGN1bGF0ZSBYIFtSRkMgMzQ0OCwgNC4zLCBzdGVwICg0KV0gKi8KKwkJY2NpZDNfaGNfdHhfdXBkYXRlX3goc2ssICZub3cpOwogCQkvKgogCQkgKiBTY2hlZHVsZSBubyBmZWVkYmFjayB0aW1lciB0byBleHBpcmUgaW4KIAkJICogbWF4KHRfUlRPLCAyICogcy9YKSAgPSAgbWF4KHRfUlRPLCAyICogdF9pcGkpCkBAIC0yODAsOCArMjk0LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAxOwotCiByZXN0YXJ0X3RpbWVyOgogCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAogCQkJICAgamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXModF9uZmIpKTsKQEAgLTMyMiwyNCArMzM0LDM1IEBACiAJCQkJdXNlY3NfdG9famlmZmllcyhURlJDX0lOSVRJQUxfVElNRU9VVCkpKTsKIAkJaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50CSA9IDA7CiAJCWhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50ID0gbm93OwotCQljY2lkM19oY190eF9zZXRfc3RhdGUoc2ssIFRGUkNfU1NUQVRFX05PX0ZCQUNLKTsKLQotCQkvKiBTZXQgaW5pdGlhbCBzZW5kaW5nIHJhdGUgWC9zIHRvIDFwcHMgKFggaXMgc2NhbGVkIGJ5IDJeNikgKi8KLQkJY2NpZDNfaGNfdHhfdXBkYXRlX3MoaGN0eCwgc2tiLT5sZW4pOwotCQloY3R4LT5jY2lkM2hjdHhfeCA9IGhjdHgtPmNjaWQzaGN0eF9zOwotCQloY3R4LT5jY2lkM2hjdHhfeCA8PD0gNjsKLQotCQkvKiBGaXJzdCB0aW1lb3V0LCBhY2NvcmRpbmcgdG8gW1JGQyAzNDQ4LCA0LjJdLCBpcyAxIHNlY29uZCAqLwotCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBVU0VDX1BFUl9TRUM7Ci0JCS8qIEluaXRpYWwgZGVsdGE6IG1pbmltdW0gb2YgMC41IHNlYyBhbmQgdF9ncmFuLzIgKi8KLQkJaGN0eC0+Y2NpZDNoY3R4X2RlbHRhID0gVEZSQ19PUFNZU19IQUxGX1RJTUVfR1JBTjsKIAogCQkvKiBTZXQgdF8wIGZvciBpbml0aWFsIHBhY2tldCAqLwogCQloY3R4LT5jY2lkM2hjdHhfdF9ub20gPSBub3c7CisKKwkJaGN0eC0+Y2NpZDNoY3R4X3MgPSBza2ItPmxlbjsKKworCQkvKgorCQkgKiBVc2UgaW5pdGlhbCBSVFQgc2FtcGxlIHdoZW4gYXZhaWxhYmxlOiByZWNvbW1lbmRlZCBieSBlcnJhdHVtCisJCSAqIHRvIFJGQyA0MzQyLiBUaGlzIGltcGxlbWVudHMgdGhlIGluaXRpYWxpc2F0aW9uIHByb2NlZHVyZSBvZgorCQkgKiBkcmFmdCByZmMzNDQ4YmlzLCBzZWN0aW9uIDQuMi4gUmVtZW1iZXIsIFggaXMgc2NhbGVkIGJ5IDJeNi4KKwkJICovCisJCWlmIChkcC0+ZGNjcHNfc3luX3J0dCkgeworCQkJY2NpZDNfcHJfZGVidWcoIlNZTiBSVFQgPSAldXVzXG4iLCBkcC0+ZGNjcHNfc3luX3J0dCk7CisJCQloY3R4LT5jY2lkM2hjdHhfcnR0ICA9IGRwLT5kY2Nwc19zeW5fcnR0OworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggICAgPSByZmMzMzkwX2luaXRpYWxfcmF0ZShzayk7CisJCQloY3R4LT5jY2lkM2hjdHhfdF9sZCA9IG5vdzsKKwkJfSBlbHNlIHsKKwkJCS8qIFNlbmRlciBkb2VzIG5vdCBoYXZlIFJUVCBzYW1wbGU6IFggPSBNU1Mvc2Vjb25kICovCisJCQloY3R4LT5jY2lkM2hjdHhfeCA9IGRwLT5kY2Nwc19tc3NfY2FjaGU7CisJCQloY3R4LT5jY2lkM2hjdHhfeCA8PD0gNjsKKwkJfQorCQljY2lkM191cGRhdGVfc2VuZF9pbnRlcnZhbChoY3R4KTsKKworCQljY2lkM19oY190eF9zZXRfc3RhdGUoc2ssIFRGUkNfU1NUQVRFX05PX0ZCQUNLKTsKIAkJYnJlYWs7CiAJY2FzZSBURlJDX1NTVEFURV9OT19GQkFDSzoKIAljYXNlIFRGUkNfU1NUQVRFX0ZCQUNLOgogCQlkZWxheSA9IHRpbWV2YWxfZGVsdGEoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgJm5vdyk7CisJCWNjaWQzX3ByX2RlYnVnKCJkZWxheT0lbGRcbiIsIChsb25nKWRlbGF5KTsKIAkJLyoKIAkJICoJU2NoZWR1bGluZyBvZiBwYWNrZXQgdHJhbnNtaXNzaW9ucyBbUkZDIDM0NDgsIDQuNl0KIAkJICoKQEAgLTM2MSw2ICszODQsNyBAQAogCS8qIHByZXBhcmUgdG8gc2VuZCBub3cgKGFkZCBvcHRpb25zIGV0Yy4pICovCiAJZHAtPmRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zID0gMTsKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9jY3ZhbCA9IGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudDsKKwloY3R4LT5jY2lkM2hjdHhfaWRsZSA9IDA7CiAKIAkvKiBzZXQgdGhlIG5vbWluYWwgc2VuZCB0aW1lIGZvciB0aGUgbmV4dCBmb2xsb3dpbmcgcGFja2V0ICovCiAJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKQEAgLTM5MSw3ICs0MTUsNiBAQAogCXBhY2tldC0+ZGNjcGh0eF9zZXFubyAgPSBkY2NwX3NrKHNrKS0+ZGNjcHNfZ3NzOwogCXBhY2tldC0+ZGNjcGh0eF9ydHQgICAgPSBoY3R4LT5jY2lkM2hjdHhfcnR0OwogCXBhY2tldC0+ZGNjcGh0eF9zZW50ICAgPSAxOwotCWhjdHgtPmNjaWQzaGN0eF9pZGxlICAgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC00MDIsOCArNDI1LDcgQEAKIAlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCXVuc2lnbmVkIGxvbmcgdF9uZmI7Ci0JdTMyIHBpbnY7Ci0Jc3VzZWNvbmRzX3Qgcl9zYW1wbGUsIHRfZWxhcHNlZDsKKwl1MzIgcGludiwgcl9zYW1wbGU7CiAKIAlCVUdfT04oaGN0eCA9PSBOVUxMKTsKIApAQCAtNDQ1LDE4ICs0NjcsMTAgQEAKIAkJICogQ2FsY3VsYXRlIG5ldyByb3VuZCB0cmlwIHNhbXBsZSBhcyBwZXIgW1JGQyAzNDQ4LCA0LjNdIGJ5CiAJCSAqCVJfc2FtcGxlICA9ICAobm93IC0gdF9yZWN2ZGF0YSkgLSB0X2VsYXBzZWQKIAkJICovCi0JCXJfc2FtcGxlICA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJnBhY2tldC0+ZGNjcGh0eF90c3RhbXApOwotCQl0X2VsYXBzZWQgPSBkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZC5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7CisJCXJfc2FtcGxlID0gZGNjcF9zYW1wbGVfcnR0KHNrLCAmbm93LCAmcGFja2V0LT5kY2NwaHR4X3RzdGFtcCk7CiAKLQkJRENDUF9CVUdfT04ocl9zYW1wbGUgPCAwKTsKLQkJaWYgKHVubGlrZWx5KHJfc2FtcGxlIDw9IHRfZWxhcHNlZCkpCi0JCQlEQ0NQX1dBUk4oIldBUk5JTkc6IHJfc2FtcGxlPSVkdXMgPD0gdF9lbGFwc2VkPSVkdXNcbiIsCi0JCQkJICAoaW50KXJfc2FtcGxlLCAoaW50KXRfZWxhcHNlZCk7Ci0JCWVsc2UKLQkJCXJfc2FtcGxlIC09IHRfZWxhcHNlZDsKLQkJQ0NJRDNfUlRUX1NBTklUWV9DSEVDSyhyX3NhbXBsZSk7Ci0KLQkJLyogVXBkYXRlIFJUVCBlc3RpbWF0ZSBieQorCQkvKgorCQkgKiBVcGRhdGUgUlRUIGVzdGltYXRlIGJ5CiAJCSAqIElmIChObyBmZWVkYmFjayByZWN2KQogCQkgKiAgICBSID0gUl9zYW1wbGU7CiAJCSAqIEVsc2UKQEAgLTQ2NywyNyArNDgxLDIzIEBACiAJCWlmIChoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfTk9fRkJBQ0spIHsKIAkJCS8qCiAJCQkgKiBMYXJnZXIgSW5pdGlhbCBXaW5kb3dzIFtSRkMgNDM0Miwgc2VjLiA1XQotCQkJICogV2UgZGV2aWF0ZSBpbiB0aGF0IHdlIHVzZSBgcycgaW5zdGVhZCBvZiBgTVNTJy4KIAkJCSAqLwotCQkJX191NjQgd19pbml0ID0gbWluKDQgKiBoY3R4LT5jY2lkM2hjdHhfcywKLQkJCQkJICAgbWF4KDIgKiBoY3R4LT5jY2lkM2hjdHhfcywgNDM4MCkpOwogCQkJaGN0eC0+Y2NpZDNoY3R4X3J0dCAgPSByX3NhbXBsZTsKLQkJCWhjdHgtPmNjaWQzaGN0eF94ICAgID0gc2NhbGVkX2Rpdih3X2luaXQgPDwgNiwgcl9zYW1wbGUpOworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggICAgPSByZmMzMzkwX2luaXRpYWxfcmF0ZShzayk7CiAJCQloY3R4LT5jY2lkM2hjdHhfdF9sZCA9IG5vdzsKIAotCQkJY2NpZDNfdXBkYXRlX3NlbmRfdGltZShoY3R4KTsKKwkJCWNjaWQzX3VwZGF0ZV9zZW5kX2ludGVydmFsKGhjdHgpOwogCi0JCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBzPSV1LCB3X2luaXQ9JWxsdSwgIgotCQkJCSAgICAgICAiUl9zYW1wbGU9JWR1cywgWD0ldVxuIiwgZGNjcF9yb2xlKHNrKSwKKwkJCWNjaWQzX3ByX2RlYnVnKCIlcyglcCksIHM9JXUsIE1TUz0ldSwgIgorCQkJCSAgICAgICAiUl9zYW1wbGU9JXV1cywgWD0ldVxuIiwgZGNjcF9yb2xlKHNrKSwKIAkJCQkgICAgICAgc2ssIGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXdfaW5pdCwKLQkJCQkgICAgICAgKGludClyX3NhbXBsZSwKKwkJCQkgICAgICAgZHAtPmRjY3BzX21zc19jYWNoZSwgcl9zYW1wbGUsCiAJCQkJICAgICAgICh1bnNpZ25lZCkoaGN0eC0+Y2NpZDNoY3R4X3ggPj4gNikpOwogCiAJCQljY2lkM19oY190eF9zZXRfc3RhdGUoc2ssIFRGUkNfU1NUQVRFX0ZCQUNLKTsKIAkJfSBlbHNlIHsKIAkJCWhjdHgtPmNjaWQzaGN0eF9ydHQgPSAoOSAqIGhjdHgtPmNjaWQzaGN0eF9ydHQgKwotCQkJCQkJICAgKHUzMilyX3NhbXBsZSkgLyAxMDsKKwkJCQkJCSAgIHJfc2FtcGxlKSAvIDEwOwogCiAJCQkvKiBVcGRhdGUgc2VuZGluZyByYXRlIChzdGVwIDQgb2YgW1JGQyAzNDQ4LCA0LjNdKSAqLwogCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wID4gMCkKQEAgLTQ5NywxMCArNTA3LDEwIEBACiAJCQkJCQkgICAgaGN0eC0+Y2NpZDNoY3R4X3ApOwogCQkJY2NpZDNfaGNfdHhfdXBkYXRlX3goc2ssICZub3cpOwogCi0JCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBSVFQ9JXV1cyAoc2FtcGxlPSVkdXMpLCBzPSV1LCAiCisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBSVFQ9JXV1cyAoc2FtcGxlPSV1dXMpLCBzPSV1LCAiCiAJCQkJICAgICAgICJwPSV1LCBYX2NhbGM9JXUsIFhfcmVjdj0ldSwgWD0ldVxuIiwKIAkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwKLQkJCQkgICAgICAgc2ssIGhjdHgtPmNjaWQzaGN0eF9ydHQsIChpbnQpcl9zYW1wbGUsCisJCQkJICAgICAgIHNrLCBoY3R4LT5jY2lkM2hjdHhfcnR0LCByX3NhbXBsZSwKIAkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3MsIGhjdHgtPmNjaWQzaGN0eF9wLAogCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjLAogCQkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPj4gNiksCkBAIC02NDQsMTAgKzY1NCw1MCBAQAogCWRjY3BfdHhfaGlzdF9wdXJnZShjY2lkM190eF9oaXN0LCAmaGN0eC0+Y2NpZDNoY3R4X2hpc3QpOwogfQogCi0vKgotICogUlggSGFsZiBDb25uZWN0aW9uIG1ldGhvZHMKLSAqLworc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX2luZm8gKmluZm8pCit7CisJY29uc3Qgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAKKwkvKiBMaXN0ZW4gc29ja3MgZG9lc24ndCBoYXZlIGEgcHJpdmF0ZSBDQ0lEIGJsb2NrICovCisJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX0xJU1RFTikKKwkJcmV0dXJuOworCisJQlVHX09OKGhjdHggPT0gTlVMTCk7CisKKwlpbmZvLT50Y3BpX3J0byA9IGhjdHgtPmNjaWQzaGN0eF90X3J0bzsKKwlpbmZvLT50Y3BpX3J0dCA9IGhjdHgtPmNjaWQzaGN0eF9ydHQ7Cit9CisKK3N0YXRpYyBpbnQgY2NpZDNfaGNfdHhfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBvcHRuYW1lLCBpbnQgbGVuLAorCQkJCSAgdTMyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJY29uc3Qgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CisJY29uc3Qgdm9pZCAqdmFsOworCisJLyogTGlzdGVuIHNvY2tzIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUgQ0NJRCBibG9jayAqLworCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9UWF9JTkZPOgorCQlpZiAobGVuIDwgc2l6ZW9mKGhjdHgtPmNjaWQzaGN0eF90ZnJjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gPSBzaXplb2YoaGN0eC0+Y2NpZDNoY3R4X3RmcmMpOworCQl2YWwgPSAmaGN0eC0+Y2NpZDNoY3R4X3RmcmM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSB8fCBjb3B5X3RvX3VzZXIob3B0dmFsLCB2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglSZWNlaXZlciBIYWxmLUNvbm5lY3Rpb24gUm91dGluZXMKKyAqLwogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciAqY2NpZDNfcnhfc3RhdGVfbmFtZShlbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyBzdGF0ZSkKIHsKQEAgLTk3Nyw4ICsxMDI3LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdjsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwotCXUzMiBwX3ByZXYsIHJ0dF9wcmV2OwotCXN1c2Vjb25kc190IHJfc2FtcGxlLCB0X2VsYXBzZWQ7CisJdTMyIHBfcHJldiwgcl9zYW1wbGUsIHJ0dF9wcmV2OwogCWludCBsb3NzLCBwYXlsb2FkX3NpemU7CiAKIAlCVUdfT04oaGNyeCA9PSBOVUxMKTsKQEAgLTk5NCwxNyArMTA0Myw3IEBACiAJCQlicmVhazsKIAkJcnR0X3ByZXYgPSBoY3J4LT5jY2lkM2hjcnhfcnR0OwogCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7Ci0JCXRpbWV2YWxfc3ViX3VzZWNzKCZub3csIG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8gKiAxMCk7Ci0JCXJfc2FtcGxlID0gdGltZXZhbF91c2Vjcygmbm93KTsKLQkJdF9lbGFwc2VkID0gb3B0X3JlY3YtPmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKLQotCQlEQ0NQX0JVR19PTihyX3NhbXBsZSA8IDApOwotCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKLQkJCURDQ1BfV0FSTigicl9zYW1wbGU9JWxkdXMsIHRfZWxhcHNlZD0lbGR1c1xuIiwKLQkJCQkgIChsb25nKXJfc2FtcGxlLCAobG9uZyl0X2VsYXBzZWQpOwotCQllbHNlCi0JCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7Ci0JCUNDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socl9zYW1wbGUpOworCQlyX3NhbXBsZSA9IGRjY3Bfc2FtcGxlX3J0dChzaywgJm5vdywgTlVMTCk7CiAKIAkJaWYgKGhjcngtPmNjaWQzaGNyeF9zdGF0ZSA9PSBURlJDX1JTVEFURV9OT19EQVRBKQogCQkJaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IHJfc2FtcGxlOwpAQCAtMTEzMiwyMCArMTE3MSw2IEBACiAJaW5mby0+dGNwaV9yY3ZfcnR0ICA9IGhjcngtPmNjaWQzaGNyeF9ydHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9pbmZvICppbmZvKQotewotCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwotCi0JLyogTGlzdGVuIHNvY2tzIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUgQ0NJRCBibG9jayAqLwotCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pCi0JCXJldHVybjsKLQotCUJVR19PTihoY3R4ID09IE5VTEwpOwotCi0JaW5mby0+dGNwaV9ydG8gPSBoY3R4LT5jY2lkM2hjdHhfdF9ydG87Ci0JaW5mby0+dGNwaV9ydHQgPSBoY3R4LT5jY2lkM2hjdHhfcnR0OwotfQotCiBzdGF0aWMgaW50IGNjaWQzX2hjX3J4X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgb3B0bmFtZSwgaW50IGxlbiwKIAkJCQkgIHUzMiBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewpAQCAtMTE3MywzMyArMTE5OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2NpZDNfaGNfdHhfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBvcHRuYW1lLCBpbnQgbGVuLAotCQkJCSAgdTMyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCi17Ci0JY29uc3Qgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7Ci0JY29uc3Qgdm9pZCAqdmFsOwotCi0JLyogTGlzdGVuIHNvY2tzIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUgQ0NJRCBibG9jayAqLwotCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChvcHRuYW1lKSB7Ci0JY2FzZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9UWF9JTkZPOgotCQlpZiAobGVuIDwgc2l6ZW9mKGhjdHgtPmNjaWQzaGN0eF90ZnJjKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlsZW4gPSBzaXplb2YoaGN0eC0+Y2NpZDNoY3R4X3RmcmMpOwotCQl2YWwgPSAmaGN0eC0+Y2NpZDNoY3R4X3RmcmM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JfQotCi0JaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSB8fCBjb3B5X3RvX3VzZXIob3B0dmFsLCB2YWwsIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zIGNjaWQzID0gewogCS5jY2lkX2lkCQkgICA9IERDQ1BDX0NDSUQzLAogCS5jY2lkX25hbWUJCSAgID0gImNjaWQzIiwKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmggYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCmluZGV4IDE1Nzc2YTguLjhkMzFiMzggMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaApAQCAtNTEsMTYgKzUxLDYgQEAKIC8qIFBhcmFtZXRlciB0X21iaSBmcm9tIFtSRkMgMzQ0OCwgNC4zXTogYmFja29mZiBpbnRlcnZhbCBpbiBzZWNvbmRzICovCiAjZGVmaW5lIFRGUkNfVF9NQkkJCSAgIDY0CiAKLS8qIFdoYXQgd2UgdGhpbmsgaXMgYSByZWFzb25hYmxlIHVwcGVyIGxpbWl0IG9uIFJUVCB2YWx1ZXMgKi8KLSNkZWZpbmUgQ0NJRDNfU0FORV9SVFRfTUFYCSAgICgoc3VzZWNvbmRzX3QpKDQgKiBVU0VDX1BFUl9TRUMpKQotCi0jZGVmaW5lIENDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socnR0KSAJCQlkbyB7CQkgICBcCi0JCWlmIChydHQgPiBDQ0lEM19TQU5FX1JUVF9NQVgpIHsJCQkJICAgXAotCQkJRENDUF9DUklUKCJSVFQgKCVkKSB0b28gbGFyZ2UsIHN1YnN0aXR1dGluZyAlZCIsICAgXAotCQkJCSAgKGludClydHQsIChpbnQpQ0NJRDNfU0FORV9SVFRfTUFYKTsJICAgXAotCQkJcnR0ID0gQ0NJRDNfU0FORV9SVFRfTUFYOwkJCSAgIFwKLQkJfSAJCQkJCX0gd2hpbGUgKDApCi0KIGVudW0gY2NpZDNfb3B0aW9ucyB7CiAJVEZSQ19PUFRfTE9TU19FVkVOVF9SQVRFID0gMTkyLAogCVRGUkNfT1BUX0xPU1NfSU5URVJWQUxTCSA9IDE5MywKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCmluZGV4IDBhMGJhZWYuLjM3MmQ3ZTcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYwpAQCAtOTEsNyArOTEsNyBAQAogCXUzMiB3X3RvdCAgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpX2VudHJ5LCBsaV9uZXh0LCBsaXN0LCBkY2NwbGloX25vZGUpIHsKLQkJaWYgKGxpX2VudHJ5LT5kY2NwbGloX2ludGVydmFsICE9IH4wKSB7CisJCWlmIChsaV9lbnRyeS0+ZGNjcGxpaF9pbnRlcnZhbCAhPSB+MFUpIHsKIAkJCWlfdG90MCArPSBsaV9lbnRyeS0+ZGNjcGxpaF9pbnRlcnZhbCAqIGRjY3BfbGlfaGlzdF93W2ldOwogCQkJd190b3QgICs9IGRjY3BfbGlfaGlzdF93W2ldOwogCQkJaWYgKGkgIT0gMCkKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2RjY3AuaCBiL25ldC9kY2NwL2RjY3AuaAppbmRleCBlMzNhOWVkLi5kOGFkMjdiIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9kY2NwLmgKKysrIGIvbmV0L2RjY3AvZGNjcC5oCkBAIC0zMSwxMyArMzEsOSBAQAogCQkJCQkgICAgICBfX3N0cmluZ2lmeShjb25kKSk7ICAgICAgICAgIFwKIAkJCSAgICAgfSB3aGlsZSAoMCkKIAotI2lmZGVmIE1PRFVMRQogI2RlZmluZSBEQ0NQX1BSSU5USyhlbmFibGUsIGZtdCwgYXJncy4uLikJZG8geyBpZiAoZW5hYmxlKQkgICAgIFwKIAkJCQkJCQlwcmludGsoZm10LCAjI2FyZ3MpOyBcCiAJCQkJCQl9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBEQ0NQX1BSSU5USyhlbmFibGUsIGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCwgIyNhcmdzKQotI2VuZGlmCiAjZGVmaW5lIERDQ1BfUFJfREVCVUcoZW5hYmxlLCBmbXQsIGEuLi4pCURDQ1BfUFJJTlRLKGVuYWJsZSwgS0VSTl9ERUJVRyBcCiAJCQkJCQkgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhKQogCkBAIC03NSwxMSArNzEsMTUgQEAKIC8qIFJGQyAxMTIyLCA0LjIuMy4xIGluaXRpYWwgUlRPIHZhbHVlICovCiAjZGVmaW5lIERDQ1BfVElNRU9VVF9JTklUICgodW5zaWduZWQpKDMgKiBIWikpCiAKKyNkZWZpbmUgRENDUF9SVE9fTUFYICgodW5zaWduZWQpKDEyMCAqIEhaKSkgLyogRklYTUU6IHVzaW5nIFRDUCB2YWx1ZSAqLworCisvKiBib3VuZHMgZm9yIHNhbXBsZWQgUlRUIHZhbHVlcyBmcm9tIHBhY2tldCBleGNoYW5nZXMgKGluIHVzZWMpICovCisjZGVmaW5lIERDQ1BfU0FORV9SVFRfTUlOCTEwMAorI2RlZmluZSBEQ0NQX1NBTkVfUlRUX01BWAkoNCAqIFVTRUNfUEVSX1NFQykKKwogLyogTWF4aW1hbCBpbnRlcnZhbCBiZXR3ZWVuIHByb2JlcyBmb3IgbG9jYWwgcmVzb3VyY2VzLiAgKi8KICNkZWZpbmUgRENDUF9SRVNPVVJDRV9QUk9CRV9JTlRFUlZBTCAoKHVuc2lnbmVkKShIWiAvIDJVKSkKIAotI2RlZmluZSBEQ0NQX1JUT19NQVggKCh1bnNpZ25lZCkoMTIwICogSFopKSAvKiBGSVhNRTogdXNpbmcgVENQIHZhbHVlICovCi0KIC8qIHN5c2N0bCB2YXJpYWJsZXMgZm9yIERDQ1AgKi8KIGV4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllczsKIGV4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3JldHJpZXMxOwpAQCAtOTIsMTcgKzkyLDQzIEBACiBleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50OwogZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfdHhfcWxlbjsKIAorLyoKKyAqCTQ4LWJpdCBzZXF1ZW5jZSBudW1iZXIgYXJpdGhtZXRpYyAoc2lnbmVkIGFuZCB1bnNpZ25lZCkKKyAqLworI2RlZmluZSBJTlQ0OF9NSU4JICAweDgwMDAwMDAwMDAwMExMCQkvKiAyXjQ3CSAgICAqLworI2RlZmluZSBVSU5UNDhfTUFYCSAgMHhGRkZGRkZGRkZGRkZMTAkJLyogMl40OCAtIDEgKi8KKyNkZWZpbmUgQ09NUExFTUVOVDQ4KHgpCSAoMHgxMDAwMDAwMDAwMDAwTEwgLSAoeCkpCS8qIDJeNDggLSB4ICovCisjZGVmaW5lIFRPX1NJR05FRDQ4KHgpCSAoKCh4KSA8IElOVDQ4X01JTik/ICh4KSA6IC1DT01QTEVNRU5UNDgoICh4KSkpCisjZGVmaW5lIFRPX1VOU0lHTkVENDgoeCkgKCgoeCkgPj0gMCk/CSAgICAgKHgpIDogIENPTVBMRU1FTlQ0OCgtKHgpKSkKKyNkZWZpbmUgQURENDgoYSwgYikJICgoKGEpICsgKGIpKSAmIFVJTlQ0OF9NQVgpCisjZGVmaW5lIFNVQjQ4KGEsIGIpCSBBREQ0OCgoYSksIENPTVBMRU1FTlQ0OChiKSkKKworc3RhdGljIGlubGluZSB2b2lkIGRjY3Bfc2V0X3NlcW5vKHU2NCAqc2Vxbm8sIHU2NCB2YWx1ZSkKK3sKKwkqc2Vxbm8gPSB2YWx1ZSAmIFVJTlQ0OF9NQVg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2luY19zZXFubyh1NjQgKnNlcW5vKQoreworCSpzZXFubyA9IEFERDQ4KCpzZXFubywgMSk7Cit9CisKKy8qIHNpZ25lZCBtb2QtMl40OCBkaXN0YW5jZTogcG9zLiBpZiBzZXFubzEgPCBzZXFubzIsIG5lZy4gaWYgc2Vxbm8xID4gc2Vxbm8yICovCitzdGF0aWMgaW5saW5lIHM2NCBkY2NwX2RlbHRhX3NlcW5vKGNvbnN0IHU2NCBzZXFubzEsIGNvbnN0IHU2NCBzZXFubzIpCit7CisJdTY0IGRlbHRhID0gU1VCNDgoc2Vxbm8yLCBzZXFubzEpOworCisJcmV0dXJuIFRPX1NJR05FRDQ4KGRlbHRhKTsKK30KKwogLyogaXMgc2VxMSA8IHNlcTIgPyAqLwogc3RhdGljIGlubGluZSBpbnQgYmVmb3JlNDgoY29uc3QgdTY0IHNlcTEsIGNvbnN0IHU2NCBzZXEyKQogewotCXJldHVybiAoczY0KSgoc2VxMSA8PCAxNikgLSAoc2VxMiA8PCAxNikpIDwgMDsKKwlyZXR1cm4gKHM2NCkoKHNlcTIgPDwgMTYpIC0gKHNlcTEgPDwgMTYpKSA+IDA7CiB9CiAKIC8qIGlzIHNlcTEgPiBzZXEyID8gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFmdGVyNDgoY29uc3QgdTY0IHNlcTEsIGNvbnN0IHU2NCBzZXEyKQotewotCXJldHVybiAoczY0KSgoc2VxMiA8PCAxNikgLSAoc2VxMSA8PCAxNikpIDwgMDsKLX0KKyNkZWZpbmUgYWZ0ZXI0OChzZXExLCBzZXEyKQliZWZvcmU0OChzZXEyLCBzZXExKQogCiAvKiBpcyBzZXEyIDw9IHNlcTEgPD0gc2VxMyA/ICovCiBzdGF0aWMgaW5saW5lIGludCBiZXR3ZWVuNDgoY29uc3QgdTY0IHNlcTEsIGNvbnN0IHU2NCBzZXEyLCBjb25zdCB1NjQgc2VxMykKQEAgLTExOCw5ICsxNDQsNyBAQAogLyogaXMgc2VxMSBuZXh0IHNlcW5vIGFmdGVyIHNlcTIgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZvbGxvd3M0OChjb25zdCB1NjQgc2VxMSwgY29uc3QgdTY0IHNlcTIpCiB7Ci0JaW50IGRpZmYgPSAoc2VxMSAmIDB4RkZGRikgLSAoc2VxMiAmIDB4RkZGRik7Ci0KLQlyZXR1cm4gZGlmZj09MTsKKwlyZXR1cm4gZGNjcF9kZWx0YV9zZXFubyhzZXEyLCBzZXExKSA9PSAxOwogfQogCiBlbnVtIHsKQEAgLTI3Miw2ICsyOTYsOCBAQAogZXh0ZXJuIGludAkgICBkY2NwX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIGRjY3BfcmVzZXRfY29kZXMgY29kZSk7CiBleHRlcm4gdm9pZAkgICBkY2NwX3NlbmRfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgYWN0aXZlKTsKIGV4dGVybiBpbnQJICAgZGNjcF9pbnZhbGlkX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB1MzIJICAgZGNjcF9zYW1wbGVfcnR0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKnRfcmVjdiwKKwkJCQkJCSAgICBzdHJ1Y3QgdGltZXZhbCAqdF9oaXN0b3J5KTsKIAogc3RhdGljIGlubGluZSBpbnQgZGNjcF9iYWRfc2VydmljZV9jb2RlKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJY29uc3QgX19iZTMyIHNlcnZpY2UpCkBAIC0zMTMsMjYgKzMzOSw3IEBACiAJcmV0dXJuIHR5cGUgPT0gRENDUF9QS1RfREFUQSB8fCB0eXBlID09IERDQ1BfUEtUX1JFUVVFU1Q7CiB9CiAKLSNkZWZpbmUgRENDUF9NQVhfU0VRTk8gKCgoKHU2NCkxKSA8PCA0OCkgLSAxKQotI2RlZmluZSBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEgKERDQ1BfTUFYX1NFUU5PIDw8IDIpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX3NldF9zZXFubyh1NjQgKnNlcW5vLCB1NjQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlID4gRENDUF9NQVhfU0VRTk8pCi0JCXZhbHVlIC09IERDQ1BfTUFYX1NFUU5PICsgMTsKLQkqc2Vxbm8gPSB2YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgZGNjcF9kZWx0YV9zZXFubyh1NjQgc2Vxbm8xLCB1NjQgc2Vxbm8yKQotewotCXJldHVybiAoKHNlcW5vMiA8PCAxNikgLSAoc2Vxbm8xIDw8IDE2KSkgPj4gMTY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2luY19zZXFubyh1NjQgKnNlcW5vKQotewotCWlmICgrKypzZXFubyA+IERDQ1BfTUFYX1NFUU5PKQotCQkqc2Vxbm8gPSAwOwotfQorI2RlZmluZSBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEgKFVJTlQ0OF9NQVggPDwgMikKIAogc3RhdGljIGlubGluZSB2b2lkIGRjY3BfaGRyX3NldF9zZXEoc3RydWN0IGRjY3BfaGRyICpkaCwgY29uc3QgdTY0IGdzcykKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lucHV0LmMgYi9uZXQvZGNjcC9pbnB1dC5jCmluZGV4IDc4YjA0M2MuLmRhNmVjMTggMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lucHV0LmMKKysrIGIvbmV0L2RjY3AvaW5wdXQuYwpAQCAtODYsNyArODYsOCBAQAogCSAgICBkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9TWU5DQUNLKSB7CiAJCWlmIChiZXR3ZWVuNDgoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSwKIAkJCSAgICAgIGRwLT5kY2Nwc19hd2wsIGRwLT5kY2Nwc19hd2gpICYmCi0JCSAgICAhYmVmb3JlNDgoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLCBkcC0+ZGNjcHNfc3dsKSkKKwkJICAgIGRjY3BfZGVsdGFfc2Vxbm8oZHAtPmRjY3BzX3N3bCwKKwkJCQkgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSkgPj0gMCkKIAkJCWRjY3BfdXBkYXRlX2dzcihzaywgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxKTsKIAkJZWxzZQogCQkJcmV0dXJuIC0xOwpAQCAtMjAzLDcgKzIwNCw4IEBACiAJCWlmIChkcC0+ZGNjcHNfcm9sZSAhPSBEQ0NQX1JPTEVfQ0xJRU5UKQogCQkJZ290byBzZW5kX3N5bmM7CiBjaGVja19zZXE6Ci0JCWlmICghYmVmb3JlNDgoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLCBkcC0+ZGNjcHNfb3NyKSkgeworCQlpZiAoZGNjcF9kZWx0YV9zZXFubyhkcC0+ZGNjcHNfb3NyLAorCQkJCSAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxKSA+PSAwKSB7CiBzZW5kX3N5bmM6CiAJCQlkY2NwX3NlbmRfc3luYyhzaywgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAogCQkJCSAgICAgICBEQ0NQX1BLVF9TWU5DKTsKQEAgLTI5OCw2ICszMDAsMTQgQEAKIAkJaWYgKGRjY3BfcGFyc2Vfb3B0aW9ucyhzaywgc2tiKSkKIAkJCWdvdG8gb3V0X2ludmFsaWRfcGFja2V0OwogCisJCS8qIE9idGFpbiBSVFQgc2FtcGxlIGZyb20gU1lOIGV4Y2hhbmdlICh1c2VkIGJ5IENDSUQgMykgKi8KKwkJaWYgKGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl90aW1lc3RhbXBfZWNobykgeworCQkJc3RydWN0IHRpbWV2YWwgbm93OworCisJCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CisJCQlkcC0+ZGNjcHNfc3luX3J0dCA9IGRjY3Bfc2FtcGxlX3J0dChzaywgJm5vdywgTlVMTCk7CisJCX0KKwogCQlpZiAoZGNjcF9tc2soc2spLT5kY2NwbXNfc2VuZF9hY2tfdmVjdG9yICYmCiAJCSAgICBkY2NwX2Fja3ZlY19hZGQoZHAtPmRjY3BzX2hjX3J4X2Fja3ZlYywgc2ssCiAJCQkJICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwKQEAgLTU3NSwzICs1ODUsNDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9yY3Zfc3RhdGVfcHJvY2Vzcyk7CisKKy8qKgorICogZGNjcF9zYW1wbGVfcnR0ICAtICBTYW1wbGUgUlRUIGZyb20gcGFja2V0IGV4Y2hhbmdlCisgKgorICogQHNrOiAgICAgY29ubmVjdGVkIGRjY3Bfc29jaworICogQHRfcmVjdjogcmVjZWl2ZSB0aW1lc3RhbXAgb2YgcGFja2V0IHdpdGggdGltZXN0YW1wIGVjaG8KKyAqIEB0X2hpc3Q6IHBhY2tldCBoaXN0b3J5IHRpbWVzdGFtcCBvciBOVUxMCisgKi8KK3UzMiBkY2NwX3NhbXBsZV9ydHQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXZhbCAqdF9yZWN2LAorCQkJCSAgICAgc3RydWN0IHRpbWV2YWwgKnRfaGlzdCkKK3sKKwlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOworCXN0cnVjdCBkY2NwX29wdGlvbnNfcmVjZWl2ZWQgKm9yID0gJmRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkOworCXN1c2Vjb25kc190IGRlbHRhOworCisJaWYgKHRfaGlzdCA9PSBOVUxMKSB7CisJCWlmICghb3ItPmRjY3Bvcl90aW1lc3RhbXBfZWNobykgeworCQkJRENDUF9XQVJOKCJwYWNrZXQgd2l0aG91dCB0aW1lc3RhbXAgZWNob1xuIik7CisJCQlyZXR1cm4gRENDUF9TQU5FX1JUVF9NQVg7CisJCX0KKwkJdGltZXZhbF9zdWJfdXNlY3ModF9yZWN2LCBvci0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvICogMTApOworCQlkZWx0YSA9IHRpbWV2YWxfdXNlY3ModF9yZWN2KTsKKwl9IGVsc2UKKwkJZGVsdGEgPSB0aW1ldmFsX2RlbHRhKHRfcmVjdiwgdF9oaXN0KTsKKworCWRlbHRhIC09IG9yLT5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7CQkvKiBlaXRoZXIgc2V0IG9yIDAgKi8KKworCWlmICh1bmxpa2VseShkZWx0YSA8PSAwKSkgeworCQlEQ0NQX1dBUk4oInVudXNhYmxlIFJUVCBzYW1wbGUgJWxkLCB1c2luZyBtaW5cbiIsIChsb25nKWRlbHRhKTsKKwkJcmV0dXJuIERDQ1BfU0FORV9SVFRfTUlOOworCX0KKwlpZiAodW5saWtlbHkoZGVsdGEgLSAoc3VzZWNvbmRzX3QpRENDUF9TQU5FX1JUVF9NQVggPiAwKSkgeworCQlEQ0NQX1dBUk4oIlJUVCBzYW1wbGUgJWxkIHRvbyBsYXJnZSwgdXNpbmcgbWF4XG4iLCAobG9uZylkZWx0YSk7CisJCXJldHVybiBEQ0NQX1NBTkVfUlRUX01BWDsKKwl9CisKKwlyZXR1cm4gZGVsdGE7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGRjY3Bfc2FtcGxlX3J0dCk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggNGE4Mzk3OC4uNzE4ZjJmYSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtMjA3LDggKzIwNyw4IEBACiAJCQkJCQkJKGlwaC0+aWhsIDw8IDIpKTsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcDsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0OwotCWNvbnN0IGludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWNvbnN0IGludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJc3RydWN0IHNvY2sgKnNrOwogCV9fdTY0IHNlcTsKIAlpbnQgZXJyOwpAQCAtMzYzLDggKzM2Myw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IGRjY3BfdjRfaW5pdF9zZXF1ZW5jZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQkgICBza2ItPm5oLmlwaC0+c2FkZHIsCisJcmV0dXJuIHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSAgIGlwX2hkcihza2IpLT5zYWRkciwKIAkJCQkJICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfZHBvcnQsCiAJCQkJCSAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0KTsKIH0KQEAgLTQwNSw3ICs0MDUsNyBAQAogCW5ld2luZXQtPm9wdAkgICA9IGlyZXEtPm9wdDsKIAlpcmVxLT5vcHQJICAgPSBOVUxMOwogCW5ld2luZXQtPm1jX2luZGV4ICA9IGluZXRfaWlmKHNrYik7Ci0JbmV3aW5ldC0+bWNfdHRsCSAgID0gc2tiLT5uaC5pcGgtPnR0bDsKKwluZXdpbmV0LT5tY190dGwJICAgPSBpcF9oZHIoc2tiKS0+dHRsOwogCW5ld2luZXQtPmlkCSAgID0gamlmZmllczsKIAogCWRjY3Bfc3luY19tc3MobmV3c2ssIGRzdF9tdHUoZHN0KSk7CkBAIC00MjgsNyArNDI4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqZGNjcF92NF9obmRfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHNvY2sgKm5zazsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldjsKIAkvKiBGaW5kIHBvc3NpYmxlIGNvbm5lY3Rpb24gcmVxdWVzdHMuICovCkBAIC00NjAsOCArNDYwLDggQEAKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSAoKHN0cnVjdCBydGFibGUgKilza2ItPmRzdCktPnJ0X2lpZiwKIAkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KLQkJCQkgICAgICB7IC5kYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJLnNhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgICAgIHsgLmRhZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkuc2FkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkJCS50b3MgPSBSVF9DT05OX0ZMQUdTKHNrKSB9IH0sCiAJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sLAogCQkJICAgIC51bGlfdSA9IHsgLnBvcnRzID0KQEAgLTUxMyw2ICs1MTMsNyBAQAogewogCWludCBlcnI7CiAJc3RydWN0IGRjY3BfaGRyICpyeGRoID0gZGNjcF9oZHIocnhza2IpLCAqZGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICpyeGlwaDsKIAljb25zdCBpbnQgZGNjcF9oZHJfcmVzZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX2V4dCkgKwogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3Jlc2V0KTsKQEAgLTU1OSwxMyArNTYwLDEzIEBACiAJZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3NlcSk7CiAKIAlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgcnhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgICAgICByeHNrYi0+bmguaXBoLT5kYWRkcik7CisJcnhpcGggPSBpcF9oZHIocnhza2IpOworCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjRfY3N1bV9maW5pc2goc2tiLCByeGlwaC0+c2FkZHIsCisJCQkJCQkgcnhpcGgtPmRhZGRyKTsKIAogCWJoX2xvY2tfc29jayhkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrKTsKIAllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrLAotCQkJCSAgICByeHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkgICAgcnhza2ItPm5oLmlwaC0+c2FkZHIsIE5VTEwpOworCQkJCSAgICByeGlwaC0+ZGFkZHIsIHJ4aXBoLT5zYWRkciwgTlVMTCk7CiAJYmhfdW5sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7CiAKIAlpZiAobmV0X3htaXRfZXZhbChlcnIpID09IDApIHsKQEAgLTY0MCw4ICs2NDEsOCBAQAogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAKIAlpcmVxID0gaW5ldF9yc2socmVxKTsKLQlpcmVxLT5sb2NfYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKLQlpcmVxLT5ybXRfYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwlpcmVxLT5sb2NfYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKKwlpcmVxLT5ybXRfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAlpcmVxLT5vcHQJPSBOVUxMOwogCiAJLyoKQEAgLTgwOSw2ICs4MTAsNyBAQAogc3RhdGljIGludCBkY2NwX3Y0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAJc3RydWN0IHNvY2sgKnNrOwogCWludCBtaW5fY292OwogCkBAIC04MTcsOCArODE5LDkgQEAKIAlpZiAoZGNjcF9pbnZhbGlkX3BhY2tldChza2IpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAkvKiBTdGVwIDE6IElmIGhlYWRlciBjaGVja3N1bSBpcyBpbmNvcnJlY3QsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4gKi8KLQlpZiAoZGNjcF92NF9jc3VtX2ZpbmlzaChza2IsIHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyKSkgeworCWlmIChkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkcikpIHsKIAkJRENDUF9XQVJOKCJkcm9wcGVkIHBhY2tldCB3aXRoIGludmFsaWQgY2hlY2tzdW1cbiIpOwogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJfQpAQCAtODMyLDggKzgzNSw4IEBACiAJCSAgICAgICJzcmM9JXUuJXUuJXUuJXVAJS01ZCAiCiAJCSAgICAgICJkc3Q9JXUuJXUuJXUuJXVAJS01ZCBzZXE9JWxsdSIsCiAJCSAgICAgIGRjY3BfcGFja2V0X25hbWUoZGgtPmRjY3BoX3R5cGUpLAotCQkgICAgICBOSVBRVUFEKHNrYi0+bmguaXBoLT5zYWRkciksIG50b2hzKGRoLT5kY2NwaF9zcG9ydCksCi0JCSAgICAgIE5JUFFVQUQoc2tiLT5uaC5pcGgtPmRhZGRyKSwgbnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSwKKwkJICAgICAgTklQUVVBRChpcGgtPnNhZGRyKSwgbnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSwKKwkJICAgICAgTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSwKIAkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxKTsKIAogCWlmIChkY2NwX3BhY2tldF93aXRob3V0X2Fjayhza2IpKSB7CkBAIC04NDgsMTAgKzg1MSw4IEBACiAJLyogU3RlcCAyOgogCSAqCUxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgZ2V0IGNvcnJlc3BvbmRpbmcgc29ja2V0ICovCiAJc2sgPSBfX2luZXRfbG9va3VwKCZkY2NwX2hhc2hpbmZvLAotCQkJICAgc2tiLT5uaC5pcGgtPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsCi0JCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsIGRoLT5kY2NwaF9kcG9ydCwKLQkJCSAgIGluZXRfaWlmKHNrYikpOwotCisJCQkgICBpcGgtPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsCisJCQkgICBpcGgtPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsIGluZXRfaWlmKHNrYikpOwogCS8qCiAJICogU3RlcCAyOgogCSAqCUlmIG5vIHNvY2tldCAuLi4KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjYuYyBiL25ldC9kY2NwL2lwdjYuYwppbmRleCA3ZjUxZThkLi42NGVhYzI1IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY2LmMKKysrIGIvbmV0L2RjY3AvaXB2Ni5jCkBAIC04NCw4ICs4NCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgX191MzIgZGNjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXB2NmgtPmRhZGRyLnM2X2FkZHIzMiwKLQkJCQkJICAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCisJcmV0dXJuIHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKGlwdjZfaGRyKHNrYiktPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgICBpcHY2X2hkcihza2IpLT5zYWRkci5zNl9hZGRyMzIsCiAJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfZHBvcnQsCiAJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfc3BvcnQgICAgICk7CiAKQEAgLTI2MSw4ICsyNjEsOCBAQAogCiAJCQlpZiAocnhvcHQtPnNyY3J0KQogCQkJCW9wdCA9IGlwdjZfaW52ZXJ0X3J0aGRyKHNrLAotCQkJCQkoc3RydWN0IGlwdjZfcnRfaGRyICopKHBrdG9wdHMtPm5oLnJhdyArCi0JCQkJCQkJICAgICAgIHJ4b3B0LT5zcmNydCkpOworCQkJICAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihwa3RvcHRzKSArCisJCQkJCQkgcnhvcHQtPnNyY3J0KSk7CiAJCX0KIAogCQlpZiAob3B0ICE9IE5VTEwgJiYgb3B0LT5zcmNydCAhPSBOVUxMKSB7CkBAIC0zMTMsNiArMzEzLDcgQEAKIHN0YXRpYyB2b2lkIGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqcnhza2IpCiB7CiAJc3RydWN0IGRjY3BfaGRyICpyeGRoID0gZGNjcF9oZHIocnhza2IpLCAqZGg7CisJc3RydWN0IGlwdjZoZHIgKnJ4aXA2aDsKIAljb25zdCB1MzIgZGNjcF9oZHJfcmVzZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX2V4dCkgKwogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3Jlc2V0KTsKQEAgLTM1MiwxMiArMzUzLDEzIEBACiAJZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3NlcSk7CiAKIAlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJnJ4c2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCQkgICAgICAmcnhza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJcnhpcDZoID0gaXB2Nl9oZHIocnhza2IpOworCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjZfY3N1bV9maW5pc2goc2tiLCAmcnhpcDZoLT5zYWRkciwKKwkJCQkJCSAgICAgICZyeGlwNmgtPmRhZGRyKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmcnhza2ItPm5oLmlwdjZoLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsICZyeHNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnJ4aXA2aC0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmcnhpcDZoLT5kYWRkcik7CiAKIAlmbC5wcm90byA9IElQUFJPVE9fRENDUDsKIAlmbC5vaWYgPSBpbmV0Nl9paWYocnhza2IpOwpAQCAtMzkwLDcgKzM5Miw3IEBACiBzdGF0aWMgc3RydWN0IHNvY2sgKmRjY3BfdjZfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2OwogCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KQEAgLTQ2MCw4ICs0NjIsOCBAQAogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAKIAlpcmVxNiA9IGluZXQ2X3JzayhyZXEpOwotCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+cm10X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5sb2NfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmaXJlcTYtPnJtdF9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+bG9jX2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJaXJlcTYtPnBrdG9wdHMJPSBOVUxMOwogCiAJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBza2IpIHx8CkBAIC01NDYsNyArNTQ4LDcgQEAKIAkJbmV3bnAtPnBrdG9wdGlvbnMgID0gTlVMTDsKIAkJbmV3bnAtPm9wdAkgICA9IE5VTEw7CiAJCW5ld25wLT5tY2FzdF9vaWYgICA9IGluZXQ2X2lpZihza2IpOwotCQluZXducC0+bWNhc3RfaG9wcyAgPSBza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQ7CisJCW5ld25wLT5tY2FzdF9ob3BzICA9IGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdDsKIAogCQkvKgogCQkgKiBObyBuZWVkIHRvIGNoYXJnZSB0aGlzIHNvY2sgdG8gdGhlIHJlbGV2YW50IElQdjYgcmVmY250IGRlYnVnIHNvY2tzIGNvdW50CkBAIC01NzMsOCArNTc1LDggQEAKIAogCQlpZiAocnhvcHQtPnNyY3J0KQogCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssCi0JCQkJKHN0cnVjdCBpcHY2X3J0X2hkciAqKShpcmVxNi0+cGt0b3B0cy0+bmgucmF3ICsKLQkJCQkJCSAgICAgICByeG9wdC0+c3JjcnQpKTsKKwkJICAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIoaXJlcTYtPnBrdG9wdHMpICsKKwkJCQkJICByeG9wdC0+c3JjcnQpKTsKIAl9CiAKIAlpZiAoZHN0ID09IE5VTEwpIHsKQEAgLTY1Myw3ICs2NTUsNyBAQAogCX0KIAluZXducC0+b3B0CSAgPSBOVUxMOwogCW5ld25wLT5tY2FzdF9vaWYgID0gaW5ldDZfaWlmKHNrYik7Ci0JbmV3bnAtPm1jYXN0X2hvcHMgPSBza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQ7CisJbmV3bnAtPm1jYXN0X2hvcHMgPSBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQ7CiAKIAkvKgogCSAqIENsb25lIG5hdGl2ZSBJUHY2IG9wdGlvbnMgZnJvbSBsaXN0ZW5pbmcgc29ja2V0IChpZiBhbnkpCkBAIC04MjYsOCArODI4LDggQEAKIAkJZ290byBkaXNjYXJkX2l0OwogCiAJLyogU3RlcCAxOiBJZiBoZWFkZXIgY2hlY2tzdW0gaXMgaW5jb3JyZWN0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuLiAqLwotCWlmIChkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCSAgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyKSkgeworCWlmIChkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCSAgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyKSkgewogCQlEQ0NQX1dBUk4oImRyb3BwZWQgcGFja2V0IHdpdGggaW52YWxpZCBjaGVja3N1bVxuIik7CiAJCWdvdG8gZGlzY2FyZF9pdDsKIAl9CkBAIC04NDQsOSArODQ2LDkgQEAKIAogCS8qIFN0ZXAgMjoKIAkgKglMb29rIHVwIGZsb3cgSUQgaW4gdGFibGUgYW5kIGdldCBjb3JyZXNwb25kaW5nIHNvY2tldCAqLwotCXNrID0gX19pbmV0Nl9sb29rdXAoJmRjY3BfaGFzaGluZm8sICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwlzayA9IF9faW5ldDZfbG9va3VwKCZkY2NwX2hhc2hpbmZvLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkgICAgZGgtPmRjY3BoX3Nwb3J0LAotCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwgbnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSwKKwkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIG50b2hzKGRoLT5kY2NwaF9kcG9ydCksCiAJCQkgICAgaW5ldDZfaWlmKHNrYikpOwogCS8qCiAJICogU3RlcCAyOgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvbWluaXNvY2tzLmMgYi9uZXQvZGNjcC9taW5pc29ja3MuYwppbmRleCA2ZDIzNWIzLi5lMThlMjQ5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9taW5pc29ja3MuYworKysgYi9uZXQvZGNjcC9taW5pc29ja3MuYwpAQCAtMjcsNyArMjcsNyBAQAogc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93IGRjY3BfZGVhdGhfcm93ID0gewogCS5zeXNjdGxfbWF4X3R3X2J1Y2tldHMgPSBOUl9GSUxFICogMiwKIAkucGVyaW9kCQk9IERDQ1BfVElNRVdBSVRfTEVOIC8gSU5FVF9UV0RSX1RXS0lMTF9TTE9UUywKLQkuZGVhdGhfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkuZGVhdGhfbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRjY3BfZGVhdGhfcm93LmRlYXRoX2xvY2spLAogCS5oYXNoaW5mbwk9ICZkY2NwX2hhc2hpbmZvLAogCS50d190aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl9oYW5nbWFuLCAwLAogCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJmRjY3BfZGVhdGhfcm93KSwKZGlmZiAtLWdpdCBhL25ldC9kY2NwL29wdGlvbnMuYyBiL25ldC9kY2NwL29wdGlvbnMuYwppbmRleCBjYTEzZjc3Li4zNGQ1MzZkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vcHRpb25zLmMKKysrIGIvbmV0L2RjY3Avb3B0aW9ucy5jCkBAIC0yOSw4ICsyOSw2IEBACiBpbnQgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX2Fja192ZWN0b3IgPSBEQ0NQRl9JTklUSUFMX1NFTkRfQUNLX1ZFQ1RPUjsKIGludCBzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50ICA9IERDQ1BGX0lOSVRJQUxfU0VORF9ORFBfQ09VTlQ7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93KTsKLQogdm9pZCBkY2NwX21pbmlzb2NrX2luaXQoc3RydWN0IGRjY3BfbWluaXNvY2sgKmRtc2spCiB7CiAJZG1zay0+ZGNjcG1zX3NlcXVlbmNlX3dpbmRvdyA9IHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93OwpAQCAtMTc0LDIxICsxNzIsMjUgQEAKIAkJCW9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8gPSBudG9obCgqKF9fYmUzMiAqKXZhbHVlKTsKIAogCQkJZGNjcF9wcl9kZWJ1ZygiJXMgcnggb3B0OiBUSU1FU1RBTVBfRUNITz0ldSwgbGVuPSVkLCAiCi0JCQkJICAgICAgImFja25vPSVsbHUsICIsICBkY2NwX3JvbGUoc2spLAorCQkJCSAgICAgICJhY2tubz0lbGx1IiwgZGNjcF9yb2xlKHNrKSwKIAkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvLAogCQkJCSAgICAgIGxlbiArIDIsCiAJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQkgICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKIAogCi0JCQlpZiAobGVuID09IDQpCisJCQlpZiAobGVuID09IDQpIHsKKwkJCQlkY2NwX3ByX2RlYnVnX2NhdCgiXG4iKTsKIAkJCQlicmVhazsKKwkJCX0KIAogCQkJaWYgKGxlbiA9PSA2KQogCQkJCWVsYXBzZWRfdGltZSA9IG50b2hzKCooX19iZTE2ICopKHZhbHVlICsgNCkpOwogCQkJZWxzZQogCQkJCWVsYXBzZWRfdGltZSA9IG50b2hsKCooX19iZTMyICopKHZhbHVlICsgNCkpOwogCisJCQlkY2NwX3ByX2RlYnVnX2NhdCgiLCBFTEFQU0VEX1RJTUU9JWRcbiIsIGVsYXBzZWRfdGltZSk7CisKIAkJCS8qIEdpdmUgcHJlY2VkZW5jZSB0byB0aGUgYmlnZ2VzdCBFTEFQU0VEX1RJTUUgKi8KIAkJCWlmIChlbGFwc2VkX3RpbWUgPiBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkKIAkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9IGVsYXBzZWRfdGltZTsKQEAgLTU2NSw2ICs1NjcsMTQgQEAKIAkgICAgZGNjcF9pbnNlcnRfb3B0aW9uc19mZWF0KHNrLCBza2IpKQogCQlyZXR1cm4gLTE7CiAKKwkvKgorCSAqIE9idGFpbiBSVFQgc2FtcGxlIGZyb20gUmVxdWVzdC9SZXNwb25zZSBleGNoYW5nZS4KKwkgKiBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGluIENDSUQgMyBpbml0aWFsaXNhdGlvbi4KKwkgKi8KKwlpZiAoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUICYmCisJICAgIGRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXAoc2ssIHNrYikpCisJCXJldHVybiAtMTsKKwogCS8qIFhYWDogaW5zZXJ0IG90aGVyIG9wdGlvbnMgd2hlbiBhcHByb3ByaWF0ZSAqLwogCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX29wdF9sZW4gIT0gMCkgewpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3V0cHV0LmMgYi9uZXQvZGNjcC9vdXRwdXQuYwppbmRleCBhYTIxY2M0Li5jOGQ4NDNlIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vdXRwdXQuYworKysgYi9uZXQvZGNjcC9vdXRwdXQuYwpAQCAtMTk0LDYgKzE5NCw3IEBACiAJCXJjID0gY2NpZF9oY190eF9zZW5kX3BhY2tldChkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYik7CiAJCWlmIChyYyA8PSAwKQogCQkJYnJlYWs7CisJCWRjY3BfcHJfZGVidWcoImRlbGF5ZWQgc2VuZCBieSAlZCBtc2VjXG4iLCByYyk7CiAJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyhyYyk7CiAJCXNrLT5za193cml0ZV9wZW5kaW5nKys7CiAJCXJlbGVhc2Vfc29jayhzayk7CkBAIC0yNTUsNyArMjU2LDcgQEAKIAkJCQlEQ0NQX0JVRygiZXJyPSVkIGFmdGVyIGNjaWRfaGNfdHhfcGFja2V0X3NlbnQiLAogCQkJCQkgZXJyKTsKIAkJfSBlbHNlIHsKLQkJCWRjY3BfcHJfZGVidWcoInBhY2tldCBkaXNjYXJkZWRcbiIpOworCQkJZGNjcF9wcl9kZWJ1ZygicGFja2V0IGRpc2NhcmRlZCBkdWUgdG8gZXJyPSVkXG4iLCBlcnIpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm9iZS5jIGIvbmV0L2RjY3AvcHJvYmUuYwppbmRleCAzYjFmNTA5Li4xZjVlM2JhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm9iZS5jCisrKyBiL25ldC9kY2NwL3Byb2JlLmMKQEAgLTkwLDE1ICs5MCwxOCBAQAogCWlmIChwb3J0ID09IDAgfHwgbnRvaHMoaW5ldC0+ZHBvcnQpID09IHBvcnQgfHwKIAkgICAgbnRvaHMoaW5ldC0+c3BvcnQpID09IHBvcnQpIHsKIAkJaWYgKGhjdHgpCi0JCQlwcmludGwoIiVkLiVkLiVkLiVkOiV1ICVkLiVkLiVkLiVkOiV1ICVkICVkICVkICVkICVkXG4iLAotCQkJICAgTklQUVVBRChpbmV0LT5zYWRkciksIG50b2hzKGluZXQtPnNwb3J0KSwKLQkJCSAgIE5JUFFVQUQoaW5ldC0+ZGFkZHIpLCBudG9ocyhpbmV0LT5kcG9ydCksIHNpemUsCi0JCQkgICBoY3R4LT5jY2lkM2hjdHhfcywgaGN0eC0+Y2NpZDNoY3R4X3J0dCwKLQkJCSAgIGhjdHgtPmNjaWQzaGN0eF9wLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOworCQkJcHJpbnRsKCIlZC4lZC4lZC4lZDoldSAlZC4lZC4lZC4lZDoldSAlZCAlZCAlZCAlZCAldSAiCisJCQkgICAgICAgIiVsbHUgJWxsdSAlZFxuIiwKKwkJCSAgICAgICBOSVBRVUFEKGluZXQtPnNhZGRyKSwgbnRvaHMoaW5ldC0+c3BvcnQpLAorCQkJICAgICAgIE5JUFFVQUQoaW5ldC0+ZGFkZHIpLCBudG9ocyhpbmV0LT5kcG9ydCksIHNpemUsCisJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3MsIGhjdHgtPmNjaWQzaGN0eF9ydHQsCisJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3AsIGhjdHgtPmNjaWQzaGN0eF94X2NhbGMsCisJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PiA2LAorCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF94ID4+IDYsIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7CiAJCWVsc2UKIAkJCXByaW50bCgiJWQuJWQuJWQuJWQ6JXUgJWQuJWQuJWQuJWQ6JXUgJWRcbiIsCi0JCQkgICBOSVBRVUFEKGluZXQtPnNhZGRyKSwgbnRvaHMoaW5ldC0+c3BvcnQpLAotCQkJICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwgc2l6ZSk7CisJCQkgICAgICAgTklQUVVBRChpbmV0LT5zYWRkciksIG50b2hzKGluZXQtPnNwb3J0KSwKKwkJCSAgICAgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLCBzaXplKTsKIAl9CiAKIAlqcHJvYmVfcmV0dXJuKCk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwppbmRleCBjNjU2OGQ2Li5hMjA1ZWFhIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKQEAgLTI0MTMsNiArMjQxMyw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZGVjbmV0X2V4aXQodm9pZCkKIHsKIAlzb2NrX3VucmVnaXN0ZXIoQUZfREVDbmV0KTsKKwlydG5sX3VucmVnaXN0ZXJfYWxsKFBGX0RFQ25ldCk7CiAJZGV2X3JlbW92ZV9wYWNrKCZkbl9kaXhfcGFja2V0X3R5cGUpOwogCiAJZG5fdW5yZWdpc3Rlcl9zeXNjdGwoKTsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fZGV2LmMgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCmluZGV4IDA2MGQ3MjUuLjVjMmE5OTUgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fZGV2LmMKKysrIGIvbmV0L2RlY25ldC9kbl9kZXYuYwpAQCAtNzk5LDcgKzc5OSw2IEBACiAJc2tpcF9uZGV2cyA9IGNiLT5hcmdzWzBdOwogCXNraXBfbmFkZHIgPSBjYi0+YXJnc1sxXTsKIAotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJZm9yIChkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CiAJCWlmIChpZHggPCBza2lwX25kZXZzKQogCQkJY29udGludWU7CkBAIC04MjQsOCArODIzLDYgQEAKIAkJfQogCX0KIGRvbmU6Ci0JcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwotCiAJY2ItPmFyZ3NbMF0gPSBpZHg7CiAJY2ItPmFyZ3NbMV0gPSBkbl9pZHg7CiAKQEAgLTkxMyw3ICs5MTAsNyBAQAogCXBrdGxlbiA9IChfX2xlMTYgKilza2JfcHVzaChza2IsMik7CiAJKnBrdGxlbiA9IGRuX2h0b25zKHNrYi0+bGVuIC0gMik7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWRuX3J0X2ZpbmlzaF9vdXRwdXQoc2tiLCBkbl9ydF9hbGxfcnRfbWNhc3QsIG1zZy0+aWQpOwogfQpAQCAtMTAwNSw3ICsxMDAyLDcgQEAKIAlwa3RsZW4gPSAoX19sZTE2ICopc2tiX3B1c2goc2tiLCAyKTsKIAkqcGt0bGVuID0gZG5faHRvbnMoc2tiLT5sZW4gLSAyKTsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJaWYgKGRuX2FtX2lfYV9yb3V0ZXIoZG4sIGRuX2RiLCBpZmEpKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKQEAgLTE0NDcsMjQgKzE0NDQsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAotc3RhdGljIHN0cnVjdCBydG5ldGxpbmtfbGluayBkbmV0X3J0bmV0bGlua190YWJsZVtSVE1fTlJfTVNHVFlQRVNdID0KLXsKLQlbUlRNX05FV0FERFIgIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX25sX25ld2FkZHIsCX0sCi0JW1JUTV9ERUxBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9ubF9kZWxhZGRyLAl9LAotCVtSVE1fR0VUQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQJPSBkbl9ubF9kdW1wX2lmYWRkciwJfSwKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFUgotCVtSVE1fTkVXUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fZmliX3J0bV9uZXdyb3V0ZSwJfSwKLQlbUlRNX0RFTFJPVVRFIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX2ZpYl9ydG1fZGVscm91dGUsCX0sCi0JW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9jYWNoZV9nZXRyb3V0ZSwKLQkJCQkgICAgICAuZHVtcGl0CT0gZG5fZmliX2R1bXAsCQl9LAotCVtSVE1fR0VUUlVMRSAgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQJPSBkbl9maWJfZHVtcF9ydWxlcywJfSwKLSNlbHNlCi0JW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9jYWNoZV9nZXRyb3V0ZSwKLQkJCQkgICAgICAuZHVtcGl0CT0gZG5fY2FjaGVfZHVtcCwJfSwKLSNlbmRpZgotCi19OwotCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgYWRkclsyXTsKIG1vZHVsZV9wYXJhbV9hcnJheShhZGRyLCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhZGRyLCAiVGhlIERFQ25ldCBhZGRyZXNzIG9mIHRoaXMgbWFjaGluZTogYXJlYSxub2RlIik7CkBAIC0xNDg1LDcgKzE0NjQsOSBAQAogCiAJZG5fZGV2X2RldmljZXNfb24oKTsKIAotCXJ0bmV0bGlua19saW5rc1tQRl9ERUNuZXRdID0gZG5ldF9ydG5ldGxpbmtfdGFibGU7CisJcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9ORVdBRERSLCBkbl9ubF9uZXdhZGRyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0RFTEFERFIsIGRuX25sX2RlbGFkZHIsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fR0VUQUREUiwgTlVMTCwgZG5fbmxfZHVtcF9pZmFkZHIpOwogCiAJcHJvY19uZXRfZm9wc19jcmVhdGUoImRlY25ldF9kZXYiLCBTX0lSVUdPLCAmZG5fZGV2X3NlcV9mb3BzKTsKIApAQCAtMTUwMCw4ICsxNDgxLDYgQEAKIAogdm9pZCBfX2V4aXQgZG5fZGV2X2NsZWFudXAodm9pZCkKIHsKLQlydG5ldGxpbmtfbGlua3NbUEZfREVDbmV0XSA9IE5VTEw7Ci0KICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJewogCQlpbnQgaTsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fZmliLmMgYi9uZXQvZGVjbmV0L2RuX2ZpYi5jCmluZGV4IDgyZDU4YTkuLjMxMGE4NjIgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fZmliLmMKKysrIGIvbmV0L2RlY25ldC9kbl9maWIuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkbl9maWJfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRuX2ZpYl9ydG1fZGVscm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKIAlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOwpAQCAtNTIwLDcgKzUyMCw3IEBACiAJcmV0dXJuIC1FU1JDSDsKIH0KIAotaW50IGRuX2ZpYl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZG5fZmliX3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkbl9maWJfdGFibGUgKnRiOwogCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CkBAIC03NDgsMTEgKzc0OCwxMyBAQAogCiB2b2lkIF9faW5pdCBkbl9maWJfaW5pdCh2b2lkKQogewotCiAJZG5fZmliX3RhYmxlX2luaXQoKTsKIAlkbl9maWJfcnVsZXNfaW5pdCgpOwogCiAJcmVnaXN0ZXJfZG5hZGRyX25vdGlmaWVyKCZkbl9maWJfZG5hZGRyX25vdGlmaWVyKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fTkVXUk9VVEUsIGRuX2ZpYl9ydG1fbmV3cm91dGUsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fREVMUk9VVEUsIGRuX2ZpYl9ydG1fZGVscm91dGUsIE5VTEwpOwogfQogCiAKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbmVpZ2guYyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwppbmRleCBiZjcwMWNmLi40YmYwNjZjIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25laWdoLmMKKysrIGIvbmV0L2RlY25ldC9kbl9uZWlnaC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAlscC0+c19jbGFzcyAgPSAwOwogCWxwLT5wdCAgICAgICA9IDA7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCXJldHVybiBORl9IT09LKFBGX0RFQ25ldCwgTkZfRE5fUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIG5laWdoLT5kZXYsIGRuX25laWdoX291dHB1dF9wYWNrZXQpOwogfQpAQCAtMzAwLDcgKzMwMCw3IEBACiAJc3AtPnNyY25vZGUgICAgPSBjYi0+c3JjOwogCXNwLT5mb3J3YXJkICAgID0gY2ItPmhvcHMgJiAweDNmOwogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKIH0KQEAgLTM0Miw3ICszNDIsNyBAQAogCXNwLT5zcmNub2RlICA9IGNiLT5zcmMgJiBkbl9odG9ucygweDAzZmYpOwogCXNwLT5mb3J3YXJkICA9IGNiLT5ob3BzICYgMHgzZjsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrYiwgTlVMTCwgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jIGIvbmV0L2RlY25ldC9kbl9uc3BfaW4uYwppbmRleCA5ZDIwOTA0Li40MDc0YTZlIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKQEAgLTM2Miw3ICszNjIsOCBAQAogCQkJdTE2IGRsZW4gPSAqc2tiLT5kYXRhOwogCQkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKIAkJCQlzY3AtPmNvbm5kYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoZGxlbik7Ci0JCQkJbWVtY3B5KHNjcC0+Y29ubmRhdGFfaW4ub3B0X2RhdGEsIHNrYi0+ZGF0YSArIDEsIGRsZW4pOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMSwKKwkJCQkJICAgICAgc2NwLT5jb25uZGF0YV9pbi5vcHRfZGF0YSwgZGxlbik7CiAJCQl9CiAJCX0KIAkJZG5fbnNwX3NlbmRfbGluayhzaywgRE5fTk9DSEFOR0UsIDApOwpAQCAtNDA2LDcgKzQwNyw3IEBACiAJCXUxNiBkbGVuID0gKnNrYi0+ZGF0YTsKIAkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKIAkJCXNjcC0+ZGlzY2RhdGFfaW4ub3B0X29wdGwgPSBkbl9odG9ucyhkbGVuKTsKLQkJCW1lbWNweShzY3AtPmRpc2NkYXRhX2luLm9wdF9kYXRhLCBza2ItPmRhdGEgKyAxLCBkbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMSwgc2NwLT5kaXNjZGF0YV9pbi5vcHRfZGF0YSwgZGxlbik7CiAJCX0KIAl9CiAKQEAgLTcyNSw3ICs3MjYsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDIpKQogCQlnb3RvIGZyZWVfb3V0OwogCi0Jc2tiLT5oLnJhdyAgICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWNiLT5uc3BfZmxhZ3MgPSAqcHRyKys7CiAKIAlpZiAoZGVjbmV0X2RlYnVnX2xldmVsICYgMikKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKaW5kZXggMmQyY2RhOC4uNzQwNDY1MyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKKysrIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJc3RydWN0IGZsb3dpIGZsOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXNjcC0+c3RhbXAgPSBqaWZmaWVzOwogCiAJZHN0ID0gc2tfZHN0X2NoZWNrKHNrLCAwKTsKQEAgLTY4MSw4ICs2ODEsMTAgQEAKIAlpZiAoc2NwLT5wZWVyLnNkbl9vYmpudW0pCiAJCXR5cGUgPSAwOwogCi0Jc2tiX3B1dChza2IsIGRuX3NvY2thZGRyMnVzZXJuYW1lKCZzY3AtPnBlZXIsIHNrYi0+dGFpbCwgdHlwZSkpOwotCXNrYl9wdXQoc2tiLCBkbl9zb2NrYWRkcjJ1c2VybmFtZSgmc2NwLT5hZGRyLCBza2ItPnRhaWwsIDIpKTsKKwlza2JfcHV0KHNrYiwgZG5fc29ja2FkZHIydXNlcm5hbWUoJnNjcC0+cGVlciwKKwkJCQkJICBza2JfdGFpbF9wb2ludGVyKHNrYiksIHR5cGUpKTsKKwlza2JfcHV0KHNrYiwgZG5fc29ja2FkZHIydXNlcm5hbWUoJnNjcC0+YWRkciwKKwkJCQkJICBza2JfdGFpbF9wb2ludGVyKHNrYiksIDIpKTsKIAogCW1lbnV2ZXIgPSBETl9NRU5VVkVSX0FDQyB8IEROX01FTlVWRVJfVVNSOwogCWlmIChzY3AtPnBlZXIuc2RuX2ZsYWdzICYgU0RGX1BST1hZKQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCmluZGV4IGMxYjU1MDIuLjVkNzMzN2IgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcm91dGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKQEAgLTc3LDYgKzc3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CkBAIC0zODYsNyArMzg3LDcgQEAKIAlfX2xlMTYgdG1wOwogCiAJLyogQWRkIGJhY2sgaGVhZGVycyAqLwotCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJaWYgKChza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CkBAIC00MjUsNyArNDI2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHRtcFtFVEhfQUxFTl07CiAKIAkvKiBBZGQgYmFjayBhbGwgaGVhZGVycyAqLwotCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJaWYgKChza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CkBAIC01MDQsNyArNTA1LDcgQEAKIAkJZ290byBkcm9wX2l0OwogCiAJc2tiX3B1bGwoc2tiLCAyMCk7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJLyogRGVzdGluYXRpb24gaW5mbyAqLwogCXB0ciArPSAyOwpAQCAtNTQyLDcgKzU0Myw3IEBACiAJCWdvdG8gZHJvcF9pdDsKIAogCXNrYl9wdWxsKHNrYiwgNSk7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJY2ItPmRzdCA9ICooX19sZTE2ICopcHRyOwogCXB0ciArPSAyOwpAQCAtNjE1LDcgKzYxNiw3IEBACiAJCWZsYWdzID0gKnNrYi0+ZGF0YTsKIAl9CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCS8qCiAJICogV2VlZCBvdXQgZnV0dXJlIHZlcnNpb24gREVDbmV0CkBAIC0xNDY4LDcgKzE0NjksNyBAQAogCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSAoc3RydWN0IGRuX3JvdXRlICopc2tiLT5kc3Q7CiAJc3RydWN0IHJ0bXNnICpyOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlsb25nIGV4cGlyZXM7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKQEAgLTE1MDksMTkgKzE1MTAsMTkgQEAKIAlpZiAocnQtPmZsLmlpZikKIAkJUlRBX1BVVChza2IsIFJUQV9JSUYsIHNpemVvZihpbnQpLCAmcnQtPmZsLmlpZik7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogbmxtc2dfZmFpbHVyZToKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIAogLyoKICAqIFRoaXMgaXMgY2FsbGVkIGJ5IGJvdGggZW5kbm9kZXMgYW5kIHJvdXRlcnMgbm93LgogICovCi1pbnQgZG5fY2FjaGVfZ2V0cm91dGUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZG5fY2FjaGVfZ2V0cm91dGUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOwogCXN0cnVjdCBydG1zZyAqcnRtID0gTkxNU0dfREFUQShubGgpOwpAQCAtMTUzNyw3ICsxNTM4LDcgQEAKIAlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9CVUZTOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCWNiID0gRE5fU0tCX0NCKHNrYik7CiAKIAlpZiAocnRhW1JUQV9TUkMtMV0pCkBAIC0xODEyLDYgKzE4MTMsMTMgQEAKIAlkbl9kc3Rfb3BzLmdjX3RocmVzaCA9IChkbl9ydF9oYXNoX21hc2sgKyAxKTsKIAogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJkZWNuZXRfY2FjaGUiLCBTX0lSVUdPLCAmZG5fcnRfY2FjaGVfc2VxX2ZvcHMpOworCisjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0dFVFJPVVRFLCBkbl9jYWNoZV9nZXRyb3V0ZSwgZG5fZmliX2R1bXApOworI2Vsc2UKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0dFVFJPVVRFLCBkbl9jYWNoZV9nZXRyb3V0ZSwKKwkJICAgICAgZG5fY2FjaGVfZHVtcCk7CisjZW5kaWYKIH0KIAogdm9pZCBfX2V4aXQgZG5fcm91dGVfY2xlYW51cCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCmluZGV4IDVlODZkZDUuLjE3YTE5MzIgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYworKysgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxuZXQvZG5fZmliLmg+CiAjaW5jbHVkZSA8bmV0L2RuX25laWdoLmg+CiAjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgogCiBzdGF0aWMgc3RydWN0IGZpYl9ydWxlc19vcHMgZG5fZmliX3J1bGVzX29wczsKIApAQCAtMjM5LDkgKzI0MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkbl9maWJfZHVtcF9ydWxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgdm9pZCBkbl9maWJfcnVsZV9mbHVzaF9jYWNoZSh2b2lkKQogewotCXJldHVybiBmaWJfcnVsZXNfZHVtcChza2IsIGNiLCBBRl9ERUNuZXQpOworCWRuX3J0X2NhY2hlX2ZsdXNoKC0xKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWJfcnVsZXNfb3BzIGRuX2ZpYl9ydWxlc19vcHMgPSB7CkBAIC0yNTQsNiArMjU1LDcgQEAKIAkuY29tcGFyZQk9IGRuX2ZpYl9ydWxlX2NvbXBhcmUsCiAJLmZpbGwJCT0gZG5fZmliX3J1bGVfZmlsbCwKIAkuZGVmYXVsdF9wcmVmCT0gZG5fZmliX3J1bGVfZGVmYXVsdF9wcmVmLAorCS5mbHVzaF9jYWNoZQk9IGRuX2ZpYl9ydWxlX2ZsdXNoX2NhY2hlLAogCS5ubGdyb3VwCT0gUlROTEdSUF9ERUNuZXRfUlVMRSwKIAkucG9saWN5CQk9IGRuX2ZpYl9ydWxlX3BvbGljeSwKIAkucnVsZXNfbGlzdAk9ICZkbl9maWJfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3RhYmxlLmMgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKaW5kZXggNzgwYTE0MWYuLmQ2NjE1YzkgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fdGFibGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+IC8qIFJURl94eHggKi8KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CkBAIC0yOTUsNyArMjk2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRtc2cgKnJ0bTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqcnRtKSwgZmxhZ3MpOwogCXJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKQEAgLTMzNywxOSArMzM4LDE5IEBACiAJCQluaHAtPnJ0bmhfaWZpbmRleCA9IG5oLT5uaF9vaWY7CiAJCQlpZiAobmgtPm5oX2d3KQogCQkJCVJUQV9QVVQoc2tiLCBSVEFfR0FURVdBWSwgMiwgJm5oLT5uaF9ndyk7Ci0JCQluaHAtPnJ0bmhfbGVuID0gc2tiLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKiluaHA7CisJCQluaHAtPnJ0bmhfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHVuc2lnbmVkIGNoYXIgKiluaHA7CiAJCX0gZW5kZm9yX25leHRob3BzKGZpKTsKIAkJbXBfaGVhZC0+cnRhX3R5cGUgPSBSVEFfTVVMVElQQVRIOwotCQltcF9oZWFkLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KiltcF9oZWFkOworCQltcF9oZWFkLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopbXBfaGVhZDsKIAl9CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYyBiL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMKaW5kZXggMGU2MmRlZi4uNjk2MjM0NiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYworKysgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCkBAIC0zMyw3ICszMyw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWw7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJdW5zaWduZWQgY2hhciAqcHRyOwogCXN0cnVjdCBuZl9kbl9ydG1zZyAqcnRtOwpAQCAtNDgsNyArNDgsNyBAQAogCXJ0bSA9IChzdHJ1Y3QgbmZfZG5fcnRtc2cgKilOTE1TR19EQVRBKG5saCk7CiAJcnRtLT5uZmRuX2lmaW5kZXggPSBydF9za2ItPmRldi0+aWZpbmRleDsKIAlwdHIgPSBORkROX1JUTVNHKHJ0bSk7Ci0JbWVtY3B5KHB0ciwgcnRfc2tiLT5kYXRhLCBydF9za2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShydF9za2IsIHB0ciwgcnRfc2tiLT5sZW4pOwogCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gb2xkX3RhaWw7CiAJcmV0dXJuIHNrYjsKIApAQCAtMTAyLDcgKzEwMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkbnJtZ19yZWNlaXZlX3VzZXJfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gbmxtc2dfaGRyKHNrYik7CiAKIAlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKIAkJcmV0dXJuOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJaW50IHJ2ID0gMDsKIAogCWRucm1nID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfRE5SVE1TRywgRE5STkdfTkxHUlBfTUFYLAotCQkJCSAgICAgIGRucm1nX3JlY2VpdmVfdXNlcl9zaywgVEhJU19NT0RVTEUpOworCQkJCSAgICAgIGRucm1nX3JlY2VpdmVfdXNlcl9zaywgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmIChkbnJtZyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZG5fcnRtc2c6IENhbm5vdCBjcmVhdGUgbmV0bGluayBzb2NrZXQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jIGIvbmV0L2Vjb25ldC9hZl9lY29uZXQuYwppbmRleCBiYzEyZTM2Li5iNTUyNGYzIDEwMDY0NAotLS0gYS9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCisrKyBiL25ldC9lY29uZXQvYWZfZWNvbmV0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWVyciA9IG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjb3BpZWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7Ci0Jc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmc2stPnNrX3N0YW1wKTsKKwlzay0+c2tfc3RhbXAgPSBza2ItPnRzdGFtcDsKIAogCWlmIChtc2ctPm1zZ19uYW1lKQogCQltZW1jcHkobXNnLT5tc2dfbmFtZSwgc2tiLT5jYiwgbXNnLT5tc2dfbmFtZWxlbik7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAkJCWdvdG8gb3V0X3VubG9jazsKIAogCQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkJZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogCQkJZmgtPmNiID0gY2I7CiAJCQlmaC0+cG9ydCA9IHBvcnQ7CiAJCQlpZiAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNKSB7Ci0JCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhOworCQkJCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKIAkJCQlza2ItPmxlbiA9IDA7CiAJCQl9IGVsc2UgaWYgKHJlcyA8IDApCiAJCQkJZ290byBvdXRfZnJlZTsKQEAgLTcyNyw2ICs3MjcsOSBAQAogCQljYXNlIFNJT0NHU1RBTVA6CiAJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKIAorCQljYXNlIFNJT0NHU1RBTVBOUzoKKwkJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisKIAkJY2FzZSBTSU9DU0lGQUREUjoKIAkJY2FzZSBTSU9DR0lGQUREUjoKIAkJCXJldHVybiBlY19kZXZfaW9jdGwoc29jaywgY21kLCBhcmdwKTsKQEAgLTg0NSw3ICs4NDgsNyBAQAogCiBzdGF0aWMgdm9pZCBhdW5faW5jb21pbmcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGF1bmhkciAqYWgsIHNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXAgPSBpcF9oZHIoc2tiKTsKIAl1bnNpZ25lZCBjaGFyIHN0biA9IG50b2hsKGlwLT5zYWRkcikgJiAweGZmOwogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOwpAQCAtOTQwLDEwICs5NDMsMTAgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkFVTjogcmVjdmZyb20oKSBlcnJvciAlZFxuIiwgLWVycik7CiAJfQogCi0JZGF0YSA9IHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJZGF0YSA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CiAJYWggPSAoc3RydWN0IGF1bmhkciAqKWRhdGE7CiAJbGVuID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaXAgPSBza2ItPm5oLmlwaDsKKwlpcCA9IGlwX2hkcihza2IpOwogCiAJc3dpdGNoIChhaC0+Y29kZSkKIAl7CmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggNzM5MWY1NS4uMGFjMjUyNCAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCisrKyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtMTU2LDcgKzE1Niw4IEBACiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKIAlldGggPSBldGhfaGRyKHNrYik7CiAKQEAgLTIyOCw3ICsyMjksNyBAQAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopCiAJICAgICgoKHU4ICopIGhoLT5oaF9kYXRhKSArIChISF9EQVRBX09GRihzaXplb2YoKmV0aCkpKSk7CiAKLQlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKSkKKwlpZiAodHlwZSA9PSBodG9ucyhFVEhfUF84MDJfMykpCiAJCXJldHVybiAtMTsKIAogCWV0aC0+aF9wcm90byA9IHR5cGU7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL0tjb25maWcgYi9uZXQvaWVlZTgwMjExL0tjb25maWcKaW5kZXggNmVmNzY2ZS4uMTQzOGFkZWQgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvS2NvbmZpZworKysgYi9uZXQvaWVlZTgwMjExL0tjb25maWcKQEAgLTU2LDcgKzU2LDggQEAKIAogY29uZmlnIElFRUU4MDIxMV9DUllQVF9US0lQCiAJdHJpc3RhdGUgIklFRUUgODAyLjExaSBUS0lQIGVuY3J5cHRpb24iCi0JZGVwZW5kcyBvbiBJRUVFODAyMTEgJiYgTkVUX1JBRElPCisJZGVwZW5kcyBvbiBJRUVFODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IENSWVBUTwogCXNlbGVjdCBDUllQVE9fTUlDSEFFTF9NSUMKIAlzZWxlY3QgQ1JZUFRPX0VDQgpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCBlYzZkODg1Li40ZWIzNTA3IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCXJldHVybiAtMTsKIAogCS8qIENvcHkgdGhlIElWIGludG8gdGhlIGZpcnN0IDMgYnl0ZXMgb2YgdGhlIGtleSAqLwotCW1lbWNweShrZXksIHNrYi0+ZGF0YSArIGhkcl9sZW4sIDMpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgaGRyX2xlbiwga2V5LCAzKTsKIAogCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLwogCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDQwODQ5MDkuLjZhZTAzNmIgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtNDIsNyArNDIsNyBAQAogCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKIAogCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKIAlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxMV9SQVcpOwpAQCAtNjA2LDEyICs2MDYsMTIgQEAKIAkJaWYgKGZyYWcgPT0gMCkgewogCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bwogCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KLQkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgZmxlbik7CiAJCX0gZWxzZSB7CiAJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAogCQkJICogY2FjaGUgc2tiICovCi0JCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKLQkJCSAgICAgICBmbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgaGRybGVuLAorCQkJCSAgICAgIHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBmbGVuKTsKIAkJfQogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlza2IgPSBOVUxMOwpAQCAtNzU5LDggKzc1OSw5IEBACiAJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJiBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CiAJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCiAJCSAqIHRoZSBwYXlsb2FkICovCi0JCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKLQkJICAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgRVRIX0FMRU4sCisJCQkJCSAgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiAtIEVUSF9BTEVOLAorCQkJCQkgICAgICAgRVRIX0FMRU4pOwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gRVRIX0FMRU4pOwogCX0KICNlbmRpZgpAQCAtNzg5LDEwICs3OTAsMTEgQEAKIAogCWlmIChza2IyICE9IE5VTEwpIHsKIAkJLyogc2VuZCB0byB3aXJlbGVzcyBtZWRpYSAqLwotCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOwotCQlza2IyLT5tYWMucmF3ID0gc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKLQkJLyogc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YSArIEVUSF9ITEVOOyAqLwogCQlza2IyLT5kZXYgPSBkZXY7CisJCXNrYjItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMyk7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYjIpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CisJCS8qIHNrYjItPm5ldHdvcmtfaGVhZGVyICs9IEVUSF9ITEVOOyAqLwogCQlkZXZfcXVldWVfeG1pdChza2IyKTsKIAl9CiAjZW5kaWYKQEAgLTgwMCw3ICs4MDIsNiBAQAogCWlmIChza2IpIHsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CS8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KIAkJaWYgKG5ldGlmX3J4KHNrYikgPT0gTkVUX1JYX0RST1ApIHsKIAkJCS8qIG5ldGlmX3J4IGFsd2F5cyBzdWNjZWVkcywgYnV0IGl0IG1pZ2h0IGRyb3AKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDAyOTJkNjMuLmE0YzNjNTEgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMjI1LDEwICsyMjUsMTAgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwOwogCiAJZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0JaWYgKGV0aC0+aF9wcm90byAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkKKwlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKIAkJcmV0dXJuIDA7CiAKLQlpcCA9IHNrYi0+bmguaXBoOworCWlwID0gaXBfaGRyKHNrYik7CiAJc3dpdGNoIChpcC0+dG9zICYgMHhmYykgewogCWNhc2UgMHgyMDoKIAkJcmV0dXJuIDI7CkBAIC0zMDksOCArMzA5LDggQEAKIAl9CiAKIAkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCi0JbWVtY3B5KGRlc3QsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOwotCW1lbWNweShzcmMsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRlc3QsIEVUSF9BTEVOKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIEVUSF9BTEVOLCBzcmMsIEVUSF9BTEVOKTsKIAogCWlmIChob3N0X2VuY3J5cHQgfHwgaG9zdF9idWlsZF9pdikKIAkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBIHwKQEAgLTM2Myw3ICszNjMsNyBAQAogCQlzbmFwcGVkID0gMTsKIAkJaWVlZTgwMjExX2NvcHlfc25hcChza2JfcHV0KHNrYl9uZXcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwKIAkJCQkgICAgZXRoZXJfdHlwZSk7Ci0JCW1lbWNweShza2JfcHV0KHNrYl9uZXcsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYl9uZXcsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOwogCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUoc2tiX25ldywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOwogCQlpZiAocmVzIDwgMCkgewogCQkJSUVFRTgwMjExX0VSUk9SKCJtc2R1IGVuY3J5cHRpb24gZmFpbGVkXG4iKTsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CiAJCX0KIAotCQltZW1jcHkoc2tiX3B1dChza2JfZnJhZywgYnl0ZXMpLCBza2ItPmRhdGEsIGJ5dGVzKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgYnl0ZXMpOwogCiAJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLwogCQlza2JfcHVsbChza2IsIGJ5dGVzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L0tjb25maWcgYi9uZXQvaXB2NC9LY29uZmlnCmluZGV4IDllOGVmNTAuLmU2MmFlZTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L0tjb25maWcKKysrIGIvbmV0L2lwdjQvS2NvbmZpZwpAQCAtNTc0LDYgKzU3NCwzMyBAQAogCWxvc3MgcGFja2V0cy4KIAlTZWUgaHR0cDovL3d3dy5udHUuZWR1LnNnL2hvbWU1L1pIT1UwMDIyL3BhcGVycy9DUEZ1MDNhLnBkZgogCitjb25maWcgVENQX0NPTkdfWUVBSAorCXRyaXN0YXRlICJZZUFIIFRDUCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlZZUFILVRDUCBpcyBhIHNlbmRlci1zaWRlIGhpZ2gtc3BlZWQgZW5hYmxlZCBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCisJYWxnb3JpdGhtLCB3aGljaCB1c2VzIGEgbWl4ZWQgbG9zcy9kZWxheSBhcHByb2FjaCB0byBjb21wdXRlIHRoZQorCWNvbmdlc3Rpb24gd2luZG93LiBJdCdzIGRlc2lnbiBnb2FscyB0YXJnZXQgaGlnaCBlZmZpY2llbmN5LAorCWludGVybmFsLCBSVFQgYW5kIFJlbm8gZmFpcm5lc3MsIHJlc2lsaWVuY2UgdG8gbGluayBsb3NzIHdoaWxlCisJa2VlcGluZyBuZXR3b3JrIGVsZW1lbnRzIGxvYWQgYXMgbG93IGFzIHBvc3NpYmxlLgorCisJRm9yIGZ1cnRoZXIgZGV0YWlscyBsb29rIGhlcmU6CisJICBodHRwOi8vd2lsLmNzLmNhbHRlY2guZWR1L3BmbGRuZXQyMDA3L3BhcGVyL1llQUhfVENQLnBkZgorCitjb25maWcgVENQX0NPTkdfSUxMSU5PSVMKKwl0cmlzdGF0ZSAiVENQIElsbGlub2lzIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVRDUC1JbGxpbm9pcyBpcyBhIHNlbmRlci1zaWRlIG1vZGlmaWNhdGlvIG9mIFRDUCBSZW5vIGZvcgorCWhpZ2ggc3BlZWQgbG9uZyBkZWxheSBsaW5rcy4gSXQgdXNlcyByb3VuZC10cmlwLXRpbWUgdG8KKwlhZGp1c3QgdGhlIGFscGhhIGFuZCBiZXRhIHBhcmFtZXRlcnMgdG8gYWNoaWV2ZSBhIGhpZ2hlciBhdmVyYWdlCisJdGhyb3VnaHB1dCBhbmQgbWFpbnRhaW4gZmFpcm5lc3MuCisKKwlGb3IgZnVydGhlciBkZXRhaWxzIHNlZToKKwkgIGh0dHA6Ly93d3cuZXdzLnVpdWMuZWR1L35zaGFvbGl1L3RjcGlsbGlub2lzL2luZGV4Lmh0bWwKKwogY2hvaWNlCiAJcHJvbXB0ICJEZWZhdWx0IFRDUCBjb25nZXN0aW9uIGNvbnRyb2wiCiAJZGVmYXVsdCBERUZBVUxUX0NVQklDCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCmluZGV4IDdhMDY4NjIuLjRmZjZjMTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L01ha2VmaWxlCisrKyBiL25ldC9pcHY0L01ha2VmaWxlCkBAIC00OSw2ICs0OSw4IEBACiBvYmotJChDT05GSUdfVENQX0NPTkdfVkVOTykgKz0gdGNwX3Zlbm8ubwogb2JqLSQoQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFKSArPSB0Y3Bfc2NhbGFibGUubwogb2JqLSQoQ09ORklHX1RDUF9DT05HX0xQKSArPSB0Y3BfbHAubworb2JqLSQoQ09ORklHX1RDUF9DT05HX1lFQUgpICs9IHRjcF95ZWFoLm8KK29iai0kKENPTkZJR19UQ1BfQ09OR19JTExJTk9JUykgKz0gdGNwX2lsbGlub2lzLm8KIG9iai0kKENPTkZJR19ORVRMQUJFTCkgKz0gY2lwc29faXB2NC5vCiAKIG9iai0kKENPTkZJR19YRlJNKSArPSB4ZnJtNF9wb2xpY3kubyB4ZnJtNF9zdGF0ZS5vIHhmcm00X2lucHV0Lm8gXApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IGNmMzU4YzguLjE2YWFlOGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTg3LDYgKzg3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTIxNyw2ICsyMTgsMjYgQEAKIAlyZXR1cm4gZXJyOwogfQogCit1MzIgaW5ldF9laGFzaF9zZWNyZXQgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woaW5ldF9laGFzaF9zZWNyZXQpOworCisvKgorICogaW5ldF9laGFzaF9zZWNyZXQgbXVzdCBiZSBzZXQgZXhhY3RseSBvbmNlCisgKiBJbnN0ZWFkIG9mIHVzaW5nIGEgZGVkaWNhdGVkIHNwaW5sb2NrLCB3ZSAoYWIpdXNlIGluZXRzd19sb2NrCisgKi8KK3ZvaWQgYnVpbGRfZWhhc2hfc2VjcmV0KHZvaWQpCit7CisJdTMyIHJuZDsKKwlkbyB7CisJCWdldF9yYW5kb21fYnl0ZXMoJnJuZCwgc2l6ZW9mKHJuZCkpOworCX0gd2hpbGUgKHJuZCA9PSAwKTsKKwlzcGluX2xvY2tfYmgoJmluZXRzd19sb2NrKTsKKwlpZiAoIWluZXRfZWhhc2hfc2VjcmV0KQorCQlpbmV0X2VoYXNoX3NlY3JldCA9IHJuZDsKKwlzcGluX3VubG9ja19iaCgmaW5ldHN3X2xvY2spOworfQorRVhQT1JUX1NZTUJPTChidWlsZF9laGFzaF9zZWNyZXQpOworCiAvKgogICoJQ3JlYXRlIGFuIGluZXQgc29ja2V0LgogICovCkBAIC0yMzMsNiArMjU0LDExIEBACiAJaW50IHRyeV9sb2FkaW5nX21vZHVsZSA9IDA7CiAJaW50IGVycjsKIAorCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXICYmCisJICAgIHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSAmJgorCSAgICAhaW5ldF9laGFzaF9zZWNyZXQpCisJCWJ1aWxkX2VoYXNoX3NlY3JldCgpOworCiAJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKIAogCS8qIExvb2sgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZS9wcm90b2NvbCBwYWlyLiAqLwpAQCAtNzU1LDYgKzc4MSw5IEBACiAJCWNhc2UgU0lPQ0dTVEFNUDoKIAkJCWVyciA9IHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZyk7CiAJCQlicmVhazsKKwkJY2FzZSBTSU9DR1NUQU1QTlM6CisJCQllcnIgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CiAJCWNhc2UgU0lPQ0FERFJUOgogCQljYXNlIFNJT0NERUxSVDoKIAkJY2FzZSBTSU9DUlRNU0c6CkBAIC0xMTA5LDcgKzExMzgsNyBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXBoKSkpKQogCQlnb3RvIG91dDsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlobCA9IGlwaC0+aWhsICogNDsKIAlpZiAoaWhsIDwgc2l6ZW9mKCppcGgpKQogCQlnb3RvIG91dDsKQEAgLTExMTcsOCArMTE0Niw5IEBACiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaWhsKSkpCiAJCWdvdG8gb3V0OwogCi0Jc2tiLT5oLnJhdyA9IF9fc2tiX3B1bGwoc2tiLCBpaGwpOwotCWlwaCA9IHNrYi0+bmguaXBoOworCV9fc2tiX3B1bGwoc2tiLCBpaGwpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJcHJvdG8gPSBpcGgtPnByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOwogCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiAKQEAgLTExNTIsNyArMTE4Miw3IEBACiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCppcGgpKSkpCiAJCWdvdG8gb3V0OwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWhsID0gaXBoLT5paGwgKiA0OwogCWlmIChpaGwgPCBzaXplb2YoKmlwaCkpCiAJCWdvdG8gb3V0OwpAQCAtMTE2MCw4ICsxMTkwLDkgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBpaGwpKSkKIAkJZ290byBvdXQ7CiAKLQlza2ItPmgucmF3ID0gX19za2JfcHVsbChza2IsIGlobCk7Ci0JaXBoID0gc2tiLT5uaC5pcGg7CisJX19za2JfcHVsbChza2IsIGlobCk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpZCA9IG50b2hzKGlwaC0+aWQpOwogCXByb3RvID0gaXBoLT5wcm90b2NvbCAmIChNQVhfSU5FVF9QUk9UT1MgLSAxKTsKIAlzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKQEAgLTExNzcsMTcgKzEyMDgsNTcgQEAKIAogCXNrYiA9IHNlZ3M7CiAJZG8gewotCQlpcGggPSBza2ItPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKHNrYik7CiAJCWlwaC0+aWQgPSBodG9ucyhpZCsrKTsKIAkJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBza2ItPm1hY19sZW4pOwogCQlpcGgtPmNoZWNrID0gMDsKLQkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bShza2ItPm5oLnJhdywgaXBoLT5paGwpOworCQlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpcGgtPmlobCk7CiAJfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOwogCiBvdXQ6CiAJcmV0dXJuIHNlZ3M7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgc25tcF9mb2xkX2ZpZWxkKHZvaWQgKm1pYltdLCBpbnQgb2ZmdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliWzBdLCBpKSkgKyBvZmZ0KTsKKwkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopIHBlcl9jcHVfcHRyKG1pYlsxXSwgaSkpICsgb2ZmdCk7CisJfQorCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbm1wX2ZvbGRfZmllbGQpOworCitpbnQgc25tcF9taWJfaW5pdCh2b2lkICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgbWliYWxpZ24pCit7CisJQlVHX09OKHB0ciA9PSBOVUxMKTsKKwlwdHJbMF0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplKTsKKwlpZiAoIXB0clswXSkKKwkJZ290byBlcnIwOworCXB0clsxXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUpOworCWlmICghcHRyWzFdKQorCQlnb3RvIGVycjE7CisJcmV0dXJuIDA7CitlcnIxOgorCWZyZWVfcGVyY3B1KHB0clswXSk7CisJcHRyWzBdID0gTlVMTDsKK2VycjA6CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbm1wX21pYl9pbml0KTsKKwordm9pZCBzbm1wX21pYl9mcmVlKHZvaWQgKnB0clsyXSkKK3sKKwlCVUdfT04ocHRyID09IE5VTEwpOworCWZyZWVfcGVyY3B1KHB0clswXSk7CisJZnJlZV9wZXJjcHUocHRyWzFdKTsKKwlwdHJbMF0gPSBwdHJbMV0gPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9taWJfZnJlZSk7CisKICNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCiBzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBpZ21wX3Byb3RvY29sID0gewogCS5oYW5kbGVyID0JaWdtcF9yY3YsCkBAIC0xMjE0LDI4ICsxMjg1LDQ3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaXB2NF9taWJzKHZvaWQpCiB7Ci0JbmV0X3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGxpbnV4X21pYik7Ci0JbmV0X3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGxpbnV4X21pYik7Ci0JaXBfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaXBzdGF0c19taWIpOwotCWlwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwc3RhdHNfbWliKTsKLQlpY21wX3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGljbXBfbWliKTsKLQlpY21wX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGljbXBfbWliKTsKLQl0Y3Bfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdGNwX21pYik7Ci0JdGNwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHRjcF9taWIpOwotCXVkcF9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKLQl1ZHBfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7Ci0JdWRwbGl0ZV9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKLQl1ZHBsaXRlX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOwotCWlmICghCi0JICAgIChuZXRfc3RhdGlzdGljc1swXSAmJiBuZXRfc3RhdGlzdGljc1sxXSAmJiBpcF9zdGF0aXN0aWNzWzBdCi0JICAgICAmJiBpcF9zdGF0aXN0aWNzWzFdICYmIHRjcF9zdGF0aXN0aWNzWzBdICYmIHRjcF9zdGF0aXN0aWNzWzFdCi0JICAgICAmJiB1ZHBfc3RhdGlzdGljc1swXSAmJiB1ZHBfc3RhdGlzdGljc1sxXQotCSAgICAgJiYgdWRwbGl0ZV9zdGF0aXN0aWNzWzBdICYmIHVkcGxpdGVfc3RhdGlzdGljc1sxXSAgICAgICAgICAgICApICkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopbmV0X3N0YXRpc3RpY3MsCisJCQkgIHNpemVvZihzdHJ1Y3QgbGludXhfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGxpbnV4X21pYikpIDwgMCkKKwkJZ290byBlcnJfbmV0X21pYjsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpcF9zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IGlwc3RhdHNfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGlwc3RhdHNfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pcF9taWI7CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopaWNtcF9zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IGljbXBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXBfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pY21wX21pYjsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKil0Y3Bfc3RhdGlzdGljcywKKwkJCSAgc2l6ZW9mKHN0cnVjdCB0Y3BfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHRjcF9taWIpKSA8IDApCisJCWdvdG8gZXJyX3RjcF9taWI7CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopdWRwX3N0YXRpc3RpY3MsCisJCQkgIHNpemVvZihzdHJ1Y3QgdWRwX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQorCQlnb3RvIGVycl91ZHBfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKXVkcGxpdGVfc3RhdGlzdGljcywKKwkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwogCi0JKHZvaWQpIHRjcF9taWJfaW5pdCgpOworCXRjcF9taWJfaW5pdCgpOwogCiAJcmV0dXJuIDA7CisKK2Vycl91ZHBsaXRlX21pYjoKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0aXN0aWNzKTsKK2Vycl91ZHBfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopdGNwX3N0YXRpc3RpY3MpOworZXJyX3RjcF9taWI6CisJc25tcF9taWJfZnJlZSgodm9pZCAqKilpY21wX3N0YXRpc3RpY3MpOworZXJyX2ljbXBfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaXBfc3RhdGlzdGljcyk7CitlcnJfaXBfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0X3N0YXRpc3RpY3MpOworZXJyX25ldF9taWI6CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgaXB2NF9wcm9jX2luaXQodm9pZCk7CkBAIC0xMzM2LDcgKzE0MjYsNyBAQAogCSAqCUluaXRpYWxpc2UgcGVyLWNwdSBpcHY0IG1pYnMKIAkgKi8KIAotCWlmKGluaXRfaXB2NF9taWJzKCkpCisJaWYgKGluaXRfaXB2NF9taWJzKCkpCiAJCXByaW50ayhLRVJOX0NSSVQgImluZXRfaW5pdDogQ2Fubm90IGluaXQgaXB2NCBtaWJzXG4iKTsgOwogCiAJaXB2NF9wcm9jX2luaXQoKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FoNC5jIGIvbmV0L2lwdjQvYWg0LmMKaW5kZXggNzE5NGViNC4uNmRhOGZmNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWg0LmMKKysrIGIvbmV0L2lwdjQvYWg0LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJY2hhciAJCWJ1Zls2MF07CiAJfSB0bXBfaXBoOwogCi0JdG9wX2lwaCA9IHNrYi0+bmguaXBoOworCXRvcF9pcGggPSBpcF9oZHIoc2tiKTsKIAlpcGggPSAmdG1wX2lwaC5pcGg7CiAKIAlpcGgtPnRvcyA9IHRvcF9pcGgtPnRvczsKQEAgLTE1Miw5ICsxNTIsOSBAQAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciopc2tiLT5kYXRhOwotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCi0JaWhsID0gc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXc7CisJaWhsID0gc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbWVtY3B5KHdvcmtfYnVmLCBpcGgsIGlobCk7CiAKIAlpcGgtPnR0bCA9IDA7CkBAIC0xODEsNyArMTgxLDkgQEAKIAkJfQogCX0KIAkoKHN0cnVjdCBpcGhkciopd29ya19idWYpLT5wcm90b2NvbCA9IGFoLT5uZXh0aGRyOwotCXNrYi0+aC5yYXcgPSBtZW1jcHkoc2tiLT5uaC5yYXcgKz0gYWhfaGxlbiwgd29ya19idWYsIGlobCk7CisJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBhaF9obGVuOworCW1lbWNweShza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgd29ya19idWYsIGlobCk7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlfX3NrYl9wdWxsKHNrYiwgYWhfaGxlbiArIGlobCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE5Niw4ICsxOTgsOCBAQAogCXN0cnVjdCBpcF9hdXRoX2hkciAqYWggPSAoc3RydWN0IGlwX2F1dGhfaGRyKikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCi0JaWYgKHNrYi0+aC5pY21waC0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAotCSAgICBza2ItPmguaWNtcGgtPmNvZGUgIT0gSUNNUF9GUkFHX05FRURFRCkKKwlpZiAoaWNtcF9oZHIoc2tiKS0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAorCSAgICBpY21wX2hkcihza2IpLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCiAJCXJldHVybjsKIAogCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgYWgtPnNwaSwgSVBQUk9UT19BSCwgQUZfSU5FVCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hcnAuYyBiL25ldC9pcHY0L2FycC5jCmluZGV4IDFhMzQ4OGEuLjcxMTA3NzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FycC5jCisrKyBiL25ldC9pcHY0L2FycC5jCkBAIC0zNDIsMTMgKzM0MiwxMyBAQAogCXN3aXRjaCAoSU5fREVWX0FSUF9BTk5PVU5DRShpbl9kZXYpKSB7CiAJZGVmYXVsdDoKIAljYXNlIDA6CQkvKiBCeSBkZWZhdWx0IGFubm91bmNlIGFueSBsb2NhbCBJUCAqLwotCQlpZiAoc2tiICYmIGluZXRfYWRkcl90eXBlKHNrYi0+bmguaXBoLT5zYWRkcikgPT0gUlROX0xPQ0FMKQotCQkJc2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCWlmIChza2IgJiYgaW5ldF9hZGRyX3R5cGUoaXBfaGRyKHNrYiktPnNhZGRyKSA9PSBSVE5fTE9DQUwpCisJCQlzYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJYnJlYWs7CiAJY2FzZSAxOgkJLyogUmVzdHJpY3QgYW5ub3VuY2VtZW50cyBvZiBzYWRkciBpbiBzYW1lIHN1Ym5ldCAqLwogCQlpZiAoIXNrYikKIAkJCWJyZWFrOwotCQlzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJc2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJCWlmIChpbmV0X2FkZHJfdHlwZShzYWRkcikgPT0gUlROX0xPQ0FMKSB7CiAJCQkvKiBzYWRkciBzaG91bGQgYmUga25vd24gdG8gdGFyZ2V0ICovCiAJCQlpZiAoaW5ldF9hZGRyX29ubGluayhpbl9kZXYsIHRhcmdldCwgc2FkZHIpKQpAQCAtNTc4LDcgKzU3OCw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlhcnAgPSAoc3RydWN0IGFycGhkciAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGFycGhkcikgKyAyKihkZXYtPmFkZHJfbGVuKzQpKTsKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKQEAgLTcyMSw3ICs3MjEsNyBAQAogCWlmIChpbl9kZXYgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlhcnAgPSBza2ItPm5oLmFycGg7CisJYXJwID0gYXJwX2hkcihza2IpOwogCiAJc3dpdGNoIChkZXZfdHlwZSkgewogCWRlZmF1bHQ6CkBAIC05MzcsNyArOTM3LDcgQEAKIAkJCQkgKDIgKiBzaXplb2YodTMyKSkpKSkKIAkJZ290byBmcmVlc2tiOwogCi0JYXJwID0gc2tiLT5uaC5hcnBoOworCWFycCA9IGFycF9oZHIoc2tiKTsKIAlpZiAoYXJwLT5hcl9obG4gIT0gZGV2LT5hZGRyX2xlbiB8fAogCSAgICBkZXYtPmZsYWdzICYgSUZGX05PQVJQIHx8CiAJICAgIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCB8fApAQCAtMTE3OCw3ICsxMTc4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc3dpdGNoKGNtZCkgeworCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DREFSUDoKIAkJZXJyID0gYXJwX3JlcV9kZWxldGUoJnIsIGRldik7CiAJCWJyZWFrOwpAQCAtMTM2MCw3ICsxMzYwLDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXJwX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGFycF9zZXFfb3BzID0gewogCS5zdGFydCAgPSBhcnBfc2VxX3N0YXJ0LAogCS5uZXh0ICAgPSBuZWlnaF9zZXFfbmV4dCwKIAkuc3RvcCAgID0gbmVpZ2hfc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMgYi9uZXQvaXB2NC9jaXBzb19pcHY0LmMKaW5kZXggMmNlNWI2OS4uMTFhMzQwNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvY2lwc29faXB2NC5jCisrKyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKIAl1MTYgY2F0X2xvdzsKIAl1MTYgY2F0X2hpZ2g7CiAKLQlmb3IobmV0X2l0ZXIgPSAwOyBuZXRfaXRlciA8IG5ldF9jYXRfbGVuOyBuZXRfaXRlciArPSA0KSB7CisJZm9yIChuZXRfaXRlciA9IDA7IG5ldF9pdGVyIDwgbmV0X2NhdF9sZW47IG5ldF9pdGVyICs9IDQpIHsKIAkJY2F0X2hpZ2ggPSBudG9ocygqKChfX2JlMTYgKikmbmV0X2NhdFtuZXRfaXRlcl0pKTsKIAkJaWYgKChuZXRfaXRlciArIDQpIDw9IG5ldF9jYXRfbGVuKQogCQkJY2F0X2xvdyA9IG50b2hzKCooKF9fYmUxNiAqKSZuZXRfY2F0W25ldF9pdGVyICsgMl0pKTsKQEAgLTE2NzYsNyArMTY3Niw3IEBACiAgKi8KIHZvaWQgY2lwc29fdjRfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycm9yLCB1MzIgZ2F0ZXdheSkKIHsKLQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCB8fCBlcnJvciAhPSAtRUFDQ0VTKQorCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QIHx8IGVycm9yICE9IC1FQUNDRVMpCiAJCXJldHVybjsKIAogCWlmIChnYXRld2F5KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDk4YTAwZDAuLjA4ODg4OGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KQEAgLTYyLDcgKzYxLDcgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBpcHY0X2RldmNvbmYgaXB2NF9kZXZjb25mID0gewogCS5hY2NlcHRfcmVkaXJlY3RzID0gMSwKQEAgLTYzMyw3ICs2MzIsNyBAQAogCWRldl9sb2FkKGlmci5pZnJfbmFtZSk7CiAjZW5kaWYKIAotCXN3aXRjaChjbWQpIHsKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dJRkFERFI6CS8qIEdldCBpbnRlcmZhY2UgYWRkcmVzcyAqLwogCWNhc2UgU0lPQ0dJRkJSREFERFI6CS8qIEdldCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KIAljYXNlIFNJT0NHSUZEU1RBRERSOgkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KQEAgLTcwOCw3ICs3MDcsNyBAQAogCWlmICghaWZhICYmIGNtZCAhPSBTSU9DU0lGQUREUiAmJiBjbWQgIT0gU0lPQ1NJRkZMQUdTKQogCQlnb3RvIGRvbmU7CiAKLQlzd2l0Y2goY21kKSB7CisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHSUZBRERSOgkvKiBHZXQgaW50ZXJmYWNlIGFkZHJlc3MgKi8KIAkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKIAkJZ290byByYXJvazsKQEAgLTExODMsMTcgKzExODIsMTMgQEAKIAlpbnQgc19pcF9pZHgsIHNfaWR4ID0gY2ItPmFyZ3NbMF07CiAKIAlzX2lwX2lkeCA9IGlwX2lkeCA9IGNiLT5hcmdzWzFdOwotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJZm9yIChkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CiAJCWlmIChpZHggPCBzX2lkeCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaWR4ID4gc19pZHgpCiAJCQlzX2lwX2lkeCA9IDA7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldikpID09IE5VTEwpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOworCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldF9ydG5sKGRldikpID09IE5VTEwpCiAJCQljb250aW51ZTsKLQkJfQogCiAJCWZvciAoaWZhID0gaW5fZGV2LT5pZmFfbGlzdCwgaXBfaWR4ID0gMDsgaWZhOwogCQkgICAgIGlmYSA9IGlmYS0+aWZhX25leHQsIGlwX2lkeCsrKSB7CkBAIC0xMjAxLDE2ICsxMTk2LDEyIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoaW5ldF9maWxsX2lmYWRkcihza2IsIGlmYSwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgIFJUTV9ORVdBRERSLCBOTE1fRl9NVUxUSSkgPD0gMCkgewotCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQkgICAgIFJUTV9ORVdBRERSLCBOTE1fRl9NVUxUSSkgPD0gMCkKIAkJCQlnb3RvIGRvbmU7Ci0JCQl9CiAJCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiBkb25lOgotCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAljYi0+YXJnc1swXSA9IGlkeDsKIAljYi0+YXJnc1sxXSA9IGlwX2lkeDsKIApAQCAtMTI0MSwxOSArMTIzMiw2IEBACiAJCXJ0bmxfc2V0X3NrX2VycihSVE5MR1JQX0lQVjRfSUZBRERSLCBlcnIpOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmV0bGlua19saW5rIGluZXRfcnRuZXRsaW5rX3RhYmxlW1JUTV9OUl9NU0dUWVBFU10gPSB7Ci0JW1JUTV9ORVdBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0X3J0bV9uZXdhZGRyLAl9LAotCVtSVE1fREVMQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldF9ydG1fZGVsYWRkciwJfSwKLQlbUlRNX0dFVEFERFIgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gaW5ldF9kdW1wX2lmYWRkciwJfSwKLQlbUlRNX05FV1JPVVRFIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGluZXRfcnRtX25ld3JvdXRlLAl9LAotCVtSVE1fREVMUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldF9ydG1fZGVscm91dGUsCX0sCi0JW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0X3J0bV9nZXRyb3V0ZSwKLQkJCQkgICAgICAuZHVtcGl0CT0gaW5ldF9kdW1wX2ZpYiwJfSwKLSNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JW1JUTV9HRVRSVUxFICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGZpYjRfcnVsZXNfZHVtcCwJfSwKLSNlbmRpZgotfTsKLQogI2lmZGVmIENPTkZJR19TWVNDVEwKIAogdm9pZCBpbmV0X2ZvcndhcmRfY2hhbmdlKHZvaWQpCkBAIC0xNjM2LDcgKzE2MTQsMTAgQEAKIHsKIAlyZWdpc3Rlcl9naWZjb25mKFBGX0lORVQsIGluZXRfZ2lmY29uZik7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcF9uZXRkZXZfbm90aWZpZXIpOwotCXJ0bmV0bGlua19saW5rc1tQRl9JTkVUXSA9IGluZXRfcnRuZXRsaW5rX3RhYmxlOworCisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fTkVXQUREUiwgaW5ldF9ydG1fbmV3YWRkciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMQUREUiwgaW5ldF9ydG1fZGVsYWRkciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fR0VUQUREUiwgTlVMTCwgaW5ldF9kdW1wX2lmYWRkcik7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCWRldmluZXRfc3lzY3RsLnN5c2N0bF9oZWFkZXIgPQogCQlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoZGV2aW5ldF9zeXNjdGwuZGV2aW5ldF9yb290X2Rpcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9lc3A0LmMgYi9uZXQvaXB2NC9lc3A0LmMKaW5kZXggMzEwNDExMi4uNDdjOTVlOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZXNwNC5jCisrKyBiL25ldC9pcHY0L2VzcDQuYwpAQCAtMjEsMTMgKzIxLDE0IEBACiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CiAJc3RydWN0IGVzcF9kYXRhICplc3A7CiAJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CisJdTggKnRhaWw7CiAJaW50IGJsa3NpemU7CiAJaW50IGNsZW47CiAJaW50IGFsZW47CiAJaW50IG5mcmFnczsKIAogCS8qIFN0cmlwIElQK0VTUCBoZWFkZXIuICovCi0JX19za2JfcHVsbChza2IsIHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCV9fc2tiX3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpKTsKIAkvKiBOb3cgc2tiIGlzIHB1cmUgcGF5bG9hZCB0byBlbmNyeXB0ICovCiAKIAllcnIgPSAtRU5PTUVNOwpAQCAtNDksMTkgKzUwLDIxIEBACiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBGaWxsIHBhZGRpbmcuLi4gKi8KKwl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKTsKIAlkbyB7CiAJCWludCBpOwogCQlmb3IgKGk9MDsgaTxjbGVuLXNrYi0+bGVuIC0gMjsgaSsrKQotCQkJKih1OCopKHRyYWlsZXItPnRhaWwgKyBpKSA9IGkrMTsKKwkJCXRhaWxbaV0gPSBpICsgMTsKIAl9IHdoaWxlICgwKTsKLQkqKHU4KikodHJhaWxlci0+dGFpbCArIGNsZW4tc2tiLT5sZW4gLSAyKSA9IChjbGVuIC0gc2tiLT5sZW4pLTI7CisJdGFpbFtjbGVuIC0gc2tiLT5sZW4gLSAyXSA9IChjbGVuIC0gc2tiLT5sZW4pIC0gMjsKIAlwc2tiX3B1dChza2IsIHRyYWlsZXIsIGNsZW4gLSBza2ItPmxlbik7CiAKLQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOwotCXRvcF9pcGggPSBza2ItPm5oLmlwaDsKLQllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyICopKHNrYi0+bmgucmF3ICsgdG9wX2lwaC0+aWhsKjQpOworCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CisJdG9wX2lwaCA9IGlwX2hkcihza2IpOworCWVzcGggPSAoc3RydWN0IGlwX2VzcF9oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKworCQkJCSAgICAgdG9wX2lwaC0+aWhsICogNCk7CiAJdG9wX2lwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuICsgYWxlbik7Ci0JKih1OCopKHRyYWlsZXItPnRhaWwgLSAxKSA9IHRvcF9pcGgtPnByb3RvY29sOworCSooc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKSAtIDEpID0gdG9wX2lwaC0+cHJvdG9jb2w7CiAKIAkvKiB0aGlzIGlzIG5vbi1OVUxMIG9ubHkgd2l0aCBVRFAgRW5jYXBzdWxhdGlvbiAqLwogCWlmICh4LT5lbmNhcCkgewpAQCAtMjE3LDEyICsyMjAsMTIgQEAKIAogCS8qIC4uLiBjaGVjayBwYWRkaW5nIGJpdHMgaGVyZS4gU2lsbHkuIDotKSAqLwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWhsID0gaXBoLT5paGwgKiA0OwogCiAJaWYgKHgtPmVuY2FwKSB7CiAJCXN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKmVuY2FwID0geC0+ZW5jYXA7Ci0JCXN0cnVjdCB1ZHBoZHIgKnVoID0gKHZvaWQgKikoc2tiLT5uaC5yYXcgKyBpaGwpOworCQlzdHJ1Y3QgdWRwaGRyICp1aCA9ICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaWhsKTsKIAogCQkvKgogCQkgKiAxKSBpZiB0aGUgTkFULVQgcGVlcidzIElQIG9yIHBvcnQgY2hhbmdlZCB0aGVuCkBAIC0yNjAsNyArMjYzLDggQEAKIAogCWlwaC0+cHJvdG9jb2wgPSBuZXh0aGRyWzFdOwogCXBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gYWxlbiAtIHBhZGxlbiAtIDIpOwotCXNrYi0+aC5yYXcgPSBfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCplc3BoKSArIGVzcC0+Y29uZi5pdmxlbikgLSBpaGw7CisJX19za2JfcHVsbChza2IsIHNpemVvZigqZXNwaCkgKyBlc3AtPmNvbmYuaXZsZW4pOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIC1paGwpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI2OCwzMiArMjcyLDMzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB1MzIgZXNwNF9nZXRfbWF4X3NpemUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBtdHUpCitzdGF0aWMgdTMyIGVzcDRfZ2V0X210dShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKIHsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CiAJdTMyIGJsa3NpemUgPSBBTElHTihjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShlc3AtPmNvbmYudGZtKSwgNCk7Ci0JaW50IGVuY2xlbiA9IDA7CisJdTMyIGFsaWduID0gbWF4X3QodTMyLCBibGtzaXplLCBlc3AtPmNvbmYucGFkbGVuKTsKKwl1MzIgcmVtOworCisJbXR1IC09IHgtPnByb3BzLmhlYWRlcl9sZW4gKyBlc3AtPmF1dGguaWN2X3RydW5jX2xlbjsKKwlyZW0gPSBtdHUgJiAoYWxpZ24gLSAxKTsKKwltdHUgJj0gfihhbGlnbiAtIDEpOwogCiAJc3dpdGNoICh4LT5wcm9wcy5tb2RlKSB7CiAJY2FzZSBYRlJNX01PREVfVFVOTkVMOgotCQltdHUgPSBBTElHTihtdHUgKzIsIGJsa3NpemUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCWNhc2UgWEZSTV9NT0RFX1RSQU5TUE9SVDoKIAkJLyogVGhlIHdvcnN0IGNhc2UgKi8KLQkJbXR1ID0gQUxJR04obXR1ICsgMiwgNCkgKyBibGtzaXplIC0gNDsKKwkJbXR1IC09IGJsa3NpemUgLSA0OworCQltdHUgKz0gbWluX3QodTMyLCBibGtzaXplIC0gNCwgcmVtKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlJNX01PREVfQkVFVDoKIAkJLyogVGhlIHdvcnN0IGNhc2UuICovCi0JCWVuY2xlbiA9IElQVjRfQkVFVF9QSE1BWExFTjsKLQkJbXR1ID0gQUxJR04obXR1ICsgZW5jbGVuICsgMiwgYmxrc2l6ZSk7CisJCW10dSArPSBtaW5fdCh1MzIsIElQVjRfQkVFVF9QSE1BWExFTiwgcmVtKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGVzcC0+Y29uZi5wYWRsZW4pCi0JCW10dSA9IEFMSUdOKG10dSwgZXNwLT5jb25mLnBhZGxlbik7Ci0KLQlyZXR1cm4gbXR1ICsgeC0+cHJvcHMuaGVhZGVyX2xlbiArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuIC0gZW5jbGVuOworCXJldHVybiBtdHUgLSAyOwogfQogCiBzdGF0aWMgdm9pZCBlc3A0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKQEAgLTMwMiw4ICszMDcsOCBAQAogCXN0cnVjdCBpcF9lc3BfaGRyICplc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyKikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCi0JaWYgKHNrYi0+aC5pY21waC0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAotCSAgICBza2ItPmguaWNtcGgtPmNvZGUgIT0gSUNNUF9GUkFHX05FRURFRCkKKwlpZiAoaWNtcF9oZHIoc2tiKS0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAorCSAgICBpY21wX2hkcihza2IpLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCiAJCXJldHVybjsKIAogCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgZXNwaC0+c3BpLCBJUFBST1RPX0VTUCwgQUZfSU5FVCk7CkBAIC0zMzYsNiArMzQxLDcgQEAKIHsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IE5VTEw7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTsKKwl1MzIgYWxpZ247CiAKIAkvKiBudWxsIGF1dGggYW5kIGVuY3J5cHRpb24gY2FuIGhhdmUgemVybyBsZW5ndGgga2V5cyAqLwogCWlmICh4LT5hYWxnKSB7CkBAIC00MDIsNiArNDA4LDggQEAKIAl4LT5wcm9wcy5oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbjsKIAlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKQogCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWVsc2UgaWYgKHgtPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX0JFRVQpCisJCXgtPnByb3BzLmhlYWRlcl9sZW4gKz0gSVBWNF9CRUVUX1BITUFYTEVOOwogCWlmICh4LT5lbmNhcCkgewogCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcCA9IHgtPmVuY2FwOwogCkBAIC00MTcsNyArNDI1LDEwIEBACiAJCX0KIAl9CiAJeC0+ZGF0YSA9IGVzcDsKLQl4LT5wcm9wcy50cmFpbGVyX2xlbiA9IGVzcDRfZ2V0X21heF9zaXplKHgsIDApIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKKwlhbGlnbiA9IEFMSUdOKGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKGVzcC0+Y29uZi50Zm0pLCA0KTsKKwlpZiAoZXNwLT5jb25mLnBhZGxlbikKKwkJYWxpZ24gPSBtYXhfdCh1MzIsIGFsaWduLCBlc3AtPmNvbmYucGFkbGVuKTsKKwl4LT5wcm9wcy50cmFpbGVyX2xlbiA9IGFsaWduICsgMSArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOwogCXJldHVybiAwOwogCiBlcnJvcjoKQEAgLTQzNCw3ICs0NDUsNyBAQAogCS5wcm90bwkgICAgIAk9IElQUFJPVE9fRVNQLAogCS5pbml0X3N0YXRlCT0gZXNwX2luaXRfc3RhdGUsCiAJLmRlc3RydWN0b3IJPSBlc3BfZGVzdHJveSwKLQkuZ2V0X21heF9zaXplCT0gZXNwNF9nZXRfbWF4X3NpemUsCisJLmdldF9tdHUJPSBlc3A0X2dldF9tdHUsCiAJLmlucHV0CQk9IGVzcF9pbnB1dCwKIAkub3V0cHV0CQk9IGVzcF9vdXRwdXQKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IGNhYzA2YzQuLjgzN2YyOTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC00Niw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KIAogI2RlZmluZSBGRnByaW50KGEuLi4pIHByaW50ayhLRVJOX0RFQlVHIGEpCiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBmaWJfY29uZmlnIGNmZzsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBmaWJfY29uZmlnIGNmZzsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgaW5ldF9kdW1wX2ZpYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJdW5zaWduZWQgaW50IGgsIHNfaDsKIAl1bnNpZ25lZCBpbnQgZSA9IDAsIHNfZTsKQEAgLTc3Nyw2ICs3NzcsMTAgQEAKIAkJCQkJCQkgICAgLnRvcyA9IGZybi0+ZmxfdG9zLAogCQkJCQkJCSAgICAuc2NvcGUgPSBmcm4tPmZsX3Njb3BlIH0gfSB9OwogCisjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUworCXJlcy5yID0gTlVMTDsKKyNlbmRpZgorCiAJZnJuLT5lcnIgPSAtRU5PRU5UOwogCWlmICh0YikgewogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CkBAIC04MDcsNyArODExLDcgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybjsKIAotCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJaWYgKHNrYi0+bGVuIDwgTkxNU0dfU1BBQ0UoMCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbiB8fAogCSAgICBubGgtPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2YoKmZybikpKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtODI3LDcgKzgzMSw4IEBACiAKIHN0YXRpYyB2b2lkIG5sX2ZpYl9sb29rdXBfaW5pdCh2b2lkKQogewotICAgICAgbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfRklCX0xPT0tVUCwgMCwgbmxfZmliX2lucHV0LCBUSElTX01PRFVMRSk7CisgICAgICBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19GSUJfTE9PS1VQLCAwLCBubF9maWJfaW5wdXQsIE5VTEwsCisgICAgICAJCQkgICAgVEhJU19NT0RVTEUpOwogfQogCiBzdGF0aWMgdm9pZCBmaWJfZGlzYWJsZV9pcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCkBAIC05MjUsNiArOTMwLDEwIEBACiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmaWJfbmV0ZGV2X25vdGlmaWVyKTsKIAlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmZmliX2luZXRhZGRyX25vdGlmaWVyKTsKIAlubF9maWJfbG9va3VwX2luaXQoKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX05FV1JPVVRFLCBpbmV0X3J0bV9uZXdyb3V0ZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMUk9VVEUsIGluZXRfcnRtX2RlbHJvdXRlLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgTlVMTCwgaW5ldF9kdW1wX2ZpYik7CiB9CiAKIEVYUE9SVF9TWU1CT0woaW5ldF9hZGRyX3R5cGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2hhc2guYyBiL25ldC9pcHY0L2ZpYl9oYXNoLmMKaW5kZXggYTQ5NDlmOS4uOWNmZWNmMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2hhc2guYworKysgYi9uZXQvaXB2NC9maWJfaGFzaC5jCkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl9zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfc2VxX29wcyA9IHsKIAkuc3RhcnQgID0gZmliX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3NlcV9uZXh0LAogCS5zdG9wICAgPSBmaWJfc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfcnVsZXMuYyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCmluZGV4IGM2NjBjMDcuLjMzMDgzYWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCkBAIC0yNzQsMTEgKzI3NCw2IEBACiAJcmV0dXJuIC1FTk9CVUZTOwogfQogCi1pbnQgZmliNF9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlyZXR1cm4gZmliX3J1bGVzX2R1bXAoc2tiLCBjYiwgQUZfSU5FVCk7Ci19Ci0KIHN0YXRpYyB1MzIgZmliNF9ydWxlX2RlZmF1bHRfcHJlZih2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKQEAgLTMwMyw2ICsyOTgsMTEgQEAKIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogZmxvdyAqLwogfQogCitzdGF0aWMgdm9pZCBmaWI0X3J1bGVfZmx1c2hfY2FjaGUodm9pZCkKK3sKKwlydF9jYWNoZV9mbHVzaCgtMSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmliX3J1bGVzX29wcyBmaWI0X3J1bGVzX29wcyA9IHsKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnJ1bGVfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZmliNF9ydWxlKSwKQEAgLTMxNCw2ICszMTQsNyBAQAogCS5maWxsCQk9IGZpYjRfcnVsZV9maWxsLAogCS5kZWZhdWx0X3ByZWYJPSBmaWI0X3J1bGVfZGVmYXVsdF9wcmVmLAogCS5ubG1zZ19wYXlsb2FkCT0gZmliNF9ydWxlX25sbXNnX3BheWxvYWQsCisJLmZsdXNoX2NhY2hlCT0gZmliNF9ydWxlX2ZsdXNoX2NhY2hlLAogCS5ubGdyb3VwCT0gUlROTEdSUF9JUFY0X1JVTEUsCiAJLnBvbGljeQkJPSBmaWI0X3J1bGVfcG9saWN5LAogCS5ydWxlc19saXN0CT0gJmZpYjRfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggM2RhZDEyZS4uNDA2ZWE3MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAJCQlkZWZhdWx0OgogCQkJCXByaW50ayhLRVJOX0RFQlVHICJpbXBvc3NpYmxlIDEwMlxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9OworCQkJfQogCQl9CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggMjE0YzM0Ny4uOWJlN2RhNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC01MCw3ICs1MCw3IEBACiAgKgkJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CiAgKi8KIAotI2RlZmluZSBWRVJTSU9OICIwLjQwNyIKKyNkZWZpbmUgVkVSU0lPTiAiMC40MDgiCiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTI5Miw4ICsyOTIsOCBAQAogCiBzdGF0aWMgaW50IGhhbHZlX3RocmVzaG9sZCA9IDI1Owogc3RhdGljIGludCBpbmZsYXRlX3RocmVzaG9sZCA9IDUwOwotc3RhdGljIGludCBoYWx2ZV90aHJlc2hvbGRfcm9vdCA9IDE1Owotc3RhdGljIGludCBpbmZsYXRlX3RocmVzaG9sZF9yb290ID0gMjU7CitzdGF0aWMgaW50IGhhbHZlX3RocmVzaG9sZF9yb290ID0gODsKK3N0YXRpYyBpbnQgaW5mbGF0ZV90aHJlc2hvbGRfcm9vdCA9IDE1OwogCiAKIHN0YXRpYyB2b2lkIF9fYWxpYXNfZnJlZV9tZW0oc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMzUwLDExICszNTAsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHRub2RlX2ZyZWUoc3RydWN0IHRub2RlICp0bikKIHsKLQlpZihJU19MRUFGKHRuKSkgeworCWlmIChJU19MRUFGKHRuKSkgewogCQlzdHJ1Y3QgbGVhZiAqbCA9IChzdHJ1Y3QgbGVhZiAqKSB0bjsKIAkJY2FsbF9yY3VfYmgoJmwtPnJjdSwgX19sZWFmX2ZyZWVfcmN1KTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQljYWxsX3JjdSgmdG4tPnJjdSwgX190bm9kZV9mcmVlX3JjdSk7CiB9CiAKQEAgLTQ1OSw2ICs0NTgsNyBAQAogCXN0cnVjdCB0bm9kZSAqb2xkX3RuOwogCWludCBpbmZsYXRlX3RocmVzaG9sZF91c2U7CiAJaW50IGhhbHZlX3RocmVzaG9sZF91c2U7CisJaW50IG1heF9yZXNpemU7CiAKIAlpZiAoIXRuKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU1MywxMyArNTUzLDE0IEBACiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgICovCiAKLQlpZighdG4tPnBhcmVudCkKKwlpZiAoIXRuLT5wYXJlbnQpCiAJCWluZmxhdGVfdGhyZXNob2xkX3VzZSA9IGluZmxhdGVfdGhyZXNob2xkX3Jvb3Q7CiAJZWxzZQogCQlpbmZsYXRlX3RocmVzaG9sZF91c2UgPSBpbmZsYXRlX3RocmVzaG9sZDsKIAogCWVyciA9IDA7Ci0Jd2hpbGUgKCh0bi0+ZnVsbF9jaGlsZHJlbiA+IDAgJiYKKwltYXhfcmVzaXplID0gMTA7CisJd2hpbGUgKCh0bi0+ZnVsbF9jaGlsZHJlbiA+IDAgJiYgIG1heF9yZXNpemUtLSAmJgogCSAgICAgICA1MCAqICh0bi0+ZnVsbF9jaGlsZHJlbiArIHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4pID49CiAJCQkJaW5mbGF0ZV90aHJlc2hvbGRfdXNlICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkpIHsKIApAQCAtNTc0LDYgKzU3NSwxNSBAQAogCQl9CiAJfQogCisJaWYgKG1heF9yZXNpemUgPCAwKSB7CisJCWlmICghdG4tPnBhcmVudCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZpeCBpbmZsYXRlX3RocmVzaG9sZF9yb290LiBOb3c9JWQgc2l6ZT0lZCBiaXRzXG4iLAorCQkJICAgICAgIGluZmxhdGVfdGhyZXNob2xkX3Jvb3QsIHRuLT5iaXRzKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRml4IGluZmxhdGVfdGhyZXNob2xkLiBOb3c9JWQgc2l6ZT0lZCBiaXRzXG4iLAorCQkJICAgICAgIGluZmxhdGVfdGhyZXNob2xkLCB0bi0+Yml0cyk7CisJfQorCiAJY2hlY2tfdG5vZGUodG4pOwogCiAJLyoKQEAgLTU4NCwxMyArNTk0LDE0IEBACiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgICovCiAKLQlpZighdG4tPnBhcmVudCkKKwlpZiAoIXRuLT5wYXJlbnQpCiAJCWhhbHZlX3RocmVzaG9sZF91c2UgPSBoYWx2ZV90aHJlc2hvbGRfcm9vdDsKIAllbHNlCiAJCWhhbHZlX3RocmVzaG9sZF91c2UgPSBoYWx2ZV90aHJlc2hvbGQ7CiAKIAllcnIgPSAwOwotCXdoaWxlICh0bi0+Yml0cyA+IDEgJiYKKwltYXhfcmVzaXplID0gMTA7CisJd2hpbGUgKHRuLT5iaXRzID4gMSAmJiAgbWF4X3Jlc2l6ZS0tICYmCiAJICAgICAgIDEwMCAqICh0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gdG4tPmVtcHR5X2NoaWxkcmVuKSA8CiAJICAgICAgIGhhbHZlX3RocmVzaG9sZF91c2UgKiB0bm9kZV9jaGlsZF9sZW5ndGgodG4pKSB7CiAKQEAgLTYwNSw2ICs2MTYsMTQgQEAKIAkJfQogCX0KIAorCWlmIChtYXhfcmVzaXplIDwgMCkgeworCQlpZiAoIXRuLT5wYXJlbnQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGaXggaGFsdmVfdGhyZXNob2xkX3Jvb3QuIE5vdz0lZCBzaXplPSVkIGJpdHNcbiIsCisJCQkgICAgICAgaGFsdmVfdGhyZXNob2xkX3Jvb3QsIHRuLT5iaXRzKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRml4IGhhbHZlX3RocmVzaG9sZC4gTm93PSVkIHNpemU9JWQgYml0c1xuIiwKKwkJCSAgICAgICBoYWx2ZV90aHJlc2hvbGQsIHRuLT5iaXRzKTsKKwl9CiAKIAkvKiBPbmx5IG9uZSBjaGlsZCByZW1haW5zICovCiAJaWYgKHRuLT5lbXB0eV9jaGlsZHJlbiA9PSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gMSkKQEAgLTIwMzksMTIgKzIwNTgsMTIgQEAKIHsKIAlzdHJ1Y3Qgbm9kZSAqbiA7CiAKLQlpZighdCkKKwlpZiAoIXQpCiAJCXJldHVybiBOVUxMOwogCiAJbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKIAotCWlmKCFpdGVyKQorCWlmICghaXRlcikKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobikgewpAQCAtMjA4NCw3ICsyMTAzLDcgQEAKIAkJCWludCBpOwogCiAJCQlzLT50bm9kZXMrKzsKLQkJCWlmKHRuLT5iaXRzIDwgTUFYX1NUQVRfREVQVEgpCisJCQlpZiAodG4tPmJpdHMgPCBNQVhfU1RBVF9ERVBUSCkKIAkJCQlzLT5ub2Rlc2l6ZXNbdG4tPmJpdHNdKys7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCAoMTw8dG4tPmJpdHMpOyBpKyspCkBAIC0yMjUwLDcgKzIyNjksNyBAQAogewogCXN0YXRpYyBjaGFyIGJ1ZlszMl07CiAKLQlzd2l0Y2gocykgeworCXN3aXRjaCAocykgewogCWNhc2UgUlRfU0NPUEVfVU5JVkVSU0U6IHJldHVybiAidW5pdmVyc2UiOwogCWNhc2UgUlRfU0NPUEVfU0lURToJcmV0dXJuICJzaXRlIjsKIAljYXNlIFJUX1NDT1BFX0xJTks6CXJldHVybiAibGluayI7CkBAIC0yMzQwLDcgKzIzNTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCiAJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLApAQCAtMjQ2MSw3ICsyNDgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfcm91dGVfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmliX3JvdXRlX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCiAJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IDRiN2EwZDkuLmQzOGNiYmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJICAgaXBjLCBydCwgTVNHX0RPTlRXQUlUKSA8IDApCiAJCWlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKGljbXBfc29ja2V0LT5zayk7CiAJZWxzZSBpZiAoKHNrYiA9IHNrYl9wZWVrKCZpY21wX3NvY2tldC0+c2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewotCQlzdHJ1Y3QgaWNtcGhkciAqaWNtcGggPSBza2ItPmguaWNtcGg7CisJCXN0cnVjdCBpY21waGRyICppY21waCA9IGljbXBfaGRyKHNrYik7CiAJCV9fd3N1bSBjc3VtID0gMDsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjE7CiAKQEAgLTM5Miw3ICszOTIsNyBAQAogCWljbXBfcGFyYW0tPmRhdGEuaWNtcGguY2hlY2tzdW0gPSAwOwogCWljbXBfb3V0X2NvdW50KGljbXBfcGFyYW0tPmRhdGEuaWNtcGgudHlwZSk7CiAKLQlpbmV0LT50b3MgPSBza2ItPm5oLmlwaC0+dG9zOworCWluZXQtPnRvcyA9IGlwX2hkcihza2IpLT50b3M7CiAJZGFkZHIgPSBpcGMuYWRkciA9IHJ0LT5ydF9zcmM7CiAJaXBjLm9wdCA9IE5VTEw7CiAJaWYgKGljbXBfcGFyYW0tPnJlcGx5b3B0cy5vcHRsZW4pIHsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQogCQkJCQkgICAgICB7IC5kYWRkciA9IGRhZGRyLAogCQkJCQkJLnNhZGRyID0gcnQtPnJ0X3NwZWNfZHN0LAotCQkJCQkJLnRvcyA9IFJUX1RPUyhza2ItPm5oLmlwaC0+dG9zKSB9IH0sCisJCQkJCQkudG9zID0gUlRfVE9TKGlwX2hkcihza2IpLT50b3MpIH0gfSwKIAkJCQkgICAgLnByb3RvID0gSVBQUk9UT19JQ01QIH07CiAJCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgJmZsKTsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQpAQCAtNDQ4LDkgKzQ0OCwxMCBAQAogCSAqCUNoZWNrIHRoaXMsIGljbXBfc2VuZCBpcyBjYWxsZWQgZnJvbSB0aGUgbW9zdCBvYnNjdXJlIGRldmljZXMKIAkgKglzb21ldGltZXMuCiAJICovCi0JaXBoID0gc2tiX2luLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYl9pbik7CiAKLQlpZiAoKHU4ICopaXBoIDwgc2tiX2luLT5oZWFkIHx8ICh1OCAqKShpcGggKyAxKSA+IHNrYl9pbi0+dGFpbCkKKwlpZiAoKHU4ICopaXBoIDwgc2tiX2luLT5oZWFkIHx8CisJICAgIChza2JfaW4tPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKCppcGgpKSA+IHNrYl9pbi0+dGFpbCkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtNDg0LDcgKzQ4NSw3IEBACiAJCQl1OCBfaW5uZXJfdHlwZSwgKml0cDsKIAogCQkJaXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYl9pbiwKLQkJCQkJCSBza2JfaW4tPm5oLnJhdyArCisJCQkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYl9pbikgKwogCQkJCQkJIChpcGgtPmlobCA8PCAyKSArCiAJCQkJCQkgb2Zmc2V0b2Yoc3RydWN0IGljbXBoZHIsCiAJCQkJCQkJICB0eXBlKSAtCkBAIC01MzYsNyArNTM3LDcgQEAKIAlpY21wX3BhcmFtLmRhdGEuaWNtcGgudW4uZ2F0ZXdheSA9IGluZm87CiAJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNoZWNrc3VtCSA9IDA7CiAJaWNtcF9wYXJhbS5za2IJICA9IHNrYl9pbjsKLQlpY21wX3BhcmFtLm9mZnNldCA9IHNrYl9pbi0+bmgucmF3IC0gc2tiX2luLT5kYXRhOworCWljbXBfcGFyYW0ub2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYl9pbik7CiAJaWNtcF9vdXRfY291bnQoaWNtcF9wYXJhbS5kYXRhLmljbXBoLnR5cGUpOwogCWluZXRfc2soaWNtcF9zb2NrZXQtPnNrKS0+dG9zID0gdG9zOwogCWlwYy5hZGRyID0gaXBoLT5zYWRkcjsKQEAgLTYxMyw3ICs2MTQsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJZ290byBvdXRfZXJyOwogCi0JaWNtcGggPSBza2ItPmguaWNtcGg7CisJaWNtcGggPSBpY21wX2hkcihza2IpOwogCWlwaCAgID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKIAogCWlmIChpcGgtPmlobCA8IDUpIC8qIE1hbmdsZWQgaGVhZGVyLCBkcm9wLiAqLwpAQCAtNjc2LDcgKzY3Nyw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIldS4ldS4ldS4ldSBzZW50IGFuIGludmFsaWQgSUNNUCAiCiAJCQkJCSAgICAidHlwZSAldSwgY29kZSAldSAiCiAJCQkJCSAgICAiZXJyb3IgdG8gYSBicm9hZGNhc3Q6ICV1LiV1LiV1LiV1IG9uICVzXG4iLAotCQkJICAgICAgIE5JUFFVQUQoc2tiLT5uaC5pcGgtPnNhZGRyKSwKKwkJCSAgICAgICBOSVBRVUFEKGlwX2hkcihza2IpLT5zYWRkciksCiAJCQkgICAgICAgaWNtcGgtPnR5cGUsIGljbXBoLT5jb2RlLAogCQkJICAgICAgIE5JUFFVQUQoaXBoLT5kYWRkciksCiAJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUpOwpAQCAtNzQzLDcgKzc0NCw3IEBACiAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOwogCi0Jc3dpdGNoIChza2ItPmguaWNtcGgtPmNvZGUgJiA3KSB7CisJc3dpdGNoIChpY21wX2hkcihza2IpLT5jb2RlICYgNykgewogCWNhc2UgSUNNUF9SRURJUl9ORVQ6CiAJY2FzZSBJQ01QX1JFRElSX05FVFRPUzoKIAkJLyoKQEAgLTc1MSw4ICs3NTIsOCBAQAogCQkgKi8KIAljYXNlIElDTVBfUkVESVJfSE9TVDoKIAljYXNlIElDTVBfUkVESVJfSE9TVFRPUzoKLQkJaXBfcnRfcmVkaXJlY3Qoc2tiLT5uaC5pcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJICAgICAgIHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSwKKwkJaXBfcnRfcmVkaXJlY3QoaXBfaGRyKHNrYiktPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJICAgICAgIGljbXBfaGRyKHNrYiktPnVuLmdhdGV3YXksCiAJCQkgICAgICAgaXBoLT5zYWRkciwgc2tiLT5kZXYpOwogCQlicmVhazsKIAl9CkBAIC03ODAsNyArNzgxLDcgQEAKIAlpZiAoIXN5c2N0bF9pY21wX2VjaG9faWdub3JlX2FsbCkgewogCQlzdHJ1Y3QgaWNtcF9ieG0gaWNtcF9wYXJhbTsKIAotCQlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqc2tiLT5oLmljbXBoOworCQlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqaWNtcF9oZHIoc2tiKTsKIAkJaWNtcF9wYXJhbS5kYXRhLmljbXBoLnR5cGUgPSBJQ01QX0VDSE9SRVBMWTsKIAkJaWNtcF9wYXJhbS5za2IJCSAgID0gc2tiOwogCQlpY21wX3BhcmFtLm9mZnNldAkgICA9IDA7CkBAIC04MTYsNyArODE3LDcgQEAKIAlpY21wX3BhcmFtLmRhdGEudGltZXNbMl0gPSBpY21wX3BhcmFtLmRhdGEudGltZXNbMV07CiAJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmaWNtcF9wYXJhbS5kYXRhLnRpbWVzWzBdLCA0KSkKIAkJQlVHKCk7Ci0JaWNtcF9wYXJhbS5kYXRhLmljbXBoCSAgID0gKnNrYi0+aC5pY21waDsKKwlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqaWNtcF9oZHIoc2tiKTsKIAlpY21wX3BhcmFtLmRhdGEuaWNtcGgudHlwZSA9IElDTVBfVElNRVNUQU1QUkVQTFk7CiAJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNvZGUgPSAwOwogCWljbXBfcGFyYW0uc2tiCQkgICA9IHNrYjsKQEAgLTk0Myw3ICs5NDQsNyBAQAogCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSkpCiAJCWdvdG8gZXJyb3I7CiAKLQlpY21waCA9IHNrYi0+aC5pY21waDsKKwlpY21waCA9IGljbXBfaGRyKHNrYik7CiAKIAkvKgogCSAqCTE4IGlzIHRoZSBoaWdoZXN0ICdrbm93bicgSUNNUCB0eXBlLiBBbnl0aGluZyBlbHNlIGlzIGEgbXlzdGVyeQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDhjZWRiMmEuLjI1MDYwMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTMxNCw3ICszMTQsOSBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKIAotCXNrYi0+bmguaXBoID0gcGlwID0oc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKzQpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXBpcCA9IGlwX2hkcihza2IpOworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIDQpOwogCiAJcGlwLT52ZXJzaW9uICA9IDQ7CiAJcGlwLT5paGwgICAgICA9IChzaXplb2Yoc3RydWN0IGlwaGRyKSs0KT4+MjsKQEAgLTMzMSw4ICszMzMsOSBAQAogCSgodTgqKSZwaXBbMV0pWzJdID0gMDsKIAkoKHU4KikmcGlwWzFdKVszXSA9IDA7CiAKLQlwaWcgPShzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBpZykpOwotCXNrYi0+aC5pZ21waCA9IChzdHJ1Y3QgaWdtcGhkciAqKXBpZzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OworCXNrYl9wdXQoc2tiLCBzaXplb2YoKnBpZykpOworCXBpZyA9IGlnbXB2M19yZXBvcnRfaGRyKHNrYik7CiAJcGlnLT50eXBlID0gSUdNUFYzX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQ7CiAJcGlnLT5yZXN2MSA9IDA7CiAJcGlnLT5jc3VtID0gMDsKQEAgLTM0MywxNiArMzQ2LDE0IEBACiAKIHN0YXRpYyBpbnQgaWdtcHYzX3NlbmRwYWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICpwaXAgPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgaWdtcGhkciAqcGlnID0gc2tiLT5oLmlnbXBoOwotCWludCBpcGxlbiwgaWdtcGxlbjsKKwlzdHJ1Y3QgaXBoZHIgKnBpcCA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpZ21waGRyICpwaWcgPSBpZ21wX2hkcihza2IpOworCWNvbnN0IGludCBpcGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmV0d29ya19oZWFkZXI7CisJY29uc3QgaW50IGlnbXBsZW4gPSBza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CiAKLQlpcGxlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopc2tiLT5uaC5pcGg7CiAJcGlwLT50b3RfbGVuID0gaHRvbnMoaXBsZW4pOwogCWlwX3NlbmRfY2hlY2socGlwKTsKLQotCWlnbXBsZW4gPSBza2ItPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKXNrYi0+aC5pZ21waDsKLQlwaWctPmNzdW0gPSBpcF9jb21wdXRlX2NzdW0oKHZvaWQgKilza2ItPmguaWdtcGgsIGlnbXBsZW4pOworCXBpZy0+Y3N1bSA9IGlwX2NvbXB1dGVfY3N1bShpZ21wX2hkcihza2IpLCBpZ21wbGVuKTsKIAogCXJldHVybiBORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpAQCAtMzc5LDcgKzM4MCw3IEBACiAJcGdyLT5ncmVjX2F1eHdvcmRzID0gMDsKIAlwZ3ItPmdyZWNfbnNyY3MgPSAwOwogCXBnci0+Z3JlY19tY2EgPSBwbWMtPm11bHRpYWRkcjsKLQlwaWggPSAoc3RydWN0IGlnbXB2M19yZXBvcnQgKilza2ItPmguaWdtcGg7CisJcGloID0gaWdtcHYzX3JlcG9ydF9oZHIoc2tiKTsKIAlwaWgtPm5ncmVjID0gaHRvbnMobnRvaHMocGloLT5uZ3JlYykrMSk7CiAJKnBwZ3IgPSBwZ3I7CiAJcmV0dXJuIHNrYjsKQEAgLTQxMiw3ICs0MTMsNyBAQAogCWlmICghKnBzZl9saXN0KQogCQlnb3RvIGVtcHR5X3NvdXJjZTsKIAotCXBpaCA9IHNrYiA/IChzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYi0+aC5pZ21waCA6IE5VTEw7CisJcGloID0gc2tiID8gaWdtcHYzX3JlcG9ydF9oZHIoc2tiKSA6IE5VTEw7CiAKIAkvKiBFWCBhbmQgVE9fRVggZ2V0IGEgZnJlc2ggcGFja2V0LCBpZiBuZWVkZWQgKi8KIAlpZiAodHJ1bmNhdGUpIHsKQEAgLTY2NCw3ICs2NjUsOSBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKIAotCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSs0KTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0KTsKIAogCWlwaC0+dmVyc2lvbiAgPSA0OwogCWlwaC0+aWhsICAgICAgPSAoc2l6ZW9mKHN0cnVjdCBpcGhkcikrNCk+PjI7CkBAIC04MjcsOCArODMwLDggQEAKIHN0YXRpYyB2b2lkIGlnbXBfaGVhcmRfcXVlcnkoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCWludCBsZW4pCiB7Ci0Jc3RydWN0IGlnbXBoZHIgCQkqaWggPSBza2ItPmguaWdtcGg7Ci0Jc3RydWN0IGlnbXB2M19xdWVyeSAqaWgzID0gKHN0cnVjdCBpZ21wdjNfcXVlcnkgKilpaDsKKwlzdHJ1Y3QgaWdtcGhkciAJCSppaCA9IGlnbXBfaGRyKHNrYik7CisJc3RydWN0IGlnbXB2M19xdWVyeSAqaWgzID0gaWdtcHYzX3F1ZXJ5X2hkcihza2IpOwogCXN0cnVjdCBpcF9tY19saXN0CSppbTsKIAlfX2JlMzIJCQlncm91cCA9IGloLT5ncm91cDsKIAlpbnQJCQltYXhfZGVsYXk7CkBAIC04NjEsMTIgKzg2NCwxMiBAQAogCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlnbXB2M19xdWVyeSkpKQogCQkJcmV0dXJuOwogCi0JCWloMyA9IChzdHJ1Y3QgaWdtcHYzX3F1ZXJ5ICopIHNrYi0+aC5yYXc7CisJCWloMyA9IGlnbXB2M19xdWVyeV9oZHIoc2tiKTsKIAkJaWYgKGloMy0+bnNyY3MpIHsKIAkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWdtcHYzX3F1ZXJ5KQogCQkJCQkgICArIG50b2hzKGloMy0+bnNyY3MpKnNpemVvZihfX2JlMzIpKSkKIAkJCQlyZXR1cm47Ci0JCQlpaDMgPSAoc3RydWN0IGlnbXB2M19xdWVyeSAqKSBza2ItPmgucmF3OworCQkJaWgzID0gaWdtcHYzX3F1ZXJ5X2hkcihza2IpOwogCQl9CiAKIAkJbWF4X2RlbGF5ID0gSUdNUFYzX01SQyhpaDMtPmNvZGUpKihIWi9JR01QX1RJTUVSX1NDQUxFKTsKQEAgLTk0Myw3ICs5NDYsNyBAQAogCQkJZ290byBkcm9wOwogCX0KIAotCWloID0gc2tiLT5oLmlnbXBoOworCWloID0gaWdtcF9oZHIoc2tiKTsKIAlzd2l0Y2ggKGloLT50eXBlKSB7CiAJY2FzZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9RVUVSWToKIAkJaWdtcF9oZWFyZF9xdWVyeShpbl9kZXYsIHNrYiwgbGVuKTsKQEAgLTIzOTcsNyArMjQwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpZ21wX21jX3NlcV9vcHMgPSB7CiAJLnN0YXJ0CT0JaWdtcF9tY19zZXFfc3RhcnQsCiAJLm5leHQJPQlpZ21wX21jX3NlcV9uZXh0LAogCS5zdG9wCT0JaWdtcF9tY19zZXFfc3RvcCwKQEAgLTI1NzEsNyArMjU3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY2Zfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY2Zfc2VxX29wcyA9IHsKIAkuc3RhcnQJPQlpZ21wX21jZl9zZXFfc3RhcnQsCiAJLm5leHQJPQlpZ21wX21jZl9zZXFfbmV4dCwKIAkuc3RvcAk9CWlnbXBfbWNmX3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCA1ZGY3MWNkLi5kYmVhY2Q4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2hhc2h0YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXQ2X2hhc2h0YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpAQCAtNjAsNyArNjEsNyBAQAogCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKIAl2b2lkICppbmZvID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21lbWluZm8gICptaW5mbyA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwogCiAJaGFuZGxlciA9IGluZXRfZGlhZ190YWJsZVt1bmxoLT5ubG1zZ190eXBlXTsKQEAgLTE0NywxMiArMTQ4LDEyIEBACiAJICAgIGljc2stPmljc2tfY2Ffb3BzICYmIGljc2stPmljc2tfY2Ffb3BzLT5nZXRfaW5mbykKIAkJaWNzay0+aWNza19jYV9vcHMtPmdldF9pbmZvKHNrLCBleHQsIHNrYik7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6CiBubG1zZ19mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKQEAgLTE2Myw3ICsxNjQsNyBAQAogewogCWxvbmcgdG1vOwogCXN0cnVjdCBpbmV0X2RpYWdfbXNnICpyOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZXZpb3VzX3RhaWwgPSBza2ItPnRhaWw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHJldmlvdXNfdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLAogCQkJCQkgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSk7CiAKQEAgLTIwNSwxMCArMjA2LDEwIEBACiAJCQkgICAgICAgJnR3Ni0+dHdfdjZfZGFkZHIpOwogCX0KICNlbmRpZgotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gcHJldmlvdXNfdGFpbDsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHByZXZpb3VzX3RhaWw7CiAJcmV0dXJuIHNrYi0+bGVuOwogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIHByZXZpb3VzX3RhaWwgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBwcmV2aW91c190YWlsKTsKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCkBAIC01MzUsNyArNTM2LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJbG9uZyB0bW87CkBAIC01NzQsMTIgKzU3NSwxMiBAQAogCQkJICAgICAgICZpbmV0Nl9yc2socmVxKS0+cm10X2FkZHIpOwogCX0KICNlbmRpZgotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC04MDUsNjggKzgwNiw0MyBAQAogCXJldHVybiBza2ItPmxlbjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaW5ldF9kaWFnX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCitzdGF0aWMgaW50IGluZXRfZGlhZ19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfUkVRVUVTVCkpCi0JCXJldHVybiAwOworCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19yZXEpOwogCi0JaWYgKG5saC0+bmxtc2dfdHlwZSA+PSBJTkVUX0RJQUdfR0VUU09DS19NQVgpCi0JCWdvdG8gZXJyX2ludmFsOworCWlmIChubGgtPm5sbXNnX3R5cGUgPj0gSU5FVF9ESUFHX0dFVFNPQ0tfTUFYIHx8CisJICAgIG5sbXNnX2xlbihubGgpIDwgaGRybGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpbmV0X2RpYWdfdGFibGVbbmxoLT5ubG1zZ190eXBlXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWlmIChOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxKSkgPiBza2ItPmxlbikKLQkJZ290byBlcnJfaW52YWw7CisJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CisJCWlmIChubG1zZ19hdHRybGVuKG5saCwgaGRybGVuKSkgeworCQkJc3RydWN0IG5sYXR0ciAqYXR0cjsKIAotCWlmIChubGgtPm5sbXNnX2ZsYWdzJk5MTV9GX0RVTVApIHsKLQkJaWYgKG5saC0+bmxtc2dfbGVuID4KLQkJICAgICg0ICsgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxKSkpKSB7Ci0JCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSAodm9pZCAqKShOTE1TR19EQVRBKG5saCkgKwotCQkJCQkJIHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSkpOwotCQkJaWYgKHJ0YS0+cnRhX3R5cGUgIT0gSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSB8fAotCQkJICAgIHJ0YS0+cnRhX2xlbiA8IDggfHwKLQkJCSAgICBydGEtPnJ0YV9sZW4gPgotCQkJICAgIChubGgtPm5sbXNnX2xlbiAtCi0JCQkgICAgIE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSkpKSkKLQkJCQlnb3RvIGVycl9pbnZhbDsKLQkJCWlmIChpbmV0X2RpYWdfYmNfYXVkaXQoUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSkpCi0JCQkJZ290byBlcnJfaW52YWw7CisJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKG5saCwgaGRybGVuLAorCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7CisJCQlpZiAoYXR0ciA9PSBOVUxMIHx8CisJCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAorCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwogCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGlkaWFnbmwsIHNrYiwgbmxoLAogCQkJCQkgIGluZXRfZGlhZ19kdW1wLCBOVUxMKTsKLQl9IGVsc2UKLQkJcmV0dXJuIGluZXRfZGlhZ19nZXRfZXhhY3Qoc2tiLCBubGgpOwotCi1lcnJfaW52YWw6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGluZXRfZGlhZ19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCWludCBlcnI7Ci0JCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKLQotCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwKLQkJICAgIHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCi0JCQlyZXR1cm47Ci0JCWVyciA9IGluZXRfZGlhZ19yY3ZfbXNnKHNrYiwgbmxoKTsKLQkJaWYgKGVyciB8fCBubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQUNLKQotCQkJbmV0bGlua19hY2soc2tiLCBubGgsIGVycik7CiAJfQorCisJcmV0dXJuIGluZXRfZGlhZ19nZXRfZXhhY3Qoc2tiLCBubGgpOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0X2RpYWdfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCBxbGVuID0gc2tiX3F1ZXVlX2xlbigmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXVuc2lnbmVkIGludCBxbGVuID0gMDsKIAotCXdoaWxlIChxbGVuLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7Ci0JCWluZXRfZGlhZ19yY3Zfc2tiKHNrYik7Ci0JCWtmcmVlX3NrYihza2IpOwotCX0KKwlkbyB7CisJCW5ldGxpbmtfcnVuX3F1ZXVlKHNrLCAmcWxlbiwgJmluZXRfZGlhZ19yY3ZfbXNnKTsKKwl9IHdoaWxlIChxbGVuKTsKIH0KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0X2RpYWdfcmVnaXN0ZXJfbG9jayk7CkBAIC05MTcsNyArODkzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZGlhZ25sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSU5FVF9ESUFHLCAwLCBpbmV0X2RpYWdfcmN2LAotCQkJCQlUSElTX01PRFVMRSk7CisJCQkJCU5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoaWRpYWdubCA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX3RhYmxlOwogCWVyciA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCBkYjNlZjk2Li4yZjQ0ZTYxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTg3LDEwICs4NywxMiBAQAogCiBzdGF0aWMgaW50IHBlZXJfdG90YWw7CiAvKiBFeHBvcnRlZCBmb3Igc3lzY3RsX25ldF9pcHY0LiAgKi8KLWludCBpbmV0X3BlZXJfdGhyZXNob2xkID0gNjU1MzYgKyAxMjg7CS8qIHN0YXJ0IHRvIHRocm93IGVudHJpZXMgbW9yZQoraW50IGluZXRfcGVlcl90aHJlc2hvbGQgX19yZWFkX21vc3RseSA9IDY1NTM2ICsgMTI4OwkvKiBzdGFydCB0byB0aHJvdyBlbnRyaWVzIG1vcmUKIAkJCQkJICogYWdncmVzc2l2ZWx5IGF0IHRoaXMgc3RhZ2UgKi8KLWludCBpbmV0X3BlZXJfbWludHRsID0gMTIwICogSFo7CS8qIFRUTCB1bmRlciBoaWdoIGxvYWQ6IDEyMCBzZWMgKi8KLWludCBpbmV0X3BlZXJfbWF4dHRsID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLworaW50IGluZXRfcGVlcl9taW50dGwgX19yZWFkX21vc3RseSA9IDEyMCAqIEhaOwkvKiBUVEwgdW5kZXIgaGlnaCBsb2FkOiAxMjAgc2VjICovCitpbnQgaW5ldF9wZWVyX21heHR0bCBfX3JlYWRfbW9zdGx5ID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLworaW50IGluZXRfcGVlcl9nY19taW50aW1lIF9fcmVhZF9tb3N0bHkgPSAxMCAqIEhaOworaW50IGluZXRfcGVlcl9nY19tYXh0aW1lIF9fcmVhZF9tb3N0bHkgPSAxMjAgKiBIWjsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3BlZXIgKmluZXRfcGVlcl91bnVzZWRfaGVhZDsKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICoqaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZpbmV0X3BlZXJfdW51c2VkX2hlYWQ7CkBAIC05OSw5ICsxMDEsNiBAQAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKIAotLyogRXhwb3J0ZWQgZm9yIHN5c2N0bF9uZXRfaXB2NC4gICovCi1pbnQgaW5ldF9wZWVyX2djX21pbnRpbWUgPSAxMCAqIEhaLAotICAgIGluZXRfcGVlcl9nY19tYXh0aW1lID0gMTIwICogSFo7CiAKIC8qIENhbGxlZCBmcm9tIGlwX291dHB1dC5jOmlwX2luaXQgICovCiB2b2lkIF9faW5pdCBpbmV0X2luaXRwZWVycyh2b2lkKQpAQCAtMTUxLDIwICsxNTAsMjcgQEAKIAlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIH0KIAotLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4gKi8KLSNkZWZpbmUgbG9va3VwKGRhZGRyKSAJCQkJCQlcCisvKgorICogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4KKyAqIF9zdGFjayBpcyBrbm93biB0byBiZSBOVUxMIG9yIG5vdCBhdCBjb21waWxlIHRpbWUsCisgKiBzbyBjb21waWxlciB3aWxsIG9wdGltaXplIHRoZSBpZiAoX3N0YWNrKSB0ZXN0cy4KKyAqLworI2RlZmluZSBsb29rdXAoX2RhZGRyLF9zdGFjaykgCQkJCQlcCiAoewkJCQkJCQkJXAogCXN0cnVjdCBpbmV0X3BlZXIgKnUsICoqdjsJCQkJXAotCXN0YWNrcHRyID0gc3RhY2s7CQkJCQlcCi0JKnN0YWNrcHRyKysgPSAmcGVlcl9yb290OwkJCQlcCisJaWYgKF9zdGFjaykgewkJCQkJCVwKKwkJc3RhY2twdHIgPSBfc3RhY2s7CQkJCVwKKwkJKnN0YWNrcHRyKysgPSAmcGVlcl9yb290OwkJCVwKKwl9CQkJCQkJCVwKIAlmb3IgKHUgPSBwZWVyX3Jvb3Q7IHUgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewkJXAotCQlpZiAoZGFkZHIgPT0gdS0+djRkYWRkcikJCQlcCisJCWlmIChfZGFkZHIgPT0gdS0+djRkYWRkcikJCQlcCiAJCQlicmVhazsJCQkJCVwKLQkJaWYgKChfX2ZvcmNlIF9fdTMyKWRhZGRyIDwgKF9fZm9yY2UgX191MzIpdS0+djRkYWRkcikJXAorCQlpZiAoKF9fZm9yY2UgX191MzIpX2RhZGRyIDwgKF9fZm9yY2UgX191MzIpdS0+djRkYWRkcikJXAogCQkJdiA9ICZ1LT5hdmxfbGVmdDsJCQlcCiAJCWVsc2UJCQkJCQlcCiAJCQl2ID0gJnUtPmF2bF9yaWdodDsJCQlcCi0JCSpzdGFja3B0cisrID0gdjsJCQkJXAorCQlpZiAoX3N0YWNrKQkJCQkJXAorCQkJKnN0YWNrcHRyKysgPSB2OwkJCVwKIAkJdSA9ICp2OwkJCQkJCVwKIAl9CQkJCQkJCVwKIAl1OwkJCQkJCQlcCkBAIC0yODgsNyArMjk0LDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJnAtPnJlZmNudCkgPT0gMSkgewogCQlzdHJ1Y3QgaW5ldF9wZWVyICoqc3RhY2tbUEVFUl9NQVhERVBUSF07CiAJCXN0cnVjdCBpbmV0X3BlZXIgKioqc3RhY2twdHIsICoqKmRlbHA7Ci0JCWlmIChsb29rdXAocC0+djRkYWRkcikgIT0gcCkKKwkJaWYgKGxvb2t1cChwLT52NGRhZGRyLCBzdGFjaykgIT0gcCkKIAkJCUJVRygpOwogCQlkZWxwID0gc3RhY2twdHIgLSAxOyAvKiAqZGVscFswXSA9PSBwICovCiAJCWlmIChwLT5hdmxfbGVmdCA9PSBwZWVyX2F2bF9lbXB0eSkgewpAQCAtMzczLDcgKzM3OSw3IEBACiAKIAkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LiAqLwogCXJlYWRfbG9ja19iaCgmcGVlcl9wb29sX2xvY2spOwotCXAgPSBsb29rdXAoZGFkZHIpOworCXAgPSBsb29rdXAoZGFkZHIsIE5VTEwpOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQogCQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOwogCXJlYWRfdW5sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CkBAIC00MDAsNyArNDA2LDcgQEAKIAogCXdyaXRlX2xvY2tfYmgoJnBlZXJfcG9vbF9sb2NrKTsKIAkvKiBDaGVjayBpZiBhbiBlbnRyeSBoYXMgc3VkZGVubHkgYXBwZWFyZWQuICovCi0JcCA9IGxvb2t1cChkYWRkcik7CisJcCA9IGxvb2t1cChkYWRkciwgc3RhY2spOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQogCQlnb3RvIG91dF9mcmVlOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mb3J3YXJkLmMgYi9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKaW5kZXggMzY5ZTcyMS4uOWNiMDRkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCisrKyBiL25ldC9pcHY0L2lwX2ZvcndhcmQuYwpAQCAtNjcsMTQgKzY3LDE0IEBACiAJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpCiAJCWdvdG8gZHJvcDsKIAotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlza2JfZm9yd2FyZF9jc3VtKHNrYik7CiAKIAkvKgogCSAqCUFjY29yZGluZyB0byB0aGUgUkZDLCB3ZSBtdXN0IGZpcnN0IGRlY3JlYXNlIHRoZSBUVEwgZmllbGQuIElmCiAJICoJdGhhdCByZWFjaGVzIHplcm8sIHdlIG11c3QgcmVwbHkgYW4gSUNNUCBjb250cm9sIG1lc3NhZ2UgdGVsbGluZwogCSAqCXRoYXQgdGhlIHBhY2tldCdzIGxpZmV0aW1lIGV4cGlyZWQuCiAJICovCi0JaWYgKHNrYi0+bmguaXBoLT50dGwgPD0gMSkKKwlpZiAoaXBfaGRyKHNrYiktPnR0bCA8PSAxKQogCQlnb3RvIHRvb19tYW55X2hvcHM7CiAKIAlpZiAoIXhmcm00X3JvdXRlX2ZvcndhcmQoc2tiKSkKQEAgLTg1LDEwICs4NSwxOCBAQAogCWlmIChvcHQtPmlzX3N0cmljdHJvdXRlICYmIHJ0LT5ydF9kc3QgIT0gcnQtPnJ0X2dhdGV3YXkpCiAJCWdvdG8gc3JfZmFpbGVkOwogCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gZHN0X210dSgmcnQtPnUuZHN0KSAmJgorCSAgICAgICAgICAgICAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgJiYgIXNrYi0+bG9jYWxfZGYpIHsKKwkJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELAorCQkJICBodG9ubChkc3RfbXR1KCZydC0+dS5kc3QpKSk7CisJCWdvdG8gZHJvcDsKKwl9CisKIAkvKiBXZSBhcmUgYWJvdXQgdG8gbWFuZ2xlIHBhY2tldC4gQ29weSBpdCEgKi8KIAlpZiAoc2tiX2Nvdyhza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpK3J0LT51LmRzdC5oZWFkZXJfbGVuKSkKIAkJZ290byBkcm9wOwotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJLyogRGVjcmVhc2UgdHRsIGFmdGVyIHNrYiBjb3cgZG9uZSAqLwogCWlwX2RlY3JlYXNlX3R0bChpcGgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKaW5kZXggYjZmMDU1My4uMDIzMWJkYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCkBAIC05Miw3ICs5Miw3IEBACiAJc3BpbmxvY2tfdAlsb2NrOwogCWF0b21pY190CXJlZmNudDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogd2hlbiB3aWxsIHRoaXMgcXVldWUgZXhwaXJlPwkJKi8KLQlzdHJ1Y3QgdGltZXZhbAlzdGFtcDsKKwlrdGltZV90CQlzdGFtcDsKIAlpbnQgICAgICAgICAgICAgaWlmOwogCXVuc2lnbmVkIGludCAgICByaWQ7CiAJc3RydWN0IGluZXRfcGVlciAqcGVlcjsKQEAgLTE4NCw3ICsxODQsNyBAQAogewogCXN0cnVjdCBpcHEgKnFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcSksIEdGUF9BVE9NSUMpOwogCi0JaWYoIXFwKQorCWlmICghcXApCiAJCXJldHVybiBOVUxMOwogCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBpcHEpLCAmaXBfZnJhZ19tZW0pOwogCXJldHVybiBxcDsKQEAgLTMyMSwxMSArMzIxLDExIEBACiAJICogcHJvbW90ZWQgcmVhZCBsb2NrIHRvIHdyaXRlIGxvY2suCiAJICovCiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocXAsIG4sICZpcHFfaGFzaFtoYXNoXSwgbGlzdCkgewotCQlpZihxcC0+aWQgPT0gcXBfaW4tPmlkCQkmJgotCQkgICBxcC0+c2FkZHIgPT0gcXBfaW4tPnNhZGRyCSYmCi0JCSAgIHFwLT5kYWRkciA9PSBxcF9pbi0+ZGFkZHIJJiYKLQkJICAgcXAtPnByb3RvY29sID09IHFwX2luLT5wcm90b2NvbCAmJgotCQkgICBxcC0+dXNlciA9PSBxcF9pbi0+dXNlcikgeworCQlpZiAocXAtPmlkID09IHFwX2luLT5pZAkJJiYKKwkJICAgIHFwLT5zYWRkciA9PSBxcF9pbi0+c2FkZHIJJiYKKwkJICAgIHFwLT5kYWRkciA9PSBxcF9pbi0+ZGFkZHIJJiYKKwkJICAgIHFwLT5wcm90b2NvbCA9PSBxcF9pbi0+cHJvdG9jb2wgJiYKKwkJICAgIHFwLT51c2VyID09IHFwX2luLT51c2VyKSB7CiAJCQlhdG9taWNfaW5jKCZxcC0+cmVmY250KTsKIAkJCXdyaXRlX3VubG9jaygmaXBmcmFnX2xvY2spOwogCQkJcXBfaW4tPmxhc3RfaW4gfD0gQ09NUExFVEU7CkBAIC0zOTgsMTEgKzM5OCwxMSBAQAogCXJlYWRfbG9jaygmaXBmcmFnX2xvY2spOwogCWhhc2ggPSBpcHFoYXNoZm4oaWQsIHNhZGRyLCBkYWRkciwgcHJvdG9jb2wpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHFwLCBuLCAmaXBxX2hhc2hbaGFzaF0sIGxpc3QpIHsKLQkJaWYocXAtPmlkID09IGlkCQkmJgotCQkgICBxcC0+c2FkZHIgPT0gc2FkZHIJJiYKLQkJICAgcXAtPmRhZGRyID09IGRhZGRyCSYmCi0JCSAgIHFwLT5wcm90b2NvbCA9PSBwcm90b2NvbCAmJgotCQkgICBxcC0+dXNlciA9PSB1c2VyKSB7CisJCWlmIChxcC0+aWQgPT0gaWQJCSYmCisJCSAgICBxcC0+c2FkZHIgPT0gc2FkZHIJJiYKKwkJICAgIHFwLT5kYWRkciA9PSBkYWRkcgkmJgorCQkgICAgcXAtPnByb3RvY29sID09IHByb3RvY29sICYmCisJCSAgICBxcC0+dXNlciA9PSB1c2VyKSB7CiAJCQlhdG9taWNfaW5jKCZxcC0+cmVmY250KTsKIAkJCXJlYWRfdW5sb2NrKCZpcGZyYWdfbG9jayk7CiAJCQlyZXR1cm4gcXA7CkBAIC00NzksMTEgKzQ3OSwxMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlvZmZzZXQgPSBudG9ocyhza2ItPm5oLmlwaC0+ZnJhZ19vZmYpOworCW9mZnNldCA9IG50b2hzKGlwX2hkcihza2IpLT5mcmFnX29mZik7CiAJZmxhZ3MgPSBvZmZzZXQgJiB+SVBfT0ZGU0VUOwogCW9mZnNldCAmPSBJUF9PRkZTRVQ7CiAJb2Zmc2V0IDw8PSAzOwkJLyogb2Zmc2V0IGlzIGluIDgtYnl0ZSBjaHVua3MgKi8KLQlpaGwgPSBza2ItPm5oLmlwaC0+aWhsICogNDsKKwlpaGwgPSBpcF9oZHJsZW4oc2tiKTsKIAogCS8qIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdGhpcyBmcmFnbWVudC4gKi8KIAllbmQgPSBvZmZzZXQgKyBza2ItPmxlbiAtIGlobDsKQEAgLTUyNCw3ICs1MjQsNyBAQAogCSAqIHRoaXMgZnJhZ21lbnQsIHJpZ2h0PwogCSAqLwogCXByZXYgPSBOVUxMOwotCWZvcihuZXh0ID0gcXAtPmZyYWdtZW50czsgbmV4dCAhPSBOVUxMOyBuZXh0ID0gbmV4dC0+bmV4dCkgeworCWZvciAobmV4dCA9IHFwLT5mcmFnbWVudHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQtPm5leHQpIHsKIAkJaWYgKEZSQUdfQ0IobmV4dCktPm9mZnNldCA+PSBvZmZzZXQpCiAJCQlicmVhazsJLyogYmluZ28hICovCiAJCXByZXYgPSBuZXh0OwpAQCAtNTkyLDcgKzU5Miw3IEBACiAJaWYgKHNrYi0+ZGV2KQogCQlxcC0+aWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJc2tiLT5kZXYgPSBOVUxMOwotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnFwLT5zdGFtcCk7CisJcXAtPnN0YW1wID0gc2tiLT50c3RhbXA7CiAJcXAtPm1lYXQgKz0gc2tiLT5sZW47CiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOwogCWlmIChvZmZzZXQgPT0gMCkKQEAgLTYyNCwxMCArNjI0LDEwIEBACiAJQlVHX1RSQVAoRlJBR19DQihoZWFkKS0+b2Zmc2V0ID09IDApOwogCiAJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgZGF0YWdyYW0uICovCi0JaWhsZW4gPSBoZWFkLT5uaC5pcGgtPmlobCo0OworCWlobGVuID0gaXBfaGRybGVuKGhlYWQpOwogCWxlbiA9IGlobGVuICsgcXAtPmxlbjsKIAotCWlmKGxlbiA+IDY1NTM1KQorCWlmIChsZW4gPiA2NTUzNSkKIAkJZ290byBvdXRfb3ZlcnNpemU7CiAKIAkvKiBIZWFkIG9mIGxpc3QgbXVzdCBub3QgYmUgY2xvbmVkLiAqLwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJfQogCiAJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKLQlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KTsKKwlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKTsKIAlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOwogCiAJZm9yIChmcD1oZWFkLT5uZXh0OyBmcDsgZnAgPSBmcC0+bmV4dCkgewpAQCAtNjc0LDkgKzY3NCw5IEBACiAKIAloZWFkLT5uZXh0ID0gTlVMTDsKIAloZWFkLT5kZXYgPSBkZXY7Ci0Jc2tiX3NldF90aW1lc3RhbXAoaGVhZCwgJnFwLT5zdGFtcCk7CisJaGVhZC0+dHN0YW1wID0gcXAtPnN0YW1wOwogCi0JaXBoID0gaGVhZC0+bmguaXBoOworCWlwaCA9IGlwX2hkcihoZWFkKTsKIAlpcGgtPmZyYWdfb2ZmID0gMDsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhsZW4pOwogCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTU9LUyk7CkBAIC03MDAsNyArNzAwLDYgQEAKIC8qIFByb2Nlc3MgYW4gaW5jb21pbmcgSVAgZGF0YWdyYW0gZnJhZ21lbnQuICovCiBzdHJ1Y3Qgc2tfYnVmZiAqaXBfZGVmcmFnKHN0cnVjdCBza19idWZmICpza2IsIHUzMiB1c2VyKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CiAJc3RydWN0IGlwcSAqcXA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIApAQCAtNzEzLDcgKzcxMiw3IEBACiAJZGV2ID0gc2tiLT5kZXY7CiAKIAkvKiBMb29rdXAgKG9yIGNyZWF0ZSkgcXVldWUgaGVhZGVyICovCi0JaWYgKChxcCA9IGlwX2ZpbmQoaXBoLCB1c2VyKSkgIT0gTlVMTCkgeworCWlmICgocXAgPSBpcF9maW5kKGlwX2hkcihza2IpLCB1c2VyKSkgIT0gTlVMTCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqcmV0ID0gTlVMTDsKIAogCQlzcGluX2xvY2soJnFwLT5sb2NrKTsKQEAgLTczNCw3ICs3MzMsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIGlwZnJhZ19pbml0KHZvaWQpCit2b2lkIF9faW5pdCBpcGZyYWdfaW5pdCh2b2lkKQogewogCWlwZnJhZ19oYXNoX3JuZCA9ICh1MzIpICgobnVtX3BoeXNwYWdlcyBeIChudW1fcGh5c3BhZ2VzPj43KSkgXgogCQkJCSAoamlmZmllcyBeIChqaWZmaWVzID4+IDYpKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IDkxNTFkYTYuLjYzMjgyOTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC0xOTEsMTEgKzE5MSwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKmlwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQorc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKipfX2lwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zKQogewotCV9fYmUzMiByZW1vdGUgPSB0LT5wYXJtcy5pcGguZGFkZHI7Ci0JX19iZTMyIGxvY2FsID0gdC0+cGFybXMuaXBoLnNhZGRyOwotCV9fYmUzMiBrZXkgPSB0LT5wYXJtcy5pX2tleTsKKwlfX2JlMzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOworCV9fYmUzMiBrZXkgPSBwYXJtcy0+aV9rZXk7CiAJdW5zaWduZWQgaCA9IEhBU0goa2V5KTsKIAlpbnQgcHJpbyA9IDA7CiAKQEAgLTIwOSw2ICsyMDksMTEgQEAKIAlyZXR1cm4gJnR1bm5lbHNbcHJpb11baF07CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3R1bm5lbCAqKmlwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQoreworCXJldHVybiBfX2lwZ3JlX2J1Y2tldCgmdC0+cGFybXMpOworfQorCiBzdGF0aWMgdm9pZCBpcGdyZV90dW5uZWxfbGluayhzdHJ1Y3QgaXBfdHVubmVsICp0KQogewogCXN0cnVjdCBpcF90dW5uZWwgKip0cCA9IGlwZ3JlX2J1Y2tldCh0KTsKQEAgLTI0MCwxNyArMjQ1LDkgQEAKIAlfX2JlMzIga2V5ID0gcGFybXMtPmlfa2V5OwogCXN0cnVjdCBpcF90dW5uZWwgKnQsICoqdHAsICpudDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIGggPSBIQVNIKGtleSk7Ci0JaW50IHByaW8gPSAwOwogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAKLQlpZiAobG9jYWwpCi0JCXByaW8gfD0gMTsKLQlpZiAocmVtb3RlICYmICFNVUxUSUNBU1QocmVtb3RlKSkgewotCQlwcmlvIHw9IDI7Ci0JCWggXj0gSEFTSChyZW1vdGUpOwotCX0KLQlmb3IgKHRwID0gJnR1bm5lbHNbcHJpb11baF07ICh0ID0gKnRwKSAhPSBOVUxMOyB0cCA9ICZ0LT5uZXh0KSB7CisJZm9yICh0cCA9IF9faXBncmVfYnVja2V0KHBhcm1zKTsgKHQgPSAqdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpIHsKIAkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKSB7CiAJCQlpZiAoa2V5ID09IHQtPnBhcm1zLmlfa2V5KQogCQkJCXJldHVybiB0OwpAQCAtMzIwLDggKzMxNyw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7CiAJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2Kikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOwogCWludCBncmVobGVuID0gKGlwaC0+aWhsPDwyKSArIDQ7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCV9fYmUxNiBmbGFnczsKIApAQCAtMzg4LDggKzM4NSw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7CiAJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2KikoZHArKGlwaC0+aWhsPDwyKSk7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlpbnQgcmVsX3R5cGUgPSAwOwogCWludCByZWxfY29kZSA9IDA7CiAJX19iZTMyIHJlbF9pbmZvID0gMDsKQEAgLTQyMiw3ICs0MTksNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKLQkJbiA9IG50b2hsKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSkgPj4gMjQ7CisJCW4gPSBudG9obChpY21wX2hkcihza2IpLT51bi5nYXRld2F5KSA+PiAyNDsKIAkJaWYgKG4gPCAoaXBoLT5paGw8PDIpKQogCQkJcmV0dXJuOwogCkBAIC00NDIsNyArNDM5LDcgQEAKIAkJCXJldHVybjsKIAkJY2FzZSBJQ01QX0ZSQUdfTkVFREVEOgogCQkJLyogQW5kIGl0IGlzIHRoZSBvbmx5IHJlYWxseSBuZWNlc3NhcnkgdGhpbmcgOi0pICovCi0JCQluID0gbnRvaHMoc2tiLT5oLmljbXBoLT51bi5mcmFnLm10dSk7CisJCQluID0gbnRvaHMoaWNtcF9oZHIoc2tiKS0+dW4uZnJhZy5tdHUpOwogCQkJaWYgKG4gPCBncmVobGVuKzY4KQogCQkJCXJldHVybjsKIAkJCW4gLT0gZ3JlaGxlbjsKQEAgLTQ3NCw3ICs0NzEsNyBAQAogCWRzdF9yZWxlYXNlKHNrYjItPmRzdCk7CiAJc2tiMi0+ZHN0ID0gTlVMTDsKIAlza2JfcHVsbChza2IyLCBza2ItPmRhdGEgLSAodTgqKWVpcGgpOwotCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLwogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwpAQCAtNTMzLDkgKzUzMCw5IEBACiB7CiAJaWYgKElORVRfRUNOX2lzX2NlKGlwaC0+dG9zKSkgewogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJCUlQX0VDTl9zZXRfY2Uoc2tiLT5uaC5pcGgpOworCQkJSVBfRUNOX3NldF9jZShpcF9oZHIoc2tiKSk7CiAJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7CisJCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIAkJfQogCX0KIH0KQEAgLTU2NSw3ICs1NjIsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDE2KSkKIAkJZ290byBkcm9wX25vbG9jazsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWggPSBza2ItPmRhdGE7CiAJZmxhZ3MgPSAqKF9fYmUxNiopaDsKIApAQCAtNjE2LDkgKzYxMywxMCBAQAogCQkJCW9mZnNldCArPSA0OwogCQl9CiAKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7Ci0JCXNrYi0+bmgucmF3ID0gX19wc2tiX3B1bGwoc2tiLCBvZmZzZXQpOwotCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPmgucmF3LCBvZmZzZXQpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCQlfX3Bza2JfcHVsbChza2IsIG9mZnNldCk7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBvZmZzZXQpOwogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAjaWZkZWYgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QKIAkJaWYgKE1VTFRJQ0FTVChpcGgtPmRhZGRyKSkgewpAQCAtNjY5LDcgKzY2Nyw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHVubmVsLT5zdGF0OwotCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGlwaGRyICAqdGlwaDsKIAl1OCAgICAgdG9zOwogCV9fYmUxNiBkZjsKQEAgLTcyMCw3ICs3MTgsNyBAQAogCQkJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoYWRkcjYpOwogCiAJCQlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9BTlkpIHsKLQkJCQlhZGRyNiA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwkJCQlhZGRyNiA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAkJCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CiAJCQl9CiAKQEAgLTgyNCwxMSArODIyLDEyIEBACiAJCQlza2Jfc2V0X293bmVyX3cobmV3X3NrYiwgc2tiLT5zayk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCQlvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OwotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBncmVfaGxlbik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwlza2JfcHVzaChza2IsIGdyZV9obGVuKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwogCUlQQ0Ioc2tiKS0+ZmxhZ3MgJj0gfihJUFNLQl9YRlJNX1RVTk5FTF9TSVpFIHwgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCB8CiAJCQkgICAgICBJUFNLQl9SRVJPVVRFRCk7CkBAIC04MzksNyArODM4LDcgQEAKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwogCi0JaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoIAkJCT0JaXBfaGRyKHNrYik7CiAJaXBoLT52ZXJzaW9uCQk9CTQ7CiAJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKIAlpcGgtPmZyYWdfb2ZmCQk9CWRmOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfaW5wdXQuYyBiL25ldC9pcHY0L2lwX2lucHV0LmMKaW5kZXggZjM4ZTk3Ni4uMzI0ZTdlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfaW5wdXQuYworKysgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIGludCBpcF9jYWxsX3JhX2NoYWluKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwX3JhX2NoYWluICpyYTsKLQl1OCBwcm90b2NvbCA9IHNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwl1OCBwcm90b2NvbCA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKIAlzdHJ1Y3Qgc29jayAqbGFzdCA9IE5VTEw7CiAKIAlyZWFkX2xvY2soJmlwX3JhX2xvY2spOwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCWlmIChzayAmJiBpbmV0X3NrKHNrKS0+bnVtID09IHByb3RvY29sICYmCiAJCSAgICAoIXNrLT5za19ib3VuZF9kZXZfaWYgfHwKIAkJICAgICBzay0+c2tfYm91bmRfZGV2X2lmID09IHNrYi0+ZGV2LT5pZmluZGV4KSkgewotCQkJaWYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwkJCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKIAkJCQlza2IgPSBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfQ0FMTF9SQV9DSEFJTik7CiAJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCQkJCXJlYWRfdW5sb2NrKCZpcF9yYV9sb2NrKTsKQEAgLTE5OCwxNyArMTk4LDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGlwX2xvY2FsX2RlbGl2ZXJfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGlobCA9IHNrYi0+bmguaXBoLT5paGwqNDsKLQotCV9fc2tiX3B1bGwoc2tiLCBpaGwpOworCV9fc2tiX3B1bGwoc2tiLCBpcF9oZHJsZW4oc2tiKSk7CiAKIAkvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSwganVzdCBwYXN0IHRoZSBoZWFkZXIuICovCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXsKIAkJLyogTm90ZTogU2VlIHJhdy5jIGFuZCBuZXQvcmF3LmgsIFJBV1Y0X0hUQUJMRV9TSVpFPT1NQVhfSU5FVF9QUk9UT1MgKi8KLQkJaW50IHByb3RvY29sID0gc2tiLT5uaC5pcGgtPnByb3RvY29sOworCQlpbnQgcHJvdG9jb2wgPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAJCWludCBoYXNoOwogCQlzdHJ1Y3Qgc29jayAqcmF3X3NrOwogCQlzdHJ1Y3QgbmV0X3Byb3RvY29sICppcHByb3Q7CkBAIC0yMjAsNyArMjE4LDcgQEAKIAkJLyogSWYgdGhlcmUgbWF5YmUgYSByYXcgc29ja2V0IHdlIG11c3QgY2hlY2sgLSBpZiBub3Qgd2UKIAkJICogZG9uJ3QgY2FyZSBsZXNzCiAJCSAqLwotCQlpZiAocmF3X3NrICYmICFyYXdfdjRfaW5wdXQoc2tiLCBza2ItPm5oLmlwaCwgaGFzaCkpCisJCWlmIChyYXdfc2sgJiYgIXJhd192NF9pbnB1dChza2IsIGlwX2hkcihza2IpLCBoYXNoKSkKIAkJCXJhd19zayA9IE5VTEw7CiAKIAkJaWYgKChpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldF9wcm90b3NbaGFzaF0pKSAhPSBOVUxMKSB7CkBAIC0yNjYsNyArMjY0LDcgQEAKIAkgKglSZWFzc2VtYmxlIElQIGZyYWdtZW50cy4KIAkgKi8KIAotCWlmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgewogCQlza2IgPSBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfTE9DQUxfREVMSVZFUik7CiAJCWlmICghc2tiKQogCQkJcmV0dXJuIDA7CkBAIC0yOTQsNyArMjkyLDcgQEAKIAkJZ290byBkcm9wOwogCX0KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKGlwX29wdGlvbnNfY29tcGlsZShOVUxMLCBza2IpKSB7CiAJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CkBAIC0zMzAsNyArMzI4LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXBfcmN2X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCS8qCiAJICoJSW5pdGlhbGlzZSB0aGUgdmlydHVhbCBwYXRoIGNhY2hlIGZvciB0aGUgcGFja2V0LiBJdCBkZXNjcmliZXMKQEAgLTM5MSw3ICszODksNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJZ290byBpbmhkcl9lcnJvcjsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJLyoKIAkgKglSRkMxMTIyOiAzLjEuMi4yIE1VU1Qgc2lsZW50bHkgZGlzY2FyZCBhbnkgSVAgZnJhbWUgdGhhdCBmYWlscyB0aGUgY2hlY2tzdW0uCkBAIC00MTAsNyArNDA4LDcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBpcGgtPmlobCo0KSkKIAkJZ290byBpbmhkcl9lcnJvcjsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKHVubGlrZWx5KGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKSkpCiAJCWdvdG8gaW5oZHJfZXJyb3I7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKaW5kZXggZjkwNmE4MC4uMjUxMzQ2ODIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTQwLDcgKzQwLDcgQEAKIHZvaWQgaXBfb3B0aW9uc19idWlsZChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgc3RydWN0IGlwX29wdGlvbnMgKiBvcHQsCiAJCQkgICAgX19iZTMyIGRhZGRyLCBzdHJ1Y3QgcnRhYmxlICpydCwgaW50IGlzX2ZyYWcpCiB7Ci0JdW5zaWduZWQgY2hhciAqIGlwaCA9IHNrYi0+bmgucmF3OworCXVuc2lnbmVkIGNoYXIgKmlwaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJbWVtY3B5KCYoSVBDQihza2IpLT5vcHQpLCBvcHQsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOwogCW1lbWNweShpcGgrc2l6ZW9mKHN0cnVjdCBpcGhkciksIG9wdC0+X19kYXRhLCBvcHQtPm9wdGxlbik7CkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlzcHRyID0gc2tiLT5uaC5yYXc7CisJc3B0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCWRwdHIgPSBkb3B0LT5fX2RhdGE7CiAKIAlpZiAoc2tiLT5kc3QpCiAJCWRhZGRyID0gKChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdCktPnJ0X3NwZWNfZHN0OwogCWVsc2UKLQkJZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisJCWRhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCiAJaWYgKHNvcHQtPnJyKSB7CiAJCW9wdGxlbiAgPSBzcHRyW3NvcHQtPnJyKzFdOwpAQCAtMTgwLDcgKzE4MCw4IEBACiAJCQkvKgogCQkJICogUkZDMTgxMiByZXF1aXJlcyB0byBmaXggaWxsZWdhbCBzb3VyY2Ugcm91dGVzLgogCQkJICovCi0JCQlpZiAobWVtY21wKCZza2ItPm5oLmlwaC0+c2FkZHIsICZzdGFydFtzb2Zmc2V0KzNdLCA0KSA9PSAwKQorCQkJaWYgKG1lbWNtcCgmaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCSAgICZzdGFydFtzb2Zmc2V0ICsgM10sIDQpID09IDApCiAJCQkJZG9mZnNldCAtPSA0OwogCQl9CiAJCWlmIChkb2Zmc2V0ID4gMykgewpAQCAtMjE3LDcgKzIxOCw3IEBACiAKIHZvaWQgaXBfb3B0aW9uc19mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYikKIHsKLQl1bnNpZ25lZCBjaGFyICogb3B0cHRyID0gc2tiLT5uaC5yYXcgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwl1bnNpZ25lZCBjaGFyICpvcHRwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCXN0cnVjdCBpcF9vcHRpb25zICogb3B0ID0gJihJUENCKHNrYiktPm9wdCk7CiAJaW50ICBsID0gb3B0LT5vcHRsZW47CiAJaW50ICBvcHRsZW47CkBAIC0yNjQsMTIgKzI2NSwxMyBAQAogCiAJaWYgKCFvcHQpIHsKIAkJb3B0ID0gJihJUENCKHNrYiktPm9wdCk7Ci0JCWlwaCA9IHNrYi0+bmgucmF3OworCQlpcGggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJb3B0LT5vcHRsZW4gPSAoKHN0cnVjdCBpcGhkciAqKWlwaCktPmlobCo0IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CiAJCW9wdHB0ciA9IGlwaCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCQlvcHQtPmlzX2RhdGEgPSAwOwogCX0gZWxzZSB7Ci0JCW9wdHB0ciA9IG9wdC0+aXNfZGF0YSA/IG9wdC0+X19kYXRhIDogKHVuc2lnbmVkIGNoYXIqKSYoc2tiLT5uaC5pcGhbMV0pOworCQlvcHRwdHIgPSBvcHQtPmlzX2RhdGEgPyBvcHQtPl9fZGF0YSA6CisJCQkJCSh1bnNpZ25lZCBjaGFyICopJihpcF9oZHIoc2tiKVsxXSk7CiAJCWlwaCA9IG9wdHB0ciAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCX0KIApAQCAtNTYzLDcgKzU2NSw3IEBACiAJc3RydWN0ICAgaXBfb3B0aW9ucyAqIG9wdAk9ICYoSVBDQihza2IpLT5vcHQpOwogCXVuc2lnbmVkIGNoYXIgKiBvcHRwdHI7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7Ci0JdW5zaWduZWQgY2hhciAqcmF3ID0gc2tiLT5uaC5yYXc7CisJdW5zaWduZWQgY2hhciAqcmF3ID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlpZiAob3B0LT5ycl9uZWVkYWRkcikgewogCQlvcHRwdHIgPSAodW5zaWduZWQgY2hhciAqKXJhdyArIG9wdC0+cnI7CkBAIC01ODcsNyArNTg5LDcgQEAKIAkJaWYgKHNycnB0ciArIDMgPD0gc3Jyc3BhY2UpIHsKIAkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CiAJCQlpcF9ydF9nZXRfc291cmNlKCZvcHRwdHJbc3JycHRyLTFdLCBydCk7Ci0JCQlza2ItPm5oLmlwaC0+ZGFkZHIgPSBydC0+cnRfZHN0OworCQkJaXBfaGRyKHNrYiktPmRhZGRyID0gcnQtPnJ0X2RzdDsKIAkJCW9wdHB0clsyXSA9IHNycnB0cis0OwogCQl9IGVsc2UgaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0NSSVQgImlwX2ZvcndhcmQoKTogQXJnaCEgRGVzdGluYXRpb24gbG9zdCFcbiIpOwpAQCAtNTk5LDcgKzYwMSw3IEBACiAJfQogCWlmIChvcHQtPmlzX2NoYW5nZWQpIHsKIAkJb3B0LT5pc19jaGFuZ2VkID0gMDsKLQkJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCX0KIH0KIApAQCAtNjA4LDggKzYxMCw4IEBACiAJc3RydWN0IGlwX29wdGlvbnMgKm9wdCA9ICYoSVBDQihza2IpLT5vcHQpOwogCWludCBzcnJzcGFjZSwgc3JycHRyOwogCV9fYmUzMiBuZXh0aG9wOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0JdW5zaWduZWQgY2hhciAqIG9wdHB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5zcnI7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwl1bnNpZ25lZCBjaGFyICpvcHRwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIG9wdC0+c3JyOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OwogCXN0cnVjdCBydGFibGUgKnJ0MjsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBkMDk2MzMyLi41MzQ2NTBjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtOTUsOCArOTUsOCBAQAogLyogZGV2X2xvb3BiYWNrX3htaXQgZm9yIHVzZSB3aXRoIG5ldGZpbHRlci4gKi8KIHN0YXRpYyBpbnQgaXBfZGV2X2xvb3BiYWNrX3htaXQoc3RydWN0IHNrX2J1ZmYgKm5ld3NrYikKIHsKLQluZXdza2ItPm1hYy5yYXcgPSBuZXdza2ItPmRhdGE7Ci0JX19za2JfcHVsbChuZXdza2IsIG5ld3NrYi0+bmgucmF3IC0gbmV3c2tiLT5kYXRhKTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihuZXdza2IpOworCV9fc2tiX3B1bGwobmV3c2tiLCBza2JfbmV0d29ya19vZmZzZXQobmV3c2tiKSk7CiAJbmV3c2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9MT09QQkFDSzsKIAluZXdza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCUJVR19UUkFQKG5ld3NrYi0+ZHN0KTsKQEAgLTEyNSwxMSArMTI1LDkgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAogCS8qIEJ1aWxkIHRoZSBJUCBoZWFkZXIuICovCi0JaWYgKG9wdCkKLQkJaXBoPShzdHJ1Y3QgaXBoZHIgKilza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBvcHQtPm9wdGxlbik7Ci0JZWxzZQotCQlpcGg9KHN0cnVjdCBpcGhkciAqKXNrYl9wdXNoKHNrYixzaXplb2Yoc3RydWN0IGlwaGRyKSk7Ci0KKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCkpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlwaC0+dmVyc2lvbiAgPSA0OwogCWlwaC0+aWhsICAgICAgPSA1OwogCWlwaC0+dG9zICAgICAgPSBpbmV0LT50b3M7CkBAIC0xNDMsNyArMTQxLDYgQEAKIAlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOwogCWlwaC0+dG90X2xlbiAgPSBodG9ucyhza2ItPmxlbik7CiAJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgc2spOwotCXNrYi0+bmguaXBoICAgPSBpcGg7CiAKIAlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CiAJCWlwaC0+aWhsICs9IG9wdC0+b3B0bGVuPj4yOwpAQCAtMTkyLDYgKzE4OSwxNCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpcF9za2JfZHN0X210dShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBza2ItPnNrID8gaW5ldF9zayhza2ItPnNrKSA6IE5VTEw7CisKKwlyZXR1cm4gKGluZXQgJiYgaW5ldC0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfUFJPQkUpID8KKwkgICAgICAgc2tiLT5kc3QtPmRldi0+bXR1IDogZHN0X210dShza2ItPmRzdCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlwX2ZpbmlzaF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19ORVRGSUxURVIpICYmIGRlZmluZWQoQ09ORklHX1hGUk0pCkBAIC0yMDEsNyArMjA2LDcgQEAKIAkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKIAl9CiAjZW5kaWYKLQlpZiAoc2tiLT5sZW4gPiBkc3RfbXR1KHNrYi0+ZHN0KSAmJiAhc2tiX2lzX2dzbyhza2IpKQorCWlmIChza2ItPmxlbiA+IGlwX3NrYl9kc3RfbXR1KHNrYikgJiYgIXNrYl9pc19nc28oc2tiKSkKIAkJcmV0dXJuIGlwX2ZyYWdtZW50KHNrYiwgaXBfZmluaXNoX291dHB1dDIpOwogCWVsc2UKIAkJcmV0dXJuIGlwX2ZpbmlzaF9vdXRwdXQyKHNrYik7CkBAIC0yNDgsNyArMjUzLDcgQEAKIAogCQkvKiBNdWx0aWNhc3RzIHdpdGggdHRsIDAgbXVzdCBub3QgZ28gYmV5b25kIHRoZSBob3N0ICovCiAKLQkJaWYgKHNrYi0+bmguaXBoLT50dGwgPT0gMCkgeworCQlpZiAoaXBfaGRyKHNrYiktPnR0bCA9PSAwKSB7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0zMzMsNyArMzM4LDkgQEAKIAkJZ290byBub19yb3V0ZTsKIAogCS8qIE9LLCB3ZSBrbm93IHdoZXJlIHRvIHNlbmQgaXQsIGFsbG9jYXRlIGFuZCBidWlsZCBJUCBoZWFkZXIuICovCi0JaXBoID0gKHN0cnVjdCBpcGhkciAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCkpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAob3B0ID8gb3B0LT5vcHRsZW4gOiAwKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJKigoX19iZTE2ICopaXBoKSA9IGh0b25zKCg0IDw8IDEyKSB8ICg1IDw8IDgpIHwgKGluZXQtPnRvcyAmIDB4ZmYpKTsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CiAJaWYgKGlwX2RvbnRfZnJhZ21lbnQoc2ssICZydC0+dS5kc3QpICYmICFpcGZyYWdvaykKQEAgLTM0NCw3ICszNTEsNiBAQAogCWlwaC0+cHJvdG9jb2wgPSBzay0+c2tfcHJvdG9jb2w7CiAJaXBoLT5zYWRkciAgICA9IHJ0LT5ydF9zcmM7CiAJaXBoLT5kYWRkciAgICA9IHJ0LT5ydF9kc3Q7Ci0Jc2tiLT5uaC5pcGggICA9IGlwaDsKIAkvKiBUcmFuc3BvcnQgbGF5ZXIgc2V0IHNrYi0+aC5mb28gaXRzZWxmLiAqLwogCiAJaWYgKG9wdCAmJiBvcHQtPm9wdGxlbikgewpAQCAtMzg2LDIxICszOTIsMTAgQEAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJdG8tPnRjX2luZGV4ID0gZnJvbS0+dGNfaW5kZXg7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JLyogQ29ubmVjdGlvbiBhc3NvY2lhdGlvbiBpcyBzYW1lIGFzIHByZS1mcmFnIHBhY2tldCAqLwotCW5mX2Nvbm50cmFja19wdXQodG8tPm5mY3QpOwotCXRvLT5uZmN0ID0gZnJvbS0+bmZjdDsKLQluZl9jb25udHJhY2tfZ2V0KHRvLT5uZmN0KTsKLQl0by0+bmZjdGluZm8gPSBmcm9tLT5uZmN0aW5mbzsKKwluZl9jb3B5KHRvLCBmcm9tKTsKICNpZiBkZWZpbmVkKENPTkZJR19JUF9WUykgfHwgZGVmaW5lZChDT05GSUdfSVBfVlNfTU9EVUxFKQogCXRvLT5pcHZzX3Byb3BlcnR5ID0gZnJvbS0+aXB2c19wcm9wZXJ0eTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCi0JbmZfYnJpZGdlX3B1dCh0by0+bmZfYnJpZGdlKTsKLQl0by0+bmZfYnJpZGdlID0gZnJvbS0+bmZfYnJpZGdlOwotCW5mX2JyaWRnZV9nZXQodG8tPm5mX2JyaWRnZSk7Ci0jZW5kaWYKLSNlbmRpZgogCXNrYl9jb3B5X3NlY21hcmsodG8sIGZyb20pOwogfQogCkBAIC00MzAsMTIgKzQyNSwxMiBAQAogCSAqCVBvaW50IGludG8gdGhlIElQIGRhdGFncmFtIGhlYWRlci4KIAkgKi8KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKHVubGlrZWx5KChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiAhc2tiLT5sb2NhbF9kZikpIHsKIAkJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELAotCQkJICBodG9ubChkc3RfbXR1KCZydC0+dS5kc3QpKSk7CisJCQkgIGh0b25sKGlwX3NrYl9kc3RfbXR1KHNrYikpKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQpAQCAtNTAyLDEwICs0OTcsMTEgQEAKIAkJCSAqIGJlZm9yZSBwcmV2aW91cyBvbmUgd2VudCBkb3duLiAqLwogCQkJaWYgKGZyYWcpIHsKIAkJCQlmcmFnLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCQkJCWZyYWctPmgucmF3ID0gZnJhZy0+ZGF0YTsKLQkJCQlmcmFnLT5uaC5yYXcgPSBfX3NrYl9wdXNoKGZyYWcsIGhsZW4pOwotCQkJCW1lbWNweShmcmFnLT5uaC5yYXcsIGlwaCwgaGxlbik7Ci0JCQkJaXBoID0gZnJhZy0+bmguaXBoOworCQkJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKGZyYWcpOworCQkJCV9fc2tiX3B1c2goZnJhZywgaGxlbik7CisJCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGZyYWcpOworCQkJCW1lbWNweShza2JfbmV0d29ya19oZWFkZXIoZnJhZyksIGlwaCwgaGxlbik7CisJCQkJaXBoID0gaXBfaGRyKGZyYWcpOwogCQkJCWlwaC0+dG90X2xlbiA9IGh0b25zKGZyYWctPmxlbik7CiAJCQkJaXBfY29weV9tZXRhZGF0YShmcmFnLCBza2IpOwogCQkJCWlmIChvZmZzZXQgPT0gMCkKQEAgLTU2Niw3ICs1NjIsNyBAQAogCSAqCUtlZXAgY29weWluZyBkYXRhIHVudGlsIHdlIHJ1biBvdXQuCiAJICovCiAKLQl3aGlsZShsZWZ0ID4gMCkJeworCXdoaWxlIChsZWZ0ID4gMCkgewogCQlsZW4gPSBsZWZ0OwogCQkvKiBJRjogaXQgZG9lc24ndCBmaXQsIHVzZSAnbXR1JyAtIHRoZSBkYXRhIHNwYWNlIGxlZnQgKi8KIAkJaWYgKGxlbiA+IG10dSkKQEAgLTU5Myw4ICs1ODksOCBAQAogCQlpcF9jb3B5X21ldGFkYXRhKHNrYjIsIHNrYik7CiAJCXNrYl9yZXNlcnZlKHNrYjIsIGxsX3JzKTsKIAkJc2tiX3B1dChza2IyLCBsZW4gKyBobGVuKTsKLQkJc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKLQkJc2tiMi0+aC5yYXcgPSBza2IyLT5kYXRhICsgaGxlbjsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQlza2IyLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiMi0+bmV0d29ya19oZWFkZXIgKyBobGVuOwogCiAJCS8qCiAJCSAqCUNoYXJnZSB0aGUgbWVtb3J5IGZvciB0aGUgZnJhZ21lbnQgdG8gYW55IG93bmVyCkBAIC02MDgsMTkgKzYwNCwxOSBAQAogCQkgKglDb3B5IHRoZSBwYWNrZXQgaGVhZGVyIGludG8gdGhlIG5ldyBidWZmZXIuCiAJCSAqLwogCi0JCW1lbWNweShza2IyLT5uaC5yYXcsIHNrYi0+ZGF0YSwgaGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiMiksIGhsZW4pOwogCiAJCS8qCiAJCSAqCUNvcHkgYSBibG9jayBvZiB0aGUgSVAgZGF0YWdyYW0uCiAJCSAqLwotCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHB0ciwgc2tiMi0+aC5yYXcsIGxlbikpCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgcHRyLCBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IyKSwgbGVuKSkKIAkJCUJVRygpOwogCQlsZWZ0IC09IGxlbjsKIAogCQkvKgogCQkgKglGaWxsIGluIHRoZSBuZXcgaGVhZGVyIGZpZWxkcy4KIAkJICovCi0JCWlwaCA9IHNrYjItPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKHNrYjIpOwogCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoKG9mZnNldCA+PiAzKSk7CiAKIAkJLyogQU5LOiBkaXJ0eSwgYnV0IGVmZmVjdGl2ZSB0cmljay4gVXBncmFkZSBvcHRpb25zIG9ubHkgaWYKQEAgLTcyMiwxMCArNzE4LDEwIEBACiAJCXNrYl9wdXQoc2tiLGZyYWdoZWFkZXJsZW4gKyB0cmFuc2hkcmxlbik7CiAKIAkJLyogaW5pdGlhbGl6ZSBuZXR3b3JrIGhlYWRlciBwb2ludGVyICovCi0JCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCQkvKiBpbml0aWFsaXplIHByb3RvY29sIGhlYWRlciBwb2ludGVyICovCi0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyBmcmFnaGVhZGVybGVuOworCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgZnJhZ2hlYWRlcmxlbjsKIAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCXNrYi0+Y3N1bSA9IDA7CkBAIC03OTksNyArNzk1LDkgQEAKIAkJCWluZXQtPmNvcmsuYWRkciA9IGlwYy0+YWRkcjsKIAkJfQogCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKLQkJaW5ldC0+Y29yay5mcmFnc2l6ZSA9IG10dSA9IGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOworCQlpbmV0LT5jb3JrLmZyYWdzaXplID0gbXR1ID0gaW5ldC0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfUFJPQkUgPworCQkJCQkgICAgcnQtPnUuZHN0LmRldi0+bXR1IDoKKwkJCQkJICAgIGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOwogCQlpbmV0LT5jb3JrLnJ0ID0gcnQ7CiAJCWluZXQtPmNvcmsubGVuZ3RoID0gMDsKIAkJc2stPnNrX3NuZG1zZ19wYWdlID0gTlVMTDsKQEAgLTkyOSw5ICs5MjcsMTAgQEAKIAkJCSAqCUZpbmQgd2hlcmUgdG8gc3RhcnQgcHV0dGluZyBieXRlcy4KIAkJCSAqLwogCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBmcmFnbGVuKTsKLQkJCXNrYi0+bmgucmF3ID0gZGF0YSArIGV4dGhkcmxlbjsKKwkJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBleHRoZHJsZW4pOworCQkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgKworCQkJCQkJIGZyYWdoZWFkZXJsZW4pOwogCQkJZGF0YSArPSBmcmFnaGVhZGVybGVuOwotCQkJc2tiLT5oLnJhdyA9IGRhdGEgKyBleHRoZHJsZW47CiAKIAkJCWlmIChmcmFnZ2FwKSB7CiAJCQkJc2tiLT5jc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cygKQEAgLTExMDAsOCArMTA5OSw2IEBACiAJCX0KIAkJaWYgKGxlbiA8PSAwKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3ByZXY7Ci0JCQljaGFyICpkYXRhOwotCQkJc3RydWN0IGlwaGRyICppcGg7CiAJCQlpbnQgYWxsb2NsZW47CiAKIAkJCXNrYl9wcmV2ID0gc2tiOwpAQCAtMTEyNCwxNSArMTEyMSwxNSBAQAogCQkJLyoKIAkJCSAqCUZpbmQgd2hlcmUgdG8gc3RhcnQgcHV0dGluZyBieXRlcy4KIAkJCSAqLwotCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBmcmFnaGVhZGVybGVuICsgZnJhZ2dhcCk7Ci0JCQlza2ItPm5oLmlwaCA9IGlwaCA9IChzdHJ1Y3QgaXBoZHIgKilkYXRhOwotCQkJZGF0YSArPSBmcmFnaGVhZGVybGVuOwotCQkJc2tiLT5oLnJhdyA9IGRhdGE7Ci0KKwkJCXNrYl9wdXQoc2tiLCBmcmFnaGVhZGVybGVuICsgZnJhZ2dhcCk7CisJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IChza2ItPm5ldHdvcmtfaGVhZGVyICsKKwkJCQkJCSBmcmFnaGVhZGVybGVuKTsKIAkJCWlmIChmcmFnZ2FwKSB7Ci0JCQkJc2tiLT5jc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cygKLQkJCQkJc2tiX3ByZXYsIG1heGZyYWdsZW4sCi0JCQkJCWRhdGEsIGZyYWdnYXAsIDApOworCQkJCXNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiX3ByZXYsCisJCQkJCQkJCSAgIG1heGZyYWdsZW4sCisJCQkJCQkgICAgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkJCQkJICAgZnJhZ2dhcCwgMCk7CiAJCQkJc2tiX3ByZXYtPmNzdW0gPSBjc3VtX3N1Yihza2JfcHJldi0+Y3N1bSwKIAkJCQkJCQkgIHNrYi0+Y3N1bSk7CiAJCQkJcHNrYl90cmltX3VuaXF1ZShza2JfcHJldiwgbWF4ZnJhZ2xlbik7CkBAIC0xMTk4LDEwICsxMTk1LDEwIEBACiAJdGFpbF9za2IgPSAmKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKIAogCS8qIG1vdmUgc2tiLT5kYXRhIHRvIGlwIGhlYWRlciBmcm9tIGV4dCBoZWFkZXIgKi8KLQlpZiAoc2tiLT5kYXRhIDwgc2tiLT5uaC5yYXcpCi0JCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJaWYgKHNrYi0+ZGF0YSA8IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKQorCQlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCXdoaWxlICgodG1wX3NrYiA9IF9fc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpIHsKLQkJX19za2JfcHVsbCh0bXBfc2tiLCBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCQlfX3NrYl9wdWxsKHRtcF9za2IsIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJCSp0YWlsX3NrYiA9IHRtcF9za2I7CiAJCXRhaWxfc2tiID0gJih0bXBfc2tiLT5uZXh0KTsKIAkJc2tiLT5sZW4gKz0gdG1wX3NrYi0+bGVuOwpAQCAtMTIxNiwxMyArMTIxMywxMyBAQAogCSAqIHRvIGZyYWdtZW50IHRoZSBmcmFtZSBnZW5lcmF0ZWQgaGVyZS4gTm8gbWF0dGVyLCB3aGF0IHRyYW5zZm9ybXMKIAkgKiBob3cgdHJhbnNmb3JtcyBjaGFuZ2Ugc2l6ZSBvZiB0aGUgcGFja2V0LCBpdCB3aWxsIGNvbWUgb3V0LgogCSAqLwotCWlmIChpbmV0LT5wbXR1ZGlzYyAhPSBJUF9QTVRVRElTQ19ETykKKwlpZiAoaW5ldC0+cG10dWRpc2MgPCBJUF9QTVRVRElTQ19ETykKIAkJc2tiLT5sb2NhbF9kZiA9IDE7CiAKIAkvKiBERiBiaXQgaXMgc2V0IHdoZW4gd2Ugd2FudCB0byBzZWUgREYgb24gb3V0Z29pbmcgZnJhbWVzLgogCSAqIElmIGxvY2FsX2RmIGlzIHNldCB0b28sIHdlIHN0aWxsIGFsbG93IHRvIGZyYWdtZW50IHRoaXMgZnJhbWUKIAkgKiBsb2NhbGx5LiAqLwotCWlmIChpbmV0LT5wbXR1ZGlzYyA9PSBJUF9QTVRVRElTQ19ETyB8fAorCWlmIChpbmV0LT5wbXR1ZGlzYyA+PSBJUF9QTVRVRElTQ19ETyB8fAogCSAgICAoc2tiLT5sZW4gPD0gZHN0X210dSgmcnQtPnUuZHN0KSAmJgogCSAgICAgaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT51LmRzdCkpKQogCQlkZiA9IGh0b25zKElQX0RGKTsKQEAgLTEzNTIsMTEgKzEzNDksMTEgQEAKIAkJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KIAkJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKIAkJCQkJCS5zYWRkciA9IHJ0LT5ydF9zcGVjX2RzdCwKLQkJCQkJCS50b3MgPSBSVF9UT1Moc2tiLT5uaC5pcGgtPnRvcykgfSB9LAorCQkJCQkJLnRvcyA9IFJUX1RPUyhpcF9oZHIoc2tiKS0+dG9zKSB9IH0sCiAJCQkJICAgIC8qIE5vdCBxdWl0ZSBjbGVhbiwgYnV0IHJpZ2h0LiAqLwogCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9Ci0JCQkJCSAgICAgICB7IC5zcG9ydCA9IHNrYi0+aC50aC0+ZGVzdCwKLQkJCQkJCSAuZHBvcnQgPSBza2ItPmgudGgtPnNvdXJjZSB9IH0sCisJCQkJCSAgICAgICB7IC5zcG9ydCA9IHRjcF9oZHIoc2tiKS0+ZGVzdCwKKwkJCQkJCSAuZHBvcnQgPSB0Y3BfaGRyKHNrYiktPnNvdXJjZSB9IH0sCiAJCQkJICAgIC5wcm90byA9IHNrLT5za19wcm90b2NvbCB9OwogCQlzZWN1cml0eV9za2JfY2xhc3NpZnlfZmxvdyhza2IsICZmbCk7CiAJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSkKQEAgLTEzNzAsMTQgKzEzNjcsMTYgQEAKIAkgICB3aXRoIGxvY2FsbHkgZGlzYWJsZWQgQkggYW5kIHRoYXQgc2sgY2Fubm90IGJlIGFscmVhZHkgc3BpbmxvY2tlZC4KIAkgKi8KIAliaF9sb2NrX3NvY2soc2spOwotCWluZXQtPnRvcyA9IHNrYi0+bmguaXBoLT50b3M7CisJaW5ldC0+dG9zID0gaXBfaGRyKHNrYiktPnRvczsKIAlzay0+c2tfcHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OwotCXNrLT5za19wcm90b2NvbCA9IHNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwlzay0+c2tfcHJvdG9jb2wgPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAJaXBfYXBwZW5kX2RhdGEoc2ssIGlwX3JlcGx5X2dsdWVfYml0cywgYXJnLT5pb3YtPmlvdl9iYXNlLCBsZW4sIDAsCiAJCSAgICAgICAmaXBjLCBydCwgTVNHX0RPTlRXQUlUKTsKIAlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7CiAJCWlmIChhcmctPmNzdW1vZmZzZXQgPj0gMCkKLQkJCSooKF9fc3VtMTYgKilza2ItPmgucmF3ICsgYXJnLT5jc3Vtb2Zmc2V0KSA9IGNzdW1fZm9sZChjc3VtX2FkZChza2ItPmNzdW0sIGFyZy0+Y3N1bSkpOworCQkJKigoX19zdW0xNiAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJICBhcmctPmNzdW1vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW1fYWRkKHNrYi0+Y3N1bSwKKwkJCQkJCQkJYXJnLT5jc3VtKSk7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJaXBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKaW5kZXggMjMwNDhkOS4uNGQ1NDQ1NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYworKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC01OSw3ICs1OSw3IEBACiAJc3RydWN0IGluX3BrdGluZm8gaW5mbzsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3Q7CiAKLQlpbmZvLmlwaV9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwlpbmZvLmlwaV9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAlpZiAocnQpIHsKIAkJaW5mby5pcGlfaWZpbmRleCA9IHJ0LT5ydF9paWY7CiAJCWluZm8uaXBpX3NwZWNfZHN0LnNfYWRkciA9IHJ0LT5ydF9zcGVjX2RzdDsKQEAgLTczLDEzICs3MywxMyBAQAogCiBzdGF0aWMgdm9pZCBpcF9jbXNnX3JlY3ZfdHRsKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgdHRsID0gc2tiLT5uaC5pcGgtPnR0bDsKKwlpbnQgdHRsID0gaXBfaGRyKHNrYiktPnR0bDsKIAlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfVFRMLCBzaXplb2YoaW50KSwgJnR0bCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlwX2Ntc2dfcmVjdl90b3Moc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9UT1MsIDEsICZza2ItPm5oLmlwaC0+dG9zKTsKKwlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfVE9TLCAxLCAmaXBfaGRyKHNrYiktPnRvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlwX2Ntc2dfcmVjdl9vcHRzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTg3LDcgKzg3LDggQEAKIAlpZiAoSVBDQihza2IpLT5vcHQub3B0bGVuID09IDApCiAJCXJldHVybjsKIAotCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9SRUNWT1BUUywgSVBDQihza2IpLT5vcHQub3B0bGVuLCBza2ItPm5oLmlwaCsxKTsKKwlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfUkVDVk9QVFMsIElQQ0Ioc2tiKS0+b3B0Lm9wdGxlbiwKKwkJIGlwX2hkcihza2IpICsgMSk7CiB9CiAKIApAQCAtMjY4LDE4ICsyNjksMjEgQEAKIAlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKIAlzZXJyLT5lZS5lZV9lcnJubyA9IGVycjsKIAlzZXJyLT5lZS5lZV9vcmlnaW4gPSBTT19FRV9PUklHSU5fSUNNUDsKLQlzZXJyLT5lZS5lZV90eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCXNlcnItPmVlLmVlX2NvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJc2Vyci0+ZWUuZWVfdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJc2Vyci0+ZWUuZWVfY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJc2Vyci0+ZWUuZWVfcGFkID0gMDsKIAlzZXJyLT5lZS5lZV9pbmZvID0gaW5mbzsKIAlzZXJyLT5lZS5lZV9kYXRhID0gMDsKLQlzZXJyLT5hZGRyX29mZnNldCA9ICh1OCopJigoKHN0cnVjdCBpcGhkciopKHNrYi0+aC5pY21waCsxKSktPmRhZGRyKSAtIHNrYi0+bmgucmF3OworCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4ICopJigoKHN0cnVjdCBpcGhkciAqKShpY21wX2hkcihza2IpICsgMSkpLT5kYWRkcikgLQorCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNlcnItPnBvcnQgPSBwb3J0OwogCi0Jc2tiLT5oLnJhdyA9IHBheWxvYWQ7Ci0JaWYgKCFza2JfcHVsbChza2IsIHBheWxvYWQgLSBza2ItPmRhdGEpIHx8Ci0JICAgIHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKSkKLQkJa2ZyZWVfc2tiKHNrYik7CisJaWYgKHNrYl9wdWxsKHNrYiwgcGF5bG9hZCAtIHNrYi0+ZGF0YSkgIT0gTlVMTCkgeworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCQlpZiAoc29ja19xdWV1ZV9lcnJfc2tiKHNrLCBza2IpID09IDApCisJCQlyZXR1cm47CisJfQorCWtmcmVlX3NrYihza2IpOwogfQogCiB2b2lkIGlwX2xvY2FsX2Vycm9yKHN0cnVjdCBzb2NrICpzaywgaW50IGVyciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgcG9ydCwgdTMyIGluZm8pCkBAIC0yOTYsOCArMzAwLDkgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuOwogCi0JaXBoID0gKHN0cnVjdCBpcGhkciopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKLQlza2ItPm5oLmlwaCA9IGlwaDsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlwaC0+ZGFkZHIgPSBkYWRkcjsKIAogCXNlcnIgPSBTS0JfRVhUX0VSUihza2IpOwpAQCAtMzA4LDExICszMTMsMTEgQEAKIAlzZXJyLT5lZS5lZV9wYWQgPSAwOwogCXNlcnItPmVlLmVlX2luZm8gPSBpbmZvOwogCXNlcnItPmVlLmVlX2RhdGEgPSAwOwotCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4KikmaXBoLT5kYWRkciAtIHNrYi0+bmgucmF3OworCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4ICopJmlwaC0+ZGFkZHIgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlzZXJyLT5wb3J0ID0gcG9ydDsKIAotCXNrYi0+aC5yYXcgPSBza2ItPnRhaWw7Ci0JX19za2JfcHVsbChza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikpCiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMzU0LDcgKzM1OSw4IEBACiAJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZy0+bXNnX25hbWU7CiAJaWYgKHNpbikgewogCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9ICooX19iZTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCk7CisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gKihfX2JlMzIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKworCQkJCQkJICAgc2Vyci0+YWRkcl9vZmZzZXQpOwogCQlzaW4tPnNpbl9wb3J0ID0gc2Vyci0+cG9ydDsKIAkJbWVtc2V0KCZzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOwogCX0KQEAgLTM2Niw3ICszNzIsNyBAQAogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKIAkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlzaW4tPnNpbl9wb3J0ID0gMDsKIAkJbWVtc2V0KCZzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOwogCQlpZiAoaW5ldC0+Y21zZ19mbGFncykKQEAgLTQwMywyMCArNDA5LDIwIEBACiAgKi8KIAogc3RhdGljIGludCBkb19pcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLAotCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJaW50IHZhbD0wLGVycjsKIAogCWlmICgoKDE8PG9wdG5hbWUpICYgKCgxPDxJUF9QS1RJTkZPKSB8ICgxPDxJUF9SRUNWVFRMKSB8Ci0JCQkgICAgKDE8PElQX1JFQ1ZPUFRTKSB8ICgxPDxJUF9SRUNWVE9TKSB8Ci0JCQkgICAgKDE8PElQX1JFVE9QVFMpIHwgKDE8PElQX1RPUykgfAotCQkJICAgICgxPDxJUF9UVEwpIHwgKDE8PElQX0hEUklOQ0wpIHwKLQkJCSAgICAoMTw8SVBfTVRVX0RJU0NPVkVSKSB8ICgxPDxJUF9SRUNWRVJSKSB8Ci0JCQkgICAgKDE8PElQX1JPVVRFUl9BTEVSVCkgfCAoMTw8SVBfRlJFRUJJTkQpIHwKLQkJCSAgICAoMTw8SVBfUEFTU1NFQykpKSB8fAotCQkJCW9wdG5hbWUgPT0gSVBfTVVMVElDQVNUX1RUTCB8fAotCQkJCW9wdG5hbWUgPT0gSVBfTVVMVElDQVNUX0xPT1ApIHsKKwkJCSAgICAgKDE8PElQX1JFQ1ZPUFRTKSB8ICgxPDxJUF9SRUNWVE9TKSB8CisJCQkgICAgICgxPDxJUF9SRVRPUFRTKSB8ICgxPDxJUF9UT1MpIHwKKwkJCSAgICAgKDE8PElQX1RUTCkgfCAoMTw8SVBfSERSSU5DTCkgfAorCQkJICAgICAoMTw8SVBfTVRVX0RJU0NPVkVSKSB8ICgxPDxJUF9SRUNWRVJSKSB8CisJCQkgICAgICgxPDxJUF9ST1VURVJfQUxFUlQpIHwgKDE8PElQX0ZSRUVCSU5EKSB8CisJCQkgICAgICgxPDxJUF9QQVNTU0VDKSkpIHx8CisJICAgIG9wdG5hbWUgPT0gSVBfTVVMVElDQVNUX1RUTCB8fAorCSAgICBvcHRuYW1lID09IElQX01VTFRJQ0FTVF9MT09QKSB7CiAJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKGludCkpIHsKIAkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIG9wdHZhbCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDAsNDQ0ICs0NDYsNDQ0IEBACiAJbG9ja19zb2NrKHNrKTsKIAogCXN3aXRjaCAob3B0bmFtZSkgewotCQljYXNlIElQX09QVElPTlM6Ci0JCXsKLQkJCXN0cnVjdCBpcF9vcHRpb25zICogb3B0ID0gTlVMTDsKLQkJCWlmIChvcHRsZW4gPiA0MCB8fCBvcHRsZW4gPCAwKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWVyciA9IGlwX29wdGlvbnNfZ2V0X2Zyb21fdXNlcigmb3B0LCBvcHR2YWwsIG9wdGxlbik7Ci0JCQlpZiAoZXJyKQotCQkJCWJyZWFrOwotCQkJaWYgKGluZXQtPmlzX2ljc2spIHsKLQkJCQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CisJY2FzZSBJUF9PUFRJT05TOgorCXsKKwkJc3RydWN0IGlwX29wdGlvbnMgKiBvcHQgPSBOVUxMOworCQlpZiAob3B0bGVuID4gNDAgfHwgb3B0bGVuIDwgMCkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJZXJyID0gaXBfb3B0aW9uc19nZXRfZnJvbV91c2VyKCZvcHQsIG9wdHZhbCwgb3B0bGVuKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlpZiAoaW5ldC0+aXNfaWNzaykgeworCQkJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotCQkJCWlmIChzay0+c2tfZmFtaWx5ID09IFBGX0lORVQgfHwKLQkJCQkgICAgKCEoKDEgPDwgc2stPnNrX3N0YXRlKSAmCi0JCQkJICAgICAgIChUQ1BGX0xJU1RFTiB8IFRDUEZfQ0xPU0UpKSAmJgotCQkJCSAgICAgaW5ldC0+ZGFkZHIgIT0gTE9PUEJBQ0s0X0lQVjYpKSB7CisJCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUIHx8CisJCQkgICAgKCEoKDEgPDwgc2stPnNrX3N0YXRlKSAmCisJCQkgICAgICAgKFRDUEZfTElTVEVOIHwgVENQRl9DTE9TRSkpICYmCisJCQkgICAgIGluZXQtPmRhZGRyICE9IExPT1BCQUNLNF9JUFY2KSkgewogI2VuZGlmCi0JCQkJCWlmIChpbmV0LT5vcHQpCi0JCQkJCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuIC09IGluZXQtPm9wdC0+b3B0bGVuOwotCQkJCQlpZiAob3B0KQotCQkJCQkJaWNzay0+aWNza19leHRfaGRyX2xlbiArPSBvcHQtPm9wdGxlbjsKLQkJCQkJaWNzay0+aWNza19zeW5jX21zcyhzaywgaWNzay0+aWNza19wbXR1X2Nvb2tpZSk7CisJCQkJaWYgKGluZXQtPm9wdCkKKwkJCQkJaWNzay0+aWNza19leHRfaGRyX2xlbiAtPSBpbmV0LT5vcHQtPm9wdGxlbjsKKwkJCQlpZiAob3B0KQorCQkJCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuICs9IG9wdC0+b3B0bGVuOworCQkJCWljc2stPmljc2tfc3luY19tc3Moc2ssIGljc2stPmljc2tfcG10dV9jb29raWUpOwogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotCQkJCX0KKwkJCX0KICNlbmRpZgotCQkJfQotCQkJb3B0ID0geGNoZygmaW5ldC0+b3B0LCBvcHQpOwotCQkJa2ZyZWUob3B0KTsKLQkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgSVBfUEtUSU5GTzoKLQkJCWlmICh2YWwpCi0JCQkJaW5ldC0+Y21zZ19mbGFncyB8PSBJUF9DTVNHX1BLVElORk87Ci0JCQllbHNlCi0JCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19QS1RJTkZPOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVDVlRUTDoKLQkJCWlmICh2YWwpCi0JCQkJaW5ldC0+Y21zZ19mbGFncyB8PSAgSVBfQ01TR19UVEw7Ci0JCQllbHNlCi0JCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19UVEw7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRUNWVE9TOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1RPUzsKLQkJCWVsc2UKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1RPUzsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFQ1ZPUFRTOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1JFQ1ZPUFRTOwotCQkJZWxzZQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUkVDVk9QVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRVRPUFRTOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9IElQX0NNU0dfUkVUT1BUUzsKLQkJCWVsc2UKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1JFVE9QVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9QQVNTU0VDOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9IElQX0NNU0dfUEFTU1NFQzsKLQkJCWVsc2UKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1BBU1NTRUM7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9UT1M6CS8qIFRoaXMgc2V0cyBib3RoIFRPUyBhbmQgUHJlY2VkZW5jZSAqLwotCQkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7Ci0JCQkJdmFsICY9IH4zOwotCQkJCXZhbCB8PSBpbmV0LT50b3MgJiAzOwotCQkJfQotCQkJaWYgKElQVE9TX1BSRUModmFsKSA+PSBJUFRPU19QUkVDX0NSSVRJQ19FQ1AgJiYKLQkJCSAgICAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQkJCWVyciA9IC1FUEVSTTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpbmV0LT50b3MgIT0gdmFsKSB7Ci0JCQkJaW5ldC0+dG9zID0gdmFsOwotCQkJCXNrLT5za19wcmlvcml0eSA9IHJ0X3RvczJwcmlvcml0eSh2YWwpOwotCQkJCXNrX2RzdF9yZXNldChzayk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9UVEw6Ci0JCQlpZiAob3B0bGVuPDEpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKHZhbCAhPSAtMSAmJiAodmFsIDwgMSB8fCB2YWw+MjU1KSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpbmV0LT51Y190dGwgPSB2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9IRFJJTkNMOgotCQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7Ci0JCQkJZXJyID0gLUVOT1BST1RPT1BUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaW5ldC0+aGRyaW5jbCA9IHZhbCA/IDEgOiAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVRVX0RJU0NPVkVSOgotCQkJaWYgKHZhbDwwIHx8IHZhbD4yKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWluZXQtPnBtdHVkaXNjID0gdmFsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVDVkVSUjoKLQkJCWluZXQtPnJlY3ZlcnIgPSAhIXZhbDsKLQkJCWlmICghdmFsKQotCQkJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2Vycm9yX3F1ZXVlKTsKLQkJCWJyZWFrOwotCQljYXNlIElQX01VTFRJQ0FTVF9UVEw6Ci0JCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKG9wdGxlbjwxKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWlmICh2YWw9PS0xKQotCQkJCXZhbCA9IDE7Ci0JCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaW5ldC0+bWNfdHRsID0gdmFsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX0xPT1A6Ci0JCQlpZiAob3B0bGVuPDEpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaW5ldC0+bWNfbG9vcCA9ICEhdmFsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX0lGOgotCQl7Ci0JCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKLQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotCi0JCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pCi0JCQkJZ290byBlX2ludmFsOwotCQkJLyoKLQkJCSAqCUNoZWNrIHRoZSBhcmd1bWVudHMgYXJlIGFsbG93YWJsZQotCQkJICovCi0KLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlpZiAob3B0bGVuID49IHNpemVvZihzdHJ1Y3QgaXBfbXJlcW4pKSB7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOwotCQkJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSAmJgotCQkJCSAgICBjb3B5X2Zyb21fdXNlcigmbXJlcS5pbXJfYWRkcmVzcyxvcHR2YWwsc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIW1yZXEuaW1yX2lmaW5kZXgpIHsKLQkJCQlpZiAobXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPT0gSU5BRERSX0FOWSkgewotCQkJCQlpbmV0LT5tY19pbmRleCA9IDA7Ci0JCQkJCWluZXQtPm1jX2FkZHIgID0gMDsKLQkJCQkJZXJyID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRldiA9IGlwX2Rldl9maW5kKG1yZXEuaW1yX2FkZHJlc3Muc19hZGRyKTsKLQkJCQlpZiAoZGV2KSB7Ci0JCQkJCW1yZXEuaW1yX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7Ci0JCQkJCWRldl9wdXQoZGV2KTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobXJlcS5pbXJfaWZpbmRleCk7Ci0KLQotCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7Ci0JCQlpZiAoIWRldikKLQkJCQlicmVhazsKLQotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICYmCi0JCQkgICAgbXJlcS5pbXJfaWZpbmRleCAhPSBzay0+c2tfYm91bmRfZGV2X2lmKQotCQkJCWJyZWFrOwotCi0JCQlpbmV0LT5tY19pbmRleCA9IG1yZXEuaW1yX2lmaW5kZXg7Ci0JCQlpbmV0LT5tY19hZGRyICA9IG1yZXEuaW1yX2FkZHJlc3Muc19hZGRyOwotCQkJZXJyID0gMDsKLQkJCWJyZWFrOworCQlvcHQgPSB4Y2hnKCZpbmV0LT5vcHQsIG9wdCk7CisJCWtmcmVlKG9wdCk7CisJCWJyZWFrOworCX0KKwljYXNlIElQX1BLVElORk86CisJCWlmICh2YWwpCisJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9IElQX0NNU0dfUEtUSU5GTzsKKwkJZWxzZQorCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19QS1RJTkZPOworCQlicmVhazsKKwljYXNlIElQX1JFQ1ZUVEw6CisJCWlmICh2YWwpCisJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1RUTDsKKwkJZWxzZQorCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19UVEw7CisJCWJyZWFrOworCWNhc2UgSVBfUkVDVlRPUzoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gIElQX0NNU0dfVE9TOworCQllbHNlCisJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1RPUzsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRUNWT1BUUzoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gIElQX0NNU0dfUkVDVk9QVFM7CisJCWVsc2UKKwkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUkVDVk9QVFM7CisJCWJyZWFrOworCWNhc2UgSVBfUkVUT1BUUzoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gSVBfQ01TR19SRVRPUFRTOworCQllbHNlCisJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1JFVE9QVFM7CisJCWJyZWFrOworCWNhc2UgSVBfUEFTU1NFQzoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gSVBfQ01TR19QQVNTU0VDOworCQllbHNlCisJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1BBU1NTRUM7CisJCWJyZWFrOworCWNhc2UgSVBfVE9TOgkvKiBUaGlzIHNldHMgYm90aCBUT1MgYW5kIFByZWNlZGVuY2UgKi8KKwkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQl2YWwgJj0gfjM7CisJCQl2YWwgfD0gaW5ldC0+dG9zICYgMzsKIAkJfQotCi0JCWNhc2UgSVBfQUREX01FTUJFUlNISVA6Ci0JCWNhc2UgSVBfRFJPUF9NRU1CRVJTSElQOgotCQl7Ci0JCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKLQotCQkJaWYgKG9wdGxlbiA8IHNpemVvZihzdHJ1Y3QgaXBfbXJlcSkpCi0JCQkJZ290byBlX2ludmFsOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxbikpIHsKLQkJCQlpZihjb3B5X2Zyb21fdXNlcigmbXJlcSxvcHR2YWwsc2l6ZW9mKG1yZXEpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsb3B0dmFsLHNpemVvZihzdHJ1Y3QgaXBfbXJlcSkpKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKG9wdG5hbWUgPT0gSVBfQUREX01FTUJFUlNISVApCi0JCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJZWxzZQotCQkJCWVyciA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmbXJlcSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIElQX01TRklMVEVSOgotCQl7Ci0JCQlleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tc2Y7Ci0JCQlzdHJ1Y3QgaXBfbXNmaWx0ZXIgKm1zZjsKLQotCQkJaWYgKG9wdGxlbiA8IElQX01TRklMVEVSX1NJWkUoMCkpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKG9wdGxlbiA+IHN5c2N0bF9vcHRtZW1fbWF4KSB7Ci0JCQkJZXJyID0gLUVOT0JVRlM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQltc2YgPSBrbWFsbG9jKG9wdGxlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAobXNmID09IDApIHsKLQkJCQllcnIgPSAtRU5PQlVGUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIobXNmLCBvcHR2YWwsIG9wdGxlbikpIHsKLQkJCQlrZnJlZShtc2YpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogbnVtc3JjID49ICgxRy00KSBvdmVyZmxvdyBpbiAzMiBiaXRzICovCi0JCQlpZiAobXNmLT5pbXNmX251bXNyYyA+PSAweDNmZmZmZmZjVSB8fAotCQkJICAgIG1zZi0+aW1zZl9udW1zcmMgPiBzeXNjdGxfaWdtcF9tYXhfbXNmKSB7Ci0JCQkJa2ZyZWUobXNmKTsKLQkJCQllcnIgPSAtRU5PQlVGUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChJUF9NU0ZJTFRFUl9TSVpFKG1zZi0+aW1zZl9udW1zcmMpID4gb3B0bGVuKSB7Ci0JCQkJa2ZyZWUobXNmKTsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyID0gaXBfbWNfbXNmaWx0ZXIoc2ssIG1zZiwgMCk7Ci0JCQlrZnJlZShtc2YpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBJUF9CTE9DS19TT1VSQ0U6Ci0JCWNhc2UgSVBfVU5CTE9DS19TT1VSQ0U6Ci0JCWNhc2UgSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQOgotCQljYXNlIElQX0RST1BfU09VUkNFX01FTUJFUlNISVA6Ci0JCXsKLQkJCXN0cnVjdCBpcF9tcmVxX3NvdXJjZSBtcmVxczsKLQkJCWludCBvbW9kZSwgYWRkOwotCi0JCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UpKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcXMsIG9wdHZhbCwgc2l6ZW9mKG1yZXFzKSkpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG9wdG5hbWUgPT0gSVBfQkxPQ0tfU09VUkNFKSB7Ci0JCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOwotCQkJCWFkZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gSVBfVU5CTE9DS19TT1VSQ0UpIHsKLQkJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7Ci0JCQkJYWRkID0gMDsKLQkJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBJUF9BRERfU09VUkNFX01FTUJFUlNISVApIHsKLQkJCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKLQotCQkJCW1yZXEuaW1yX211bHRpYWRkci5zX2FkZHIgPSBtcmVxcy5pbXJfbXVsdGlhZGRyOwotCQkJCW1yZXEuaW1yX2FkZHJlc3Muc19hZGRyID0gbXJlcXMuaW1yX2ludGVyZmFjZTsKLQkJCQltcmVxLmltcl9pZmluZGV4ID0gMDsKLQkJCQllcnIgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcSk7Ci0JCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCi0JCQkJCWJyZWFrOwotCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKLQkJCQlhZGQgPSAxOwotCQkJfSBlbHNlIC8qIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAgKi8gewotCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKLQkJCQlhZGQgPSAwOwotCQkJfQotCQkJZXJyID0gaXBfbWNfc291cmNlKGFkZCwgb21vZGUsIHNrLCAmbXJlcXMsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBNQ0FTVF9KT0lOX0dST1VQOgotCQljYXNlIE1DQVNUX0xFQVZFX0dST1VQOgotCQl7Ci0JCQlzdHJ1Y3QgZ3JvdXBfcmVxIGdyZXE7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47Ci0JCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKLQotCQkJaWYgKG9wdGxlbiA8IHNpemVvZihzdHJ1Y3QgZ3JvdXBfcmVxKSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJaWYoY29weV9mcm9tX3VzZXIoJmdyZXEsIG9wdHZhbCwgc2l6ZW9mKGdyZXEpKSkKLQkJCQlicmVhazsKLQkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXEuZ3JfZ3JvdXA7Ci0JCQlpZiAocHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKLQkJCW1yZXEuaW1yX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyOwotCQkJbXJlcS5pbXJfaWZpbmRleCA9IGdyZXEuZ3JfaW50ZXJmYWNlOwotCi0JCQlpZiAob3B0bmFtZSA9PSBNQ0FTVF9KT0lOX0dST1VQKQotCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKLQkJCWVsc2UKLQkJCQllcnIgPSBpcF9tY19sZWF2ZV9ncm91cChzaywgJm1yZXEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUDoKLQkJY2FzZSBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVA6Ci0JCWNhc2UgTUNBU1RfQkxPQ0tfU09VUkNFOgotCQljYXNlIE1DQVNUX1VOQkxPQ0tfU09VUkNFOgotCQl7Ci0JCQlzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSBncmVxczsKLQkJCXN0cnVjdCBpcF9tcmVxX3NvdXJjZSBtcmVxczsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKLQkJCWludCBvbW9kZSwgYWRkOwotCi0JCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSkpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncmVxcywgb3B0dmFsLCBzaXplb2YoZ3JlcXMpKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZ3JlcXMuZ3NyX2dyb3VwLnNzX2ZhbWlseSAhPSBBRl9JTkVUIHx8Ci0JCQkgICAgZ3JlcXMuZ3NyX3NvdXJjZS5zc19mYW1pbHkgIT0gQUZfSU5FVCkgewotCQkJCWVyciA9IC1FQUREUk5PVEFWQUlMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcXMuZ3NyX2dyb3VwOwotCQkJbXJlcXMuaW1yX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKLQkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXFzLmdzcl9zb3VyY2U7Ci0JCQltcmVxcy5pbXJfc291cmNlYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKLQkJCW1yZXFzLmltcl9pbnRlcmZhY2UgPSAwOyAvKiB1c2UgaW5kZXggZm9yIG1jX3NvdXJjZSAqLwotCi0JCQlpZiAob3B0bmFtZSA9PSBNQ0FTVF9CTE9DS19TT1VSQ0UpIHsKLQkJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7Ci0JCQkJYWRkID0gMTsKLQkJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBNQ0FTVF9VTkJMT0NLX1NPVVJDRSkgewotCQkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKLQkJCQlhZGQgPSAwOwotCQkJfSBlbHNlIGlmIChvcHRuYW1lID09IE1DQVNUX0pPSU5fU09VUkNFX0dST1VQKSB7Ci0JCQkJc3RydWN0IGlwX21yZXFuIG1yZXE7Ci0KLQkJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxcy5nc3JfZ3JvdXA7Ci0JCQkJbXJlcS5pbXJfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHI7Ci0JCQkJbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPSAwOwotCQkJCW1yZXEuaW1yX2lmaW5kZXggPSBncmVxcy5nc3JfaW50ZXJmYWNlOwotCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKLQkJCQlpZiAoZXJyICYmIGVyciAhPSAtRUFERFJJTlVTRSkKLQkJCQkJYnJlYWs7Ci0JCQkJZ3JlcXMuZ3NyX2ludGVyZmFjZSA9IG1yZXEuaW1yX2lmaW5kZXg7Ci0JCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOwotCQkJCWFkZCA9IDE7Ci0JCQl9IGVsc2UgLyogTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQICovIHsKLQkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7Ci0JCQkJYWRkID0gMDsKLQkJCX0KLQkJCWVyciA9IGlwX21jX3NvdXJjZShhZGQsIG9tb2RlLCBzaywgJm1yZXFzLAotCQkJCWdyZXFzLmdzcl9pbnRlcmZhY2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKLQkJewotCQkJZXh0ZXJuIGludCBzeXNjdGxfaWdtcF9tYXhfbXNmOwotCQkJc3RydWN0IHNvY2thZGRyX2luICpwc2luOwotCQkJc3RydWN0IGlwX21zZmlsdGVyICptc2YgPSBOVUxMOwotCQkJc3RydWN0IGdyb3VwX2ZpbHRlciAqZ3NmID0gTlVMTDsKLQkJCWludCBtc2l6ZSwgaSwgaWZpbmRleDsKLQotCQkJaWYgKG9wdGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWlmIChvcHRsZW4gPiBzeXNjdGxfb3B0bWVtX21heCkgewotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ3NmID0ga21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZ3NmID09IDApIHsKLQkJCQllcnIgPSAtRU5PQlVGUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZ3NmLCBvcHR2YWwsIG9wdGxlbikpIHsKLQkJCQlnb3RvIG1jX21zZl9vdXQ7Ci0JCQl9Ci0JCQkvKiBudW1zcmMgPj0gKDRHLTE0MCkvMTI4IG92ZXJmbG93IGluIDMyIGJpdHMgKi8KLQkJCWlmIChnc2YtPmdmX251bXNyYyA+PSAweDFmZmZmZmYgfHwKLQkJCSAgICBnc2YtPmdmX251bXNyYyA+IHN5c2N0bF9pZ21wX21heF9tc2YpIHsKLQkJCQllcnIgPSAtRU5PQlVGUzsKLQkJCQlnb3RvIG1jX21zZl9vdXQ7Ci0JCQl9Ci0JCQlpZiAoR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIG1jX21zZl9vdXQ7Ci0JCQl9Ci0JCQltc2l6ZSA9IElQX01TRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpOwotCQkJbXNmID0ga21hbGxvYyhtc2l6ZSxHRlBfS0VSTkVMKTsKLQkJCWlmIChtc2YgPT0gMCkgewotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWdvdG8gbWNfbXNmX291dDsKLQkJCX0KLQkJCWlmaW5kZXggPSBnc2YtPmdmX2ludGVyZmFjZTsKLQkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdzZi0+Z2ZfZ3JvdXA7Ci0JCQlpZiAocHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7Ci0JCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7Ci0JCQkJZ290byBtY19tc2Zfb3V0OwotCQkJfQotCQkJbXNmLT5pbXNmX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKLQkJCW1zZi0+aW1zZl9pbnRlcmZhY2UgPSAwOwotCQkJbXNmLT5pbXNmX2Ztb2RlID0gZ3NmLT5nZl9mbW9kZTsKLQkJCW1zZi0+aW1zZl9udW1zcmMgPSBnc2YtPmdmX251bXNyYzsKLQkJCWVyciA9IC1FQUREUk5PVEFWQUlMOwotCQkJZm9yIChpPTA7IGk8Z3NmLT5nZl9udW1zcmM7ICsraSkgewotCQkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdzZi0+Z2Zfc2xpc3RbaV07Ci0KLQkJCQlpZiAocHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQotCQkJCQlnb3RvIG1jX21zZl9vdXQ7Ci0JCQkJbXNmLT5pbXNmX3NsaXN0W2ldID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOwotCQkJfQotCQkJa2ZyZWUoZ3NmKTsKLQkJCWdzZiA9IE5VTEw7Ci0KLQkJCWVyciA9IGlwX21jX21zZmlsdGVyKHNrLCBtc2YsIGlmaW5kZXgpOwotbWNfbXNmX291dDoKLQkJCWtmcmVlKG1zZik7Ci0JCQlrZnJlZShnc2YpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBJUF9ST1VURVJfQUxFUlQ6Ci0JCQllcnIgPSBpcF9yYV9jb250cm9sKHNrLCB2YWwgPyAxIDogMCwgTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlIElQX0ZSRUVCSU5EOgotCQkJaWYgKG9wdGxlbjwxKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWluZXQtPmZyZWViaW5kID0gISF2YWw7Ci0JCQlicmVhazsKLQotCQljYXNlIElQX0lQU0VDX1BPTElDWToKLQkJY2FzZSBJUF9YRlJNX1BPTElDWToKKwkJaWYgKElQVE9TX1BSRUModmFsKSA+PSBJUFRPU19QUkVDX0NSSVRJQ19FQ1AgJiYKKwkJICAgICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CiAJCQllcnIgPSAtRVBFUk07Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJYnJlYWs7Ci0JCQllcnIgPSB4ZnJtX3VzZXJfcG9saWN5KHNrLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiAJCQlicmVhazsKLQotCQlkZWZhdWx0OgorCQl9CisJCWlmIChpbmV0LT50b3MgIT0gdmFsKSB7CisJCQlpbmV0LT50b3MgPSB2YWw7CisJCQlzay0+c2tfcHJpb3JpdHkgPSBydF90b3MycHJpb3JpdHkodmFsKTsKKwkJCXNrX2RzdF9yZXNldChzayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUF9UVEw6CisJCWlmIChvcHRsZW48MSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaWYgKHZhbCAhPSAtMSAmJiAodmFsIDwgMSB8fCB2YWw+MjU1KSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaW5ldC0+dWNfdHRsID0gdmFsOworCQlicmVhazsKKwljYXNlIElQX0hEUklOQ0w6CisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1JBVykgewogCQkJZXJyID0gLUVOT1BST1RPT1BUOwogCQkJYnJlYWs7CisJCX0KKwkJaW5ldC0+aGRyaW5jbCA9IHZhbCA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIElQX01UVV9ESVNDT1ZFUjoKKwkJaWYgKHZhbDwwIHx8IHZhbD4zKQorCQkJZ290byBlX2ludmFsOworCQlpbmV0LT5wbXR1ZGlzYyA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRUNWRVJSOgorCQlpbmV0LT5yZWN2ZXJyID0gISF2YWw7CisJCWlmICghdmFsKQorCQkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfZXJyb3JfcXVldWUpOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9UVEw6CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaWYgKG9wdGxlbjwxKQorCQkJZ290byBlX2ludmFsOworCQlpZiAodmFsPT0tMSkKKwkJCXZhbCA9IDE7CisJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaW5ldC0+bWNfdHRsID0gdmFsOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9MT09QOgorCQlpZiAob3B0bGVuPDEpCisJCQlnb3RvIGVfaW52YWw7CisJCWluZXQtPm1jX2xvb3AgPSAhIXZhbDsKKwkJYnJlYWs7CisJY2FzZSBJUF9NVUxUSUNBU1RfSUY6CisJeworCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKQorCQkJZ290byBlX2ludmFsOworCQkvKgorCQkgKglDaGVjayB0aGUgYXJndW1lbnRzIGFyZSBhbGxvd2FibGUKKwkJICovCisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGlwX21yZXFuKSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOworCQkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpICYmCisJCQkgICAgY29weV9mcm9tX3VzZXIoJm1yZXEuaW1yX2FkZHJlc3Msb3B0dmFsLHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFtcmVxLmltcl9pZmluZGV4KSB7CisJCQlpZiAobXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPT0gSU5BRERSX0FOWSkgeworCQkJCWluZXQtPm1jX2luZGV4ID0gMDsKKwkJCQlpbmV0LT5tY19hZGRyICA9IDA7CisJCQkJZXJyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRldiA9IGlwX2Rldl9maW5kKG1yZXEuaW1yX2FkZHJlc3Muc19hZGRyKTsKKwkJCWlmIChkZXYpIHsKKwkJCQltcmVxLmltcl9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCQkJCWRldl9wdXQoZGV2KTsKKwkJCX0KKwkJfSBlbHNlCisJCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobXJlcS5pbXJfaWZpbmRleCk7CisKKworCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJgorCQkgICAgbXJlcS5pbXJfaWZpbmRleCAhPSBzay0+c2tfYm91bmRfZGV2X2lmKQorCQkJYnJlYWs7CisKKwkJaW5ldC0+bWNfaW5kZXggPSBtcmVxLmltcl9pZmluZGV4OworCQlpbmV0LT5tY19hZGRyICA9IG1yZXEuaW1yX2FkZHJlc3Muc19hZGRyOworCQllcnIgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIElQX0FERF9NRU1CRVJTSElQOgorCWNhc2UgSVBfRFJPUF9NRU1CRVJTSElQOgorCXsKKwkJc3RydWN0IGlwX21yZXFuIG1yZXE7CisKKwkJaWYgKG9wdGxlbiA8IHNpemVvZihzdHJ1Y3QgaXBfbXJlcSkpCisJCQlnb3RvIGVfaW52YWw7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxbikpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcSxvcHR2YWwsc2l6ZW9mKG1yZXEpKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcSxvcHR2YWwsc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAob3B0bmFtZSA9PSBJUF9BRERfTUVNQkVSU0hJUCkKKwkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwkJZWxzZQorCQkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZtcmVxKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBfTVNGSUxURVI6CisJeworCQlleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tc2Y7CisJCXN0cnVjdCBpcF9tc2ZpbHRlciAqbXNmOworCisJCWlmIChvcHRsZW4gPCBJUF9NU0ZJTFRFUl9TSVpFKDApKQorCQkJZ290byBlX2ludmFsOworCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJbXNmID0ga21hbGxvYyhvcHRsZW4sIEdGUF9LRVJORUwpOworCQlpZiAobXNmID09IDApIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCQlrZnJlZShtc2YpOworCQkJYnJlYWs7CisJCX0KKwkJLyogbnVtc3JjID49ICgxRy00KSBvdmVyZmxvdyBpbiAzMiBiaXRzICovCisJCWlmIChtc2YtPmltc2ZfbnVtc3JjID49IDB4M2ZmZmZmZmNVIHx8CisJCSAgICBtc2YtPmltc2ZfbnVtc3JjID4gc3lzY3RsX2lnbXBfbWF4X21zZikgeworCQkJa2ZyZWUobXNmKTsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKElQX01TRklMVEVSX1NJWkUobXNmLT5pbXNmX251bXNyYykgPiBvcHRsZW4pIHsKKwkJCWtmcmVlKG1zZik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gaXBfbWNfbXNmaWx0ZXIoc2ssIG1zZiwgMCk7CisJCWtmcmVlKG1zZik7CisJCWJyZWFrOworCX0KKwljYXNlIElQX0JMT0NLX1NPVVJDRToKKwljYXNlIElQX1VOQkxPQ0tfU09VUkNFOgorCWNhc2UgSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQOgorCWNhc2UgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUDoKKwl7CisJCXN0cnVjdCBpcF9tcmVxX3NvdXJjZSBtcmVxczsKKwkJaW50IG9tb2RlLCBhZGQ7CisKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGlwX21yZXFfc291cmNlKSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxcywgb3B0dmFsLCBzaXplb2YobXJlcXMpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvcHRuYW1lID09IElQX0JMT0NLX1NPVVJDRSkgeworCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOworCQkJYWRkID0gMTsKKwkJfSBlbHNlIGlmIChvcHRuYW1lID09IElQX1VOQkxPQ0tfU09VUkNFKSB7CisJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQlhZGQgPSAwOworCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQKSB7CisJCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKworCQkJbXJlcS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IG1yZXFzLmltcl9tdWx0aWFkZHI7CisJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IG1yZXFzLmltcl9pbnRlcmZhY2U7CisJCQltcmVxLmltcl9pZmluZGV4ID0gMDsKKwkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwkJCWlmIChlcnIgJiYgZXJyICE9IC1FQUREUklOVVNFKQorCQkJCWJyZWFrOworCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkJYWRkID0gMTsKKwkJfSBlbHNlIC8qIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAgKi8geworCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkJYWRkID0gMDsKKwkJfQorCQllcnIgPSBpcF9tY19zb3VyY2UoYWRkLCBvbW9kZSwgc2ssICZtcmVxcywgMCk7CisJCWJyZWFrOworCX0KKwljYXNlIE1DQVNUX0pPSU5fR1JPVVA6CisJY2FzZSBNQ0FTVF9MRUFWRV9HUk9VUDoKKwl7CisJCXN0cnVjdCBncm91cF9yZXEgZ3JlcTsKKwkJc3RydWN0IHNvY2thZGRyX2luICpwc2luOworCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKworCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBncm91cF9yZXEpKQorCQkJZ290byBlX2ludmFsOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmdyZXEsIG9wdHZhbCwgc2l6ZW9mKGdyZXEpKSkKKwkJCWJyZWFrOworCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxLmdyX2dyb3VwOworCQlpZiAocHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQorCQkJZ290byBlX2ludmFsOworCQltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJCW1yZXEuaW1yX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyOworCQltcmVxLmltcl9pZmluZGV4ID0gZ3JlcS5ncl9pbnRlcmZhY2U7CisKKwkJaWYgKG9wdG5hbWUgPT0gTUNBU1RfSk9JTl9HUk9VUCkKKwkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwkJZWxzZQorCQkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZtcmVxKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVA6CisJY2FzZSBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVA6CisJY2FzZSBNQ0FTVF9CTE9DS19TT1VSQ0U6CisJY2FzZSBNQ0FTVF9VTkJMT0NLX1NPVVJDRToKKwl7CisJCXN0cnVjdCBncm91cF9zb3VyY2VfcmVxIGdyZXFzOworCQlzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UgbXJlcXM7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKKwkJaW50IG9tb2RlLCBhZGQ7CisKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEpKQorCQkJZ290byBlX2ludmFsOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmdyZXFzLCBvcHR2YWwsIHNpemVvZihncmVxcykpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGdyZXFzLmdzcl9ncm91cC5zc19mYW1pbHkgIT0gQUZfSU5FVCB8fAorCQkgICAgZ3JlcXMuZ3NyX3NvdXJjZS5zc19mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQlicmVhazsKKwkJfQorCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxcy5nc3JfZ3JvdXA7CisJCW1yZXFzLmltcl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXFzLmdzcl9zb3VyY2U7CisJCW1yZXFzLmltcl9zb3VyY2VhZGRyID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOworCQltcmVxcy5pbXJfaW50ZXJmYWNlID0gMDsgLyogdXNlIGluZGV4IGZvciBtY19zb3VyY2UgKi8KKworCQlpZiAob3B0bmFtZSA9PSBNQ0FTVF9CTE9DS19TT1VSQ0UpIHsKKwkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKKwkJCWFkZCA9IDE7CisJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBNQ0FTVF9VTkJMT0NLX1NPVVJDRSkgeworCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOworCQkJYWRkID0gMDsKKwkJfSBlbHNlIGlmIChvcHRuYW1lID09IE1DQVNUX0pPSU5fU09VUkNFX0dST1VQKSB7CisJCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKworCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcXMuZ3NyX2dyb3VwOworCQkJbXJlcS5pbXJfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHI7CisJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IDA7CisJCQltcmVxLmltcl9pZmluZGV4ID0gZ3JlcXMuZ3NyX2ludGVyZmFjZTsKKwkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwkJCWlmIChlcnIgJiYgZXJyICE9IC1FQUREUklOVVNFKQorCQkJCWJyZWFrOworCQkJZ3JlcXMuZ3NyX2ludGVyZmFjZSA9IG1yZXEuaW1yX2lmaW5kZXg7CisJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQlhZGQgPSAxOworCQl9IGVsc2UgLyogTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQICovIHsKKwkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKKwkJCWFkZCA9IDA7CisJCX0KKwkJZXJyID0gaXBfbWNfc291cmNlKGFkZCwgb21vZGUsIHNrLCAmbXJlcXMsCisJCQkJICAgZ3JlcXMuZ3NyX2ludGVyZmFjZSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1DQVNUX01TRklMVEVSOgorCXsKKwkJZXh0ZXJuIGludCBzeXNjdGxfaWdtcF9tYXhfbXNmOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47CisJCXN0cnVjdCBpcF9tc2ZpbHRlciAqbXNmID0gTlVMTDsKKwkJc3RydWN0IGdyb3VwX2ZpbHRlciAqZ3NmID0gTlVMTDsKKwkJaW50IG1zaXplLCBpLCBpZmluZGV4OworCisJCWlmIChvcHRsZW4gPCBHUk9VUF9GSUxURVJfU0laRSgwKSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaWYgKG9wdGxlbiA+IHN5c2N0bF9vcHRtZW1fbWF4KSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWJyZWFrOworCQl9CisJCWdzZiA9IGttYWxsb2Mob3B0bGVuLEdGUF9LRVJORUwpOworCQlpZiAoZ3NmID09IDApIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGdzZiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCQlnb3RvIG1jX21zZl9vdXQ7CisJCX0KKwkJLyogbnVtc3JjID49ICg0Ry0xNDApLzEyOCBvdmVyZmxvdyBpbiAzMiBiaXRzICovCisJCWlmIChnc2YtPmdmX251bXNyYyA+PSAweDFmZmZmZmYgfHwKKwkJICAgIGdzZi0+Z2ZfbnVtc3JjID4gc3lzY3RsX2lnbXBfbWF4X21zZikgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIG1jX21zZl9vdXQ7CisJCX0KKwkJaWYgKEdST1VQX0ZJTFRFUl9TSVpFKGdzZi0+Z2ZfbnVtc3JjKSA+IG9wdGxlbikgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gbWNfbXNmX291dDsKKwkJfQorCQltc2l6ZSA9IElQX01TRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpOworCQltc2YgPSBrbWFsbG9jKG1zaXplLEdGUF9LRVJORUwpOworCQlpZiAobXNmID09IDApIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJZ290byBtY19tc2Zfb3V0OworCQl9CisJCWlmaW5kZXggPSBnc2YtPmdmX2ludGVyZmFjZTsKKwkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3NmLT5nZl9ncm91cDsKKwkJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQlnb3RvIG1jX21zZl9vdXQ7CisJCX0KKwkJbXNmLT5pbXNmX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwkJbXNmLT5pbXNmX2ludGVyZmFjZSA9IDA7CisJCW1zZi0+aW1zZl9mbW9kZSA9IGdzZi0+Z2ZfZm1vZGU7CisJCW1zZi0+aW1zZl9udW1zcmMgPSBnc2YtPmdmX251bXNyYzsKKwkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCWZvciAoaT0wOyBpPGdzZi0+Z2ZfbnVtc3JjOyArK2kpIHsKKwkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdzZi0+Z2Zfc2xpc3RbaV07CisKKwkJCWlmIChwc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJZ290byBtY19tc2Zfb3V0OworCQkJbXNmLT5pbXNmX3NsaXN0W2ldID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOworCQl9CisJCWtmcmVlKGdzZik7CisJCWdzZiA9IE5VTEw7CisKKwkJZXJyID0gaXBfbWNfbXNmaWx0ZXIoc2ssIG1zZiwgaWZpbmRleCk7CisJbWNfbXNmX291dDoKKwkJa2ZyZWUobXNmKTsKKwkJa2ZyZWUoZ3NmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBfUk9VVEVSX0FMRVJUOgorCQllcnIgPSBpcF9yYV9jb250cm9sKHNrLCB2YWwgPyAxIDogMCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBJUF9GUkVFQklORDoKKwkJaWYgKG9wdGxlbjwxKQorCQkJZ290byBlX2ludmFsOworCQlpbmV0LT5mcmVlYmluZCA9ICEhdmFsOworCQlicmVhazsKKworCWNhc2UgSVBfSVBTRUNfUE9MSUNZOgorCWNhc2UgSVBfWEZSTV9QT0xJQ1k6CisJCWVyciA9IC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJYnJlYWs7CisJCWVyciA9IHhmcm1fdXNlcl9wb2xpY3koc2ssIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOwogCX0KIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CkBAIC05NDgsMjE0ICs5NTQsMjEzIEBACiAgKi8KIAogc3RhdGljIGludCBkb19pcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQorCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJaW50IHZhbDsKIAlpbnQgbGVuOwogCi0JaWYobGV2ZWwhPVNPTF9JUCkKKwlpZiAobGV2ZWwgIT0gU09MX0lQKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKICNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCi0JaWYob3B0bmFtZT49TVJUX0JBU0UgJiYgb3B0bmFtZSA8PU1SVF9CQVNFKzEwKQotCXsKKwlpZiAob3B0bmFtZSA+PSBNUlRfQkFTRSAmJiBvcHRuYW1lIDw9IE1SVF9CQVNFKzEwKSB7CiAJCXJldHVybiBpcF9tcm91dGVfZ2V0c29ja29wdChzayxvcHRuYW1lLG9wdHZhbCxvcHRsZW4pOwogCX0KICNlbmRpZgogCi0JaWYoZ2V0X3VzZXIobGVuLG9wdGxlbikpCisJaWYgKGdldF91c2VyKGxlbixvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZihsZW4gPCAwKQorCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxvY2tfc29jayhzayk7CiAKLQlzd2l0Y2gob3B0bmFtZSkJewotCQljYXNlIElQX09QVElPTlM6Ci0JCQl7Ci0JCQkJdW5zaWduZWQgY2hhciBvcHRidWZbc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSs0MF07Ci0JCQkJc3RydWN0IGlwX29wdGlvbnMgKiBvcHQgPSAoc3RydWN0IGlwX29wdGlvbnMqKW9wdGJ1ZjsKLQkJCQlvcHQtPm9wdGxlbiA9IDA7Ci0JCQkJaWYgKGluZXQtPm9wdCkKLQkJCQkJbWVtY3B5KG9wdGJ1ZiwgaW5ldC0+b3B0LAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSsKLQkJCQkJICAgICAgIGluZXQtPm9wdC0+b3B0bGVuKTsKLQkJCQlyZWxlYXNlX3NvY2soc2spOworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSVBfT1BUSU9OUzoKKwl7CisJCXVuc2lnbmVkIGNoYXIgb3B0YnVmW3NpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykrNDBdOworCQlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9IChzdHJ1Y3QgaXBfb3B0aW9ucyopb3B0YnVmOworCQlvcHQtPm9wdGxlbiA9IDA7CisJCWlmIChpbmV0LT5vcHQpCisJCQltZW1jcHkob3B0YnVmLCBpbmV0LT5vcHQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSsKKwkJCSAgICAgICBpbmV0LT5vcHQtPm9wdGxlbik7CisJCXJlbGVhc2Vfc29jayhzayk7CiAKLQkJCQlpZiAob3B0LT5vcHRsZW4gPT0gMCkKLQkJCQkJcmV0dXJuIHB1dF91c2VyKDAsIG9wdGxlbik7CisJCWlmIChvcHQtPm9wdGxlbiA9PSAwKQorCQkJcmV0dXJuIHB1dF91c2VyKDAsIG9wdGxlbik7CiAKLQkJCQlpcF9vcHRpb25zX3VuZG8ob3B0KTsKKwkJaXBfb3B0aW9uc191bmRvKG9wdCk7CiAKLQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgb3B0LT5vcHRsZW4pOwotCQkJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYoY29weV90b191c2VyKG9wdHZhbCwgb3B0LT5fX2RhdGEsIGxlbikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXJldHVybiAwOwotCQkJfQotCQljYXNlIElQX1BLVElORk86Ci0JCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUEtUSU5GTykgIT0gMDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFQ1ZUVEw6Ci0JCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfVFRMKSAhPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVDVlRPUzoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UT1MpICE9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRUNWT1BUUzoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19SRUNWT1BUUykgIT0gMDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFVE9QVFM6Ci0JCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUkVUT1BUUykgIT0gMDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1BBU1NTRUM6Ci0JCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUEFTU1NFQykgIT0gMDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1RPUzoKLQkJCXZhbCA9IGluZXQtPnRvczsKLQkJCWJyZWFrOwotCQljYXNlIElQX1RUTDoKLQkJCXZhbCA9IChpbmV0LT51Y190dGwgPT0gLTEgPwotCQkJICAgICAgIHN5c2N0bF9pcF9kZWZhdWx0X3R0bCA6Ci0JCQkgICAgICAgaW5ldC0+dWNfdHRsKTsKLQkJCWJyZWFrOwotCQljYXNlIElQX0hEUklOQ0w6Ci0JCQl2YWwgPSBpbmV0LT5oZHJpbmNsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVRVX0RJU0NPVkVSOgotCQkJdmFsID0gaW5ldC0+cG10dWRpc2M7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVFU6Ci0JCXsKLQkJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQkJCXZhbCA9IDA7Ci0JCQlkc3QgPSBza19kc3RfZ2V0KHNrKTsKLQkJCWlmIChkc3QpIHsKLQkJCQl2YWwgPSBkc3RfbXR1KGRzdCk7Ci0JCQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJCX0KLQkJCWlmICghdmFsKSB7Ci0JCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCQlyZXR1cm4gLUVOT1RDT05OOwotCQkJfQotCQkJYnJlYWs7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBvcHQtPm9wdGxlbik7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIG9wdC0+X19kYXRhLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIElQX1BLVElORk86CisJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QS1RJTkZPKSAhPSAwOworCQlicmVhazsKKwljYXNlIElQX1JFQ1ZUVEw6CisJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UVEwpICE9IDA7CisJCWJyZWFrOworCWNhc2UgSVBfUkVDVlRPUzoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1RPUykgIT0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRUNWT1BUUzoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1JFQ1ZPUFRTKSAhPSAwOworCQlicmVhazsKKwljYXNlIElQX1JFVE9QVFM6CisJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19SRVRPUFRTKSAhPSAwOworCQlicmVhazsKKwljYXNlIElQX1BBU1NTRUM6CisJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QQVNTU0VDKSAhPSAwOworCQlicmVhazsKKwljYXNlIElQX1RPUzoKKwkJdmFsID0gaW5ldC0+dG9zOworCQlicmVhazsKKwljYXNlIElQX1RUTDoKKwkJdmFsID0gKGluZXQtPnVjX3R0bCA9PSAtMSA/CisJCSAgICAgICBzeXNjdGxfaXBfZGVmYXVsdF90dGwgOgorCQkgICAgICAgaW5ldC0+dWNfdHRsKTsKKwkJYnJlYWs7CisJY2FzZSBJUF9IRFJJTkNMOgorCQl2YWwgPSBpbmV0LT5oZHJpbmNsOworCQlicmVhazsKKwljYXNlIElQX01UVV9ESVNDT1ZFUjoKKwkJdmFsID0gaW5ldC0+cG10dWRpc2M7CisJCWJyZWFrOworCWNhc2UgSVBfTVRVOgorCXsKKwkJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCQl2YWwgPSAwOworCQlkc3QgPSBza19kc3RfZ2V0KHNrKTsKKwkJaWYgKGRzdCkgeworCQkJdmFsID0gZHN0X210dShkc3QpOworCQkJZHN0X3JlbGVhc2UoZHN0KTsKIAkJfQotCQljYXNlIElQX1JFQ1ZFUlI6Ci0JCQl2YWwgPSBpbmV0LT5yZWN2ZXJyOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX1RUTDoKLQkJCXZhbCA9IGluZXQtPm1jX3R0bDsKLQkJCWJyZWFrOwotCQljYXNlIElQX01VTFRJQ0FTVF9MT09QOgotCQkJdmFsID0gaW5ldC0+bWNfbG9vcDsKLQkJCWJyZWFrOwotCQljYXNlIElQX01VTFRJQ0FTVF9JRjoKLQkJewotCQkJc3RydWN0IGluX2FkZHIgYWRkcjsKLQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQkJCWFkZHIuc19hZGRyID0gaW5ldC0+bWNfYWRkcjsKKwkJaWYgKCF2YWwpIHsKIAkJCXJlbGVhc2Vfc29jayhzayk7Ci0KLQkJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsICZhZGRyLCBsZW4pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVOT1RDT05OOwogCQl9Ci0JCWNhc2UgSVBfTVNGSUxURVI6Ci0JCXsKLQkJCXN0cnVjdCBpcF9tc2ZpbHRlciBtc2Y7Ci0JCQlpbnQgZXJyOworCQlicmVhazsKKwl9CisJY2FzZSBJUF9SRUNWRVJSOgorCQl2YWwgPSBpbmV0LT5yZWN2ZXJyOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9UVEw6CisJCXZhbCA9IGluZXQtPm1jX3R0bDsKKwkJYnJlYWs7CisJY2FzZSBJUF9NVUxUSUNBU1RfTE9PUDoKKwkJdmFsID0gaW5ldC0+bWNfbG9vcDsKKwkJYnJlYWs7CisJY2FzZSBJUF9NVUxUSUNBU1RfSUY6CisJeworCQlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWFkZHIuc19hZGRyID0gaW5ldC0+bWNfYWRkcjsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAotCQkJaWYgKGxlbiA8IElQX01TRklMVEVSX1NJWkUoMCkpIHsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2YsIG9wdHZhbCwgSVBfTVNGSUxURVJfU0laRSgwKSkpIHsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJZXJyID0gaXBfbWNfbXNmZ2V0KHNrLCAmbXNmLAotCQkJCShzdHJ1Y3QgaXBfbXNmaWx0ZXIgX191c2VyICopb3B0dmFsLCBvcHRsZW4pOworCQlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmYWRkciwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBJUF9NU0ZJTFRFUjoKKwl7CisJCXN0cnVjdCBpcF9tc2ZpbHRlciBtc2Y7CisJCWludCBlcnI7CisKKwkJaWYgKGxlbiA8IElQX01TRklMVEVSX1NJWkUoMCkpIHsKIAkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlyZXR1cm4gZXJyOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKLQkJewotCQkJc3RydWN0IGdyb3VwX2ZpbHRlciBnc2Y7Ci0JCQlpbnQgZXJyOwotCi0JCQlpZiAobGVuIDwgR1JPVVBfRklMVEVSX1NJWkUoMCkpIHsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZnc2YsIG9wdHZhbCwgR1JPVVBfRklMVEVSX1NJWkUoMCkpKSB7Ci0JCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCWVyciA9IGlwX21jX2dzZmdldChzaywgJmdzZiwKLQkJCQkoc3RydWN0IGdyb3VwX2ZpbHRlciBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbXNmLCBvcHR2YWwsIElQX01TRklMVEVSX1NJWkUoMCkpKSB7CiAJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJcmV0dXJuIGVycjsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0JCWNhc2UgSVBfUEtUT1BUSU9OUzoKLQkJewotCQkJc3RydWN0IG1zZ2hkciBtc2c7CisJCWVyciA9IGlwX21jX21zZmdldChzaywgJm1zZiwKKwkJCQkgICAoc3RydWN0IGlwX21zZmlsdGVyIF9fdXNlciAqKW9wdHZhbCwgb3B0bGVuKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKKwl7CisJCXN0cnVjdCBncm91cF9maWx0ZXIgZ3NmOworCQlpbnQgZXJyOwogCisJCWlmIChsZW4gPCBHUk9VUF9GSUxURVJfU0laRSgwKSkgewogCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQotCQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKQotCQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0KLQkJCW1zZy5tc2dfY29udHJvbCA9IG9wdHZhbDsKLQkJCW1zZy5tc2dfY29udHJvbGxlbiA9IGxlbjsKLQkJCW1zZy5tc2dfZmxhZ3MgPSAwOwotCi0JCQlpZiAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUEtUSU5GTykgewotCQkJCXN0cnVjdCBpbl9wa3RpbmZvIGluZm87Ci0KLQkJCQlpbmZvLmlwaV9hZGRyLnNfYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKLQkJCQlpbmZvLmlwaV9zcGVjX2RzdC5zX2FkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7Ci0JCQkJaW5mby5pcGlfaWZpbmRleCA9IGluZXQtPm1jX2luZGV4OwotCQkJCXB1dF9jbXNnKCZtc2csIFNPTF9JUCwgSVBfUEtUSU5GTywgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0JCQl9Ci0JCQlpZiAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfVFRMKSB7Ci0JCQkJaW50IGhsaW0gPSBpbmV0LT5tY190dGw7Ci0JCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQLCBJUF9UVEwsIHNpemVvZihobGltKSwgJmhsaW0pOwotCQkJfQotCQkJbGVuIC09IG1zZy5tc2dfY29udHJvbGxlbjsKLQkJCXJldHVybiBwdXRfdXNlcihsZW4sIG9wdGxlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQljYXNlIElQX0ZSRUVCSU5EOgotCQkJdmFsID0gaW5ldC0+ZnJlZWJpbmQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnc2YsIG9wdHZhbCwgR1JPVVBfRklMVEVSX1NJWkUoMCkpKSB7CiAJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZXJyID0gaXBfbWNfZ3NmZ2V0KHNrLCAmZ3NmLAorCQkJCSAgIChzdHJ1Y3QgZ3JvdXBfZmlsdGVyIF9fdXNlciAqKW9wdHZhbCwgb3B0bGVuKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2FzZSBJUF9QS1RPUFRJT05TOgorCXsKKwkJc3RydWN0IG1zZ2hkciBtc2c7CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCiAJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJCW1zZy5tc2dfY29udHJvbCA9IG9wdHZhbDsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gbGVuOworCQltc2cubXNnX2ZsYWdzID0gMDsKKworCQlpZiAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUEtUSU5GTykgeworCQkJc3RydWN0IGluX3BrdGluZm8gaW5mbzsKKworCQkJaW5mby5pcGlfYWRkci5zX2FkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7CisJCQlpbmZvLmlwaV9zcGVjX2RzdC5zX2FkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7CisJCQlpbmZvLmlwaV9pZmluZGV4ID0gaW5ldC0+bWNfaW5kZXg7CisJCQlwdXRfY21zZygmbXNnLCBTT0xfSVAsIElQX1BLVElORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOworCQl9CisJCWlmIChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UVEwpIHsKKwkJCWludCBobGltID0gaW5ldC0+bWNfdHRsOworCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQLCBJUF9UVEwsIHNpemVvZihobGltKSwgJmhsaW0pOworCQl9CisJCWxlbiAtPSBtc2cubXNnX2NvbnRyb2xsZW47CisJCXJldHVybiBwdXRfdXNlcihsZW4sIG9wdGxlbik7CisJfQorCWNhc2UgSVBfRlJFRUJJTkQ6CisJCXZhbCA9IGluZXQtPmZyZWViaW5kOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KIAlyZWxlYXNlX3NvY2soc2spOwogCiAJaWYgKGxlbiA8IHNpemVvZihpbnQpICYmIGxlbiA+IDAgJiYgdmFsPj0wICYmIHZhbDwyNTUpIHsKIAkJdW5zaWduZWQgY2hhciB1Y3ZhbCA9ICh1bnNpZ25lZCBjaGFyKXZhbDsKIAkJbGVuID0gMTsKLQkJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsJnVjdmFsLDEpKQorCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwmdWN2YWwsMSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgewogCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemVvZihpbnQpLCBsZW4pOwotCQlpZihwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYoY29weV90b191c2VyKG9wdHZhbCwmdmFsLGxlbikpCisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsbGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogaW50IGlwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCi0JCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCisJCSAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKIAlpbnQgZXJyOwogCkBAIC0xMTY5LDcgKzExNzQsNyBAQAogCSAgICkgewogCQlpbnQgbGVuOwogCi0JCWlmKGdldF91c2VyKGxlbixvcHRsZW4pKQorCQlpZiAoZ2V0X3VzZXIobGVuLG9wdGxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlsb2NrX3NvY2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb21wLmMgYi9uZXQvaXB2NC9pcGNvbXAuYwppbmRleCBhYTcwNGI4Li5hYjg2MTM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbXAuYworKysgYi9uZXQvaXB2NC9pcGNvbXAuYwpAQCAtNDMsMjEgKzQzLDE1IEBACiAKIHN0YXRpYyBpbnQgaXBjb21wX2RlY29tcHJlc3Moc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGVyciwgcGxlbiwgZGxlbjsKIAlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOwotCXU4ICpzdGFydCwgKnNjcmF0Y2g7Ci0Jc3RydWN0IGNyeXB0b19jb21wICp0Zm07Ci0JaW50IGNwdTsKKwljb25zdCBpbnQgcGxlbiA9IHNrYi0+bGVuOworCWludCBkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKKwljb25zdCB1OCAqc3RhcnQgPSBza2ItPmRhdGE7CisJY29uc3QgaW50IGNwdSA9IGdldF9jcHUoKTsKKwl1OCAqc2NyYXRjaCA9ICpwZXJfY3B1X3B0cihpcGNvbXBfc2NyYXRjaGVzLCBjcHUpOworCXN0cnVjdCBjcnlwdG9fY29tcCAqdGZtID0gKnBlcl9jcHVfcHRyKGlwY2QtPnRmbXMsIGNwdSk7CisJaW50IGVyciA9IGNyeXB0b19jb21wX2RlY29tcHJlc3ModGZtLCBzdGFydCwgcGxlbiwgc2NyYXRjaCwgJmRsZW4pOwogCi0JcGxlbiA9IHNrYi0+bGVuOwotCWRsZW4gPSBJUENPTVBfU0NSQVRDSF9TSVpFOwotCXN0YXJ0ID0gc2tiLT5kYXRhOwotCi0JY3B1ID0gZ2V0X2NwdSgpOwotCXNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wX3NjcmF0Y2hlcywgY3B1KTsKLQl0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKLQotCWVyciA9IGNyeXB0b19jb21wX2RlY29tcHJlc3ModGZtLCBzdGFydCwgcGxlbiwgc2NyYXRjaCwgJmRsZW4pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC03Miw3ICs2Niw3IEBACiAKIAlza2ItPnRydWVzaXplICs9IGRsZW4gLSBwbGVuOwogCV9fc2tiX3B1dChza2IsIGRsZW4gLSBwbGVuKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBzY3JhdGNoLCBkbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNjcmF0Y2gsIGRsZW4pOwogb3V0OgogCXB1dF9jcHUoKTsKIAlyZXR1cm4gZXJyOwpAQCAtOTAsMTAgKzg0LDEwIEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogUmVtb3ZlIGlwY29tcCBoZWFkZXIgYW5kIGRlY29tcHJlc3Mgb3JpZ2luYWwgcGF5bG9hZCAqLwotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlwY2ggPSAodm9pZCAqKXNrYi0+ZGF0YTsKIAlpcGgtPnByb3RvY29sID0gaXBjaC0+bmV4dGhkcjsKLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgKyBzaXplb2YoKmlwY2gpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2YoKmlwY2gpOwogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmlwY2gpKTsKIAllcnIgPSBpcGNvbXBfZGVjb21wcmVzcyh4LCBza2IpOwogCkBAIC0xMDMsMjMgKzk3LDE2IEBACiAKIHN0YXRpYyBpbnQgaXBjb21wX2NvbXByZXNzKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBlcnIsIHBsZW4sIGRsZW4sIGlobGVuOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CiAJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKLQl1OCAqc3RhcnQsICpzY3JhdGNoOwotCXN0cnVjdCBjcnlwdG9fY29tcCAqdGZtOwotCWludCBjcHU7CisJY29uc3QgaW50IGlobGVuID0gaXBfaGRybGVuKHNrYik7CisJY29uc3QgaW50IHBsZW4gPSBza2ItPmxlbiAtIGlobGVuOworCWludCBkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKKwl1OCAqc3RhcnQgPSBza2ItPmRhdGEgKyBpaGxlbjsKKwljb25zdCBpbnQgY3B1ID0gZ2V0X2NwdSgpOworCXU4ICpzY3JhdGNoID0gKnBlcl9jcHVfcHRyKGlwY29tcF9zY3JhdGNoZXMsIGNwdSk7CisJc3RydWN0IGNyeXB0b19jb21wICp0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKKwlpbnQgZXJyID0gY3J5cHRvX2NvbXBfY29tcHJlc3ModGZtLCBzdGFydCwgcGxlbiwgc2NyYXRjaCwgJmRsZW4pOwogCi0JaWhsZW4gPSBpcGgtPmlobCAqIDQ7Ci0JcGxlbiA9IHNrYi0+bGVuIC0gaWhsZW47Ci0JZGxlbiA9IElQQ09NUF9TQ1JBVENIX1NJWkU7Ci0Jc3RhcnQgPSBza2ItPmRhdGEgKyBpaGxlbjsKLQotCWNwdSA9IGdldF9jcHUoKTsKLQlzY3JhdGNoID0gKnBlcl9jcHVfcHRyKGlwY29tcF9zY3JhdGNoZXMsIGNwdSk7Ci0JdGZtID0gKnBlcl9jcHVfcHRyKGlwY2QtPnRmbXMsIGNwdSk7Ci0KLQllcnIgPSBjcnlwdG9fY29tcF9jb21wcmVzcyh0Zm0sIHN0YXJ0LCBwbGVuLCBzY3JhdGNoLCAmZGxlbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE0MiwxMiArMTI5LDExIEBACiBzdGF0aWMgaW50IGlwY29tcF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgaXBfY29tcF9oZHIgKmlwY2g7CiAJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKIAlpbnQgaGRyX2xlbiA9IDA7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAotCWlwaCA9IHNrYi0+bmguaXBoOwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAloZHJfbGVuID0gaXBoLT5paGwgKiA0OwogCWlmICgoc2tiLT5sZW4gLSBoZHJfbGVuKSA8IGlwY2QtPnRocmVzaG9sZCkgewpAQCAtMTU5LDcgKzE0NSw3IEBACiAJCWdvdG8gb3V0X29rOwogCiAJZXJyID0gaXBjb21wX2NvbXByZXNzKHgsIHNrYik7Ci0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAlpZiAoZXJyKSB7CiAJCWdvdG8gb3V0X29rOwpAQCAtMTg4LDggKzE3NCw4IEBACiAJc3RydWN0IGlwX2NvbXBfaGRyICppcGNoID0gKHN0cnVjdCBpcF9jb21wX2hkciAqKShza2ItPmRhdGErKGlwaC0+aWhsPDwyKSk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CiAKLQlpZiAoc2tiLT5oLmljbXBoLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIIHx8Ci0JICAgIHNrYi0+aC5pY21waC0+Y29kZSAhPSBJQ01QX0ZSQUdfTkVFREVEKQorCWlmIChpY21wX2hkcihza2IpLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIIHx8CisJICAgIGljbXBfaGRyKHNrYiktPmNvZGUgIT0gSUNNUF9GUkFHX05FRURFRCkKIAkJcmV0dXJuOwogCiAJc3BpID0gaHRvbmwobnRvaHMoaXBjaC0+Y3BpKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbmZpZy5jIGIvbmV0L2lwdjQvaXBjb25maWcuYwppbmRleCBjZjQ5ZGUxLi41OTdjODAwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbmZpZy5jCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCQlnb3RvIGRyb3A7CiAKIAkvKiBCYXNpYyBzYW5pdHkgY2hlY2tzIGNhbiBiZSBkb25lIHdpdGhvdXQgdGhlIGxvY2suICAqLwotCXJhcnAgPSAoc3RydWN0IGFycGhkciAqKXNrYi0+aC5yYXc7CisJcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCS8qIElmIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3MsIGl0J3Mgbm90IElQLCBvciB3ZSBzaG91bGQKIAkgKiBpZ25vcmUgaXQgYW55d2F5LgpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJCWdvdG8gZHJvcDsKIAogCS8qIE9LLCBpdCBpcyBhbGwgdGhlcmUgYW5kIGxvb2tzIHZhbGlkLCBwcm9jZXNzLi4uICovCi0JcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiLT5oLnJhdzsKKwlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXJhcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKHJhcnAgKyAxKTsKIAogCS8qIE9uZSByZXBseSBhdCBhIHRpbWUsIHBsZWFzZS4gKi8KQEAgLTcwMiw3ICs3MDIsOCBAQAogCW1lbXNldChiLCAwLCBzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwogCiAJLyogQ29uc3RydWN0IElQIGhlYWRlciAqLwotCXNrYi0+bmguaXBoID0gaCA9ICZiLT5pcGg7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaCA9IGlwX2hkcihza2IpOwogCWgtPnZlcnNpb24gPSA0OwogCWgtPmlobCA9IDU7CiAJaC0+dG90X2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgYm9vdHBfcGt0KSk7CkBAIC03ODIsNyArNzgzLDcgQEAKIAl1OCAqYzsKIAogCXByaW50aygiREhDUC9CT09UUDogR290IGV4dGVuc2lvbiAlZDoiLCpleHQpOwotCWZvcihjPWV4dCsyOyBjPGV4dCsyK2V4dFsxXTsgYysrKQorCWZvciAoYz1leHQrMjsgYzxleHQrMitleHRbMV07IGMrKykKIAkJcHJpbnRrKCIgJTAyeCIsICpjKTsKIAlwcmludGsoIlxuIik7CiAjZW5kaWYKQEAgLTg0NSw3ICs4NDYsNyBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKSkKIAkJZ290byBkcm9wOwogCi0JYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYi0+bmguaXBoOworCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCWggPSAmYi0+aXBoOwogCiAJaWYgKGgtPmlobCAhPSA1IHx8IGgtPnZlcnNpb24gIT0gNCB8fCBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKQEAgLTg4Myw3ICs4ODQsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKIAkJZ290byBkcm9wOwogCi0JYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYi0+bmguaXBoOworCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCWggPSAmYi0+aXBoOwogCiAJLyogT25lIHJlcGx5IGF0IGEgdGltZSwgcGxlYXNlLiAqLwpAQCAtOTM4LDcgKzkzOSw3IEBACiAJCQkJCWlmIChvcHRbMV0gPj0gNCkKIAkJCQkJCW1lbWNweSgmc2VydmVyX2lkLCBvcHQgKyAyLCA0KTsKIAkJCQkJYnJlYWs7Ci0JCQkJfTsKKwkJCQl9CiAJCQl9CiAKICNpZmRlZiBJUENPTkZJR19ERUJVRwpAQCAtOTgzLDcgKzk4NCw3IEBACiAJCQkJaWNfbXlhZGRyID0gTk9ORTsKIAkJCQlpY19zZXJ2YWRkciA9IE5PTkU7CiAJCQkJZ290byBkcm9wX3VubG9jazsKLQkJCX07CisJCQl9CiAKIAkJCWljX2RoY3BfbXNndHlwZSA9IG10OwogCkBAIC0xMDk0LDcgKzEwOTUsNyBAQAogCXJldHJpZXMgPSBDT05GX1NFTkRfUkVUUklFUzsKIAlnZXRfcmFuZG9tX2J5dGVzKCZ0aW1lb3V0LCBzaXplb2YodGltZW91dCkpOwogCXRpbWVvdXQgPSBDT05GX0JBU0VfVElNRU9VVCArICh0aW1lb3V0ICUgKHVuc2lnbmVkKSBDT05GX1RJTUVPVVRfUkFORE9NKTsKLQlmb3IoOzspIHsKKwlmb3IgKDs7KSB7CiAjaWZkZWYgSVBDT05GSUdfQk9PVFAKIAkJaWYgKGRvX2Jvb3RwICYmIChkLT5hYmxlICYgSUNfQk9PVFApKQogCQkJaWNfYm9vdHBfc2VuZF9pZihkLCBqaWZmaWVzIC0gc3RhcnRfamlmZmllcyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGlwLmMgYi9uZXQvaXB2NC9pcGlwLmMKaW5kZXggM2VjNWNlMC4uZWJkMmYyZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBpcC5jCisrKyBiL25ldC9pcHY0L2lwaXAuYwpAQCAtMTU3LDEwICsxNTcsMTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKippcGlwX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQorc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKipfX2lwaXBfYnVja2V0KHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMpCiB7Ci0JX19iZTMyIHJlbW90ZSA9IHQtPnBhcm1zLmlwaC5kYWRkcjsKLQlfX2JlMzIgbG9jYWwgPSB0LT5wYXJtcy5pcGguc2FkZHI7CisJX19iZTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7CisJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAl1bnNpZ25lZCBoID0gMDsKIAlpbnQgcHJpbyA9IDA7CiAKQEAgLTE3NSw2ICsxNzUsMTAgQEAKIAlyZXR1cm4gJnR1bm5lbHNbcHJpb11baF07CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3R1bm5lbCAqKmlwaXBfYnVja2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJcmV0dXJuIF9faXBpcF9idWNrZXQoJnQtPnBhcm1zKTsKK30KIAogc3RhdGljIHZvaWQgaXBpcF90dW5uZWxfdW5saW5rKHN0cnVjdCBpcF90dW5uZWwgKnQpCiB7CkBAIC0yMDYsMTkgKzIxMCw5IEBACiAJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBoID0gMDsKLQlpbnQgcHJpbyA9IDA7CiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIAotCWlmIChyZW1vdGUpIHsKLQkJcHJpbyB8PSAyOwotCQloIF49IEhBU0gocmVtb3RlKTsKLQl9Ci0JaWYgKGxvY2FsKSB7Ci0JCXByaW8gfD0gMTsKLQkJaCBePSBIQVNIKGxvY2FsKTsKLQl9Ci0JZm9yICh0cCA9ICZ0dW5uZWxzW3ByaW9dW2hdOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgeworCWZvciAodHAgPSBfX2lwaXBfYnVja2V0KHBhcm1zKTsgKHQgPSAqdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpIHsKIAkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKQogCQkJcmV0dXJuIHQ7CiAJfQpAQCAtMjgwLDggKzI3NCw4IEBACiAgICBJQ01QIGluIHRoZSByZWFsIEludGVybmV0IGlzIGFic29sdXRlbHkgaW5mZWFzaWJsZS4KICAqLwogCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopc2tiLT5kYXRhOwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJc3RydWN0IGlwX3R1bm5lbCAqdDsKIAlpbnQgZXJyOwogCkBAIC0zMzYsOCArMzMwLDggQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKWRwOwogCWludCBobGVuID0gaXBoLT5paGw8PDI7CiAJc3RydWN0IGlwaGRyICplaXBoOwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJaW50IHJlbF90eXBlID0gMDsKIAlpbnQgcmVsX2NvZGUgPSAwOwogCV9fYmUzMiByZWxfaW5mbyA9IDA7CkBAIC0zNTQsNyArMzQ4LDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKLQkJbiA9IG50b2hsKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSkgPj4gMjQ7CisJCW4gPSBudG9obChpY21wX2hkcihza2IpLT51bi5nYXRld2F5KSA+PiAyNDsKIAkJaWYgKG4gPCBobGVuKQogCQkJcmV0dXJuIDA7CiAKQEAgLTM3Myw3ICszNjcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWNhc2UgSUNNUF9GUkFHX05FRURFRDoKIAkJCS8qIEFuZCBpdCBpcyB0aGUgb25seSByZWFsbHkgbmVjZXNzYXJ5IHRoaW5nIDotKSAqLwotCQkJbiA9IG50b2hzKHNrYi0+aC5pY21waC0+dW4uZnJhZy5tdHUpOworCQkJbiA9IG50b2hzKGljbXBfaGRyKHNrYiktPnVuLmZyYWcubXR1KTsKIAkJCWlmIChuIDwgaGxlbis2OCkKIAkJCQlyZXR1cm4gMDsKIAkJCW4gLT0gaGxlbjsKQEAgLTQwNSw3ICszOTksNyBAQAogCWRzdF9yZWxlYXNlKHNrYjItPmRzdCk7CiAJc2tiMi0+ZHN0ID0gTlVMTDsKIAlza2JfcHVsbChza2IyLCBza2ItPmRhdGEgLSAodTgqKWVpcGgpOwotCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLwogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwpAQCAtNDYxLDkgKzQ1NSwxMCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcGlwX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3QgaXBoZHIgKm91dGVyX2lwaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlwX2Vjbl9kZWNhcHN1bGF0ZShjb25zdCBzdHJ1Y3QgaXBoZHIgKm91dGVyX2lwaCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaW5uZXJfaXBoID0gaXBfaGRyKHNrYik7CiAKIAlpZiAoSU5FVF9FQ05faXNfY2Uob3V0ZXJfaXBoLT50b3MpKQogCQlJUF9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CkBAIC00NzEsMTAgKzQ2Niw4IEBACiAKIHN0YXRpYyBpbnQgaXBpcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7Ci0KLQlpcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJcmVhZF9sb2NrKCZpcGlwX2xvY2spOwogCWlmICgodHVubmVsID0gaXBpcF90dW5uZWxfbG9va3VwKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpKSAhPSBOVUxMKSB7CkBAIC00ODYsOCArNDc5LDggQEAKIAogCQlzZWNwYXRoX3Jlc2V0KHNrYik7CiAKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7Ci0JCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPm1hY19oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCkBAIC01MjEsNyArNTE0LDcgQEAKIAlfX2JlMTYgZGYgPSB0aXBoLT5mcmFnX29mZjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsgICAgIAkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KLQlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLwogCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KIAlfX2JlMzIgZHN0ID0gdGlwaC0+ZGFkZHI7CkBAIC02MTUsMTEgKzYwOCwxMiBAQAogCQkJc2tiX3NldF9vd25lcl93KG5ld19za2IsIHNrYi0+c2spOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXNrYiA9IG5ld19za2I7Ci0JCW9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwkJb2xkX2lwaCA9IGlwX2hkcihza2IpOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAlJUENCKHNrYiktPmZsYWdzICY9IH4oSVBTS0JfWEZSTV9UVU5ORUxfU0laRSB8IElQU0tCX1hGUk1fVFJBTlNGT1JNRUQgfAogCQkJICAgICAgSVBTS0JfUkVST1VURUQpOwpAQCAtNjMwLDcgKzYyNCw3IEBACiAJICoJUHVzaCBkb3duIGFuZCBpbnN0YWxsIHRoZSBJUElQIGhlYWRlci4KIAkgKi8KIAotCWlwaCAJCQk9CXNrYi0+bmguaXBoOworCWlwaCAJCQk9CWlwX2hkcihza2IpOwogCWlwaC0+dmVyc2lvbgkJPQk0OwogCWlwaC0+aWhsCQk9CXNpemVvZihzdHJ1Y3QgaXBoZHIpPj4yOwogCWlwaC0+ZnJhZ19vZmYJCT0JZGY7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggNjAxZTNkZi4uMGViYWU0MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtNjIsNiArNjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwaXAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBfUElNU01fVjEpIHx8IGRlZmluZWQoQ09ORklHX0lQX1BJTVNNX1YyKQogI2RlZmluZSBDT05GSUdfSVBfUElNU00JMQpAQCAtMzAyLDggKzMwMyw4IEBACiAKIAlhdG9taWNfZGVjKCZjYWNoZV9yZXNvbHZlX3F1ZXVlX2xlbik7CiAKLQl3aGlsZSgoc2tiPXNrYl9kZXF1ZXVlKCZjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCkpKSB7Ci0JCWlmIChza2ItPm5oLmlwaC0+dmVyc2lvbiA9PSAwKSB7CisJd2hpbGUgKChza2I9c2tiX2RlcXVldWUoJmMtPm1mY191bi51bnJlcy51bnJlc29sdmVkKSkpIHsKKwkJaWYgKGlwX2hkcihza2IpLT52ZXJzaW9uID09IDApIHsKIAkJCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCQkJbmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRVJST1I7CiAJCQlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSk7CkBAIC00NzksNyArNDgwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWZjX2NhY2hlICppcG1yX2NhY2hlX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IG1mY19jYWNoZSAqYz1rbWVtX2NhY2hlX3phbGxvYyhtcnRfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZihjPT1OVUxMKQorCWlmIChjPT1OVUxMKQogCQlyZXR1cm4gTlVMTDsKIAljLT5tZmNfdW4ucmVzLm1pbnZpZiA9IE1BWFZJRlM7CiAJcmV0dXJuIGM7CkBAIC00ODgsNyArNDg5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWZjX2NhY2hlICppcG1yX2NhY2hlX2FsbG9jX3VucmVzKHZvaWQpCiB7CiAJc3RydWN0IG1mY19jYWNoZSAqYz1rbWVtX2NhY2hlX3phbGxvYyhtcnRfY2FjaGVwLCBHRlBfQVRPTUlDKTsKLQlpZihjPT1OVUxMKQorCWlmIChjPT1OVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCk7CiAJYy0+bWZjX3VuLnVucmVzLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7CkBAIC01MDgsMTIgKzUwOSwxMyBAQAogCSAqCVBsYXkgdGhlIHBlbmRpbmcgZW50cmllcyB0aHJvdWdoIG91ciByb3V0ZXIKIAkgKi8KIAotCXdoaWxlKChza2I9X19za2JfZGVxdWV1ZSgmdWMtPm1mY191bi51bnJlcy51bnJlc29sdmVkKSkpIHsKLQkJaWYgKHNrYi0+bmguaXBoLT52ZXJzaW9uID09IDApIHsKKwl3aGlsZSAoKHNrYj1fX3NrYl9kZXF1ZXVlKCZ1Yy0+bWZjX3VuLnVucmVzLnVucmVzb2x2ZWQpKSkgeworCQlpZiAoaXBfaGRyKHNrYiktPnZlcnNpb24gPT0gMCkgewogCQkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAKIAkJCWlmIChpcG1yX2ZpbGxfbXJvdXRlKHNrYiwgYywgTkxNU0dfREFUQShubGgpKSA+IDApIHsKLQkJCQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopbmxoOworCQkJCW5saC0+bmxtc2dfbGVuID0gKHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtCisJCQkJCQkgICh1OCAqKW5saCk7CiAJCQl9IGVsc2UgewogCQkJCW5saC0+bmxtc2dfdHlwZSA9IE5MTVNHX0VSUk9SOwogCQkJCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKTsKQEAgLTUzOSw3ICs1NDEsNyBAQAogc3RhdGljIGludCBpcG1yX2NhY2hlX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB2aWZpX3QgdmlmaSwgaW50IGFzc2VydCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBpaGwgPSBwa3QtPm5oLmlwaC0+aWhsPDwyOworCWNvbnN0IGludCBpaGwgPSBpcF9oZHJsZW4ocGt0KTsKIAlzdHJ1Y3QgaWdtcGhkciAqaWdtcDsKIAlzdHJ1Y3QgaWdtcG1zZyAqbXNnOwogCWludCByZXQ7CkBAIC01NTEsNyArNTUzLDcgQEAKICNlbmRpZgogCQlza2IgPSBhbGxvY19za2IoMTI4LCBHRlBfQVRPTUlDKTsKIAotCWlmKCFza2IpCisJaWYgKCFza2IpCiAJCXJldHVybiAtRU5PQlVGUzsKIAogI2lmZGVmIENPTkZJR19JUF9QSU1TTQpAQCAtNTYxLDE0ICs1NjMsMTcgQEAKIAkJICAgQW5kIGFsbCB0aGlzIG9ubHkgdG8gbWFuZ2xlIG1zZy0+aW1fbXNndHlwZSBhbmQKIAkJICAgdG8gc2V0IG1zZy0+aW1fbWJ6IHRvICJtYnoiIDotKQogCQkgKi8KLQkJbXNnID0gKHN0cnVjdCBpZ21wbXNnKilza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKLQkJc2tiLT5uaC5yYXcgPSBza2ItPmgucmF3ID0gKHU4Kiltc2c7Ci0JCW1lbWNweShtc2csIHBrdC0+bmgucmF3LCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwkJbXNnID0gKHN0cnVjdCBpZ21wbXNnICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJCW1lbWNweShtc2csIHNrYl9uZXR3b3JrX2hlYWRlcihwa3QpLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJCW1zZy0+aW1fbXNndHlwZSA9IElHTVBNU0dfV0hPTEVQS1Q7CiAJCW1zZy0+aW1fbWJ6ID0gMDsKIAkJbXNnLT5pbV92aWYgPSByZWdfdmlmX251bTsKLQkJc2tiLT5uaC5pcGgtPmlobCA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpID4+IDI7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMobnRvaHMocGt0LT5uaC5pcGgtPnRvdF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQlpcF9oZHIoc2tiKS0+aWhsID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKKwkJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhudG9ocyhpcF9oZHIocGt0KS0+dG90X2xlbikgKworCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAl9IGVsc2UKICNlbmRpZgogCXsKQEAgLTU3NywxMCArNTgyLDExIEBACiAJICoJQ29weSB0aGUgSVAgaGVhZGVyCiAJICovCiAKLQlza2ItPm5oLmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgaWhsKTsKLQltZW1jcHkoc2tiLT5kYXRhLHBrdC0+ZGF0YSxpaGwpOwotCXNrYi0+bmguaXBoLT5wcm90b2NvbCA9IDA7CQkJLyogRmxhZyB0byB0aGUga2VybmVsIHRoaXMgaXMgYSByb3V0ZSBhZGQgKi8KLQltc2cgPSAoc3RydWN0IGlnbXBtc2cqKXNrYi0+bmguaXBoOworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBza2ItPnRhaWw7CisJc2tiX3B1dChza2IsIGlobCk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwa3QtPmRhdGEsIGlobCk7CisJaXBfaGRyKHNrYiktPnByb3RvY29sID0gMDsJCQkvKiBGbGFnIHRvIHRoZSBrZXJuZWwgdGhpcyBpcyBhIHJvdXRlIGFkZCAqLworCW1zZyA9IChzdHJ1Y3QgaWdtcG1zZyAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCW1zZy0+aW1fdmlmID0gdmlmaTsKIAlza2ItPmRzdCA9IGRzdF9jbG9uZShwa3QtPmRzdCk7CiAKQEAgLTU5Miw4ICs1OTgsOCBAQAogCWlnbXAtPnR5cGUJPQogCW1zZy0+aW1fbXNndHlwZSA9IGFzc2VydDsKIAlpZ21wLT5jb2RlIAk9CTA7Ci0Jc2tiLT5uaC5pcGgtPnRvdF9sZW49aHRvbnMoc2tiLT5sZW4pOwkJCS8qIEZpeCB0aGUgbGVuZ3RoICovCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCWlwX2hkcihza2IpLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwkJCS8qIEZpeCB0aGUgbGVuZ3RoICovCisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAl9CiAKIAlpZiAobXJvdXRlX3NvY2tldCA9PSBOVUxMKSB7CkBAIC02MjIsMTEgKzYyOCwxMiBAQAogewogCWludCBlcnI7CiAJc3RydWN0IG1mY19jYWNoZSAqYzsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJc3Bpbl9sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CiAJZm9yIChjPW1mY191bnJlc19xdWV1ZTsgYzsgYz1jLT5uZXh0KSB7Ci0JCWlmIChjLT5tZmNfbWNhc3RncnAgPT0gc2tiLT5uaC5pcGgtPmRhZGRyICYmCi0JCSAgICBjLT5tZmNfb3JpZ2luID09IHNrYi0+bmguaXBoLT5zYWRkcikKKwkJaWYgKGMtPm1mY19tY2FzdGdycCA9PSBpcGgtPmRhZGRyICYmCisJCSAgICBjLT5tZmNfb3JpZ2luID09IGlwaC0+c2FkZHIpCiAJCQlicmVhazsKIAl9CiAKQEAgLTY0Niw5ICs2NTMsOSBAQAogCQkvKgogCQkgKglGaWxsIGluIHRoZSBuZXcgY2FjaGUgZW50cnkKIAkJICovCi0JCWMtPm1mY19wYXJlbnQ9LTE7Ci0JCWMtPm1mY19vcmlnaW49c2tiLT5uaC5pcGgtPnNhZGRyOwotCQljLT5tZmNfbWNhc3RncnA9c2tiLT5uaC5pcGgtPmRhZGRyOworCQljLT5tZmNfcGFyZW50CT0gLTE7CisJCWMtPm1mY19vcmlnaW4JPSBpcGgtPnNhZGRyOworCQljLT5tZmNfbWNhc3RncnAJPSBpcGgtPmRhZGRyOwogCiAJCS8qCiAJCSAqCVJlZmxlY3QgZmlyc3QgcXVlcnkgYXQgbXJvdXRlZC4KQEAgLTczNCw3ICs3NDEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZighTVVMVElDQVNUKG1mYy0+bWZjY19tY2FzdGdycC5zX2FkZHIpKQorCWlmICghTVVMVElDQVNUKG1mYy0+bWZjY19tY2FzdGdycC5zX2FkZHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWM9aXBtcl9jYWNoZV9hbGxvYygpOwpAQCAtNzg4LDcgKzc5NSw3IEBACiAJLyoKIAkgKglTaHV0IGRvd24gYWxsIGFjdGl2ZSB2aWYgZW50cmllcwogCSAqLwotCWZvcihpPTA7IGk8bWF4dmlmOyBpKyspIHsKKwlmb3IgKGk9MDsgaTxtYXh2aWY7IGkrKykgewogCQlpZiAoISh2aWZfdGFibGVbaV0uZmxhZ3MmVklGRl9TVEFUSUMpKQogCQkJdmlmX2RlbGV0ZShpKTsKIAl9CkBAIC04NTgsMTE5ICs4NjUsMTE3IEBACiAJc3RydWN0IHZpZmN0bCB2aWY7CiAJc3RydWN0IG1mY2N0bCBtZmM7CiAKLQlpZihvcHRuYW1lIT1NUlRfSU5JVCkKLQl7Ci0JCWlmKHNrIT1tcm91dGVfc29ja2V0ICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCWlmIChvcHRuYW1lICE9IE1SVF9JTklUKSB7CisJCWlmIChzayAhPSBtcm91dGVfc29ja2V0ICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0Jc3dpdGNoKG9wdG5hbWUpCi0JewotCQljYXNlIE1SVF9JTklUOgotCQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXIHx8Ci0JCQkgICAgaW5ldF9zayhzayktPm51bSAhPSBJUFBST1RPX0lHTVApCi0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJaWYob3B0bGVuIT1zaXplb2YoaW50KSkKLQkJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgTVJUX0lOSVQ6CisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1JBVyB8fAorCQkgICAgaW5ldF9zayhzayktPm51bSAhPSBJUFBST1RPX0lHTVApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmIChvcHRsZW4hPXNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAotCQkJcnRubF9sb2NrKCk7Ci0JCQlpZiAobXJvdXRlX3NvY2tldCkgewotCQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQkJcmV0dXJuIC1FQUREUklOVVNFOwotCQkJfQotCi0JCQlyZXQgPSBpcF9yYV9jb250cm9sKHNrLCAxLCBtcnRzb2NrX2Rlc3RydWN0KTsKLQkJCWlmIChyZXQgPT0gMCkgewotCQkJCXdyaXRlX2xvY2tfYmgoJm1ydF9sb2NrKTsKLQkJCQltcm91dGVfc29ja2V0PXNrOwotCQkJCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOwotCi0JCQkJaXB2NF9kZXZjb25mLm1jX2ZvcndhcmRpbmcrKzsKLQkJCX0KKwkJcnRubF9sb2NrKCk7CisJCWlmIChtcm91dGVfc29ja2V0KSB7CiAJCQlydG5sX3VubG9jaygpOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBNUlRfRE9ORToKLQkJCWlmIChzayE9bXJvdXRlX3NvY2tldCkKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCXJldHVybiBpcF9yYV9jb250cm9sKHNrLCAwLCBOVUxMKTsKLQkJY2FzZSBNUlRfQUREX1ZJRjoKLQkJY2FzZSBNUlRfREVMX1ZJRjoKLQkJCWlmKG9wdGxlbiE9c2l6ZW9mKHZpZikpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnZpZixvcHR2YWwsc2l6ZW9mKHZpZikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYodmlmLnZpZmNfdmlmaSA+PSBNQVhWSUZTKQotCQkJCXJldHVybiAtRU5GSUxFOwotCQkJcnRubF9sb2NrKCk7Ci0JCQlpZiAob3B0bmFtZT09TVJUX0FERF9WSUYpIHsKLQkJCQlyZXQgPSB2aWZfYWRkKCZ2aWYsIHNrPT1tcm91dGVfc29ja2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0ID0gdmlmX2RlbGV0ZSh2aWYudmlmY192aWZpKTsKLQkJCX0KLQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQl9CisKKwkJcmV0ID0gaXBfcmFfY29udHJvbChzaywgMSwgbXJ0c29ja19kZXN0cnVjdCk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCQkJbXJvdXRlX3NvY2tldD1zazsKKwkJCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCisJCQlpcHY0X2RldmNvbmYubWNfZm9yd2FyZGluZysrOworCQl9CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiByZXQ7CisJY2FzZSBNUlRfRE9ORToKKwkJaWYgKHNrIT1tcm91dGVfc29ja2V0KQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBpcF9yYV9jb250cm9sKHNrLCAwLCBOVUxMKTsKKwljYXNlIE1SVF9BRERfVklGOgorCWNhc2UgTVJUX0RFTF9WSUY6CisJCWlmIChvcHRsZW4hPXNpemVvZih2aWYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmlmLG9wdHZhbCxzaXplb2YodmlmKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZpZi52aWZjX3ZpZmkgPj0gTUFYVklGUykKKwkJCXJldHVybiAtRU5GSUxFOworCQlydG5sX2xvY2soKTsKKwkJaWYgKG9wdG5hbWU9PU1SVF9BRERfVklGKSB7CisJCQlyZXQgPSB2aWZfYWRkKCZ2aWYsIHNrPT1tcm91dGVfc29ja2V0KTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHZpZl9kZWxldGUodmlmLnZpZmNfdmlmaSk7CisJCX0KKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIHJldDsKIAogCQkvKgogCQkgKglNYW5pcHVsYXRlIHRoZSBmb3J3YXJkaW5nIGNhY2hlcy4gVGhlc2UgbGl2ZQogCQkgKglpbiBhIHNvcnQgb2Yga2VybmVsL3VzZXIgc3ltYmlvc2lzLgogCQkgKi8KLQkJY2FzZSBNUlRfQUREX01GQzoKLQkJY2FzZSBNUlRfREVMX01GQzoKLQkJCWlmKG9wdGxlbiE9c2l6ZW9mKG1mYykpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJm1mYyxvcHR2YWwsIHNpemVvZihtZmMpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJ0bmxfbG9jaygpOwotCQkJaWYgKG9wdG5hbWU9PU1SVF9ERUxfTUZDKQotCQkJCXJldCA9IGlwbXJfbWZjX2RlbGV0ZSgmbWZjKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSBpcG1yX21mY19hZGQoJm1mYywgc2s9PW1yb3V0ZV9zb2NrZXQpOwotCQkJcnRubF91bmxvY2soKTsKLQkJCXJldHVybiByZXQ7CisJY2FzZSBNUlRfQUREX01GQzoKKwljYXNlIE1SVF9ERUxfTUZDOgorCQlpZiAob3B0bGVuIT1zaXplb2YobWZjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1mYyxvcHR2YWwsIHNpemVvZihtZmMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlydG5sX2xvY2soKTsKKwkJaWYgKG9wdG5hbWU9PU1SVF9ERUxfTUZDKQorCQkJcmV0ID0gaXBtcl9tZmNfZGVsZXRlKCZtZmMpOworCQllbHNlCisJCQlyZXQgPSBpcG1yX21mY19hZGQoJm1mYywgc2s9PW1yb3V0ZV9zb2NrZXQpOworCQlydG5sX3VubG9jaygpOworCQlyZXR1cm4gcmV0OwogCQkvKgogCQkgKglDb250cm9sIFBJTSBhc3NlcnQuCiAJCSAqLwotCQljYXNlIE1SVF9BU1NFUlQ6Ci0JCXsKLQkJCWludCB2OwotCQkJaWYoZ2V0X3VzZXIodiwoaW50IF9fdXNlciAqKW9wdHZhbCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQltcm91dGVfZG9fYXNzZXJ0PSh2KT8xOjA7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCWNhc2UgTVJUX0FTU0VSVDoKKwl7CisJCWludCB2OworCQlpZiAoZ2V0X3VzZXIodiwoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXJvdXRlX2RvX2Fzc2VydD0odik/MTowOworCQlyZXR1cm4gMDsKKwl9CiAjaWZkZWYgQ09ORklHX0lQX1BJTVNNCi0JCWNhc2UgTVJUX1BJTToKLQkJewotCQkJaW50IHYsIHJldDsKLQkJCWlmKGdldF91c2VyKHYsKGludCBfX3VzZXIgKilvcHR2YWwpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJdiA9ICh2KT8xOjA7Ci0JCQlydG5sX2xvY2soKTsKLQkJCXJldCA9IDA7Ci0JCQlpZiAodiAhPSBtcm91dGVfZG9fcGltKSB7Ci0JCQkJbXJvdXRlX2RvX3BpbSA9IHY7Ci0JCQkJbXJvdXRlX2RvX2Fzc2VydCA9IHY7CisJY2FzZSBNUlRfUElNOgorCXsKKwkJaW50IHYsIHJldDsKKwkJaWYgKGdldF91c2VyKHYsKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXYgPSAodik/MTowOworCQlydG5sX2xvY2soKTsKKwkJcmV0ID0gMDsKKwkJaWYgKHYgIT0gbXJvdXRlX2RvX3BpbSkgeworCQkJbXJvdXRlX2RvX3BpbSA9IHY7CisJCQltcm91dGVfZG9fYXNzZXJ0ID0gdjsKICNpZmRlZiBDT05GSUdfSVBfUElNU01fVjIKLQkJCQlpZiAobXJvdXRlX2RvX3BpbSkKLQkJCQkJcmV0ID0gaW5ldF9hZGRfcHJvdG9jb2woJnBpbV9wcm90b2NvbCwKLQkJCQkJCQkJSVBQUk9UT19QSU0pOwotCQkJCWVsc2UKLQkJCQkJcmV0ID0gaW5ldF9kZWxfcHJvdG9jb2woJnBpbV9wcm90b2NvbCwKLQkJCQkJCQkJSVBQUk9UT19QSU0pOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJaWYgKG1yb3V0ZV9kb19waW0pCisJCQkJcmV0ID0gaW5ldF9hZGRfcHJvdG9jb2woJnBpbV9wcm90b2NvbCwKKwkJCQkJCQlJUFBST1RPX1BJTSk7CisJCQllbHNlCisJCQkJcmV0ID0gaW5ldF9kZWxfcHJvdG9jb2woJnBpbV9wcm90b2NvbCwKKwkJCQkJCQlJUFBST1RPX1BJTSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXQgPSAtRUFHQUlOOwogI2VuZGlmCi0JCQl9Ci0JCQlydG5sX3VubG9jaygpOwotCQkJcmV0dXJuIHJldDsKIAkJfQorCQlydG5sX3VubG9jaygpOworCQlyZXR1cm4gcmV0OworCX0KICNlbmRpZgotCQkvKgotCQkgKglTcHVyaW91cyBjb21tYW5kLCBvciBNUlRfVkVSU0lPTiB3aGljaCB5b3UgY2Fubm90Ci0JCSAqCXNldC4KLQkJICovCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCS8qCisJICoJU3B1cmlvdXMgY29tbWFuZCwgb3IgTVJUX1ZFUlNJT04gd2hpY2ggeW91IGNhbm5vdAorCSAqCXNldC4KKwkgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KIH0KIApAQCAtOTgzLDcgKzk4OCw3IEBACiAJaW50IG9scjsKIAlpbnQgdmFsOwogCi0JaWYob3B0bmFtZSE9TVJUX1ZFUlNJT04gJiYKKwlpZiAob3B0bmFtZSE9TVJUX1ZFUlNJT04gJiYKICNpZmRlZiBDT05GSUdfSVBfUElNU00KIAkgICBvcHRuYW1lIT1NUlRfUElNICYmCiAjZW5kaWYKQEAgLTk5NywxNyArMTAwMiwxNyBAQAogCWlmIChvbHIgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmKHB1dF91c2VyKG9scixvcHRsZW4pKQorCWlmIChwdXRfdXNlcihvbHIsb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYob3B0bmFtZT09TVJUX1ZFUlNJT04pCisJaWYgKG9wdG5hbWU9PU1SVF9WRVJTSU9OKQogCQl2YWw9MHgwMzA1OwogI2lmZGVmIENPTkZJR19JUF9QSU1TTQotCWVsc2UgaWYob3B0bmFtZT09TVJUX1BJTSkKKwllbHNlIGlmIChvcHRuYW1lPT1NUlRfUElNKQogCQl2YWw9bXJvdXRlX2RvX3BpbTsKICNlbmRpZgogCWVsc2UKIAkJdmFsPW1yb3V0ZV9kb19hc3NlcnQ7Ci0JaWYoY29weV90b191c2VyKG9wdHZhbCwmdmFsLG9scikpCisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsJnZhbCxvbHIpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjMsNDggKzEwMjgsNDcgQEAKIAlzdHJ1Y3QgdmlmX2RldmljZSAqdmlmOwogCXN0cnVjdCBtZmNfY2FjaGUgKmM7CiAKLQlzd2l0Y2goY21kKQotCXsKLQkJY2FzZSBTSU9DR0VUVklGQ05UOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2cixhcmcsc2l6ZW9mKHZyKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZih2ci52aWZpPj1tYXh2aWYpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlyZWFkX2xvY2soJm1ydF9sb2NrKTsKLQkJCXZpZj0mdmlmX3RhYmxlW3ZyLnZpZmldOwotCQkJaWYoVklGX0VYSVNUUyh2ci52aWZpKSkJewotCQkJCXZyLmljb3VudD12aWYtPnBrdF9pbjsKLQkJCQl2ci5vY291bnQ9dmlmLT5wa3Rfb3V0OwotCQkJCXZyLmlieXRlcz12aWYtPmJ5dGVzX2luOwotCQkJCXZyLm9ieXRlcz12aWYtPmJ5dGVzX291dDsKLQkJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOwotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsJnZyLHNpemVvZih2cikpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dFVFZJRkNOVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2cixhcmcsc2l6ZW9mKHZyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZyLnZpZmk+PW1heHZpZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWFkX2xvY2soJm1ydF9sb2NrKTsKKwkJdmlmPSZ2aWZfdGFibGVbdnIudmlmaV07CisJCWlmIChWSUZfRVhJU1RTKHZyLnZpZmkpKQl7CisJCQl2ci5pY291bnQ9dmlmLT5wa3RfaW47CisJCQl2ci5vY291bnQ9dmlmLT5wa3Rfb3V0OworCQkJdnIuaWJ5dGVzPXZpZi0+Ynl0ZXNfaW47CisJCQl2ci5vYnl0ZXM9dmlmLT5ieXRlc19vdXQ7CiAJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOwotCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCQljYXNlIFNJT0NHRVRTR0NOVDoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsYXJnLHNpemVvZihzcikpKQorCisJCQlpZiAoY29weV90b191c2VyKGFyZywmdnIsc2l6ZW9mKHZyKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJY2FzZSBTSU9DR0VUU0dDTlQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsYXJnLHNpemVvZihzcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCXJlYWRfbG9jaygmbXJ0X2xvY2spOwotCQkJYyA9IGlwbXJfY2FjaGVfZmluZChzci5zcmMuc19hZGRyLCBzci5ncnAuc19hZGRyKTsKLQkJCWlmIChjKSB7Ci0JCQkJc3IucGt0Y250ID0gYy0+bWZjX3VuLnJlcy5wa3Q7Ci0JCQkJc3IuYnl0ZWNudCA9IGMtPm1mY191bi5yZXMuYnl0ZXM7Ci0JCQkJc3Iud3JvbmdfaWYgPSBjLT5tZmNfdW4ucmVzLndyb25nX2lmOwotCQkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7Ci0KLQkJCQlpZiAoY29weV90b191c2VyKGFyZywmc3Isc2l6ZW9mKHNyKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXJldHVybiAwOwotCQkJfQorCQlyZWFkX2xvY2soJm1ydF9sb2NrKTsKKwkJYyA9IGlwbXJfY2FjaGVfZmluZChzci5zcmMuc19hZGRyLCBzci5ncnAuc19hZGRyKTsKKwkJaWYgKGMpIHsKKwkJCXNyLnBrdGNudCA9IGMtPm1mY191bi5yZXMucGt0OworCQkJc3IuYnl0ZWNudCA9IGMtPm1mY191bi5yZXMuYnl0ZXM7CisJCQlzci53cm9uZ19pZiA9IGMtPm1mY191bi5yZXMud3JvbmdfaWY7CiAJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOwotCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsJnNyLHNpemVvZihzcikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQogfQogCkBAIC0xMDc2LDcgKzEwODAsNyBAQAogCWlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCXY9JnZpZl90YWJsZVswXTsKLQlmb3IoY3Q9MDtjdDxtYXh2aWY7Y3QrKyx2KyspIHsKKwlmb3IgKGN0PTA7Y3Q8bWF4dmlmO2N0KyssdisrKSB7CiAJCWlmICh2LT5kZXY9PXB0cikKIAkJCXZpZl9kZWxldGUoY3QpOwogCX0KQEAgLTEwOTYsMTEgKzExMDAsMTcgQEAKIAogc3RhdGljIHZvaWQgaXBfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKm9sZF9pcGggPSBpcF9oZHIoc2tiKTsKKworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAlpcGgtPnZlcnNpb24JPSAJNDsKLQlpcGgtPnRvcwk9CXNrYi0+bmguaXBoLT50b3M7Ci0JaXBoLT50dGwJPQlza2ItPm5oLmlwaC0+dHRsOworCWlwaC0+dG9zCT0Jb2xkX2lwaC0+dG9zOworCWlwaC0+dHRsCT0Jb2xkX2lwaC0+dHRsOwogCWlwaC0+ZnJhZ19vZmYJPQkwOwogCWlwaC0+ZGFkZHIJPQlkYWRkcjsKIAlpcGgtPnNhZGRyCT0Jc2FkZHI7CkBAIC0xMTEwLDggKzExMjAsNiBAQAogCWlwX3NlbGVjdF9pZGVudChpcGgsIHNrYi0+ZHN0LCBOVUxMKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKLQlza2ItPmguaXBpcGggPSBza2ItPm5oLmlwaDsKLQlza2ItPm5oLmlwaCA9IGlwaDsKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwogCW5mX3Jlc2V0KHNrYik7CiB9CkBAIC0xMTM0LDcgKzExNDIsNyBAQAogCiBzdGF0aWMgdm9pZCBpcG1yX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG1mY19jYWNoZSAqYywgaW50IHZpZmkpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWYgPSAmdmlmX3RhYmxlW3ZpZmldOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CkBAIC0xMjAwLDggKzEyMDgsNyBAQAogCiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKLQlpcGggPSBza2ItPm5oLmlwaDsKLQlpcF9kZWNyZWFzZV90dGwoaXBoKTsKKwlpcF9kZWNyZWFzZV90dGwoaXBfaGRyKHNrYikpOwogCiAJLyogRklYTUU6IGZvcndhcmQgYW5kIG91dHB1dCBmaXJld2FsbHMgdXNlZCB0byBiZSBjYWxsZWQgaGVyZS4KIAkgKiBXaGF0IGRvIHdlIGRvIHdpdGggbmV0ZmlsdGVyPyAtLSBSUiAqLwpAQCAtMTMwMSw3ICsxMzA4LDcgQEAKIAkgKglGb3J3YXJkIHRoZSBmcmFtZQogCSAqLwogCWZvciAoY3QgPSBjYWNoZS0+bWZjX3VuLnJlcy5tYXh2aWYtMTsgY3QgPj0gY2FjaGUtPm1mY191bi5yZXMubWludmlmOyBjdC0tKSB7Ci0JCWlmIChza2ItPm5oLmlwaC0+dHRsID4gY2FjaGUtPm1mY191bi5yZXMudHRsc1tjdF0pIHsKKwkJaWYgKGlwX2hkcihza2IpLT50dGwgPiBjYWNoZS0+bWZjX3VuLnJlcy50dGxzW2N0XSkgewogCQkJaWYgKHBzZW5kICE9IC0xKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJCQlpZiAoc2tiMikKQEAgLTEzNDcsNyArMTM1NCw3IEBACiAJCSAgICBpZiAoSVBDQihza2IpLT5vcHQucm91dGVyX2FsZXJ0KSB7CiAJCQkgICAgaWYgKGlwX2NhbGxfcmFfY2hhaW4oc2tiKSkKIAkJCQkgICAgcmV0dXJuIDA7Ci0JCSAgICB9IGVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lHTVApeworCQkgICAgfSBlbHNlIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JR01QKXsKIAkJCSAgICAvKiBJR01QdjEgKGFuZCBicm9rZW4gSUdNUHYyIGltcGxlbWVudGF0aW9ucyBzb3J0IG9mCiAJCQkgICAgICAgQ2lzY28gSU9TIDw9IDExLjIoOCkpIGRvIG5vdCBwdXQgcm91dGVyIGFsZXJ0CiAJCQkgICAgICAgb3B0aW9uIHRvIElHTVAgcGFja2V0cyBkZXN0aW5lZCB0byByb3V0YWJsZQpAQCAtMTM2Niw3ICsxMzczLDcgQEAKIAl9CiAKIAlyZWFkX2xvY2soJm1ydF9sb2NrKTsKLQljYWNoZSA9IGlwbXJfY2FjaGVfZmluZChza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkcik7CisJY2FjaGUgPSBpcG1yX2NhY2hlX2ZpbmQoaXBfaGRyKHNrYiktPnNhZGRyLCBpcF9oZHIoc2tiKS0+ZGFkZHIpOwogCiAJLyoKIAkgKglObyB1c2FibGUgY2FjaGUgZW50cnkKQEAgLTE0MjYsMTQgKzE0MzMsMTUgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKnBpbSkgKyBzaXplb2YoKmVuY2FwKSkpCiAJCWdvdG8gZHJvcDsKIAotCXBpbSA9IChzdHJ1Y3QgaWdtcGhkciopc2tiLT5oLnJhdzsKKwlwaW0gPSBpZ21wX2hkcihza2IpOwogCiAJaWYgKCFtcm91dGVfZG9fcGltIHx8CiAJICAgIHNrYi0+bGVuIDwgc2l6ZW9mKCpwaW0pICsgc2l6ZW9mKCplbmNhcCkgfHwKIAkgICAgcGltLT5ncm91cCAhPSBQSU1fVjFfVkVSU0lPTiB8fCBwaW0tPmNvZGUgIT0gUElNX1YxX1JFR0lTVEVSKQogCQlnb3RvIGRyb3A7CiAKLQllbmNhcCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBpZ21waGRyKSk7CisJZW5jYXAgPSAoc3RydWN0IGlwaGRyICopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJCSBzaXplb2Yoc3RydWN0IGlnbXBoZHIpKTsKIAkvKgogCSAgIENoZWNrIHRoYXQ6CiAJICAgYS4gcGFja2V0IGlzIHJlYWxseSBkZXN0aW50ZWQgdG8gYSBtdWx0aWNhc3QgZ3JvdXAKQEAgLTE0NTUsOSArMTQ2Myw5IEBACiAJaWYgKHJlZ19kZXYgPT0gTlVMTCkKIAkJZ290byBkcm9wOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7CisJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlza2JfcHVsbChza2IsICh1OCopZW5jYXAgLSBza2ItPmRhdGEpOwotCXNrYi0+bmguaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2ItPmRldiA9IHJlZ19kZXY7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAlza2ItPmlwX3N1bW1lZCA9IDA7CkBAIC0xNDg2LDcgKzE0OTQsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqcGltKSArIHNpemVvZigqZW5jYXApKSkKIAkJZ290byBkcm9wOwogCi0JcGltID0gKHN0cnVjdCBwaW1yZWdoZHIqKXNrYi0+aC5yYXc7CisJcGltID0gKHN0cnVjdCBwaW1yZWdoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWlmIChwaW0tPnR5cGUgIT0gKChQSU1fVkVSU0lPTjw8NCl8KFBJTV9SRUdJU1RFUikpIHx8CiAJICAgIChwaW0tPmZsYWdzJlBJTV9OVUxMX1JFR0lTVEVSKSB8fAogCSAgICAoaXBfY29tcHV0ZV9jc3VtKCh2b2lkICopcGltLCBzaXplb2YoKnBpbSkpICE9IDAgJiYKQEAgLTE0OTQsNyArMTUwMiw4IEBACiAJCWdvdG8gZHJvcDsKIAogCS8qIGNoZWNrIGlmIHRoZSBpbm5lciBwYWNrZXQgaXMgZGVzdGluZWQgdG8gbWNhc3QgZ3JvdXAgKi8KLQllbmNhcCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBwaW1yZWdoZHIpKTsKKwllbmNhcCA9IChzdHJ1Y3QgaXBoZHIgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgcGltcmVnaGRyKSk7CiAJaWYgKCFNVUxUSUNBU1QoZW5jYXAtPmRhZGRyKSB8fAogCSAgICBlbmNhcC0+dG90X2xlbiA9PSAwIHx8CiAJICAgIG50b2hzKGVuY2FwLT50b3RfbGVuKSArIHNpemVvZigqcGltKSA+IHNrYi0+bGVuKQpAQCAtMTUxMCw5ICsxNTE5LDkgQEAKIAlpZiAocmVnX2RldiA9PSBOVUxMKQogCQlnb3RvIGRyb3A7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPm1hY19oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCXNrYl9wdWxsKHNrYiwgKHU4KillbmNhcCAtIHNrYi0+ZGF0YSk7Ci0Jc2tiLT5uaC5pcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+ZGV2ID0gcmVnX2RldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCXNrYi0+aXBfc3VtbWVkID0gMDsKQEAgLTE1MzcsNyArMTU0Niw3IEBACiAJaW50IGN0OwogCXN0cnVjdCBydG5leHRob3AgKm5ocDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmlmX3RhYmxlW2MtPm1mY19wYXJlbnRdLmRldjsKLQl1OCAqYiA9IHNrYi0+dGFpbDsKKwl1OCAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICptcF9oZWFkOwogCiAJaWYgKGRldikKQEAgLTE1NTcsMTIgKzE1NjYsMTIgQEAKIAkJfQogCX0KIAltcF9oZWFkLT5ydGFfdHlwZSA9IFJUQV9NVUxUSVBBVEg7Ci0JbXBfaGVhZC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopbXBfaGVhZDsKKwltcF9oZWFkLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopbXBfaGVhZDsKIAlydG0tPnJ0bV90eXBlID0gUlROX01VTFRJQ0FTVDsKIAlyZXR1cm4gMTsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIApAQCAtMTU3Nyw2ICsxNTg2LDcgQEAKIAogCWlmIChjYWNoZT09TlVMTCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJc3RydWN0IGlwaGRyICppcGg7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJCWludCB2aWY7CiAKQEAgLTE1OTYsMTEgKzE2MDYsMTMgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJc2tiMi0+bmgucmF3ID0gc2tiX3B1c2goc2tiMiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwotCQlza2IyLT5uaC5pcGgtPmlobCA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpPj4yOwotCQlza2IyLT5uaC5pcGgtPnNhZGRyID0gcnQtPnJ0X3NyYzsKLQkJc2tiMi0+bmguaXBoLT5kYWRkciA9IHJ0LT5ydF9kc3Q7Ci0JCXNrYjItPm5oLmlwaC0+dmVyc2lvbiA9IDA7CisJCXNrYl9wdXNoKHNrYjIsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQlpcGggPSBpcF9oZHIoc2tiMik7CisJCWlwaC0+aWhsID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKKwkJaXBoLT5zYWRkciA9IHJ0LT5ydF9zcmM7CisJCWlwaC0+ZGFkZHIgPSBydC0+cnRfZHN0OworCQlpcGgtPnZlcnNpb24gPSAwOwogCQllcnIgPSBpcG1yX2NhY2hlX3VucmVzb2x2ZWQodmlmLCBza2IyKTsKIAkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKIAkJcmV0dXJuIGVycjsKQEAgLTE2MjUsNyArMTYzNyw3IEBACiAJCQkJCSAgIGxvZmZfdCBwb3MpCiB7CiAJZm9yIChpdGVyLT5jdCA9IDA7IGl0ZXItPmN0IDwgbWF4dmlmOyArK2l0ZXItPmN0KSB7Ci0JCWlmKCFWSUZfRVhJU1RTKGl0ZXItPmN0KSkKKwkJaWYgKCFWSUZfRVhJU1RTKGl0ZXItPmN0KSkKIAkJCWNvbnRpbnVlOwogCQlpZiAocG9zLS0gPT0gMCkKIAkJCXJldHVybiAmdmlmX3RhYmxlW2l0ZXItPmN0XTsKQEAgLTE2NDksNyArMTY2MSw3IEBACiAJCXJldHVybiBpcG1yX3ZpZl9zZXFfaWR4KGl0ZXIsIDApOwogCiAJd2hpbGUgKCsraXRlci0+Y3QgPCBtYXh2aWYpIHsKLQkJaWYoIVZJRl9FWElTVFMoaXRlci0+Y3QpKQorCQlpZiAoIVZJRl9FWElTVFMoaXRlci0+Y3QpKQogCQkJY29udGludWU7CiAJCXJldHVybiAmdmlmX3RhYmxlW2l0ZXItPmN0XTsKIAl9CkBAIC0xNjgwLDcgKzE2OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlwbXJfdmlmX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlwbXJfdmlmX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ID0gaXBtcl92aWZfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IGlwbXJfdmlmX3NlcV9uZXh0LAogCS5zdG9wICA9IGlwbXJfdmlmX3NlcV9zdG9wLApAQCAtMTczMiwxNCArMTc0NCwxNCBAQAogCWl0LT5jYWNoZSA9IG1mY19jYWNoZV9hcnJheTsKIAlyZWFkX2xvY2soJm1ydF9sb2NrKTsKIAlmb3IgKGl0LT5jdCA9IDA7IGl0LT5jdCA8IE1GQ19MSU5FUzsgaXQtPmN0KyspCi0JCWZvcihtZmMgPSBtZmNfY2FjaGVfYXJyYXlbaXQtPmN0XTsgbWZjOyBtZmMgPSBtZmMtPm5leHQpCisJCWZvciAobWZjID0gbWZjX2NhY2hlX2FycmF5W2l0LT5jdF07IG1mYzsgbWZjID0gbWZjLT5uZXh0KQogCQkJaWYgKHBvcy0tID09IDApCiAJCQkJcmV0dXJuIG1mYzsKIAlyZWFkX3VubG9jaygmbXJ0X2xvY2spOwogCiAJaXQtPmNhY2hlID0gJm1mY191bnJlc19xdWV1ZTsKIAlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKLQlmb3IobWZjID0gbWZjX3VucmVzX3F1ZXVlOyBtZmM7IG1mYyA9IG1mYy0+bmV4dCkKKwlmb3IgKG1mYyA9IG1mY191bnJlc19xdWV1ZTsgbWZjOyBtZmMgPSBtZmMtPm5leHQpCiAJCWlmIChwb3MtLSA9PSAwKQogCQkJcmV0dXJuIG1mYzsKIAlzcGluX3VubG9ja19iaCgmbWZjX3VucmVzX2xvY2spOwpAQCAtMTgyOSw5ICsxODQxLDkgQEAKIAkJCSAgIG1mYy0+bWZjX3VuLnJlcy53cm9uZ19pZik7CiAKIAkJaWYgKGl0LT5jYWNoZSAhPSAmbWZjX3VucmVzX3F1ZXVlKSB7Ci0JCQlmb3IobiA9IG1mYy0+bWZjX3VuLnJlcy5taW52aWY7Ci0JCQkgICAgbiA8IG1mYy0+bWZjX3VuLnJlcy5tYXh2aWY7IG4rKyApIHsKLQkJCQlpZihWSUZfRVhJU1RTKG4pCisJCQlmb3IgKG4gPSBtZmMtPm1mY191bi5yZXMubWludmlmOworCQkJICAgICBuIDwgbWZjLT5tZmNfdW4ucmVzLm1heHZpZjsgbisrICkgeworCQkJCWlmIChWSUZfRVhJU1RTKG4pCiAJCQkJICAgJiYgbWZjLT5tZmNfdW4ucmVzLnR0bHNbbl0gPCAyNTUpCiAJCQkJc2VxX3ByaW50ZihzZXEsCiAJCQkJCSAgICIgJTJkOiUtM2QiLApAQCAtMTg0Myw3ICsxODU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcG1yX21mY19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcG1yX21mY19zZXFfb3BzID0gewogCS5zdGFydCA9IGlwbXJfbWZjX3NlcV9zdGFydCwKIAkubmV4dCAgPSBpcG1yX21mY19zZXFfbmV4dCwKIAkuc3RvcCAgPSBpcG1yX21mY19zZXFfc3RvcCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jCmluZGV4IDIyZTEwNGMuLjE1YWQ1ZGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYwpAQCAtMzMxLDE0ICszMzEsMTQgQEAKIAkJCQkgIHN0cnVjdCBpcF92c19hcHAgKmFwcCkKIHsKIAlpbnQgZGlmZjsKLQl1bnNpZ25lZCBpbnQgdGNwX29mZnNldCA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7CisJY29uc3QgdW5zaWduZWQgaW50IHRjcF9vZmZzZXQgPSBpcF9oZHJsZW4oKnBza2IpOwogCXN0cnVjdCB0Y3BoZHIgKnRoOwogCV9fdTMyIHNlcTsKIAogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdGNwX29mZnNldCArIHNpemVvZigqdGgpKSkKIAkJcmV0dXJuIDA7CiAKLQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKCgqcHNrYiktPm5oLnJhdyArIHRjcF9vZmZzZXQpOworCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKCpwc2tiKSArIHRjcF9vZmZzZXQpOwogCiAJLyoKIAkgKglSZW1lbWJlciBzZXEgbnVtYmVyIGluIGNhc2UgdGhpcyBwa3QgZ2V0cyByZXNpemVkCkBAIC00MDYsMTQgKzQwNiwxNCBAQAogCQkJCSBzdHJ1Y3QgaXBfdnNfYXBwICphcHApCiB7CiAJaW50IGRpZmY7Ci0JdW5zaWduZWQgaW50IHRjcF9vZmZzZXQgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCWNvbnN0IHVuc2lnbmVkIGludCB0Y3Bfb2Zmc2V0ID0gaXBfaGRybGVuKCpwc2tiKTsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAlfX3UzMiBzZXE7CiAKIAlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsIHRjcF9vZmZzZXQgKyBzaXplb2YoKnRoKSkpCiAJCXJldHVybiAwOwogCi0JdGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bfb2Zmc2V0KTsKKwl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcigqcHNrYikgKyB0Y3Bfb2Zmc2V0KTsKIAogCS8qCiAJICoJUmVtZW1iZXIgc2VxIG51bWJlciBpbiBjYXNlIHRoaXMgcGt0IGdldHMgcmVzaXplZApAQCAtNTc3LDcgKzU3Nyw2IEBACiBpbnQgaXBfdnNfc2tiX3JlcGxhY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgcHJpLAogCQkgICAgICBjaGFyICpvX2J1ZiwgaW50IG9fbGVuLCBjaGFyICpuX2J1ZiwgaW50IG5fbGVuKQogewotCXN0cnVjdCBpcGhkciAqaXBoOwogCWludCBkaWZmOwogCWludCBvX29mZnNldDsKIAlpbnQgb19sZWZ0OwpAQCAtNjAzLDEyICs2MDIsMTEgQEAKIAkJc2tiX3B1dChza2IsIGRpZmYpOwogCQltZW1tb3ZlKHNrYi0+ZGF0YSArIG9fb2Zmc2V0ICsgbl9sZW4sCiAJCQlza2ItPmRhdGEgKyBvX29mZnNldCArIG9fbGVuLCBvX2xlZnQpOwotCQltZW1jcHkoc2tiLT5kYXRhICsgb19vZmZzZXQsIG5fYnVmLCBuX2xlbik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIG9fb2Zmc2V0LCBuX2J1Ziwgbl9sZW4pOwogCX0KIAogCS8qIG11c3QgdXBkYXRlIHRoZSBpcGggdG90YWwgbGVuZ3RoIGhlcmUgKi8KLQlpcGggPSBza2ItPm5oLmlwaDsKLQlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CiAKIAlMZWF2ZUZ1bmN0aW9uKDkpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCAyNGQ3YjY2Li5mMDA1YTJmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJCSAgICBfX2JlMTYgcG9ydHNbMl0pCiB7CiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gTlVMTDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmN0OwogCV9fYmUxNiAgZHBvcnQ7CSAvKiBkZXN0aW5hdGlvbiBwb3J0IHRvIGZvcndhcmQgKi8KQEAgLTM4MSw3ICszODEsNyBAQAogaXBfdnNfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSBOVUxMOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKIAlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKIApAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCiB7CiAJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsKjQsCiAJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKQEAgLTU0Niw3ICs1NDYsNyBAQAogewogCXNrYiA9IGlwX2RlZnJhZyhza2IsIHVzZXIpOwogCWlmIChza2IpCi0JCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCQlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAlyZXR1cm4gc2tiOwogfQogCkBAIC01NTcsOSArNTU3LDEwIEBACiB2b2lkIGlwX3ZzX25hdF9pY21wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCiAJCSAgICBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBpbm91dCkKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaAkgPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaAkgPSBpcF9oZHIoc2tiKTsKIAl1bnNpZ25lZCBpbnQgaWNtcF9vZmZzZXQgPSBpcGgtPmlobCo0OwotCXN0cnVjdCBpY21waGRyICppY21waAkgPSAoc3RydWN0IGljbXBoZHIgKikoc2tiLT5uaC5yYXcgKyBpY21wX29mZnNldCk7CisJc3RydWN0IGljbXBoZHIgKmljbXBoCSA9IChzdHJ1Y3QgaWNtcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCQkgICAgICBpY21wX29mZnNldCk7CiAJc3RydWN0IGlwaGRyICpjaXBoCSA9IChzdHJ1Y3QgaXBoZHIgKikoaWNtcGggKyAxKTsKIAogCWlmIChpbm91dCkgewpAQCAtNjE3LDE0ICs2MTgsMTQgQEAKIAkqcmVsYXRlZCA9IDE7CiAKIAkvKiByZWFzc2VtYmxlIElQIGZyYWdtZW50cyAqLwotCWlmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwlpZiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSB7CiAJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpOwogCQlpZiAoIXNrYikKIAkJCXJldHVybiBORl9TVE9MRU47CiAJCSpwc2tiID0gc2tiOwogCX0KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCW9mZnNldCA9IGlobCA9IGlwaC0+aWhsICogNDsKIAlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOwogCWlmIChpYyA9PSBOVUxMKQpAQCAtNjU5LDcgKzY2MCw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBJcyB0aGUgZW1iZWRkZWQgcHJvdG9jb2wgaGVhZGVyIHByZXNlbnQ/ICovCi0JaWYgKHVubGlrZWx5KGNpaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX09GRlNFVCkgJiYKKwlpZiAodW5saWtlbHkoY2loLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkgJiYKIAkJICAgICBwcC0+ZG9udF9kZWZyYWcpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCkBAIC02ODAsOCArNjgxLDcgQEAKIAl9CiAKIAkvKiBFbnN1cmUgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QgKi8KLQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKLQkgICAgaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc2tiLCBpaGwpKSB7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgewogCQkvKiBGYWlsZWQgY2hlY2tzdW0hICovCiAJCUlQX1ZTX0RCRygxLCAiRm9yd2FyZCBJQ01QOiBmYWlsZWQgY2hlY2tzdW0gZnJvbSAlZC4lZC4lZC4lZCFcbiIsCiAJCQkgIE5JUFFVQUQoaXBoLT5zYWRkcikpOwpAQCAtNzEyLDggKzcxMiw3IEBACiB7CiAJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwogCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksIHNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJaWYgKHRoID09IE5VTEwpCiAJCXJldHVybiAwOwogCXJldHVybiB0aC0+cnN0OwpAQCAtNzQwLDE0ICs3MzksMTQgQEAKIAlpZiAoc2tiLT5pcHZzX3Byb3BlcnR5KQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWYgKHVubGlrZWx5KGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSkgewogCQlpbnQgcmVsYXRlZCwgdmVyZGljdCA9IGlwX3ZzX291dF9pY21wKHBza2IsICZyZWxhdGVkKTsKIAogCQlpZiAocmVsYXRlZCkKIAkJCXJldHVybiB2ZXJkaWN0OwogCQlza2IgPSAqcHNrYjsKLQkJaXBoID0gc2tiLT5uaC5pcGg7CisJCWlwaCA9IGlwX2hkcihza2IpOwogCX0KIAogCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGlwaC0+cHJvdG9jb2wpOwpAQCAtNzU1LDEyICs3NTQsMTIgQEAKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKHVubGlrZWx5KGlwaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkgJiYKKwlpZiAodW5saWtlbHkoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkgJiYKIAkJICAgICAhcHAtPmRvbnRfZGVmcmFnKSkgewogCQlza2IgPSBpcF92c19nYXRoZXJfZnJhZ3Moc2tiLCBJUF9ERUZSQUdfVlNfT1VUKTsKIAkJaWYgKCFza2IpCiAJCQlyZXR1cm4gTkZfU1RPTEVOOwotCQlpcGggPSBza2ItPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKHNrYik7CiAJCSpwc2tiID0gc2tiOwogCX0KIApAQCAtODEwLDggKzgwOSw4IEBACiAJaWYgKHBwLT5zbmF0X2hhbmRsZXIgJiYgIXBwLT5zbmF0X2hhbmRsZXIocHNrYiwgcHAsIGNwKSkKIAkJZ290byBkcm9wOwogCXNrYiA9ICpwc2tiOwotCXNrYi0+bmguaXBoLT5zYWRkciA9IGNwLT52YWRkcjsKLQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwlpcF9oZHIoc2tiKS0+c2FkZHIgPSBjcC0+dmFkZHI7CisJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CiAKIAkvKiBGb3IgcG9saWN5IHJvdXRpbmcsIHBhY2tldHMgb3JpZ2luYXRpbmcgZnJvbSB0aGlzCiAJICogbWFjaGluZSBpdHNlbGYgbWF5IGJlIHJvdXRlZCBkaWZmZXJlbnRseSB0byBwYWNrZXRzCkBAIC04NjEsNyArODYwLDcgQEAKIAkqcmVsYXRlZCA9IDE7CiAKIAkvKiByZWFzc2VtYmxlIElQIGZyYWdtZW50cyAqLwotCWlmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwlpZiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSB7CiAJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsCiAJCQkJCSBob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOID8KIAkJCQkJIElQX0RFRlJBR19WU19JTiA6IElQX0RFRlJBR19WU19GV0QpOwpAQCAtODcwLDcgKzg2OSw3IEBACiAJCSpwc2tiID0gc2tiOwogCX0KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCW9mZnNldCA9IGlobCA9IGlwaC0+aWhsICogNDsKIAlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOwogCWlmIChpYyA9PSBOVUxMKQpAQCAtOTA1LDcgKzkwNCw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBJcyB0aGUgZW1iZWRkZWQgcHJvdG9jb2wgaGVhZGVyIHByZXNlbnQ/ICovCi0JaWYgKHVubGlrZWx5KGNpaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX09GRlNFVCkgJiYKKwlpZiAodW5saWtlbHkoY2loLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkgJiYKIAkJICAgICBwcC0+ZG9udF9kZWZyYWcpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCkBAIC05MjEsOCArOTIwLDcgQEAKIAl2ZXJkaWN0ID0gTkZfRFJPUDsKIAogCS8qIEVuc3VyZSB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdCAqLwotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgotCSAgICBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGlobCkpIHsKKwlpZiAoIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgJiYgaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc2tiLCBpaGwpKSB7CiAJCS8qIEZhaWxlZCBjaGVja3N1bSEgKi8KIAkJSVBfVlNfREJHKDEsICJJbmNvbWluZyBJQ01QOiBmYWlsZWQgY2hlY2tzdW0gZnJvbSAlZC4lZC4lZC4lZCFcbiIsCiAJCQkgIE5JUFFVQUQoaXBoLT5zYWRkcikpOwpAQCAtOTY2LDE5ICs5NjQsMTkgQEAKIAkJICAgICB8fCBza2ItPmRldiA9PSAmbG9vcGJhY2tfZGV2IHx8IHNrYi0+c2spKSB7CiAJCUlQX1ZTX0RCRygxMiwgInBhY2tldCB0eXBlPSVkIHByb3RvPSVkIGRhZGRyPSVkLiVkLiVkLiVkIGlnbm9yZWRcbiIsCiAJCQkgIHNrYi0+cGt0X3R5cGUsCi0JCQkgIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKLQkJCSAgTklQUVVBRChza2ItPm5oLmlwaC0+ZGFkZHIpKTsKKwkJCSAgaXBfaGRyKHNrYiktPnByb3RvY29sLAorCQkJICBOSVBRVUFEKGlwX2hkcihza2IpLT5kYWRkcikpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlmICh1bmxpa2VseShpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkpIHsKIAkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19pbl9pY21wKHBza2IsICZyZWxhdGVkLCBob29rbnVtKTsKIAogCQlpZiAocmVsYXRlZCkKIAkJCXJldHVybiB2ZXJkaWN0OwogCQlza2IgPSAqcHNrYjsKLQkJaXBoID0gc2tiLT5uaC5pcGg7CisJCWlwaCA9IGlwX2hkcihza2IpOwogCX0KIAogCS8qIFByb3RvY29sIHN1cHBvcnRlZD8gKi8KQEAgLTEwNjQsNyArMTA2Miw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX0lDTVApCisJaWYgKGlwX2hkcigqcHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCXJldHVybiBpcF92c19pbl9pY21wKHBza2IsICZyLCBob29rbnVtKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZGguYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZGguYwppbmRleCA1MDIxMTFmLi5kY2Y1ZDQ2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2RoLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19kaC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIHsKIAlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKIAlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0Ymw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJSVBfVlNfREJHKDYsICJpcF92c19kaF9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZnRwLmMKaW5kZXggODQ3YzQ3YS4uMzQ0ZGRiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCkBAIC0xNTksMTAgKzE1OSwxMCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChjcC0+YXBwX2RhdGEgPT0gJmlwX3ZzX2Z0cF9wYXN2KSB7Ci0JCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAkJdGggPSAoc3RydWN0IHRjcGhkciAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7CiAJCWRhdGEgPSAoY2hhciAqKXRoICsgKHRoLT5kb2ZmIDw8IDIpOwotCQlkYXRhX2xpbWl0ID0gKCpwc2tiKS0+dGFpbDsKKwkJZGF0YV9saW1pdCA9IHNrYl90YWlsX3BvaW50ZXIoKnBza2IpOwogCiAJCWlmIChpcF92c19mdHBfZ2V0X2FkZHJwb3J0KGRhdGEsIGRhdGFfbGltaXQsCiAJCQkJCSAgIFNFUlZFUl9TVFJJTkcsCkBAIC0yNjIsMTQgKzI2MiwxNCBAQAogCS8qCiAJICogRGV0ZWN0aW5nIHdoZXRoZXIgaXQgaXMgcGFzc2l2ZQogCSAqLwotCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoKnBza2IpOwogCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikmKCgoY2hhciAqKWlwaClbaXBoLT5paGwqNF0pOwogCiAJLyogU2luY2UgdGhlcmUgbWF5IGJlIE9QVElPTlMgaW4gdGhlIFRDUCBwYWNrZXQgYW5kIHRoZSBITEVOIGlzCiAJICAgdGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyIGluIDMyLWJpdCBtdWx0aXBsZXMsIGl0IGlzIGFjY3VyYXRlCiAJICAgdG8gY2FsY3VsYXRlIGRhdGEgYWRkcmVzcyBieSB0aCtITEVOKjQgKi8KIAlkYXRhID0gZGF0YV9zdGFydCA9IChjaGFyICopdGggKyAodGgtPmRvZmYgPDwgMik7Ci0JZGF0YV9saW1pdCA9ICgqcHNrYiktPnRhaWw7CisJZGF0YV9saW1pdCA9IHNrYl90YWlsX3BvaW50ZXIoKnBza2IpOwogCiAJd2hpbGUgKGRhdGEgPD0gZGF0YV9saW1pdCAtIDYpIHsKIAkJaWYgKHN0cm5pY21wKGRhdGEsICJQQVNWXHJcbiIsIDYpID09IDApIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsYy5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKaW5kZXggYzgwMTI3My4uMDUyZjRlZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKQEAgLTUyMSw3ICs1MjEsNyBAQAogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCXN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0Ymw7CiAJc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGJsY19zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCmluZGV4IDIzZjliOWUuLjYyMjVhY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMKQEAgLTc3NSw3ICs3NzUsNyBAQAogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCXN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsOwogCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW47Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJSVBfVlNfREJHKDYsICJpcF92c19sYmxjcl9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19haC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19haC5jCmluZGV4IDhiMDUwNWIuLmE4NDI2NzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fYWguYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMKQEAgLTUyLDE1ICs1MiwxNSBAQAogCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CiAJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoSVBQUk9UT19VRFAsCiAJCQkJICAgICAgIGlwaC0+c2FkZHIsCi0JCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCksCiAJCQkJICAgICAgIGlwaC0+ZGFkZHIsCi0JCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApKTsKIAl9IGVsc2UgewogCQljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KElQUFJPVE9fVURQLAogCQkJCSAgICAgICBpcGgtPmRhZGRyLAotCQkJCSAgICAgICBfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSwKKwkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApLAogCQkJCSAgICAgICBpcGgtPnNhZGRyLAotCQkJCSAgICAgICBfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSk7CisJCQkJICAgICAgIGh0b25zKFBPUlRfSVNBS01QKSk7CiAJfQogCiAJaWYgKCFjcCkgewpAQCAtODksMTUgKzg5LDE1IEBACiAJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKIAkJY3AgPSBpcF92c19jb25uX291dF9nZXQoSVBQUk9UT19VRFAsCiAJCQkJCWlwaC0+c2FkZHIsCi0JCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCQlodG9ucyhQT1JUX0lTQUtNUCksCiAJCQkJCWlwaC0+ZGFkZHIsCi0JCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwkJCQkJaHRvbnMoUE9SVF9JU0FLTVApKTsKIAl9IGVsc2UgewogCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKIAkJCQkJaXBoLT5kYWRkciwKLQkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWh0b25zKFBPUlRfSVNBS01QKSwKIAkJCQkJaXBoLT5zYWRkciwKLQkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCkpOworCQkJCQlodG9ucyhQT1JUX0lTQUtNUCkpOwogCX0KIAogCWlmICghY3ApIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCmluZGV4IDE2YTllYmUuLmU2NTU3N2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYwpAQCAtNzYsMTYgKzc2LDE1IEBACiAJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKIAlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CiAKLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksIHNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJaWYgKHRoID09IE5VTEwpIHsKIAkJKnZlcmRpY3QgPSBORl9EUk9QOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodGgtPnN5biAmJgotCSAgICAoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCi0JCQkJICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIHRoLT5kZXN0KSkpIHsKKwkgICAgKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bWFyaywgaXBfaGRyKHNrYiktPnByb3RvY29sLAorCQkJCSAgICAgaXBfaGRyKHNrYiktPmRhZGRyLCB0aC0+ZGVzdCkpKSB7CiAJCWlmIChpcF92c190b2Ryb3AoKSkgewogCQkJLyoKIAkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgpAQCAtMTI3LDcgKzEyNiw3IEBACiAJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCiB7CiAJc3RydWN0IHRjcGhkciAqdGNwaDsKLQl1bnNpZ25lZCBpbnQgdGNwaG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdGNwaG9mZiA9IGlwX2hkcmxlbigqcHNrYik7CiAKIAkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdGNwaG9mZitzaXplb2YoKnRjcGgpKSkKQEAgLTE0Myw3ICsxNDIsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdGNwaG9mZjsKKwl0Y3BoID0gKHZvaWQgKilpcF9oZHIoKnBza2IpICsgdGNwaG9mZjsKIAl0Y3BoLT5zb3VyY2UgPSBjcC0+dnBvcnQ7CiAKIAkvKiBBZGp1c3QgVENQIGNoZWNrc3VtcyAqLwpAQCAtMTc1LDcgKzE3NCw3IEBACiAJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCiB7CiAJc3RydWN0IHRjcGhkciAqdGNwaDsKLQl1bnNpZ25lZCBpbnQgdGNwaG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdGNwaG9mZiA9IGlwX2hkcmxlbigqcHNrYik7CiAKIAkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdGNwaG9mZitzaXplb2YoKnRjcGgpKSkKQEAgLTE5NCw3ICsxOTMsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdGNwaG9mZjsKKwl0Y3BoID0gKHZvaWQgKilpcF9oZHIoKnBza2IpICsgdGNwaG9mZjsKIAl0Y3BoLT5kZXN0ID0gY3AtPmRwb3J0OwogCiAJLyoKQEAgLTIyNCwxNSArMjIzLDE1IEBACiBzdGF0aWMgaW50CiB0Y3BfY3N1bV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQogewotCXVuc2lnbmVkIGludCB0Y3Bob2ZmID0gc2tiLT5uaC5pcGgtPmlobCo0OworCWNvbnN0IHVuc2lnbmVkIGludCB0Y3Bob2ZmID0gaXBfaGRybGVuKHNrYik7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9OT05FOgogCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB0Y3Bob2ZmLCBza2ItPmxlbiAtIHRjcGhvZmYsIDApOwogCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCWlmIChjc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJaWYgKGNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwgaXBfaGRyKHNrYiktPmRhZGRyLAogCQkJCSAgICAgIHNrYi0+bGVuIC0gdGNwaG9mZiwKLQkJCQkgICAgICBza2ItPm5oLmlwaC0+cHJvdG9jb2wsIHNrYi0+Y3N1bSkpIHsKKwkJCQkgICAgICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsIHNrYi0+Y3N1bSkpIHsKIAkJCUlQX1ZTX0RCR19STF9QS1QoMCwgcHAsIHNrYiwgMCwKIAkJCQkJICJGYWlsZWQgY2hlY2tzdW0gZm9yIik7CiAJCQlyZXR1cm4gMDsKQEAgLTQ2Nyw4ICs0NjYsNyBAQAogewogCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKIAotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmluZGV4IDAzZjBhNDEuLjhlZTVmZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogCiAjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KKyNpbmNsdWRlIDxuZXQvaXAuaD4KIAogc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKIHVkcF9jb25uX2luX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLApAQCAtNTYsNyArNTYsNyBAQAogCXN0cnVjdCBpcF92c19jb25uICpjcDsKIAlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLAogCQkJCSAgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CiAJaWYgKHBwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC04MiwxNSArODIsMTUgQEAKIAlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOwogCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKIAotCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAorCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksCiAJCQkJc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKIAlpZiAodWggPT0gTlVMTCkgewogCQkqdmVyZGljdCA9IE5GX0RST1A7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICgoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCi0JCQkJICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIHVoLT5kZXN0KSkpIHsKKwlpZiAoKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bWFyaywgaXBfaGRyKHNrYiktPnByb3RvY29sLAorCQkJCSAgICAgaXBfaGRyKHNrYiktPmRhZGRyLCB1aC0+ZGVzdCkpKSB7CiAJCWlmIChpcF92c190b2Ryb3AoKSkgewogCQkJLyoKIAkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCiB7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKLQl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWRwaG9mZiA9IGlwX2hkcmxlbigqcHNrYik7CiAKIAkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdWRwaG9mZitzaXplb2YoKnVkcGgpKSkKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JdWRwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdWRwaG9mZjsKKwl1ZHBoID0gKHZvaWQgKilpcF9oZHIoKnBza2IpICsgdWRwaG9mZjsKIAl1ZHBoLT5zb3VyY2UgPSBjcC0+dnBvcnQ7CiAKIAkvKgpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCiB7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKLQl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKwl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9IGlwX2hkcmxlbigqcHNrYik7CiAKIAkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdWRwaG9mZitzaXplb2YoKnVkcGgpKSkKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JdWRwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdWRwaG9mZjsKKwl1ZHBoID0gKHZvaWQgKilpcF9oZHIoKnBza2IpICsgdWRwaG9mZjsKIAl1ZHBoLT5kZXN0ID0gY3AtPmRwb3J0OwogCiAJLyoKQEAgLTIzOSw3ICsyMzksNyBAQAogdWRwX2NzdW1fY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKIHsKIAlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0JdW5zaWduZWQgaW50IHVkcGhvZmYgPSBza2ItPm5oLmlwaC0+aWhsKjQ7CisJY29uc3QgdW5zaWduZWQgaW50IHVkcGhvZmYgPSBpcF9oZHJsZW4oc2tiKTsKIAogCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgdWRwaG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKIAlpZiAodWggPT0gTlVMTCkKQEAgLTI1MSwxMCArMjUxLDEwIEBACiAJCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB1ZHBob2ZmLAogCQkJCQkJIHNrYi0+bGVuIC0gdWRwaG9mZiwgMCk7CiAJCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCQlpZiAoY3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCQkgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQlpZiAoY3N1bV90Y3B1ZHBfbWFnaWMoaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkgICAgICBpcF9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkJCSAgICAgIHNrYi0+bGVuIC0gdWRwaG9mZiwKLQkJCQkJICAgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCQkJCQkgICAgICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCiAJCQkJCSAgICAgIHNrYi0+Y3N1bSkpIHsKIAkJCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsCiAJCQkJCQkgIkZhaWxlZCBjaGVja3N1bSBmb3IiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfc2guYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc2guYwppbmRleCAzMzg2NjhmLi4xYjI1YjAwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NoLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zaC5jCkBAIC0yMDEsNyArMjAxLDcgQEAKIHsKIAlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKIAlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0Ymw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJSVBfVlNfREJHKDYsICJpcF92c19zaF9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c194bWl0LmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBlMWY3N2JkLi45MDBjZTI5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCSAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwotCXN0cnVjdCBpcGhkciAgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAgKmlwaCA9IGlwX2hkcihza2IpOwogCXU4ICAgICB0b3MgPSBpcGgtPnRvczsKIAlpbnQgICAgbXR1OwogCXN0cnVjdCBmbG93aSBmbCA9IHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiAJLyogTVRVIGNoZWNraW5nICovCiAJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKLQlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBoLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX0RGKSkpIHsKKwlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAJCUlQX1ZTX0RCR19STCgiaXBfdnNfYnlwYXNzX3htaXQoKTogZnJhZyBuZWVkZWRcbiIpOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCWlwX3J0X3B1dChydCk7CiAJCXJldHVybiBORl9TVE9MRU47CiAJfQotCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CkBAIC0yMjYsNyArMjI2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydDsJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJaW50IG10dTsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlFbnRlckZ1bmN0aW9uKDEwKTsKIApAQCAtMjQ1LDcgKzI0NSw3IEBACiAKIAkvKiBNVFUgY2hlY2tpbmcgKi8KIAltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSkgeworCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgewogCQlpcF9ydF9wdXQocnQpOwogCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKIAkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLCAiaXBfdnNfbmF0X3htaXQoKTogZnJhZyBuZWVkZWQgZm9yIik7CkBAIC0yNjYsOCArMjY2LDggQEAKIAkvKiBtYW5nbGUgdGhlIHBhY2tldCAqLwogCWlmIChwcC0+ZG5hdF9oYW5kbGVyICYmICFwcC0+ZG5hdF9oYW5kbGVyKCZza2IsIHBwLCBjcCkpCiAJCWdvdG8gdHhfZXJyb3I7Ci0Jc2tiLT5uaC5pcGgtPmRhZGRyID0gY3AtPmRhZGRyOwotCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCWlwX2hkcihza2IpLT5kYWRkciA9IGNwLT5kYWRkcjsKKwlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAogCUlQX1ZTX0RCR19QS1QoMTAsIHBwLCBza2IsIDAsICJBZnRlciBETkFUIik7CiAKQEAgLTMyMCwxOSArMzIwLDIwIEBACiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsJCS8qIERldmljZSB0byBvdGhlciBob3N0ICovCi0Jc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBpcF9oZHIoc2tiKTsKIAl1OCAgICAgdG9zID0gb2xkX2lwaC0+dG9zOwogCV9fYmUxNiBkZiA9IG9sZF9pcGgtPmZyYWdfb2ZmOworCXNrX2J1ZmZfZGF0YV90IG9sZF90cmFuc3BvcnRfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOwogCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLwogCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KIAlpbnQgICAgbXR1OwogCiAJRW50ZXJGdW5jdGlvbigxMCk7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkgewogCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IHByb3RvY29sIGVycm9yLCAiCiAJCQkgICAgICJFVEhfUF9JUDogJWQsIHNrYiBwcm90b2NvbDogJWRcbiIsCi0JCQkgICAgIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApLCBza2ItPnByb3RvY29sKTsKKwkJCSAgICAgaHRvbnMoRVRIX1BfSVApLCBza2ItPnByb3RvY29sKTsKIAkJZ290byB0eF9lcnJvcjsKIAl9CiAKQEAgLTM1MCw5ICszNTEsOSBAQAogCWlmIChza2ItPmRzdCkKIAkJc2tiLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiLT5kc3QsIG10dSk7CiAKLQlkZiB8PSAob2xkX2lwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpOworCWRmIHw9IChvbGRfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSk7CiAKLQlpZiAoKG9sZF9pcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKQorCWlmICgob2xkX2lwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpCiAJICAgICYmIG10dSA8IG50b2hzKG9sZF9pcGgtPnRvdF9sZW4pKSB7CiAJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwogCQlpcF9ydF9wdXQocnQpOwpAQCAtMzc3LDE1ICszNzgsMTYgQEAKIAkJfQogCQlrZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCQlvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCi0Jc2tiLT5oLnJhdyA9ICh2b2lkICopIG9sZF9pcGg7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gb2xkX3RyYW5zcG9ydF9oZWFkZXI7CiAKIAkvKiBmaXggb2xkIElQIGhlYWRlciBjaGVja3N1bSAqLwogCWlwX3NlbmRfY2hlY2sob2xkX2lwaCk7CiAKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7CiAKIAkvKiBkcm9wIG9sZCByb3V0ZSAqLwpAQCAtMzk1LDcgKzM5Nyw3IEBACiAJLyoKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwotCWlwaAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoCQkJPQlpcF9oZHIoc2tiKTsKIAlpcGgtPnZlcnNpb24JCT0JNDsKIAlpcGgtPmlobAkJPQlzaXplb2Yoc3RydWN0IGlwaGRyKT4+MjsKIAlpcGgtPmZyYWdfb2ZmCQk9CWRmOwpAQCAtNDM1LDcgKzQzNyw3IEBACiAJICAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwotCXN0cnVjdCBpcGhkciAgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAgKmlwaCA9IGlwX2hkcihza2IpOwogCWludCAgICBtdHU7CiAKIAlFbnRlckZ1bmN0aW9uKDEwKTsKQEAgLTQ0NSw3ICs0NDcsNyBAQAogCiAJLyogTVRVIGNoZWNraW5nICovCiAJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKLQlpZiAoKGlwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpICYmIHNrYi0+bGVuID4gbXR1KSB7CisJaWYgKChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiBza2ItPmxlbiA+IG10dSkgewogCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJSVBfVlNfREJHX1JMKCJpcF92c19kcl94bWl0KCk6IGZyYWcgbmVlZGVkXG4iKTsKQEAgLTQ2MCw3ICs0NjIsNyBAQAogCQlpcF9ydF9wdXQocnQpOwogCQlyZXR1cm4gTkZfU1RPTEVOOwogCX0KLQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAogCS8qIGRyb3Agb2xkIHJvdXRlICovCiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwpAQCAtNTE0LDEyICs1MTYsMTIgQEAKIAkgKiBtYW5nbGUgYW5kIHNlbmQgdGhlIHBhY2tldCBoZXJlIChvbmx5IGZvciBWUy9OQVQpCiAJICovCiAKLQlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKHNrYi0+bmguaXBoLT50b3MpKSkpCisJaWYgKCEocnQgPSBfX2lwX3ZzX2dldF9vdXRfcnQoY3AsIFJUX1RPUyhpcF9oZHIoc2tiKS0+dG9zKSkpKQogCQlnb3RvIHR4X2Vycm9yX2ljbXA7CiAKIAkvKiBNVFUgY2hlY2tpbmcgKi8KIAltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpKSB7CisJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwogCQlJUF9WU19EQkdfUkwoImlwX3ZzX2luX2ljbXAoKTogZnJhZyBuZWVkZWRcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbXVsdGlwYXRoX2Ryci5jIGIvbmV0L2lwdjQvbXVsdGlwYXRoX2Ryci5jCmluZGV4IDU3NGM3MzUuLmIwM2M1Y2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L211bHRpcGF0aF9kcnIuYworKysgYi9uZXQvaXB2NC9tdWx0aXBhdGhfZHJyLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZV9sb2NrKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDYwNjlhMTEuLmI0NDE5MjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0xMCw3ICsxMCw3IEBACiAvKiByb3V0ZV9tZV9oYXJkZXIgZnVuY3Rpb24sIHVzZWQgYnkgaXB0YWJsZV9uYXQsIGlwdGFibGVfbWFuZ2xlICsgaXBfcXVldWUgKi8KIGludCBpcF9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBhZGRyX3R5cGUpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aSBmbCA9IHt9OwogCXN0cnVjdCBkc3RfZW50cnkgKm9kc3Q7CkBAIC0xNDIsNyArMTQyLDcgQEAKIAlzdHJ1Y3QgaXBfcnRfaW5mbyAqcnRfaW5mbyA9IG5mX2luZm9fcmVyb3V0ZShpbmZvKTsKIAogCWlmIChpbmZvLT5ob29rID09IE5GX0lQX0xPQ0FMX09VVCkgewotCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJCXJ0X2luZm8tPnRvcyA9IGlwaC0+dG9zOwogCQlydF9pbmZvLT5kYWRkciA9IGlwaC0+ZGFkZHI7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAljb25zdCBzdHJ1Y3QgaXBfcnRfaW5mbyAqcnRfaW5mbyA9IG5mX2luZm9fcmVyb3V0ZShpbmZvKTsKIAogCWlmIChpbmZvLT5ob29rID09IE5GX0lQX0xPQ0FMX09VVCkgewotCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCiAJCWlmICghKGlwaC0+dG9zID09IHJ0X2luZm8tPnRvcwogCQkgICAgICAmJiBpcGgtPmRhZGRyID09IHJ0X2luZm8tPmRhZGRyCkBAIC0xNjgsNyArMTY4LDcgQEAKIF9fc3VtMTYgbmZfaXBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlfX3N1bTE2IGNzdW0gPSAwOwogCiAJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCA2MDE4MDhjLi40NjUwOWZhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMzAsMTg4ICszMCw2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKLSMgY29ubmVjdGlvbiB0cmFja2luZywgaGVscGVycyBhbmQgcHJvdG9jb2xzCi1jb25maWcgSVBfTkZfQ1RfQUNDVAotCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nIgotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCi0JaGVscAotCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgY29kZSB3aWxsCi0JICBrZWVwIHBlci1mbG93IHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4KLQotCSAgVGhvc2UgY291bnRlcnMgY2FuIGJlIHVzZWQgZm9yIGZsb3ctYmFzZWQgYWNjb3VudGluZyBvciB0aGUKLQkgIGBjb25uYnl0ZXMnIG1hdGNoLgotCi0JICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0tfTUFSSwotCWJvb2wgICdDb25uZWN0aW9uIG1hcmsgdHJhY2tpbmcgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiBtYXJrcywgdXNlZCBieSB0aGUKLQkgIGBDT05OTUFSSycgdGFyZ2V0IGFuZCBgY29ubm1hcmsnIG1hdGNoLiBTaW1pbGFyIHRvIHRoZSBtYXJrIHZhbHVlCi0JICBvZiBwYWNrZXRzLCBidXQgdGhpcyBtYXJrIHZhbHVlIGlzIGtlcHQgaW4gdGhlIGNvbm50cmFjayBzZXNzaW9uCi0JICBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHBhY2tldHMuCi0JCi1jb25maWcgSVBfTkZfQ09OTlRSQUNLX1NFQ01BUksKLQlib29sICAnQ29ubmVjdGlvbiB0cmFja2luZyBzZWN1cml0eSBtYXJrIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgTkVUV09SS19TRUNNQVJLCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzZWN1cml0eSBtYXJraW5ncyB0byBiZSBhcHBsaWVkIHRvCi0JICBjb25uZWN0aW9ucy4gIFR5cGljYWxseSB0aGV5IGFyZSBjb3BpZWQgdG8gY29ubmVjdGlvbnMgZnJvbQotCSAgcGFja2V0cyB1c2luZyB0aGUgQ09OTlNFQ01BUksgdGFyZ2V0IGFuZCBjb3BpZWQgYmFjayBmcm9tCi0JICBjb25uZWN0aW9ucyB0byBwYWNrZXRzIHdpdGggdGhlIHNhbWUgdGFyZ2V0LCB3aXRoIHRoZSBwYWNrZXRzCi0JICBiZWluZyBvcmlnaW5hbGx5IGxhYmVsZWQgdmlhIFNFQ01BUksuCi0KLQkgIElmIHVuc3VyZSwgc2F5ICdOJy4KLQotY29uZmlnIElQX05GX0NPTk5UUkFDS19FVkVOVFMKLQlib29sICJDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50cyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUF9ORl9DT05OVFJBQ0sKLQloZWxwCi0JICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlIHdpbGwKLQkgIHByb3ZpZGUgYSBub3RpZmllciBjaGFpbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IG90aGVyIGtlcm5lbCBjb2RlCi0JICB0byBnZXQgbm90aWZpZWQgYWJvdXQgY2hhbmdlcyBpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBzdGF0ZS4KLQkgIAotCSAgSUYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfQ09OTlRSQUNLX05FVExJTksKLQl0cmlzdGF0ZSAnQ29ubmVjdGlvbiB0cmFja2luZyBuZXRsaW5rIGludGVyZmFjZSAoRVhQRVJJTUVOVEFMKScKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUF9ORl9DT05OVFJBQ0sgJiYgTkVURklMVEVSX05FVExJTksKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyE9eSB8fCBORVRGSUxURVJfTkVUTElOSyE9bQotCWRlcGVuZHMgb24gSVBfTkZfTkFUPW4gfHwgSVBfTkZfTkFUCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBhIG5ldGxpbmstYmFzZWQgdXNlcnNwYWNlIGludGVyZmFjZQotCi0KLWNvbmZpZyBJUF9ORl9DVF9QUk9UT19TQ1RQCi0JdHJpc3RhdGUgICdTQ1RQIHByb3RvY29sIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGNvZGUgd2lsbAotCSAgYmUgYWJsZSB0byBkbyBzdGF0ZSB0cmFja2luZyBvbiBTQ1RQIGNvbm5lY3Rpb25zLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX0ZUUAotCXRyaXN0YXRlICJGVFAgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIFRyYWNraW5nIEZUUCBjb25uZWN0aW9ucyBpcyBwcm9ibGVtYXRpYzogc3BlY2lhbCBoZWxwZXJzIGFyZQotCSAgcmVxdWlyZWQgZm9yIHRyYWNraW5nIHRoZW0sIGFuZCBkb2luZyBtYXNxdWVyYWRpbmcgYW5kIG90aGVyIGZvcm1zCi0JICBvZiBOZXR3b3JrIEFkZHJlc3MgVHJhbnNsYXRpb24gb24gdGhlbS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCi0KLWNvbmZpZyBJUF9ORl9JUkMKLQl0cmlzdGF0ZSAiSVJDIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKLQktLS1oZWxwLS0tCi0JICBUaGVyZSBpcyBhIGNvbW1vbmx5LXVzZWQgZXh0ZW5zaW9uIHRvIElSQyBjYWxsZWQKLQkgIERpcmVjdCBDbGllbnQtdG8tQ2xpZW50IFByb3RvY29sIChEQ0MpLiAgVGhpcyBlbmFibGVzIHVzZXJzIHRvIHNlbmQKLQkgIGZpbGVzIHRvIGVhY2ggb3RoZXIsIGFuZCBhbHNvIGNoYXQgdG8gZWFjaCBvdGhlciB3aXRob3V0IHRoZSBuZWVkCi0JICBvZiBhIHNlcnZlci4gIERDQyBTZW5kaW5nIGlzIHVzZWQgYW55d2hlcmUgeW91IHNlbmQgZmlsZXMgb3ZlciBJUkMsCi0JICBhbmQgRENDIENoYXQgaXMgbW9zdCBjb21tb25seSB1c2VkIGJ5IEVnZ2Ryb3AgYm90cy4gIElmIHlvdSBhcmUKLQkgIHVzaW5nIE5BVCwgdGhpcyBleHRlbnNpb24gd2lsbCBlbmFibGUgeW91IHRvIHNlbmQgZmlsZXMgYW5kIGluaXRpYXRlCi0JICBjaGF0cy4gIE5vdGUgdGhhdCB5b3UgZG8gTk9UIG5lZWQgdGhpcyBleHRlbnNpb24gdG8gZ2V0IGZpbGVzIG9yCi0JICBoYXZlIG90aGVycyBpbml0aWF0ZSBjaGF0cywgb3IgZXZlcnl0aGluZyBlbHNlIGluIElSQy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCi0KLWNvbmZpZyBJUF9ORl9ORVRCSU9TX05TCi0JdHJpc3RhdGUgIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHNlbnQgYXMgYnJvYWRjYXN0IG1lc3NhZ2VzIGZyb20gYW4KLQkgIHVucHJpdmlsZWdlZCBwb3J0IGFuZCByZXNwb25kZWQgdG8gd2l0aCB1bmljYXN0IG1lc3NhZ2VzIHRvIHRoZQotCSAgc2FtZSBwb3J0LiBUaGlzIG1ha2UgdGhlbSBoYXJkIHRvIGZpcmV3YWxsIHByb3Blcmx5IGJlY2F1c2UgY29ubmVjdGlvbgotCSAgdHJhY2tpbmcgZG9lc24ndCBkZWFsIHdpdGggYnJvYWRjYXN0cy4gVGhpcyBoZWxwZXIgdHJhY2tzIGxvY2FsbHkKLQkgIG9yaWdpbmF0aW5nIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIHJlcXVlc3RzIGFuZCB0aGUgY29ycmVzcG9uZGluZwotCSAgcmVzcG9uc2VzLiBJdCByZWxpZXMgb24gY29ycmVjdCBJUCBhZGRyZXNzIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseQotCSAgbmV0bWFzayBhbmQgYnJvYWRjYXN0IGFkZHJlc3MuIFdoZW4gcHJvcGVybHkgY29uZmlndXJlZCwgdGhlIG91dHB1dAotCSAgb2YgImlwIGFkZHJlc3Mgc2hvdyIgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGlzOgotCi0JICAkIGlwIC00IGFkZHJlc3Mgc2hvdyBldGgwCi0JICA0OiBldGgwOiA8QlJPQURDQVNULE1VTFRJQ0FTVCxVUD4gbXR1IDE1MDAgcWRpc2MgcGZpZm9fZmFzdCBxbGVuIDEwMDAKLQkgICAgICBpbmV0IDE3Mi4xNi4yLjI1Mi8yNCBicmQgMTcyLjE2LjIuMjU1IHNjb3BlIGdsb2JhbCBldGgwCi0JICAKLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgSVBfTkZfVEZUUAotCXRyaXN0YXRlICJURlRQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKLQloZWxwCi0JICBURlRQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyLCB0aGlzIGlzIHJlcXVpcmVkIGRlcGVuZGluZwotCSAgb24gaG93IHJlc3RyaWN0aXZlIHlvdXIgcnVsZXNldCBpcy4KLQkgIElmIHlvdSBhcmUgdXNpbmcgYSB0ZnRwIGNsaWVudCBiZWhpbmQgLWogU05BVCBvciAtaiBNQVNRVUVSQURJTkcKLQkgIHlvdSB3aWxsIG5lZWQgdGhpcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCi0KLWNvbmZpZyBJUF9ORl9BTUFOREEKLQl0cmlzdGF0ZSAiQW1hbmRhIGJhY2t1cCBwcm90b2NvbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IFRFWFRTRUFSQ0gKLQlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKLQloZWxwCi0JICBJZiB5b3UgYXJlIHJ1bm5pbmcgdGhlIEFtYW5kYSBiYWNrdXAgcGFja2FnZSA8aHR0cDovL3d3dy5hbWFuZGEub3JnLz4KLQkgIG9uIHRoaXMgbWFjaGluZSBvciBtYWNoaW5lcyB0aGF0IHdpbGwgYmUgTUFTUVVFUkFERUQgdGhyb3VnaCB0aGlzCi0JICBtYWNoaW5lLCB0aGVuIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBmZWF0dXJlLiAgVGhpcyBhbGxvd3MgdGhlCi0JICBjb25uZWN0aW9uIHRyYWNraW5nIGFuZCBuYXR0aW5nIGNvZGUgdG8gYWxsb3cgdGhlIHN1Yi1jaGFubmVscyB0aGF0Ci0JICBBbWFuZGEgcmVxdWlyZXMgZm9yIGNvbW11bmljYXRpb24gb2YgdGhlIGJhY2t1cCBkYXRhLCBtZXNzYWdlcyBhbmQKLQkgIGluZGV4LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX1BQVFAKLQl0cmlzdGF0ZSAgJ1BQVFAgcHJvdG9jb2wgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgUFBUUCAoUG9pbnQgdG8gUG9pbnQgVHVubmVsbGluZwotCSAgUHJvdG9jb2wsIFJGQzI2MzcpIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIE5BVC4gCi0JCi0JICBJZiB5b3UgYXJlIHJ1bm5pbmcgUFBUUCBzZXNzaW9ucyBvdmVyIGEgc3RhdGVmdWwgZmlyZXdhbGwgb3IgTkFUCi0JICBib3gsIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBmZWF0dXJlLiAgCi0JCi0JICBQbGVhc2Ugbm90ZSB0aGF0IG5vdCBhbGwgUFBUUCBtb2RlcyBvZiBvcGVyYXRpb24gYXJlIHN1cHBvcnRlZCB5ZXQuCi0JICBGb3IgbW9yZSBpbmZvLCByZWFkIHRvcCBvZiB0aGUgZmlsZQotCSAgbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcHRwLmMKLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIERvY3VtZW50YXRpb24vbW9kdWxlcy50eHQuICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9IMzIzCi0JdHJpc3RhdGUgICdILjMyMyBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpJwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIEguMzIzIGlzIGEgVm9JUCBzaWduYWxsaW5nIHByb3RvY29sIGZyb20gSVRVLVQuIEFzIG9uZSBvZiB0aGUgbW9zdAotCSAgaW1wb3J0YW50IFZvSVAgcHJvdG9jb2xzLCBpdCBpcyB3aWRlbHkgdXNlZCBieSB2b2ljZSBoYXJkd2FyZSBhbmQKLQkgIHNvZnR3YXJlIGluY2x1ZGluZyB2b2ljZSBnYXRld2F5cywgSVAgcGhvbmVzLCBOZXRtZWV0aW5nLCBPcGVuUGhvbmUsCi0JICBHbm9tZW1lZXRpbmcsIGV0Yy4KLQotCSAgV2l0aCB0aGlzIG1vZHVsZSB5b3UgY2FuIHN1cHBvcnQgSC4zMjMgb24gYSBjb25uZWN0aW9uIHRyYWNraW5nL05BVAotCSAgZmlyZXdhbGwuCi0KLQkgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIFJBUywgRmFzdCBTdGFydCwgSC4yNDUgVHVubmVsbGluZywgQ2FsbAotCSAgRm9yd2FyZGluZywgUlRQL1JUQ1AgYW5kIFQuMTIwIGJhc2VkIGF1ZGlvLCB2aWRlbywgZmF4LCBjaGF0LAotCSAgd2hpdGVib2FyZCwgZmlsZSB0cmFuc2ZlciwgZXRjLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlCi0JICB2aXNpdCBodHRwOi8vbmF0aDMyMy5zb3VyY2Vmb3JnZS5uZXQvLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgJ00nIGhlcmUgYW5kIHJlYWQKLQkgIERvY3VtZW50YXRpb24vbW9kdWxlcy50eHQuICBJZiB1bnN1cmUsIHNheSAnTicuCi0KLWNvbmZpZyBJUF9ORl9TSVAKLQl0cmlzdGF0ZSAiU0lQIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgU0lQIGlzIGFuIGFwcGxpY2F0aW9uLWxheWVyIGNvbnRyb2wgcHJvdG9jb2wgdGhhdCBjYW4gZXN0YWJsaXNoLAotCSAgbW9kaWZ5LCBhbmQgdGVybWluYXRlIG11bHRpbWVkaWEgc2Vzc2lvbnMgKGNvbmZlcmVuY2VzKSBzdWNoIGFzCi0JICBJbnRlcm5ldCB0ZWxlcGhvbnkgY2FsbHMuIFdpdGggdGhlIGlwX2Nvbm50cmFja19zaXAgYW5kCi0JICB0aGUgaXBfbmF0X3NpcCBtb2R1bGVzIHlvdSBjYW4gc3VwcG9ydCB0aGUgcHJvdG9jb2wgb24gYSBjb25uZWN0aW9uCi0JICB0cmFja2luZy9OQVRpbmcgZmlyZXdhbGwuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgotCiBjb25maWcgSVBfTkZfUVVFVUUKIAl0cmlzdGF0ZSAiSVAgVXNlcnNwYWNlIHF1ZXVlaW5nIHZpYSBORVRMSU5LIChPQlNPTEVURSkiCiAJaGVscApAQCAtMzYxLDE3ICsxNzksNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotIyBOQVQgKyBzcGVjaWZpYyB0YXJnZXRzOiBpcF9jb25udHJhY2sKLWNvbmZpZyBJUF9ORl9OQVQKLQl0cmlzdGF0ZSAiRnVsbCBOQVQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBJUF9ORl9DT05OVFJBQ0sKLQloZWxwCi0JICBUaGUgRnVsbCBOQVQgb3B0aW9uIGFsbG93cyBtYXNxdWVyYWRpbmcsIHBvcnQgZm9yd2FyZGluZyBhbmQgb3RoZXIKLQkgIGZvcm1zIG9mIGZ1bGwgTmV0d29yayBBZGRyZXNzIFBvcnQgVHJhbnNsYXRpb24uICBJdCBpcyBjb250cm9sbGVkIGJ5Ci0JICB0aGUgYG5hdCcgdGFibGUgaW4gaXB0YWJsZXM6IHNlZSB0aGUgbWFuIHBhZ2UgZm9yIGlwdGFibGVzKDgpLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogIyBOQVQgKyBzcGVjaWZpYyB0YXJnZXRzOiBuZl9jb25udHJhY2sKIGNvbmZpZyBORl9OQVQKIAl0cmlzdGF0ZSAiRnVsbCBOQVQiCkBAIC0zODMsMTEgKzE5MCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTkFUX05FRURFRAotCWJvb2wKLQlkZXBlbmRzIG9uIElQX05GX05BVAotCWRlZmF1bHQgeQotCiBjb25maWcgTkZfTkFUX05FRURFRAogCWJvb2wKIAlkZXBlbmRzIG9uIE5GX05BVApAQCAtMzk1LDcgKzE5Nyw3IEBACiAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfTUFTUVVFUkFERQogCXRyaXN0YXRlICJNQVNRVUVSQURFIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gKE5GX05BVCB8fCBJUF9ORl9OQVQpCisJZGVwZW5kcyBvbiBORl9OQVQKIAloZWxwCiAJICBNYXNxdWVyYWRpbmcgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgTkFUOiBhbGwgb3V0Z29pbmcgY29ubmVjdGlvbnMgYXJlCiAJICBjaGFuZ2VkIHRvIHNlZW0gdG8gY29tZSBmcm9tIGEgcGFydGljdWxhciBpbnRlcmZhY2UncyBhZGRyZXNzLCBhbmQKQEAgLTQwNyw3ICsyMDksNyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX1JFRElSRUNUCiAJdHJpc3RhdGUgIlJFRElSRUNUIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gKE5GX05BVCB8fCBJUF9ORl9OQVQpCisJZGVwZW5kcyBvbiBORl9OQVQKIAloZWxwCiAJICBSRURJUkVDVCBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOQVQ6IGFsbCBpbmNvbWluZyBjb25uZWN0aW9ucyBhcmUKIAkgIG1hcHBlZCBvbnRvIHRoZSBpbmNvbWluZyBpbnRlcmZhY2UncyBhZGRyZXNzLCBjYXVzaW5nIHRoZSBwYWNrZXRzIHRvCkBAIC00MTgsNyArMjIwLDcgQEAKIAogY29uZmlnIElQX05GX1RBUkdFVF9ORVRNQVAKIAl0cmlzdGF0ZSAiTkVUTUFQIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gKE5GX05BVCB8fCBJUF9ORl9OQVQpCisJZGVwZW5kcyBvbiBORl9OQVQKIAloZWxwCiAJICBORVRNQVAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RhdGljIDE6MSBOQVQgbWFwcGluZyBvZiBuZXR3b3JrCiAJICBhZGRyZXNzZXMuIEl0IG1hcHMgdGhlIG5ldHdvcmsgYWRkcmVzcyBwYXJ0LCB3aGlsZSBrZWVwaW5nIHRoZSBob3N0CkBAIC00MjksMjggKzIzMSwxMyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX1NBTUUKIAl0cmlzdGF0ZSAiU0FNRSB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChORl9OQVQgfHwgSVBfTkZfTkFUKQorCWRlcGVuZHMgb24gTkZfTkFUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBTQU1FJyB0YXJnZXQsIHdoaWNoIHdvcmtzIGxpa2UgdGhlIHN0YW5kYXJkIFNOQVQKIAkgIHRhcmdldCwgYnV0IGF0dGVtcHRzIHRvIGdpdmUgY2xpZW50cyB0aGUgc2FtZSBJUCBmb3IgYWxsIGNvbm5lY3Rpb25zLgogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX05BVF9TTk1QX0JBU0lDCi0JdHJpc3RhdGUgIkJhc2ljIFNOTVAtQUxHIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSVBfTkZfTkFUCi0JLS0taGVscC0tLQotCi0JICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGFuIEFwcGxpY2F0aW9uIExheWVyIEdhdGV3YXkgKEFMRykgZm9yCi0JICBTTk1QIHBheWxvYWRzLiAgSW4gY29uanVuY3Rpb24gd2l0aCBOQVQsIGl0IGFsbG93cyBhIG5ldHdvcmsKLQkgIG1hbmFnZW1lbnQgc3lzdGVtIHRvIGFjY2VzcyBtdWx0aXBsZSBwcml2YXRlIG5ldHdvcmtzIHdpdGgKLQkgIGNvbmZsaWN0aW5nIGFkZHJlc3Nlcy4gIEl0IHdvcmtzIGJ5IG1vZGlmeWluZyBJUCBhZGRyZXNzZXMKLQkgIGluc2lkZSBTTk1QIHBheWxvYWRzIHRvIG1hdGNoIElQLWxheWVyIE5BVCBtYXBwaW5nLgotCi0JICBUaGlzIGlzIHRoZSAiYmFzaWMiIGZvcm0gb2YgU05NUC1BTEcsIGFzIGRlc2NyaWJlZCBpbiBSRkMgMjk2MgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIE5GX05BVF9TTk1QX0JBU0lDCiAJdHJpc3RhdGUgIkJhc2ljIFNOTVAtQUxHIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfTkFUCkBAIC00NzcsNzggKzI2NCwzNyBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBORl9OQVQgJiYgTkZfQ1RfUFJPVE9fR1JFCiAKLWNvbmZpZyBJUF9ORl9OQVRfRlRQCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9OQVQKLQlkZWZhdWx0IElQX05GX05BVCAmJiBJUF9ORl9GVFAKLQogY29uZmlnIE5GX05BVF9GVFAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19GVFAKIAotY29uZmlnIElQX05GX05BVF9JUkMKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgotCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX0lSQz15Ci0JZGVmYXVsdCBtIGlmIElQX05GX0lSQz1tCi0KIGNvbmZpZyBORl9OQVRfSVJDCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfSVJDCiAKLWNvbmZpZyBJUF9ORl9OQVRfVEZUUAotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCi0JZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfVEZUUD15Ci0JZGVmYXVsdCBtIGlmIElQX05GX1RGVFA9bQotCiBjb25maWcgTkZfTkFUX1RGVFAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19URlRQCiAKLWNvbmZpZyBJUF9ORl9OQVRfQU1BTkRBCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KLQlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9BTUFOREE9eQotCWRlZmF1bHQgbSBpZiBJUF9ORl9BTUFOREE9bQotCiBjb25maWcgTkZfTkFUX0FNQU5EQQogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0FNQU5EQQogCi1jb25maWcgSVBfTkZfTkFUX1BQVFAKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfTkFUIT1uICYmIElQX05GX1BQVFAhPW4KLQlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9QUFRQPXkKLQlkZWZhdWx0IG0gaWYgSVBfTkZfUFBUUD1tCi0KIGNvbmZpZyBORl9OQVRfUFBUUAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX1BQVFAKIAlzZWxlY3QgTkZfTkFUX1BST1RPX0dSRQogCi1jb25maWcgSVBfTkZfTkFUX0gzMjMKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgotCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX0gzMjM9eQotCWRlZmF1bHQgbSBpZiBJUF9ORl9IMzIzPW0KLQogY29uZmlnIE5GX05BVF9IMzIzCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfSDMyMwogCi1jb25maWcgSVBfTkZfTkFUX1NJUAotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCi0JZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfU0lQPXkKLQlkZWZhdWx0IG0gaWYgSVBfTkZfU0lQPW0KLQogY29uZmlnIE5GX05BVF9TSVAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVApAQCAtNjA2LDkgKzM1Miw4IEBACiBjb25maWcgSVBfTkZfVEFSR0VUX0NMVVNURVJJUAogCXRyaXN0YXRlICJDTFVTVEVSSVAgdGFyZ2V0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUgJiYgRVhQRVJJTUVOVEFMCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLX0lQVjQKLQlzZWxlY3QgSVBfTkZfQ09OTlRSQUNLX01BUksgaWYgSVBfTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLIGlmIE5GX0NPTk5UUkFDS19JUFY0CisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfSVBWNAorCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSwogCWhlbHAKIAkgIFRoZSBDTFVTVEVSSVAgdGFyZ2V0IGFsbG93cyB5b3UgdG8gYnVpbGQgbG9hZC1iYWxhbmNpbmcgY2x1c3RlcnMgb2YKIAkgIG5ldHdvcmsgc2VydmVycyB3aXRob3V0IGhhdmluZyBhIGRlZGljYXRlZCBsb2FkLWJhbGFuY2luZwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDY2MjVlYzYuLjQwOWQyNzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTIsOCArMiw2IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbmV0ZmlsdGVyIG1vZHVsZXMgb24gdG9wIG9mIElQdjQuCiAjCiAKLSMgb2JqZWN0cyBmb3IgdGhlIHN0YW5kYWxvbmUgLSBjb25uZWN0aW9uIHRyYWNraW5nIC8gTkFUCi1pcF9jb25udHJhY2stb2Jqcwk6PSBpcF9jb25udHJhY2tfc3RhbmRhbG9uZS5vIGlwX2Nvbm50cmFja19jb3JlLm8gaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBpcF9jb25udHJhY2tfcHJvdG9fdGNwLm8gaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5vIGlwX2Nvbm50cmFja19wcm90b19pY21wLm8KICMgb2JqZWN0cyBmb3IgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBuZl9jb25udHJhY2tfaXB2NC1vYmpzICA6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5vIG5mX2Nvbm50cmFja19wcm90b19pY21wLm8KIGlmZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkseSkKQEAgLTEyLDUzICsxMCwxNCBAQAogZW5kaWYKIGVuZGlmCiAKLWlwX25hdC1vYmpzCTo9IGlwX25hdF9jb3JlLm8gaXBfbmF0X2hlbHBlci5vIGlwX25hdF9wcm90b191bmtub3duLm8gaXBfbmF0X3Byb3RvX3RjcC5vIGlwX25hdF9wcm90b191ZHAubyBpcF9uYXRfcHJvdG9faWNtcC5vCi1uZl9uYXQtb2Jqcwk6PSBuZl9uYXRfY29yZS5vIG5mX25hdF9oZWxwZXIubyBuZl9uYXRfcHJvdG9fdW5rbm93bi5vIG5mX25hdF9wcm90b190Y3AubyBuZl9uYXRfcHJvdG9fdWRwLm8gbmZfbmF0X3Byb3RvX2ljbXAubwotaWZuZXEgKCQoQ09ORklHX05GX05BVCksKQorbmZfbmF0LW9ianMJCTo9IG5mX25hdF9jb3JlLm8gbmZfbmF0X2hlbHBlci5vIG5mX25hdF9wcm90b191bmtub3duLm8gbmZfbmF0X3Byb3RvX3RjcC5vIG5mX25hdF9wcm90b191ZHAubyBuZl9uYXRfcHJvdG9faWNtcC5vCiBpcHRhYmxlX25hdC1vYmpzCTo9IG5mX25hdF9ydWxlLm8gbmZfbmF0X3N0YW5kYWxvbmUubwotZWxzZQotaXB0YWJsZV9uYXQtb2Jqcwk6PSBpcF9uYXRfcnVsZS5vIGlwX25hdF9zdGFuZGFsb25lLm8KLWVuZGlmCi0KLWlwX2Nvbm50cmFja19wcHRwLW9ianMJOj0gaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLm8gaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5vCi1pcF9uYXRfcHB0cC1vYmpzCTo9IGlwX25hdF9oZWxwZXJfcHB0cC5vIGlwX25hdF9wcm90b19ncmUubwotCi1pcF9jb25udHJhY2tfaDMyMy1vYmpzIDo9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5vIC4uLy4uL25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLm8KLWlwX25hdF9oMzIzLW9ianMgOj0gaXBfbmF0X2hlbHBlcl9oMzIzLm8KIAogIyBjb25uZWN0aW9uIHRyYWNraW5nCi1vYmotJChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSArPSBpcF9jb25udHJhY2subwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19JUFY0KSArPSBuZl9jb25udHJhY2tfaXB2NC5vCiAKLW9iai0kKENPTkZJR19JUF9ORl9OQVQpICs9IGlwX25hdC5vCiBvYmotJChDT05GSUdfTkZfTkFUKSArPSBuZl9uYXQubwogCi0jIGNvbm50cmFjayBuZXRsaW5rIGludGVyZmFjZQotb2JqLSQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSArPSBpcF9jb25udHJhY2tfbmV0bGluay5vCi0KLQotIyBTQ1RQIHByb3RvY29sIGNvbm5lY3Rpb24gdHJhY2tpbmcKLW9iai0kKENPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQKSArPSBpcF9jb25udHJhY2tfcHJvdG9fc2N0cC5vCi0KLSMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXJzCi1vYmotJChDT05GSUdfSVBfTkZfSDMyMykgKz0gaXBfY29ubnRyYWNrX2gzMjMubwotb2JqLSQoQ09ORklHX0lQX05GX1BQVFApICs9IGlwX2Nvbm50cmFja19wcHRwLm8KLW9iai0kKENPTkZJR19JUF9ORl9BTUFOREEpICs9IGlwX2Nvbm50cmFja19hbWFuZGEubwotb2JqLSQoQ09ORklHX0lQX05GX1RGVFApICs9IGlwX2Nvbm50cmFja190ZnRwLm8KLW9iai0kKENPTkZJR19JUF9ORl9GVFApICs9IGlwX2Nvbm50cmFja19mdHAubwotb2JqLSQoQ09ORklHX0lQX05GX0lSQykgKz0gaXBfY29ubnRyYWNrX2lyYy5vCi1vYmotJChDT05GSUdfSVBfTkZfU0lQKSArPSBpcF9jb25udHJhY2tfc2lwLm8KLW9iai0kKENPTkZJR19JUF9ORl9ORVRCSU9TX05TKSArPSBpcF9jb25udHJhY2tfbmV0Ymlvc19ucy5vCi0KLSMgTkFUIGhlbHBlcnMgKGlwX2Nvbm50cmFjaykKLW9iai0kKENPTkZJR19JUF9ORl9OQVRfSDMyMykgKz0gaXBfbmF0X2gzMjMubwotb2JqLSQoQ09ORklHX0lQX05GX05BVF9QUFRQKSArPSBpcF9uYXRfcHB0cC5vCi1vYmotJChDT05GSUdfSVBfTkZfTkFUX0FNQU5EQSkgKz0gaXBfbmF0X2FtYW5kYS5vCi1vYmotJChDT05GSUdfSVBfTkZfTkFUX1RGVFApICs9IGlwX25hdF90ZnRwLm8KLW9iai0kKENPTkZJR19JUF9ORl9OQVRfRlRQKSArPSBpcF9uYXRfZnRwLm8KLW9iai0kKENPTkZJR19JUF9ORl9OQVRfSVJDKSArPSBpcF9uYXRfaXJjLm8KLW9iai0kKENPTkZJR19JUF9ORl9OQVRfU0lQKSArPSBpcF9uYXRfc2lwLm8KLQogIyBOQVQgaGVscGVycyAobmZfY29ubnRyYWNrKQogb2JqLSQoQ09ORklHX05GX05BVF9BTUFOREEpICs9IG5mX25hdF9hbWFuZGEubwogb2JqLSQoQ09ORklHX05GX05BVF9GVFApICs9IG5mX25hdF9mdHAubwpAQCAtNzgsNyArMzcsNiBAQAogIyB0aGUgdGhyZWUgaW5zdGFuY2VzIG9mIGlwX3RhYmxlcwogb2JqLSQoQ09ORklHX0lQX05GX0ZJTFRFUikgKz0gaXB0YWJsZV9maWx0ZXIubwogb2JqLSQoQ09ORklHX0lQX05GX01BTkdMRSkgKz0gaXB0YWJsZV9tYW5nbGUubwotb2JqLSQoQ09ORklHX0lQX05GX05BVCkgKz0gaXB0YWJsZV9uYXQubwogb2JqLSQoQ09ORklHX05GX05BVCkgKz0gaXB0YWJsZV9uYXQubwogb2JqLSQoQ09ORklHX0lQX05GX1JBVykgKz0gaXB0YWJsZV9yYXcubwogCkBAIC0xMDAsNyArNTgsNiBAQAogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVCkgKz0gaXB0X1JFRElSRUNULm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQKSArPSBpcHRfTkVUTUFQLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfU0FNRSkgKz0gaXB0X1NBTUUubwotb2JqLSQoQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDKSArPSBpcF9uYXRfc25tcF9iYXNpYy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0xPRykgKz0gaXB0X0xPRy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0cpICs9IGlwdF9VTE9HLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQKSArPSBpcHRfQ0xVU1RFUklQLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCmluZGV4IDU3YjAyMjEuLmNhZTQxMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKIAliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CiAKLQlhcnAgPSAoKnBza2IpLT5uaC5hcnBoOworCWFycCA9IGFycF9oZHIoKnBza2IpOwogCWRvIHsKIAkJaWYgKGFycF9wYWNrZXRfbWF0Y2goYXJwLCAoKnBza2IpLT5kZXYsIGluZGV2LCBvdXRkZXYsICZlLT5hcnApKSB7CiAJCQlzdHJ1Y3QgYXJwdF9lbnRyeV90YXJnZXQgKnQ7CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkJCQkJCQkJICAgICB0LT5kYXRhKTsKIAogCQkJCS8qIFRhcmdldCBtaWdodCBoYXZlIGNoYW5nZWQgc3R1ZmYuICovCi0JCQkJYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKKwkJCQlhcnAgPSBhcnBfaGRyKCpwc2tiKTsKIAogCQkJCWlmICh2ZXJkaWN0ID09IEFSUFRfQ09OVElOVUUpCiAJCQkJCWUgPSAodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKaW5kZXggNzA5ZGI0ZC4uNjI5OGQ0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKQEAgLTMwLDM1ICszMCwzNSBAQAogCQkqcHNrYiA9IG5za2I7CiAJfQogCi0JYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKLQlhcnBwdHIgPSAoKnBza2IpLT5uaC5yYXcgKyBzaXplb2YoKmFycCk7CisJYXJwID0gYXJwX2hkcigqcHNrYik7CisJYXJwcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKCpwc2tiKSArIHNpemVvZigqYXJwKTsKIAlwbG4gPSBhcnAtPmFyX3BsbjsKIAlobG4gPSBhcnAtPmFyX2hsbjsKIAkvKiBXZSBhc3N1bWUgdGhhdCBwbG4gYW5kIGhsbiB3ZXJlIGNoZWNrZWQgaW4gdGhlIG1hdGNoICovCiAJaWYgKG1hbmdsZS0+ZmxhZ3MgJiBBUlBUX01BTkdMRV9TREVWKSB7CiAJCWlmIChBUlBUX0RFVl9BRERSX0xFTl9NQVggPCBobG4gfHwKLQkJICAgKGFycHB0ciArIGhsbiA+ICgqKnBza2IpLnRhaWwpKQorCQkgICAoYXJwcHRyICsgaGxuID4gc2tiX3RhaWxfcG9pbnRlcigqcHNrYikpKQogCQkJcmV0dXJuIE5GX0RST1A7CiAJCW1lbWNweShhcnBwdHIsIG1hbmdsZS0+c3JjX2RldmFkZHIsIGhsbik7CiAJfQogCWFycHB0ciArPSBobG47CiAJaWYgKG1hbmdsZS0+ZmxhZ3MgJiBBUlBUX01BTkdMRV9TSVApIHsKIAkJaWYgKEFSUFRfTUFOR0xFX0FERFJfTEVOX01BWCA8IHBsbiB8fAotCQkgICAoYXJwcHRyICsgcGxuID4gKCoqcHNrYikudGFpbCkpCisJCSAgIChhcnBwdHIgKyBwbG4gPiBza2JfdGFpbF9wb2ludGVyKCpwc2tiKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAkJbWVtY3B5KGFycHB0ciwgJm1hbmdsZS0+dV9zLnNyY19pcCwgcGxuKTsKIAl9CiAJYXJwcHRyICs9IHBsbjsKIAlpZiAobWFuZ2xlLT5mbGFncyAmIEFSUFRfTUFOR0xFX1RERVYpIHsKIAkJaWYgKEFSUFRfREVWX0FERFJfTEVOX01BWCA8IGhsbiB8fAotCQkgICAoYXJwcHRyICsgaGxuID4gKCoqcHNrYikudGFpbCkpCisJCSAgIChhcnBwdHIgKyBobG4gPiBza2JfdGFpbF9wb2ludGVyKCpwc2tiKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAkJbWVtY3B5KGFycHB0ciwgbWFuZ2xlLT50Z3RfZGV2YWRkciwgaGxuKTsKIAl9CiAJYXJwcHRyICs9IGhsbjsKIAlpZiAobWFuZ2xlLT5mbGFncyAmIEFSUFRfTUFOR0xFX1RJUCkgewogCQlpZiAoQVJQVF9NQU5HTEVfQUREUl9MRU5fTUFYIDwgcGxuIHx8Ci0JCSAgIChhcnBwdHIgKyBwbG4gPiAoKipwc2tiKS50YWlsKSkKKwkJICAgKGFycHB0ciArIHBsbiA+IHNrYl90YWlsX3BvaW50ZXIoKnBza2IpKSkKIAkJCXJldHVybiBORl9EUk9QOwogCQltZW1jcHkoYXJwcHRyLCAmbWFuZ2xlLT51X3QudGd0X2lwLCBwbG4pOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU2MWY1Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogQW1hbmRhIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZywgVmVyc2lvbiAwLjIKLSAqIChDKSAyMDAyIGJ5IEJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+Ci0gKiBiYXNlZCBvbiBIVydzIGlwX2Nvbm50cmFja19pcmMuYyBhcyB3ZWxsIGFzIG90aGVyIG1vZHVsZXMKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJTW9kdWxlIGxvYWQgc3ludGF4OgotICogCWluc21vZCBpcF9jb25udHJhY2tfYW1hbmRhLm8gW21hc3Rlcl90aW1lb3V0PW5dCi0gKgotICoJV2hlcmUgbWFzdGVyX3RpbWVvdXQgaXMgdGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIG9mIHRoZSBtYXN0ZXIKLSAqCWNvbm5lY3Rpb24gKHBvcnQgMTAwODApLiAgVGhpcyBkZWZhdWx0cyB0byA1IG1pbnV0ZXMgYnV0IGlmCi0gKgl5b3VyIGNsaWVudHMgdGFrZSBsb25nZXIgdGhhbiA1IG1pbnV0ZXMgdG8gZG8gdGhlaXIgd29yawotICoJYmVmb3JlIGdldHRpbmcgYmFjayB0byB0aGUgQW1hbmRhIHNlcnZlciwgeW91IGNhbiBpbmNyZWFzZQotICoJdGhpcyB2YWx1ZS4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oPgotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1hc3Rlcl90aW1lb3V0ID0gMzAwOwotc3RhdGljIGNoYXIgKnRzX2FsZ28gPSAia21wIjsKLQotTU9EVUxFX0FVVEhPUigiQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQW1hbmRhIGNvbm5lY3Rpb24gdHJhY2tpbmcgbW9kdWxlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1tb2R1bGVfcGFyYW0obWFzdGVyX3RpbWVvdXQsIHVpbnQsIDA2MDApOwotTU9EVUxFX1BBUk1fREVTQyhtYXN0ZXJfdGltZW91dCwgInRpbWVvdXQgZm9yIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiIpOwotbW9kdWxlX3BhcmFtKHRzX2FsZ28sIGNoYXJwLCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModHNfYWxnbywgInRleHRzZWFyY2ggYWxnb3JpdGhtIHRvIHVzZSAoZGVmYXVsdCBrbXApIik7Ci0KLXVuc2lnbmVkIGludCAoKmlwX25hdF9hbWFuZGFfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfYW1hbmRhX2hvb2spOwotCi1lbnVtIGFtYW5kYV9zdHJpbmdzIHsKLQlTRUFSQ0hfQ09OTkVDVCwKLQlTRUFSQ0hfTkVXTElORSwKLQlTRUFSQ0hfREFUQSwKLQlTRUFSQ0hfTUVTRywKLQlTRUFSQ0hfSU5ERVgsCi19OwotCi1zdGF0aWMgc3RydWN0IHsKLQljaGFyCQkJKnN0cmluZzsKLQlzaXplX3QJCQlsZW47Ci0Jc3RydWN0IHRzX2NvbmZpZwkqdHM7Ci19IHNlYXJjaFtdID0gewotCVtTRUFSQ0hfQ09OTkVDVF0gPSB7Ci0JCS5zdHJpbmcJPSAiQ09OTkVDVCAiLAotCQkubGVuCT0gOCwKLQl9LAotCVtTRUFSQ0hfTkVXTElORV0gPSB7Ci0JCS5zdHJpbmcJPSAiXG4iLAotCQkubGVuCT0gMSwKLQl9LAotCVtTRUFSQ0hfREFUQV0gPSB7Ci0JCS5zdHJpbmcJPSAiREFUQSAiLAotCQkubGVuCT0gNSwKLQl9LAotCVtTRUFSQ0hfTUVTR10gPSB7Ci0JCS5zdHJpbmcJPSAiTUVTRyAiLAotCQkubGVuCT0gNSwKLQl9LAotCVtTRUFSQ0hfSU5ERVhdID0gewotCQkuc3RyaW5nID0gIklOREVYICIsCi0JCS5sZW4JPSA2LAotCX0sCi19OwotCi1zdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0Jc3RydWN0IHRzX3N0YXRlIHRzOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JdW5zaWduZWQgaW50IGRhdGFvZmYsIHN0YXJ0LCBzdG9wLCBvZmYsIGk7Ci0JY2hhciBwYnVmW3NpemVvZigiNjU1MzUiKV0sICp0bXA7Ci0JdV9pbnQxNl90IHBvcnQsIGxlbjsKLQlpbnQgcmV0ID0gTkZfQUNDRVBUOwotCXR5cGVvZihpcF9uYXRfYW1hbmRhX2hvb2spIGlwX25hdF9hbWFuZGE7Ci0KLQkvKiBPbmx5IGxvb2sgYXQgcGFja2V0cyBmcm9tIHRoZSBBbWFuZGEgc2VydmVyICovCi0JaWYgKENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKiBpbmNyZWFzZSB0aGUgVURQIHRpbWVvdXQgb2YgdGhlIG1hc3RlciBjb25uZWN0aW9uIGFzIHJlcGxpZXMgZnJvbQotCSAqIEFtYW5kYSBjbGllbnRzIHRvIHRoZSBzZXJ2ZXIgY2FuIGJlIHF1aXRlIGRlbGF5ZWQgKi8KLQlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgbWFzdGVyX3RpbWVvdXQgKiBIWik7Ci0KLQkvKiBObyBkYXRhPyAqLwotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJhbWFuZGFfaGVscDogc2tibGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7Ci0Jc3RhcnQgPSBza2JfZmluZF90ZXh0KCpwc2tiLCBkYXRhb2ZmLCAoKnBza2IpLT5sZW4sCi0JCQkgICAgICBzZWFyY2hbU0VBUkNIX0NPTk5FQ1RdLnRzLCAmdHMpOwotCWlmIChzdGFydCA9PSBVSU5UX01BWCkKLQkJZ290byBvdXQ7Ci0Jc3RhcnQgKz0gZGF0YW9mZiArIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0ubGVuOwotCi0JbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7Ci0Jc3RvcCA9IHNrYl9maW5kX3RleHQoKnBza2IsIHN0YXJ0LCAoKnBza2IpLT5sZW4sCi0JCQkgICAgIHNlYXJjaFtTRUFSQ0hfTkVXTElORV0udHMsICZ0cyk7Ci0JaWYgKHN0b3AgPT0gVUlOVF9NQVgpCi0JCWdvdG8gb3V0OwotCXN0b3AgKz0gc3RhcnQ7Ci0KLQlmb3IgKGkgPSBTRUFSQ0hfREFUQTsgaSA8PSBTRUFSQ0hfSU5ERVg7IGkrKykgewotCQltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKLQkJb2ZmID0gc2tiX2ZpbmRfdGV4dCgqcHNrYiwgc3RhcnQsIHN0b3AsIHNlYXJjaFtpXS50cywgJnRzKTsKLQkJaWYgKG9mZiA9PSBVSU5UX01BWCkKLQkJCWNvbnRpbnVlOwotCQlvZmYgKz0gc3RhcnQgKyBzZWFyY2hbaV0ubGVuOwotCi0JCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mKHBidWYpIC0gMSwgc3RvcCAtIG9mZik7Ci0JCWlmIChza2JfY29weV9iaXRzKCpwc2tiLCBvZmYsIHBidWYsIGxlbikpCi0JCQlicmVhazsKLQkJcGJ1ZltsZW5dID0gJ1wwJzsKLQotCQlwb3J0ID0gc2ltcGxlX3N0cnRvdWwocGJ1ZiwgJnRtcCwgMTApOwotCQlsZW4gPSB0bXAgLSBwYnVmOwotCQlpZiAocG9ydCA9PSAwIHx8IGxlbiA+IDUpCi0JCQlicmVhazsKLQotCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKLQkJaWYgKGV4cCA9PSBOVUxMKSB7Ci0JCQlyZXQgPSBORl9EUk9QOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKLQkJZXhwLT5mbGFncyA9IDA7Ci0KLQkJZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwOwotCQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQkJZXhwLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwOwotCQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0KLQkJZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCi0JCS8qIFJDVSByZWFkIGxvY2tlZCBieSBuZl9ob29rX3Nsb3cgKi8KLQkJaXBfbmF0X2FtYW5kYSA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfYW1hbmRhX2hvb2spOwotCQlpZiAoaXBfbmF0X2FtYW5kYSkKLQkJCXJldCA9IGlwX25hdF9hbWFuZGEocHNrYiwgY3RpbmZvLCBvZmYgLSBkYXRhb2ZmLAotCQkJCQkgICAgbGVuLCBleHApOwotCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQotCQkJcmV0ID0gTkZfRFJPUDsKLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQl9Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgYW1hbmRhX2hlbHBlciA9IHsKLQkubWF4X2V4cGVjdGVkID0gMywKLQkudGltZW91dCA9IDE4MCwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkuaGVscCA9IGhlbHAsCi0JLm5hbWUgPSAiYW1hbmRhIiwKLQotCS50dXBsZSA9IHsgLnNyYyA9IHsgLnUgPSB7IC51ZHAgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKDEwMDgwKSB9IH0gfSwKLQkJICAgLmRzdCA9IHsgLnByb3RvbnVtID0gSVBQUk9UT19VRFAgfSwKLQl9LAotCS5tYXNrID0geyAuc3JjID0geyAudSA9IHsgMHhGRkZGIH0gfSwKLQkJIC5kc3QgPSB7IC5wcm90b251bSA9IDB4RkYgfSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19leGl0IGlwX2Nvbm50cmFja19hbWFuZGFfZmluaSh2b2lkKQotewotCWludCBpOwotCi0JaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZhbWFuZGFfaGVscGVyKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2gpOyBpKyspCi0JCXRleHRzZWFyY2hfZGVzdHJveShzZWFyY2hbaV0udHMpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfYW1hbmRhX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0LCBpOwotCi0JcmV0ID0gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2gpOyBpKyspIHsKLQkJc2VhcmNoW2ldLnRzID0gdGV4dHNlYXJjaF9wcmVwYXJlKHRzX2FsZ28sIHNlYXJjaFtpXS5zdHJpbmcsCi0JCQkJCQkgIHNlYXJjaFtpXS5sZW4sCi0JCQkJCQkgIEdGUF9LRVJORUwsIFRTX0FVVE9MT0FEKTsKLQkJaWYgKHNlYXJjaFtpXS50cyA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JfQotCXJldCA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQlyZXR1cm4gMDsKLQotZXJyOgotCWZvciAoOyBpID49IDA7IGktLSkgewotCQlpZiAoc2VhcmNoW2ldLnRzKQotCQkJdGV4dHNlYXJjaF9kZXN0cm95KHNlYXJjaFtpXS50cyk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja19hbWFuZGFfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9jb25udHJhY2tfYW1hbmRhX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiOTlhZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NTAgKzAsMCBAQAotLyogQ29ubmVjdGlvbiBzdGF0ZSB0cmFja2luZyBmb3IgbmV0ZmlsdGVyLiAgVGhpcyBpcyBzZXBhcmF0ZWQgZnJvbSwKLSAgIGJ1dCByZXF1aXJlZCBieSwgdGhlIE5BVCBsYXllcjsgaXQgY2FuIGFsc28gYmUgdXNlZCBieSBhbiBpcHRhYmxlcwotICAgZXh0ZW5zaW9uLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAyMyBBcHIgMjAwMTogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIAktIG5ldyBBUEkgYW5kIGhhbmRsaW5nIG9mIGNvbm50cmFjay9uYXQgaGVscGVycwotICogCS0gbm93IGNhcGFibGUgb2YgbXVsdGlwbGUgZXhwZWN0YXRpb25zIGZvciBvbmUgbWFzdGVyCi0gKiAxNiBKdWwgMjAwMjogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIAktIGFkZCB1c2FnZS9yZWZlcmVuY2UgY291bnRzIHRvIGlwX2Nvbm50cmFja19leHBlY3QKLSAqCS0gZXhwb3J0IGlwX2Nvbm50cmFja1tfZXhwZWN0XV97ZmluZF9nZXQscHV0fSBmdW5jdGlvbnMKLSAqICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0KLS8qIGlwX2Nvbm50cmFja19sb2NrIHByb3RlY3RzIHRoZSBtYWluIGhhc2ggdGFibGUsIHByb3RvY29sL2hlbHBlci9leHBlY3RlZAotICAgcmVnaXN0cmF0aW9ucywgY29ubnRyYWNrIHRpbWVycyovCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0KLSNkZWZpbmUgSVBfQ09OTlRSQUNLX1ZFUlNJT04JIjIuNCIKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1ERUZJTkVfUldMT0NLKGlwX2Nvbm50cmFja19sb2NrKTsKLQotLyogaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUgbmVlZHMgdGhpcyAqLwotYXRvbWljX3QgaXBfY29ubnRyYWNrX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLXZvaWQgKCppcF9jb25udHJhY2tfZGVzdHJveWVkKShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spID0gTlVMTDsKLUxJU1RfSEVBRChpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwotc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqaXBfY3RfcHJvdG9zW01BWF9JUF9DVF9QUk9UT10gX19yZWFkX21vc3RseTsKLXN0YXRpYyBMSVNUX0hFQUQoaGVscGVycyk7Ci11bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplIF9fcmVhZF9tb3N0bHkgPSAwOwotaW50IGlwX2Nvbm50cmFja19tYXggX19yZWFkX21vc3RseTsKLXN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlwX2Nvbm50cmFja19jYWNoZXAgX19yZWFkX21vc3RseTsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAgX19yZWFkX21vc3RseTsKLXN0cnVjdCBpcF9jb25udHJhY2sgaXBfY29ubnRyYWNrX3VudHJhY2tlZDsKLXVuc2lnbmVkIGludCBpcF9jdF9sb2dfaW52YWxpZCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIExJU1RfSEVBRCh1bmNvbmZpcm1lZCk7Ci1zdGF0aWMgaW50IGlwX2Nvbm50cmFja192bWFsbG9jIF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX25leHRfaWQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19leHBlY3RfbmV4dF9pZDsKLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotQVRPTUlDX05PVElGSUVSX0hFQUQoaXBfY29ubnRyYWNrX2NoYWluKTsKLUFUT01JQ19OT1RJRklFUl9IRUFEKGlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4pOwotCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSwgaXBfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLS8qIGRlbGl2ZXIgY2FjaGVkIGV2ZW50cyBhbmQgY2xlYXIgY2FjaGUgZW50cnkgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2FsbHkKLSAqIGRpc2FibGVkIHNvZnRpcnFzICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKHN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlICplY2FjaGUpCi17Ci0JREVCVUdQKCJlY2FjaGU6IGRlbGl2ZXJpbmcgZXZlbnRzIGZvciAlcFxuIiwgZWNhY2hlLT5jdCk7Ci0JaWYgKGlzX2NvbmZpcm1lZChlY2FjaGUtPmN0KSAmJiAhaXNfZHlpbmcoZWNhY2hlLT5jdCkgJiYgZWNhY2hlLT5ldmVudHMpCi0JCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZpcF9jb25udHJhY2tfY2hhaW4sIGVjYWNoZS0+ZXZlbnRzLAotCQkJCSAgICBlY2FjaGUtPmN0KTsKLQllY2FjaGUtPmV2ZW50cyA9IDA7Ci0JaXBfY29ubnRyYWNrX3B1dChlY2FjaGUtPmN0KTsKLQllY2FjaGUtPmN0ID0gTlVMTDsKLX0KLQotLyogRGVsaXZlciBhbGwgY2FjaGVkIGV2ZW50cyBmb3IgYSBwYXJ0aWN1bGFyIGNvbm50cmFjay4gVGhpcyBpcyBjYWxsZWQKLSAqIGJ5IGNvZGUgcHJpb3IgdG8gYXN5bmMgcGFja2V0IGhhbmRsaW5nIG9yIGZyZWVpbmcgdGhlIHNrYiAqLwotdm9pZCBpcF9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihpcF9jb25udHJhY2tfZWNhY2hlKTsKLQlpZiAoZWNhY2hlLT5jdCA9PSBjdCkKLQkJX19pcF9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLX0KLQotdm9pZCBfX2lwX2N0X2V2ZW50X2NhY2hlX2luaXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKLQotCS8qIHRha2UgY2FyZSBvZiBkZWxpdmVyaW5nIHBvdGVudGlhbGx5IG9sZCBldmVudHMgKi8KLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihpcF9jb25udHJhY2tfZWNhY2hlKTsKLQlCVUdfT04oZWNhY2hlLT5jdCA9PSBjdCk7Ci0JaWYgKGVjYWNoZS0+Y3QpCi0JCV9faXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGVjYWNoZSk7Ci0JLyogaW5pdGlhbGl6ZSBmb3IgdGhpcyBjb25udHJhY2svcGFja2V0ICovCi0JZWNhY2hlLT5jdCA9IGN0OwotCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKLX0KLQotLyogZmx1c2ggdGhlIGV2ZW50IGNhY2hlIC0gdG91Y2hlcyBvdGhlciBDUFUncyBkYXRhIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUKLSAqIHBhY2tldHMgYXJlIHN0aWxsIHBhc3NpbmcgdGhyb3VnaCB0aGUgY29kZSAqLwotc3RhdGljIHZvaWQgaXBfY3RfZXZlbnRfY2FjaGVfZmx1c2godm9pZCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWVjYWNoZSA9ICZwZXJfY3B1KGlwX2Nvbm50cmFja19lY2FjaGUsIGNwdSk7Ci0JCWlmIChlY2FjaGUtPmN0KQotCQkJaXBfY29ubnRyYWNrX3B1dChlY2FjaGUtPmN0KTsKLQl9Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGlwX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHZvaWQpIHt9Ci0jZW5kaWYgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KLQotREVGSU5FX1BFUl9DUFUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0LCBpcF9jb25udHJhY2tfc3RhdCk7Ci0KLXN0YXRpYyBpbnQgaXBfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19oYXNoX3JuZDsKLQotc3RhdGljIHVfaW50MzJfdCBfX2hhc2hfY29ubnRyYWNrKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgcm5kKQotewotCXJldHVybiAoamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMil0dXBsZS0+c3JjLmlwLAotCQkJICAgICAoKF9fZm9yY2UgdTMyKXR1cGxlLT5kc3QuaXAgXiB0dXBsZS0+ZHN0LnByb3RvbnVtKSwKLQkJCSAgICAgKHR1cGxlLT5zcmMudS5hbGwgfCAodHVwbGUtPmRzdC51LmFsbCA8PCAxNikpLAotCQkJICAgICBybmQpICUgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB1X2ludDMyX3QKLWhhc2hfY29ubnRyYWNrKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiBfX2hhc2hfY29ubnRyYWNrKHR1cGxlLCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsCi0JCQkJaXBfY29ubnRyYWNrX2hhc2hfcm5kKTsKLX0KLQotaW50Ci1pcF9jdF9nZXRfdHVwbGUoY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCXVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wpCi17Ci0JLyogTmV2ZXIgaGFwcGVuICovCi0JaWYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKSB7Ci0JCXByaW50aygiaXBfY29ubnRyYWNrX2NvcmU6IEZyYWcgb2YgcHJvdG8gJXUuXG4iLAotCQkgICAgICAgaXBoLT5wcm90b2NvbCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXR1cGxlLT5zcmMuaXAgPSBpcGgtPnNhZGRyOwotCXR1cGxlLT5kc3QuaXAgPSBpcGgtPmRhZGRyOwotCXR1cGxlLT5kc3QucHJvdG9udW0gPSBpcGgtPnByb3RvY29sOwotCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwotCi0JcmV0dXJuIHByb3RvY29sLT5wa3RfdG9fdHVwbGUoc2tiLCBkYXRhb2ZmLCB0dXBsZSk7Ci19Ci0KLWludAotaXBfY3RfaW52ZXJ0X3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcsCi0JCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sKQotewotCWludmVyc2UtPnNyYy5pcCA9IG9yaWctPmRzdC5pcDsKLQlpbnZlcnNlLT5kc3QuaXAgPSBvcmlnLT5zcmMuaXA7Ci0JaW52ZXJzZS0+ZHN0LnByb3RvbnVtID0gb3JpZy0+ZHN0LnByb3RvbnVtOwotCWludmVyc2UtPmRzdC5kaXIgPSAhb3JpZy0+ZHN0LmRpcjsKLQotCXJldHVybiBwcm90b2NvbC0+aW52ZXJ0X3R1cGxlKGludmVyc2UsIG9yaWcpOwotfQotCi0KLS8qIGlwX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwotdm9pZCBpcF9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JSVBfTkZfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZleHAtPnRpbWVvdXQpKTsKLQlsaXN0X2RlbCgmZXhwLT5saXN0KTsKLQlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7Ci0JZXhwLT5tYXN0ZXItPmV4cGVjdGluZy0tOwotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4cGVjdGF0aW9uX3RpbWVkX291dCh1bnNpZ25lZCBsb25nIHVsX2V4cGVjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gKHZvaWQgKil1bF9leHBlY3Q7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JaXBfY3RfdW5saW5rX2V4cGVjdChleHApOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLV9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChpcF9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEp1c3QgZmluZCBhIGV4cGVjdGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLWlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpID0gX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQodHVwbGUpOwotCWlmIChpKQotCQlhdG9taWNfaW5jKCZpLT51c2UpOwotCXJlYWRfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogSWYgYW4gZXhwZWN0YXRpb24gZm9yIHRoaXMgY29ubmVjdGlvbiBpcyBmb3VuZCwgaXQgZ2V0cyBkZWxldGUgZnJvbQotICogZ2xvYmFsIGxpc3QgdGhlbiByZXR1cm5lZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqCi1maW5kX2V4cGVjdGF0aW9uKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCS8qIElmIG1hc3RlciBpcyBub3QgaW4gaGFzaCB0YWJsZSB5ZXQgKGllLiBwYWNrZXQgaGFzbid0IGxlZnQKLQkJICAgdGhpcyBtYWNoaW5lIHlldCksIGhvdyBjYW4gb3RoZXIgZW5kIGtub3cgYWJvdXQgZXhwZWN0ZWQ/Ci0JCSAgIEhlbmNlIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB5b3UgYXJlIGxvb2tpbmcgZm9yIChpZgotCQkgICBtYXN0ZXIgY3QgbmV2ZXIgZ290IGNvbmZpcm1lZCwgd2UnZCBob2xkIGEgcmVmZXJlbmNlIHRvIGl0Ci0JCSAgIGFuZCB3ZWlyZCB0aGluZ3Mgd291bGQgaGFwcGVuIHRvIGZ1dHVyZSBwYWNrZXRzKS4gKi8KLQkJaWYgKGlwX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKQotCQkgICAgJiYgaXNfY29uZmlybWVkKGktPm1hc3RlcikpIHsKLQkJCWlmIChpLT5mbGFncyAmIElQX0NUX0VYUEVDVF9QRVJNQU5FTlQpIHsKLQkJCQlhdG9taWNfaW5jKCZpLT51c2UpOwotCQkJCXJldHVybiBpOwotCQkJfSBlbHNlIGlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogZGVsZXRlIGFsbCBleHBlY3RhdGlvbnMgZm9yIHRoaXMgY29ubnRyYWNrICovCi12b2lkIGlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmksICp0bXA7Ci0KLQkvKiBPcHRpbWl6YXRpb246IG1vc3QgY29ubmVjdGlvbiBuZXZlciBleHBlY3QgYW55IG90aGVycy4gKi8KLQlpZiAoY3QtPmV4cGVjdGluZyA9PSAwKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChpLT5tYXN0ZXIgPT0gY3QgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2xlYW5fZnJvbV9saXN0cyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlERUJVR1AoImNsZWFuX2Zyb21fbGlzdHMoJXApXG4iLCBjdCk7Ci0JbGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0KTsKLQlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmxpc3QpOwotCi0JLyogRGVzdHJveSBhbGwgcGVuZGluZyBleHBlY3RhdGlvbnMgKi8KLQlpcF9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKGN0KTsKLX0KLQotc3RhdGljIHZvaWQKLWRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSAoc3RydWN0IGlwX2Nvbm50cmFjayAqKW5mY3Q7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKLQl0eXBlb2YoaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCkgZGVzdHJveWVkOwotCi0JREVCVUdQKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKLQlJUF9ORl9BU1NFUlQoYXRvbWljX3JlYWQoJm5mY3QtPnVzZSkgPT0gMCk7Ci0JSVBfTkZfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkpOwotCi0JaXBfY29ubnRyYWNrX2V2ZW50KElQQ1RfREVTVFJPWSwgY3QpOwotCXNldF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpOwotCi0JaGVscGVyID0gY3QtPmhlbHBlcjsKLQlpZiAoaGVscGVyICYmIGhlbHBlci0+ZGVzdHJveSkKLQkJaGVscGVyLT5kZXN0cm95KGN0KTsKLQotCS8qIFRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IHdlaXJkIGxvY2tpbmcgaXNzdWVzIGhlcmU6Ci0JICogZGVzdHJveV9jb25udHJhY2soKSBNVVNUIE5PVCBiZSBjYWxsZWQgd2l0aCBhIHdyaXRlIGxvY2sKLQkgKiB0byBpcF9jb25udHJhY2tfbG9jayEhISAtSFcgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcHJvdG8gPSBfX2lwX2Nvbm50cmFja19wcm90b19maW5kKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QucHJvdG9udW0pOwotCWlmIChwcm90byAmJiBwcm90by0+ZGVzdHJveSkKLQkJcHJvdG8tPmRlc3Ryb3koY3QpOwotCi0JZGVzdHJveWVkID0gcmN1X2RlcmVmZXJlbmNlKGlwX2Nvbm50cmFja19kZXN0cm95ZWQpOwotCWlmIChkZXN0cm95ZWQpCi0JCWRlc3Ryb3llZChjdCk7Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkvKiBFeHBlY3RhdGlvbnMgd2lsbCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBjbGVhbl9mcm9tX2xpc3RzLAotCSAqIGV4Y2VwdCBURlRQIGNhbiBjcmVhdGUgYW4gZXhwZWN0YXRpb24gb24gdGhlIGZpcnN0IHBhY2tldCwKLQkgKiBiZWZvcmUgY29ubmVjdGlvbiBpcyBpbiB0aGUgbGlzdCwgc28gd2UgbmVlZCB0byBjbGVhbiBoZXJlLAotCSAqIHRvby4gKi8KLQlpcF9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKGN0KTsKLQotCS8qIFdlIG92ZXJsb2FkIGZpcnN0IHR1cGxlIHRvIGxpbmsgaW50byB1bmNvbmZpcm1lZCBsaXN0LiAqLwotCWlmICghaXNfY29uZmlybWVkKGN0KSkgewotCQlCVUdfT04obGlzdF9lbXB0eSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpKTsKLQkJbGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0KTsKLQl9Ci0KLQlDT05OVFJBQ0tfU1RBVF9JTkMoZGVsZXRlKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCWlmIChjdC0+bWFzdGVyKQotCQlpcF9jb25udHJhY2tfcHV0KGN0LT5tYXN0ZXIpOwotCi0JREVCVUdQKCJkZXN0cm95X2Nvbm50cmFjazogcmV0dXJuaW5nIGN0PSVwIHRvIHNsYWJcbiIsIGN0KTsKLQlpcF9jb25udHJhY2tfZnJlZShjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYXRoX2J5X3RpbWVvdXQodW5zaWduZWQgbG9uZyB1bF9jb25udHJhY2spCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSAodm9pZCAqKXVsX2Nvbm50cmFjazsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkvKiBJbnNpZGUgbG9jayBzbyBwcmVlbXB0IGlzIGRpc2FibGVkIG9uIG1vZHVsZSByZW1vdmFsIHBhdGguCi0JICogT3RoZXJ3aXNlIHdlIGNhbiBnZXQgc3B1cmlvdXMgd2FybmluZ3MuICovCi0JQ09OTlRSQUNLX1NUQVRfSU5DKGRlbGV0ZV9saXN0KTsKLQljbGVhbl9mcm9tX2xpc3RzKGN0KTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpcF9jb25udHJhY2tfcHV0KGN0KTsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjaykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0JdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX2Nvbm50cmFjayh0dXBsZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZpcF9jb25udHJhY2tfaGFzaFtoYXNoXSwgbGlzdCkgewotCQlpZiAodHVwbGVoYXNoX3RvX2N0cmFjayhoKSAhPSBpZ25vcmVkX2Nvbm50cmFjayAmJgotCQkgICAgaXBfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkpIHsKLQkJCUNPTk5UUkFDS19TVEFUX0lOQyhmb3VuZCk7Ci0JCQlyZXR1cm4gaDsKLQkJfQotCQlDT05OVFJBQ0tfU1RBVF9JTkMoc2VhcmNoZWQpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGEgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgdHVwbGUuICovCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjaykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQloID0gX19pcF9jb25udHJhY2tfZmluZCh0dXBsZSwgaWdub3JlZF9jb25udHJhY2spOwotCWlmIChoKQotCQlhdG9taWNfaW5jKCZ0dXBsZWhhc2hfdG9fY3RyYWNrKGgpLT5jdF9nZW5lcmFsLnVzZSk7Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBoOwotfQotCi1zdGF0aWMgdm9pZCBfX2lwX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQkJdW5zaWduZWQgaW50IGhhc2gsCi0JCQkJCXVuc2lnbmVkIGludCByZXBsX2hhc2gpCi17Ci0JY3QtPmlkID0gKytpcF9jb25udHJhY2tfbmV4dF9pZDsKLQlsaXN0X2FkZCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QsCi0JCSAmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0pOwotCWxpc3RfYWRkKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0ubGlzdCwKLQkJICZpcF9jb25udHJhY2tfaGFzaFtyZXBsX2hhc2hdKTsKLX0KLQotdm9pZCBpcF9jb25udHJhY2tfaGFzaF9pbnNlcnQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JdW5zaWduZWQgaW50IGhhc2gsIHJlcGxfaGFzaDsKLQotCWhhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKLQlyZXBsX2hhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlfX2lwX2Nvbm50cmFja19oYXNoX2luc2VydChjdCwgaGFzaCwgcmVwbF9oYXNoKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotLyogQ29uZmlybSBhIGNvbm5lY3Rpb24gZ2l2ZW4gc2tiOyBwbGFjZXMgaXQgaW4gaGFzaCB0YWJsZSAqLwotaW50Ci1fX2lwX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICoqcHNrYikKLXsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVwbF9oYXNoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0KLQkvKiBpcHRfUkVKRUNUIHVzZXMgaXBfY29ubnRyYWNrX2F0dGFjaCB0byBhdHRhY2ggcmVsYXRlZAotCSAgIElDTVAvVENQIFJTVCBwYWNrZXRzIGluIG90aGVyIGRpcmVjdGlvbi4gIEFjdHVhbCBwYWNrZXQKLQkgICB3aGljaCBjcmVhdGVkIGNvbm5lY3Rpb24gd2lsbCBiZSBJUF9DVF9ORVcgb3IgZm9yIGFuCi0JICAgZXhwZWN0ZWQgY29ubmVjdGlvbiwgSVBfQ1RfUkVMQVRFRC4gKi8KLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pICE9IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCWhhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKLQlyZXBsX2hhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKLQotCS8qIFdlJ3JlIG5vdCBpbiBoYXNoIHRhYmxlLCBhbmQgd2UgcmVmdXNlIHRvIHNldCB1cCByZWxhdGVkCi0JICAgY29ubmVjdGlvbnMgZm9yIHVuY29uZmlybWVkIGNvbm5zLiAgQnV0IHBhY2tldCBjb3BpZXMgYW5kCi0JICAgUkVKRUNUIHdpbGwgZ2l2ZSBzcHVyaW91cyB3YXJuaW5ncyBoZXJlLiAqLwotCS8qIElQX05GX0FTU0VSVChhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSA9PSAxKTsgKi8KLQotCS8qIE5vIGV4dGVybmFsIHJlZmVyZW5jZXMgbWVhbnMgbm9vbmUgZWxzZSBjb3VsZCBoYXZlCi0JICAgY29uZmlybWVkIHVzLiAqLwotCUlQX05GX0FTU0VSVCghaXNfY29uZmlybWVkKGN0KSk7Ci0JREVCVUdQKCJDb25maXJtaW5nIGNvbm50cmFjayAlcFxuIiwgY3QpOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JLyogU2VlIGlmIHRoZXJlJ3Mgb25lIGluIHRoZSBsaXN0IGFscmVhZHksIGluY2x1ZGluZyByZXZlcnNlOgotCSAgIE5BVCBjb3VsZCBoYXZlIGdyYWJiZWQgaXQgd2l0aG91dCByZWFsaXppbmcsIHNpbmNlIHdlJ3JlCi0JICAgbm90IGluIHRoZSBoYXNoLiAgSWYgdGhlcmUgaXMsIHdlIGxvc3QgcmFjZS4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZpcF9jb25udHJhY2tfaGFzaFtoYXNoXSwgbGlzdCkKLQkJaWYgKGlwX2N0X3R1cGxlX2VxdWFsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsCi0JCQkJICAgICAgJmgtPnR1cGxlKSkKLQkJCWdvdG8gb3V0OwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoW3JlcGxfaGFzaF0sIGxpc3QpCi0JCWlmIChpcF9jdF90dXBsZV9lcXVhbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkJCSAgICAgICZoLT50dXBsZSkpCi0JCQlnb3RvIG91dDsKLQotCS8qIFJlbW92ZSBmcm9tIHVuY29uZmlybWVkIGxpc3QgKi8KLQlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpOwotCi0JX19pcF9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGxfaGFzaCk7Ci0JLyogVGltZXIgcmVsYXRpdmUgdG8gY29uZmlybWF0aW9uIHRpbWUsIG5vdCBvcmlnaW5hbAotCSAgIHNldHRpbmcgdGltZSwgb3RoZXJ3aXNlIHdlJ2QgZ2V0IHRpbWVyIHdyYXAgaW4KLQkgICB3ZWlyZCBkZWxheSBjYXNlcy4gKi8KLQljdC0+dGltZW91dC5leHBpcmVzICs9IGppZmZpZXM7Ci0JYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0JYXRvbWljX2luYygmY3QtPmN0X2dlbmVyYWwudXNlKTsKLQlzZXRfYml0KElQU19DT05GSVJNRURfQklULCAmY3QtPnN0YXR1cyk7Ci0JQ09OTlRSQUNLX1NUQVRfSU5DKGluc2VydCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JaWYgKGN0LT5oZWxwZXIpCi0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0hFTFBFUiwgKnBza2IpOwotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0JaWYgKHRlc3RfYml0KElQU19TUkNfTkFUX0RPTkVfQklULCAmY3QtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoSVBTX0RTVF9OQVRfRE9ORV9CSVQsICZjdC0+c3RhdHVzKSkKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTkFUSU5GTywgKnBza2IpOwotI2VuZGlmCi0JaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKG1hc3Rlcl9jdChjdCkgPwotCQkJCSBJUENUX1JFTEFURUQgOiBJUENUX05FVywgKnBza2IpOwotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLQotb3V0OgotCUNPTk5UUkFDS19TVEFUX0lOQyhpbnNlcnRfZmFpbGVkKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gTkZfRFJPUDsKLX0KLQotLyogUmV0dXJucyB0cnVlIGlmIGEgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5ncyB0byB0aGUgdHVwbGUgKHJlcXVpcmVkCi0gICBmb3IgTkFUKS4gKi8KLWludAotaXBfY29ubnRyYWNrX3R1cGxlX3Rha2VuKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWggPSBfX2lwX2Nvbm50cmFja19maW5kKHR1cGxlLCBpZ25vcmVkX2Nvbm50cmFjayk7Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBoICE9IE5VTEw7Ci19Ci0KLS8qIFRoZXJlJ3MgYSBzbWFsbCByYWNlIGhlcmUgd2hlcmUgd2UgbWF5IGZyZWUgYSBqdXN0LWFzc3VyZWQKLSAgIGNvbm5lY3Rpb24uICBUb28gYmFkOiB3ZSdyZSBpbiB0cm91YmxlIGFueXdheS4gKi8KLXN0YXRpYyBpbnQgZWFybHlfZHJvcChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFpbikKLXsKLQkvKiBUcmF2ZXJzZSBiYWNrd2FyZHM6IGdpdmVzIHVzIG9sZGVzdCwgd2hpY2ggaXMgcm91Z2hseSBMUlUgKi8KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBOVUxMLCAqdG1wOwotCWludCBkcm9wcGVkID0gMDsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShoLCBjaGFpbiwgbGlzdCkgewotCQl0bXAgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlpZiAoIXRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJnRtcC0+c3RhdHVzKSkgewotCQkJY3QgPSB0bXA7Ci0JCQlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCWlmICghY3QpCi0JCXJldHVybiBkcm9wcGVkOwotCi0JaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7Ci0JCWRlYXRoX2J5X3RpbWVvdXQoKHVuc2lnbmVkIGxvbmcpY3QpOwotCQlkcm9wcGVkID0gMTsKLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhlYXJseV9kcm9wKTsKLQl9Ci0JaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0JcmV0dXJuIGRyb3BwZWQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqCi1fX2lwX2Nvbm50cmFja19oZWxwZXJfZmluZCggY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmg7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZoZWxwZXJzLCBsaXN0KSB7Ci0JCWlmIChpcF9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmgtPnR1cGxlLCAmaC0+bWFzaykpCi0JCQlyZXR1cm4gaDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICoKLWlwX2Nvbm50cmFja19oZWxwZXJfZmluZF9nZXQoIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7Ci0KLQkvKiBuZWVkIGlwX2Nvbm50cmFja19sb2NrIHRvIGFzc3VyZSB0aGF0IGhlbHBlciBleGlzdHMgdW50aWwKLQkgKiB0cnlfbW9kdWxlX2dldCgpIGlzIGNhbGxlZCAqLwotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JaGVscGVyID0gX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmQodHVwbGUpOwotCWlmIChoZWxwZXIpIHsKLQkJLyogbmVlZCB0byBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgdG8gYXNzdXJlIGhlbHBlciB3aWxsCi0JCSAqIG5vdCBnbyBhd2F5IHdoaWxlIHRoZSBjYWxsZXIgaXMgZS5nLiBidXN5IHB1dHRpbmcgYQotCQkgKiBjb25udHJhY2sgaW4gdGhlIGhhc2ggdGhhdCB1c2VzIHRoZSBoZWxwZXIgKi8KLQkJaWYgKCF0cnlfbW9kdWxlX2dldChoZWxwZXItPm1lKSkKLQkJCWhlbHBlciA9IE5VTEw7Ci0JfQotCi0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBoZWxwZXI7Ci19Ci0KLXZvaWQgaXBfY29ubnRyYWNrX2hlbHBlcl9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcikKLXsKLQltb2R1bGVfcHV0KGhlbHBlci0+bWUpOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICoKLV9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQodV9pbnQ4X3QgcHJvdG9jb2wpCi17Ci0JcmV0dXJuIGlwX2N0X3Byb3Rvc1twcm90b2NvbF07Ci19Ci0KLS8qIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIGEgdmFsaWQgcHJvdG9jb2wgaGVscGVyLCBzaW5jZQotICogaXQgZmFsbHMgYmFjayB0byBnZW5lcmljX3Byb3RvY29sICovCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICoKLWlwX2Nvbm50cmFja19wcm90b19maW5kX2dldCh1X2ludDhfdCBwcm90b2NvbCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXAgPSBfX2lwX2Nvbm50cmFja19wcm90b19maW5kKHByb3RvY29sKTsKLQlpZiAocCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHAtPm1lKSkKLQkJCXAgPSAmaXBfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXZvaWQgaXBfY29ubnRyYWNrX3Byb3RvX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwKQotewotCW1vZHVsZV9wdXQocC0+bWUpOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrICppcF9jb25udHJhY2tfYWxsb2Moc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZywKLQkJCQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqcmVwbCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2s7Ci0KLQlpZiAoIWlwX2Nvbm50cmFja19oYXNoX3JuZF9pbml0dGVkKSB7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmlwX2Nvbm50cmFja19oYXNoX3JuZCwgNCk7Ci0JCWlwX2Nvbm50cmFja19oYXNoX3JuZF9pbml0dGVkID0gMTsKLQl9Ci0KLQkvKiBXZSBkb24ndCB3YW50IGFueSByYWNlIGNvbmRpdGlvbiBhdCBlYXJseSBkcm9wIHN0YWdlICovCi0JYXRvbWljX2luYygmaXBfY29ubnRyYWNrX2NvdW50KTsKLQotCWlmIChpcF9jb25udHJhY2tfbWF4Ci0JICAgICYmIGF0b21pY19yZWFkKCZpcF9jb25udHJhY2tfY291bnQpID4gaXBfY29ubnRyYWNrX21heCkgewotCQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfY29ubnRyYWNrKG9yaWcpOwotCQkvKiBUcnkgZHJvcHBpbmcgZnJvbSB0aGlzIGhhc2ggY2hhaW4uICovCi0JCWlmICghZWFybHlfZHJvcCgmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0pKSB7Ci0JCQlhdG9taWNfZGVjKCZpcF9jb25udHJhY2tfY291bnQpOwotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgICAgICJpcF9jb25udHJhY2s6IHRhYmxlIGZ1bGwsIGRyb3BwaW5nIgotCQkJCSAgICAgICAiIHBhY2tldC5cbiIpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCX0KLQl9Ci0KLQljb25udHJhY2sgPSBrbWVtX2NhY2hlX3phbGxvYyhpcF9jb25udHJhY2tfY2FjaGVwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNvbm50cmFjaykgewotCQlERUJVR1AoIkNhbid0IGFsbG9jYXRlIGNvbm50cmFjay5cbiIpOwotCQlhdG9taWNfZGVjKCZpcF9jb25udHJhY2tfY291bnQpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZjb25udHJhY2stPmN0X2dlbmVyYWwudXNlLCAxKTsKLQljb25udHJhY2stPmN0X2dlbmVyYWwuZGVzdHJveSA9IGRlc3Ryb3lfY29ubnRyYWNrOwotCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUgPSAqb3JpZzsKLQljb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKnJlcGw7Ci0JLyogRG9uJ3Qgc2V0IHRpbWVyIHlldDogd2FpdCBmb3IgY29uZmlybWF0aW9uICovCi0JaW5pdF90aW1lcigmY29ubnRyYWNrLT50aW1lb3V0KTsKLQljb25udHJhY2stPnRpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNvbm50cmFjazsKLQljb25udHJhY2stPnRpbWVvdXQuZnVuY3Rpb24gPSBkZWF0aF9ieV90aW1lb3V0OwotCi0JcmV0dXJuIGNvbm50cmFjazsKLX0KLQotdm9pZAotaXBfY29ubnRyYWNrX2ZyZWUoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCWF0b21pY19kZWMoJmlwX2Nvbm50cmFja19jb3VudCk7Ci0Ja21lbV9jYWNoZV9mcmVlKGlwX2Nvbm50cmFja19jYWNoZXAsIGNvbm50cmFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGNvbm50cmFjazogd2UgcmV0dXJuIC1FTk9NRU0gaWYgY2xhc3NpZmljYXRpb24KLSAqIGZhaWxlZCBkdWUgdG8gc3RyZXNzLiAgIE90aGVyd2lzZSBpdCByZWFsbHkgaXMgdW5jbGFzc2lmaWFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotaW5pdF9jb25udHJhY2soc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sLAotCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjazsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHJlcGxfdHVwbGU7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQotCWlmICghaXBfY3RfaW52ZXJ0X3R1cGxlKCZyZXBsX3R1cGxlLCB0dXBsZSwgcHJvdG9jb2wpKSB7Ci0JCURFQlVHUCgiQ2FuJ3QgaW52ZXJ0IHR1cGxlLlxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNvbm50cmFjayA9IGlwX2Nvbm50cmFja19hbGxvYyh0dXBsZSwgJnJlcGxfdHVwbGUpOwotCWlmIChjb25udHJhY2sgPT0gTlVMTCB8fCBJU19FUlIoY29ubnRyYWNrKSkKLQkJcmV0dXJuIChzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiljb25udHJhY2s7Ci0KLQlpZiAoIXByb3RvY29sLT5uZXcoY29ubnRyYWNrLCBza2IpKSB7Ci0JCWlwX2Nvbm50cmFja19mcmVlKGNvbm50cmFjayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlleHAgPSBmaW5kX2V4cGVjdGF0aW9uKHR1cGxlKTsKLQotCWlmIChleHApIHsKLQkJREVCVUdQKCJjb25udHJhY2s6IGV4cGVjdGF0aW9uIGFycml2ZXMgY3Q9JXAgZXhwPSVwXG4iLAotCQkJY29ubnRyYWNrLCBleHApOwotCQkvKiBXZWxjb21lLCBNci4gQm9uZC4gIFdlJ3ZlIGJlZW4gZXhwZWN0aW5nIHlvdS4uLiAqLwotCQlfX3NldF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKLQkJY29ubnRyYWNrLT5tYXN0ZXIgPSBleHAtPm1hc3RlcjsKLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksKLQkJY29ubnRyYWNrLT5tYXJrID0gZXhwLT5tYXN0ZXItPm1hcms7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFX01PRFVMRSkKLQkJLyogdGhpcyBpcyB1Z2x5LCBidXQgdGhlcmUgaXMgbm8gb3RoZXIgcGxhY2Ugd2hlcmUgdG8gcHV0IGl0ICovCi0JCWNvbm50cmFjay0+bmF0Lm1hc3FfaW5kZXggPSBleHAtPm1hc3Rlci0+bmF0Lm1hc3FfaW5kZXg7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX1NFQ01BUksKLQkJY29ubnRyYWNrLT5zZWNtYXJrID0gZXhwLT5tYXN0ZXItPnNlY21hcms7Ci0jZW5kaWYKLQkJbmZfY29ubnRyYWNrX2dldCgmY29ubnRyYWNrLT5tYXN0ZXItPmN0X2dlbmVyYWwpOwotCQlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X25ldyk7Ci0JfSBlbHNlIHsKLQkJY29ubnRyYWNrLT5oZWxwZXIgPSBfX2lwX2Nvbm50cmFja19oZWxwZXJfZmluZCgmcmVwbF90dXBsZSk7Ci0KLQkJQ09OTlRSQUNLX1NUQVRfSU5DKG5ldyk7Ci0JfQotCi0JLyogT3ZlcmxvYWQgdHVwbGUgbGlua2VkIGxpc3QgdG8gcHV0IHVzIGluIHVuY29uZmlybWVkIGxpc3QuICovCi0JbGlzdF9hZGQoJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCwgJnVuY29uZmlybWVkKTsKLQotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JaWYgKGV4cCkgewotCQlpZiAoZXhwLT5leHBlY3RmbikKLQkJCWV4cC0+ZXhwZWN0Zm4oY29ubnRyYWNrLCBleHApOwotCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCX0KLQotCXJldHVybiAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXTsKLX0KLQotLyogT24gc3VjY2VzcywgcmV0dXJucyBjb25udHJhY2sgcHRyLCBzZXRzIHNrYi0+bmZjdCBhbmQgY3RpbmZvICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9jb25udHJhY2sgKgotcmVzb2x2ZV9ub3JtYWxfY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bywKLQkJICBpbnQgKnNldF9yZXBseSwKLQkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0KLQlJUF9ORl9BU1NFUlQoKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpID09IDApOwotCi0JaWYgKCFpcF9jdF9nZXRfdHVwbGUoc2tiLT5uaC5pcGgsIHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAotCQkJCSZ0dXBsZSxwcm90bykpCi0JCXJldHVybiBOVUxMOwotCi0JLyogbG9vayBmb3IgdHVwbGUgbWF0Y2ggKi8KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKSB7Ci0JCWggPSBpbml0X2Nvbm50cmFjaygmdHVwbGUsIHByb3RvLCBza2IpOwotCQlpZiAoIWgpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKElTX0VSUihoKSkKLQkJCXJldHVybiAodm9pZCAqKWg7Ci0JfQotCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQotCS8qIEl0IGV4aXN0czsgd2UgaGF2ZSAobm9uLWV4Y2x1c2l2ZSkgcmVmZXJlbmNlLiAqLwotCWlmIChESVJFQ1RJT04oaCkgPT0gSVBfQ1RfRElSX1JFUExZKSB7Ci0JCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZOwotCQkvKiBQbGVhc2Ugc2V0IHJlcGx5IGJpdCBpZiB0aGlzIHBhY2tldCBPSyAqLwotCQkqc2V0X3JlcGx5ID0gMTsKLQl9IGVsc2UgewotCQkvKiBPbmNlIHdlJ3ZlIGhhZCB0d28gd2F5IGNvbW1zLCBhbHdheXMgRVNUQUJMSVNIRUQuICovCi0JCWlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkgewotCQkJREVCVUdQKCJpcF9jb25udHJhY2tfaW46IG5vcm1hbCBwYWNrZXQgZm9yICVwXG4iLAotCQkJICAgICAgIGN0KTsKLQkJCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRDsKLQkJfSBlbHNlIGlmICh0ZXN0X2JpdChJUFNfRVhQRUNURURfQklULCAmY3QtPnN0YXR1cykpIHsKLQkJCURFQlVHUCgiaXBfY29ubnRyYWNrX2luOiByZWxhdGVkIHBhY2tldCBmb3IgJXBcbiIsCi0JCQkgICAgICAgY3QpOwotCQkJKmN0aW5mbyA9IElQX0NUX1JFTEFURUQ7Ci0JCX0gZWxzZSB7Ci0JCQlERUJVR1AoImlwX2Nvbm50cmFja19pbjogbmV3IHBhY2tldCBmb3IgJXBcbiIsCi0JCQkgICAgICAgY3QpOwotCQkJKmN0aW5mbyA9IElQX0NUX05FVzsKLQkJfQotCQkqc2V0X3JlcGx5ID0gMDsKLQl9Ci0Jc2tiLT5uZmN0ID0gJmN0LT5jdF9nZW5lcmFsOwotCXNrYi0+bmZjdGluZm8gPSAqY3RpbmZvOwotCXJldHVybiBjdDsKLX0KLQotLyogTmV0ZmlsdGVyIGhvb2sgaXRzZWxmLiAqLwotdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19pbih1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwotCWludCBzZXRfcmVwbHkgPSAwOwotCWludCByZXQ7Ci0KLQkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrIG9yIHVudHJhY2tlZCk/ICBJZ25vcmUuICovCi0JaWYgKCgqcHNrYiktPm5mY3QpIHsKLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhpZ25vcmUpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCS8qIE5ldmVyIGhhcHBlbiAqLwotCWlmICgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXBfY29ubnRyYWNrX2luOiBGcmFnIG9mIHByb3RvICV1IChob29rPSV1KVxuIiwKLQkJICAgICAgICgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wsIGhvb2tudW0pOwotCQl9Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotLyogRG9lc24ndCBjb3ZlciBsb2NhbGx5LWdlbmVyYXRlZCBicm9hZGNhc3QsIHNvIG5vdCB3b3J0aCBpdC4gKi8KLSNpZiAwCi0JLyogSWdub3JlIGJyb2FkY2FzdDogbm8gYGNvbm5lY3Rpb24nLiAqLwotCWlmICgoKnBza2IpLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKSB7Ci0JCXByaW50aygiQnJvYWRjYXN0IHBhY2tldCFcbiIpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0gZWxzZSBpZiAoKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIgJiBodG9ubCgweDAwMDAwMEZGKSkKLQkJICAgPT0gaHRvbmwoMHgwMDAwMDBGRikpIHsKLQkJcHJpbnRrKCJTaG91bGQgYmNhc3Q6ICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSAoc2s9JXAsIHB0eXBlPSV1KVxuIiwKLQkJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5zYWRkciksCi0JCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIpLAotCQkgICAgICAgKCpwc2tiKS0+c2ssICgqcHNrYiktPnBrdF90eXBlKTsKLQl9Ci0jZW5kaWYKLQotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwotCXByb3RvID0gX19pcF9jb25udHJhY2tfcHJvdG9fZmluZCgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sKTsKLQotCS8qIEl0IG1heSBiZSBhbiBzcGVjaWFsIHBhY2tldCwgZXJyb3IsIHVuY2xlYW4uLi4KLQkgKiBpbnZlcnNlIG9mIHRoZSByZXR1cm4gY29kZSB0ZWxscyB0byB0aGUgbmV0ZmlsdGVyCi0JICogY29yZSB3aGF0IHRvIGRvIHdpdGggdGhlIHBhY2tldC4gKi8KLQlpZiAocHJvdG8tPmVycm9yICE9IE5VTEwKLQkgICAgJiYgKHJldCA9IHByb3RvLT5lcnJvcigqcHNrYiwgJmN0aW5mbywgaG9va251bSkpIDw9IDApIHsKLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhlcnJvcik7Ci0JCUNPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoaW52YWxpZCk7Ci0JCXJldHVybiAtcmV0OwotCX0KLQotCWlmICghKGN0ID0gcmVzb2x2ZV9ub3JtYWxfY3QoKnBza2IsIHByb3RvLCZzZXRfcmVwbHksaG9va251bSwmY3RpbmZvKSkpIHsKLQkJLyogTm90IHZhbGlkIHBhcnQgb2YgYSBjb25uZWN0aW9uICovCi0JCUNPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoaW52YWxpZCk7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JaWYgKElTX0VSUihjdCkpIHsKLQkJLyogVG9vIHN0cmVzc2VkIHRvIGRlYWwuICovCi0JCUNPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoZHJvcCk7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotCUlQX05GX0FTU0VSVCgoKnBza2IpLT5uZmN0KTsKLQotCXJldCA9IHByb3RvLT5wYWNrZXQoY3QsICpwc2tiLCBjdGluZm8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCS8qIEludmFsaWQ6IGludmVyc2Ugb2YgdGhlIHJldHVybiBjb2RlIHRlbGxzCi0JCSAqIHRoZSBuZXRmaWx0ZXIgY29yZSB3aGF0IHRvIGRvKi8KLQkJbmZfY29ubnRyYWNrX3B1dCgoKnBza2IpLT5uZmN0KTsKLQkJKCpwc2tiKS0+bmZjdCA9IE5VTEw7Ci0JCUNPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoaW52YWxpZCk7Ci0JCXJldHVybiAtcmV0OwotCX0KLQotCWlmIChzZXRfcmVwbHkgJiYgIXRlc3RfYW5kX3NldF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cykpCi0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1NUQVRVUywgKnBza2IpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0JaW50IHJldDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwcm90byA9IF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQob3JpZy0+ZHN0LnByb3RvbnVtKTsKLQlyZXQgPSBpcF9jdF9pbnZlcnRfdHVwbGUoaW52ZXJzZSwgb3JpZywgcHJvdG8pOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogV291bGQgdHdvIGV4cGVjdGVkIHRoaW5ncyBjbGFzaD8gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9jbGFzaChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYikKLXsKLQkvKiBQYXJ0IGNvdmVyZWQgYnkgaW50ZXJzZWN0aW9uIG9mIG1hc2tzIG11c3QgYmUgdW5lcXVhbCwKLQkgICBvdGhlcndpc2UgdGhleSBjbGFzaCAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgaW50ZXJzZWN0X21hc2sKLQkJPSB7IHsgYS0+bWFzay5zcmMuaXAgJiBiLT5tYXNrLnNyYy5pcCwKLQkJICAgICAgeyBhLT5tYXNrLnNyYy51LmFsbCAmIGItPm1hc2suc3JjLnUuYWxsIH0gfSwKLQkJICAgIHsgYS0+bWFzay5kc3QuaXAgJiBiLT5tYXNrLmRzdC5pcCwKLQkJICAgICAgeyBhLT5tYXNrLmRzdC51LmFsbCAmIGItPm1hc2suZHN0LnUuYWxsIH0sCi0JCSAgICAgIGEtPm1hc2suZHN0LnByb3RvbnVtICYgYi0+bWFzay5kc3QucHJvdG9udW0gfSB9OwotCi0JcmV0dXJuIGlwX2N0X3R1cGxlX21hc2tfY21wKCZhLT50dXBsZSwgJmItPnR1cGxlLCAmaW50ZXJzZWN0X21hc2spOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBleHBlY3RfbWF0Y2hlcyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYSwKLQkJCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmIpCi17Ci0JcmV0dXJuIGEtPm1hc3RlciA9PSBiLT5tYXN0ZXIKLQkJJiYgaXBfY3RfdHVwbGVfZXF1YWwoJmEtPnR1cGxlLCAmYi0+dHVwbGUpCi0JCSYmIGlwX2N0X3R1cGxlX2VxdWFsKCZhLT5tYXNrLCAmYi0+bWFzayk7Ci19Ci0KLS8qIEdlbmVyYWxseSBhIGJhZCBpZGVhIHRvIGNhbGwgdGhpczogY291bGQgaGF2ZSBtYXRjaGVkIGFscmVhZHkuICovCi12b2lkIGlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JLyogY2hvb3NlIHRoZSB0aGUgb2xkZXN0IGV4cGVjdGF0aW9uIHRvIGV2aWN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGV4cGVjdF9tYXRjaGVzKGksIGV4cCkgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci19Ci0KLS8qIFdlIGRvbid0IGluY3JlYXNlIHRoZSBtYXN0ZXIgY29ubnRyYWNrIHJlZmNvdW50IGZvciBub24tZnVsZmlsbGVkCi0gKiBjb25udHJhY2tzLiBEdXJpbmcgdGhlIGNvbm50cmFjayBkZXN0cnVjdGlvbiwgdGhlIGV4cGVjdGF0aW9ucyBhcmUKLSAqIGFsd2F5cyBraWxsZWQgYmVmb3JlIHRoZSBjb25udHJhY2sgaXRzZWxmICovCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptZSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqbmV3OwotCi0JbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhpcF9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuZXcpIHsKLQkJREVCVUdQKCJleHBlY3RfcmVsYXRlZDogT09NIGFsbG9jYXRpbmcgZXhwZWN0XG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5ldy0+bWFzdGVyID0gbWU7Ci0JYXRvbWljX3NldCgmbmV3LT51c2UsIDEpOwotCXJldHVybiBuZXc7Ci19Ci0KLXZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZXhwLT51c2UpKQotCQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19leHBlY3RfaW5zZXJ0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JYXRvbWljX2luYygmZXhwLT51c2UpOwotCWV4cC0+bWFzdGVyLT5leHBlY3RpbmcrKzsKLQlsaXN0X2FkZCgmZXhwLT5saXN0LCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKLQotCWluaXRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0JZXhwLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylleHA7Ci0JZXhwLT50aW1lb3V0LmZ1bmN0aW9uID0gZXhwZWN0YXRpb25fdGltZWRfb3V0OwotCWV4cC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGV4cC0+bWFzdGVyLT5oZWxwZXItPnRpbWVvdXQgKiBIWjsKLQlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0KLQlleHAtPmlkID0gKytpcF9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7Ci0JYXRvbWljX2luYygmZXhwLT51c2UpOwotCUNPTk5UUkFDS19TVEFUX0lOQyhleHBlY3RfY3JlYXRlKTsKLX0KLQotLyogUmFjZSB3aXRoIGV4cGVjdGF0aW9ucyBiZWluZyB1c2VkIG1lYW5zIHdlIGNvdWxkIGhhdmUgbm9uZSB0byBmaW5kOyBPSy4gKi8KLXN0YXRpYyB2b2lkIGV2aWN0X29sZGVzdF9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGktPm1hc3RlciA9PSBtYXN0ZXIpIHsKLQkJCWlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCByZWZyZXNoX3RpbWVyKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppKQotewotCWlmICghZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkKLQkJcmV0dXJuIDA7Ci0KLQlpLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgaS0+bWFzdGVyLT5oZWxwZXItPnRpbWVvdXQqSFo7Ci0JYWRkX3RpbWVyKCZpLT50aW1lb3V0KTsKLQlyZXR1cm4gMTsKLX0KLQotaW50IGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwotCWludCByZXQ7Ci0KLQlERUJVR1AoImlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZCAlcFxuIiwgcmVsYXRlZF90byk7Ci0JREVCVUdQKCJ0dXBsZTogIik7IERVTVBfVFVQTEUoJmV4cGVjdC0+dHVwbGUpOwotCURFQlVHUCgibWFzazogICIpOyBEVU1QX1RVUExFKCZleHBlY3QtPm1hc2spOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwZWN0KSkgewotCQkJLyogUmVmcmVzaCB0aW1lcjogaWYgaXQncyBkeWluZywgaWdub3JlLi4gKi8KLQkJCWlmIChyZWZyZXNoX3RpbWVyKGkpKSB7Ci0JCQkJcmV0ID0gMDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfSBlbHNlIGlmIChleHBlY3RfY2xhc2goaSwgZXhwZWN0KSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBXaWxsIGJlIG92ZXIgbGltaXQ/ICovCi0JaWYgKGV4cGVjdC0+bWFzdGVyLT5oZWxwZXItPm1heF9leHBlY3RlZCAmJgotCSAgICBleHBlY3QtPm1hc3Rlci0+ZXhwZWN0aW5nID49IGV4cGVjdC0+bWFzdGVyLT5oZWxwZXItPm1heF9leHBlY3RlZCkKLQkJZXZpY3Rfb2xkZXN0X2V4cGVjdChleHBlY3QtPm1hc3Rlcik7Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X2luc2VydChleHBlY3QpOwotCWlwX2Nvbm50cmFja19leHBlY3RfZXZlbnQoSVBFWFBfTkVXLCBleHBlY3QpOwotCXJldCA9IDA7Ci1vdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogQWx0ZXIgcmVwbHkgdHVwbGUgKG1heWJlIGFsdGVyIGhlbHBlcikuICBUaGlzIGlzIGZvciBOQVQsIGFuZCBpcwotICAgaW1wbGljaXRseSByYWN5OiBzZWUgX19pcF9jb25udHJhY2tfY29uZmlybSAqLwotdm9pZCBpcF9jb25udHJhY2tfYWx0ZXJfcmVwbHkoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbmV3cmVwbHkpCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCS8qIFNob3VsZCBiZSB1bmNvbmZpcm1lZCwgc28gbm90IGluIGhhc2ggdGFibGUgeWV0ICovCi0JSVBfTkZfQVNTRVJUKCFpc19jb25maXJtZWQoY29ubnRyYWNrKSk7Ci0KLQlERUJVR1AoIkFsdGVyaW5nIHJlcGx5IHR1cGxlIG9mICVwIHRvICIsIGNvbm50cmFjayk7Ci0JRFVNUF9UVVBMRShuZXdyZXBseSk7Ci0KLQljb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKm5ld3JlcGx5OwotCWlmICghY29ubnRyYWNrLT5tYXN0ZXIgJiYgY29ubnRyYWNrLT5leHBlY3RpbmcgPT0gMCkKLQkJY29ubnRyYWNrLT5oZWxwZXIgPSBfX2lwX2Nvbm50cmFja19oZWxwZXJfZmluZChuZXdyZXBseSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci19Ci0KLWludCBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICptZSkKLXsKLQlCVUdfT04obWUtPnRpbWVvdXQgPT0gMCk7Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfYWRkKCZtZS0+bGlzdCwgJmhlbHBlcnMpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICoKLV9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmaGVscGVycywgbGlzdCkgewotCQlpZiAoIXN0cmNtcChoLT5uYW1lLCBuYW1lKSkKLQkJCXJldHVybiBoOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5oZWxwKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKm1lKQotewotCWlmICh0dXBsZWhhc2hfdG9fY3RyYWNrKGkpLT5oZWxwZXIgPT0gbWUpIHsKLQkJaXBfY29ubnRyYWNrX2V2ZW50KElQQ1RfSEVMUEVSLCB0dXBsZWhhc2hfdG9fY3RyYWNrKGkpKTsKLQkJdHVwbGVoYXNoX3RvX2N0cmFjayhpKS0+aGVscGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICptZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKLQotCS8qIE5lZWQgd3JpdGUgbG9jayBoZXJlLCB0byBkZWxldGUgaGVscGVyLiAqLwotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlsaXN0X2RlbCgmbWUtPmxpc3QpOwotCi0JLyogR2V0IHJpZCBvZiBleHBlY3RhdGlvbnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXhwLCB0bXAsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGV4cC0+bWFzdGVyLT5oZWxwZXIgPT0gbWUgJiYgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7Ci0JCQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQl9Ci0JfQotCS8qIEdldCByaWQgb2YgZXhwZWN0ZWRzLCBzZXQgaGVscGVycyB0byBOVUxMLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJnVuY29uZmlybWVkLCBsaXN0KQotCQl1bmhlbHAoaCwgbWUpOwotCWZvciAoaSA9IDA7IGkgPCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZpcF9jb25udHJhY2tfaGFzaFtpXSwgbGlzdCkKLQkJCXVuaGVscChoLCBtZSk7Ci0JfQotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JLyogU29tZW9uZSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBoZWxwZXIgaW4gYSBiaC4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKLX0KLQotLyogUmVmcmVzaCBjb25udHJhY2sgZm9yIHRoaXMgbWFueSBqaWZmaWVzIGFuZCBkbyBhY2NvdW50aW5nIGlmIGRvX2FjY3QgaXMgMSAqLwotdm9pZCBfX2lwX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXVuc2lnbmVkIGxvbmcgZXh0cmFfamlmZmllcywKLQkJCWludCBkb19hY2N0KQotewotCWludCBldmVudCA9IDA7Ci0KLQlJUF9ORl9BU1NFUlQoY3QtPnRpbWVvdXQuZGF0YSA9PSAodW5zaWduZWQgbG9uZyljdCk7Ci0JSVBfTkZfQVNTRVJUKHNrYik7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBPbmx5IHVwZGF0ZSBpZiB0aGlzIGlzIG5vdCBhIGZpeGVkIHRpbWVvdXQgKi8KLQlpZiAodGVzdF9iaXQoSVBTX0ZJWEVEX1RJTUVPVVRfQklULCAmY3QtPnN0YXR1cykpIHsKLQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJZiBub3QgaW4gaGFzaCB0YWJsZSwgdGltZXIgd2lsbCBub3QgYmUgYWN0aXZlIHlldCAqLwotCWlmICghaXNfY29uZmlybWVkKGN0KSkgewotCQljdC0+dGltZW91dC5leHBpcmVzID0gZXh0cmFfamlmZmllczsKLQkJZXZlbnQgPSBJUENUX1JFRlJFU0g7Ci0JfSBlbHNlIHsKLQkJLyogTmVlZCBkZWxfdGltZXIgZm9yIHJhY2UgYXZvaWRhbmNlIChtYXkgYWxyZWFkeSBiZSBkeWluZykuICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewotCQkJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBleHRyYV9qaWZmaWVzOwotCQkJYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0JCQlldmVudCA9IElQQ1RfUkVGUkVTSDsKLQkJfQotCX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DVF9BQ0NUCi0JaWYgKGRvX2FjY3QpIHsKLQkJY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0ucGFja2V0cysrOwotCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyArPQotCQkJCQkJbnRvaHMoc2tiLT5uaC5pcGgtPnRvdF9sZW4pOwotCQlpZiAoKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMgJiAweDgwMDAwMDAwKQotCQkgICAgfHwgKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICYgMHg4MDAwMDAwMCkpCi0JCQlldmVudCB8PSBJUENUX0NPVU5URVJfRklMTElORzsKLQl9Ci0jZW5kaWYKLQotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JLyogbXVzdCBiZSB1bmxvY2tlZCB3aGVuIGNhbGxpbmcgZXZlbnQgY2FjaGUgKi8KLQlpZiAoZXZlbnQpCi0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShldmVudCwgc2tiKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotLyogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdGNwL3VkcC9zY3RwL2RjY3AgYW5kIGFsaWtlLiBUaGlzIG5lZWRzIHRvIGJlCi0gKiBpbiBpcF9jb25udHJhY2tfY29yZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGUgcHJvdG9jb2xzIHRvIGF1dG9sb2FkCi0gKiBvciBkZXBlbmQgb24gY3RuZXRsaW5rICovCi1pbnQgaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX1NSQ19QT1JULCBzaXplb2YoX19iZTE2KSwKLQkJJnR1cGxlLT5zcmMudS50Y3AucG9ydCk7Ci0JTkZBX1BVVChza2IsIENUQV9QUk9UT19EU1RfUE9SVCwgc2l6ZW9mKF9fYmUxNiksCi0JCSZ0dXBsZS0+ZHN0LnUudGNwLnBvcnQpOwotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCi17Ci0JaWYgKCF0YltDVEFfUFJPVE9fU1JDX1BPUlQtMV0gfHwgIXRiW0NUQV9QUk9UT19EU1RfUE9SVC0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0LT5zcmMudS50Y3AucG9ydCA9Ci0JCSooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX1NSQ19QT1JULTFdKTsKLQl0LT5kc3QudS50Y3AucG9ydCA9Ci0JCSooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0RTVF9QT1JULTFdKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIFJldHVybnMgbmV3IHNrX2J1ZmYsIG9yIE5VTEwgKi8KLXN0cnVjdCBza19idWZmICoKLWlwX2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcikKLXsKLQlza2Jfb3JwaGFuKHNrYik7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0Jc2tiID0gaXBfZGVmcmFnKHNrYiwgdXNlcik7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7Ci0KLQlpZiAoc2tiKQotCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKLQlyZXR1cm4gc2tiOwotfQotCi0vKiBVc2VkIGJ5IGlwdF9SRUpFQ1QuICovCi1zdGF0aWMgdm9pZCBpcF9jb25udHJhY2tfYXR0YWNoKHN0cnVjdCBza19idWZmICpuc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCi0JLyogVGhpcyBJQ01QIGlzIGluIHJldmVyc2UgZGlyZWN0aW9uIHRvIHRoZSBwYWNrZXQgd2hpY2ggY2F1c2VkIGl0ICovCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0KLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZOwotCWVsc2UKLQkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKLQotCS8qIEF0dGFjaCB0byBuZXcgc2tidWZmLCBhbmQgaW5jcmVtZW50IGNvdW50ICovCi0JbnNrYi0+bmZjdCA9ICZjdC0+Y3RfZ2VuZXJhbDsKLQluc2tiLT5uZmN0aW5mbyA9IGN0aW5mbzsKLQluZl9jb25udHJhY2tfZ2V0KG5za2ItPm5mY3QpOwotfQotCi0vKiBCcmluZyBvdXQgeWEgZGVhZCEgKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrICoKLWdldF9uZXh0X2NvcnBzZShpbnQgKCppdGVyKShzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICpkYXRhKSwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50ICpidWNrZXQpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWZvciAoOyAqYnVja2V0IDwgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOyAoKmJ1Y2tldCkrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZpcF9jb25udHJhY2tfaGFzaFsqYnVja2V0XSwgbGlzdCkgewotCQkJY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQkJaWYgKGl0ZXIoY3QsIGRhdGEpKQotCQkJCWdvdG8gZm91bmQ7Ci0JCX0KLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmdW5jb25maXJtZWQsIGxpc3QpIHsKLQkJY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlpZiAoaXRlcihjdCwgZGF0YSkpCi0JCQlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIE5VTEw7Ci0KLWZvdW5kOgotCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIGN0OwotfQotCi12b2lkCi1pcF9jdF9pdGVyYXRlX2NsZWFudXAoaW50ICgqaXRlcikoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQl1bnNpZ25lZCBpbnQgYnVja2V0ID0gMDsKLQotCXdoaWxlICgoY3QgPSBnZXRfbmV4dF9jb3Jwc2UoaXRlciwgZGF0YSwgJmJ1Y2tldCkpICE9IE5VTEwpIHsKLQkJLyogVGltZSB0byBwdXNoIHVwIGRhaXNlcy4uLiAqLwotCQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCi0JCQlkZWF0aF9ieV90aW1lb3V0KCh1bnNpZ25lZCBsb25nKWN0KTsKLQkJLyogLi4uIGVsc2UgdGhlIHRpbWVyIHdpbGwgZ2V0IGhpbSBzb29uLiAqLwotCi0JCWlwX2Nvbm50cmFja19wdXQoY3QpOwotCX0KLX0KLQotLyogRmFzdCBmdW5jdGlvbiBmb3IgdGhvc2Ugd2hvIGRvbid0IHdhbnQgdG8gcGFyc2UgL3Byb2MgKGFuZCBJIGRvbid0Ci0gICBibGFtZSB0aGVtKS4gKi8KLS8qIFJldmVyc2luZyB0aGUgc29ja2V0J3MgZHN0L3NyYyBwb2ludCBvZiB2aWV3IGdpdmVzIHVzIHRoZSByZXBseQotICAgbWFwcGluZy4gKi8KLXN0YXRpYyBpbnQKLWdldG9yaWdkc3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0dmFsLCB2b2lkIF9fdXNlciAqdXNlciwgaW50ICpsZW4pCi17Ci0Jc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCi0JSVBfQ1RfVFVQTEVfVV9CTEFOSygmdHVwbGUpOwotCXR1cGxlLnNyYy5pcCA9IGluZXQtPnJjdl9zYWRkcjsKLQl0dXBsZS5zcmMudS50Y3AucG9ydCA9IGluZXQtPnNwb3J0OwotCXR1cGxlLmRzdC5pcCA9IGluZXQtPmRhZGRyOwotCXR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaW5ldC0+ZHBvcnQ7Ci0JdHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0KLQkvKiBXZSBvbmx5IGRvIFRDUCBhdCB0aGUgbW9tZW50OiBpcyB0aGVyZSBhIGJldHRlciB3YXk/ICovCi0JaWYgKHN0cmNtcChzay0+c2tfcHJvdC0+bmFtZSwgIlRDUCIpKSB7Ci0JCURFQlVHUCgiU09fT1JJR0lOQUxfRFNUOiBOb3QgYSBUQ1Agc29ja2V0XG4iKTsKLQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQl9Ci0KLQlpZiAoKHVuc2lnbmVkIGludCkgKmxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSB7Ci0JCURFQlVHUCgiU09fT1JJR0lOQUxfRFNUOiBsZW4gJXUgbm90ICV1XG4iLAotCQkgICAgICAgKmxlbiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKGgpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLnNpbl9wb3J0ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCi0JCQkudHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KLQkJCS50dXBsZS5kc3QuaXA7Ci0JCW1lbXNldChzaW4uc2luX3plcm8sIDAsIHNpemVvZihzaW4uc2luX3plcm8pKTsKLQotCQlERUJVR1AoIlNPX09SSUdJTkFMX0RTVDogJXUuJXUuJXUuJXUgJXVcbiIsCi0JCSAgICAgICBOSVBRVUFEKHNpbi5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4uc2luX3BvcnQpKTsKLQkJaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJnNpbiwgc2l6ZW9mKHNpbikpICE9IDApCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCURFQlVHUCgiU09fT1JJR0lOQUxfRFNUOiBDYW4ndCBmaW5kICV1LiV1LiV1LiV1LyV1LSV1LiV1LiV1LiV1LyV1LlxuIiwKLQkgICAgICAgTklQUVVBRCh0dXBsZS5zcmMuaXApLCBudG9ocyh0dXBsZS5zcmMudS50Y3AucG9ydCksCi0JICAgICAgIE5JUFFVQUQodHVwbGUuZHN0LmlwKSwgbnRvaHModHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQlyZXR1cm4gLUVOT0VOVDsKLX0KLQotc3RhdGljIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyBzb19nZXRvcmlnZHN0ID0gewotCS5wZgkJPSBQRl9JTkVULAotCS5nZXRfb3B0bWluCT0gU09fT1JJR0lOQUxfRFNULAotCS5nZXRfb3B0bWF4CT0gU09fT1JJR0lOQUxfRFNUKzEsCi0JLmdldAkJPSAmZ2V0b3JpZ2RzdCwKLX07Ci0KLXN0YXRpYyBpbnQga2lsbF9hbGwoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBpcF9jb25udHJhY2tfZmx1c2godm9pZCkKLXsKLQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9hbGwsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2Nvbm50cmFja19oYXNoKHN0cnVjdCBsaXN0X2hlYWQgKmhhc2gsIGludCB2bWFsbG9jZWQsaW50IHNpemUpCi17Ci0JaWYgKHZtYWxsb2NlZCkKLQkJdmZyZWUoaGFzaCk7Ci0JZWxzZQotCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhc2gsCi0JCQkgICBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogc2l6ZSkpOwotfQotCi0vKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKLSAgIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuICovCi12b2lkIGlwX2Nvbm50cmFja19jbGVhbnVwKHZvaWQpCi17Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X2F0dGFjaCwgTlVMTCk7Ci0KLQkvKiBUaGlzIG1ha2VzIHN1cmUgYWxsIGN1cnJlbnQgcGFja2V0cyBoYXZlIHBhc3NlZCB0aHJvdWdoCi0JICAgbmV0ZmlsdGVyIGZyYW1ld29yay4gIFJvbGwgb24sIHR3by1zdGFnZSBtb2R1bGUKLQkgICBkZWxldGUuLi4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKLQotCWlwX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKCk7Ci0gaV9zZWVfZGVhZF9wZW9wbGU6Ci0JaXBfY29ubnRyYWNrX2ZsdXNoKCk7Ci0JaWYgKGF0b21pY19yZWFkKCZpcF9jb25udHJhY2tfY291bnQpICE9IDApIHsKLQkJc2NoZWR1bGUoKTsKLQkJZ290byBpX3NlZV9kZWFkX3Blb3BsZTsKLQl9Ci0JLyogd2FpdCB1bnRpbCBhbGwgcmVmZXJlbmNlcyB0byBpcF9jb25udHJhY2tfdW50cmFja2VkIGFyZSBkcm9wcGVkICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZpcF9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWwudXNlKSA+IDEpCi0JCXNjaGVkdWxlKCk7Ci0KLQlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2NhY2hlcCk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwKTsKLQlmcmVlX2Nvbm50cmFja19oYXNoKGlwX2Nvbm50cmFja19oYXNoLCBpcF9jb25udHJhY2tfdm1hbGxvYywKLQkJCSAgICBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUpOwotCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICphbGxvY19oYXNodGFibGUoaW50IHNpemUsIGludCAqdm1hbGxvY2VkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2g7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQkqdm1hbGxvY2VkID0gMDsKLQloYXNoID0gKHZvaWQqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKLQkJCQkgICAgICAgZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKQotCQkJCQkJICogc2l6ZSkpOwotCWlmICghaGFzaCkgewotCQkqdm1hbGxvY2VkID0gMTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyJpcF9jb25udHJhY2s6IGZhbGxpbmcgYmFjayB0byB2bWFsbG9jLlxuIik7Ci0JCWhhc2ggPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSAqIHNpemUpOwotCX0KLQotCWlmIChoYXNoKQotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJSU5JVF9MSVNUX0hFQUQoJmhhc2hbaV0pOwotCi0JcmV0dXJuIGhhc2g7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JaW50IGksIGJ1Y2tldCwgaGFzaHNpemUsIHZtYWxsb2NlZDsKLQlpbnQgb2xkX3ZtYWxsb2NlZCwgb2xkX3NpemU7Ci0JaW50IHJuZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoLCAqb2xkX2hhc2g7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCi0JLyogT24gYm9vdCwgd2UgY2FuIHNldCB0aGlzIHdpdGhvdXQgYW55IGZhbmN5IGxvY2tpbmcuICovCi0JaWYgKCFpcF9jb25udHJhY2tfaHRhYmxlX3NpemUpCi0JCXJldHVybiBwYXJhbV9zZXRfaW50KHZhbCwga3ApOwotCi0JaGFzaHNpemUgPSBzaW1wbGVfc3RydG9sKHZhbCwgTlVMTCwgMCk7Ci0JaWYgKCFoYXNoc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQloYXNoID0gYWxsb2NfaGFzaHRhYmxlKGhhc2hzaXplLCAmdm1hbGxvY2VkKTsKLQlpZiAoIWhhc2gpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogV2UgaGF2ZSB0byByZWhhc2ggZm9yIHRoZSBuZXcgdGFibGUgYW55d2F5LCBzbyB3ZSBhbHNvIGNhbgotCSAqIHVzZSBhIG5ldyByYW5kb20gc2VlZCAqLwotCWdldF9yYW5kb21fYnl0ZXMoJnJuZCwgNCk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgmaXBfY29ubnRyYWNrX2hhc2hbaV0pKSB7Ci0JCQloID0gbGlzdF9lbnRyeShpcF9jb25udHJhY2tfaGFzaFtpXS5uZXh0LAotCQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2gsIGxpc3QpOwotCQkJbGlzdF9kZWwoJmgtPmxpc3QpOwotCQkJYnVja2V0ID0gX19oYXNoX2Nvbm50cmFjaygmaC0+dHVwbGUsIGhhc2hzaXplLCBybmQpOwotCQkJbGlzdF9hZGRfdGFpbCgmaC0+bGlzdCwgJmhhc2hbYnVja2V0XSk7Ci0JCX0KLQl9Ci0Jb2xkX3NpemUgPSBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0Jb2xkX3ZtYWxsb2NlZCA9IGlwX2Nvbm50cmFja192bWFsbG9jOwotCW9sZF9oYXNoID0gaXBfY29ubnRyYWNrX2hhc2g7Ci0KLQlpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgPSBoYXNoc2l6ZTsKLQlpcF9jb25udHJhY2tfdm1hbGxvYyA9IHZtYWxsb2NlZDsKLQlpcF9jb25udHJhY2tfaGFzaCA9IGhhc2g7Ci0JaXBfY29ubnRyYWNrX2hhc2hfcm5kID0gcm5kOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JZnJlZV9jb25udHJhY2tfaGFzaChvbGRfaGFzaCwgb2xkX3ZtYWxsb2NlZCwgb2xkX3NpemUpOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfcGFyYW1fY2FsbChoYXNoc2l6ZSwgc2V0X2hhc2hzaXplLCBwYXJhbV9nZXRfdWludCwKLQkJICAmaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplLCAwNjAwKTsKLQotaW50IF9faW5pdCBpcF9jb25udHJhY2tfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBpOwotCWludCByZXQ7Ci0KLQkvKiBJZGVhIGZyb20gdGNwLmM6IHVzZSAxLzE2Mzg0IG9mIG1lbW9yeS4gIE9uIGkzODY6IDMyTUIKLQkgKiBtYWNoaW5lIGhhcyAyNTYgYnVja2V0cy4gID49IDFHQiBtYWNoaW5lcyBoYXZlIDgxOTIgYnVja2V0cy4gKi8KLQlpZiAoIWlwX2Nvbm50cmFja19odGFibGVfc2l6ZSkgewotCQlpcF9jb25udHJhY2tfaHRhYmxlX3NpemUKLQkJCT0gKCgobnVtX3BoeXNwYWdlcyA8PCBQQUdFX1NISUZUKSAvIDE2Mzg0KQotCQkJICAgLyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpOwotCQlpZiAobnVtX3BoeXNwYWdlcyA+ICgxMDI0ICogMTAyNCAqIDEwMjQgLyBQQUdFX1NJWkUpKQotCQkJaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplID0gODE5MjsKLQkJaWYgKGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSA8IDE2KQotCQkJaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplID0gMTY7Ci0JfQotCWlwX2Nvbm50cmFja19tYXggPSA4ICogaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCi0JcHJpbnRrKCJpcF9jb25udHJhY2sgdmVyc2lvbiAlcyAoJXUgYnVja2V0cywgJWQgbWF4KSIKLQkgICAgICAgIiAtICVaZCBieXRlcyBwZXIgY29ubnRyYWNrXG4iLCBJUF9DT05OVFJBQ0tfVkVSU0lPTiwKLQkgICAgICAgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplLCBpcF9jb25udHJhY2tfbWF4LAotCSAgICAgICBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFjaykpOwotCi0JcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldGZpbHRlciBzb2NrZXQgb3B0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpcF9jb25udHJhY2tfaGFzaCA9IGFsbG9jX2hhc2h0YWJsZShpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsCi0JCQkJCSAgICAmaXBfY29ubnRyYWNrX3ZtYWxsb2MpOwotCWlmICghaXBfY29ubnRyYWNrX2hhc2gpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIGlwX2Nvbm50cmFja19oYXNoXG4iKTsKLQkJZ290byBlcnJfdW5yZWdfc29ja29wdDsKLQl9Ci0KLQlpcF9jb25udHJhY2tfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlwX2Nvbm50cmFjayIsCi0JCQkJCQlzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFjayksIDAsCi0JCQkJCQkwLCBOVUxMLCBOVUxMKTsKLQlpZiAoIWlwX2Nvbm50cmFja19jYWNoZXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIGlwX2Nvbm50cmFjayBzbGFiIGNhY2hlXG4iKTsKLQkJZ290byBlcnJfZnJlZV9oYXNoOwotCX0KLQotCWlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlwX2Nvbm50cmFja19leHBlY3QiLAotCQkJCQlzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QpLAotCQkJCQkwLCAwLCBOVUxMLCBOVUxMKTsKLQlpZiAoIWlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSBpcF9leHBlY3Qgc2xhYiBjYWNoZVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfY29ubnRyYWNrX3NsYWI7Ci0JfQotCi0JLyogRG9uJ3QgTkVFRCBsb2NrIGhlcmUsIGJ1dCBnb29kIGZvcm0gYW55d2F5LiAqLwotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQX0NUX1BST1RPOyBpKyspCi0JCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9wcm90b3NbaV0sICZpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbCk7Ci0JLyogU2V3IGluIGJ1aWx0aW4gcHJvdG9jb2xzLiAqLwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9wcm90b3NbSVBQUk9UT19UQ1BdLCAmaXBfY29ubnRyYWNrX3Byb3RvY29sX3RjcCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X3Byb3Rvc1tJUFBST1RPX1VEUF0sICZpcF9jb25udHJhY2tfcHJvdG9jb2xfdWRwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfcHJvdG9zW0lQUFJPVE9fSUNNUF0sICZpcF9jb25udHJhY2tfcHJvdG9jb2xfaWNtcCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBGb3IgdXNlIGJ5IGlwdF9SRUpFQ1QgKi8KLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfYXR0YWNoLCBpcF9jb25udHJhY2tfYXR0YWNoKTsKLQotCS8qIFNldCB1cCBmYWtlIGNvbm50cmFjazoKLQkgICAgLSB0byBuZXZlciBiZSBkZWxldGVkLCBub3QgaW4gYW55IGhhc2hlcyAqLwotCWF0b21pY19zZXQoJmlwX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UsIDEpOwotCS8qICAtIGFuZCBsb29rIGl0IGxpa2UgYXMgYSBjb25maXJtZWQgY29ubmVjdGlvbiAqLwotCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZpcF9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyk7Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnJfZnJlZV9jb25udHJhY2tfc2xhYjoKLQlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2NhY2hlcCk7Ci1lcnJfZnJlZV9oYXNoOgotCWZyZWVfY29ubnRyYWNrX2hhc2goaXBfY29ubnRyYWNrX2hhc2gsIGlwX2Nvbm50cmFja192bWFsbG9jLAotCQkJICAgIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci1lcnJfdW5yZWdfc29ja29wdDoKLQluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJnNvX2dldG9yaWdkc3QpOwotCi0JcmV0dXJuIC1FTk9NRU07Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhYTY4YS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qIEZUUCBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcuICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19mdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImZ0cCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOwotCi0vKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCdzIHNpbXBsZS4gLS1SUiAqLwotc3RhdGljIGNoYXIgKmZ0cF9idWZmZXI7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwX2Z0cF9sb2NrKTsKLQotI2RlZmluZSBNQVhfUE9SVFMgOAotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW01BWF9QT1JUU107Ci1zdGF0aWMgaW50IHBvcnRzX2M7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOwotCi1zdGF0aWMgaW50IGxvb3NlOwotbW9kdWxlX3BhcmFtKGxvb3NlLCBib29sLCAwNjAwKTsKLQotdW5zaWduZWQgaW50ICgqaXBfbmF0X2Z0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJZW51bSBpcF9jdF9mdHBfdHlwZSB0eXBlLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKLQkJCQl1MzIgKnNlcSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfZnRwX2hvb2spOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgdHJ5X3JmYzk1OShjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90IFtdLCBjaGFyKTsKLXN0YXRpYyBpbnQgdHJ5X2VwcnQoY29uc3QgY2hhciAqLCBzaXplX3QsIHVfaW50MzJfdCBbXSwgY2hhcik7Ci1zdGF0aWMgaW50IHRyeV9lcHN2X3Jlc3BvbnNlKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCB1X2ludDMyX3QgW10sIGNoYXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZ0cF9zZWFyY2ggewotCWNvbnN0IGNoYXIgKnBhdHRlcm47Ci0Jc2l6ZV90IHBsZW47Ci0JY2hhciBza2lwOwotCWNoYXIgdGVybTsKLQllbnVtIGlwX2N0X2Z0cF90eXBlIGZ0cHR5cGU7Ci0JaW50ICgqZ2V0bnVtKShjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90W10sIGNoYXIpOwotfSBzZWFyY2hbSVBfQ1RfRElSX01BWF1bMl0gPSB7Ci0JW0lQX0NUX0RJUl9PUklHSU5BTF0gPSB7Ci0JCXsKLQkJCS5wYXR0ZXJuCT0gICJQT1JUIiwKLQkJCS5wbGVuCQk9IHNpemVvZigiUE9SVCIpIC0gMSwKLQkJCS5za2lwCQk9ICcgJywKLQkJCS50ZXJtCQk9ICdccicsCi0JCQkuZnRwdHlwZQk9IElQX0NUX0ZUUF9QT1JULAotCQkJLmdldG51bQkJPSB0cnlfcmZjOTU5LAotCQl9LAotCQl7Ci0JCQkucGF0dGVybgk9ICJFUFJUIiwKLQkJCS5wbGVuCQk9IHNpemVvZigiRVBSVCIpIC0gMSwKLQkJCS5za2lwCQk9ICcgJywKLQkJCS50ZXJtCQk9ICdccicsCi0JCQkuZnRwdHlwZQk9IElQX0NUX0ZUUF9FUFJULAotCQkJLmdldG51bQkJPSB0cnlfZXBydCwKLQkJfSwKLQl9LAotCVtJUF9DVF9ESVJfUkVQTFldID0gewotCQl7Ci0JCQkucGF0dGVybgk9ICIyMjcgIiwKLQkJCS5wbGVuCQk9IHNpemVvZigiMjI3ICIpIC0gMSwKLQkJCS5za2lwCQk9ICcoJywKLQkJCS50ZXJtCQk9ICcpJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX1BBU1YsCi0JCQkuZ2V0bnVtCQk9IHRyeV9yZmM5NTksCi0JCX0sCi0JCXsKLQkJCS5wYXR0ZXJuCT0gIjIyOSAiLAotCQkJLnBsZW4JCT0gc2l6ZW9mKCIyMjkgIikgLSAxLAotCQkJLnNraXAJCT0gJygnLAotCQkJLnRlcm0JCT0gJyknLAotCQkJLmZ0cHR5cGUJPSBJUF9DVF9GVFBfRVBTViwKLQkJCS5nZXRudW0JCT0gdHJ5X2Vwc3ZfcmVzcG9uc2UsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgdHJ5X251bWJlcihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwgdV9pbnQzMl90IGFycmF5W10sCi0JCSAgICAgIGludCBhcnJheV9zaXplLCBjaGFyIHNlcCwgY2hhciB0ZXJtKQotewotCXVfaW50MzJfdCBpLCBsZW47Ci0KLQltZW1zZXQoYXJyYXksIDAsIHNpemVvZihhcnJheVswXSkqYXJyYXlfc2l6ZSk7Ci0KLQkvKiBLZWVwIGRhdGEgcG9pbnRpbmcgYXQgbmV4dCBjaGFyLiAqLwotCWZvciAoaSA9IDAsIGxlbiA9IDA7IGxlbiA8IGRsZW4gJiYgaSA8IGFycmF5X3NpemU7IGxlbisrLCBkYXRhKyspIHsKLQkJaWYgKCpkYXRhID49ICcwJyAmJiAqZGF0YSA8PSAnOScpIHsKLQkJCWFycmF5W2ldID0gYXJyYXlbaV0qMTAgKyAqZGF0YSAtICcwJzsKLQkJfQotCQllbHNlIGlmICgqZGF0YSA9PSBzZXApCi0JCQlpKys7Ci0JCWVsc2UgewotCQkJLyogVW5leHBlY3RlZCBjaGFyYWN0ZXI7IHRydWUgaWYgaXQncyB0aGUKLQkJCSAgIHRlcm1pbmF0b3IgYW5kIHdlJ3JlIGZpbmlzaGVkLiAqLwotCQkJaWYgKCpkYXRhID09IHRlcm0gJiYgaSA9PSBhcnJheV9zaXplIC0gMSkKLQkJCQlyZXR1cm4gbGVuOwotCi0JCQlERUJVR1AoIkNoYXIgJXUgKGdvdCAldSBudW1zKSBgJXUnIHVuZXhwZWN0ZWRcbiIsCi0JCQkgICAgICAgbGVuLCBpLCAqZGF0YSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlERUJVR1AoIkZhaWxlZCB0byBmaWxsICV1IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICVjXG4iLCBhcnJheV9zaXplLCBzZXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgMCwgb3IgbGVuZ3RoIG9mIG51bWJlcnM6IDE5MiwxNjgsMSwxLDUsNiAqLwotc3RhdGljIGludCB0cnlfcmZjOTU5KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLCB1X2ludDMyX3QgYXJyYXlbNl0sCi0JCSAgICAgICBjaGFyIHRlcm0pCi17Ci0JcmV0dXJuIHRyeV9udW1iZXIoZGF0YSwgZGxlbiwgYXJyYXksIDYsICcsJywgdGVybSk7Ci19Ci0KLS8qIEdyYWIgcG9ydDogbnVtYmVyIHVwIHRvIGRlbGltaXRlciAqLwotc3RhdGljIGludCBnZXRfcG9ydChjb25zdCBjaGFyICpkYXRhLCBpbnQgc3RhcnQsIHNpemVfdCBkbGVuLCBjaGFyIGRlbGltLAotCQkgICAgdV9pbnQzMl90IGFycmF5WzJdKQotewotCXVfaW50MTZfdCBwb3J0ID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgZGxlbjsgaSsrKSB7Ci0JCS8qIEZpbmlzaGVkPyAqLwotCQlpZiAoZGF0YVtpXSA9PSBkZWxpbSkgewotCQkJaWYgKHBvcnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWFycmF5WzBdID0gcG9ydCA+PiA4OwotCQkJYXJyYXlbMV0gPSBwb3J0OwotCQkJcmV0dXJuIGkgKyAxOwotCQl9Ci0JCWVsc2UgaWYgKGRhdGFbaV0gPj0gJzAnICYmIGRhdGFbaV0gPD0gJzknKQotCQkJcG9ydCA9IHBvcnQqMTAgKyBkYXRhW2ldIC0gJzAnOwotCQllbHNlIC8qIFNvbWUgb3RoZXIgY3JhcCAqLwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIDAsIG9yIGxlbmd0aCBvZiBudW1iZXJzOiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLwotc3RhdGljIGludCB0cnlfZXBydChjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwgdV9pbnQzMl90IGFycmF5WzZdLAotCQkgICAgY2hhciB0ZXJtKQotewotCWNoYXIgZGVsaW07Ci0JaW50IGxlbmd0aDsKLQotCS8qIEZpcnN0IGNoYXJhY3RlciBpcyBkZWxpbWl0ZXIsIHRoZW4gIjEiIGZvciBJUHY0LCB0aGVuCi0JICAgZGVsaW1pdGVyIGFnYWluLiAqLwotCWlmIChkbGVuIDw9IDMpIHJldHVybiAwOwotCWRlbGltID0gZGF0YVswXTsKLQlpZiAoaXNkaWdpdChkZWxpbSkgfHwgZGVsaW0gPCAzMyB8fCBkZWxpbSA+IDEyNgotCSAgICB8fCBkYXRhWzFdICE9ICcxJyB8fCBkYXRhWzJdICE9IGRlbGltKQotCQlyZXR1cm4gMDsKLQotCURFQlVHUCgiRVBSVDogR290IHwxfCFcbiIpOwotCS8qIE5vdyB3ZSBoYXZlIElQIGFkZHJlc3MuICovCi0JbGVuZ3RoID0gdHJ5X251bWJlcihkYXRhICsgMywgZGxlbiAtIDMsIGFycmF5LCA0LCAnLicsIGRlbGltKTsKLQlpZiAobGVuZ3RoID09IDApCi0JCXJldHVybiAwOwotCi0JREVCVUdQKCJFUFJUOiBHb3QgSVAgYWRkcmVzcyFcbiIpOwotCS8qIFN0YXJ0IG9mZnNldCBpbmNsdWRlcyBpbml0aWFsICJ8MXwiLCBhbmQgdHJhaWxpbmcgZGVsaW1pdGVyICovCi0JcmV0dXJuIGdldF9wb3J0KGRhdGEsIDMgKyBsZW5ndGggKyAxLCBkbGVuLCBkZWxpbSwgYXJyYXkrNCk7Ci19Ci0KLS8qIFJldHVybnMgMCwgb3IgbGVuZ3RoIG9mIG51bWJlcnM6IHx8fDY0NDZ8ICovCi1zdGF0aWMgaW50IHRyeV9lcHN2X3Jlc3BvbnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLCB1X2ludDMyX3QgYXJyYXlbNl0sCi0JCQkgICAgIGNoYXIgdGVybSkKLXsKLQljaGFyIGRlbGltOwotCi0JLyogVGhyZWUgZGVsaW1pdGVycy4gKi8KLQlpZiAoZGxlbiA8PSAzKSByZXR1cm4gMDsKLQlkZWxpbSA9IGRhdGFbMF07Ci0JaWYgKGlzZGlnaXQoZGVsaW0pIHx8IGRlbGltIDwgMzMgfHwgZGVsaW0gPiAxMjYKLQkgICAgfHwgZGF0YVsxXSAhPSBkZWxpbSB8fCBkYXRhWzJdICE9IGRlbGltKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBnZXRfcG9ydChkYXRhLCAzLCBkbGVuLCBkZWxpbSwgYXJyYXkrNCk7Ci19Ci0KLS8qIFJldHVybiAxIGZvciBtYXRjaCwgMCBmb3IgYWNjZXB0LCAtMSBmb3IgcGFydGlhbC4gKi8KLXN0YXRpYyBpbnQgZmluZF9wYXR0ZXJuKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLAotCQkJY29uc3QgY2hhciAqcGF0dGVybiwgc2l6ZV90IHBsZW4sCi0JCQljaGFyIHNraXAsIGNoYXIgdGVybSwKLQkJCXVuc2lnbmVkIGludCAqbnVtb2ZmLAotCQkJdW5zaWduZWQgaW50ICpudW1sZW4sCi0JCQl1X2ludDMyX3QgYXJyYXlbNl0sCi0JCQlpbnQgKCpnZXRudW0pKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCB1X2ludDMyX3RbXSwgY2hhcikpCi17Ci0Jc2l6ZV90IGk7Ci0KLQlERUJVR1AoImZpbmRfcGF0dGVybiBgJXMnOiBkbGVuID0gJXVcbiIsIHBhdHRlcm4sIGRsZW4pOwotCWlmIChkbGVuID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKGRsZW4gPD0gcGxlbikgewotCQkvKiBTaG9ydCBwYWNrZXQ6IHRyeSBmb3IgcGFydGlhbD8gKi8KLQkJaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIGRsZW4pID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UgcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIHBsZW4pICE9IDApIHsKLSNpZiAwCi0JCXNpemVfdCBpOwotCi0JCURFQlVHUCgiZnRwOiBzdHJpbmcgbWlzbWF0Y2hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7Ci0JCQlERUJVR1AoImZ0cDpjaGFyICV1IGAlYycoJXUpIHZzIGAlYycoJXUpXG4iLAotCQkJCWksIGRhdGFbaV0sIGRhdGFbaV0sCi0JCQkJcGF0dGVybltpXSwgcGF0dGVybltpXSk7Ci0JCX0KLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlERUJVR1AoIlBhdHRlcm4gbWF0Y2hlcyFcbiIpOwotCS8qIE5vdyB3ZSd2ZSBmb3VuZCB0aGUgY29uc3RhbnQgc3RyaW5nLCB0cnkgdG8gc2tpcAotCSAgIHRvIHRoZSAnc2tpcCcgY2hhcmFjdGVyICovCi0JZm9yIChpID0gcGxlbjsgZGF0YVtpXSAhPSBza2lwOyBpKyspCi0JCWlmIChpID09IGRsZW4gLSAxKSByZXR1cm4gLTE7Ci0KLQkvKiBTa2lwIG92ZXIgdGhlIGxhc3QgY2hhcmFjdGVyICovCi0JaSsrOwotCi0JREVCVUdQKCJTa2lwcGVkIHVwIHRvIGAlYychXG4iLCBza2lwKTsKLQotCSpudW1vZmYgPSBpOwotCSpudW1sZW4gPSBnZXRudW0oZGF0YSArIGksIGRsZW4gLSBpLCBhcnJheSwgdGVybSk7Ci0JaWYgKCEqbnVtbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQlERUJVR1AoIk1hdGNoIHN1Y2NlZWRlZCFcbiIpOwotCXJldHVybiAxOwotfQotCi0vKiBMb29rIHVwIHRvIHNlZSBpZiB3ZSdyZSBqdXN0IGFmdGVyIGEgXG4uICovCi1zdGF0aWMgaW50IGZpbmRfbmxfc2VxKHUzMiBzZXEsIGNvbnN0IHN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyICppbmZvLCBpbnQgZGlyKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGluZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl07IGkrKykKLQkJaWYgKGluZm8tPnNlcV9hZnRfbmxbZGlyXVtpXSA9PSBzZXEpCi0JCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogV2UgZG9uJ3QgdXBkYXRlIGlmIGl0J3Mgb2xkZXIgdGhhbiB3aGF0IHdlIGhhdmUuICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfbmxfc2VxKHUzMiBubF9zZXEsIHN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyICppbmZvLCBpbnQgZGlyLAotCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXVuc2lnbmVkIGludCBpLCBvbGRlc3QgPSBOVU1fU0VRX1RPX1JFTUVNQkVSOwotCi0JLyogTG9vayBmb3Igb2xkZXN0OiBpZiB3ZSBmaW5kIGV4YWN0IG1hdGNoLCB3ZSdyZSBkb25lLiAqLwotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZXFfYWZ0X25sX251bVtkaXJdOyBpKyspIHsKLQkJaWYgKGluZm8tPnNlcV9hZnRfbmxbZGlyXVtpXSA9PSBubF9zZXEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9sZGVzdCA9PSBpbmZvLT5zZXFfYWZ0X25sX251bVtkaXJdCi0JCSAgICB8fCBiZWZvcmUoaW5mby0+c2VxX2FmdF9ubFtkaXJdW2ldLCBvbGRlc3QpKQotCQkJb2xkZXN0ID0gaTsKLQl9Ci0KLQlpZiAoaW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXSA8IE5VTV9TRVFfVE9fUkVNRU1CRVIpIHsKLQkJaW5mby0+c2VxX2FmdF9ubFtkaXJdW2luZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl0rK10gPSBubF9zZXE7Ci0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0hFTFBJTkZPX1ZPTEFUSUxFLCBza2IpOwotCX0gZWxzZSBpZiAob2xkZXN0ICE9IE5VTV9TRVFfVE9fUkVNRU1CRVIpIHsKLQkJaW5mby0+c2VxX2FmdF9ubFtkaXJdW29sZGVzdF0gPSBubF9zZXE7Ci0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0hFTFBJTkZPX1ZPTEFUSUxFLCBza2IpOwotCX0KLX0KLQotc3RhdGljIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBkYXRhbGVuOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQljaGFyICpmYl9wdHI7Ci0JaW50IHJldDsKLQl1MzIgc2VxLCBhcnJheVs2XSA9IHsgMCB9OwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZjsKLQlzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqY3RfZnRwX2luZm8gPSAmY3QtPmhlbHAuY3RfZnRwX2luZm87Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgZm91bmQgPSAwLCBlbmRzX2luX25sOwotCXR5cGVvZihpcF9uYXRfZnRwX2hvb2spIGlwX25hdF9mdHA7Ci0KLQkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVECi0JICAgICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWSkgewotCQlERUJVR1AoImZ0cDogQ29ubnRyYWNraW5mbyA9ICV1XG4iLCBjdGluZm8pOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHRoLT5kb2ZmKjQ7Ci0JLyogTm8gZGF0YT8gKi8KLQlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pIHsKLQkJREVCVUdQKCJmdHA6IHBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0JZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7Ci0KLQlzcGluX2xvY2tfYmgoJmlwX2Z0cF9sb2NrKTsKLQlmYl9wdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGRhdGFvZmYsCi0JCQkJICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsIGZ0cF9idWZmZXIpOwotCUJVR19PTihmYl9wdHIgPT0gTlVMTCk7Ci0KLQllbmRzX2luX25sID0gKGZiX3B0cltkYXRhbGVuIC0gMV0gPT0gJ1xuJyk7Ci0Jc2VxID0gbnRvaGwodGgtPnNlcSkgKyBkYXRhbGVuOwotCi0JLyogTG9vayB1cCB0byBzZWUgaWYgd2UncmUganVzdCBhZnRlciBhIFxuLiAqLwotCWlmICghZmluZF9ubF9zZXEobnRvaGwodGgtPnNlcSksIGN0X2Z0cF9pbmZvLCBkaXIpKSB7Ci0JCS8qIE5vdyBpZiB0aGlzIGVuZHMgaW4gXG4sIHVwZGF0ZSBmdHAgaW5mby4gKi8KLQkJREVCVUdQKCJpcF9jb25udHJhY2tfZnRwX2hlbHA6IHdyb25nIHNlcSBwb3MgJXMoJXUpIG9yICVzKCV1KVxuIiwKLQkJICAgICAgIGN0X2Z0cF9pbmZvLT5zZXFfYWZ0X25sWzBdW2Rpcl0KLQkJICAgICAgIG9sZF9zZXFfYWZ0X25sX3NldCA/ICIiOiIoVU5TRVQpICIsIG9sZF9zZXFfYWZ0X25sKTsKLQkJcmV0ID0gTkZfQUNDRVBUOwotCQlnb3RvIG91dF91cGRhdGVfbmw7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBJUCBhcnJheSB0byBleHBlY3RlZCBhZGRyZXNzIChpdCdzIG5vdCBtZW50aW9uZWQKLQkgICBpbiBFUFNWIHJlc3BvbnNlcykgKi8KLQlhcnJheVswXSA9IChudG9obChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSA+PiAyNCkgJiAweEZGOwotCWFycmF5WzFdID0gKG50b2hsKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApID4+IDE2KSAmIDB4RkY7Ci0JYXJyYXlbMl0gPSAobnRvaGwoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkgPj4gOCkgJiAweEZGOwotCWFycmF5WzNdID0gbnRvaGwoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkgJiAweEZGOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VhcmNoW2Rpcl0pOyBpKyspIHsKLQkJZm91bmQgPSBmaW5kX3BhdHRlcm4oZmJfcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCQkJCSAgICAgc2VhcmNoW2Rpcl1baV0ucGF0dGVybiwKLQkJCQkgICAgIHNlYXJjaFtkaXJdW2ldLnBsZW4sCi0JCQkJICAgICBzZWFyY2hbZGlyXVtpXS5za2lwLAotCQkJCSAgICAgc2VhcmNoW2Rpcl1baV0udGVybSwKLQkJCQkgICAgICZtYXRjaG9mZiwgJm1hdGNobGVuLAotCQkJCSAgICAgYXJyYXksCi0JCQkJICAgICBzZWFyY2hbZGlyXVtpXS5nZXRudW0pOwotCQlpZiAoZm91bmQpIGJyZWFrOwotCX0KLQlpZiAoZm91bmQgPT0gLTEpIHsKLQkJLyogV2UgZG9uJ3QgdXN1YWxseSBkcm9wIHBhY2tldHMuICBBZnRlciBhbGwsIHRoaXMgaXMKLQkJICAgY29ubmVjdGlvbiB0cmFja2luZywgbm90IHBhY2tldCBmaWx0ZXJpbmcuCi0JCSAgIEhvd2V2ZXIsIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYWNjdXJhdGUgdHJhY2tpbmcgaW4KLQkJICAgdGhpcyBjYXNlLiAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJjb25udHJhY2tfZnRwOiBwYXJ0aWFsICVzICV1KyV1XG4iLAotCQkJICAgICAgIHNlYXJjaFtkaXJdW2ldLnBhdHRlcm4sCi0JCQkgICAgICAgbnRvaGwodGgtPnNlcSksIGRhdGFsZW4pOwotCQlyZXQgPSBORl9EUk9QOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKGZvdW5kID09IDApIHsgLyogTm8gbWF0Y2ggKi8KLQkJcmV0ID0gTkZfQUNDRVBUOwotCQlnb3RvIG91dF91cGRhdGVfbmw7Ci0JfQotCi0JREVCVUdQKCJjb25udHJhY2tfZnRwOiBtYXRjaCBgJXMnICgldSBieXRlcyBhdCAldSlcbiIsCi0JICAgICAgIGZiX3B0ciArIG1hdGNob2ZmLCBtYXRjaGxlbiwgbnRvaGwodGgtPnNlcSkgKyBtYXRjaG9mZik7Ci0KLQkvKiBBbGxvY2F0ZSBleHBlY3RhdGlvbiB3aGljaCB3aWxsIGJlIGluc2VydGVkICovCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKGV4cCA9PSBOVUxMKSB7Ci0JCXJldCA9IE5GX0RST1A7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFdlIHJlZmVyIHRvIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAoIiFkaXIiKSB0dXBsZXMgaGVyZSwKLQkgKiBiZWNhdXNlIHdlJ3JlIGV4cGVjdGluZyBzb21ldGhpbmcgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi4KLQkgKiBEb2Vzbid0IG1hdHRlciB1bmxlc3MgTkFUIGlzIGhhcHBlbmluZy4gICovCi0JZXhwLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKLQotCWlmIChodG9ubCgoYXJyYXlbMF0gPDwgMjQpIHwgKGFycmF5WzFdIDw8IDE2KSB8IChhcnJheVsyXSA8PCA4KSB8IGFycmF5WzNdKQotCSAgICAhPSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSB7Ci0JCS8qIEVucmljbyBTY2hvbHoncyBwYXNzaXZlIEZUUCB0byBwYXJ0aWFsbHkgUk5BVCdkIGZ0cAotCQkgICBzZXJ2ZXI6IGl0IHJlYWxseSB3YW50cyB1cyB0byBjb25uZWN0IHRvIGEKLQkJICAgZGlmZmVyZW50IElQIGFkZHJlc3MuICBTaW1wbHkgZG9uJ3QgcmVjb3JkIGl0IGZvcgotCQkgICBOQVQuICovCi0JCURFQlVHUCgiY29ubnRyYWNrX2Z0cDogTk9UIFJFQ09SRElORzogJXUsJXUsJXUsJXUgIT0gJXUuJXUuJXUuJXVcbiIsCi0JCSAgICAgICBhcnJheVswXSwgYXJyYXlbMV0sIGFycmF5WzJdLCBhcnJheVszXSwKLQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkpOwotCi0JCS8qIFRoYW5rcyB0byBDcmlzdGlhbm8gTGluY29sbiBNYXR0b3MKLQkJICAgPGxpbmNvbG5AY2VzYXIub3JnLmJyPiBmb3IgcmVwb3J0aW5nIHRoaXMgcG90ZW50aWFsCi0JCSAgIHByb2JsZW0gKERNWiBtYWNoaW5lcyBvcGVuaW5nIGhvbGVzIHRvIGludGVybmFsCi0JCSAgIG5ldHdvcmtzLCBvciB0aGUgcGFja2V0IGZpbHRlciBpdHNlbGYpLiAqLwotCQlpZiAoIWxvb3NlKSB7Ci0JCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JCQlnb3RvIG91dF9wdXRfZXhwZWN0OwotCQl9Ci0JCWV4cC0+dHVwbGUuZHN0LmlwID0gaHRvbmwoKGFycmF5WzBdIDw8IDI0KSB8IChhcnJheVsxXSA8PCAxNikKLQkJCQkJIHwgKGFycmF5WzJdIDw8IDgpIHwgYXJyYXlbM10pOwotCX0KLQotCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKGFycmF5WzRdIDw8IDggfCBhcnJheVs1XSk7Ci0JZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7IC8qIERvbid0IGNhcmUuICovCi0JZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQlleHAtPm1hc2sgPSAoKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUpCi0JCXsgeyBodG9ubCgweEZGRkZGRkZGKSwgeyAwIH0gfSwKLQkJICB7IGh0b25sKDB4RkZGRkZGRkYpLCB7IC50Y3AgPSB7IGh0b25zKDB4RkZGRikgfSB9LCAweEZGIH19KTsKLQotCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCWV4cC0+ZmxhZ3MgPSAwOwotCi0JLyogTm93LCBOQVQgbWlnaHQgd2FudCB0byBtYW5nbGUgdGhlIHBhY2tldCwgYW5kIHJlZ2lzdGVyIHRoZQotCSAqIChwb3NzaWJseSBjaGFuZ2VkKSBleHBlY3RhdGlvbiBpdHNlbGYuICovCi0JaXBfbmF0X2Z0cCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfZnRwX2hvb2spOwotCWlmIChpcF9uYXRfZnRwKQotCQlyZXQgPSBpcF9uYXRfZnRwKHBza2IsIGN0aW5mbywgc2VhcmNoW2Rpcl1baV0uZnRwdHlwZSwKLQkJCQkgbWF0Y2hvZmYsIG1hdGNobGVuLCBleHAsICZzZXEpOwotCWVsc2UgewotCQkvKiBDYW4ndCBleHBlY3QgdGhpcz8gIEJlc3QgdG8gZHJvcCBwYWNrZXQgbm93LiAqLwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKLQkJCXJldCA9IE5GX0RST1A7Ci0JCWVsc2UKLQkJCXJldCA9IE5GX0FDQ0VQVDsKLQl9Ci0KLW91dF9wdXRfZXhwZWN0OgotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLW91dF91cGRhdGVfbmw6Ci0JLyogTm93IGlmIHRoaXMgZW5kcyBpbiBcbiwgdXBkYXRlIGZ0cCBpbmZvLiAgU2VxIG1heSBoYXZlIGJlZW4KLQkgKiBhZGp1c3RlZCBieSBOQVQgY29kZS4gKi8KLQlpZiAoZW5kc19pbl9ubCkKLQkJdXBkYXRlX25sX3NlcShzZXEsIGN0X2Z0cF9pbmZvLGRpciwgKnBza2IpOwotIG91dDoKLQlzcGluX3VubG9ja19iaCgmaXBfZnRwX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBmdHBbTUFYX1BPUlRTXTsKLXN0YXRpYyBjaGFyIGZ0cF9uYW1lc1tNQVhfUE9SVFNdW3NpemVvZigiZnRwLTY1NTM1IildOwotCi0vKiBOb3QgX19leGl0OiBjYWxsZWQgZnJvbSBpbml0KCkgKi8KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19mdHBfZmluaSh2b2lkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJREVCVUdQKCJpcF9jdF9mdHA6IHVucmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwb3J0ICVkXG4iLAotCQkJCXBvcnRzW2ldKTsKLQkJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZmdHBbaV0pOwotCX0KLQotCWtmcmVlKGZ0cF9idWZmZXIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfZnRwX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgcmV0OwotCWNoYXIgKnRtcG5hbWU7Ci0KLQlmdHBfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmdHBfYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChwb3J0c19jID09IDApCi0JCXBvcnRzW3BvcnRzX2MrK10gPSBGVFBfUE9SVDsKLQotCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJZnRwW2ldLnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMocG9ydHNbaV0pOwotCQlmdHBbaV0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JCWZ0cFtpXS5tYXNrLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQkJZnRwW2ldLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQkJZnRwW2ldLm1heF9leHBlY3RlZCA9IDE7Ci0JCWZ0cFtpXS50aW1lb3V0ID0gNSAqIDYwOyAvKiA1IG1pbnV0ZXMgKi8KLQkJZnRwW2ldLm1lID0gVEhJU19NT0RVTEU7Ci0JCWZ0cFtpXS5oZWxwID0gaGVscDsKLQotCQl0bXBuYW1lID0gJmZ0cF9uYW1lc1tpXVswXTsKLQkJaWYgKHBvcnRzW2ldID09IEZUUF9QT1JUKQotCQkJc3ByaW50Zih0bXBuYW1lLCAiZnRwIik7Ci0JCWVsc2UKLQkJCXNwcmludGYodG1wbmFtZSwgImZ0cC0lZCIsIHBvcnRzW2ldKTsKLQkJZnRwW2ldLm5hbWUgPSB0bXBuYW1lOwotCi0JCURFQlVHUCgiaXBfY3RfZnRwOiByZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBvcnQgJWRcbiIsCi0JCQkJcG9ydHNbaV0pOwotCQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZmdHBbaV0pOwotCi0JCWlmIChyZXQpIHsKLQkJCWlwX2Nvbm50cmFja19mdHBfZmluaSgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX2Z0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja19mdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWIzNjUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg0MSArMCwwIEBACi0vKgotICogSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKgotICogQmFzZWQgb24gdGhlICdicnV0ZSBmb3JjZScgSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUgYnkKLSAqIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KLSAqCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBodHRwOi8vbmF0aDMyMy5zb3VyY2Vmb3JnZS5uZXQvCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oMzIzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0vKiBQYXJhbWV0ZXJzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfcnJxX3R0bCA9IDMwMDsKLW1vZHVsZV9wYXJhbShkZWZhdWx0X3JycV90dGwsIHVpbnQsIDA2MDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X3JycV90dGwsICJ1c2UgdGhpcyBUVEwgaWYgaXQncyBtaXNzaW5nIGluIFJSUSIpOwotCi1zdGF0aWMgaW50IGdrcm91dGVkX29ubHkgPSAxOwotbW9kdWxlX3BhcmFtKGdrcm91dGVkX29ubHksIGludCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGdrcm91dGVkX29ubHksICJvbmx5IGFjY2VwdCBjYWxscyBmcm9tIGdhdGVrZWVwZXIiKTsKLQotc3RhdGljIGludCBjYWxsZm9yd2FyZF9maWx0ZXIgPSAxOwotbW9kdWxlX3BhcmFtKGNhbGxmb3J3YXJkX2ZpbHRlciwgYm9vbCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNhbGxmb3J3YXJkX2ZpbHRlciwgIm9ubHkgY3JlYXRlIGNhbGwgZm9yd2FyZGluZyBleHBlY3RhdGlvbnMgIgotCQkJCSAgICAgImlmIGJvdGggZW5kcG9pbnRzIGFyZSBvbiBkaWZmZXJlbnQgc2lkZXMgIgotCQkJCSAgICAgIihkZXRlcm1pbmVkIGJ5IHJvdXRpbmcgaW5mb3JtYXRpb24pIik7Ci0KLS8qIEhvb2tzIGZvciBOQVQgKi8KLWludCAoKnNldF9oMjQ1X2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJICAgX19iZTMyIGlwLCB1X2ludDE2X3QgcG9ydCk7Ci1pbnQgKCpzZXRfaDIyNV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWludCAoKnNldF9zaWdfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsCi0JCQkgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCBpbnQgY291bnQpOwotaW50ICgqc2V0X3Jhc19hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKLQkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBjb3VudCk7Ci1pbnQgKCpuYXRfcnRwX3J0Y3BfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCSAgdV9pbnQxNl90IHBvcnQsIHVfaW50MTZfdCBydHBfcG9ydCwKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBydHBfZXhwLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIHJ0Y3BfZXhwKTsKLWludCAoKm5hdF90MTIwX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIGV4cCk7Ci1pbnQgKCpuYXRfaDI0NV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkgICAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgdV9pbnQxNl90IHBvcnQsCi0JCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogZXhwKTsKLWludCAoKm5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCVRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIGV4cCk7Ci1pbnQgKCpuYXRfcTkzMV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCBpbnQgaWR4LAotCQkgICAgICB1X2ludDE2X3QgcG9ydCwgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBfaDMyM19sb2NrKTsKLXN0YXRpYyBjaGFyICpoMzIzX2J1ZmZlcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGdldF90cGt0X2RhdGEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpkYXRhbGVuLCBpbnQgKmRhdGFvZmYpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQlpbnQgdGNwZGF0YWxlbjsKLQlpbnQgdGNwZGF0YW9mZjsKLQl1bnNpZ25lZCBjaGFyICp0cGt0OwotCWludCB0cGt0bGVuOwotCWludCB0cGt0b2ZmOwotCi0JLyogR2V0IFRDUCBoZWFkZXIgKi8KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JLyogR2V0IFRDUCBkYXRhIG9mZnNldCAqLwotCXRjcGRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgKyB0aC0+ZG9mZiAqIDQ7Ci0KLQkvKiBHZXQgVENQIGRhdGEgbGVuZ3RoICovCi0JdGNwZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIHRjcGRhdGFvZmY7Ci0JaWYgKHRjcGRhdGFsZW4gPD0gMCkJLyogTm8gVENQIGRhdGEgKi8KLQkJZ290byBjbGVhcl9vdXQ7Ci0KLQlpZiAoKmRhdGEgPT0gTlVMTCkgewkvKiBmaXJzdCBUUEtUICovCi0JCS8qIEdldCBmaXJzdCBUUEtUIHBvaW50ZXIgKi8KLQkJdHBrdCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgdGNwZGF0YW9mZiwgdGNwZGF0YWxlbiwKLQkJCQkJICBoMzIzX2J1ZmZlcik7Ci0JCUJVR19PTih0cGt0ID09IE5VTEwpOwotCi0JCS8qIFZhbGlkYXRlIFRQS1QgaWRlbnRpZmllciAqLwotCQlpZiAodGNwZGF0YWxlbiA8IDQgfHwgdHBrdFswXSAhPSAweDAzIHx8IHRwa3RbMV0gIT0gMCkgewotCQkJLyogTmV0bWVldGluZyBzZW5kcyBUUEtUIGhlYWRlciBhbmQgZGF0YSBzZXBhcmF0ZWx5ICovCi0JCQlpZiAoaW5mby0+dHBrdF9sZW5bZGlyXSA+IDApIHsKLQkJCQlERUJVR1AoImlwX2N0X2gzMjM6IHByZXZpb3VzIHBhY2tldCAiCi0JCQkJICAgICAgICJpbmRpY2F0ZWQgc2VwYXJhdGUgVFBLVCBkYXRhIG9mICVodSAiCi0JCQkJICAgICAgICJieXRlc1xuIiwgaW5mby0+dHBrdF9sZW5bZGlyXSk7Ci0JCQkJaWYgKGluZm8tPnRwa3RfbGVuW2Rpcl0gPD0gdGNwZGF0YWxlbikgewotCQkJCQkvKiBZZXMsIHRoZXJlIHdhcyBhIFRQS1QgaGVhZGVyCi0JCQkJCSAqIHJlY2VpdmVkICovCi0JCQkJCSpkYXRhID0gdHBrdDsKLQkJCQkJKmRhdGFsZW4gPSBpbmZvLT50cGt0X2xlbltkaXJdOwotCQkJCQkqZGF0YW9mZiA9IDA7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQotCQkJCS8qIEZyYWdtZW50ZWQgVFBLVCAqLwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiaXBfY3RfaDMyMzogIgotCQkJCQkgICAgICAgImZyYWdtZW50ZWQgVFBLVFxuIik7Ci0JCQkJZ290byBjbGVhcl9vdXQ7Ci0JCQl9Ci0KLQkJCS8qIEl0IGlzIG5vdCBldmVuIGEgVFBLVCAqLwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJdHBrdG9mZiA9IDA7Ci0JfSBlbHNlIHsJCS8qIE5leHQgVFBLVCAqLwotCQl0cGt0b2ZmID0gKmRhdGFvZmYgKyAqZGF0YWxlbjsKLQkJdGNwZGF0YWxlbiAtPSB0cGt0b2ZmOwotCQlpZiAodGNwZGF0YWxlbiA8PSA0KQkvKiBObyBtb3JlIFRQS1QgKi8KLQkJCWdvdG8gY2xlYXJfb3V0OwotCQl0cGt0ID0gKmRhdGEgKyAqZGF0YWxlbjsKLQotCQkvKiBWYWxpZGF0ZSBUUEtUIGlkZW50aWZpZXIgKi8KLQkJaWYgKHRwa3RbMF0gIT0gMHgwMyB8fCB0cGt0WzFdICE9IDApCi0JCQlnb3RvIGNsZWFyX291dDsKLQl9Ci0KLQkvKiBWYWxpZGF0ZSBUUEtUIGxlbmd0aCAqLwotCXRwa3RsZW4gPSB0cGt0WzJdICogMjU2ICsgdHBrdFszXTsKLQlpZiAodHBrdGxlbiA8IDQpCi0JCWdvdG8gY2xlYXJfb3V0OwotCWlmICh0cGt0bGVuID4gdGNwZGF0YWxlbikgewotCQlpZiAodGNwZGF0YWxlbiA9PSA0KSB7CS8qIFNlcGFyYXRlIFRQS1QgaGVhZGVyICovCi0JCQkvKiBOZXRtZWV0aW5nIHNlbmRzIFRQS1QgaGVhZGVyIGFuZCBkYXRhIHNlcGFyYXRlbHkgKi8KLQkJCURFQlVHUCgiaXBfY3RfaDMyMzogc2VwYXJhdGUgVFBLVCBoZWFkZXIgaW5kaWNhdGVzICIKLQkJCSAgICAgICAidGhlcmUgd2lsbCBiZSBUUEtUIGRhdGEgb2YgJWh1IGJ5dGVzXG4iLAotCQkJICAgICAgIHRwa3RsZW4gLSA0KTsKLQkJCWluZm8tPnRwa3RfbGVuW2Rpcl0gPSB0cGt0bGVuIC0gNDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfY3RfaDMyMzogaW5jb21wbGV0ZSBUUEtUIChmcmFnbWVudGVkPylcbiIpOwotCQlnb3RvIGNsZWFyX291dDsKLQl9Ci0KLQkvKiBUaGlzIGlzIHRoZSBlbmNhcHN1bGF0ZWQgZGF0YSAqLwotCSpkYXRhID0gdHBrdCArIDQ7Ci0JKmRhdGFsZW4gPSB0cGt0bGVuIC0gNDsKLQkqZGF0YW9mZiA9IHRwa3RvZmYgKyA0OwotCi0gICAgICBvdXQ6Ci0JLyogQ2xlYXIgVFBLVCBsZW5ndGggKi8KLQlpbmZvLT50cGt0X2xlbltkaXJdID0gMDsKLQlyZXR1cm4gMTsKLQotICAgICAgY2xlYXJfb3V0OgotCWluZm8tPnRwa3RfbGVuW2Rpcl0gPSAwOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZ2V0X2gyNDVfYWRkcih1bnNpZ25lZCBjaGFyICpkYXRhLCBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJIF9fYmUzMiAqIGlwLCB1X2ludDE2X3QgKiBwb3J0KQotewotCXVuc2lnbmVkIGNoYXIgKnA7Ci0KLQlpZiAoYWRkci0+Y2hvaWNlICE9IGVIMjQ1X1RyYW5zcG9ydEFkZHJlc3NfdW5pY2FzdEFkZHJlc3MgfHwKLQkgICAgYWRkci0+dW5pY2FzdEFkZHJlc3MuY2hvaWNlICE9IGVVbmljYXN0QWRkcmVzc19pUEFkZHJlc3MpCi0JCXJldHVybiAwOwotCi0JcCA9IGRhdGEgKyBhZGRyLT51bmljYXN0QWRkcmVzcy5pUEFkZHJlc3MubmV0d29yazsKLQkqaXAgPSBodG9ubCgocFswXSA8PCAyNCkgfCAocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IChwWzNdKSk7Ci0JKnBvcnQgPSAocFs0XSA8PCA4KSB8IChwWzVdKTsKLQotCXJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZXhwZWN0X3J0cF9ydGNwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIpCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0ID0gMDsKLQlfX2JlMzIgaXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0JdV9pbnQxNl90IHJ0cF9wb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpydHBfZXhwOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpydGNwX2V4cDsKLQl0eXBlb2YobmF0X3J0cF9ydGNwX2hvb2spIG5hdF9ydHBfcnRjcDsKLQotCS8qIFJlYWQgUlRQIG9yIFJUQ1AgYWRkcmVzcyAqLwotCWlmICghZ2V0X2gyNDVfYWRkcigqZGF0YSwgYWRkciwgJmlwLCAmcG9ydCkgfHwKLQkgICAgaXAgIT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCB8fCBwb3J0ID09IDApCi0JCXJldHVybiAwOwotCi0JLyogUlRQIHBvcnQgaXMgZXZlbiAqLwotCXJ0cF9wb3J0ID0gcG9ydCAmICh+MSk7Ci0KLQkvKiBDcmVhdGUgZXhwZWN0IGZvciBSVFAgKi8KLQlpZiAoKHJ0cF9leHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJ0cF9leHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCXJ0cF9leHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0ID0gMDsKLQlydHBfZXhwLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKLQlydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKHJ0cF9wb3J0KTsKLQlydHBfZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1VEUDsKLQlydHBfZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCXJ0cF9leHAtPm1hc2suc3JjLnUudWRwLnBvcnQgPSAwOwotCXJ0cF9leHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JcnRwX2V4cC0+bWFzay5kc3QudS51ZHAucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JcnRwX2V4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCXJ0cF9leHAtPmZsYWdzID0gMDsKLQotCS8qIENyZWF0ZSBleHBlY3QgZm9yIFJUQ1AgKi8KLQlpZiAoKHJ0Y3BfZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpIHsKLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRwX2V4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcnRjcF9leHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCXJ0Y3BfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCA9IDA7Ci0JcnRjcF9leHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCXJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKHJ0cF9wb3J0ICsgMSk7Ci0JcnRjcF9leHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOwotCXJ0Y3BfZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCXJ0Y3BfZXhwLT5tYXNrLnNyYy51LnVkcC5wb3J0ID0gMDsKLQlydGNwX2V4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlydGNwX2V4cC0+bWFzay5kc3QudS51ZHAucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JcnRjcF9leHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQlydGNwX2V4cC0+ZmxhZ3MgPSAwOwotCi0JaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKLQkgICAgKG5hdF9ydHBfcnRjcCA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcnRwX3J0Y3BfaG9vaykpKSB7Ci0JCS8qIE5BVCBuZWVkZWQgKi8KLQkJcmV0ID0gbmF0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgYWRkciwgcG9ydCwgcnRwX3BvcnQsIHJ0cF9leHAsIHJ0Y3BfZXhwKTsKLQl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KLQkJcnRwX2V4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCQlydGNwX2V4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCi0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQocnRwX2V4cCkgPT0gMCkgewotCQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydGNwX2V4cCkgPT0gMCkgewotCQkJCURFQlVHUCgiaXBfY3RfaDMyMzogZXhwZWN0IFJUUCAiCi0JCQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJCQkgICAgICAgTklQUVVBRChydHBfZXhwLT50dXBsZS5zcmMuaXApLAotCQkJCSAgICAgICBudG9ocyhydHBfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCksCi0JCQkJICAgICAgIE5JUFFVQUQocnRwX2V4cC0+dHVwbGUuZHN0LmlwKSwKLQkJCQkgICAgICAgbnRvaHMocnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQpKTsKLQkJCQlERUJVR1AoImlwX2N0X2gzMjM6IGV4cGVjdCBSVENQICIKLQkJCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJCSAgICAgICBOSVBRVUFEKHJ0Y3BfZXhwLT50dXBsZS5zcmMuaXApLAotCQkJCSAgICAgICBudG9ocyhydGNwX2V4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQpLAotCQkJCSAgICAgICBOSVBRVUFEKHJ0Y3BfZXhwLT50dXBsZS5kc3QuaXApLAotCQkJCSAgICAgICBudG9ocyhydGNwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQocnRwX2V4cCk7Ci0JCQkJcmV0ID0gLTE7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfQotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRwX2V4cCk7Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRjcF9leHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGV4cGVjdF90MTIwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSBOVUxMOwotCXR5cGVvZihuYXRfdDEyMF9ob29rKSBuYXRfdDEyMDsKLQotCS8qIFJlYWQgVC4xMjAgYWRkcmVzcyAqLwotCWlmICghZ2V0X2gyNDVfYWRkcigqZGF0YSwgYWRkciwgJmlwLCAmcG9ydCkgfHwKLQkgICAgaXAgIT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCB8fCBwb3J0ID09IDApCi0JCXJldHVybiAwOwotCi0JLyogQ3JlYXRlIGV4cGVjdCBmb3IgVC4xMjAgY29ubmVjdGlvbnMgKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwkvKiBBY2NlcHQgbXVsdGlwbGUgY2hhbm5lbHMgKi8KLQotCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmCi0JICAgIChuYXRfdDEyMCA9IHJjdV9kZXJlZmVyZW5jZShuYXRfdDEyMF9ob29rKSkpIHsKLQkJLyogTkFUIG5lZWRlZCAqLwotCQlyZXQgPSBuYXRfdDEyMChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJICAgICAgIHBvcnQsIGV4cCk7Ci0JfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCi0JCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQkJREVCVUdQKCJpcF9jdF9oMzIzOiBleHBlY3QgVC4xMjAgIgotCQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfQotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2gyNDVfY2hhbm5lbChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzICogY2hhbm5lbCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKGNoYW5uZWwtPm9wdGlvbnMgJiBlSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbWVkaWFDaGFubmVsKSB7Ci0JCS8qIFJUUCAqLwotCQlyZXQgPSBleHBlY3RfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgICAmY2hhbm5lbC0+bWVkaWFDaGFubmVsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGNoYW5uZWwtPgotCSAgICBvcHRpb25zICYgZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhQ29udHJvbENoYW5uZWwpIHsKLQkJLyogUlRDUCAqLwotCQlyZXQgPSBleHBlY3RfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgICAmY2hhbm5lbC0+bWVkaWFDb250cm9sQ2hhbm5lbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19vbGMoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkgICAgICAgT3BlbkxvZ2ljYWxDaGFubmVsICogb2xjKQotewotCWludCByZXQ7Ci0KLQlERUJVR1AoImlwX2N0X2gzMjM6IE9wZW5Mb2dpY2FsQ2hhbm5lbFxuIik7Ci0KLQlpZiAob2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm11bHRpcGxleFBhcmFtZXRlcnMuY2hvaWNlID09Ci0JICAgIGVPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKQotCXsKLQkJcmV0ID0gcHJvY2Vzc19oMjQ1X2NoYW5uZWwocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgJm9sYy0+Ci0JCQkJCSAgIGZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuCi0JCQkJCSAgIG11bHRpcGxleFBhcmFtZXRlcnMuCi0JCQkJCSAgIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKChvbGMtPm9wdGlvbnMgJgotCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSAmJgotCSAgICAob2xjLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm9wdGlvbnMgJgotCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMpCi0JICAgICYmIChvbGMtPnJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMubXVsdGlwbGV4UGFyYW1ldGVycy4KLQkJY2hvaWNlID09Ci0JCWVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSkKLQl7Ci0JCXJldCA9Ci0JCSAgICBwcm9jZXNzX2gyNDVfY2hhbm5lbChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgJm9sYy0+Ci0JCQkJCSByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLgotCQkJCQkgbXVsdGlwbGV4UGFyYW1ldGVycy4KLQkJCQkJIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKChvbGMtPm9wdGlvbnMgJiBlT3BlbkxvZ2ljYWxDaGFubmVsX3NlcGFyYXRlU3RhY2spICYmCi0JICAgIG9sYy0+Zm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5kYXRhVHlwZS5jaG9pY2UgPT0KLQkgICAgZURhdGFUeXBlX2RhdGEgJiYKLQkgICAgb2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLmRhdGFUeXBlLmRhdGEuYXBwbGljYXRpb24uCi0JICAgIGNob2ljZSA9PSBlRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90MTIwICYmCi0JICAgIG9sYy0+Zm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5kYXRhVHlwZS5kYXRhLmFwcGxpY2F0aW9uLgotCSAgICB0MTIwLmNob2ljZSA9PSBlRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9zZXBhcmF0ZUxBTlN0YWNrICYmCi0JICAgIG9sYy0+c2VwYXJhdGVTdGFjay5uZXR3b3JrQWRkcmVzcy5jaG9pY2UgPT0KLQkgICAgZU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzX2xvY2FsQXJlYUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X3QxMjAocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZvbGMtPnNlcGFyYXRlU3RhY2submV0d29ya0FkZHJlc3MuCi0JCQkJICBsb2NhbEFyZWFBZGRyZXNzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX29sY2Eoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJT3BlbkxvZ2ljYWxDaGFubmVsQWNrICogb2xjYSkKLXsKLQlIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycyAqYWNrOwotCWludCByZXQ7Ci0KLQlERUJVR1AoImlwX2N0X2gzMjM6IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja1xuIik7Ci0KLQlpZiAoKG9sY2EtPm9wdGlvbnMgJgotCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSAmJgotCSAgICAob2xjYS0+cmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5vcHRpb25zICYKLQkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzKQotCSAgICAmJiAob2xjYS0+cmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5tdWx0aXBsZXhQYXJhbWV0ZXJzLgotCQljaG9pY2UgPT0KLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpKQotCXsKLQkJcmV0ID0gcHJvY2Vzc19oMjQ1X2NoYW5uZWwocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgJm9sY2EtPgotCQkJCQkgICByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLgotCQkJCQkgICBtdWx0aXBsZXhQYXJhbWV0ZXJzLgotCQkJCQkgICBoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICgob2xjYS0+b3B0aW9ucyAmCi0JICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzKSAmJgotCSAgICAob2xjYS0+Zm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMuY2hvaWNlID09Ci0JICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzKSkKLQl7Ci0JCWFjayA9ICZvbGNhLT5mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycy4KLQkJICAgIGgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzOwotCQlpZiAoYWNrLT5vcHRpb25zICYKLQkJICAgIGVIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc19tZWRpYUNoYW5uZWwpIHsKLQkJCS8qIFJUUCAqLwotCQkJcmV0ID0gZXhwZWN0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgICAgICZhY2stPm1lZGlhQ2hhbm5lbCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoYWNrLT5vcHRpb25zICYKLQkJICAgIGVIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc19tZWRpYUNvbnRyb2xDaGFubmVsKSB7Ci0JCQkvKiBSVENQICovCi0JCQlyZXQgPSBleHBlY3RfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgICAgJmFjay0+bWVkaWFDb250cm9sQ2hhbm5lbCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfaDI0NShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQlNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgKiBtc2NtKQotewotCXN3aXRjaCAobXNjbS0+Y2hvaWNlKSB7Ci0JY2FzZSBlTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlX3JlcXVlc3Q6Ci0JCWlmIChtc2NtLT5yZXF1ZXN0LmNob2ljZSA9PQotCQkgICAgZVJlcXVlc3RNZXNzYWdlX29wZW5Mb2dpY2FsQ2hhbm5lbCkgewotCQkJcmV0dXJuIHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgICZtc2NtLT5yZXF1ZXN0Lm9wZW5Mb2dpY2FsQ2hhbm5lbCk7Ci0JCX0KLQkJREVCVUdQKCJpcF9jdF9oMzIzOiBILjI0NSBSZXF1ZXN0ICVkXG4iLAotCQkgICAgICAgbXNjbS0+cmVxdWVzdC5jaG9pY2UpOwotCQlicmVhazsKLQljYXNlIGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfcmVzcG9uc2U6Ci0JCWlmIChtc2NtLT5yZXNwb25zZS5jaG9pY2UgPT0KLQkJICAgIGVSZXNwb25zZU1lc3NhZ2Vfb3BlbkxvZ2ljYWxDaGFubmVsQWNrKSB7Ci0JCQlyZXR1cm4gcHJvY2Vzc19vbGNhKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgICAmbXNjbS0+cmVzcG9uc2UuCi0JCQkJCSAgICBvcGVuTG9naWNhbENoYW5uZWxBY2spOwotCQl9Ci0JCURFQlVHUCgiaXBfY3RfaDMyMzogSC4yNDUgUmVzcG9uc2UgJWRcbiIsCi0JCSAgICAgICBtc2NtLT5yZXNwb25zZS5jaG9pY2UpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlERUJVR1AoImlwX2N0X2gzMjM6IEguMjQ1IHNpZ25hbCAlZFxuIiwgbXNjbS0+Y2hvaWNlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBoMjQ1X2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdGF0aWMgTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlIG1zY207Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IE5VTEw7Ci0JaW50IGRhdGFsZW47Ci0JaW50IGRhdGFvZmY7Ci0JaW50IHJldDsKLQotCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKLQkgICAgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0JREVCVUdQKCJpcF9jdF9oMjQ1OiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKLQotCXNwaW5fbG9ja19iaCgmaXBfaDMyM19sb2NrKTsKLQotCS8qIFByb2Nlc3MgZWFjaCBUUEtUICovCi0Jd2hpbGUgKGdldF90cGt0X2RhdGEocHNrYiwgY3QsIGN0aW5mbywgJmRhdGEsICZkYXRhbGVuLCAmZGF0YW9mZikpIHsKLQkJREVCVUdQKCJpcF9jdF9oMjQ1OiBUUEtUICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSwgbGVuPSVkXG4iLAotCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPnNhZGRyKSwKLQkJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5kYWRkciksIGRhdGFsZW4pOwotCi0JCS8qIERlY29kZSBILjI0NSBzaWduYWwgKi8KLQkJcmV0ID0gRGVjb2RlTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlKGRhdGEsIGRhdGFsZW4sCi0JCQkJCQkJICAgJm1zY20pOwotCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoImlwX2N0X2gyNDU6IGRlY29kaW5nIGVycm9yOiAlc1xuIiwKLQkJCQkgICAgICAgcmV0ID09IEgzMjNfRVJST1JfQk9VTkQgPwotCQkJCSAgICAgICAib3V0IG9mIGJvdW5kIiA6ICJvdXQgb2YgcmFuZ2UiKTsKLQkJCS8qIFdlIGRvbid0IGRyb3Agd2hlbiBkZWNvZGluZyBlcnJvciAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBQcm9jZXNzIEguMjQ1IHNpZ25hbCAqLwotCQlpZiAocHJvY2Vzc19oMjQ1KHBza2IsIGN0LCBjdGluZm8sICZkYXRhLCBkYXRhb2ZmLCAmbXNjbSkgPCAwKQotCQkJZ290byBkcm9wOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCXJldHVybiBORl9BQ0NFUFQ7Ci0KLSAgICAgIGRyb3A6Ci0Jc3Bpbl91bmxvY2tfYmgoJmlwX2gzMjNfbG9jayk7Ci0JaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJcHJpbnRrKCJpcF9jdF9oMjQ1OiBwYWNrZXQgZHJvcHBlZFxuIik7Ci0JcmV0dXJuIE5GX0RST1A7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGlwX2Nvbm50cmFja19oZWxwZXJfaDI0NSA9IHsKLQkubmFtZSA9ICJILjI0NSIsCi0JLm1lID0gVEhJU19NT0RVTEUsCi0JLm1heF9leHBlY3RlZCA9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDIgLyogVC4xMjAgKi8gLAotCS50aW1lb3V0ID0gMjQwLAotCS50dXBsZSA9IHsuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVENQfX0sCi0JLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKLQkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn19LAotCS5oZWxwID0gaDI0NV9oZWxwCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQotewotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQluZXctPmhlbHBlciA9ICZpcF9jb25udHJhY2tfaGVscGVyX2gyNDU7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGdldF9oMjI1X2FkZHIodW5zaWduZWQgY2hhciAqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCSAgX19iZTMyICogaXAsIHVfaW50MTZfdCAqIHBvcnQpCi17Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCWlmIChhZGRyLT5jaG9pY2UgIT0gZVRyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzKQotCQlyZXR1cm4gMDsKLQotCXAgPSBkYXRhICsgYWRkci0+aXBBZGRyZXNzLmlwOwotCSppcCA9IGh0b25sKChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10pKTsKLQkqcG9ydCA9IChwWzRdIDw8IDgpIHwgKHBbNV0pOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBleHBlY3RfaDI0NShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkcikKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKLQl0eXBlb2YobmF0X2gyNDVfaG9vaykgbmF0X2gyNDU7Ci0KLQkvKiBSZWFkIGgyNDVBZGRyZXNzICovCi0JaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fAotCSAgICBpcCAhPSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwIHx8IHBvcnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDcmVhdGUgZXhwZWN0IGZvciBoMjQ1IGNvbm5lY3Rpb24gKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSAwOwotCi0JaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKLQkgICAgKG5hdF9oMjQ1ID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9oMjQ1X2hvb2spKSkgewotCQkvKiBOQVQgbmVlZGVkICovCi0JCXJldCA9IG5hdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsIGFkZHIsCi0JCQkgICAgICAgcG9ydCwgZXhwKTsKLQl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KLQkJZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19oMjQ1X2V4cGVjdDsKLQotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQkJREVCVUdQKCJpcF9jdF9xOTMxOiBleHBlY3QgSC4yNDUgIgotCQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfQotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEZvcndhcmRpbmcgZGVjbGFyYXRpb24gKi8KLXZvaWQgaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGV4cGVjdF9jYWxsZm9yd2FyZGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkcikKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKLQl0eXBlb2YobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIG5hdF9jYWxsZm9yd2FyZGluZzsKLQotCS8qIFJlYWQgYWx0ZXJuYXRpdmVBZGRyZXNzICovCi0JaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fCBwb3J0ID09IDApCi0JCXJldHVybiAwOwotCi0JLyogSWYgdGhlIGNhbGxpbmcgcGFydHkgaXMgb24gdGhlIHNhbWUgc2lkZSBvZiB0aGUgZm9yd2FyZC10byBwYXJ0eSwKLQkgKiB3ZSBkb24ndCBuZWVkIHRvIHRyYWNrIHRoZSBzZWNvbmQgY2FsbCAqLwotCWlmIChjYWxsZm9yd2FyZF9maWx0ZXIpIHsKLQkJc3RydWN0IHJ0YWJsZSAqcnQxLCAqcnQyOwotCQlzdHJ1Y3QgZmxvd2kgZmwxID0gewotCQkJLmZsNF9kc3QgPSBpcCwKLQkJfTsKLQkJc3RydWN0IGZsb3dpIGZsMiA9IHsKLQkJCS5mbDRfZHN0ID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXAsCi0JCX07Ci0KLQkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0MSwgJmZsMSkgPT0gMCkgewotCQkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0MiwgJmZsMikgPT0gMCkgewotCQkJCWlmIChydDEtPnJ0X2dhdGV3YXkgPT0gcnQyLT5ydF9nYXRld2F5ICYmCi0JCQkJICAgIHJ0MS0+dS5kc3QuZGV2ICA9PSBydDItPnUuZHN0LmRldikKLQkJCQkJcmV0ID0gMTsKLQkJCQlkc3RfcmVsZWFzZSgmcnQyLT51LmRzdCk7Ci0JCQl9Ci0JCQlkc3RfcmVsZWFzZSgmcnQxLT51LmRzdCk7Ci0JCX0KLQkJaWYgKHJldCkgewotCQkJREVCVUdQKCJpcF9jdF9xOTMxOiBDYWxsIEZvcndhcmRpbmcgbm90IHRyYWNrZWRcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKiBDcmVhdGUgZXhwZWN0IGZvciB0aGUgc2Vjb25kIGNhbGwgbGVnICovCi0JaWYgKChleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBpcDsKLQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQlleHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQlleHAtPmZsYWdzID0gMDsKLQotCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmCi0JICAgIChuYXRfY2FsbGZvcndhcmRpbmcgPSByY3VfZGVyZWZlcmVuY2UobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spKSkgewotCQkvKiBOZWVkIE5BVCAqLwotCQlyZXQgPSBuYXRfY2FsbGZvcndhcmRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJIGFkZHIsIHBvcnQsIGV4cCk7Ci0JfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCi0JCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Q7Ci0KLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKLQkJCURFQlVHUCgiaXBfY3RfcTkzMTogZXhwZWN0IENhbGwgRm9yd2FyZGluZyAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3Nfc2V0dXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgU2V0dXBfVVVJRSAqIHNldHVwKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldDsKLQlpbnQgaTsKLQlfX2JlMzIgaXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0JdHlwZW9mKHNldF9oMjI1X2FkZHJfaG9vaykgc2V0X2gyMjVfYWRkcjsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogU2V0dXBcbiIpOwotCi0JaWYgKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZzZXR1cC0+aDI0NUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7Ci0KLQlpZiAoKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfZGVzdENhbGxTaWduYWxBZGRyZXNzKSAmJgotCSAgICAoc2V0X2gyMjVfYWRkcikgJiYKLQkgICAgZ2V0X2gyMjVfYWRkcigqZGF0YSwgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsICZpcCwgJnBvcnQpICYmCi0JICAgIGlwICE9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwKSB7Ci0JCURFQlVHUCgiaXBfY3RfcTkzMTogc2V0IGRlc3RDYWxsU2lnbmFsQWRkcmVzcyAiCi0JCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCSAgICAgICBOSVBRVUFEKGlwKSwgcG9ydCwKLQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXApLAotCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudS50Y3AucG9ydCkpOwotCQlyZXQgPSBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICZzZXR1cC0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAotCQkJCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcCwKLQkJCQkgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuCi0JCQkJCSAgdS50Y3AucG9ydCkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfc291cmNlQ2FsbFNpZ25hbEFkZHJlc3MpICYmCi0JICAgIChzZXRfaDIyNV9hZGRyKSAmJgotCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmc2V0dXAtPnNvdXJjZUNhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KQotCSAgICAmJiBpcCAhPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCkgewotCQlERUJVR1AoImlwX2N0X3E5MzE6IHNldCBzb3VyY2VDYWxsU2lnbmFsQWRkcmVzcyAiCi0JCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCSAgICAgICBOSVBRVUFEKGlwKSwgcG9ydCwKLQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXApLAotCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCQlyZXQgPSBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsCi0JCQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCSAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC4KLQkJCQkJICB1LnRjcC5wb3J0KSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgc2V0dXAtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7Ci0JCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICZzZXR1cC0+ZmFzdFN0YXJ0Lml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2NhbGxwcm9jZWVkaW5nKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkJICBDYWxsUHJvY2VlZGluZ19VVUlFICogY2FsbHByb2MpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogQ2FsbFByb2NlZWRpbmdcbiIpOwotCi0JaWYgKGNhbGxwcm9jLT5vcHRpb25zICYgZUNhbGxQcm9jZWVkaW5nX1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZjYWxscHJvYy0+aDI0NUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoY2FsbHByb2MtPm9wdGlvbnMgJiBlQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNhbGxwcm9jLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmY2FsbHByb2MtPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19jb25uZWN0KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgIENvbm5lY3RfVVVJRSAqIGNvbm5lY3QpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogQ29ubmVjdFxuIik7Ci0KLQlpZiAoY29ubmVjdC0+b3B0aW9ucyAmIGVDb25uZWN0X1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZjb25uZWN0LT5oMjQ1QWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjb25uZWN0LT5vcHRpb25zICYgZUNvbm5lY3RfVVVJRV9mYXN0U3RhcnQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvbm5lY3QtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7Ci0JCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICZjb25uZWN0LT5mYXN0U3RhcnQuaXRlbVtpXSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfYWxlcnRpbmcoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICAgQWxlcnRpbmdfVVVJRSAqIGFsZXJ0KQotewotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQlERUJVR1AoImlwX2N0X3E5MzE6IEFsZXJ0aW5nXG4iKTsKLQotCWlmIChhbGVydC0+b3B0aW9ucyAmIGVBbGVydGluZ19VVUlFX2gyNDVBZGRyZXNzKSB7Ci0JCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAmYWxlcnQtPmgyNDVBZGRyZXNzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGFsZXJ0LT5vcHRpb25zICYgZUFsZXJ0aW5nX1VVSUVfZmFzdFN0YXJ0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhbGVydC0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKLQkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgJmFsZXJ0LT5mYXN0U3RhcnQuaXRlbVtpXSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfaW5mb3JtYXRpb24oc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgICAgICBJbmZvcm1hdGlvbl9VVUlFICogaW5mbykKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBJbmZvcm1hdGlvblxuIik7Ci0KLQlpZiAoaW5mby0+b3B0aW9ucyAmIGVJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKLQkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgJmluZm8tPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19mYWNpbGl0eShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgICBGYWNpbGl0eV9VVUlFICogZmFjaWxpdHkpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogRmFjaWxpdHlcbiIpOwotCi0JaWYgKGZhY2lsaXR5LT5yZWFzb24uY2hvaWNlID09IGVGYWNpbGl0eVJlYXNvbl9jYWxsRm9yd2FyZGVkKSB7Ci0JCWlmIChmYWNpbGl0eS0+b3B0aW9ucyAmIGVGYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWRkcmVzcykKLQkJCXJldHVybiBleHBlY3RfY2FsbGZvcndhcmRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJCSAgICAgZGF0YW9mZiwKLQkJCQkJCSAgICAgJmZhY2lsaXR5LT4KLQkJCQkJCSAgICAgYWx0ZXJuYXRpdmVBZGRyZXNzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGZhY2lsaXR5LT5vcHRpb25zICYgZUZhY2lsaXR5X1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZmYWNpbGl0eS0+aDI0NUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZmFjaWxpdHktPm9wdGlvbnMgJiBlRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGZhY2lsaXR5LT5mYXN0U3RhcnQuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmZmFjaWxpdHktPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19wcm9ncmVzcyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgICBQcm9ncmVzc19VVUlFICogcHJvZ3Jlc3MpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogUHJvZ3Jlc3NcbiIpOwotCi0JaWYgKHByb2dyZXNzLT5vcHRpb25zICYgZVByb2dyZXNzX1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZwcm9ncmVzcy0+aDI0NUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAocHJvZ3Jlc3MtPm9wdGlvbnMgJiBlUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHByb2dyZXNzLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmcHJvZ3Jlc3MtPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19xOTMxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwgUTkzMSAqIHE5MzEpCi17Ci0JSDMyM19VVV9QRFUgKnBkdSA9ICZxOTMxLT5VVUlFLmgzMjNfdXVfcGR1OwotCWludCBpOwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNob2ljZSkgewotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3NldHVwOgotCQlyZXQgPSBwcm9jZXNzX3NldHVwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LnNldHVwKTsKLQkJYnJlYWs7Ci0JY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfY2FsbFByb2NlZWRpbmc6Ci0JCXJldCA9IHByb2Nlc3NfY2FsbHByb2NlZWRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS4KLQkJCQkJICAgICBjYWxsUHJvY2VlZGluZyk7Ci0JCWJyZWFrOwotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2Nvbm5lY3Q6Ci0JCXJldCA9IHByb2Nlc3NfY29ubmVjdChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNvbm5lY3QpOwotCQlicmVhazsKLQljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9hbGVydGluZzoKLQkJcmV0ID0gcHJvY2Vzc19hbGVydGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5hbGVydGluZyk7Ci0JCWJyZWFrOwotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2luZm9ybWF0aW9uOgotCQlyZXQgPSBwcm9jZXNzX2luZm9ybWF0aW9uKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuCi0JCQkJCSAgaW5mb3JtYXRpb24pOwotCQlicmVhazsKLQljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9mYWNpbGl0eToKLQkJcmV0ID0gcHJvY2Vzc19mYWNpbGl0eShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5mYWNpbGl0eSk7Ci0JCWJyZWFrOwotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3Byb2dyZXNzOgotCQlyZXQgPSBwcm9jZXNzX3Byb2dyZXNzKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LnByb2dyZXNzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJREVCVUdQKCJpcF9jdF9xOTMxOiBRLjkzMSBzaWduYWwgJWRcbiIsCi0JCSAgICAgICBwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNob2ljZSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocGR1LT5vcHRpb25zICYgZUgzMjNfVVVfUERVX2gyNDVDb250cm9sKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwZHUtPmgyNDVDb250cm9sLmNvdW50OyBpKyspIHsKLQkJCXJldCA9IHByb2Nlc3NfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAmcGR1LT5oMjQ1Q29udHJvbC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcTkzMV9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0Jc3RhdGljIFE5MzEgcTkzMTsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gTlVMTDsKLQlpbnQgZGF0YWxlbjsKLQlpbnQgZGF0YW9mZjsKLQlpbnQgcmV0OwotCi0JLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCi0JaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRAotCSAgICAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgewotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQlERUJVR1AoImlwX2N0X3E5MzE6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCi0JLyogUHJvY2VzcyBlYWNoIFRQS1QgKi8KLQl3aGlsZSAoZ2V0X3Rwa3RfZGF0YShwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgJmRhdGFsZW4sICZkYXRhb2ZmKSkgewotCQlERUJVR1AoImlwX2N0X3E5MzE6IFRQS1QgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1LCBsZW49JWRcbiIsCi0JCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIpLAotCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSwgZGF0YWxlbik7Ci0KLQkJLyogRGVjb2RlIFEuOTMxIHNpZ25hbCAqLwotCQlyZXQgPSBEZWNvZGVROTMxKGRhdGEsIGRhdGFsZW4sICZxOTMxKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKCJpcF9jdF9xOTMxOiBkZWNvZGluZyBlcnJvcjogJXNcbiIsCi0JCQkJICAgICAgIHJldCA9PSBIMzIzX0VSUk9SX0JPVU5EID8KLQkJCQkgICAgICAgIm91dCBvZiBib3VuZCIgOiAib3V0IG9mIHJhbmdlIik7Ci0JCQkvKiBXZSBkb24ndCBkcm9wIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogUHJvY2VzcyBRLjkzMSBzaWduYWwgKi8KLQkJaWYgKHByb2Nlc3NfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgZGF0YW9mZiwgJnE5MzEpIDwgMCkKLQkJCWdvdG8gZHJvcDsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmaXBfaDMyM19sb2NrKTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi0gICAgICBkcm9wOgotCXNwaW5fdW5sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCXByaW50aygiaXBfY3RfcTkzMTogcGFja2V0IGRyb3BwZWRcbiIpOwotCXJldHVybiBORl9EUk9QOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBpcF9jb25udHJhY2tfaGVscGVyX3E5MzEgPSB7Ci0JLm5hbWUgPSAiUS45MzEiLAotCS5tZSA9IFRISVNfTU9EVUxFLAotCS5tYXhfZXhwZWN0ZWQgPSBIMzIzX1JUUF9DSEFOTkVMX01BWCAqIDQgKyA0IC8qIFQuMTIwIGFuZCBILjI0NSAqLyAsCi0JLnRpbWVvdXQgPSAyNDAsCi0JLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnRjcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoUTkzMV9QT1JUKX19fSwKLQkJICAuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVENQfX0sCi0JLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKLQkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn19LAotCS5oZWxwID0gcTkzMV9oZWxwCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQotewotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQluZXctPmhlbHBlciA9ICZpcF9jb25udHJhY2tfaGVscGVyX3E5MzE7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdldF91ZHBfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGludCAqZGF0YWxlbikKLXsKLQlzdHJ1Y3QgdWRwaGRyIF91aCwgKnVoOwotCWludCBkYXRhb2ZmOwotCi0JdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCwgc2l6ZW9mKF91aCksCi0JCQkJJl91aCk7Ci0JaWYgKHVoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2YoX3VoKTsKLQlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCi0JCXJldHVybiBOVUxMOwotCSpkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKLQlyZXR1cm4gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBkYXRhb2ZmLCAqZGF0YWxlbiwgaDMyM19idWZmZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZmluZF9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJCSAgICAgICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQotCXR1cGxlLnNyYy5pcCA9IDA7Ci0JdHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCXR1cGxlLmRzdC5pcCA9IGlwOwotCXR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JdHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0KLQlleHAgPSBfX2lwX2Nvbm50cmFja19leHBlY3RfZmluZCgmdHVwbGUpOwotCWlmIChleHAgJiYgZXhwLT5tYXN0ZXIgPT0gY3QpCi0JCXJldHVybiBleHA7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRfZXhwZWN0X3RpbWVvdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKLQkJCSAgICAgIHVuc2lnbmVkIHRpbWVvdXQpCi17Ci0JaWYgKCFleHAgfHwgIWRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkKLQkJcmV0dXJuIDA7Ci0KLQlleHAtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0ICogSFo7Ci0JYWRkX3RpbWVyKCZleHAtPnRpbWVvdXQpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBleHBlY3RfcTkzMShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKLQkJICAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCWludCBpOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXR5cGVvZihuYXRfcTkzMV9ob29rKSBuYXRfcTkzMTsKLQotCS8qIExvb2sgZm9yIHRoZSBmaXJzdCByZWxhdGVkIGFkZHJlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAoZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmFkZHJbaV0sICZpcCwgJnBvcnQpICYmCi0JCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmIHBvcnQgIT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IGNvdW50KQkJLyogTm90IGZvdW5kICovCi0JCXJldHVybiAwOwotCi0JLyogQ3JlYXRlIGV4cGVjdCBmb3IgUS45MzEgKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBna3JvdXRlZF9vbmx5ID8JLyogb25seSBhY2NlcHQgY2FsbHMgZnJvbSBHSz8gKi8KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXAgOiAwOwotCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JZXhwLT5tYXNrLnNyYy5pcCA9IGdrcm91dGVkX29ubHkgPyBodG9ubCgweEZGRkZGRkZGKSA6IDA7Ci0JZXhwLT5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQlleHAtPmZsYWdzID0gSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVDsJLyogQWNjZXB0IG11bHRpcGxlIGNhbGxzICovCi0KLQluYXRfcTkzMSA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcTkzMV9ob29rKTsKLQlpZiAobmF0X3E5MzEpIHsJLyogTmVlZCBOQVQgKi8KLQkJcmV0ID0gbmF0X3E5MzEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgYWRkciwgaSwgcG9ydCwgZXhwKTsKLQl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KLQkJZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdDsKLQotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQkJREVCVUdQKCJpcF9jdF9yYXM6IGV4cGVjdCBRLjkzMSAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQotCQkJLyogU2F2ZSBwb3J0IGZvciBsb29raW5nIHVwIGV4cGVjdCBpbiBwcm9jZXNzaW5nIFJDRiAqLwotCQkJaW5mby0+c2lnX3BvcnRbZGlyXSA9IHBvcnQ7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfQotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2dycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgR2F0ZWtlZXBlclJlcXVlc3QgKiBncnEpCi17Ci0JdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogR1JRXG4iKTsKLQotCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7Ci0JaWYgKHNldF9yYXNfYWRkcikJLyogTkFUZWQgKi8KLQkJcmV0dXJuIHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICAmZ3JxLT5yYXNBZGRyZXNzLCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRGVjbGFyZSBiZWZvcmUgdXNpbmcgKi8KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19yYXNfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19nY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIEdhdGVrZWVwZXJDb25maXJtICogZ2NmKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogR0NGXG4iKTsKLQotCWlmICghZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmdjZi0+cmFzQWRkcmVzcywgJmlwLCAmcG9ydCkpCi0JCXJldHVybiAwOwotCi0JLyogUmVnaXN0cmF0aW9uIHBvcnQgaXMgdGhlIHNhbWUgYXMgZGlzY292ZXJ5IHBvcnQgKi8KLQlpZiAoaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJgotCSAgICBwb3J0ID09IG50b2hzKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudS51ZHAucG9ydCkpCi0JCXJldHVybiAwOwotCi0JLyogQXZvaWQgUkFTIGV4cGVjdGF0aW9uIGxvb3BzLiBBIEdDRiBpcyBuZXZlciBleHBlY3RlZC4gKi8KLQlpZiAodGVzdF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpKQotCQlyZXR1cm4gMDsKLQotCS8qIE5lZWQgbmV3IGV4cGVjdCAqLwotCWlmICgoZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7Ci0JZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JZXhwLT5mbGFncyA9IDA7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19yYXNfZXhwZWN0OwotCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7Ci0JCURFQlVHUCgiaXBfY3RfcmFzOiBleHBlY3QgUkFTICIKLQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQl9IGVsc2UKLQkJcmV0ID0gLTE7Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfcnJxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBSZWdpc3RyYXRpb25SZXF1ZXN0ICogcnJxKQotewotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87Ci0JaW50IHJldDsKLQl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBSUlFcbiIpOwotCi0JcmV0ID0gZXhwZWN0X3E5MzEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCSAgcnJxLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJICBycnEtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC0xOwotCi0Jc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKLQlpZiAoc2V0X3Jhc19hZGRyKSB7Ci0JCXJldCA9IHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgIHJycS0+cmFzQWRkcmVzcy5pdGVtLAotCQkJCSAgIHJycS0+cmFzQWRkcmVzcy5jb3VudCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChycnEtPm9wdGlvbnMgJiBlUmVnaXN0cmF0aW9uUmVxdWVzdF90aW1lVG9MaXZlKSB7Ci0JCURFQlVHUCgiaXBfY3RfcmFzOiBSUlEgVFRMID0gJXUgc2Vjb25kc1xuIiwgcnJxLT50aW1lVG9MaXZlKTsKLQkJaW5mby0+dGltZW91dCA9IHJycS0+dGltZVRvTGl2ZTsKLQl9IGVsc2UKLQkJaW5mby0+dGltZW91dCA9IGRlZmF1bHRfcnJxX3R0bDsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19yY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFJlZ2lzdHJhdGlvbkNvbmZpcm0gKiByY2YpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQl0eXBlb2Yoc2V0X3NpZ19hZGRyX2hvb2spIHNldF9zaWdfYWRkcjsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBSQ0ZcbiIpOwotCi0Jc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKLQlpZiAoc2V0X3NpZ19hZGRyKSB7Ci0JCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgIHJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKLQkJCQkgICByY2YtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHJjZi0+b3B0aW9ucyAmIGVSZWdpc3RyYXRpb25Db25maXJtX3RpbWVUb0xpdmUpIHsKLQkJREVCVUdQKCJpcF9jdF9yYXM6IFJDRiBUVEwgPSAldSBzZWNvbmRzXG4iLCByY2YtPnRpbWVUb0xpdmUpOwotCQlpbmZvLT50aW1lb3V0ID0gcmNmLT50aW1lVG9MaXZlOwotCX0KLQotCWlmIChpbmZvLT50aW1lb3V0ID4gMCkgewotCQlERUJVR1AKLQkJICAgICgiaXBfY3RfcmFzOiBzZXQgUkFTIGNvbm5lY3Rpb24gdGltZW91dCB0byAldSBzZWNvbmRzXG4iLAotCQkgICAgIGluZm8tPnRpbWVvdXQpOwotCQlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgaW5mby0+dGltZW91dCAqIEhaKTsKLQotCQkvKiBTZXQgZXhwZWN0IHRpbWVvdXQgKi8KLQkJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCWV4cCA9IGZpbmRfZXhwZWN0KGN0LCBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LmlwLAotCQkJCSAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwotCQlpZiAoZXhwKSB7Ci0JCQlERUJVR1AoImlwX2N0X3Jhczogc2V0IFEuOTMxIGV4cGVjdCAiCi0JCQkgICAgICAgIigldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodSkgIgotCQkJICAgICAgICJ0aW1lb3V0IHRvICV1IHNlY29uZHNcbiIsCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCksCi0JCQkgICAgICAgaW5mby0+dGltZW91dCk7Ci0JCQlzZXRfZXhwZWN0X3RpbWVvdXQoZXhwLCBpbmZvLT50aW1lb3V0KTsKLQkJfQotCQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc191cnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFVucmVnaXN0cmF0aW9uUmVxdWVzdCAqIHVycSkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldDsKLQl0eXBlb2Yoc2V0X3NpZ19hZGRyX2hvb2spIHNldF9zaWdfYWRkcjsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBVUlFcbiIpOwotCi0Jc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKLQlpZiAoc2V0X3NpZ19hZGRyKSB7Ci0JCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgIHVycS0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKLQkJCQkgICB1cnEtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2xlYXIgb2xkIGV4cGVjdCAqLwotCWlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOwotCWluZm8tPnNpZ19wb3J0W2Rpcl0gPSAwOwotCWluZm8tPnNpZ19wb3J0WyFkaXJdID0gMDsKLQotCS8qIEdpdmUgaXQgMzAgc2Vjb25kcyBmb3IgVUNGIG9yIFVSSiAqLwotCWlwX2N0X3JlZnJlc2goY3QsICpwc2tiLCAzMCAqIEhaKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19hcnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIEFkbWlzc2lvblJlcXVlc3QgKiBhcnEpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQl0eXBlb2Yoc2V0X2gyMjVfYWRkcl9ob29rKSBzZXRfaDIyNV9hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IEFSUVxuIik7Ci0KLQlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7Ci0JaWYgKChhcnEtPm9wdGlvbnMgJiBlQWRtaXNzaW9uUmVxdWVzdF9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCi0JICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKLQkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJgotCSAgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0gJiYgc2V0X2gyMjVfYWRkcikgewotCQkvKiBBbnN3ZXJpbmcgQVJRICovCi0JCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsCi0JCQkJICAgICAmYXJxLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCi0JCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkgICAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKLQl9Ci0KLQlpZiAoKGFycS0+b3B0aW9ucyAmIGVBZG1pc3Npb25SZXF1ZXN0X3NyY0NhbGxTaWduYWxBZGRyZXNzKSAmJgotCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKLQkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJiBzZXRfaDIyNV9hZGRyKSB7Ci0JCS8qIENhbGxpbmcgQVJRICovCi0JCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsCi0JCQkJICAgICAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkgICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCSAgICAgcG9ydCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2FjZihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgQWRtaXNzaW9uQ29uZmlybSAqIGFjZikKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IEFDRlxuIik7Ci0KLQlpZiAoIWdldF9oMjI1X2FkZHIoKmRhdGEsICZhY2YtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkpCi0JCXJldHVybiAwOwotCi0JaWYgKGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QuaXApIHsJLyogQW5zd2VyaW5nIEFDRiAqLwotCQlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOwotCQlpZiAoc2V0X3NpZ19hZGRyKQotCQkJcmV0dXJuIHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQkgICAgJmFjZi0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAxKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogTmVlZCBuZXcgZXhwZWN0ICovCi0JaWYgKChleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBpcDsKLQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQlleHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQlleHAtPmZsYWdzID0gSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVDsKLQlleHAtPmV4cGVjdGZuID0gaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0OwotCi0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKLQkJREVCVUdQKCJpcF9jdF9yYXM6IGV4cGVjdCBRLjkzMSAiCi0JCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwKLQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksCi0JCSAgICAgICBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0JfSBlbHNlCi0JCXJldCA9IC0xOwotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2xycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgTG9jYXRpb25SZXF1ZXN0ICogbHJxKQotewotCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IExSUVxuIik7Ci0KLQlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOwotCWlmIChzZXRfcmFzX2FkZHIpCi0JCXJldHVybiBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAgJmxycS0+cmVwbHlBZGRyZXNzLCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfbGNmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBMb2NhdGlvbkNvbmZpcm0gKiBsY2YpCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0ID0gMDsKLQlfX2JlMzIgaXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IE5VTEw7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogTENGXG4iKTsKLQotCWlmICghZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmxjZi0+Y2FsbFNpZ25hbEFkZHJlc3MsICZpcCwgJnBvcnQpKQotCQlyZXR1cm4gMDsKLQotCS8qIE5lZWQgbmV3IGV4cGVjdCBmb3IgY2FsbCBzaWduYWwgKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPnR1cGxlLmRzdC5pcCA9IGlwOwotCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Q7Ci0KLQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQlERUJVR1AoImlwX2N0X3JhczogZXhwZWN0IFEuOTMxICIKLQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQl9IGVsc2UKLQkJcmV0ID0gLTE7Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JLyogSWdub3JlIHJhc0FkZHJlc3MgKi8KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2lycihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgSW5mb1JlcXVlc3RSZXNwb25zZSAqIGlycikKLXsKLQlpbnQgcmV0OwotCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOwotCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IElSUlxuIik7Ci0KLQlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOwotCWlmIChzZXRfcmFzX2FkZHIpIHsKLQkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJmlyci0+cmFzQWRkcmVzcywgMSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7Ci0JaWYgKHNldF9zaWdfYWRkcikgewotCQlyZXQgPSBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICBpcnItPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCi0JCQkJICAgaXJyLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19yYXMoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFJhc01lc3NhZ2UgKiByYXMpCi17Ci0Jc3dpdGNoIChyYXMtPmNob2ljZSkgewotCWNhc2UgZVJhc01lc3NhZ2VfZ2F0ZWtlZXBlclJlcXVlc3Q6Ci0JCXJldHVybiBwcm9jZXNzX2dycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPmdhdGVrZWVwZXJSZXF1ZXN0KTsKLQljYXNlIGVSYXNNZXNzYWdlX2dhdGVrZWVwZXJDb25maXJtOgotCQlyZXR1cm4gcHJvY2Vzc19nY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5nYXRla2VlcGVyQ29uZmlybSk7Ci0JY2FzZSBlUmFzTWVzc2FnZV9yZWdpc3RyYXRpb25SZXF1ZXN0OgotCQlyZXR1cm4gcHJvY2Vzc19ycnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5yZWdpc3RyYXRpb25SZXF1ZXN0KTsKLQljYXNlIGVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvbkNvbmZpcm06Ci0JCXJldHVybiBwcm9jZXNzX3JjZihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPnJlZ2lzdHJhdGlvbkNvbmZpcm0pOwotCWNhc2UgZVJhc01lc3NhZ2VfdW5yZWdpc3RyYXRpb25SZXF1ZXN0OgotCQlyZXR1cm4gcHJvY2Vzc191cnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT51bnJlZ2lzdHJhdGlvblJlcXVlc3QpOwotCWNhc2UgZVJhc01lc3NhZ2VfYWRtaXNzaW9uUmVxdWVzdDoKLQkJcmV0dXJuIHByb2Nlc3NfYXJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+YWRtaXNzaW9uUmVxdWVzdCk7Ci0JY2FzZSBlUmFzTWVzc2FnZV9hZG1pc3Npb25Db25maXJtOgotCQlyZXR1cm4gcHJvY2Vzc19hY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5hZG1pc3Npb25Db25maXJtKTsKLQljYXNlIGVSYXNNZXNzYWdlX2xvY2F0aW9uUmVxdWVzdDoKLQkJcmV0dXJuIHByb2Nlc3NfbHJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+bG9jYXRpb25SZXF1ZXN0KTsKLQljYXNlIGVSYXNNZXNzYWdlX2xvY2F0aW9uQ29uZmlybToKLQkJcmV0dXJuIHByb2Nlc3NfbGNmKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+bG9jYXRpb25Db25maXJtKTsKLQljYXNlIGVSYXNNZXNzYWdlX2luZm9SZXF1ZXN0UmVzcG9uc2U6Ci0JCXJldHVybiBwcm9jZXNzX2lycihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPmluZm9SZXF1ZXN0UmVzcG9uc2UpOwotCWRlZmF1bHQ6Ci0JCURFQlVHUCgiaXBfY3RfcmFzOiBSQVMgbWVzc2FnZSAlZFxuIiwgcmFzLT5jaG9pY2UpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHJhc19oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdGF0aWMgUmFzTWVzc2FnZSByYXM7Ci0JdW5zaWduZWQgY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbiA9IDA7Ci0JaW50IHJldDsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKLQotCXNwaW5fbG9ja19iaCgmaXBfaDMyM19sb2NrKTsKLQotCS8qIEdldCBVRFAgZGF0YSAqLwotCWRhdGEgPSBnZXRfdWRwX2RhdGEocHNrYiwgJmRhdGFsZW4pOwotCWlmIChkYXRhID09IE5VTEwpCi0JCWdvdG8gYWNjZXB0OwotCURFQlVHUCgiaXBfY3RfcmFzOiBSQVMgbWVzc2FnZSAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUsIGxlbj0lZFxuIiwKLQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPnNhZGRyKSwKLQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSwgZGF0YWxlbik7Ci0KLQkvKiBEZWNvZGUgUkFTIG1lc3NhZ2UgKi8KLQlyZXQgPSBEZWNvZGVSYXNNZXNzYWdlKGRhdGEsIGRhdGFsZW4sICZyYXMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwX2N0X3JhczogZGVjb2RpbmcgZXJyb3I6ICVzXG4iLAotCQkJICAgICAgIHJldCA9PSBIMzIzX0VSUk9SX0JPVU5EID8KLQkJCSAgICAgICAib3V0IG9mIGJvdW5kIiA6ICJvdXQgb2YgcmFuZ2UiKTsKLQkJZ290byBhY2NlcHQ7Ci0JfQotCi0JLyogUHJvY2VzcyBSQVMgbWVzc2FnZSAqLwotCWlmIChwcm9jZXNzX3Jhcyhwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgJnJhcykgPCAwKQotCQlnb3RvIGRyb3A7Ci0KLSAgICAgIGFjY2VwdDoKLQlzcGluX3VubG9ja19iaCgmaXBfaDMyM19sb2NrKTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi0gICAgICBkcm9wOgotCXNwaW5fdW5sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCXByaW50aygiaXBfY3RfcmFzOiBwYWNrZXQgZHJvcHBlZFxuIik7Ci0JcmV0dXJuIE5GX0RST1A7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGlwX2Nvbm50cmFja19oZWxwZXJfcmFzID0gewotCS5uYW1lID0gIlJBUyIsCi0JLm1lID0gVEhJU19NT0RVTEUsCi0JLm1heF9leHBlY3RlZCA9IDMyLAotCS50aW1lb3V0ID0gMjQwLAotCS50dXBsZSA9IHsuc3JjID0gey51ID0gey50Y3AgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKFJBU19QT1JUKX19fSwKLQkJICAuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVURQfX0sCi0JLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkV9fSwKLQkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn19LAotCS5oZWxwID0gcmFzX2hlbHAsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19yYXNfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCW5ldy0+aGVscGVyID0gJmlwX2Nvbm50cmFja19oZWxwZXJfcmFzOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE5vdCBfX2V4aXQgLSBjYWxsZWQgZnJvbSBpbml0KCkgKi8KLXN0YXRpYyB2b2lkIGZpbmkodm9pZCkKLXsKLQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmlwX2Nvbm50cmFja19oZWxwZXJfcmFzKTsKLQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmlwX2Nvbm50cmFja19oZWxwZXJfcTkzMSk7Ci0Ja2ZyZWUoaDMyM19idWZmZXIpOwotCURFQlVHUCgiaXBfY3RfaDMyMzogZmluaVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQloMzIzX2J1ZmZlciA9IGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOwotCWlmICghaDMyM19idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgocmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmaXBfY29ubnRyYWNrX2hlbHBlcl9xOTMxKSkgfHwKLQkgICAgKHJldCA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmlwX2Nvbm50cmFja19oZWxwZXJfcmFzKSkpIHsKLQkJZmluaSgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlERUJVR1AoImlwX2N0X2gzMjM6IGluaXQgc3VjY2Vzc1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2gyMjVfYWRkcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfaDI0NV9leHBlY3QpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNldF9oMjQ1X2FkZHJfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzZXRfaDIyNV9hZGRyX2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwoc2V0X3NpZ19hZGRyX2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwoc2V0X3Jhc19hZGRyX2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwobmF0X3J0cF9ydGNwX2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwobmF0X3QxMjBfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuYXRfaDI0NV9ob29rKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5hdF9xOTMxX2hvb2spOwotCi1NT0RVTEVfQVVUSE9SKCJKaW5nIE1pbiBaaGFvIDx6aGFvamluZ21pbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkguMzIzIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzYwYzUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qCi0gKiBpcF9jb25udHJhY2tfcHB0cC5jCS0gVmVyc2lvbiAzLjAKLSAqCi0gKiBDb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgZm9yIFBQVFAgKFBvaW50IHRvIFBvaW50IFR1bm5lbGluZyBQcm90b2NvbCkuCi0gKiBQUFRQIGlzIGEgYSBwcm90b2NvbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBwcml2YXRlIG5ldHdvcmtzLgotICogSXQgaXMgYSBzcGVjaWZpY2F0aW9uIGRlZmluZWQgYnkgTWljcm9zb2Z0IGFuZCBzb21lIHZlbmRvcnMKLSAqIHdvcmtpbmcgd2l0aCBNaWNyb3NvZnQuICBQUFRQIGlzIGJ1aWx0IG9uIHRvcCBvZiBhIG1vZGlmaWVkCi0gKiB2ZXJzaW9uIG9mIHRoZSBJbnRlcm5ldCBHZW5lcmljIFJvdXRpbmcgRW5jYXBzdWxhdGlvbiBQcm90b2NvbC4KLSAqIEdSRSBpcyBkZWZpbmVkIGluIFJGQyAxNzAxIGFuZCBSRkMgMTcwMi4gIERvY3VtZW50YXRpb24gb2YKLSAqIFBQVFAgY2FuIGJlIGZvdW5kIGluIFJGQyAyNjM3Ci0gKgotICogKEMpIDIwMDAtMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICoKLSAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQotICoKLSAqIExpbWl0YXRpb25zOgotICogCSAtIFdlIGJsaW5kbHkgYXNzdW1lIHRoYXQgY29udHJvbCBjb25uZWN0aW9ucyBhcmUgYWx3YXlzCi0gKiAJICAgZXN0YWJsaXNoZWQgaW4gUE5TLT5QQUMgZGlyZWN0aW9uLiAgVGhpcyBpcyBhIHZpb2xhdGlvbgotICogCSAgIG9mIFJGRkMyNjczCi0gKiAJIC0gV2UgY2FuIG9ubHkgc3VwcG9ydCBvbmUgc2luZ2xlIGNhbGwgd2l0aGluIGVhY2ggc2Vzc2lvbgotICoKLSAqIFRPRE86Ci0gKgkgLSB0ZXN0aW5nIG9mIGluY29taW5nIFBQVFAgY2FsbHMKLSAqCi0gKiBDaGFuZ2VzOgotICogCTIwMDItMDItMDUgLSBWZXJzaW9uIDEuMwotICogCSAgLSBDYWxsIGlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKCkgZnJvbQotICogCSAgICBwcHRwX2Rlc3Ryb3lfc2libGluZ3MoKSB0byBkZXN0cm95IGV4cGVjdGF0aW9ucyBpbiBjYXNlCi0gKiAJICAgIENBTExfRElTQ09OTkVDVF9OT1RJRlkgb3IgdGNwIGZpbiBwYWNrZXQgd2FzIHNlZW4KLSAqIAkgICAgKFBoaWxpcCBDcmFpZyA8cGhpbGlwY0BzbmFwZ2Vhci5jb20+KQotICogCSAgLSBBZGQgVmVyc2lvbiBpbmZvcm1hdGlvbiBhdCBtb2R1bGUgbG9hZHRpbWUKLSAqIAkyMDAyLTAyLTEwIC0gVmVyc2lvbiAxLjYKLSAqIAkgIC0gbW92ZSB0byBDOTkgc3R5bGUgaW5pdGlhbGl6ZXJzCi0gKiAJICAtIHJlbW92ZSBzZWNvbmQgZXhwZWN0YXRpb24gaWYgZmlyc3QgYXJyaXZlcwotICogCTIwMDQtMTAtMjIgLSBWZXJzaW9uIDIuMAotICogCSAgLSBtZXJnZSBNYW5kcmFrZSdzIDIuNi54IHBvcnQgd2l0aCByZWNlbnQgMi42LnggQVBJIGNoYW5nZXMKLSAqIAkgIC0gZml4IGxvdHMgb2YgbGluZWFyIHNrYiBhc3N1bXB0aW9ucyBmcm9tIE1hbmRyYWtlJ3MgcG9ydAotICogCTIwMDUtMDYtMTAgLSBWZXJzaW9uIDIuMQotICogCSAgLSB1c2UgaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKCkgaW5zdGVhZCBvZiBrZnJlZSgpIG9uIHRoZQotICogCSAgICBleHBlY3QncyAod2hpY2ggYXJlIGZyb20gdGhlIHNsYWIgZm9yIHF1aXRlIHNvbWUgdGltZSkKLSAqIAkyMDA1LTA2LTEwIC0gVmVyc2lvbiAzLjAKLSAqIAkgIC0gcG9ydCBoZWxwZXIgdG8gcG9zdC0yLjYuMTEgQVBJIGNoYW5nZXMsCi0gKiAJICAgIGZ1bmRlZCBieSBPeGNvZGEgTmV0Qm94IEJsdWUgKGh0dHA6Ly93d3cubmV0Ym94Ymx1ZS5jb20vKQotICogCTIwMDUtMDctMzAgLSBWZXJzaW9uIDMuMQotICogCSAgLSBwb3J0IGhlbHBlciB0byAyLjYuMTMgQVBJIGNoYW5nZXMKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmg+Ci0KLSNkZWZpbmUgSVBfQ1RfUFBUUF9WRVJTSU9OICIzLjEiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciBtb2R1bGUgZm9yIFBQVFAiKTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhpcF9wcHRwX2xvY2spOwotCi1pbnQKLSgqaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKLQotaW50Ci0oKmlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKLQotdm9pZAotKCppcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3Rfb3JpZywKLQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0X3JlcGx5KTsKLQotdm9pZAotKCppcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci0KLSNpZiAwCi0vKiBQcHRwQ29udHJvbE1lc3NhZ2VUeXBlIG5hbWVzICovCi1jb25zdCBjaGFyICpwcHRwX21zZ19uYW1lW10gPSB7Ci0JIlVOS05PV05fTUVTU0FHRSIsCi0JIlNUQVJUX1NFU1NJT05fUkVRVUVTVCIsCi0JIlNUQVJUX1NFU1NJT05fUkVQTFkiLAotCSJTVE9QX1NFU1NJT05fUkVRVUVTVCIsCi0JIlNUT1BfU0VTU0lPTl9SRVBMWSIsCi0JIkVDSE9fUkVRVUVTVCIsCi0JIkVDSE9fUkVQTFkiLAotCSJPVVRfQ0FMTF9SRVFVRVNUIiwKLQkiT1VUX0NBTExfUkVQTFkiLAotCSJJTl9DQUxMX1JFUVVFU1QiLAotCSJJTl9DQUxMX1JFUExZIiwKLQkiSU5fQ0FMTF9DT05ORUNUIiwKLQkiQ0FMTF9DTEVBUl9SRVFVRVNUIiwKLQkiQ0FMTF9ESVNDT05ORUNUX05PVElGWSIsCi0JIldBTl9FUlJPUl9OT1RJRlkiLAotCSJTRVRfTElOS19JTkZPIgotfTsKLUVYUE9SVF9TWU1CT0wocHB0cF9tc2dfbmFtZSk7Ci0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICIlczolczogIiBmb3JtYXQsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgU0VDUyAqSFoKLSNkZWZpbmUgTUlOUyAqIDYwIFNFQ1MKLSNkZWZpbmUgSE9VUlMgKiA2MCBNSU5TCi0KLSNkZWZpbmUgUFBUUF9HUkVfVElNRU9VVCAJCSgxMCBNSU5TKQotI2RlZmluZSBQUFRQX0dSRV9TVFJFQU1fVElNRU9VVCAJKDUgSE9VUlMpCi0KLXN0YXRpYyB2b2lkIHBwdHBfZXhwZWN0Zm4oc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbikgaXBfbmF0X3BwdHBfZXhwZWN0Zm47Ci0KLQlERUJVR1AoImluY3JlYXNpbmcgdGltZW91dHNcbiIpOwotCi0JLyogaW5jcmVhc2UgdGltZW91dCBvZiBHUkUgZGF0YSBjaGFubmVsIGNvbm50cmFjayBlbnRyeSAqLwotCWN0LT5wcm90by5ncmUudGltZW91dCA9IFBQVFBfR1JFX1RJTUVPVVQ7Ci0JY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IFBQVFBfR1JFX1NUUkVBTV9USU1FT1VUOwotCi0JLyogQ2FuIHlvdSBzZWUgaG93IHJ1c3R5IHRoaXMgY29kZSBpcywgY29tcGFyZWQgd2l0aCB0aGUgcHJlLTIuNi4xMQotCSAqIG9uZT8gVGhhdCdzIHdoYXQgaGFwcGVuZWQgdG8gbXkgc2hpbnkgbmV3bmF0IG9mIDIwMDIgOyggLUhXICovCi0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaXBfbmF0X3BwdHBfZXhwZWN0Zm4gPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19leHBlY3Rmbik7Ci0JaWYgKCFpcF9uYXRfcHB0cF9leHBlY3RmbikgewotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGludl90OwotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwX290aGVyOwotCi0JCS8qIG9idmlvdXNseSB0aGlzIHR1cGxlIGludmVyc2lvbiBvbmx5IHdvcmtzIHVudGlsIHlvdSBkbyBOQVQgKi8KLQkJaW52ZXJ0X3R1cGxlcHIoJmludl90LCAmZXhwLT50dXBsZSk7Ci0JCURFQlVHUCgidHJ5aW5nIHRvIHVuZXhwZWN0IG90aGVyIGRpcjogIik7Ci0JCURVTVBfVFVQTEUoJmludl90KTsKLQotCQlleHBfb3RoZXIgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KCZpbnZfdCk7Ci0JCWlmIChleHBfb3RoZXIpIHsKLQkJCS8qIGRlbGV0ZSBvdGhlciBleHBlY3RhdGlvbi4gICovCi0JCQlERUJVR1AoImZvdW5kXG4iKTsKLQkJCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cF9vdGhlcik7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHBfb3RoZXIpOwotCQl9IGVsc2UgewotCQkJREVCVUdQKCJub3QgZm91bmRcbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogd2UgbmVlZCBtb3JlIHRoYW4gc2ltcGxlIGludmVyc2lvbiAqLwotCQlpcF9uYXRfcHB0cF9leHBlY3RmbihjdCwgZXhwKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGVzdHJveV9zaWJsaW5nX29yX2V4cChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCi0JREVCVUdQKCJ0cnlpbmcgdG8gdGltZW91dCBjdCBvciBleHAgZm9yIHR1cGxlICIpOwotCURVTVBfVFVQTEUodCk7Ci0KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KHQsIE5VTEwpOwotCWlmIChoKSAgewotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpzaWJsaW5nID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQkJREVCVUdQKCJzZXR0aW5nIHRpbWVvdXQgb2YgY29ubnRyYWNrICVwIHRvIDBcbiIsIHNpYmxpbmcpOwotCQlzaWJsaW5nLT5wcm90by5ncmUudGltZW91dCA9IDA7Ci0JCXNpYmxpbmctPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IDA7Ci0JCWlmIChkZWxfdGltZXIoJnNpYmxpbmctPnRpbWVvdXQpKQotCQkJc2libGluZy0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZylzaWJsaW5nKTsKLQkJaXBfY29ubnRyYWNrX3B1dChzaWJsaW5nKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCh0KTsKLQkJaWYgKGV4cCkgewotCQkJREVCVUdQKCJ1bmV4cGVjdF9yZWxhdGVkIG9mIGV4cGVjdCAlcFxuIiwgZXhwKTsKLQkJCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKiB0aW1lb3V0IEdSRSBkYXRhIGNvbm5lY3Rpb25zICovCi1zdGF0aWMgdm9pZCBwcHRwX2Rlc3Ryb3lfc2libGluZ3Moc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0OwotCi0JaXBfY3RfZ3JlX2tleW1hcF9kZXN0cm95KGN0KTsKLQkvKiBTaW5jZSBjdC0+c2libGluZ19saXN0IGhhcyBsaXRlcmFsbHkgcnVzdGVkIGF3YXkgaW4gMi42LjExLAotCSAqIHdlIG5vdyBuZWVkIGFub3RoZXIgd2F5IHRvIGZpbmQgb3V0IGFib3V0IG91ciBzaWJsaW5nCi0JICogY29udHJhY2sgYW5kIGV4cGVjdHMuLi4gLUhXICovCi0KLQkvKiB0cnkgb3JpZ2luYWwgKHBucy0+cGFjKSB0dXBsZSAqLwotCW1lbWNweSgmdCwgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwgc2l6ZW9mKHQpKTsKLQl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCXQuc3JjLnUuZ3JlLmtleSA9IGN0LT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKLQl0LmRzdC51LmdyZS5rZXkgPSBjdC0+aGVscC5jdF9wcHRwX2luZm8ucGFjX2NhbGxfaWQ7Ci0KLQlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQotCQlERUJVR1AoImZhaWxlZCB0byB0aW1lb3V0IG9yaWdpbmFsIHBucy0+cGFjIGN0L2V4cFxuIik7Ci0KLQkvKiB0cnkgcmVwbHkgKHBhYy0+cG5zKSB0dXBsZSAqLwotCW1lbWNweSgmdCwgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwgc2l6ZW9mKHQpKTsKLQl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCXQuc3JjLnUuZ3JlLmtleSA9IGN0LT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKLQl0LmRzdC51LmdyZS5rZXkgPSBjdC0+aGVscC5jdF9wcHRwX2luZm8ucG5zX2NhbGxfaWQ7Ci0KLQlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQotCQlERUJVR1AoImZhaWxlZCB0byB0aW1lb3V0IHJlcGx5IHBhYy0+cG5zIGN0L2V4cFxuIik7Ci19Ci0KLS8qIGV4cGVjdCBHUkUgY29ubmVjdGlvbnMgKFBOUy0+UEFDIGFuZCBQQUMtPlBOUyBkaXJlY3Rpb24pICovCi1zdGF0aWMgaW5saW5lIGludAotZXhwX2dyZShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQlfX2JlMTYgY2FsbGlkLAotCV9fYmUxNiBwZWVyX2NhbGxpZCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwX29yaWcsICpleHBfcmVwbHk7Ci0JaW50IHJldCA9IDE7Ci0JdHlwZW9mKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSkgaXBfbmF0X3BwdHBfZXhwX2dyZTsKLQotCWV4cF9vcmlnID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKGV4cF9vcmlnID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JZXhwX3JlcGx5ID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKGV4cF9yZXBseSA9PSBOVUxMKQotCQlnb3RvIG91dF9wdXRfb3JpZzsKLQotCS8qIG9yaWdpbmFsIGRpcmVjdGlvbiwgUE5TLT5QQUMgKi8KLQlleHBfb3JpZy0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcDsKLQlleHBfb3JpZy0+dHVwbGUuc3JjLnUuZ3JlLmtleSA9IHBlZXJfY2FsbGlkOwotCWV4cF9vcmlnLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwOwotCWV4cF9vcmlnLT50dXBsZS5kc3QudS5ncmUua2V5ID0gY2FsbGlkOwotCWV4cF9vcmlnLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKLQotCWV4cF9vcmlnLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4ZmZmZmZmZmYpOwotCWV4cF9vcmlnLT5tYXNrLnNyYy51LmFsbCA9IDA7Ci0JZXhwX29yaWctPm1hc2suZHN0LnUuZ3JlLmtleSA9IGh0b25zKDB4ZmZmZik7Ci0JZXhwX29yaWctPm1hc2suZHN0LmlwID0gaHRvbmwoMHhmZmZmZmZmZik7Ci0JZXhwX29yaWctPm1hc2suZHN0LnByb3RvbnVtID0gMHhmZjsKLQotCWV4cF9vcmlnLT5tYXN0ZXIgPSBjdDsKLQlleHBfb3JpZy0+ZXhwZWN0Zm4gPSBwcHRwX2V4cGVjdGZuOwotCWV4cF9vcmlnLT5mbGFncyA9IDA7Ci0KLQkvKiBib3RoIGV4cGVjdGF0aW9ucyBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdHVwbGUgKi8KLQltZW1jcHkoZXhwX3JlcGx5LCBleHBfb3JpZywgc2l6ZW9mKCpleHBfcmVwbHkpKTsKLQotCS8qIHJlcGx5IGRpcmVjdGlvbiwgUEFDLT5QTlMgKi8KLQlleHBfcmVwbHktPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXA7Ci0JZXhwX3JlcGx5LT50dXBsZS5zcmMudS5ncmUua2V5ID0gY2FsbGlkOwotCWV4cF9yZXBseS0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcDsKLQlleHBfcmVwbHktPnR1cGxlLmRzdC51LmdyZS5rZXkgPSBwZWVyX2NhbGxpZDsKLQlleHBfcmVwbHktPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCi0JaXBfbmF0X3BwdHBfZXhwX2dyZSA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpOwotCWlmIChpcF9uYXRfcHB0cF9leHBfZ3JlKQotCQlpcF9uYXRfcHB0cF9leHBfZ3JlKGV4cF9vcmlnLCBleHBfcmVwbHkpOwotCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX29yaWcpICE9IDApCi0JCWdvdG8gb3V0X3B1dF9ib3RoOwotCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX3JlcGx5KSAhPSAwKQotCQlnb3RvIG91dF91bmV4cGVjdF9vcmlnOwotCi0JLyogQWRkIEdSRSBrZXltYXAgZW50cmllcyAqLwotCWlmIChpcF9jdF9ncmVfa2V5bWFwX2FkZChjdCwgJmV4cF9vcmlnLT50dXBsZSwgMCkgIT0gMCkKLQkJZ290byBvdXRfdW5leHBlY3RfYm90aDsKLQlpZiAoaXBfY3RfZ3JlX2tleW1hcF9hZGQoY3QsICZleHBfcmVwbHktPnR1cGxlLCAxKSAhPSAwKSB7Ci0JCWlwX2N0X2dyZV9rZXltYXBfZGVzdHJveShjdCk7Ci0JCWdvdG8gb3V0X3VuZXhwZWN0X2JvdGg7Ci0JfQotCXJldCA9IDA7Ci0KLW91dF9wdXRfYm90aDoKLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHBfcmVwbHkpOwotb3V0X3B1dF9vcmlnOgotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cF9vcmlnKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotCi1vdXRfdW5leHBlY3RfYm90aDoKLQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHBfcmVwbHkpOwotb3V0X3VuZXhwZWN0X29yaWc6Ci0JaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwX29yaWcpOwotCWdvdG8gb3V0X3B1dF9ib3RoOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcHB0cF9pbmJvdW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCi0JCSB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEsCi0JCSB1bnNpZ25lZCBpbnQgcmVxbGVuLAotCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdHJ1Y3QgaXBfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfcHB0cF9pbmZvOwotCXVfaW50MTZfdCBtc2c7Ci0JX19iZTE2IGNpZCA9IDAsIHBjaWQgPSAwOwotCXR5cGVvZihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpIGlwX25hdF9wcHRwX2luYm91bmQ7Ci0KLQltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7Ci0JREVCVUdQKCJpbmJvdW5kIGNvbnRyb2wgbWVzc2FnZSAlc1xuIiwgcHB0cF9tc2dfbmFtZVttc2ddKTsKLQotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFk6Ci0JCS8qIHNlcnZlciBjb25maXJtcyBuZXcgY29udHJvbCBzZXNzaW9uICovCi0JCWlmIChpbmZvLT5zc3RhdGUgPCBQUFRQX1NFU1NJT05fUkVRVUVTVEVEKQotCQkJZ290byBpbnZhbGlkOwotCQlpZiAocHB0cFJlcS0+c3JlcC5yZXN1bHRDb2RlID09IFBQVFBfU1RBUlRfT0spCi0JCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEOwotCQllbHNlCi0JCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fRVJST1I7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWToKLQkJLyogc2VydmVyIGNvbmZpcm1zIGVuZCBvZiBjb250cm9sIHNlc3Npb24gKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSA+IFBQVFBfU0VTU0lPTl9TVE9QUkVRKQotCQkJZ290byBpbnZhbGlkOwotCQlpZiAocHB0cFJlcS0+c3RyZXAucmVzdWx0Q29kZSA9PSBQUFRQX1NUT1BfT0spCi0JCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fTk9ORTsKLQkJZWxzZQotCQkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX0VSUk9SOwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9PVVRfQ0FMTF9SRVBMWToKLQkJLyogc2VydmVyIGFjY2VwdGVkIGNhbGwsIHdlIG5vdyBleHBlY3QgR1JFIGZyYW1lcyAqLwotCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCWlmIChpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX09VVF9SRVEgJiYKLQkJICAgIGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfT1VUX0NPTkYpCi0JCQlnb3RvIGludmFsaWQ7Ci0KLQkJY2lkID0gcHB0cFJlcS0+b2NhY2suY2FsbElEOwotCQlwY2lkID0gcHB0cFJlcS0+b2NhY2sucGVlcnNDYWxsSUQ7Ci0JCWlmIChpbmZvLT5wbnNfY2FsbF9pZCAhPSBwY2lkKQotCQkJZ290byBpbnZhbGlkOwotCQlERUJVR1AoIiVzLCBDSUQ9JVgsIFBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwKLQkJCW50b2hzKGNpZCksIG50b2hzKHBjaWQpKTsKLQotCQlpZiAocHB0cFJlcS0+b2NhY2sucmVzdWx0Q29kZSA9PSBQUFRQX09VVENBTExfQ09OTkVDVCkgewotCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX09VVF9DT05GOwotCQkJaW5mby0+cGFjX2NhbGxfaWQgPSBjaWQ7Ci0JCQlleHBfZ3JlKGN0LCBjaWQsIHBjaWQpOwotCQl9IGVsc2UKLQkJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9OT05FOwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9JTl9DQUxMX1JFUVVFU1Q6Ci0JCS8qIHNlcnZlciB0ZWxscyB1cyBhYm91dCBpbmNvbWluZyBjYWxsIHJlcXVlc3QgKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEKQotCQkJZ290byBpbnZhbGlkOwotCi0JCWNpZCA9IHBwdHBSZXEtPmljcmVxLmNhbGxJRDsKLQkJREVCVUdQKCIlcywgQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sIG50b2hzKGNpZCkpOwotCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfSU5fUkVROwotCQlpbmZvLT5wYWNfY2FsbF9pZCA9IGNpZDsKLQkJYnJlYWs7Ci0KLQljYXNlIFBQVFBfSU5fQ0FMTF9DT05ORUNUOgotCQkvKiBzZXJ2ZXIgdGVsbHMgdXMgYWJvdXQgaW5jb21pbmcgY2FsbCBlc3RhYmxpc2hlZCAqLwotCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCWlmIChpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX0lOX1JFUCAmJgotCQkgICAgaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9JTl9DT05GKQotCQkJZ290byBpbnZhbGlkOwotCi0JCXBjaWQgPSBwcHRwUmVxLT5pY2Nvbi5wZWVyc0NhbGxJRDsKLQkJY2lkID0gaW5mby0+cGFjX2NhbGxfaWQ7Ci0KLQkJaWYgKGluZm8tPnBuc19jYWxsX2lkICE9IHBjaWQpCi0JCQlnb3RvIGludmFsaWQ7Ci0KLQkJREVCVUdQKCIlcywgUENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLCBudG9ocyhwY2lkKSk7Ci0JCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9JTl9DT05GOwotCi0JCS8qIHdlIGV4cGVjdCBhIEdSRSBjb25uZWN0aW9uIGZyb20gUEFDIHRvIFBOUyAqLwotCQlleHBfZ3JlKGN0LCBjaWQsIHBjaWQpOwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9DQUxMX0RJU0NPTk5FQ1RfTk9USUZZOgotCQkvKiBzZXJ2ZXIgY29uZmlybXMgZGlzY29ubmVjdCAqLwotCQljaWQgPSBwcHRwUmVxLT5kaXNjLmNhbGxJRDsKLQkJREVCVUdQKCIlcywgQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sIG50b2hzKGNpZCkpOwotCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfTk9ORTsKLQotCQkvKiB1bnRyYWNrIHRoaXMgY2FsbCBpZCwgdW5leHBlY3QgR1JFIHBhY2tldHMgKi8KLQkJcHB0cF9kZXN0cm95X3NpYmxpbmdzKGN0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBQVFBfV0FOX0VSUk9SX05PVElGWToKLQljYXNlIFBQVFBfRUNIT19SRVFVRVNUOgotCWNhc2UgUFBUUF9FQ0hPX1JFUExZOgotCQkvKiBJIGRvbid0IGhhdmUgdG8gZXhwbGFpbiB0aGVzZSA7KSAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIGludmFsaWQ7Ci0JfQotCi0JaXBfbmF0X3BwdHBfaW5ib3VuZCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpOwotCWlmIChpcF9uYXRfcHB0cF9pbmJvdW5kKQotCQlyZXR1cm4gaXBfbmF0X3BwdHBfaW5ib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi1pbnZhbGlkOgotCURFQlVHUCgiaW52YWxpZCAlczogdHlwZT0lZCBjaWQ9JXUgcGNpZD0ldSAiCi0JICAgICAgICJjc3RhdGU9JWQgc3N0YXRlPSVkIHBuc19jaWQ9JXUgcGFjX2NpZD0ldVxuIiwKLQkgICAgICAgbXNnIDw9IFBQVFBfTVNHX01BWCA/IHBwdHBfbXNnX25hbWVbbXNnXSA6IHBwdHBfbXNnX25hbWVbMF0sCi0JICAgICAgIG1zZywgbnRvaHMoY2lkKSwgbnRvaHMocGNpZCksICBpbmZvLT5jc3RhdGUsIGluZm8tPnNzdGF0ZSwKLQkgICAgICAgbnRvaHMoaW5mby0+cG5zX2NhbGxfaWQpLCBudG9ocyhpbmZvLT5wYWNfY2FsbF9pZCkpOwotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wcHRwX291dGJvdW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkgIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSwKLQkJICB1bnNpZ25lZCBpbnQgcmVxbGVuLAotCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm87Ci0JdV9pbnQxNl90IG1zZzsKLQlfX2JlMTYgY2lkID0gMCwgcGNpZCA9IDA7Ci0JdHlwZW9mKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpIGlwX25hdF9wcHRwX291dGJvdW5kOwotCi0JbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOwotCURFQlVHUCgib3V0Ym91bmQgY29udHJvbCBtZXNzYWdlICVzXG4iLCBwcHRwX21zZ19uYW1lW21zZ10pOwotCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUOgotCQkvKiBjbGllbnQgcmVxdWVzdHMgZm9yIG5ldyBjb250cm9sIHNlc3Npb24gKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fTk9ORSkKLQkJCWdvdG8gaW52YWxpZDsKLQkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX1JFUVVFU1RFRDsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUOgotCQkvKiBjbGllbnQgcmVxdWVzdHMgZW5kIG9mIGNvbnRyb2wgc2Vzc2lvbiAqLwotCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fU1RPUFJFUTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBQVFBfT1VUX0NBTExfUkVRVUVTVDoKLQkJLyogY2xpZW50IGluaXRpYXRpbmcgY29ubmVjdGlvbiB0byBzZXJ2ZXIgKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEKQotCQkJZ290byBpbnZhbGlkOwotCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfT1VUX1JFUTsKLQkJLyogdHJhY2sgUE5TIGNhbGwgaWQgKi8KLQkJY2lkID0gcHB0cFJlcS0+b2NyZXEuY2FsbElEOwotCQlERUJVR1AoIiVzLCBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMoY2lkKSk7Ci0JCWluZm8tPnBuc19jYWxsX2lkID0gY2lkOwotCQlicmVhazsKLQljYXNlIFBQVFBfSU5fQ0FMTF9SRVBMWToKLQkJLyogY2xpZW50IGFuc3dlcnMgaW5jb21pbmcgY2FsbCAqLwotCQlpZiAoaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9JTl9SRVEgJiYKLQkJICAgIGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fUkVQKQotCQkJZ290byBpbnZhbGlkOwotCi0JCWNpZCA9IHBwdHBSZXEtPmljYWNrLmNhbGxJRDsKLQkJcGNpZCA9IHBwdHBSZXEtPmljYWNrLnBlZXJzQ2FsbElEOwotCQlpZiAoaW5mby0+cGFjX2NhbGxfaWQgIT0gcGNpZCkKLQkJCWdvdG8gaW52YWxpZDsKLQkJREVCVUdQKCIlcywgQ0lEPSVYIFBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwKLQkJICAgICAgIG50b2hzKGNpZCksIG50b2hzKHBjaWQpKTsKLQotCQlpZiAocHB0cFJlcS0+aWNhY2sucmVzdWx0Q29kZSA9PSBQUFRQX0lOQ0FMTF9BQ0NFUFQpIHsKLQkJCS8qIHBhcnQgdHdvIG9mIHRoZSB0aHJlZS13YXkgaGFuZHNoYWtlICovCi0JCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfSU5fUkVQOwotCQkJaW5mby0+cG5zX2NhbGxfaWQgPSBjaWQ7Ci0JCX0gZWxzZQotCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX05PTkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUFRQX0NBTExfQ0xFQVJfUkVRVUVTVDoKLQkJLyogY2xpZW50IHJlcXVlc3RzIGhhbmd1cCBvZiBjYWxsICovCi0JCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKLQkJCWdvdG8gaW52YWxpZDsKLQkJLyogRlVUVVJFOiBpdGVyYXRlIG92ZXIgYWxsIGNhbGxzIGFuZCBjaGVjayBpZgotCQkgKiBjYWxsIElEIGlzIHZhbGlkLiAgV2UgZG9uJ3QgZG8gdGhpcyB3aXRob3V0IG5ld25hdCwKLQkJICogYmVjYXVzZSB3ZSBvbmx5IGtub3cgYWJvdXQgbGFzdCBjYWxsICovCi0JCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9DTEVBUl9SRVE7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9TRVRfTElOS19JTkZPOgotCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX0VDSE9fUkVQTFk6Ci0JCS8qIEkgZG9uJ3QgaGF2ZSB0byBleHBsYWluIHRoZXNlIDspICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gaW52YWxpZDsKLQl9Ci0KLQlpcF9uYXRfcHB0cF9vdXRib3VuZCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKTsKLQlpZiAoaXBfbmF0X3BwdHBfb3V0Ym91bmQpCi0JCXJldHVybiBpcF9uYXRfcHB0cF9vdXRib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi1pbnZhbGlkOgotCURFQlVHUCgiaW52YWxpZCAlczogdHlwZT0lZCBjaWQ9JXUgcGNpZD0ldSAiCi0JICAgICAgICJjc3RhdGU9JWQgc3N0YXRlPSVkIHBuc19jaWQ9JXUgcGFjX2NpZD0ldVxuIiwKLQkgICAgICAgbXNnIDw9IFBQVFBfTVNHX01BWCA/IHBwdHBfbXNnX25hbWVbbXNnXSA6IHBwdHBfbXNnX25hbWVbMF0sCi0JICAgICAgIG1zZywgbnRvaHMoY2lkKSwgbnRvaHMocGNpZCksICBpbmZvLT5jc3RhdGUsIGluZm8tPnNzdGF0ZSwKLQkgICAgICAgbnRvaHMoaW5mby0+cG5zX2NhbGxfaWQpLCBudG9ocyhpbmZvLT5wYWNfY2FsbF9pZCkpOwotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHB0cF9tc2dfc2l6ZVtdID0gewotCVtQUFRQX1NUQVJUX1NFU1NJT05fUkVRVUVTVF0gID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdCksCi0JW1BQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWV0gICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdGFydFNlc3Npb25SZXBseSksCi0JW1BQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1RdICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcXVlc3QpLAotCVtQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWV0gICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXBseSksCi0JW1BQVFBfT1VUX0NBTExfUkVRVUVTVF0gICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBPdXRDYWxsUmVxdWVzdCksCi0JW1BQVFBfT1VUX0NBTExfUkVQTFldCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwT3V0Q2FsbFJlcGx5KSwKLQlbUFBUUF9JTl9DQUxMX1JFUVVFU1RdCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdCksCi0JW1BQVFBfSU5fQ0FMTF9SRVBMWV0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBJbkNhbGxSZXBseSksCi0JW1BQVFBfSU5fQ0FMTF9DT05ORUNUXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZCksCi0JW1BQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUXSAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBDbGVhckNhbGxSZXF1ZXN0KSwKLQlbUFBUUF9DQUxMX0RJU0NPTk5FQ1RfTk9USUZZXSA9IHNpemVvZihzdHJ1Y3QgUHB0cENhbGxEaXNjb25uZWN0Tm90aWZ5KSwKLQlbUFBUUF9XQU5fRVJST1JfTk9USUZZXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5KSwKLQlbUFBUUF9TRVRfTElOS19JTkZPXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFNldExpbmtJbmZvKSwKLX07Ci0KLS8qIHRyYWNrIGNhbGxlciBpZCBpbnNpZGUgY29udHJvbCBjb25uZWN0aW9uLCBjYWxsIGV4cGVjdF9yZWxhdGVkICovCi1zdGF0aWMgaW50Ci1jb25udHJhY2tfcHB0cF9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGNwaDsKLQlzdHJ1Y3QgcHB0cF9wa3RfaGRyIF9wcHRwaCwgKnBwdHBoOwotCXN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciBfY3RsaCwgKmN0bGg7Ci0JdW5pb24gcHB0cF9jdHJsX3VuaW9uIF9wcHRwUmVxLCAqcHB0cFJlcTsKLQl1bnNpZ25lZCBpbnQgdGNwbGVuID0gKCpwc2tiKS0+bGVuIC0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OwotCXVuc2lnbmVkIGludCBkYXRhbGVuLCByZXFsZW4sIG5leHRoZHJfb2ZmOwotCWludCBvbGRzc3RhdGUsIG9sZGNzdGF0ZTsKLQlpbnQgcmV0OwotCXVfaW50MTZfdCBtc2c7Ci0KLQkvKiBkb24ndCBkbyBhbnkgdHJhY2tpbmcgYmVmb3JlIHRjcCBoYW5kc2hha2UgY29tcGxldGUgKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVECi0JICAgICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWSkgewotCQlERUJVR1AoImN0aW5mbyA9ICV1LCBza2lwcGluZ1xuIiwgY3RpbmZvKTsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQluZXh0aGRyX29mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7Ci0JdGNwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JQlVHX09OKCF0Y3BoKTsKLQluZXh0aGRyX29mZiArPSB0Y3BoLT5kb2ZmICogNDsKLQlkYXRhbGVuID0gdGNwbGVuIC0gdGNwaC0+ZG9mZiAqIDQ7Ci0KLQlwcHRwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHNpemVvZihfcHB0cGgpLCAmX3BwdHBoKTsKLQlpZiAoIXBwdHBoKSB7Ci0JCURFQlVHUCgibm8gZnVsbCBQUFRQIGhlYWRlciwgY2FuJ3QgdHJhY2tcbiIpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQluZXh0aGRyX29mZiArPSBzaXplb2YoX3BwdHBoKTsKLQlkYXRhbGVuIC09IHNpemVvZihfcHB0cGgpOwotCi0JLyogaWYgaXQncyBub3QgYSBjb250cm9sIG1lc3NhZ2Ugd2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCBpdCAqLwotCWlmIChudG9ocyhwcHRwaC0+cGFja2V0VHlwZSkgIT0gUFBUUF9QQUNLRVRfQ09OVFJPTCB8fAotCSAgICBudG9obChwcHRwaC0+bWFnaWNDb29raWUpICE9IFBQVFBfTUFHSUNfQ09PS0lFKSB7Ci0JCURFQlVHUCgibm90IGEgY29udHJvbCBwYWNrZXRcbiIpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCWN0bGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIG5leHRoZHJfb2ZmLCBzaXplb2YoX2N0bGgpLCAmX2N0bGgpOwotCWlmICghY3RsaCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQluZXh0aGRyX29mZiArPSBzaXplb2YoX2N0bGgpOwotCWRhdGFsZW4gLT0gc2l6ZW9mKF9jdGxoKTsKLQotCXJlcWxlbiA9IGRhdGFsZW47Ci0JbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOwotCWlmIChtc2cgPiAwICYmIG1zZyA8PSBQUFRQX01TR19NQVggJiYgcmVxbGVuIDwgcHB0cF9tc2dfc2l6ZVttc2ddKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCWlmIChyZXFsZW4gPiBzaXplb2YoKnBwdHBSZXEpKQotCQlyZXFsZW4gPSBzaXplb2YoKnBwdHBSZXEpOwotCi0JcHB0cFJlcSA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHJlcWxlbiwgJl9wcHRwUmVxKTsKLQlpZiAoIXBwdHBSZXEpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlvbGRzc3RhdGUgPSBpbmZvLT5zc3RhdGU7Ci0Jb2xkY3N0YXRlID0gaW5mby0+Y3N0YXRlOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcF9wcHRwX2xvY2spOwotCi0JLyogRklYTUU6IFdlIGp1c3QgYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgY29udHJvbCBjb25uZWN0aW9uIGlzIGFsd2F5cwotCSAqIGVzdGFibGlzaGVkIGZyb20gUE5TLT5QQUMuICBIb3dldmVyLCBSRkMgbWFrZXMgbm8gZ3VhcmFudGVlICovCi0JaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCS8qIGNsaWVudCAtPiBzZXJ2ZXIgKFBOUyAtPiBQQUMpICovCi0JCXJldCA9IHBwdHBfb3V0Ym91bmRfcGt0KHBza2IsIGN0bGgsIHBwdHBSZXEsIHJlcWxlbiwgY3QsCi0JCQkJCWN0aW5mbyk7Ci0JZWxzZQotCQkvKiBzZXJ2ZXIgLT4gY2xpZW50IChQQUMgLT4gUE5TKSAqLwotCQlyZXQgPSBwcHRwX2luYm91bmRfcGt0KHBza2IsIGN0bGgsIHBwdHBSZXEsIHJlcWxlbiwgY3QsCi0JCQkJICAgICAgIGN0aW5mbyk7Ci0JREVCVUdQKCJzc3RhdGU6ICVkLT4lZCwgY3N0YXRlOiAlZC0+JWRcbiIsCi0JCW9sZHNzdGF0ZSwgaW5mby0+c3N0YXRlLCBvbGRjc3RhdGUsIGluZm8tPmNzdGF0ZSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmlwX3BwdHBfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBjb250cm9sIHByb3RvY29sIGhlbHBlciAqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIHBwdHAgPSB7Ci0JLmxpc3QgPSB7IE5VTEwsIE5VTEwgfSwKLQkubmFtZSA9ICJwcHRwIiwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkubWF4X2V4cGVjdGVkID0gMiwKLQkudGltZW91dCA9IDUgKiA2MCwKLQkudHVwbGUgPSB7IC5zcmMgPSB7IC5pcCA9IDAsCi0JCQkgICAgLnUgPSB7IC50Y3AgPSB7IC5wb3J0ID0KLQkJCQkgICAgX19jb25zdGFudF9odG9ucyhQUFRQX0NPTlRST0xfUE9SVCkgfSB9Ci0JCQkgIH0sCi0JCSAgIC5kc3QgPSB7IC5pcCA9IDAsCi0JCQkgICAgLnUgPSB7IC5hbGwgPSAwIH0sCi0JCQkgICAgLnByb3RvbnVtID0gSVBQUk9UT19UQ1AKLQkJCSAgfQotCQkgfSwKLQkubWFzayA9IHsgLnNyYyA9IHsgLmlwID0gMCwKLQkJCSAgIC51ID0geyAudGNwID0geyAucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoMHhmZmZmKSB9IH0KLQkJCSB9LAotCQkgIC5kc3QgPSB7IC5pcCA9IDAsCi0JCQkgICAudSA9IHsgLmFsbCA9IDAgfSwKLQkJCSAgIC5wcm90b251bSA9IDB4ZmYKLQkJCSB9Ci0JCX0sCi0JLmhlbHAgPSBjb25udHJhY2tfcHB0cF9oZWxwLAotCS5kZXN0cm95ID0gcHB0cF9kZXN0cm95X3NpYmxpbmdzLAotfTsKLQotZXh0ZXJuIHZvaWQgaXBfY3RfcHJvdG9fZ3JlX2Zpbmkodm9pZCk7Ci1leHRlcm4gaW50IF9faW5pdCBpcF9jdF9wcm90b19ncmVfaW5pdCh2b2lkKTsKLQotLyogaXBfY29ubnRyYWNrX3BwdHAgaW5pdGlhbGl6YXRpb24gKi8KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19oZWxwZXJfcHB0cF9pbml0KHZvaWQpCi17Ci0JaW50IHJldGNvZGU7Ci0KLQlyZXRjb2RlID0gaXBfY3RfcHJvdG9fZ3JlX2luaXQoKTsKLQlpZiAocmV0Y29kZSA8IDApCi0JCXJldHVybiByZXRjb2RlOwotCi0JREVCVUdQKCIgcmVnaXN0ZXJpbmcgaGVscGVyXG4iKTsKLQlpZiAoKHJldGNvZGUgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZwcHRwKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY29ubnRyYWNrIGFwcGxpY2F0aW9uICIKLQkJCQkiaGVscGVyIGZvciBwcHRwOiAlZFxuIiwgcmV0Y29kZSk7Ci0JCWlwX2N0X3Byb3RvX2dyZV9maW5pKCk7Ci0JCXJldHVybiByZXRjb2RlOwotCX0KLQotCXByaW50aygiaXBfY29ubnRyYWNrX3BwdHAgdmVyc2lvbiAlcyBsb2FkZWRcbiIsIElQX0NUX1BQVFBfVkVSU0lPTik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9jb25udHJhY2tfaGVscGVyX3BwdHBfZmluaSh2b2lkKQotewotCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmcHB0cCk7Ci0JaXBfY3RfcHJvdG9fZ3JlX2ZpbmkoKTsKLQlwcmludGsoImlwX2Nvbm50cmFja19wcHRwIHZlcnNpb24gJXMgdW5sb2FkZWRcbiIsIElQX0NUX1BQVFBfVkVSU0lPTik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja19oZWxwZXJfcHB0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja19oZWxwZXJfcHB0cF9maW5pKTsKLQotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKTsKLUVYUE9SVF9TWU1CT0woaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kKTsKLUVYUE9SVF9TWU1CT0woaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKTsKLUVYUE9SVF9TWU1CT0woaXBfbmF0X3BwdHBfaG9va19leHBlY3Rmbik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZTU5MS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qIElSQyBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcsIFZlcnNpb24gMS4yMQotICogKEMpIDIwMDAtMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogYmFzZWQgb24gUlIncyBpcF9jb25udHJhY2tfZnRwLmMKLSAqCi0gKiBpcF9jb25udHJhY2tfaXJjLmMsdiAxLjIxIDIwMDIvMDIvMDUgMTQ6NDk6MjYgbGFmb3JnZSBFeHAKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKioKLSAqCU1vZHVsZSBsb2FkIHN5bnRheDoKLSAqIAlpbnNtb2QgaXBfY29ubnRyYWNrX2lyYy5vIHBvcnRzPXBvcnQxLHBvcnQyLC4uLnBvcnQ8TUFYX1BPUlRTPgotICoJCQkgICAgbWF4X2RjY19jaGFubmVscz1uIGRjY190aW1lb3V0PXNlY3MKLSAqCi0gKiAJcGxlYXNlIGdpdmUgdGhlIHBvcnRzIG9mIGFsbCBJUkMgc2VydmVycyBZb3Ugd2lzaCB0byBjb25uZWN0IHRvLgotICoJSWYgWW91IGRvbid0IHNwZWNpZnkgcG9ydHMsIHRoZSBkZWZhdWx0IHdpbGwgYmUgcG9ydCA2NjY3LgotICoJV2l0aCBtYXhfZGNjX2NoYW5uZWxzIHlvdSBjYW4gZGVmaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBub3QKLSAqCXlldCBhbnN3ZXJlZCBEQ0MgY2hhbm5lbHMgcGVyIElSQyBzZXNzaW9uIChkZWZhdWx0IDgpLgotICoJV2l0aCBkY2NfdGltZW91dCB5b3UgY2FuIHNwZWNpZnkgaG93IGxvbmcgdGhlIHN5c3RlbSB3YWl0cyBmb3IKLSAqCWFuIGV4cGVjdGVkIERDQyBjaGFubmVsIChkZWZhdWx0IDMwMCBzZWNvbmRzKS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19pcmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi0jZGVmaW5lIE1BWF9QT1JUUyA4Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbTUFYX1BPUlRTXTsKLXN0YXRpYyBpbnQgcG9ydHNfYzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RjY19jaGFubmVscyA9IDg7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRjY190aW1lb3V0ID0gMzAwOwotLyogVGhpcyBpcyBzbG93LCBidXQgaXQncyBzaW1wbGUuIC0tUlIgKi8KLXN0YXRpYyBjaGFyICppcmNfYnVmZmVyOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpcmNfYnVmZmVyX2xvY2spOwotCi11bnNpZ25lZCBpbnQgKCppcF9uYXRfaXJjX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X2lyY19ob29rKTsKLQotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklSQyAoRENDKSBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCB1c2hvcnQsICZwb3J0c19jLCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJwb3J0IG51bWJlcnMgb2YgSVJDIHNlcnZlcnMiKTsKLW1vZHVsZV9wYXJhbShtYXhfZGNjX2NoYW5uZWxzLCB1aW50LCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobWF4X2RjY19jaGFubmVscywgIm1heCBudW1iZXIgb2YgZXhwZWN0ZWQgRENDIGNoYW5uZWxzIHBlciBJUkMgc2Vzc2lvbiIpOwotbW9kdWxlX3BhcmFtKGRjY190aW1lb3V0LCB1aW50LCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGNjX3RpbWVvdXQsICJ0aW1lb3V0IG9uIGZvciB1bmVzdGFibGlzaGVkIERDQyBjaGFubmVscyIpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqZGNjcHJvdG9zW10gPSB7ICJTRU5EICIsICJDSEFUICIsICJNT1ZFICIsICJUU0VORCAiLCAiU0NIQVQgIiB9OwotI2RlZmluZSBNSU5NQVRDSExFTgk1Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczolczoiIGZvcm1hdCwgXAotCQkJCSAgICAgICBfX0ZJTEVfXywgX19GVU5DVElPTl9fICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotc3RhdGljIGludCBwYXJzZV9kY2MoY2hhciAqZGF0YSwgY2hhciAqZGF0YV9lbmQsIHVfaW50MzJfdCAqaXAsCi0JCSAgICAgdV9pbnQxNl90ICpwb3J0LCBjaGFyICoqYWRfYmVnX3AsIGNoYXIgKiphZF9lbmRfcCkKLS8qIHRyaWVzIHRvIGdldCB0aGUgaXBfYWRkciBhbmQgcG9ydCBvdXQgb2YgYSBkY2MgY29tbWFuZAotICAgcmV0dXJuIHZhbHVlOiAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MKLQlkYXRhCQlwb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgRENDIGNvbW1hbmQgZGF0YQotCWRhdGFfZW5kCXBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGRjYyBjb21tYW5kIGRhdGEKLQlpcAkJcmV0dXJucyBwYXJzZWQgaXAgb2YgZGNjIGNvbW1hbmQKLQlwb3J0CQlyZXR1cm5zIHBhcnNlZCBwb3J0IG9mIGRjYyBjb21tYW5kCi0JYWRfYmVnX3AJcmV0dXJucyBwb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgYWRkciBkYXRhCi0JYWRfZW5kX3AJcmV0dXJucyBwb2ludGVyIHRvIGxhc3QgYnl0ZSBvZiBhZGRyIGRhdGEgKi8KLXsKLQotCS8qIGF0IGxlYXN0IDEyOiAiQUFBQUFBQUEgUFwxXG4iICovCi0Jd2hpbGUgKCpkYXRhKysgIT0gJyAnKQotCQlpZiAoZGF0YSA+IGRhdGFfZW5kIC0gMTIpCi0JCQlyZXR1cm4gLTE7Ci0KLQkqYWRfYmVnX3AgPSBkYXRhOwotCSppcCA9IHNpbXBsZV9zdHJ0b3VsKGRhdGEsICZkYXRhLCAxMCk7Ci0KLQkvKiBza2lwIGJsYW5rcyBiZXR3ZWVuIGlwIGFuZCBwb3J0ICovCi0Jd2hpbGUgKCpkYXRhID09ICcgJykgewotCQlpZiAoZGF0YSA+PSBkYXRhX2VuZCkKLQkJCXJldHVybiAtMTsKLQkJZGF0YSsrOwotCX0KLQotCSpwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKLQkqYWRfZW5kX3AgPSBkYXRhOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YW9mZjsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JY2hhciAqZGF0YSwgKmRhdGFfbGltaXQsICppYl9wdHI7Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXUzMiBzZXE7Ci0JdV9pbnQzMl90IGRjY19pcDsKLQl1X2ludDE2X3QgZGNjX3BvcnQ7Ci0JaW50IGksIHJldCA9IE5GX0FDQ0VQVDsKLQljaGFyICphZGRyX2JlZ19wLCAqYWRkcl9lbmRfcDsKLQl0eXBlb2YoaXBfbmF0X2lyY19ob29rKSBpcF9uYXRfaXJjOwotCi0JREVCVUdQKCJlbnRlcmVkXG4iKTsKLQotCS8qIElmIHBhY2tldCBpcyBjb21pbmcgZnJvbSBJUkMgc2VydmVyICovCi0JaWYgKGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVECi0JICAgICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7Ci0JCURFQlVHUCgiQ29ubnRyYWNraW5mbyA9ICV1XG4iLCBjdGluZm8pOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCS8qIE5vdCBhIGZ1bGwgdGNwIGhlYWRlcj8gKi8KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyogTm8gZGF0YT8gKi8KLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHRoLT5kb2ZmKjQ7Ci0JaWYgKGRhdGFvZmYgPj0gKCpwc2tiKS0+bGVuKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcmNfYnVmZmVyX2xvY2spOwotCWliX3B0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgZGF0YW9mZiwKLQkJCQkgICAgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgaXJjX2J1ZmZlcik7Ci0JQlVHX09OKGliX3B0ciA9PSBOVUxMKTsKLQotCWRhdGEgPSBpYl9wdHI7Ci0JZGF0YV9saW1pdCA9IGliX3B0ciArICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7Ci0KLQkvKiBzdHJsZW4oIlwxRENDIFNFTlQgdCBBQUFBQUFBQSBQXDFcbiIpPTI0Ci0JICogNStNSU5NQVRDSExFTitzdHJsZW4oInQgQUFBQUFBQUEgUFwxXG4iKT0xNCAqLwotCXdoaWxlIChkYXRhIDwgKGRhdGFfbGltaXQgLSAoMTkgKyBNSU5NQVRDSExFTikpKSB7Ci0JCWlmIChtZW1jbXAoZGF0YSwgIlwxRENDICIsIDUpKSB7Ci0JCQlkYXRhKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWRhdGEgKz0gNTsKLQkJLyogd2UgaGF2ZSBhdCBsZWFzdCAoMTkrTUlOTUFUQ0hMRU4pLTUgYnl0ZXMgdmFsaWQgZGF0YSBsZWZ0ICovCi0KLQkJREVCVUdQKCJEQ0MgZm91bmQgaW4gbWFzdGVyICV1LiV1LiV1LiV1OiV1ICV1LiV1LiV1LiV1OiV1Li4uXG4iLAotCQkJTklQUVVBRChpcGgtPnNhZGRyKSwgbnRvaHModGgtPnNvdXJjZSksCi0JCQlOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyh0aC0+ZGVzdCkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRjY3Byb3Rvcyk7IGkrKykgewotCQkJaWYgKG1lbWNtcChkYXRhLCBkY2Nwcm90b3NbaV0sIHN0cmxlbihkY2Nwcm90b3NbaV0pKSkgewotCQkJCS8qIG5vIG1hdGNoICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCURFQlVHUCgiRENDICVzIGRldGVjdGVkXG4iLCBkY2Nwcm90b3NbaV0pOwotCQkJZGF0YSArPSBzdHJsZW4oZGNjcHJvdG9zW2ldKTsKLQkJCS8qIHdlIGhhdmUgYXQgbGVhc3QKLQkJCSAqICgxOStNSU5NQVRDSExFTiktNS1kY2Nwcm90b3NbaV0ubWF0Y2hsZW4gYnl0ZXMgdmFsaWQKLQkJCSAqIGRhdGEgbGVmdCAoPT0gMTQvMTMgYnl0ZXMpICovCi0JCQlpZiAocGFyc2VfZGNjKChjaGFyICopZGF0YSwgZGF0YV9saW1pdCwgJmRjY19pcCwKLQkJCQkgICAgICAgJmRjY19wb3J0LCAmYWRkcl9iZWdfcCwgJmFkZHJfZW5kX3ApKSB7Ci0JCQkJLyogdW5hYmxlIHRvIHBhcnNlICovCi0JCQkJREVCVUdQKCJ1bmFibGUgdG8gcGFyc2UgZGNjIGNvbW1hbmRcbiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJREVCVUdQKCJEQ0MgYm91bmQgaXAvcG9ydDogJXUuJXUuJXUuJXU6JXVcbiIsCi0JCQkJSElQUVVBRChkY2NfaXApLCBkY2NfcG9ydCk7Ci0KLQkJCS8qIGRjY19pcCBjYW4gYmUgdGhlIGludGVybmFsIE9SIGV4dGVybmFsIChOQVQnZWQpIElQCi0JCQkgKiBUaWFnbyBTb3VzYSA8bWlyYWdlQGthb3Rpay5vcmc+ICovCi0JCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAhPSBodG9ubChkY2NfaXApCi0JCQkgICAgJiYgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCAhPSBodG9ubChkY2NfaXApKSB7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJIkZvcmdlZCBEQ0MgY29tbWFuZCBmcm9tICIKLQkJCQkJCSIldS4ldS4ldS4ldTogJXUuJXUuJXUuJXU6JXVcbiIsCi0JCQkJTklQUVVBRChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSwKLQkJCQkJCUhJUFFVQUQoZGNjX2lwKSwgZGNjX3BvcnQpOwotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwotCQkJaWYgKGV4cCA9PSBOVUxMKSB7Ci0JCQkJcmV0ID0gTkZfRFJPUDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJLyogc2F2ZSBwb3NpdGlvbiBvZiBhZGRyZXNzIGluIGRjYyBzdHJpbmcsCi0JCQkgKiBuZWNlc3NhcnkgZm9yIE5BVCAqLwotCQkJREVCVUdQKCJ0Y3BoLT5zZXEgPSAldVxuIiwgdGgtPnNlcSk7Ci0JCQlzZXEgPSBudG9obCh0aC0+c2VxKSArIChhZGRyX2JlZ19wIC0gaWJfcHRyKTsKLQotCQkJLyogV2UgcmVmZXIgdG8gdGhlIHJldmVyc2UgZGlyZWN0aW9uICgiIWRpciIpCi0JCQkgKiB0dXBsZXMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBleHBlY3RpbmcKLQkJCSAqIHNvbWV0aGluZyBpbiB0aGUgb3RoZXIgKiBkaXJlY3Rpb24uCi0JCQkgKiBEb2Vzbid0IG1hdHRlciB1bmxlc3MgTkFUIGlzIGhhcHBlbmluZy4gICovCi0JCQlleHAtPnR1cGxlID0gKChzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlKQotCQkJCXsgeyAwLCB7IDAgfSB9LAotCQkJCSAgeyBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkgICAgeyAudGNwID0geyBodG9ucyhkY2NfcG9ydCkgfSB9LAotCQkJCSAgICBJUFBST1RPX1RDUCB9fSk7Ci0JCQlleHAtPm1hc2sgPSAoKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUpCi0JCQkJeyB7IDAsIHsgMCB9IH0sCi0JCQkJICB7IGh0b25sKDB4RkZGRkZGRkYpLAotCQkJCQl7IC50Y3AgPSB7IGh0b25zKDB4RkZGRikgfSB9LCAweEZGIH19KTsKLQkJCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCQkJZXhwLT5mbGFncyA9IDA7Ci0JCQlpcF9uYXRfaXJjID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9pcmNfaG9vayk7Ci0JCQlpZiAoaXBfbmF0X2lyYykKLQkJCQlyZXQgPSBpcF9uYXRfaXJjKHBza2IsIGN0aW5mbywKLQkJCQkJCSBhZGRyX2JlZ19wIC0gaWJfcHRyLAotCQkJCQkJIGFkZHJfZW5kX3AgLSBhZGRyX2JlZ19wLAotCQkJCQkJIGV4cCk7Ci0JCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQotCQkJCXJldCA9IE5GX0RST1A7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJZ290byBvdXQ7Ci0JCX0gLyogZm9yIC4uIE5VTV9EQ0NQUk9UTyAqLwotCX0gLyogd2hpbGUgZGF0YSA8IC4uLiAqLwotCi0gb3V0OgotCXNwaW5fdW5sb2NrX2JoKCZpcmNfYnVmZmVyX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBpcmNfaGVscGVyc1tNQVhfUE9SVFNdOwotc3RhdGljIGNoYXIgaXJjX25hbWVzW01BWF9QT1JUU11bc2l6ZW9mKCJpcmMtNjU1MzUiKV07Ci0KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19pcmNfZmluaSh2b2lkKTsKLQotc3RhdGljIGludCBfX2luaXQgaXBfY29ubnRyYWNrX2lyY19pbml0KHZvaWQpCi17Ci0JaW50IGksIHJldDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGxwcjsKLQljaGFyICp0bXBuYW1lOwotCi0JaWYgKG1heF9kY2NfY2hhbm5lbHMgPCAxKSB7Ci0JCXByaW50aygiaXBfY29ubnRyYWNrX2lyYzogbWF4X2RjY19jaGFubmVscyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaXJjX2J1ZmZlciA9IGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOwotCWlmICghaXJjX2J1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBJZiBubyBwb3J0IGdpdmVuLCBkZWZhdWx0IHRvIHN0YW5kYXJkIGlyYyBwb3J0ICovCi0JaWYgKHBvcnRzX2MgPT0gMCkKLQkJcG9ydHNbcG9ydHNfYysrXSA9IElSQ19QT1JUOwotCi0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQlobHByID0gJmlyY19oZWxwZXJzW2ldOwotCQlobHByLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKLQkJaGxwci0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JCWhscHItPm1hc2suc3JjLnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCQlobHByLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JCWhscHItPm1heF9leHBlY3RlZCA9IG1heF9kY2NfY2hhbm5lbHM7Ci0JCWhscHItPnRpbWVvdXQgPSBkY2NfdGltZW91dDsKLQkJaGxwci0+bWUgPSBUSElTX01PRFVMRTsKLQkJaGxwci0+aGVscCA9IGhlbHA7Ci0KLQkJdG1wbmFtZSA9ICZpcmNfbmFtZXNbaV1bMF07Ci0JCWlmIChwb3J0c1tpXSA9PSBJUkNfUE9SVCkKLQkJCXNwcmludGYodG1wbmFtZSwgImlyYyIpOwotCQllbHNlCi0JCQlzcHJpbnRmKHRtcG5hbWUsICJpcmMtJWQiLCBpKTsKLQkJaGxwci0+bmFtZSA9IHRtcG5hbWU7Ci0KLQkJREVCVUdQKCJwb3J0ICMlZDogJWRcbiIsIGksIHBvcnRzW2ldKTsKLQotCQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKGhscHIpOwotCi0JCWlmIChyZXQpIHsKLQkJCXByaW50aygiaXBfY29ubnRyYWNrX2lyYzogRVJST1IgcmVnaXN0ZXJpbmcgcG9ydCAlZFxuIiwKLQkJCQlwb3J0c1tpXSk7Ci0JCQlpcF9jb25udHJhY2tfaXJjX2ZpbmkoKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBfTk9UXyBkZWZpbmVkIGFzIF9fZXhpdCwgYmVjYXVzZQotICogaXQgaXMgbmVlZGVkIGJ5IHRoZSBpbml0IGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBpcF9jb25udHJhY2tfaXJjX2Zpbmkodm9pZCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7Ci0JCURFQlVHUCgidW5yZWdpc3RlcmluZyBwb3J0ICVkXG4iLAotCQkgICAgICAgcG9ydHNbaV0pOwotCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmlyY19oZWxwZXJzW2ldKTsKLQl9Ci0Ja2ZyZWUoaXJjX2J1ZmZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja19pcmNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9jb25udHJhY2tfaXJjX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRiaW9zX25zLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2ZGQ0OS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogICAgICBOZXRCSU9TIG5hbWUgc2VydmljZSBicm9hZGNhc3QgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIKLSAqCi0gKiAgICAgIChjKSAyMDA1IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotLyoKLSAqICAgICAgVGhpcyBoZWxwZXIgdHJhY2tzIGxvY2FsbHkgb3JpZ2luYXRpbmcgTmV0QklPUyBuYW1lIHNlcnZpY2UKLSAqICAgICAgcmVxdWVzdHMgYnkgaXNzdWluZyBwZXJtYW5lbnQgZXhwZWN0YXRpb25zICh2YWxpZCB1bnRpbAotICogICAgICB0aW1pbmcgb3V0KSBtYXRjaGluZyBhbGwgcmVwbHkgY29ubmVjdGlvbnMgZnJvbSB0aGUKLSAqICAgICAgZGVzdGluYXRpb24gbmV0d29yay4gVGhlIG9ubHkgTmV0QklPUyBzcGVjaWZpYyB0aGluZyBpcwotICogICAgICBhY3R1YWxseSB0aGUgcG9ydCBudW1iZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FkZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLQotI2RlZmluZSBOTUJEX1BPUlQJMTM3Ci0KLU1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRCSU9TIG5hbWUgc2VydmljZSBicm9hZGNhc3QgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0ID0gMzsKLW1vZHVsZV9wYXJhbSh0aW1lb3V0LCB1aW50LCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWVvdXQgZm9yIG1hc3RlciBjb25uZWN0aW9uL3JlcGxpZXMgaW4gc2Vjb25kcyIpOwotCi1zdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKLQlfX2JlMzIgbWFzayA9IDA7Ci0KLQkvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0cyAqLwotCWlmICgoKnBza2IpLT5zayA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlpZiAocnQgPT0gTlVMTCB8fCAhKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSkKLQkJZ290byBvdXQ7Ci0JaWYgKENUSU5GTzJESVIoY3RpbmZvKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCWdvdG8gb3V0OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UocnQtPnUuZHN0LmRldik7Ci0JaWYgKGluX2RldiAhPSBOVUxMKSB7Ci0JCWZvcl9wcmltYXJ5X2lmYShpbl9kZXYpIHsKLQkJCWlmIChpZmEtPmlmYV9icm9hZGNhc3QgPT0gaXBoLT5kYWRkcikgewotCQkJCW1hc2sgPSBpZmEtPmlmYV9tYXNrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVuZGZvcl9pZmEoaW5fZGV2KTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAobWFzayA9PSAwKQotCQlnb3RvIG91dDsKLQotCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwotCWlmIChleHAgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlleHAtPnR1cGxlICAgICAgICAgICAgICAgID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlOwotCWV4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhOTUJEX1BPUlQpOwotCi0JZXhwLT5tYXNrLnNyYy5pcCAgICAgICAgICA9IG1hc2s7Ci0JZXhwLT5tYXNrLnNyYy51LnVkcC5wb3J0ICA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5pcCAgICAgICAgICA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCAgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gICAgPSAweEZGOwotCi0JZXhwLT5leHBlY3RmbiAgICAgICAgICAgICA9IE5VTEw7Ci0JZXhwLT5mbGFncyAgICAgICAgICAgICAgICA9IElQX0NUX0VYUEVDVF9QRVJNQU5FTlQ7Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JaXBfY3RfcmVmcmVzaChjdCwgKnBza2IsIHRpbWVvdXQgKiBIWik7Ci1vdXQ6Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGhlbHBlciA9IHsKLQkubmFtZQkJCT0gIm5ldGJpb3MtbnMiLAotCS50dXBsZSA9IHsKLQkJLnNyYyA9IHsKLQkJCS51ID0gewotCQkJCS51ZHAgPSB7Ci0JCQkJCS5wb3J0CT0gX19jb25zdGFudF9odG9ucyhOTUJEX1BPUlQpLAotCQkJCX0KLQkJCX0KLQkJfSwKLQkJLmRzdCA9IHsKLQkJCS5wcm90b251bQk9IElQUFJPVE9fVURQLAotCQl9LAotCX0sCi0JLm1hc2sgPSB7Ci0JCS5zcmMgPSB7Ci0JCQkudSA9IHsKLQkJCQkudWRwID0gewotCQkJCQkucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKLQkJCQl9Ci0JCQl9Ci0JCX0sCi0JCS5kc3QgPSB7Ci0JCQkucHJvdG9udW0JPSAweEZGLAotCQl9LAotCX0sCi0JLm1heF9leHBlY3RlZAkJPSAxLAotCS5tZQkJCT0gVEhJU19NT0RVTEUsCi0JLmhlbHAJCQk9IGhlbHAsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfbmV0Ymlvc19uc19pbml0KHZvaWQpCi17Ci0JaGVscGVyLnRpbWVvdXQgPSB0aW1lb3V0OwotCXJldHVybiBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZoZWxwZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfY29ubnRyYWNrX25ldGJpb3NfbnNfZmluaSh2b2lkKQotewotCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaGVscGVyKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX25ldGJpb3NfbnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9jb25udHJhY2tfbmV0Ymlvc19uc19maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjhiNzZjLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3NyArMCwwIEBACi0vKiBDb25uZWN0aW9uIHRyYWNraW5nIHZpYSBuZXRsaW5rIHNvY2tldC4gQWxsb3dzIGZvciB1c2VyIHNwYWNlCi0gKiBwcm90b2NvbCBoZWxwZXJzIGFuZCBnZW5lcmFsIHRyb3VibGUgbWFraW5nIGZyb20gdXNlcnNwYWNlLgotICoKLSAqIChDKSAyMDAxIGJ5IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+Ci0gKiAoQykgMjAwMi0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAoQykgMjAwMyBieSBQYXRyaWNrIE1jaGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLSAqIChDKSAyMDA1LTIwMDYgYnkgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PgotICoKLSAqIEkndmUgcmV3b3JrZWQgdGhpcyBzdHVmZiB0byB1c2UgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGNvbm50cmFjawotICogc3RydWN0dXJlcy4gNS40NCBhbS4gSSBuZWVkIG1vcmUgdGVhLiAtLXBhYmxvIDA1LzA3LzExLgotICoKLSAqIEluaXRpYWwgY29ubmVjdGlvbiB0cmFja2luZyB2aWEgbmV0bGluayBkZXZlbG9wbWVudCBmdW5kZWQgYW5kCi0gKiBnZW5lcmFsbHkgbWFkZSBwb3NzaWJsZSBieSBOZXR3b3JrIFJvYm90cywgSW5jLiAod3d3Lm5ldHdvcmtyb2JvdHMuY29tKQotICoKLSAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbSkKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGNoYXIgX19pbml0ZGF0YSB2ZXJzaW9uW10gPSAiMC45MCI7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfVFVQTEVfUFJPVE8pOwotCi0JTkZBX1BVVChza2IsIENUQV9QUk9UT19OVU0sIHNpemVvZih1X2ludDhfdCksICZ0dXBsZS0+ZHN0LnByb3RvbnVtKTsKLQotCWlmIChsaWtlbHkocHJvdG8tPnR1cGxlX3RvX25mYXR0cikpCi0JCXJldCA9IHByb3RvLT50dXBsZV90b19uZmF0dHIoc2tiLCB0dXBsZSk7Ci0KLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCXJldHVybiByZXQ7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX3R1cGxlc19pcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9JUCk7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX0lQX1Y0X1NSQywgc2l6ZW9mKF9fYmUzMiksICZ0dXBsZS0+c3JjLmlwKTsKLQlORkFfUFVUKHNrYiwgQ1RBX0lQX1Y0X0RTVCwgc2l6ZW9mKF9fYmUzMiksICZ0dXBsZS0+ZHN0LmlwKTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX3R1cGxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwotCi0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX2lwKHNrYiwgdHVwbGUpOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXByb3RvID0gaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5kc3QucHJvdG9udW0pOwotCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhza2IsIHR1cGxlLCBwcm90byk7Ci0JaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCV9fYmUzMiBzdGF0dXMgPSBodG9ubCgodV9pbnQzMl90KSBjdC0+c3RhdHVzKTsKLQlORkFfUFVUKHNrYiwgQ1RBX1NUQVRVUywgc2l6ZW9mKHN0YXR1cyksICZzdGF0dXMpOwotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZHVtcF90aW1lb3V0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCWxvbmcgdGltZW91dF9sID0gY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXM7Ci0JX19iZTMyIHRpbWVvdXQ7Ci0KLQlpZiAodGltZW91dF9sIDwgMCkKLQkJdGltZW91dCA9IDA7Ci0JZWxzZQotCQl0aW1lb3V0ID0gaHRvbmwodGltZW91dF9sIC8gSFopOwotCi0JTkZBX1BVVChza2IsIENUQV9USU1FT1VULCBzaXplb2YodGltZW91dCksICZ0aW1lb3V0KTsKLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvID0gaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0pOwotCi0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wcm90bzsKLQlpbnQgcmV0OwotCi0JaWYgKCFwcm90by0+dG9fbmZhdHRyKSB7Ci0JCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQluZXN0X3Byb3RvID0gTkZBX05FU1Qoc2tiLCBDVEFfUFJPVE9JTkZPKTsKLQotCXJldCA9IHByb3RvLT50b19uZmF0dHIoc2tiLCBuZXN0X3Byb3RvLCBjdCk7Ci0KLQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KHByb3RvKTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcHJvdG8pOwotCi0JcmV0dXJuIHJldDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfaGVscGluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9oZWxwZXI7Ci0KLQlpZiAoIWN0LT5oZWxwZXIpCi0JCXJldHVybiAwOwotCi0JbmVzdF9oZWxwZXIgPSBORkFfTkVTVChza2IsIENUQV9IRUxQKTsKLQlORkFfUFVUKHNrYiwgQ1RBX0hFTFBfTkFNRSwgc3RybGVuKGN0LT5oZWxwZXItPm5hbWUpLCBjdC0+aGVscGVyLT5uYW1lKTsKLQotCWlmIChjdC0+aGVscGVyLT50b19uZmF0dHIpCi0JCWN0LT5oZWxwZXItPnRvX25mYXR0cihza2IsIGN0KTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfaGVscGVyKTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ1RfQUNDVAotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcikKLXsKLQllbnVtIGN0YXR0cl90eXBlIHR5cGUgPSBkaXIgPyBDVEFfQ09VTlRFUlNfUkVQTFk6IENUQV9DT1VOVEVSU19PUklHOwotCXN0cnVjdCBuZmF0dHIgKm5lc3RfY291bnQgPSBORkFfTkVTVChza2IsIHR5cGUpOwotCV9fYmUzMiB0bXA7Ci0KLQl0bXAgPSBodG9ubChjdC0+Y291bnRlcnNbZGlyXS5wYWNrZXRzKTsKLQlORkFfUFVUKHNrYiwgQ1RBX0NPVU5URVJTMzJfUEFDS0VUUywgc2l6ZW9mKF9fYmUzMiksICZ0bXApOwotCi0JdG1wID0gaHRvbmwoY3QtPmNvdW50ZXJzW2Rpcl0uYnl0ZXMpOwotCU5GQV9QVVQoc2tiLCBDVEFfQ09VTlRFUlMzMl9CWVRFUywgc2l6ZW9mKF9fYmUzMiksICZ0bXApOwotCi0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9jb3VudCk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotI2Vsc2UKLSNkZWZpbmUgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoYSwgYiwgYykgKDApCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSwotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX21hcmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JX19iZTMyIG1hcmsgPSBodG9ubChjdC0+bWFyayk7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX01BUkssIHNpemVvZihfX2JlMzIpLCAmbWFyayk7Ci0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLSNlbHNlCi0jZGVmaW5lIGN0bmV0bGlua19kdW1wX21hcmsoYSwgYikgKDApCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX2lkKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCV9fYmUzMiBpZCA9IGh0b25sKGN0LT5pZCk7Ci0JTkZBX1BVVChza2IsIENUQV9JRCwgc2l6ZW9mKF9fYmUzMiksICZpZCk7Ci0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX3VzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlfX2JlMzIgdXNlID0gaHRvbmwoYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkpOwotCi0JTkZBX1BVVChza2IsIENUQV9VU0UsIHNpemVvZihfX2JlMzIpLCAmdXNlKTsKLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi0jZGVmaW5lIHR1cGxlKGN0LCBkaXIpICgmKGN0KS0+dHVwbGVoYXNoW2Rpcl0udHVwbGUpCi0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19maWxsX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHBpZCwgdTMyIHNlcSwKLQkJICAgIGludCBldmVudCwgaW50IG5vd2FpdCwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtczsKLQl1bnNpZ25lZCBjaGFyICpiOwotCi0JYiA9IHNrYi0+dGFpbDsKLQotCWV2ZW50IHw9IE5GTkxfU1VCU1lTX0NUTkVUTElOSyA8PCA4OwotCW5saCAgICA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwotCW5mbXNnICA9IE5MTVNHX0RBVEEobmxoKTsKLQotCW5saC0+bmxtc2dfZmxhZ3MgICAgPSAobm93YWl0ICYmIHBpZCkgPyBOTE1fRl9NVUxUSSA6IDA7Ci0JbmZtc2ctPm5mZ2VuX2ZhbWlseSA9IEFGX0lORVQ7Ci0JbmZtc2ctPnZlcnNpb24gICAgICA9IE5GTkVUTElOS19WMDsKLQluZm1zZy0+cmVzX2lkCSAgICA9IDA7Ci0KLQluZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfVFVQTEVfT1JJRyk7Ci0JaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQluZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfVFVQTEVfUkVQTFkpOwotCWlmIChjdG5ldGxpbmtfZHVtcF90dXBsZXMoc2tiLCB0dXBsZShjdCwgSVBfQ1RfRElSX1JFUExZKSkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JaWYgKGN0bmV0bGlua19kdW1wX3N0YXR1cyhza2IsIGN0KSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfdGltZW91dChza2IsIGN0KSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9oZWxwaW5mbyhza2IsIGN0KSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfbWFyayhza2IsIGN0KSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfaWQoc2tiLCBjdCkgPCAwIHx8Ci0JICAgIGN0bmV0bGlua19kdW1wX3VzZShza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JcmV0dXJuIHNrYi0+bGVuOwotCi1ubG1zZ19mYWlsdXJlOgotbmZhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotc3RhdGljIGludCBjdG5ldGxpbmtfY29ubnRyYWNrX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRzLCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gKHN0cnVjdCBpcF9jb25udHJhY2sgKilwdHI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKLQl1bnNpZ25lZCBjaGFyICpiOwotCXVuc2lnbmVkIGludCBmbGFncyA9IDAsIGdyb3VwOwotCi0JLyogaWdub3JlIG91ciBmYWtlIGNvbm50cmFjayBlbnRyeSAqLwotCWlmIChjdCA9PSAmaXBfY29ubnRyYWNrX3VudHJhY2tlZCkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JaWYgKGV2ZW50cyAmIElQQ1RfREVTVFJPWSkgewotCQl0eXBlID0gSVBDVE5MX01TR19DVF9ERUxFVEU7Ci0JCWdyb3VwID0gTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWTsKLQl9IGVsc2UgaWYgKGV2ZW50cyAmIChJUENUX05FVyB8IElQQ1RfUkVMQVRFRCkpIHsKLQkJdHlwZSA9IElQQ1ROTF9NU0dfQ1RfTkVXOwotCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOwotCQlncm91cCA9IE5GTkxHUlBfQ09OTlRSQUNLX05FVzsKLQl9IGVsc2UgaWYgKGV2ZW50cyAmIChJUENUX1NUQVRVUyB8IElQQ1RfUFJPVE9JTkZPKSkgewotCQl0eXBlID0gSVBDVE5MX01TR19DVF9ORVc7Ci0JCWdyb3VwID0gTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFOwotCX0gZWxzZQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlpZiAoIW5mbmV0bGlua19oYXNfbGlzdGVuZXJzKGdyb3VwKSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0Jc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JYiA9IHNrYi0+dGFpbDsKLQotCXR5cGUgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LIDw8IDg7Ci0JbmxoICAgPSBOTE1TR19QVVQoc2tiLCAwLCAwLCB0eXBlLCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7Ci0JbmZtc2cgPSBOTE1TR19EQVRBKG5saCk7Ci0KLQlubGgtPm5sbXNnX2ZsYWdzICAgID0gZmxhZ3M7Ci0JbmZtc2ctPm5mZ2VuX2ZhbWlseSA9IEFGX0lORVQ7Ci0JbmZtc2ctPnZlcnNpb24JPSBORk5FVExJTktfVjA7Ci0JbmZtc2ctPnJlc19pZAk9IDA7Ci0KLQluZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfVFVQTEVfT1JJRyk7Ci0JaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQluZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfVFVQTEVfUkVQTFkpOwotCWlmIChjdG5ldGxpbmtfZHVtcF90dXBsZXMoc2tiLCB0dXBsZShjdCwgSVBfQ1RfRElSX1JFUExZKSkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JaWYgKGV2ZW50cyAmIElQQ1RfREVTVFJPWSkgewotCQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKLQkJICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQl9IGVsc2UgewotCQlpZiAoY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCkKLQkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQkJaWYgKGN0bmV0bGlua19kdW1wX3RpbWVvdXQoc2tiLCBjdCkgPCAwKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCQlpZiAoZXZlbnRzICYgSVBDVF9QUk9UT0lORk8KLQkJICAgICYmIGN0bmV0bGlua19kdW1wX3Byb3RvaW5mbyhza2IsIGN0KSA8IDApCi0JCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JCWlmICgoZXZlbnRzICYgSVBDVF9IRUxQRVIgfHwgY3QtPmhlbHBlcikKLQkJICAgICYmIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCkKLQkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksKLQkJaWYgKChldmVudHMgJiBJUENUX01BUksgfHwgY3QtPm1hcmspCi0JCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9tYXJrKHNrYiwgY3QpIDwgMCkKLQkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0jZW5kaWYKLQotCQlpZiAoZXZlbnRzICYgSVBDVF9DT1VOVEVSX0ZJTExJTkcgJiYKLQkJICAgIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAotCQkgICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKSkKLQkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JfQotCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCW5mbmV0bGlua19zZW5kKHNrYiwgMCwgZ3JvdXAsIDApOwotCXJldHVybiBOT1RJRllfRE9ORTsKLQotbmxtc2dfZmFpbHVyZToKLW5mYXR0cl9mYWlsdXJlOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLwotCi1zdGF0aWMgaW50IGN0bmV0bGlua19kb25lKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlpZiAoY2ItPmFyZ3NbMV0pCi0JCWlwX2Nvbm50cmFja19wdXQoKHN0cnVjdCBpcF9jb25udHJhY2sgKiljYi0+YXJnc1sxXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19kdW1wX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgKmxhc3Q7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBsaXN0X2hlYWQgKmk7Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlsYXN0ID0gKHN0cnVjdCBpcF9jb25udHJhY2sgKiljYi0+YXJnc1sxXTsKLQlmb3IgKDsgY2ItPmFyZ3NbMF0gPCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7IGNiLT5hcmdzWzBdKyspIHsKLXJlc3RhcnQ6Ci0JCWxpc3RfZm9yX2VhY2hfcHJldihpLCAmaXBfY29ubnRyYWNrX2hhc2hbY2ItPmFyZ3NbMF1dKSB7Ci0JCQloID0gKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqKSBpOwotCQkJaWYgKERJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCQkJY29udGludWU7Ci0JCQljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCQlpZiAoY2ItPmFyZ3NbMV0pIHsKLQkJCQlpZiAoY3QgIT0gbGFzdCkKLQkJCQkJY29udGludWU7Ci0JCQkJY2ItPmFyZ3NbMV0gPSAwOwotCQkJfQotCQkJaWYgKGN0bmV0bGlua19maWxsX2luZm8oc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKLQkJCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwKLQkJCQkJCUlQQ1ROTF9NU0dfQ1RfTkVXLAotCQkJCQkJMSwgY3QpIDwgMCkgewotCQkJCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKLQkJCQljYi0+YXJnc1sxXSA9ICh1bnNpZ25lZCBsb25nKWN0OwotCQkJCWdvdG8gb3V0OwotCQkJfQotI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCi0JCQlpZiAoTkZOTF9NU0dfVFlQRShjYi0+bmxoLT5ubG1zZ190eXBlKSA9PQotCQkJCQkJSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTykKLQkJCQltZW1zZXQoJmN0LT5jb3VudGVycywgMCwgc2l6ZW9mKGN0LT5jb3VudGVycykpOwotI2VuZGlmCi0JCX0KLQkJaWYgKGNiLT5hcmdzWzFdKSB7Ci0JCQljYi0+YXJnc1sxXSA9IDA7Ci0JCQlnb3RvIHJlc3RhcnQ7Ci0JCX0KLQl9Ci1vdXQ6Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpZiAobGFzdCkKLQkJaXBfY29ubnRyYWNrX3B1dChsYXN0KTsKLQotCXJldHVybiBza2ItPmxlbjsKLX0KLQotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX2lwW0NUQV9JUF9NQVhdID0gewotCVtDVEFfSVBfVjRfU1JDLTFdCT0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9JUF9WNF9EU1QtMV0JPSBzaXplb2YoX19iZTMyKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfcGFyc2VfdHVwbGVfaXAoc3RydWN0IG5mYXR0ciAqYXR0ciwgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX0lQX01BWF07Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfSVBfTUFYLCBhdHRyKTsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9JUF9NQVgsIGN0YV9taW5faXApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghdGJbQ1RBX0lQX1Y0X1NSQy0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdHVwbGUtPnNyYy5pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX0lQX1Y0X1NSQy0xXSk7Ci0KLQlpZiAoIXRiW0NUQV9JUF9WNF9EU1QtMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCXR1cGxlLT5kc3QuaXAgPSAqKF9fYmUzMiAqKU5GQV9EQVRBKHRiW0NUQV9JUF9WNF9EU1QtMV0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgY3RhX21pbl9wcm90b1tDVEFfUFJPVE9fTUFYXSA9IHsKLQlbQ1RBX1BST1RPX05VTS0xXQk9IHNpemVvZih1X2ludDhfdCksCi0JW0NUQV9QUk9UT19TUkNfUE9SVC0xXQk9IHNpemVvZih1X2ludDE2X3QpLAotCVtDVEFfUFJPVE9fRFNUX1BPUlQtMV0JPSBzaXplb2YodV9pbnQxNl90KSwKLQlbQ1RBX1BST1RPX0lDTVBfVFlQRS0xXQk9IHNpemVvZih1X2ludDhfdCksCi0JW0NUQV9QUk9UT19JQ01QX0NPREUtMV0JPSBzaXplb2YodV9pbnQ4X3QpLAotCVtDVEFfUFJPVE9fSUNNUF9JRC0xXQk9IHNpemVvZih1X2ludDE2X3QpLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19wYXJzZV90dXBsZV9wcm90byhzdHJ1Y3QgbmZhdHRyICphdHRyLAotCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9QUk9UT19NQVhdOwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwotCWludCByZXQgPSAwOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPX01BWCwgYXR0cik7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9fTUFYLCBjdGFfbWluX3Byb3RvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXRiW0NUQV9QUk9UT19OVU0tMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCXR1cGxlLT5kc3QucHJvdG9udW0gPSAqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX05VTS0xXSk7Ci0KLQlwcm90byA9IGlwX2Nvbm50cmFja19wcm90b19maW5kX2dldCh0dXBsZS0+ZHN0LnByb3RvbnVtKTsKLQotCWlmIChsaWtlbHkocHJvdG8tPm5mYXR0cl90b190dXBsZSkpCi0JCXJldCA9IHByb3RvLT5uZmF0dHJfdG9fdHVwbGUodGIsIHR1cGxlKTsKLQotCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19wYXJzZV90dXBsZShzdHJ1Y3QgbmZhdHRyICpjZGFbXSwgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICAgIGVudW0gY3RhdHRyX3R1cGxlIHR5cGUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1RVUExFX01BWF07Ci0JaW50IGVycjsKLQotCW1lbXNldCh0dXBsZSwgMCwgc2l6ZW9mKCp0dXBsZSkpOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1RVUExFX01BWCwgY2RhW3R5cGUtMV0pOwotCi0JaWYgKCF0YltDVEFfVFVQTEVfSVAtMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlX2lwKHRiW0NUQV9UVVBMRV9JUC0xXSwgdHVwbGUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCF0YltDVEFfVFVQTEVfUFJPVE8tMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlX3Byb3RvKHRiW0NUQV9UVVBMRV9QUk9UTy0xXSwgdHVwbGUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogb3JpZyBhbmQgZXhwZWN0IHR1cGxlcyBnZXQgRElSX09SSUdJTkFMICovCi0JaWYgKHR5cGUgPT0gQ1RBX1RVUExFX1JFUExZKQotCQl0dXBsZS0+ZHN0LmRpciA9IElQX0NUX0RJUl9SRVBMWTsKLQllbHNlCi0JCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3Byb3RvbmF0W0NUQV9QUk9UT05BVF9NQVhdID0gewotCVtDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0JPSBzaXplb2YodV9pbnQxNl90KSwKLQlbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdCT0gc2l6ZW9mKHVfaW50MTZfdCksCi19OwotCi1zdGF0aWMgaW50IGN0bmV0bGlua19wYXJzZV9uYXRfcHJvdG8oc3RydWN0IG5mYXR0ciAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSAgICAgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1BST1RPTkFUX01BWF07Ci0Jc3RydWN0IGlwX25hdF9wcm90b2NvbCAqbnB0OwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPTkFUX01BWCwgYXR0cik7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9OQVRfTUFYLCBjdGFfbWluX3Byb3RvbmF0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlucHQgPSBpcF9uYXRfcHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7Ci0KLQlpZiAoIW5wdC0+bmZhdHRyX3RvX3JhbmdlKSB7Ci0JCWlwX25hdF9wcm90b19wdXQobnB0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogbmZhdHRyX3RvX3JhbmdlIHJldHVybnMgMSBpZiBpdCBwYXJzZWQsIDAgaWYgbm90LCBuZWcuIG9uIGVycm9yICovCi0JaWYgKG5wdC0+bmZhdHRyX3RvX3JhbmdlKHRiLCByYW5nZSkgPiAwKQotCQlyYW5nZS0+ZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKLQotCWlwX25hdF9wcm90b19wdXQobnB0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5fbmF0W0NUQV9OQVRfTUFYXSA9IHsKLQlbQ1RBX05BVF9NSU5JUC0xXSAgICAgICA9IHNpemVvZihfX2JlMzIpLAotCVtDVEFfTkFUX01BWElQLTFdICAgICAgID0gc2l6ZW9mKF9fYmUzMiksCi19OwotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX3BhcnNlX25hdChzdHJ1Y3QgbmZhdHRyICpuYXQsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX05BVF9NQVhdOwotCWludCBlcnI7Ci0KLQltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKLQotCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9OQVRfTUFYLCBuYXQpOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX05BVF9NQVgsIGN0YV9taW5fbmF0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodGJbQ1RBX05BVF9NSU5JUC0xXSkKLQkJcmFuZ2UtPm1pbl9pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX05BVF9NSU5JUC0xXSk7Ci0KLQlpZiAoIXRiW0NUQV9OQVRfTUFYSVAtMV0pCi0JCXJhbmdlLT5tYXhfaXAgPSByYW5nZS0+bWluX2lwOwotCWVsc2UKLQkJcmFuZ2UtPm1heF9pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX05BVF9NQVhJUC0xXSk7Ci0KLQlpZiAocmFuZ2UtPm1pbl9pcCkKLQkJcmFuZ2UtPmZsYWdzIHw9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCi0JaWYgKCF0YltDVEFfTkFUX1BST1RPLTFdKQotCQlyZXR1cm4gMDsKLQotCWVyciA9IGN0bmV0bGlua19wYXJzZV9uYXRfcHJvdG8odGJbQ1RBX05BVF9QUk9UTy0xXSwgY3QsIHJhbmdlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfcGFyc2VfaGVscChzdHJ1Y3QgbmZhdHRyICphdHRyLCBjaGFyICoqaGVscGVyX25hbWUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX0hFTFBfTUFYXTsKLQotCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9IRUxQX01BWCwgYXR0cik7Ci0KLQlpZiAoIXRiW0NUQV9IRUxQX05BTUUtMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JKmhlbHBlcl9uYW1lID0gTkZBX0RBVEEodGJbQ1RBX0hFTFBfTkFNRS0xXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluW0NUQV9NQVhdID0gewotCVtDVEFfU1RBVFVTLTFdIAkJPSBzaXplb2YoX19iZTMyKSwKLQlbQ1RBX1RJTUVPVVQtMV0gCT0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9NQVJLLTFdCQk9IHNpemVvZihfX2JlMzIpLAotCVtDVEFfVVNFLTFdCQk9IHNpemVvZihfX2JlMzIpLAotCVtDVEFfSUQtMV0JCT0gc2l6ZW9mKF9fYmUzMikKLX07Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19kZWxfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNkYVtDVEFfVFVQTEVfT1JJRy0xXSkKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfVFVQTEVfT1JJRyk7Ci0JZWxzZSBpZiAoY2RhW0NUQV9UVVBMRV9SRVBMWS0xXSkKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfVFVQTEVfUkVQTFkpOwotCWVsc2UgewotCQkvKiBGbHVzaCB0aGUgd2hvbGUgdGFibGUgKi8KLQkJaXBfY29ubnRyYWNrX2ZsdXNoKCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaCA9IGlwX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUsIE5VTEwpOwotCWlmICghaCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQlpZiAoY2RhW0NUQV9JRC0xXSkgewotCQl1X2ludDMyX3QgaWQgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfSUQtMV0pKTsKLQkJaWYgKGN0LT5pZCAhPSBpZCkgewotCQkJaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCX0KLQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCi0JCWN0LT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKWN0KTsKLQotCWlwX2Nvbm50cmFja19wdXQoY3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19nZXRfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7Ci0JCXN0cnVjdCBuZmdlbm1zZyAqbXNnID0gTkxNU0dfREFUQShubGgpOwotCQl1MzIgcmxlbjsKLQotCQlpZiAobXNnLT5uZmdlbl9mYW1pbHkgIT0gQUZfSU5FVCkKLQkJCXJldHVybiAtRUFGTk9TVVBQT1JUOwotCi0jaWZuZGVmIENPTkZJR19JUF9ORl9DVF9BQ0NUCi0JCWlmIChORk5MX01TR19UWVBFKG5saC0+bmxtc2dfdHlwZSkgPT0gSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTykKLQkJCXJldHVybiAtRU5PVFNVUFA7Ci0jZW5kaWYKLQkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwKLQkJCQkJCWN0bmV0bGlua19kdW1wX3RhYmxlLAotCQkJCQkJY3RuZXRsaW5rX2RvbmUpKSAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKLQkJaWYgKHJsZW4gPiBza2ItPmxlbikKLQkJCXJsZW4gPSBza2ItPmxlbjsKLQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9NQVgsIGN0YV9taW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjZGFbQ1RBX1RVUExFX09SSUctMV0pCi0JCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX1RVUExFX09SSUcpOwotCWVsc2UgaWYgKGNkYVtDVEFfVFVQTEVfUkVQTFktMV0pCi0JCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX1RVUExFX1JFUExZKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQotCWVyciA9IC1FTk9NRU07Ci0Jc2tiMiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IyKSB7Ci0JCWlwX2Nvbm50cmFja19wdXQoY3QpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQllcnIgPSBjdG5ldGxpbmtfZmlsbF9pbmZvKHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIG5saC0+bmxtc2dfc2VxLAotCQkJCSAgSVBDVE5MX01TR19DVF9ORVcsIDEsIGN0KTsKLQlpcF9jb25udHJhY2tfcHV0KGN0KTsKLQlpZiAoZXJyIDw9IDApCi0JCWdvdG8gZnJlZTsKLQotCWVyciA9IG5ldGxpbmtfdW5pY2FzdChjdG5sLCBza2IyLCBORVRMSU5LX0NCKHNrYikucGlkLCBNU0dfRE9OVFdBSVQpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dDsKLQotCXJldHVybiAwOwotCi1mcmVlOgotCWtmcmVlX3NrYihza2IyKTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2NoYW5nZV9zdGF0dXMoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQotewotCXVuc2lnbmVkIGxvbmcgZDsKLQl1bnNpZ25lZCBzdGF0dXMgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfU1RBVFVTLTFdKSk7Ci0JZCA9IGN0LT5zdGF0dXMgXiBzdGF0dXM7Ci0KLQlpZiAoZCAmIChJUFNfRVhQRUNURUR8SVBTX0NPTkZJUk1FRHxJUFNfRFlJTkcpKQotCQkvKiB1bmNoYW5nZWFibGUgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZCAmIElQU19TRUVOX1JFUExZICYmICEoc3RhdHVzICYgSVBTX1NFRU5fUkVQTFkpKQotCQkvKiBTRUVOX1JFUExZIGJpdCBjYW4gb25seSBiZSBzZXQgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQotCWlmIChkICYgSVBTX0FTU1VSRUQgJiYgIShzdGF0dXMgJiBJUFNfQVNTVVJFRCkpCi0JCS8qIEFTU1VSRUQgYml0IGNhbiBvbmx5IGJlIHNldCAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjZGFbQ1RBX05BVF9TUkMtMV0gfHwgY2RhW0NUQV9OQVRfRFNULTFdKSB7Ci0jaWZuZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0JCXJldHVybiAtRUlOVkFMOwotI2Vsc2UKLQkJc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKLQotCQlpZiAoY2RhW0NUQV9OQVRfRFNULTFdKSB7Ci0JCQlpZiAoY3RuZXRsaW5rX3BhcnNlX25hdChjZGFbQ1RBX05BVF9EU1QtMV0sIGN0LAotCQkJCQkJJnJhbmdlKSA8IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoaXBfbmF0X2luaXRpYWxpemVkKGN0LAotCQkJCQkgICAgICAgSE9PSzJNQU5JUChORl9JUF9QUkVfUk9VVElORykpKQotCQkJCXJldHVybiAtRUVYSVNUOwotCQkJaXBfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOwotCQl9Ci0JCWlmIChjZGFbQ1RBX05BVF9TUkMtMV0pIHsKLQkJCWlmIChjdG5ldGxpbmtfcGFyc2VfbmF0KGNkYVtDVEFfTkFUX1NSQy0xXSwgY3QsCi0JCQkJCQkmcmFuZ2UpIDwgMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChpcF9uYXRfaW5pdGlhbGl6ZWQoY3QsCi0JCQkJCSAgICAgICBIT09LMk1BTklQKE5GX0lQX1BPU1RfUk9VVElORykpKQotCQkJCXJldHVybiAtRUVYSVNUOwotCQkJaXBfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogQmUgY2FyZWZ1bCBoZXJlLCBtb2RpZnlpbmcgTkFUIGJpdHMgY2FuIHNjcmV3IHVwIHRoaW5ncywKLQkgKiBzbyBkb24ndCBsZXQgdXNlcnMgbW9kaWZ5IHRoZW0gZGlyZWN0bHkgaWYgdGhleSBkb24ndCBwYXNzCi0JICogaXBfbmF0X3JhbmdlLiAqLwotCWN0LT5zdGF0dXMgfD0gc3RhdHVzICYgfihJUFNfTkFUX0RPTkVfTUFTSyB8IElQU19OQVRfTUFTSyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19jaGFuZ2VfaGVscGVyKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwotCWNoYXIgKmhlbHBuYW1lOwotCWludCBlcnI7Ci0KLQkvKiBkb24ndCBjaGFuZ2UgaGVscGVyIG9mIHNpYmxpbmcgY29ubmVjdGlvbnMgKi8KLQlpZiAoY3QtPm1hc3RlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfaGVscChjZGFbQ1RBX0hFTFAtMV0sICZoZWxwbmFtZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQloZWxwZXIgPSBfX2lwX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUoaGVscG5hbWUpOwotCWlmICghaGVscGVyKSB7Ci0JCWlmICghc3RyY21wKGhlbHBuYW1lLCAiIikpCi0JCQloZWxwZXIgPSBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY3QtPmhlbHBlcikgewotCQlpZiAoIWhlbHBlcikgewotCQkJLyogd2UgaGFkIGEgaGVscGVyIGJlZm9yZSAuLi4gKi8KLQkJCWlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOwotCQkJY3QtPmhlbHBlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBuZWVkIHRvIHplcm8gZGF0YSBvZiBvbGQgaGVscGVyICovCi0JCQltZW1zZXQoJmN0LT5oZWxwLCAwLCBzaXplb2YoY3QtPmhlbHApKTsKLQkJfQotCX0KLQotCWN0LT5oZWxwZXIgPSBoZWxwZXI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19jaGFuZ2VfdGltZW91dChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCi17Ci0JdV9pbnQzMl90IHRpbWVvdXQgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOwotCi0JaWYgKCFkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRTsKLQotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dCAqIEhaOwotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfY2hhbmdlX3Byb3RvaW5mbyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1BST1RPSU5GT19NQVhdLCAqYXR0ciA9IGNkYVtDVEFfUFJPVE9JTkZPLTFdOwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwotCXVfaW50MTZfdCBucHQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtOwotCWludCBlcnIgPSAwOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPSU5GT19NQVgsIGF0dHIpOwotCi0JcHJvdG8gPSBpcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQobnB0KTsKLQotCWlmIChwcm90by0+ZnJvbV9uZmF0dHIpCi0JCWVyciA9IHByb3RvLT5mcm9tX25mYXR0cih0YiwgY3QpOwotCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX2NoYW5nZV9jb25udHJhY2soc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQotewotCWludCBlcnI7Ci0KLQlpZiAoY2RhW0NUQV9IRUxQLTFdKSB7Ci0JCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfaGVscGVyKGN0LCBjZGEpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGNkYVtDVEFfVElNRU9VVC0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3RpbWVvdXQoY3QsIGNkYSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9TVEFUVVMtMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9zdGF0dXMoY3QsIGNkYSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9QUk9UT0lORk8tMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oY3QsIGNkYSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSykKLQlpZiAoY2RhW0NUQV9NQVJLLTFdKQotCQljdC0+bWFyayA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmZhdHRyICpjZGFbXSwKLQkJCSAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm90dXBsZSwKLQkJCSAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnJ0dXBsZSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQlpbnQgZXJyID0gLUVJTlZBTDsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2FsbG9jKG90dXBsZSwgcnR1cGxlKTsKLQlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghY2RhW0NUQV9USU1FT1VULTFdKQotCQlnb3RvIGVycjsKLQljdC0+dGltZW91dC5leHBpcmVzID0gbnRvaGwoKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX1RJTUVPVVQtMV0pKTsKLQotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgY3QtPnRpbWVvdXQuZXhwaXJlcyAqIEhaOwotCWN0LT5zdGF0dXMgfD0gSVBTX0NPTkZJUk1FRDsKLQotCWlmIChjZGFbQ1RBX1NUQVRVUy0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9QUk9UT0lORk8tMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oY3QsIGNkYSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUkspCi0JaWYgKGNkYVtDVEFfTUFSSy0xXSkKLQkJY3QtPm1hcmsgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfTUFSSy0xXSkpOwotI2VuZGlmCi0KLQljdC0+aGVscGVyID0gaXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2dldChydHVwbGUpOwotCi0JYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0JaXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KGN0KTsKLQotCWlmIChjdC0+aGVscGVyKQotCQlpcF9jb25udHJhY2tfaGVscGVyX3B1dChjdC0+aGVscGVyKTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JaXBfY29ubnRyYWNrX2ZyZWUoY3QpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19uZXdfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBvdHVwbGUsIHJ0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmggPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9NQVgsIGN0YV9taW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjZGFbQ1RBX1RVUExFX09SSUctMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJm90dXBsZSwgQ1RBX1RVUExFX09SSUcpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGNkYVtDVEFfVFVQTEVfUkVQTFktMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnJ0dXBsZSwgQ1RBX1RVUExFX1JFUExZKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpZiAoY2RhW0NUQV9UVVBMRV9PUklHLTFdKQotCQloID0gX19pcF9jb25udHJhY2tfZmluZCgmb3R1cGxlLCBOVUxMKTsKLQllbHNlIGlmIChjZGFbQ1RBX1RVUExFX1JFUExZLTFdKQotCQloID0gX19pcF9jb25udHJhY2tfZmluZCgmcnR1cGxlLCBOVUxMKTsKLQotCWlmIChoID09IE5VTEwpIHsKLQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKQotCQkJZXJyID0gY3RuZXRsaW5rX2NyZWF0ZV9jb25udHJhY2soY2RhLCAmb3R1cGxlLCAmcnR1cGxlKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JLyogaW1wbGljaXQgJ2Vsc2UnICovCi0KLQkvKiB3ZSBvbmx5IGFsbG93IG5hdCBjb25maWcgZm9yIG5ldyBjb25udHJhY2tzICovCi0JaWYgKGNkYVtDVEFfTkFUX1NSQy0xXSB8fCBjZGFbQ1RBX05BVF9EU1QtMV0pIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCS8qIFdlIG1hbmlwdWxhdGUgdGhlIGNvbm50cmFjayBpbnNpZGUgdGhlIGdsb2JhbCBjb25udHJhY2sgdGFibGUgbG9jaywKLQkgKiBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHJlZmNvdW50ICovCi0JZXJyID0gLUVFWElTVDsKLQlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCi0JCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfY29ubnRyYWNrKHR1cGxlaGFzaF90b19jdHJhY2soaCksIGNkYSk7Ci0KLW91dF91bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFWFBFQ1QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19leHBfZHVtcF90dXBsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJIGVudW0gY3RhdHRyX2V4cGVjdCB0eXBlKQotewotCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIHR5cGUpOwotCi0JaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZXhwX2R1bXBfbWFzayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXNrKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtcyA9IE5GQV9ORVNUKHNrYiwgQ1RBX0VYUEVDVF9NQVNLKTsKLQotCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19pcChza2IsIG1hc2spOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCXByb3RvID0gaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5kc3QucHJvdG9udW0pOwotCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhza2IsIG1hc2ssIHByb3RvKTsKLQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KHByb3RvKTsKLQlpZiAodW5saWtlbHkocmV0IDwgMCkpCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZXhwX2R1bXBfZXhwZWN0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyID0gZXhwLT5tYXN0ZXI7Ci0JX19iZTMyIHRpbWVvdXQgPSBodG9ubCgoZXhwLT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKSAvIEhaKTsKLQlfX2JlMzIgaWQgPSBodG9ubChleHAtPmlkKTsKLQotCWlmIChjdG5ldGxpbmtfZXhwX2R1bXBfdHVwbGUoc2tiLCAmZXhwLT50dXBsZSwgQ1RBX0VYUEVDVF9UVVBMRSkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCWlmIChjdG5ldGxpbmtfZXhwX2R1bXBfbWFzayhza2IsICZleHAtPnR1cGxlLCAmZXhwLT5tYXNrKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGN0bmV0bGlua19leHBfZHVtcF90dXBsZShza2IsCi0JCQkJICZtYXN0ZXItPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJCSBDVEFfRVhQRUNUX01BU1RFUikgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JTkZBX1BVVChza2IsIENUQV9FWFBFQ1RfVElNRU9VVCwgc2l6ZW9mKF9fYmUzMiksICZ0aW1lb3V0KTsKLQlORkFfUFVUKHNrYiwgQ1RBX0VYUEVDVF9JRCwgc2l6ZW9mKF9fYmUzMiksICZpZCk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfZXhwX2ZpbGxfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAotCQkgICAgaW50IGV2ZW50LAotCQkgICAgaW50IG5vd2FpdCwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKLQl1bnNpZ25lZCBjaGFyICpiOwotCi0JYiA9IHNrYi0+dGFpbDsKLQotCWV2ZW50IHw9IE5GTkxfU1VCU1lTX0NUTkVUTElOS19FWFAgPDwgODsKLQlubGggICAgPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKLQluZm1zZyAgPSBOTE1TR19EQVRBKG5saCk7Ci0KLQlubGgtPm5sbXNnX2ZsYWdzICAgID0gKG5vd2FpdCAmJiBwaWQpID8gTkxNX0ZfTVVMVEkgOiAwOwotCW5mbXNnLT5uZmdlbl9mYW1pbHkgPSBBRl9JTkVUOwotCW5mbXNnLT52ZXJzaW9uCSAgICA9IE5GTkVUTElOS19WMDsKLQluZm1zZy0+cmVzX2lkCSAgICA9IDA7Ci0KLQlpZiAoY3RuZXRsaW5rX2V4cF9kdW1wX2V4cGVjdChza2IsIGV4cCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCXJldHVybiBza2ItPmxlbjsKLQotbmxtc2dfZmFpbHVyZToKLW5mYXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0JcmV0dXJuIC0xOwotfQotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMKLXN0YXRpYyBpbnQgY3RuZXRsaW5rX2V4cGVjdF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50cywgdm9pZCAqcHRyKQotewotCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqKXB0cjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCB0eXBlOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0JaW50IGZsYWdzID0gMDsKLQotCWlmIChldmVudHMgJiBJUEVYUF9ORVcpIHsKLQkJdHlwZSA9IElQQ1ROTF9NU0dfRVhQX05FVzsKLQkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKLQl9IGVsc2UKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JaWYgKCFuZm5ldGxpbmtfaGFzX2xpc3RlbmVycyhORk5MR1JQX0NPTk5UUkFDS19FWFBfTkVXKSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0Jc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JYiA9IHNrYi0+dGFpbDsKLQotCXR5cGUgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LX0VYUCA8PCA4OwotCW5saCAgID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgdHlwZSwgc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwotCW5mbXNnID0gTkxNU0dfREFUQShubGgpOwotCi0JbmxoLT5ubG1zZ19mbGFncyAgICA9IGZsYWdzOwotCW5mbXNnLT5uZmdlbl9mYW1pbHkgPSBBRl9JTkVUOwotCW5mbXNnLT52ZXJzaW9uCSAgICA9IE5GTkVUTElOS19WMDsKLQluZm1zZy0+cmVzX2lkCSAgICA9IDA7Ci0KLQlpZiAoY3RuZXRsaW5rX2V4cF9kdW1wX2V4cGVjdChza2IsIGV4cCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCW5mbmV0bGlua19zZW5kKHNrYiwgMCwgTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVywgMCk7Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotCi1ubG1zZ19mYWlsdXJlOgotbmZhdHRyX2ZhaWx1cmU6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19leHBfZHVtcF90YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaTsKLQl1X2ludDMyX3QgKmlkID0gKHVfaW50MzJfdCAqKSAmY2ItPmFyZ3NbMF07Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3ByZXYoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkgewotCQlleHAgPSAoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKikgaTsKLQkJaWYgKGV4cC0+aWQgPD0gKmlkKQotCQkJY29udGludWU7Ci0JCWlmIChjdG5ldGxpbmtfZXhwX2ZpbGxfaW5mbyhza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAotCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgSVBDVE5MX01TR19FWFBfTkVXLAotCQkJCQkgICAgMSwgZXhwKSA8IDApCi0JCQlnb3RvIG91dDsKLQkJKmlkID0gZXhwLT5pZDsKLQl9Ci1vdXQ6Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBza2ItPmxlbjsKLX0KLQotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX2V4cFtDVEFfRVhQRUNUX01BWF0gPSB7Ci0JW0NUQV9FWFBFQ1RfVElNRU9VVC0xXSAgICAgICAgICA9IHNpemVvZihfX2JlMzIpLAotCVtDVEFfRVhQRUNUX0lELTFdICAgICAgICAgICAgICAgPSBzaXplb2YoX19iZTMyKQotfTsKLQotc3RhdGljIGludAotY3RuZXRsaW5rX2dldF9leHBlY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXN0cnVjdCBza19idWZmICpza2IyOwotCWludCBlcnIgPSAwOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9FWFBFQ1RfTUFYLCBjdGFfbWluX2V4cCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7Ci0JCXN0cnVjdCBuZmdlbm1zZyAqbXNnID0gTkxNU0dfREFUQShubGgpOwotCQl1MzIgcmxlbjsKLQotCQlpZiAobXNnLT5uZmdlbl9mYW1pbHkgIT0gQUZfSU5FVCkKLQkJCXJldHVybiAtRUFGTk9TVVBQT1JUOwotCi0JCWlmICgoKmVycnAgPSBuZXRsaW5rX2R1bXBfc3RhcnQoY3RubCwgc2tiLCBubGgsCi0JCQkJCQljdG5ldGxpbmtfZXhwX2R1bXBfdGFibGUsCi0JCQkJCQljdG5ldGxpbmtfZG9uZSkpICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKLQkJaWYgKHJsZW4gPiBza2ItPmxlbikKLQkJCXJsZW4gPSBza2ItPmxlbjsKLQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNkYVtDVEFfRVhQRUNUX01BU1RFUi0xXSkKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX01BU1RFUik7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdHVwbGUpOwotCWlmICghZXhwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWlmIChjZGFbQ1RBX0VYUEVDVF9JRC0xXSkgewotCQlfX2JlMzIgaWQgPSAqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfRVhQRUNUX0lELTFdKTsKLQkJaWYgKGV4cC0+aWQgIT0gbnRvaGwoaWQpKSB7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQl9Ci0KLQllcnIgPSAtRU5PTUVNOwotCXNrYjIgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwotCWlmICghc2tiMikKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBjdG5ldGxpbmtfZXhwX2ZpbGxfaW5mbyhza2IyLCBORVRMSU5LX0NCKHNrYikucGlkLAotCQkJCSAgICAgIG5saC0+bmxtc2dfc2VxLCBJUENUTkxfTVNHX0VYUF9ORVcsCi0JCQkJICAgICAgMSwgZXhwKTsKLQlpZiAoZXJyIDw9IDApCi0JCWdvdG8gZnJlZTsKLQotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQlyZXR1cm4gbmV0bGlua191bmljYXN0KGN0bmwsIHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIE1TR19ET05UV0FJVCk7Ci0KLWZyZWU6Ci0Ja2ZyZWVfc2tiKHNrYjIpOwotb3V0OgotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX2RlbF9leHBlY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoOwotCWludCBlcnI7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY2RhW0NUQV9FWFBFQ1RfVFVQTEUtMV0pIHsKLQkJLyogZGVsZXRlIGEgc2luZ2xlIGV4cGVjdCBieSB0dXBsZSAqLwotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmdHVwbGUsIENUQV9FWFBFQ1RfVFVQTEUpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0KLQkJLyogYnVtcCB1c2FnZSBjb3VudCB0byAyICovCi0JCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKLQkJaWYgKCFleHApCi0JCQlyZXR1cm4gLUVOT0VOVDsKLQotCQlpZiAoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pIHsKLQkJCV9fYmUzMiBpZCA9Ci0JCQkJKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX0VYUEVDVF9JRC0xXSk7Ci0JCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKLQkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJCXJldHVybiAtRU5PRU5UOwotCQkJfQotCQl9Ci0KLQkJLyogYWZ0ZXIgbGlzdCByZW1vdmFsLCB1c2FnZSBjb3VudCA9PSAxICovCi0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCS8qIGhhdmUgdG8gcHV0IHdoYXQgd2UgJ2dldCcgYWJvdmUuCi0JCSAqIGFmdGVyIHRoaXMgbGluZSB1c2FnZSBjb3VudCA9PSAwICovCi0JCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JfSBlbHNlIGlmIChjZGFbQ1RBX0VYUEVDVF9IRUxQX05BTUUtMV0pIHsKLQkJY2hhciAqbmFtZSA9IE5GQV9EQVRBKGNkYVtDVEFfRVhQRUNUX0hFTFBfTkFNRS0xXSk7Ci0KLQkJLyogZGVsZXRlIGFsbCBleHBlY3RhdGlvbnMgZm9yIHRoaXMgaGVscGVyICovCi0JCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJaCA9IF9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShuYW1lKTsKLQkJaWYgKCFoKSB7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwKLQkJCQkJIGxpc3QpIHsKLQkJCWlmIChleHAtPm1hc3Rlci0+aGVscGVyID09IGgKLQkJCSAgICAmJiBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKLQkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQkJCX0KLQkJfQotCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQl9IGVsc2UgewotCQkvKiBUaGlzIGJhc2ljYWxseSBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIGV2ZXJ5dGhpbmcqLwotCQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwKLQkJCQkJIGxpc3QpIHsKLQkJCWlmIChkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKLQkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQkJCX0KLQkJfQotCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp4LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19jcmVhdGVfZXhwZWN0KHN0cnVjdCBuZmF0dHIgKmNkYVtdKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGUsIG1hc2ssIG1hc3Rlcl90dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmggPSBOVUxMOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHRob3NlIHRocmVlIENUQV9FWFBFQ1RfKiBleGlzdCAqLwotCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX0VYUEVDVF9UVVBMRSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJm1hc2ssIENUQV9FWFBFQ1RfTUFTSyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJm1hc3Rlcl90dXBsZSwgQ1RBX0VYUEVDVF9NQVNURVIpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogTG9vayBmb3IgbWFzdGVyIGNvbm50cmFjayBvZiB0aGlzIGV4cGVjdGF0aW9uICovCi0JaCA9IGlwX2Nvbm50cmFja19maW5kX2dldCgmbWFzdGVyX3R1cGxlLCBOVUxMKTsKLQlpZiAoIWgpCi0JCXJldHVybiAtRU5PRU5UOwotCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQotCWlmICghY3QtPmhlbHBlcikgewotCQkvKiBzdWNoIGNvbm50cmFjayBoYXNuJ3QgZ290IGFueSBoZWxwZXIsIGFib3J0ICovCi0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwotCWlmICghZXhwKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCWV4cC0+ZmxhZ3MgPSAwOwotCWV4cC0+bWFzdGVyID0gY3Q7Ci0JbWVtY3B5KCZleHAtPnR1cGxlLCAmdHVwbGUsIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlKSk7Ci0JbWVtY3B5KCZleHAtPm1hc2ssICZtYXNrLCBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkpOwotCi0JZXJyID0gaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotb3V0OgotCWlwX2Nvbm50cmFja19wdXQodHVwbGVoYXNoX3RvX2N0cmFjayhoKSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX25ld19leHBlY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCWludCBlcnIgPSAwOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9FWFBFQ1RfTUFYLCBjdGFfbWluX2V4cCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFjZGFbQ1RBX0VYUEVDVF9UVVBMRS0xXQotCSAgICB8fCAhY2RhW0NUQV9FWFBFQ1RfTUFTSy0xXQotCSAgICB8fCAhY2RhW0NUQV9FWFBFQ1RfTUFTVEVSLTFdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX0VYUEVDVF9UVVBMRSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JZXhwID0gX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJnR1cGxlKTsKLQotCWlmICghZXhwKSB7Ci0JCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCQllcnIgPSAtRU5PRU5UOwotCQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0NSRUFURSkKLQkJCWVyciA9IGN0bmV0bGlua19jcmVhdGVfZXhwZWN0KGNkYSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gLUVFWElTVDsKLQlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCi0JCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KGV4cCwgY2RhKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjdG5sX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gY3RuZXRsaW5rX2Nvbm50cmFja19ldmVudCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3RubF9ub3RpZmllcl9leHAgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBjdG5ldGxpbmtfZXhwZWN0X2V2ZW50LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG5mbmxfY2FsbGJhY2sgY3RubF9jYltJUENUTkxfTVNHX01BWF0gPSB7Ci0JW0lQQ1ROTF9NU0dfQ1RfTkVXXQkJPSB7IC5jYWxsID0gY3RuZXRsaW5rX25ld19jb25udHJhY2ssCi0JCQkJCSAgICAuYXR0cl9jb3VudCA9IENUQV9NQVgsIH0sCi0JW0lQQ1ROTF9NU0dfQ1RfR0VUXSAJCT0geyAuY2FsbCA9IGN0bmV0bGlua19nZXRfY29ubnRyYWNrLAotCQkJCQkgICAgLmF0dHJfY291bnQgPSBDVEFfTUFYLCB9LAotCVtJUENUTkxfTVNHX0NUX0RFTEVURV0gIAk9IHsgLmNhbGwgPSBjdG5ldGxpbmtfZGVsX2Nvbm50cmFjaywKLQkJCQkJICAgIC5hdHRyX2NvdW50ID0gQ1RBX01BWCwgfSwKLQlbSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVST10gCT0geyAuY2FsbCA9IGN0bmV0bGlua19nZXRfY29ubnRyYWNrLAotCQkJCQkgICAgLmF0dHJfY291bnQgPSBDVEFfTUFYLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBuZm5sX2NhbGxiYWNrIGN0bmxfZXhwX2NiW0lQQ1ROTF9NU0dfRVhQX01BWF0gPSB7Ci0JW0lQQ1ROTF9NU0dfRVhQX0dFVF0JCT0geyAuY2FsbCA9IGN0bmV0bGlua19nZXRfZXhwZWN0LAotCQkJCQkgICAgLmF0dHJfY291bnQgPSBDVEFfRVhQRUNUX01BWCwgfSwKLQlbSVBDVE5MX01TR19FWFBfTkVXXQkJPSB7IC5jYWxsID0gY3RuZXRsaW5rX25ld19leHBlY3QsCi0JCQkJCSAgICAuYXR0cl9jb3VudCA9IENUQV9FWFBFQ1RfTUFYLCB9LAotCVtJUENUTkxfTVNHX0VYUF9ERUxFVEVdCQk9IHsgLmNhbGwgPSBjdG5ldGxpbmtfZGVsX2V4cGVjdCwKLQkJCQkJICAgIC5hdHRyX2NvdW50ID0gQ1RBX0VYUEVDVF9NQVgsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gY3RubF9zdWJzeXMgPSB7Ci0JLm5hbWUJCQkJPSAiY29ubnRyYWNrIiwKLQkuc3Vic3lzX2lkCQkJPSBORk5MX1NVQlNZU19DVE5FVExJTkssCi0JLmNiX2NvdW50CQkJPSBJUENUTkxfTVNHX01BWCwKLQkuY2IJCQkJPSBjdG5sX2NiLAotfTsKLQotc3RhdGljIHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtIGN0bmxfZXhwX3N1YnN5cyA9IHsKLQkubmFtZQkJCQk9ICJjb25udHJhY2tfZXhwZWN0IiwKLQkuc3Vic3lzX2lkCQkJPSBORk5MX1NVQlNZU19DVE5FVExJTktfRVhQLAotCS5jYl9jb3VudAkJCT0gSVBDVE5MX01TR19FWFBfTUFYLAotCS5jYgkJCQk9IGN0bmxfZXhwX2NiLAotfTsKLQotTU9EVUxFX0FMSUFTX05GTkxfU1VCU1lTKE5GTkxfU1VCU1lTX0NUTkVUTElOSyk7Ci1NT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoTkZOTF9TVUJTWVNfQ1RORVRMSU5LX0VYUCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGN0bmV0bGlua19pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXByaW50aygiY3RuZXRsaW5rIHYlczogcmVnaXN0ZXJpbmcgd2l0aCBuZm5ldGxpbmsuXG4iLCB2ZXJzaW9uKTsKLQlyZXQgPSBuZm5ldGxpbmtfc3Vic3lzX3JlZ2lzdGVyKCZjdG5sX3N1YnN5cyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJjdG5ldGxpbmtfaW5pdDogY2Fubm90IHJlZ2lzdGVyIHdpdGggbmZuZXRsaW5rLlxuIik7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlyZXQgPSBuZm5ldGxpbmtfc3Vic3lzX3JlZ2lzdGVyKCZjdG5sX2V4cF9zdWJzeXMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiY3RuZXRsaW5rX2luaXQ6IGNhbm5vdCByZWdpc3RlciBleHAgd2l0aCBuZm5ldGxpbmsuXG4iKTsKLQkJZ290byBlcnJfdW5yZWdfc3Vic3lzOwotCX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi0JcmV0ID0gaXBfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImN0bmV0bGlua19pbml0OiBjYW5ub3QgcmVnaXN0ZXIgbm90aWZpZXIuXG4iKTsKLQkJZ290byBlcnJfdW5yZWdfZXhwX3N1YnN5czsKLQl9Ci0KLQlyZXQgPSBpcF9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyX2V4cCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJjdG5ldGxpbmtfaW5pdDogY2Fubm90IGV4cGVjdCByZWdpc3RlciBub3RpZmllci5cbiIpOwotCQlnb3RvIGVycl91bnJlZ19ub3RpZmllcjsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAwOwotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMKLWVycl91bnJlZ19ub3RpZmllcjoKLQlpcF9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcigmY3RubF9ub3RpZmllcik7Ci1lcnJfdW5yZWdfZXhwX3N1YnN5czoKLQluZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoJmN0bmxfZXhwX3N1YnN5cyk7Ci0jZW5kaWYKLWVycl91bnJlZ19zdWJzeXM6Ci0JbmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKCZjdG5sX3N1YnN5cyk7Ci1lcnJfb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjdG5ldGxpbmtfZXhpdCh2b2lkKQotewotCXByaW50aygiY3RuZXRsaW5rOiB1bnJlZ2lzdGVyaW5nIGZyb20gbmZuZXRsaW5rLlxuIik7Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotCWlwX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcigmY3RubF9ub3RpZmllcl9leHApOwotCWlwX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyKTsKLSNlbmRpZgotCi0JbmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKCZjdG5sX2V4cF9zdWJzeXMpOwotCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmY3RubF9zdWJzeXMpOwotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoY3RuZXRsaW5rX2luaXQpOwotbW9kdWxlX2V4aXQoY3RuZXRsaW5rX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhZjgyZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0KLXVuc2lnbmVkIGludCBpcF9jdF9nZW5lcmljX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDYwMCpIWjsKLQotc3RhdGljIGludCBnZW5lcmljX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXR1cGxlLT5zcmMudS5hbGwgPSAwOwotCXR1cGxlLT5kc3QudS5hbGwgPSAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQl0dXBsZS0+c3JjLnUuYWxsID0gMDsKLQl0dXBsZS0+ZHN0LnUuYWxsID0gMDsKLQotCXJldHVybiAxOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KLXN0YXRpYyBpbnQgZ2VuZXJpY19wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBjb25udHJhY2suICovCi1zdGF0aWMgaW50IGdlbmVyaWNfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpzdGF0ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotc3RhdGljIGludCBwYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsIGlwX2N0X2dlbmVyaWNfdGltZW91dCk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KLXN0YXRpYyBpbnQgbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbCA9Ci17Ci0JLnByb3RvCQkJPSAwLAotCS5uYW1lCQkJPSAidW5rbm93biIsCi0JLnBrdF90b190dXBsZQkJPSBnZW5lcmljX3BrdF90b190dXBsZSwKLQkuaW52ZXJ0X3R1cGxlCQk9IGdlbmVyaWNfaW52ZXJ0X3R1cGxlLAotCS5wcmludF90dXBsZQkJPSBnZW5lcmljX3ByaW50X3R1cGxlLAotCS5wcmludF9jb25udHJhY2sJPSBnZW5lcmljX3ByaW50X2Nvbm50cmFjaywKLQkucGFja2V0CQkJPSBwYWNrZXQsCi0JLm5ldwkJCT0gbmV3LAotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzFjNDllLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoKLSAqIGlwX2Nvbm50cmFja19wcm90b19ncmUuYyAtIFZlcnNpb24gMy4wCi0gKgotICogQ29ubmVjdGlvbiB0cmFja2luZyBwcm90b2NvbCBoZWxwZXIgbW9kdWxlIGZvciBHUkUuCi0gKgotICogR1JFIGlzIGEgZ2VuZXJpYyBlbmNhcHN1bGF0aW9uIHByb3RvY29sLCB3aGljaCBpcyBnZW5lcmFsbHkgbm90IHZlcnkKLSAqIHN1aXRlZCBmb3IgTkFULCBhcyBpdCBoYXMgbm8gcHJvdG9jb2wtc3BlY2lmaWMgcGFydCBhcyBwb3J0IG51bWJlcnMuCi0gKgotICogSXQgaGFzIGFuIG9wdGlvbmFsIGtleSBmaWVsZCwgd2hpY2ggbWF5IGhlbHAgdXMgZGlzdGluZ3Vpc2hpbmcgdHdvCi0gKiBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBzYW1lIHR3byBob3N0cy4KLSAqCi0gKiBHUkUgaXMgZGVmaW5lZCBpbiBSRkMgMTcwMSBhbmQgUkZDIDE3MDIsIGFzIHdlbGwgYXMgUkZDIDI3ODQKLSAqCi0gKiBQUFRQIGlzIGJ1aWx0IG9uIHRvcCBvZiBhIG1vZGlmaWVkIHZlcnNpb24gb2YgR1JFLCBhbmQgaGFzIGEgbWFuZGF0b3J5Ci0gKiBmaWVsZCBjYWxsZWQgIkNhbGxJRCIsIHdoaWNoIHNlcnZlcyB1cyBmb3IgdGhlIHNhbWUgcHVycG9zZSBhcyB0aGUga2V5Ci0gKiBmaWVsZCBpbiBwbGFpbiBHUkUuCi0gKgotICogRG9jdW1lbnRhdGlvbiBhYm91dCBQUFRQIGNhbiBiZSBmb3VuZCBpbiBSRkMgMjYzNwotICoKLSAqIChDKSAyMDAwLTIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLXN0YXRpYyBERUZJTkVfUldMT0NLKGlwX2N0X2dyZV9sb2NrKTsKLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIm5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBmb3IgR1JFIik7Ci0KLS8qIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIGlwX2Nvbm50cmFja19wcm90b191ZHAuYyAqLwotI2RlZmluZSBHUkVfVElNRU9VVAkJKDMwKkhaKQotI2RlZmluZSBHUkVfU1RSRUFNX1RJTUVPVVQJKDE4MCpIWikKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiAiIGZvcm1hdCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgIyMgYXJncykKLSNkZWZpbmUgRFVNUF9UVVBMRV9HUkUoeCkgcHJpbnRrKCIldS4ldS4ldS4ldToweCV4IC0+ICV1LiV1LiV1LiV1OjB4JXhcbiIsIFwKLQkJCU5JUFFVQUQoKHgpLT5zcmMuaXApLCBudG9ocygoeCktPnNyYy51LmdyZS5rZXkpLCBcCi0JCQlOSVBRVUFEKCh4KS0+ZHN0LmlwKSwgbnRvaHMoKHgpLT5kc3QudS5ncmUua2V5KSkKLSNlbHNlCi0jZGVmaW5lIERFQlVHUCh4LCBhcmdzLi4uKQotI2RlZmluZSBEVU1QX1RVUExFX0dSRSh4KQotI2VuZGlmCi0KLS8qIEdSRSBLRVlNQVAgSEFORExJTkcgRlVOQ1RJT05TICovCi1zdGF0aWMgTElTVF9IRUFEKGdyZV9rZXltYXBfbGlzdCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdyZV9rZXlfY21wZm4oY29uc3Qgc3RydWN0IGlwX2N0X2dyZV9rZXltYXAgKmttLAotCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCi17Ci0JcmV0dXJuICgoa20tPnR1cGxlLnNyYy5pcCA9PSB0LT5zcmMuaXApICYmCi0JCShrbS0+dHVwbGUuZHN0LmlwID09IHQtPmRzdC5pcCkgJiYKLQkJKGttLT50dXBsZS5kc3QucHJvdG9udW0gPT0gdC0+ZHN0LnByb3RvbnVtKSAmJgotCQkoa20tPnR1cGxlLmRzdC51LmFsbCA9PSB0LT5kc3QudS5hbGwpKTsKLX0KLQotLyogbG9vayB1cCB0aGUgc291cmNlIGtleSBmb3IgYSBnaXZlbiB0dXBsZSAqLwotc3RhdGljIF9fYmUxNiBncmVfa2V5bWFwX2xvb2t1cChzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0KQotewotCXN0cnVjdCBpcF9jdF9ncmVfa2V5bWFwICprbTsKLQlfX2JlMTYga2V5ID0gMDsKLQotCXJlYWRfbG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoa20sICZncmVfa2V5bWFwX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGdyZV9rZXlfY21wZm4oa20sIHQpKSB7Ci0JCQlrZXkgPSBrbS0+dHVwbGUuc3JjLnUuZ3JlLmtleTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZpcF9jdF9ncmVfbG9jayk7Ci0KLQlERUJVR1AoImxvb2t1cCBzcmMga2V5IDB4JXggdXAga2V5IGZvciAiLCBrZXkpOwotCURVTVBfVFVQTEVfR1JFKHQpOwotCi0JcmV0dXJuIGtleTsKLX0KLQotLyogYWRkIGEgc2luZ2xlIGtleW1hcCBlbnRyeSwgYXNzb2NpYXRlIHdpdGggc3BlY2lmaWVkIG1hc3RlciBjdCAqLwotaW50Ci1pcF9jdF9ncmVfa2V5bWFwX2FkZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0LCBpbnQgcmVwbHkpCi17Ci0Jc3RydWN0IGlwX2N0X2dyZV9rZXltYXAgKipleGlzdF9rbSwgKmttOwotCi0JaWYgKCFjdC0+aGVscGVyIHx8IHN0cmNtcChjdC0+aGVscGVyLT5uYW1lLCAicHB0cCIpKSB7Ci0JCURFQlVHUCgicmVmdXNpbmcgdG8gYWRkIEdSRSBrZXltYXAgdG8gbm9uLXBwdHAgc2Vzc2lvblxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIXJlcGx5KQotCQlleGlzdF9rbSA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX29yaWc7Ci0JZWxzZQotCQlleGlzdF9rbSA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX3JlcGx5OwotCi0JaWYgKCpleGlzdF9rbSkgewotCQkvKiBjaGVjayB3aGV0aGVyIGl0J3MgYSByZXRyYW5zbWlzc2lvbiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGttLCAmZ3JlX2tleW1hcF9saXN0LCBsaXN0KSB7Ci0JCQlpZiAoZ3JlX2tleV9jbXBmbihrbSwgdCkgJiYga20gPT0gKmV4aXN0X2ttKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCURFQlVHUCgidHJ5aW5nIHRvIG92ZXJyaWRlIGtleW1hcF8lcyBmb3IgY3QgJXBcbiIsCi0JCQlyZXBseT8gInJlcGx5Ijoib3JpZyIsIGN0KTsKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0JfQotCi0Ja20gPSBrbWFsbG9jKHNpemVvZigqa20pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWttKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbWNweSgma20tPnR1cGxlLCB0LCBzaXplb2YoKnQpKTsKLQkqZXhpc3Rfa20gPSBrbTsKLQotCURFQlVHUCgiYWRkaW5nIG5ldyBlbnRyeSAlcDogIiwga20pOwotCURVTVBfVFVQTEVfR1JFKCZrbS0+dHVwbGUpOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmttLT5saXN0LCAmZ3JlX2tleW1hcF9saXN0KTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2N0X2dyZV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBkZXN0cm95IHRoZSBrZXltYXAgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIG1hc3RlciBjdCAqLwotdm9pZCBpcF9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JREVCVUdQKCJlbnRlcmluZyBmb3IgY3QgJXBcbiIsIGN0KTsKLQotCWlmICghY3QtPmhlbHBlciB8fCBzdHJjbXAoY3QtPmhlbHBlci0+bmFtZSwgInBwdHAiKSkgewotCQlERUJVR1AoInJlZnVzaW5nIHRvIGRlc3Ryb3kgR1JFIGtleW1hcCB0byBub24tcHB0cCBzZXNzaW9uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXdyaXRlX2xvY2tfYmgoJmlwX2N0X2dyZV9sb2NrKTsKLQlpZiAoY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9vcmlnKSB7Ci0JCURFQlVHUCgicmVtb3ZpbmcgJXAgZnJvbSBsaXN0XG4iLAotCQkJY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9vcmlnKTsKLQkJbGlzdF9kZWwoJmN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfb3JpZy0+bGlzdCk7Ci0JCWtmcmVlKGN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfb3JpZyk7Ci0JCWN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfb3JpZyA9IE5VTEw7Ci0JfQotCWlmIChjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX3JlcGx5KSB7Ci0JCURFQlVHUCgicmVtb3ZpbmcgJXAgZnJvbSBsaXN0XG4iLAotCQkJY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9yZXBseSk7Ci0JCWxpc3RfZGVsKCZjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX3JlcGx5LT5saXN0KTsKLQkJa2ZyZWUoY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9yZXBseSk7Ci0JCWN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfcmVwbHkgPSBOVUxMOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmlwX2N0X2dyZV9sb2NrKTsKLX0KLQotCi0vKiBQVUJMSUMgQ09OTlRSQUNLIFBST1RPIEhFTFBFUiBGVU5DVElPTlMgKi8KLQotLyogaW52ZXJ0IGdyZSBwYXJ0IG9mIHR1cGxlICovCi1zdGF0aWMgaW50IGdyZV9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQl0dXBsZS0+ZHN0LnUuZ3JlLmtleSA9IG9yaWctPnNyYy51LmdyZS5rZXk7Ci0JdHVwbGUtPnNyYy51LmdyZS5rZXkgPSBvcmlnLT5kc3QudS5ncmUua2V5OwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIGdyZSBoZHIgaW5mbyB0byB0dXBsZSAqLwotc3RhdGljIGludCBncmVfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCSAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBncmVfaGRyX3BwdHAgX3BncmVoZHIsICpwZ3JlaGRyOwotCV9fYmUxNiBzcmNrZXk7Ci0Jc3RydWN0IGdyZV9oZHIgX2dyZWhkciwgKmdyZWhkcjsKLQotCS8qIGZpcnN0IG9ubHkgZGVsaW5lYXJpemUgb2xkIFJGQzE3MDEgR1JFIGhlYWRlciAqLwotCWdyZWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfZ3JlaGRyKSwgJl9ncmVoZHIpOwotCWlmICghZ3JlaGRyIHx8IGdyZWhkci0+dmVyc2lvbiAhPSBHUkVfVkVSU0lPTl9QUFRQKSB7Ci0JCS8qIHRyeSB0byBiZWhhdmUgbGlrZSAiaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMiICovCi0JCXR1cGxlLT5zcmMudS5hbGwgPSAwOwotCQl0dXBsZS0+ZHN0LnUuYWxsID0gMDsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogUFBUUCBoZWFkZXIgaXMgdmFyaWFibGUgbGVuZ3RoLCBvbmx5IG5lZWQgdXAgdG8gdGhlIGNhbGxfaWQgZmllbGQgKi8KLQlwZ3JlaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgOCwgJl9wZ3JlaGRyKTsKLQlpZiAoIXBncmVoZHIpCi0JCXJldHVybiAxOwotCi0JaWYgKG50b2hzKGdyZWhkci0+cHJvdG9jb2wpICE9IEdSRV9QUk9UT0NPTF9QUFRQKSB7Ci0JCURFQlVHUCgiR1JFX1ZFUlNJT05fUFBUUCBidXQgdW5rbm93biBwcm90b1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXR1cGxlLT5kc3QudS5ncmUua2V5ID0gcGdyZWhkci0+Y2FsbF9pZDsKLQlzcmNrZXkgPSBncmVfa2V5bWFwX2xvb2t1cCh0dXBsZSk7Ci0JdHVwbGUtPnNyYy51LmdyZS5rZXkgPSBzcmNrZXk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogcHJpbnQgZ3JlIHBhcnQgb2YgdHVwbGUgKi8KLXN0YXRpYyBpbnQgZ3JlX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiBzZXFfcHJpbnRmKHMsICJzcmNrZXk9MHgleCBkc3RrZXk9MHgleCAiLAotCQkJICBudG9ocyh0dXBsZS0+c3JjLnUuZ3JlLmtleSksCi0JCQkgIG50b2hzKHR1cGxlLT5kc3QudS5ncmUua2V5KSk7Ci19Ci0KLS8qIHByaW50IHByaXZhdGUgZGF0YSBmb3IgY29ubnRyYWNrICovCi1zdGF0aWMgaW50IGdyZV9wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXJldHVybiBzZXFfcHJpbnRmKHMsICJ0aW1lb3V0PSV1LCBzdHJlYW1fdGltZW91dD0ldSAiLAotCQkJICAoY3QtPnByb3RvLmdyZS50aW1lb3V0IC8gSFopLAotCQkJICAoY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCAvIEhaKSk7Ci19Ci0KLS8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBhbmQgbWF5IG1vZGlmeSBjb25udHJhY2sgKi8KLXN0YXRpYyBpbnQgZ3JlX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjb25udHJhY2tpbmZvKQotewotCS8qIElmIHdlJ3ZlIHNlZW4gdHJhZmZpYyBib3RoIHdheXMsIHRoaXMgaXMgYSBHUkUgY29ubmVjdGlvbi4KLQkgKiBFeHRlbmQgdGltZW91dC4gKi8KLQlpZiAoY3QtPnN0YXR1cyAmIElQU19TRUVOX1JFUExZKSB7Ci0JCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY29ubnRyYWNraW5mbywgc2tiLAotCQkJCSAgIGN0LT5wcm90by5ncmUuc3RyZWFtX3RpbWVvdXQpOwotCQkvKiBBbHNvLCBtb3JlIGxpa2VseSB0byBiZSBpbXBvcnRhbnQsIGFuZCBub3QgYSBwcm9iZS4gKi8KLQkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKTsKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOwotCX0gZWxzZQotCQlpcF9jdF9yZWZyZXNoX2FjY3QoY3QsIGNvbm50cmFja2luZm8sIHNrYiwKLQkJCQkgICBjdC0+cHJvdG8uZ3JlLnRpbWVvdXQpOwotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KLXN0YXRpYyBpbnQgZ3JlX25ldyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlERUJVR1AoIjogIik7Ci0JRFVNUF9UVVBMRV9HUkUoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7Ci0KLQkvKiBpbml0aWFsaXplIHRvIHNhbmUgdmFsdWUuICBJZGVhbGx5IGEgY29ubnRyYWNrIGhlbHBlcgotCSAqIChlLmcuIGluIGNhc2Ugb2YgcHB0cCkgaXMgaW5jcmVhc2luZyB0aGVtICovCi0JY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IEdSRV9TVFJFQU1fVElNRU9VVDsKLQljdC0+cHJvdG8uZ3JlLnRpbWVvdXQgPSBHUkVfVElNRU9VVDsKLQotCXJldHVybiAxOwotfQotCi0vKiBDYWxsZWQgd2hlbiBhIGNvbm50cmFjayBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgaGFzaGVzCi0gKiBhbmQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCBmcm9tIG1lbW9yeSAqLwotc3RhdGljIHZvaWQgZ3JlX2Rlc3Ryb3koc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyID0gY3QtPm1hc3RlcjsKLQlERUJVR1AoIiBlbnRlcmluZ1xuIik7Ci0KLQlpZiAoIW1hc3RlcikKLQkJREVCVUdQKCJubyBtYXN0ZXIgIT8hXG4iKTsKLQllbHNlCi0JCWlwX2N0X2dyZV9rZXltYXBfZGVzdHJveShtYXN0ZXIpOwotfQotCi0vKiBwcm90b2NvbCBoZWxwZXIgc3RydWN0ICovCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBncmUgPSB7Ci0JLnByb3RvCQkgPSBJUFBST1RPX0dSRSwKLQkubmFtZQkJID0gImdyZSIsCi0JLnBrdF90b190dXBsZQkgPSBncmVfcGt0X3RvX3R1cGxlLAotCS5pbnZlcnRfdHVwbGUJID0gZ3JlX2ludmVydF90dXBsZSwKLQkucHJpbnRfdHVwbGUJID0gZ3JlX3ByaW50X3R1cGxlLAotCS5wcmludF9jb25udHJhY2sgPSBncmVfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQJCSA9IGdyZV9wYWNrZXQsCi0JLm5ldwkJID0gZ3JlX25ldywKLQkuZGVzdHJveQkgPSBncmVfZGVzdHJveSwKLQkubWUgCQkgPSBUSElTX01PRFVMRSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkudHVwbGVfdG9fbmZhdHRyID0gaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b190dXBsZSA9IGlwX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlLAotI2VuZGlmCi19OwotCi0vKiBpcF9jb25udHJhY2tfcHJvdG9fZ3JlIGluaXRpYWxpemF0aW9uICovCi1pbnQgX19pbml0IGlwX2N0X3Byb3RvX2dyZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmZ3JlKTsKLX0KLQotLyogVGhpcyBjYW5ub3QgYmUgX19leGl0LCBhcyBpdCBpcyBpbnZva2VkIGZyb20gaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMncwotICogaW5pdCgpIGNvZGUgb24gZXJyb3JzLgotICovCi12b2lkIGlwX2N0X3Byb3RvX2dyZV9maW5pKHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKLQotCS8qIGRlbGV0ZSBhbGwga2V5bWFwIGVudHJpZXMgKi8KLQl3cml0ZV9sb2NrX2JoKCZpcF9jdF9ncmVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmdyZV9rZXltYXBfbGlzdCkgewotCQlERUJVR1AoImRlbGV0aW5nIGtleW1hcCAlcCBhdCBtb2R1bGUgdW5sb2FkIHRpbWVcbiIsIHBvcyk7Ci0JCWxpc3RfZGVsKHBvcyk7Ci0JCWtmcmVlKHBvcyk7Ci0JfQotCXdyaXRlX3VubG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotCi0JaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJmdyZSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woaXBfY3RfZ3JlX2tleW1hcF9hZGQpOwotRVhQT1JUX1NZTUJPTChpcF9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3MGM4MS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotCi11bnNpZ25lZCBpbnQgaXBfY3RfaWNtcF90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1zdGF0aWMgaW50IGljbXBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgaWNtcGhkciBfaGRyLCAqaHA7Ci0KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfaGRyKSwgJl9oZHIpOwotCWlmIChocCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCXR1cGxlLT5kc3QudS5pY21wLnR5cGUgPSBocC0+dHlwZTsKLQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IGhwLT51bi5lY2hvLmlkOwotCXR1cGxlLT5kc3QudS5pY21wLmNvZGUgPSBocC0+Y29kZTsKLQotCXJldHVybiAxOwotfQotCi0vKiBBZGQgMTsgc3BhY2VzIGZpbGxlZCB3aXRoIDAuICovCi1zdGF0aWMgY29uc3QgdV9pbnQ4X3QgaW52bWFwW10gPSB7Ci0JW0lDTVBfRUNIT10gPSBJQ01QX0VDSE9SRVBMWSArIDEsCi0JW0lDTVBfRUNIT1JFUExZXSA9IElDTVBfRUNITyArIDEsCi0JW0lDTVBfVElNRVNUQU1QXSA9IElDTVBfVElNRVNUQU1QUkVQTFkgKyAxLAotCVtJQ01QX1RJTUVTVEFNUFJFUExZXSA9IElDTVBfVElNRVNUQU1QICsgMSwKLQlbSUNNUF9JTkZPX1JFUVVFU1RdID0gSUNNUF9JTkZPX1JFUExZICsgMSwKLQlbSUNNUF9JTkZPX1JFUExZXSA9IElDTVBfSU5GT19SRVFVRVNUICsgMSwKLQlbSUNNUF9BRERSRVNTXSA9IElDTVBfQUREUkVTU1JFUExZICsgMSwKLQlbSUNNUF9BRERSRVNTUkVQTFldID0gSUNNUF9BRERSRVNTICsgMQotfTsKLQotc3RhdGljIGludCBpY21wX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQlpZiAob3JpZy0+ZHN0LnUuaWNtcC50eXBlID49IHNpemVvZihpbnZtYXApCi0JICAgIHx8ICFpbnZtYXBbb3JpZy0+ZHN0LnUuaWNtcC50eXBlXSkKLQkJcmV0dXJuIDA7Ci0KLQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IG9yaWctPnNyYy51LmljbXAuaWQ7Ci0JdHVwbGUtPmRzdC51LmljbXAudHlwZSA9IGludm1hcFtvcmlnLT5kc3QudS5pY21wLnR5cGVdIC0gMTsKLQl0dXBsZS0+ZHN0LnUuaWNtcC5jb2RlID0gb3JpZy0+ZHN0LnUuaWNtcC5jb2RlOwotCXJldHVybiAxOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KLXN0YXRpYyBpbnQgaWNtcF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInR5cGU9JXUgY29kZT0ldSBpZD0ldSAiLAotCQkJICB0dXBsZS0+ZHN0LnUuaWNtcC50eXBlLAotCQkJICB0dXBsZS0+ZHN0LnUuaWNtcC5jb2RlLAotCQkJICBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkpOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgY29ubnRyYWNrLiAqLwotc3RhdGljIGludCBpY21wX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCXJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgb3IgLTEgZm9yIGludmFsaWQuICovCi1zdGF0aWMgaW50IGljbXBfcGFja2V0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCS8qIFRyeSB0byBkZWxldGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciBhbGwgcmVwbGllczoKLQkgICB3b24ndCBhY3R1YWxseSB2YW5pc2ggYXMgd2Ugc3RpbGwgaGF2ZSBza2IsIGFuZCBkZWxfdGltZXIKLQkgICBtZWFucyB0aGlzIHdpbGwgb25seSBydW4gb25jZSBldmVuIGlmIGNvdW50IGhpdHMgemVybyB0d2ljZQotCSAgICh0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHdpdGggU01QKSAqLwotCWlmIChDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX1JFUExZKSB7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdC0+cHJvdG8uaWNtcC5jb3VudCkKLQkJICAgICYmIGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpY3QpOwotCX0gZWxzZSB7Ci0JCWF0b21pY19pbmMoJmN0LT5wcm90by5pY21wLmNvdW50KTsKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUFJPVE9JTkZPX1ZPTEFUSUxFLCBza2IpOwotCQlpcF9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLCBpcF9jdF9pY21wX3RpbWVvdXQpOwotCX0KLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCi1zdGF0aWMgaW50IGljbXBfbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RhdGljIGNvbnN0IHVfaW50OF90IHZhbGlkX25ld1tdID0gewotCQlbSUNNUF9FQ0hPXSA9IDEsCi0JCVtJQ01QX1RJTUVTVEFNUF0gPSAxLAotCQlbSUNNUF9JTkZPX1JFUVVFU1RdID0gMSwKLQkJW0lDTVBfQUREUkVTU10gPSAxCi0JfTsKLQotCWlmIChjb25udHJhY2stPnR1cGxlaGFzaFswXS50dXBsZS5kc3QudS5pY21wLnR5cGUgPj0gc2l6ZW9mKHZhbGlkX25ldykKLQkgICAgfHwgIXZhbGlkX25ld1tjb25udHJhY2stPnR1cGxlaGFzaFswXS50dXBsZS5kc3QudS5pY21wLnR5cGVdKSB7Ci0JCS8qIENhbid0IGNyZWF0ZSBhIG5ldyBJQ01QIGBjb25uJyB3aXRoIHRoaXMuICovCi0JCURFQlVHUCgiaWNtcDogY2FuJ3QgY3JlYXRlIG5ldyBjb25uIHdpdGggdHlwZSAldVxuIiwKLQkJICAgICAgIGNvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlLmRzdC51LmljbXAudHlwZSk7Ci0JCURVTVBfVFVQTEUoJmNvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWF0b21pY19zZXQoJmNvbm50cmFjay0+cHJvdG8uaWNtcC5jb3VudCwgMCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWljbXBfZXJyb3JfbWVzc2FnZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgaW5uZXJ0dXBsZSwgb3JpZ3R1cGxlOwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpY21waGRyIGljbXA7Ci0JCXN0cnVjdCBpcGhkciBpcDsKLQl9IF9pbiwgKmluc2lkZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICppbm5lcnByb3RvOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlpbnQgZGF0YW9mZjsKLQotCUlQX05GX0FTU0VSVChza2ItPm5mY3QgPT0gTlVMTCk7Ci0KLQkvKiBOb3QgZW5vdWdoIGhlYWRlcj8gKi8KLQlpbnNpZGUgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaW4pLCAmX2luKTsKLQlpZiAoaW5zaWRlID09IE5VTEwpCi0JCXJldHVybiAtTkZfQUNDRVBUOwotCi0JLyogSWdub3JlIElDTVAncyBjb250YWluaW5nIGZyYWdtZW50cyAoc2hvdWxkbid0IGhhcHBlbikgKi8KLQlpZiAoaW5zaWRlLT5pcC5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpIHsKLQkJREVCVUdQKCJpY21wX2Vycm9yX3RyYWNrOiBmcmFnbWVudCBvZiBwcm90byAldVxuIiwKLQkJICAgICAgIGluc2lkZS0+aXAucHJvdG9jb2wpOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQlpbm5lcnByb3RvID0gaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KGluc2lkZS0+aXAucHJvdG9jb2wpOwotCWRhdGFvZmYgPSBza2ItPm5oLmlwaC0+aWhsKjQgKyBzaXplb2YoaW5zaWRlLT5pY21wKSArIGluc2lkZS0+aXAuaWhsKjQ7Ci0JLyogQXJlIHRoZXkgdGFsa2luZyBhYm91dCBvbmUgb2Ygb3VyIGNvbm5lY3Rpb25zPyAqLwotCWlmICghaXBfY3RfZ2V0X3R1cGxlKCZpbnNpZGUtPmlwLCBza2IsIGRhdGFvZmYsICZvcmlndHVwbGUsIGlubmVycHJvdG8pKSB7Ci0JCURFQlVHUCgiaWNtcF9lcnJvcjogISBnZXRfdHVwbGUgcD0ldSIsIGluc2lkZS0+aXAucHJvdG9jb2wpOwotCQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KGlubmVycHJvdG8pOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBPcmRpbmFyaWx5LCB3ZSdkIGV4cGVjdCB0aGUgaW52ZXJ0ZWQgdHVwbGVwcm90bywgYnV0IGl0J3MKLQkgICBiZWVuIHByZXNlcnZlZCBpbnNpZGUgdGhlIElDTVAuICovCi0JaWYgKCFpcF9jdF9pbnZlcnRfdHVwbGUoJmlubmVydHVwbGUsICZvcmlndHVwbGUsIGlubmVycHJvdG8pKSB7Ci0JCURFQlVHUCgiaWNtcF9lcnJvcl90cmFjazogQ2FuJ3QgaW52ZXJ0IHR1cGxlXG4iKTsKLQkJaXBfY29ubnRyYWNrX3Byb3RvX3B1dChpbm5lcnByb3RvKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCWlwX2Nvbm50cmFja19wcm90b19wdXQoaW5uZXJwcm90byk7Ci0KLQkqY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKLQotCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJmlubmVydHVwbGUsIE5VTEwpOwotCWlmICghaCkgewotCQkvKiBMb2NhbGx5IGdlbmVyYXRlZCBJQ01QcyB3aWxsIG1hdGNoIGludmVydGVkIGlmIHRoZXkKLQkJICAgaGF2ZW4ndCBiZWVuIFNOQVQnZWQgeWV0ICovCi0JCS8qIEZJWE1FOiBOQVQgY29kZSBoYXMgdG8gaGFuZGxlIGhhbGYtZG9uZSBkb3VibGUgTkFUIC0tUlIgKi8KLQkJaWYgKGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKQotCQkJaCA9IGlwX2Nvbm50cmFja19maW5kX2dldCgmb3JpZ3R1cGxlLCBOVUxMKTsKLQotCQlpZiAoIWgpIHsKLQkJCURFQlVHUCgiaWNtcF9lcnJvcl90cmFjazogbm8gbWF0Y2hcbiIpOwotCQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JCX0KLQkJLyogUmV2ZXJzZSBkaXJlY3Rpb24gZnJvbSB0aGF0IGZvdW5kICovCi0JCWlmIChESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX1JFUExZKQotCQkJKmN0aW5mbyArPSBJUF9DVF9JU19SRVBMWTsKLQl9IGVsc2UgewotCQlpZiAoRElSRUNUSU9OKGgpID09IElQX0NUX0RJUl9SRVBMWSkKLQkJCSpjdGluZm8gKz0gSVBfQ1RfSVNfUkVQTFk7Ci0JfQotCi0JLyogVXBkYXRlIHNrYiB0byByZWZlciB0byB0aGlzIGNvbm5lY3Rpb24gKi8KLQlza2ItPm5mY3QgPSAmdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbDsKLQlza2ItPm5mY3RpbmZvID0gKmN0aW5mbzsKLQlyZXR1cm4gLU5GX0FDQ0VQVDsKLX0KLQotLyogU21hbGwgYW5kIG1vZGlmaWVkIHZlcnNpb24gb2YgaWNtcF9yY3YgKi8KLXN0YXRpYyBpbnQKLWljbXBfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAotCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQotewotCXN0cnVjdCBpY21waGRyIF9paCwgKmljbXBoOwotCi0JLyogTm90IGVub3VnaCBoZWFkZXI/ICovCi0JaWNtcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaWgpLCAmX2loKTsKLQlpZiAoaWNtcGggPT0gTlVMTCkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19JQ01QKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgICAgICJpcF9jdF9pY21wOiBzaG9ydCBwYWNrZXQgIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIFNlZSBpcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgKi8KLQlpZiAoaXBfY29ubnRyYWNrX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgJiYKLQkgICAgbmZfaXBfY2hlY2tzdW0oc2tiLCBob29rbnVtLCBza2ItPm5oLmlwaC0+aWhsICogNCwgMCkpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICAgICAiaXBfY3RfaWNtcDogYmFkIElDTVAgY2hlY2tzdW0gIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qCi0JICoJMTggaXMgdGhlIGhpZ2hlc3QgJ2tub3duJyBJQ01QIHR5cGUuIEFueXRoaW5nIGVsc2UgaXMgYSBteXN0ZXJ5Ci0JICoKLQkgKglSRkMgMTEyMjogMy4yLjIgIFVua25vd24gSUNNUCBtZXNzYWdlcyB0eXBlcyBNVVNUIGJlIHNpbGVudGx5Ci0JICoJCSAgZGlzY2FyZGVkLgotCSAqLwotCWlmIChpY21waC0+dHlwZSA+IE5SX0lDTVBfVFlQRVMpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICAgICAiaXBfY3RfaWNtcDogaW52YWxpZCBJQ01QIHR5cGUgIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIE5lZWQgdG8gdHJhY2sgaWNtcCBlcnJvciBtZXNzYWdlPyAqLwotCWlmIChpY21waC0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSAotCSAgICAmJiBpY21waC0+dHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gKLQkgICAgJiYgaWNtcGgtPnR5cGUgIT0gSUNNUF9USU1FX0VYQ0VFREVECi0JICAgICYmIGljbXBoLT50eXBlICE9IElDTVBfUEFSQU1FVEVSUFJPQgotCSAgICAmJiBpY21waC0+dHlwZSAhPSBJQ01QX1JFRElSRUNUKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JcmV0dXJuIGljbXBfZXJyb3JfbWVzc2FnZShza2IsIGN0aW5mbywgaG9va251bSk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLXN0YXRpYyBpbnQgaWNtcF90dXBsZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0KQotewotCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9fSUNNUF9JRCwgc2l6ZW9mKF9fYmUxNiksCi0JCSZ0LT5zcmMudS5pY21wLmlkKTsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX0lDTVBfVFlQRSwgc2l6ZW9mKHVfaW50OF90KSwKLQkJJnQtPmRzdC51LmljbXAudHlwZSk7Ci0JTkZBX1BVVChza2IsIENUQV9QUk9UT19JQ01QX0NPREUsIHNpemVvZih1X2ludDhfdCksCi0JCSZ0LT5kc3QudS5pY21wLmNvZGUpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBpY21wX25mYXR0cl90b190dXBsZShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCWlmICghdGJbQ1RBX1BST1RPX0lDTVBfVFlQRS0xXQotCSAgICB8fCAhdGJbQ1RBX1BST1RPX0lDTVBfQ09ERS0xXQotCSAgICB8fCAhdGJbQ1RBX1BST1RPX0lDTVBfSUQtMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdHVwbGUtPmRzdC51LmljbXAudHlwZSA9Ci0JCQkqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0lDTVBfVFlQRS0xXSk7Ci0JdHVwbGUtPmRzdC51LmljbXAuY29kZSA9Ci0JCQkqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0lDTVBfQ09ERS0xXSk7Ci0JdHVwbGUtPnNyYy51LmljbXAuaWQgPQotCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUF9JRC0xXSk7Ci0KLQlpZiAodHVwbGUtPmRzdC51LmljbXAudHlwZSA+PSBzaXplb2YoaW52bWFwKQotCSAgICB8fCAhaW52bWFwW3R1cGxlLT5kc3QudS5pY21wLnR5cGVdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX2ljbXAgPQotewotCS5wcm90byAJCQk9IElQUFJPVE9fSUNNUCwKLQkubmFtZSAJCQk9ICJpY21wIiwKLQkucGt0X3RvX3R1cGxlCQk9IGljbXBfcGt0X3RvX3R1cGxlLAotCS5pbnZlcnRfdHVwbGUJCT0gaWNtcF9pbnZlcnRfdHVwbGUsCi0JLnByaW50X3R1cGxlCQk9IGljbXBfcHJpbnRfdHVwbGUsCi0JLnByaW50X2Nvbm50cmFjawk9IGljbXBfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQJCQk9IGljbXBfcGFja2V0LAotCS5uZXcJCQk9IGljbXBfbmV3LAotCS5lcnJvcgkJCT0gaWNtcF9lcnJvciwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkudHVwbGVfdG9fbmZhdHRyCT0gaWNtcF90dXBsZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b190dXBsZQk9IGljbXBfbmZhdHRyX3RvX3R1cGxlLAotI2VuZGlmCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19zY3RwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5NDI5OS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29ubmVjdGlvbiB0cmFja2luZyBwcm90b2NvbCBoZWxwZXIgbW9kdWxlIGZvciBTQ1RQLgotICoKLSAqIFNDVFAgaXMgZGVmaW5lZCBpbiBSRkMgMjk2MC4gUmVmZXJlbmNlcyB0byB2YXJpb3VzIHNlY3Rpb25zIGluIHRoaXMgY29kZQotICogYXJlIHRvIHRoaXMgUkZDLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotLyoKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIHByb2MgbWFuaXB1bGF0aW9uIG9mIHRpbWVvdXRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIC4uLikgcHJpbnRrKGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qIFByb3RlY3RzIGNvbm50cmFjay0+cHJvdG8uc2N0cCAqLwotc3RhdGljIERFRklORV9SV0xPQ0soc2N0cF9sb2NrKTsKLQotLyogRklYTUU6IEV4YW1pbmUgaXBmaWx0ZXIncyB0aW1lb3V0cyBhbmQgY29ubnRyYWNrIHRyYW5zaXRpb25zIG1vcmUKLSAgIGNsb3NlbHkuICBUaGV5J3JlIG1vcmUgY29tcGxleC4gLS1SUgotCi0gICBBbmQgc28gZm9yIG1lIGZvciBTQ1RQIDpEIC1LaXJhbiAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2N0cF9jb25udHJhY2tfbmFtZXNbXSA9IHsKLQkiTk9ORSIsCi0JIkNMT1NFRCIsCi0JIkNPT0tJRV9XQUlUIiwKLQkiQ09PS0lFX0VDSE9FRCIsCi0JIkVTVEFCTElTSEVEIiwKLQkiU0hVVERPV05fU0VOVCIsCi0JIlNIVVRET1dOX1JFQ0QiLAotCSJTSFVURE9XTl9BQ0tfU0VOVCIsCi19OwotCi0jZGVmaW5lIFNFQ1MgICogSFoKLSNkZWZpbmUgTUlOUyAgKiA2MCBTRUNTCi0jZGVmaW5lIEhPVVJTICogNjAgTUlOUwotI2RlZmluZSBEQVlTICAqIDI0IEhPVVJTCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X2Nsb3NlZCBfX3JlYWRfbW9zdGx5ICAgICAgICAgICA9IDEwIFNFQ1M7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCBfX3JlYWRfbW9zdGx5ICAgICAgPSAgMyBTRUNTOwotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCBfX3JlYWRfbW9zdGx5ICAgID0gIDMgU0VDUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X2VzdGFibGlzaGVkIF9fcmVhZF9tb3N0bHkgICAgICA9ICA1IERBWVM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50IF9fcmVhZF9tb3N0bHkgICAgPSAzMDAgU0VDUyAvIDEwMDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9yZWNkIF9fcmVhZF9tb3N0bHkgICAgPSAzMDAgU0VDUyAvIDEwMDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCBfX3JlYWRfbW9zdGx5ID0gMyBTRUNTOwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICogc2N0cF90aW1lb3V0c1tdCi09IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfTk9ORSAgKi8KLSAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nsb3NlZCwJICAgICAgICAgICAvKiBTQ1RQX0NPTk5UUkFDS19DTE9TRUQgKi8KLSAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0LCAgICAgICAvKiBTQ1RQX0NPTk5UUkFDS19DT09LSUVfV0FJVCAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCwgICAgIC8qIFNDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRUQgKi8KLSAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X2VzdGFibGlzaGVkLCAgICAgICAvKiBTQ1RQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCwgICAgIC8qIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1NFTlQgKi8KLSAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QsICAgICAvKiBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9SRUNEICovCi0gICAgJmlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCAgLyogU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fQUNLX1NFTlQgKi8KLSB9OwotCi0jZGVmaW5lIHNOTyBTQ1RQX0NPTk5UUkFDS19OT05FCi0jZGVmaW5lCXNDTCBTQ1RQX0NPTk5UUkFDS19DTE9TRUQKLSNkZWZpbmUJc0NXIFNDVFBfQ09OTlRSQUNLX0NPT0tJRV9XQUlUCi0jZGVmaW5lCXNDRSBTQ1RQX0NPTk5UUkFDS19DT09LSUVfRUNIT0VECi0jZGVmaW5lCXNFUyBTQ1RQX0NPTk5UUkFDS19FU1RBQkxJU0hFRAotI2RlZmluZQlzU1MgU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fU0VOVAotI2RlZmluZQlzU1IgU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fUkVDRAotI2RlZmluZQlzU0EgU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fQUNLX1NFTlQKLSNkZWZpbmUJc0lWIFNDVFBfQ09OTlRSQUNLX01BWAotCi0vKgotCVRoZXNlIGFyZSB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSBzdGF0ZXM6Ci0KLU5PVEU6IFRoZXNlIHN0YXRlIG5hbWVzIGFyZSB0YW50YWxpemluZ2x5IHNpbWlsYXIgdG8gdGhlIHN0YXRlcyBvZiBhbgotU0NUUCBlbmRwb2ludC4gQnV0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3RhdGVzIGlzIGEgbGl0dGxlIGRpZmZlcmVudCwKLWNvbnNpZGVyaW5nIHRoYXQgdGhlc2UgYXJlIHRoZSBzdGF0ZXMgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIG5vdCBvZiBhbiBlbmQKLXBvaW50LiBQbGVhc2Ugbm90ZSB0aGUgc3VidGxldGllcy4gLUtpcmFuCi0KLU5PTkUgICAgICAgICAgICAgIC0gTm90aGluZyBzbyBmYXIuCi1DT09LSUUgV0FJVCAgICAgICAtIFdlIGhhdmUgc2VlbiBhbiBJTklUIGNodW5rIGluIHRoZSBvcmlnaW5hbCBkaXJlY3Rpb24sIG9yIGFsc28KLQkJICAgIGFuIElOSVRfQUNLIGNodW5rIGluIHRoZSByZXBseSBkaXJlY3Rpb24uCi1DT09LSUUgRUNIT0VEICAgICAtIFdlIGhhdmUgc2VlbiBhIENPT0tJRV9FQ0hPIGNodW5rIGluIHRoZSBvcmlnaW5hbCBkaXJlY3Rpb24uCi1FU1RBQkxJU0hFRCAgICAgICAtIFdlIGhhdmUgc2VlbiBhIENPT0tJRV9BQ0sgaW4gdGhlIHJlcGx5IGRpcmVjdGlvbi4KLVNIVVRET1dOX1NFTlQgICAgIC0gV2UgaGF2ZSBzZWVuIGEgU0hVVERPV04gY2h1bmsgaW4gdGhlIG9yaWdpbmFsIGRpcmVjdGlvbi4KLVNIVVRET1dOX1JFQ0QgICAgIC0gV2UgaGF2ZSBzZWVuIGEgU0hVVERPV04gY2h1bmsgaW4gdGhlIHJlcGx5IGRpcmVjdG9pbi4KLVNIVVRET1dOX0FDS19TRU5UIC0gV2UgaGF2ZSBzZWVuIGEgU0hVVERPV05fQUNLIGNodW5rIGluIHRoZSBkaXJlY3Rpb24gb3Bwb3NpdGUKLQkJICAgIHRvIHRoYXQgb2YgdGhlIFNIVVRET1dOIGNodW5rLgotQ0xPU0VEICAgICAgICAgICAgLSBXZSBoYXZlIHNlZW4gYSBTSFVURE9XTl9DT01QTEVURSBjaHVuayBpbiB0aGUgZGlyZWN0aW9uIG9mCi0JCSAgICB0aGUgU0hVVERPV04gY2h1bmsuIENvbm5lY3Rpb24gaXMgY2xvc2VkLgotKi8KLQotLyogVE9ETwotIC0gSSBoYXZlIGFzc3VtZWQgdGhhdCB0aGUgZmlyc3QgSU5JVCBpcyBpbiB0aGUgb3JpZ2luYWwgZGlyZWN0aW9uLgotIFRoaXMgbWVzc2VzIHRoaW5ncyB3aGVuIGFuIElOSVQgY29tZXMgaW4gdGhlIHJlcGx5IGRpcmVjdGlvbiBpbiBDTE9TRUQKLSBzdGF0ZS4KLSAtIENoZWNrIHRoZSBlcnJvciB0eXBlIGluIHRoZSByZXBseSBkaXIgYmVmb3JlIHRyYW5zaXRpb25pbmcgZnJvbQotY29va2llIGVjaG9lZCB0byBjbG9zZWQuCi0gLSBTZWMgNS4yLjQgb2YgUkZDIDI5NjAKLSAtIE11bHRpIEhvbWluZyBzdXBwb3J0LgotKi8KLQotLyogU0NUUCBjb25udHJhY2sgc3RhdGUgdHJhbnNpdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBlbnVtIHNjdHBfY29ubnRyYWNrIHNjdHBfY29ubnRyYWNrc1syXVs5XVtTQ1RQX0NPTk5UUkFDS19NQVhdID0gewotCXsKLS8qCU9SSUdJTkFMCSovCi0vKiAgICAgICAgICAgICAgICAgIHNOTywgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBICovCi0vKiBpbml0ICAgICAgICAgKi8ge3NDVywgc0NXLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwKLS8qIGluaXRfYWNrICAgICAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LAotLyogYWJvcnQgICAgICAgICovIHtzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTH0sCi0vKiBzaHV0ZG93biAgICAgKi8ge3NDTCwgc0NMLCBzQ1csIHNDRSwgc1NTLCBzU1MsIHNTUiwgc1NBfSwKLS8qIHNodXRkb3duX2FjayAqLyB7c1NBLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTQSwgc1NBLCBzU0F9LAotLyogZXJyb3IgICAgICAgICovIHtzQ0wsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sLyogQ2FudCBoYXZlIFN0YWxlIGNvb2tpZSovCi0vKiBjb29raWVfZWNobyAgKi8ge3NDTCwgc0NMLCBzQ0UsIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiA1LjIuNCAtIEJpZyBUT0RPICovCi0vKiBjb29raWVfYWNrICAgKi8ge3NDTCwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBDYW50IGNvbWUgaW4gb3JpZyBkaXIgKi8KLS8qIHNodXRkb3duX2NvbXAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzQ0x9Ci0JfSwKLQl7Ci0vKglSRVBMWQkqLwotLyogICAgICAgICAgICAgICAgICBzTk8sIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQSAqLwotLyogaW5pdCAgICAgICAgICovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sLyogSU5JVCBpbiBzQ0wgQmlnIFRPRE8gKi8KLS8qIGluaXRfYWNrICAgICAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LAotLyogYWJvcnQgICAgICAgICovIHtzSVYsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTH0sCi0vKiBzaHV0ZG93biAgICAgKi8ge3NJViwgc0NMLCBzQ1csIHNDRSwgc1NSLCBzU1MsIHNTUiwgc1NBfSwKLS8qIHNodXRkb3duX2FjayAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTQSwgc1NBLCBzU0F9LAotLyogZXJyb3IgICAgICAgICovIHtzSVYsIHNDTCwgc0NXLCBzQ0wsIHNFUywgc1NTLCBzU1IsIHNTQX0sCi0vKiBjb29raWVfZWNobyAgKi8ge3NJViwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBDYW50IGNvbWUgaW4gcmVwbHkgZGlyICovCi0vKiBjb29raWVfYWNrICAgKi8ge3NJViwgc0NMLCBzQ1csIHNFUywgc0VTLCBzU1MsIHNTUiwgc1NBfSwKLS8qIHNodXRkb3duX2NvbXAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzQ0x9Ci0JfQotfTsKLQotc3RhdGljIGludCBzY3RwX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc2N0cF9zY3RwaGRyX3QgX2hkciwgKmhwOwotCi0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX2hkcik7Ci0JaWYgKGhwID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JdHVwbGUtPnNyYy51LnNjdHAucG9ydCA9IGhwLT5zb3VyY2U7Ci0JdHVwbGUtPmRzdC51LnNjdHAucG9ydCA9IGhwLT5kZXN0OwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHNjdHBfaW52ZXJ0X3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCXR1cGxlLT5zcmMudS5zY3RwLnBvcnQgPSBvcmlnLT5kc3QudS5zY3RwLnBvcnQ7Ci0JdHVwbGUtPmRzdC51LnNjdHAucG9ydCA9IG9yaWctPnNyYy51LnNjdHAucG9ydDsKLQlyZXR1cm4gMTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwZXItcHJvdG9jb2wgcGFydCBvZiB0aGUgdHVwbGUuICovCi1zdGF0aWMgaW50IHNjdHBfcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCXJldHVybiBzZXFfcHJpbnRmKHMsICJzcG9ydD0laHUgZHBvcnQ9JWh1ICIsCi0JCQkgIG50b2hzKHR1cGxlLT5zcmMudS5zY3RwLnBvcnQpLAotCQkJICBudG9ocyh0dXBsZS0+ZHN0LnUuc2N0cC5wb3J0KSk7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBjb25udHJhY2suICovCi1zdGF0aWMgaW50IHNjdHBfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JZW51bSBzY3RwX2Nvbm50cmFjayBzdGF0ZTsKLQotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCXJlYWRfbG9ja19iaCgmc2N0cF9sb2NrKTsKLQlzdGF0ZSA9IGNvbm50cmFjay0+cHJvdG8uc2N0cC5zdGF0ZTsKLQlyZWFkX3VubG9ja19iaCgmc2N0cF9sb2NrKTsKLQotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlcyAiLCBzY3RwX2Nvbm50cmFja19uYW1lc1tzdGF0ZV0pOwotfQotCi0jZGVmaW5lIGZvcl9lYWNoX3NjdHBfY2h1bmsoc2tiLCBzY2gsIF9zY2gsIG9mZnNldCwgY291bnQpCQlcCi1mb3IgKG9mZnNldCA9IHNrYi0+bmguaXBoLT5paGwgKiA0ICsgc2l6ZW9mKHNjdHBfc2N0cGhkcl90KSwgY291bnQgPSAwOwlcCi0Jb2Zmc2V0IDwgc2tiLT5sZW4gJiYJCQkJCQlcCi0JKHNjaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9zY2gpLCAmX3NjaCkpOwlcCi0Jb2Zmc2V0ICs9IChudG9ocyhzY2gtPmxlbmd0aCkgKyAzKSAmIH4zLCBjb3VudCsrKQotCi0vKiBTb21lIHZhbGlkaXR5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGNodW5rcyBhcmUgZmluZSAqLwotc3RhdGljIGludCBkb19iYXNpY19jaGVja3Moc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIGNoYXIgKm1hcCkKLXsKLQl1X2ludDMyX3Qgb2Zmc2V0LCBjb3VudDsKLQlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKLQlpbnQgZmxhZzsKLQotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCWZsYWcgPSAwOwotCi0JZm9yX2VhY2hfc2N0cF9jaHVuayAoc2tiLCBzY2gsIF9zY2gsIG9mZnNldCwgY291bnQpIHsKLQkJREVCVUdQKCJDaHVuayBOdW06ICVkICBUeXBlOiAlZFxuIiwgY291bnQsIHNjaC0+dHlwZSk7Ci0KLQkJaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9JTklUCi0JCQl8fCBzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVF9BQ0sKLQkJCXx8IHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURSkgewotCQkJZmxhZyA9IDE7Ci0JCX0KLQotCQkvKgotCQkgKiBDb29raWUgQWNrL0VjaG8gY2h1bmtzIG5vdCB0aGUgZmlyc3QgT1IKLQkJICogSW5pdCAvIEluaXQgQWNrIC8gU2h1dGRvd24gY29tcGwgY2h1bmtzIG5vdCB0aGUgb25seSBjaHVua3MKLQkJICogT1IgemVyby1sZW5ndGguCi0JCSAqLwotCQlpZiAoKChzY2gtPnR5cGUgPT0gU0NUUF9DSURfQ09PS0lFX0FDSwotCQkJfHwgc2NoLT50eXBlID09IFNDVFBfQ0lEX0NPT0tJRV9FQ0hPCi0JCQl8fCBmbGFnKQotCQkgICAgICAmJiBjb3VudCAhPTApIHx8ICFzY2gtPmxlbmd0aCkgewotCQkJREVCVUdQKCJCYXNpYyBjaGVja3MgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKG1hcCkgewotCQkJc2V0X2JpdChzY2gtPnR5cGUsICh2b2lkICopbWFwKTsKLQkJfQotCX0KLQotCURFQlVHUCgiQmFzaWMgY2hlY2tzIHBhc3NlZFxuIik7Ci0JcmV0dXJuIGNvdW50ID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmV3X3N0YXRlKGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCi0JCSAgICAgZW51bSBzY3RwX2Nvbm50cmFjayBjdXJfc3RhdGUsCi0JCSAgICAgaW50IGNodW5rX3R5cGUpCi17Ci0JaW50IGk7Ci0KLQlERUJVR1AoX19GVU5DVElPTl9fKTsKLQlERUJVR1AoIlxuIik7Ci0KLQlERUJVR1AoIkNodW5rIHR5cGU6ICVkXG4iLCBjaHVua190eXBlKTsKLQotCXN3aXRjaCAoY2h1bmtfdHlwZSkgewotCQljYXNlIFNDVFBfQ0lEX0lOSVQ6Ci0JCQlERUJVR1AoIlNDVFBfQ0lEX0lOSVRcbiIpOwotCQkJaSA9IDA7IGJyZWFrOwotCQljYXNlIFNDVFBfQ0lEX0lOSVRfQUNLOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9JTklUX0FDS1xuIik7Ci0JCQlpID0gMTsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfQUJPUlQ6Ci0JCQlERUJVR1AoIlNDVFBfQ0lEX0FCT1JUXG4iKTsKLQkJCWkgPSAyOyBicmVhazsKLQkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTjoKLQkJCURFQlVHUCgiU0NUUF9DSURfU0hVVERPV05cbiIpOwotCQkJaSA9IDM7IGJyZWFrOwotCQljYXNlIFNDVFBfQ0lEX1NIVVRET1dOX0FDSzoKLQkJCURFQlVHUCgiU0NUUF9DSURfU0hVVERPV05fQUNLXG4iKTsKLQkJCWkgPSA0OyBicmVhazsKLQkJY2FzZSBTQ1RQX0NJRF9FUlJPUjoKLQkJCURFQlVHUCgiU0NUUF9DSURfRVJST1JcbiIpOwotCQkJaSA9IDU7IGJyZWFrOwotCQljYXNlIFNDVFBfQ0lEX0NPT0tJRV9FQ0hPOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9DT09LSUVfRUNIT1xuIik7Ci0JCQlpID0gNjsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfQ09PS0lFX0FDSzoKLQkJCURFQlVHUCgiU0NUUF9DSURfQ09PS0lFX0FDS1xuIik7Ci0JCQlpID0gNzsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEU6Ci0JCQlERUJVR1AoIlNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFXG4iKTsKLQkJCWkgPSA4OyBicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIE90aGVyIGNodW5rcyBsaWtlIERBVEEsIFNBQ0ssIEhFQVJUQkVBVCBhbmQKLQkJCWl0cyBBQ0sgZG8gbm90IGNhdXNlIGEgY2hhbmdlIGluIHN0YXRlICovCi0JCQlERUJVR1AoIlVua25vd24gY2h1bmsgdHlwZSwgV2lsbCBzdGF5IGluICVzXG4iLAotCQkJCQkJc2N0cF9jb25udHJhY2tfbmFtZXNbY3VyX3N0YXRlXSk7Ci0JCQlyZXR1cm4gY3VyX3N0YXRlOwotCX0KLQotCURFQlVHUCgiZGlyOiAlZCAgIGN1cl9zdGF0ZTogJXMgIGNodW5rX3R5cGU6ICVkICBuZXdfc3RhdGU6ICVzXG4iLAotCQkJZGlyLCBzY3RwX2Nvbm50cmFja19uYW1lc1tjdXJfc3RhdGVdLCBjaHVua190eXBlLAotCQkJc2N0cF9jb25udHJhY2tfbmFtZXNbc2N0cF9jb25udHJhY2tzW2Rpcl1baV1bY3VyX3N0YXRlXV0pOwotCi0JcmV0dXJuIHNjdHBfY29ubnRyYWNrc1tkaXJdW2ldW2N1cl9zdGF0ZV07Ci19Ci0KLS8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBvciAtMSBmb3IgaW52YWxpZC4gKi8KLXN0YXRpYyBpbnQgc2N0cF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCWVudW0gc2N0cF9jb25udHJhY2sgbmV3Y29ubnRyYWNrLCBvbGRzY3Rwc3RhdGU7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzY3RwX3NjdHBoZHJfdCBfc2N0cGgsICpzaDsKLQlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKLQl1X2ludDMyX3Qgb2Zmc2V0LCBjb3VudDsKLQljaGFyIG1hcFsyNTYgLyBzaXplb2YgKGNoYXIpXSA9IHswfTsKLQotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwgKiA0LCBzaXplb2YoX3NjdHBoKSwgJl9zY3RwaCk7Ci0JaWYgKHNoID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCWlmIChkb19iYXNpY19jaGVja3MoY29ubnRyYWNrLCBza2IsIG1hcCkgIT0gMCkKLQkJcmV0dXJuIC0xOwotCi0JLyogQ2hlY2sgdGhlIHZlcmlmaWNhdGlvbiB0YWcgKFNlYyA4LjUpICovCi0JaWYgKCF0ZXN0X2JpdChTQ1RQX0NJRF9JTklULCAodm9pZCAqKW1hcCkKLQkJJiYgIXRlc3RfYml0KFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFLCAodm9pZCAqKW1hcCkKLQkJJiYgIXRlc3RfYml0KFNDVFBfQ0lEX0NPT0tJRV9FQ0hPLCAodm9pZCAqKW1hcCkKLQkJJiYgIXRlc3RfYml0KFNDVFBfQ0lEX0FCT1JULCAodm9pZCAqKW1hcCkKLQkJJiYgIXRlc3RfYml0KFNDVFBfQ0lEX1NIVVRET1dOX0FDSywgKHZvaWQgKiltYXApCi0JCSYmIChzaC0+dnRhZyAhPSBjb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tDVElORk8yRElSKGN0aW5mbyldKSkgewotCQlERUJVR1AoIlZlcmlmaWNhdGlvbiB0YWcgY2hlY2sgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW9sZHNjdHBzdGF0ZSA9IG5ld2Nvbm50cmFjayA9IFNDVFBfQ09OTlRSQUNLX01BWDsKLQlmb3JfZWFjaF9zY3RwX2NodW5rIChza2IsIHNjaCwgX3NjaCwgb2Zmc2V0LCBjb3VudCkgewotCQl3cml0ZV9sb2NrX2JoKCZzY3RwX2xvY2spOwotCi0JCS8qIFNwZWNpYWwgY2FzZXMgb2YgVmVyaWZpY2F0aW9uIHRhZyBjaGVjayAoU2VjIDguNS4xKSAqLwotCQlpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX0lOSVQpIHsKLQkJCS8qIFNlYyA4LjUuMSAoQSkgKi8KLQkJCWlmIChzaC0+dnRhZyAhPSAwKSB7Ci0JCQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfQUJPUlQpIHsKLQkJCS8qIFNlYyA4LjUuMSAoQikgKi8KLQkJCWlmICghKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0NUSU5GTzJESVIoY3RpbmZvKV0pCi0JCQkJJiYgIShzaC0+dnRhZyA9PSBjb25udHJhY2stPnByb3RvLnNjdHAudnRhZwotCQkJCQkJCVsxIC0gQ1RJTkZPMkRJUihjdGluZm8pXSkpIHsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJnNjdHBfbG9jayk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURSkgewotCQkJLyogU2VjIDguNS4xIChDKSAqLwotCQkJaWYgKCEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbQ1RJTkZPMkRJUihjdGluZm8pXSkKLQkJCQkmJiAhKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnCi0JCQkJCQkJWzEgLSBDVElORk8yRElSKGN0aW5mbyldCi0JCQkJCSYmIChzY2gtPmZsYWdzICYgMSkpKSB7Ci0JCQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfQ09PS0lFX0VDSE8pIHsKLQkJCS8qIFNlYyA4LjUuMSAoRCkgKi8KLQkJCWlmICghKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0NUSU5GTzJESVIoY3RpbmZvKV0pKSB7Ci0JCQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCi0JCW9sZHNjdHBzdGF0ZSA9IGNvbm50cmFjay0+cHJvdG8uc2N0cC5zdGF0ZTsKLQkJbmV3Y29ubnRyYWNrID0gbmV3X3N0YXRlKENUSU5GTzJESVIoY3RpbmZvKSwgb2xkc2N0cHN0YXRlLCBzY2gtPnR5cGUpOwotCi0JCS8qIEludmFsaWQgKi8KLQkJaWYgKG5ld2Nvbm50cmFjayA9PSBTQ1RQX0NPTk5UUkFDS19NQVgpIHsKLQkJCURFQlVHUCgiaXBfY29ubnRyYWNrX3NjdHA6IEludmFsaWQgZGlyPSVpIGN0eXBlPSV1IGNvbm50cmFjaz0ldVxuIiwKLQkJCSAgICAgICBDVElORk8yRElSKGN0aW5mbyksIHNjaC0+dHlwZSwgb2xkc2N0cHN0YXRlKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmc2N0cF9sb2NrKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCS8qIElmIGl0IGlzIGFuIElOSVQgb3IgYW4gSU5JVCBBQ0sgbm90ZSBkb3duIHRoZSB2dGFnICovCi0JCWlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVAotCQkJfHwgc2NoLT50eXBlID09IFNDVFBfQ0lEX0lOSVRfQUNLKSB7Ci0JCQlzY3RwX2luaXRoZHJfdCBfaW5pdGhkciwgKmloOwotCi0JCQlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCArIHNpemVvZihzY3RwX2NodW5raGRyX3QpLAotCQkJCQkJc2l6ZW9mKF9pbml0aGRyKSwgJl9pbml0aGRyKTsKLQkJCWlmIChpaCA9PSBOVUxMKSB7Ci0JCQkJCXdyaXRlX3VubG9ja19iaCgmc2N0cF9sb2NrKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJREVCVUdQKCJTZXR0aW5nIHZ0YWcgJXggZm9yIGRpciAlZFxuIiwKLQkJCQkJaWgtPmluaXRfdGFnLCAhQ1RJTkZPMkRJUihjdGluZm8pKTsKLQkJCWNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnWyFDVElORk8yRElSKGN0aW5mbyldID0gaWgtPmluaXRfdGFnOwotCQl9Ci0KLQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnN0YXRlID0gbmV3Y29ubnRyYWNrOwotCQlpZiAob2xkc2N0cHN0YXRlICE9IG5ld2Nvbm50cmFjaykKLQkJCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GTywgc2tiKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCX0KLQotCWlwX2N0X3JlZnJlc2hfYWNjdChjb25udHJhY2ssIGN0aW5mbywgc2tiLCAqc2N0cF90aW1lb3V0c1tuZXdjb25udHJhY2tdKTsKLQotCWlmIChvbGRzY3Rwc3RhdGUgPT0gU0NUUF9DT05OVFJBQ0tfQ09PS0lFX0VDSE9FRAotCQkmJiBDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX1JFUExZCi0JCSYmIG5ld2Nvbm50cmFjayA9PSBTQ1RQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCkgewotCQlERUJVR1AoIlNldHRpbmcgYXNzdXJlZCBiaXRcbiIpOwotCQlzZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOwotCX0KLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCi1zdGF0aWMgaW50IHNjdHBfbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JZW51bSBzY3RwX2Nvbm50cmFjayBuZXdjb25udHJhY2s7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzY3RwX3NjdHBoZHJfdCBfc2N0cGgsICpzaDsKLQlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKLQl1X2ludDMyX3Qgb2Zmc2V0LCBjb3VudDsKLQljaGFyIG1hcFsyNTYgLyBzaXplb2YgKGNoYXIpXSA9IHswfTsKLQotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwgKiA0LCBzaXplb2YoX3NjdHBoKSwgJl9zY3RwaCk7Ci0JaWYgKHNoID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JaWYgKGRvX2Jhc2ljX2NoZWNrcyhjb25udHJhY2ssIHNrYiwgbWFwKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIElmIGFuIE9PVEIgcGFja2V0IGhhcyBhbnkgb2YgdGhlc2UgY2h1bmtzIGRpc2NhcmQgKFNlYyA4LjQpICovCi0JaWYgKCh0ZXN0X2JpdCAoU0NUUF9DSURfQUJPUlQsICh2b2lkICopbWFwKSkKLQkJfHwgKHRlc3RfYml0IChTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURSwgKHZvaWQgKiltYXApKQotCQl8fCAodGVzdF9iaXQgKFNDVFBfQ0lEX0NPT0tJRV9BQ0ssICh2b2lkICopbWFwKSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbmV3Y29ubnRyYWNrID0gU0NUUF9DT05OVFJBQ0tfTUFYOwotCWZvcl9lYWNoX3NjdHBfY2h1bmsgKHNrYiwgc2NoLCBfc2NoLCBvZmZzZXQsIGNvdW50KSB7Ci0JCS8qIERvbid0IG5lZWQgbG9jayBoZXJlOiB0aGlzIGNvbm50cmFjayBub3QgaW4gY2lyY3VsYXRpb24geWV0ICovCi0JCW5ld2Nvbm50cmFjayA9IG5ld19zdGF0ZSAoSVBfQ1RfRElSX09SSUdJTkFMLAotCQkJCQkJU0NUUF9DT05OVFJBQ0tfTk9ORSwgc2NoLT50eXBlKTsKLQotCQkvKiBJbnZhbGlkOiBkZWxldGUgY29ubnRyYWNrICovCi0JCWlmIChuZXdjb25udHJhY2sgPT0gU0NUUF9DT05OVFJBQ0tfTUFYKSB7Ci0JCQlERUJVR1AoImlwX2Nvbm50cmFja19zY3RwOiBpbnZhbGlkIG5ldyBkZWxldGluZy5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBDb3B5IHRoZSB2dGFnIGludG8gdGhlIHN0YXRlIGluZm8gKi8KLQkJaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9JTklUKSB7Ci0JCQlpZiAoc2gtPnZ0YWcgPT0gMCkgewotCQkJCXNjdHBfaW5pdGhkcl90IF9pbml0aGRyLCAqaWg7Ci0KLQkJCQlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCArIHNpemVvZihzY3RwX2NodW5raGRyX3QpLAotCQkJCQkJCXNpemVvZihfaW5pdGhkciksICZfaW5pdGhkcik7Ci0JCQkJaWYgKGloID09IE5VTEwpCi0JCQkJCXJldHVybiAwOwotCi0JCQkJREVCVUdQKCJTZXR0aW5nIHZ0YWcgJXggZm9yIG5ldyBjb25uXG4iLAotCQkJCQlpaC0+aW5pdF90YWcpOwotCi0JCQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbSVBfQ1RfRElSX1JFUExZXSA9Ci0JCQkJCQkJCWloLT5pbml0X3RhZzsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogU2VjIDguNS4xIChBKSAqLwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCS8qIElmIGl0IGlzIGEgc2h1dGRvd24gYWNrIE9PVEIgcGFja2V0LCB3ZSBleHBlY3QgYSByZXR1cm4KLQkJICAgc2h1dGRvd24gY29tcGxldGUsIG90aGVyd2lzZSBhbiBBQk9SVCBTZWMgOC40ICg1KSBhbmQgKDgpICovCi0JCWVsc2UgewotCQkJREVCVUdQKCJTZXR0aW5nIHZ0YWcgJXggZm9yIG5ldyBjb25uIE9PVEJcbiIsCi0JCQkJc2gtPnZ0YWcpOwotCQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbSVBfQ1RfRElSX1JFUExZXSA9IHNoLT52dGFnOwotCQl9Ci0KLQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnN0YXRlID0gbmV3Y29ubnRyYWNrOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfc2N0cCA9IHsKLQkucHJvdG8gCQkgPSBJUFBST1RPX1NDVFAsCi0JLm5hbWUgCQkgPSAic2N0cCIsCi0JLnBrdF90b190dXBsZSAJID0gc2N0cF9wa3RfdG9fdHVwbGUsCi0JLmludmVydF90dXBsZSAJID0gc2N0cF9pbnZlcnRfdHVwbGUsCi0JLnByaW50X3R1cGxlIAkgPSBzY3RwX3ByaW50X3R1cGxlLAotCS5wcmludF9jb25udHJhY2sgPSBzY3RwX3ByaW50X2Nvbm50cmFjaywKLQkucGFja2V0IAkgPSBzY3RwX3BhY2tldCwKLQkubmV3IAkJID0gc2N0cF9uZXcsCi0JLmRlc3Ryb3kgCSA9IE5VTEwsCi0JLm1lIAkJID0gVEhJU19NT0RVTEUsCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCi0JLnR1cGxlX3RvX25mYXR0ciA9IGlwX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fdHVwbGUgPSBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKLSNlbmRpZgotfTsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBjdGxfdGFibGUgaXBfY3Rfc3lzY3RsX3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NMT1NFRCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY2xvc2VkIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9jbG9zZWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9XQUlULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jb29raWVfd2FpdCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9FQ0hPRUQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQiLAotCQkuZGF0YQkJPSAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0VTVEFCTElTSEVELAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1NFTlQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQiLAotCQkuZGF0YQkJPSAmaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1JFQ0QsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QiLAotCQkuZGF0YQkJPSAmaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX0FDS19TRU5ULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fYWNrX3NlbnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0ZmlsdGVyX3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORVRGSUxURVIsCi0JCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gaXBfY3Rfc3lzY3RsX3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3RfaXB2NF90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCi0JCS5wcm9jbmFtZQk9ICJpcHY0IiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IGlwX2N0X25ldGZpbHRlcl90YWJsZSwKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1zdGF0aWMgY3RsX3RhYmxlIGlwX2N0X25ldF90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKLQkJLnByb2NuYW1lCT0gIm5ldCIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBpcF9jdF9pcHY0X3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXBfY3Rfc3lzY3RsX2hlYWRlcjsKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfcHJvdG9fc2N0cF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmaXBfY29ubnRyYWNrX3Byb3RvY29sX3NjdHApOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJpcF9jb25udHJhY2tfcHJvdG9fc2N0cDogcHJvdG9jb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotCWlwX2N0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBfY3RfbmV0X3RhYmxlKTsKLQlpZiAoaXBfY3Rfc3lzY3RsX2hlYWRlciA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCXByaW50aygiaXBfY29ubnRyYWNrX3Byb3RvX3NjdHA6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotIGNsZWFudXA6Ci0JaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJmlwX2Nvbm50cmFja19wcm90b2NvbF9zY3RwKTsKLSNlbmRpZgotIG91dDoKLQlERUJVR1AoIlNDVFAgY29ubnRyYWNrIG1vZHVsZSBsb2FkaW5nICVzXG4iLAotCQkJCQlyZXQgPyAiZmFpbGVkIjogInN1Y2NlZWRlZCIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9jb25udHJhY2tfcHJvdG9fc2N0cF9maW5pKHZvaWQpCi17Ci0JaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJmlwX2Nvbm50cmFja19wcm90b2NvbF9zY3RwKTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBfY3Rfc3lzY3RsX2hlYWRlcik7Ci0jZW5kaWYKLQlERUJVR1AoIlNDVFAgY29ubnRyYWNrIG1vZHVsZSB1bmxvYWRlZFxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja19wcm90b19zY3RwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfY29ubnRyYWNrX3Byb3RvX3NjdHBfZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBwcm90b2NvbCBoZWxwZXIgZm9yIFNDVFAiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTcyZWFiLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY0ICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT46Ci0gKgktIFJlYWwgc3RhdGVmdWwgY29ubmVjdGlvbiB0cmFja2luZwotICoJLSBNb2RpZmllZCBzdGF0ZSB0cmFuc2l0aW9ucyB0YWJsZQotICoJLSBXaW5kb3cgc2NhbGluZyBzdXBwb3J0IGFkZGVkCi0gKgktIFNBQ0sgc3VwcG9ydCBhZGRlZAotICoKLSAqIFdpbGx5IFRhcnJlYXU6Ci0gKgktIFN0YXRlIHRhYmxlIGJ1Z2ZpeGVzCi0gKgktIE1vcmUgcm9idXN0IHN0YXRlIGNoYW5nZXMKLSAqCS0gVHVuaW5nIHRpbWVyIHBhcmFtZXRlcnMKLSAqCi0gKiB2ZXJzaW9uIDIuMgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZGVmaW5lIERFQlVHUF9WQVJTCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qIFByb3RlY3RzIGNvbm50cmFjay0+cHJvdG8udGNwICovCi1zdGF0aWMgREVGSU5FX1JXTE9DSyh0Y3BfbG9jayk7Ci0KLS8qICJCZSBjb25zZXJ2YXRpdmUgaW4gd2hhdCB5b3UgZG8sCi0gICAgYmUgbGliZXJhbCBpbiB3aGF0IHlvdSBhY2NlcHQgZnJvbSBvdGhlcnMuIgotICAgIElmIGl0J3Mgbm9uLXplcm8sIHdlIG1hcmsgb25seSBvdXQgb2Ygd2luZG93IFJTVCBzZWdtZW50cyBhcyBJTlZBTElELiAqLwotaW50IGlwX2N0X3RjcF9iZV9saWJlcmFsIF9fcmVhZF9tb3N0bHkgPSAwOwotCi0vKiBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQKLSAgIGNvbm5lY3Rpb25zLiAqLwotaW50IGlwX2N0X3RjcF9sb29zZSBfX3JlYWRfbW9zdGx5ID0gMTsKLQotLyogTWF4IG51bWJlciBvZiB0aGUgcmV0cmFuc21pdHRlZCBwYWNrZXRzIHdpdGhvdXQgcmVjZWl2aW5nIGFuIChhY2NlcHRhYmxlKQotICAgQUNLIGZyb20gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGlzIG51bWJlciBpcyByZWFjaGVkLCBhIHNob3J0ZXIgdGltZXIKLSAgIHdpbGwgYmUgc3RhcnRlZC4gKi8KLWludCBpcF9jdF90Y3BfbWF4X3JldHJhbnMgX19yZWFkX21vc3RseSA9IDM7Ci0KLSAgLyogRklYTUU6IEV4YW1pbmUgaXBmaWx0ZXIncyB0aW1lb3V0cyBhbmQgY29ubnRyYWNrIHRyYW5zaXRpb25zIG1vcmUKLSAgICAgY2xvc2VseS4gIFRoZXkncmUgbW9yZSBjb21wbGV4LiAtLVJSICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICp0Y3BfY29ubnRyYWNrX25hbWVzW10gPSB7Ci0JIk5PTkUiLAotCSJTWU5fU0VOVCIsCi0JIlNZTl9SRUNWIiwKLQkiRVNUQUJMSVNIRUQiLAotCSJGSU5fV0FJVCIsCi0JIkNMT1NFX1dBSVQiLAotCSJMQVNUX0FDSyIsCi0JIlRJTUVfV0FJVCIsCi0JIkNMT1NFIiwKLQkiTElTVEVOIgotfTsKLQotI2RlZmluZSBTRUNTICogSFoKLSNkZWZpbmUgTUlOUyAqIDYwIFNFQ1MKLSNkZWZpbmUgSE9VUlMgKiA2MCBNSU5TCi0jZGVmaW5lIERBWVMgKiAyNCBIT1VSUwotCi11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2IF9fcmVhZF9tb3N0bHkgPSAgICAgNjAgU0VDUzsKLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZCBfX3JlYWRfbW9zdGx5ID0gICA1IERBWVM7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQgX19yZWFkX21vc3RseSA9ICAgNjAgU0VDUzsKLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9sYXN0X2FjayBfX3JlYWRfbW9zdGx5ID0gICAgIDMwIFNFQ1M7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0IF9fcmVhZF9tb3N0bHkgPSAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlIF9fcmVhZF9tb3N0bHkgPSAgICAgICAgMTAgU0VDUzsKLQotLyogUkZDMTEyMiBzYXlzIHRoZSBSMiBsaW1pdCBzaG91bGQgYmUgYXQgbGVhc3QgMTAwIHNlY29uZHMuCi0gICBMaW51eCB1c2VzIDE1IHBhY2tldHMgYXMgbGltaXQsIHdoaWNoIGNvcnJlc3BvbmRzCi0gICB0byB+MTMtMzBtaW4gZGVwZW5kaW5nIG9uIFJUTy4gKi8KLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucyBfX3JlYWRfbW9zdGx5ID0gICA1IE1JTlM7Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgKiB0Y3BfdGltZW91dHNbXQotPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX05PTkUgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19TWU5fU0VOVCwgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19TWU5fUkVDViwgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCwgICAgICAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdCwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0ZJTl9XQUlULCAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LCAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVQsICAgICAgICovCi0gICAgJmlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLCAgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfTEFTVF9BQ0ssICovCi0gICAgJmlwX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdCwgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfVElNRV9XQUlULCAgICAgICAgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2UsICAgICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19DTE9TRSwgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19MSVNURU4gKi8KLSB9OwotCi0jZGVmaW5lIHNOTyBUQ1BfQ09OTlRSQUNLX05PTkUKLSNkZWZpbmUgc1NTIFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQKLSNkZWZpbmUgc1NSIFRDUF9DT05OVFJBQ0tfU1lOX1JFQ1YKLSNkZWZpbmUgc0VTIFRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQKLSNkZWZpbmUgc0ZXIFRDUF9DT05OVFJBQ0tfRklOX1dBSVQKLSNkZWZpbmUgc0NXIFRDUF9DT05OVFJBQ0tfQ0xPU0VfV0FJVAotI2RlZmluZSBzTEEgVENQX0NPTk5UUkFDS19MQVNUX0FDSwotI2RlZmluZSBzVFcgVENQX0NPTk5UUkFDS19USU1FX1dBSVQKLSNkZWZpbmUgc0NMIFRDUF9DT05OVFJBQ0tfQ0xPU0UKLSNkZWZpbmUgc0xJIFRDUF9DT05OVFJBQ0tfTElTVEVOCi0jZGVmaW5lIHNJViBUQ1BfQ09OTlRSQUNLX01BWAotI2RlZmluZSBzSUcgVENQX0NPTk5UUkFDS19JR05PUkUKLQotLyogV2hhdCBUQ1AgZmxhZ3MgYXJlIHNldCBmcm9tIFJTVC9TWU4vRklOL0FDSy4gKi8KLWVudW0gdGNwX2JpdF9zZXQgewotCVRDUF9TWU5fU0VULAotCVRDUF9TWU5BQ0tfU0VULAotCVRDUF9GSU5fU0VULAotCVRDUF9BQ0tfU0VULAotCVRDUF9SU1RfU0VULAotCVRDUF9OT05FX1NFVCwKLX07Ci0KLS8qCi0gKiBUaGUgVENQIHN0YXRlIHRyYW5zaXRpb24gdGFibGUgbmVlZHMgYSBmZXcgd29yZHMuLi4KLSAqCi0gKiBXZSBhcmUgdGhlIG1hbiBpbiB0aGUgbWlkZGxlLiBBbGwgdGhlIHBhY2tldHMgZ28gdGhyb3VnaCB1cwotICogYnV0IG1pZ2h0IGdldCBsb3N0IGluIHRyYW5zaXQgdG8gdGhlIGRlc3RpbmF0aW9uLgotICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBkZXN0aW5hdGlvbnMgY2FuJ3QgcmVjZWl2ZSBzZWdtZW50cwotICogd2UgaGF2ZW4ndCBzZWVuLgotICoKLSAqIFRoZSBjaGVja2VkIHNlZ21lbnQgaXMgaW4gd2luZG93LCBidXQgb3VyIHdpbmRvd3MgYXJlICpub3QqCi0gKiBlcXVpdmFsZW50IHdpdGggdGhlIG9uZXMgb2YgdGhlIHNlbmRlci9yZWNlaXZlci4gV2UgYWx3YXlzCi0gKiB0cnkgdG8gZ3Vlc3MgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IHNlbmRlci4KLSAqCi0gKiBUaGUgbWVhbmluZyBvZiB0aGUgc3RhdGVzIGFyZToKLSAqCi0gKiBOT05FOglpbml0aWFsIHN0YXRlCi0gKiBTWU5fU0VOVDoJU1lOLW9ubHkgcGFja2V0IHNlZW4KLSAqIFNZTl9SRUNWOglTWU4tQUNLIHBhY2tldCBzZWVuCi0gKiBFU1RBQkxJU0hFRDoJQUNLIHBhY2tldCBzZWVuCi0gKiBGSU5fV0FJVDoJRklOIHBhY2tldCBzZWVuCi0gKiBDTE9TRV9XQUlUOglBQ0sgc2VlbiAoYWZ0ZXIgRklOKQotICogTEFTVF9BQ0s6CUZJTiBzZWVuIChhZnRlciBGSU4pCi0gKiBUSU1FX1dBSVQ6CWxhc3QgQUNLIHNlZW4KLSAqIENMT1NFOgljbG9zZWQgY29ubmVjdGlvbgotICoKLSAqIExJU1RFTiBzdGF0ZSBpcyBub3QgdXNlZC4KLSAqCi0gKiBQYWNrZXRzIG1hcmtlZCBhcyBJR05PUkVEIChzSUcpOgotICoJaWYgdGhleSBtYXkgYmUgZWl0aGVyIGludmFsaWQgb3IgdmFsaWQKLSAqCWFuZCB0aGUgcmVjZWl2ZXIgbWF5IHNlbmQgYmFjayBhIGNvbm5lY3Rpb24KLSAqCWNsb3NpbmcgUlNUIG9yIGEgU1lOL0FDSy4KLSAqCi0gKiBQYWNrZXRzIG1hcmtlZCBhcyBJTlZBTElEIChzSVYpOgotICoJaWYgdGhleSBhcmUgaW52YWxpZAotICoJb3Igd2UgZG8gbm90IHN1cHBvcnQgdGhlIHJlcXVlc3QgKHNpbXVsdGFuZW91cyBvcGVuKQotICovCi1zdGF0aWMgY29uc3QgZW51bSB0Y3BfY29ubnRyYWNrIHRjcF9jb25udHJhY2tzWzJdWzZdW1RDUF9DT05OVFJBQ0tfTUFYXSA9IHsKLQl7Ci0vKiBPUklHSU5BTCAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKnN5biovCSAgIHsgc1NTLCBzU1MsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lHLCBzU1MsIHNTUywgc0lWIH0sCi0vKgotICoJc05PIC0+IHNTUwlJbml0aWFsaXplIGEgbmV3IGNvbm5lY3Rpb24KLSAqCXNTUyAtPiBzU1MJUmV0cmFuc21pdHRlZCBTWU4KLSAqCXNTUiAtPiBzSUcJTGF0ZSByZXRyYW5zbWl0dGVkIFNZTj8KLSAqCXNFUyAtPiBzSUcJRXJyb3I6IFNZTnMgaW4gd2luZG93IG91dHNpZGUgdGhlIFNZTl9TRU5UIHN0YXRlCi0gKgkJCWFyZSBlcnJvcnMuIFJlY2VpdmVyIHdpbGwgcmVwbHkgd2l0aCBSU1QKLSAqCQkJYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotICoJCQlPciB3ZSBhcmUgbm90IGluIHN5bmMgYW5kIGhvbGQgYSBkZWFkIGNvbm5lY3Rpb24uCi0gKglzRlcgLT4gc0lHCi0gKglzQ1cgLT4gc0lHCi0gKglzTEEgLT4gc0lHCi0gKglzVFcgLT4gc1NTCVJlb3BlbmVkIGNvbm5lY3Rpb24gKFJGQyAxMTIyKS4KLSAqCXNDTCAtPiBzU1MKLSAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKnN5bmFjayovIHsgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWIH0sCi0vKgotICogQSBTWU4vQUNLIGZyb20gdGhlIGNsaWVudCBpcyBhbHdheXMgaW52YWxpZDoKLSAqCS0gZWl0aGVyIGl0IHRyaWVzIHRvIHNldCB1cCBhIHNpbXVsdGFuZW91cyBvcGVuLCB3aGljaCBpcwotICoJICBub3Qgc3VwcG9ydGVkOwotICoJLSBvciB0aGUgZmlyZXdhbGwgaGFzIGp1c3QgYmVlbiBpbnNlcnRlZCBiZXR3ZWVuIHRoZSB0d28gaG9zdHMKLSAqCSAgZHVyaW5nIHRoZSBzZXNzaW9uIHNldC11cC4gVGhlIFNZTiB3aWxsIGJlIHJldHJhbnNtaXR0ZWQKLSAqCSAgYnkgdGhlIHRydWUgY2xpZW50IChvciBpdCdsbCB0aW1lIG91dCkuCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypmaW4qLyAgICB7IHNJViwgc0lWLCBzRlcsIHNGVywgc0xBLCBzTEEsIHNMQSwgc1RXLCBzQ0wsIHNJViB9LAotLyoKLSAqCXNOTyAtPiBzSVYJVG9vIGxhdGUgYW5kIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4uLgotICoJc1NTIC0+IHNJVglDbGllbnQgbWlndGggbm90IHNlbmQgRklOIGluIHRoaXMgc3RhdGU6Ci0gKgkJCXdlIGVuZm9yY2Ugd2FpdGluZyBmb3IgYSBTWU4vQUNLIHJlcGx5IGZpcnN0LgotICoJc1NSIC0+IHNGVwlDbG9zZSBzdGFydGVkLgotICoJc0VTIC0+IHNGVwotICoJc0ZXIC0+IHNMQQlGSU4gc2VlbiBpbiBib3RoIGRpcmVjdGlvbnMsIHdhaXRpbmcgZm9yCi0gKgkJCXRoZSBsYXN0IEFDSy4KLSAqCQkJTWlndGggYmUgYSByZXRyYW5zbWl0dGVkIEZJTiBhcyB3ZWxsLi4uCi0gKglzQ1cgLT4gc0xBCi0gKglzTEEgLT4gc0xBCVJldHJhbnNtaXR0ZWQgRklOLiBSZW1haW4gaW4gdGhlIHNhbWUgc3RhdGUuCi0gKglzVFcgLT4gc1RXCi0gKglzQ0wgLT4gc0NMCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLyphY2sqLwkgICB7IHNFUywgc0lWLCBzRVMsIHNFUywgc0NXLCBzQ1csIHNUVywgc1RXLCBzQ0wsIHNJViB9LAotLyoKLSAqCXNOTyAtPiBzRVMJQXNzdW1lZC4KLSAqCXNTUyAtPiBzSVYJQUNLIGlzIGludmFsaWQ6IHdlIGhhdmVuJ3Qgc2VlbiBhIFNZTi9BQ0sgeWV0LgotICoJc1NSIC0+IHNFUwlFc3RhYmxpc2hlZCBzdGF0ZSBpcyByZWFjaGVkLgotICoJc0VTIC0+IHNFUwk6LSkKLSAqCXNGVyAtPiBzQ1cJTm9ybWFsIGNsb3NlIHJlcXVlc3QgYW5zd2VyZWQgYnkgQUNLLgotICoJc0NXIC0+IHNDVwotICoJc0xBIC0+IHNUVwlMYXN0IEFDSyBkZXRlY3RlZC4KLSAqCXNUVyAtPiBzVFcJUmV0cmFuc21pdHRlZCBsYXN0IEFDSy4gUmVtYWluIGluIHRoZSBzYW1lIHN0YXRlLgotICoJc0NMIC0+IHNDTAotICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qcnN0Ki8gICAgeyBzSVYsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzSVYgfSwKLS8qbm9uZSovICAgeyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfQotCX0sCi0JewotLyogUkVQTFkgKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypzeW4qLwkgICB7IHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViB9LAotLyoKLSAqCXNOTyAtPiBzSVYJTmV2ZXIgcmVhY2hlZC4KLSAqCXNTUyAtPiBzSVYJU2ltdWx0YW5lb3VzIG9wZW4sIG5vdCBzdXBwb3J0ZWQKLSAqCXNTUiAtPiBzSVYJU2ltdWx0YW5lb3VzIG9wZW4sIG5vdCBzdXBwb3J0ZWQuCi0gKglzRVMgLT4gc0lWCVNlcnZlciBtYXkgbm90IGluaXRpYXRlIGEgY29ubmVjdGlvbi4KLSAqCXNGVyAtPiBzSVYKLSAqCXNDVyAtPiBzSVYKLSAqCXNMQSAtPiBzSVYKLSAqCXNUVyAtPiBzSVYJUmVvcGVuZWQgY29ubmVjdGlvbiwgYnV0IHNlcnZlciBtYXkgbm90IGRvIGl0LgotICoJc0NMIC0+IHNJVgotICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qc3luYWNrKi8geyBzSVYsIHNTUiwgc1NSLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lHLCBzSVYgfSwKLS8qCi0gKglzU1MgLT4gc1NSCVN0YW5kYXJkIG9wZW4uCi0gKglzU1IgLT4gc1NSCVJldHJhbnNtaXR0ZWQgU1lOL0FDSy4KLSAqCXNFUyAtPiBzSUcJTGF0ZSByZXRyYW5zbWl0dGVkIFNZTi9BQ0s/Ci0gKglzRlcgLT4gc0lHCU1pZ2h0IGJlIFNZTi9BQ0sgYW5zd2VyaW5nIGlnbm9yZWQgU1lOCi0gKglzQ1cgLT4gc0lHCi0gKglzTEEgLT4gc0lHCi0gKglzVFcgLT4gc0lHCi0gKglzQ0wgLT4gc0lHCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypmaW4qLyAgICB7IHNJViwgc0lWLCBzRlcsIHNGVywgc0xBLCBzTEEsIHNMQSwgc1RXLCBzQ0wsIHNJViB9LAotLyoKLSAqCXNTUyAtPiBzSVYJU2VydmVyIG1pZ2h0IG5vdCBzZW5kIEZJTiBpbiB0aGlzIHN0YXRlLgotICoJc1NSIC0+IHNGVwlDbG9zZSBzdGFydGVkLgotICoJc0VTIC0+IHNGVwotICoJc0ZXIC0+IHNMQQlGSU4gc2VlbiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKglzQ1cgLT4gc0xBCi0gKglzTEEgLT4gc0xBCVJldHJhbnNtaXR0ZWQgRklOLgotICoJc1RXIC0+IHNUVwotICoJc0NMIC0+IHNDTAotICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qYWNrKi8JICAgeyBzSVYsIHNJRywgc1NSLCBzRVMsIHNDVywgc0NXLCBzVFcsIHNUVywgc0NMLCBzSVYgfSwKLS8qCi0gKglzU1MgLT4gc0lHCU1pZ2h0IGJlIGEgaGFsZi1vcGVuIGNvbm5lY3Rpb24uCi0gKglzU1IgLT4gc1NSCU1pZ2h0IGFuc3dlciBsYXRlIHJlc2VudCBTWU4uCi0gKglzRVMgLT4gc0VTCTotKQotICoJc0ZXIC0+IHNDVwlOb3JtYWwgY2xvc2UgcmVxdWVzdCBhbnN3ZXJlZCBieSBBQ0suCi0gKglzQ1cgLT4gc0NXCi0gKglzTEEgLT4gc1RXCUxhc3QgQUNLIGRldGVjdGVkLgotICoJc1RXIC0+IHNUVwlSZXRyYW5zbWl0dGVkIGxhc3QgQUNLLgotICoJc0NMIC0+IHNDTAotICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qcnN0Ki8gICAgeyBzSVYsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzSVYgfSwKLS8qbm9uZSovICAgeyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfQotCX0KLX07Ci0KLXN0YXRpYyBpbnQgdGNwX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCB0Y3BoZHIgX2hkciwgKmhwOwotCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX2hkcik7Ci0JaWYgKGhwID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JdHVwbGUtPnNyYy51LnRjcC5wb3J0ID0gaHAtPnNvdXJjZTsKLQl0dXBsZS0+ZHN0LnUudGNwLnBvcnQgPSBocC0+ZGVzdDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHRjcF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQl0dXBsZS0+c3JjLnUudGNwLnBvcnQgPSBvcmlnLT5kc3QudS50Y3AucG9ydDsKLQl0dXBsZS0+ZHN0LnUudGNwLnBvcnQgPSBvcmlnLT5zcmMudS50Y3AucG9ydDsKLQlyZXR1cm4gMTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwZXItcHJvdG9jb2wgcGFydCBvZiB0aGUgdHVwbGUuICovCi1zdGF0aWMgaW50IHRjcF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3BvcnQ9JWh1IGRwb3J0PSVodSAiLAotCQkJICBudG9ocyh0dXBsZS0+c3JjLnUudGNwLnBvcnQpLAotCQkJICBudG9ocyh0dXBsZS0+ZHN0LnUudGNwLnBvcnQpKTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KLXN0YXRpYyBpbnQgdGNwX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCWVudW0gdGNwX2Nvbm50cmFjayBzdGF0ZTsKLQotCXJlYWRfbG9ja19iaCgmdGNwX2xvY2spOwotCXN0YXRlID0gY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGU7Ci0JcmVhZF91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlcyAiLCB0Y3BfY29ubnRyYWNrX25hbWVzW3N0YXRlXSk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLXN0YXRpYyBpbnQgdGNwX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZhdHRyICpuZmEsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtczsKLQotCXJlYWRfbG9ja19iaCgmdGNwX2xvY2spOwotCW5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9QUk9UT0lORk9fVENQKTsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUsIHNpemVvZih1X2ludDhfdCksCi0JCSZjdC0+cHJvdG8udGNwLnN0YXRlKTsKLQlyZWFkX3VubG9ja19iaCgmdGNwX2xvY2spOwotCi0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmVhZF91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgY3RhX21pbl90Y3BbQ1RBX1BST1RPSU5GT19UQ1BfTUFYXSA9IHsKLQlbQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUtMV0JPSBzaXplb2YodV9pbnQ4X3QpLAotfTsKLQotc3RhdGljIGludCBuZmF0dHJfdG9fdGNwKHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgbmZhdHRyICphdHRyID0gY2RhW0NUQV9QUk9UT0lORk9fVENQLTFdOwotCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9QUk9UT0lORk9fVENQX01BWF07Ci0KLQkvKiB1cGRhdGVzIGNvdWxkIG5vdCBjb250YWluIGFueXRoaW5nIGFib3V0IHRoZSBwcml2YXRlCi0JICogcHJvdG9jb2wgaW5mbywgaW4gdGhhdCBjYXNlIHNraXAgdGhlIHBhcnNpbmcgKi8KLQlpZiAoIWF0dHIpCi0JCXJldHVybiAwOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPSU5GT19UQ1BfTUFYLCBhdHRyKTsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9QUk9UT0lORk9fVENQX01BWCwgY3RhX21pbl90Y3ApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghdGJbQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUtMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd3JpdGVfbG9ja19iaCgmdGNwX2xvY2spOwotCWN0LT5wcm90by50Y3Auc3RhdGUgPQotCQkqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUtMV0pOwotCXdyaXRlX3VubG9ja19iaCgmdGNwX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfY29ubnRyYWNrX2luZGV4KGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRjcGgpCi17Ci0JaWYgKHRjcGgtPnJzdCkgcmV0dXJuIFRDUF9SU1RfU0VUOwotCWVsc2UgaWYgKHRjcGgtPnN5bikgcmV0dXJuICh0Y3BoLT5hY2sgPyBUQ1BfU1lOQUNLX1NFVCA6IFRDUF9TWU5fU0VUKTsKLQllbHNlIGlmICh0Y3BoLT5maW4pIHJldHVybiBUQ1BfRklOX1NFVDsKLQllbHNlIGlmICh0Y3BoLT5hY2spIHJldHVybiBUQ1BfQUNLX1NFVDsKLQllbHNlIHJldHVybiBUQ1BfTk9ORV9TRVQ7Ci19Ci0KLS8qIFRDUCBjb25uZWN0aW9uIHRyYWNraW5nIGJhc2VkIG9uICdSZWFsIFN0YXRlZnVsIFRDUCBQYWNrZXQgRmlsdGVyaW5nCi0gICBpbiBJUCBGaWx0ZXInIGJ5IEd1aWRvIHZhbiBSb29pai4KLQotICAgaHR0cDovL3d3dy5ubHV1Zy5ubC9ldmVudHMvc2FuZTIwMDAvcGFwZXJzLmh0bWwKLSAgIGh0dHA6Ly93d3cuaWFlLm5sL3VzZXJzL2d1aWRvL3BhcGVycy90Y3BfZmlsdGVyaW5nLnBzLmd6Ci0KLSAgIFRoZSBib3VuZGFyaWVzIGFuZCB0aGUgY29uZGl0aW9ucyBhcmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gUkZDNzkzOgotICAgdGhlIHBhY2tldCBtdXN0IGludGVyc2VjdCB0aGUgd2luZG93IChpLmUuIHNlZ21lbnRzIG1heSBiZQotICAgYWZ0ZXIgdGhlIHJpZ2h0IG9yIGJlZm9yZSB0aGUgbGVmdCBlZGdlKSBhbmQgdGh1cyByZWNlaXZlcnMgbWF5IEFDSwotICAgc2VnbWVudHMgYWZ0ZXIgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHdpbmRvdy4KLQotCXRkX21heGVuZCA9IG1heChzYWNrICsgbWF4KHdpbiwxKSkgc2VlbiBpbiByZXBseSBwYWNrZXRzCi0JdGRfbWF4d2luID0gbWF4KG1heCh3aW4sIDEpKSArIChzYWNrIC0gYWNrKSBzZWVuIGluIHNlbnQgcGFja2V0cwotCXRkX21heHdpbiArPSBzZXEgKyBsZW4gLSBzZW5kZXIudGRfbWF4ZW5kCi0JCQlpZiBzZXEgKyBsZW4gPiBzZW5kZXIudGRfbWF4ZW5kCi0JdGRfZW5kICAgID0gbWF4KHNlcSArIGxlbikgc2VlbiBpbiBzZW50IHBhY2tldHMKLQotICAgSS4gICBVcHBlciBib3VuZCBmb3IgdmFsaWQgZGF0YToJc2VxIDw9IHNlbmRlci50ZF9tYXhlbmQKLSAgIElJLiAgTG93ZXIgYm91bmQgZm9yIHZhbGlkIGRhdGE6CXNlcSArIGxlbiA+PSBzZW5kZXIudGRfZW5kIC0gcmVjZWl2ZXIudGRfbWF4d2luCi0gICBJSUkuCVVwcGVyIGJvdW5kIGZvciB2YWxpZCBhY2s6ICAgICAgc2FjayA8PSByZWNlaXZlci50ZF9lbmQKLSAgIElWLglMb3dlciBib3VuZCBmb3IgdmFsaWQgYWNrOglhY2sgPj0gcmVjZWl2ZXIudGRfZW5kIC0gTUFYQUNLV0lORE9XCi0KLSAgIHdoZXJlIHNhY2sgaXMgdGhlIGhpZ2hlc3QgcmlnaHQgZWRnZSBvZiBzYWNrIGJsb2NrIGZvdW5kIGluIHRoZSBwYWNrZXQuCi0KLSAgIFRoZSB1cHBlciBib3VuZCBsaW1pdCBmb3IgYSB2YWxpZCBhY2sgaXMgbm90IGlnbm9yZWQgLQotICAgd2UgZG9lc24ndCBoYXZlIHRvIGRlYWwgd2l0aCBmcmFnbWVudHMuCi0qLwotCi1zdGF0aWMgaW5saW5lIF9fdTMyIHNlZ21lbnRfc2VxX3BsdXNfbGVuKF9fdTMyIHNlcSwKLQkJCQkJIHNpemVfdCBsZW4sCi0JCQkJCSBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJCQkJIHN0cnVjdCB0Y3BoZHIgKnRjcGgpCi17Ci0JcmV0dXJuIChzZXEgKyBsZW4gLSAoaXBoLT5paGwgKyB0Y3BoLT5kb2ZmKSo0Ci0JCSsgKHRjcGgtPnN5biA/IDEgOiAwKSArICh0Y3BoLT5maW4gPyAxIDogMCkpOwotfQotCi0vKiBGaXhtZTogd2hhdCBhYm91dCBiaWcgcGFja2V0cz8gKi8KLSNkZWZpbmUgTUFYQUNLV0lOQ09OU1QJCQk2NjAwMAotI2RlZmluZSBNQVhBQ0tXSU5ET1coc2VuZGVyKQkJCQkJCVwKLQkoKHNlbmRlciktPnRkX21heHdpbiA+IE1BWEFDS1dJTkNPTlNUID8gKHNlbmRlciktPnRkX21heHdpbglcCi0JCQkJCSAgICAgIDogTUFYQUNLV0lOQ09OU1QpCi0KLS8qCi0gKiBTaW1wbGlmaWVkIHRjcF9wYXJzZV9vcHRpb25zIHJvdXRpbmUgZnJvbSB0Y3BfaW5wdXQuYwotICovCi1zdGF0aWMgdm9pZCB0Y3Bfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGlwaGRyICppcGgsCi0JCQlzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCQkJc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSAqc3RhdGUpCi17Ci0JdW5zaWduZWQgY2hhciBidWZmWygxNSAqIDQpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXTsKLQl1bnNpZ25lZCBjaGFyICpwdHI7Ci0JaW50IGxlbmd0aCA9ICh0Y3BoLT5kb2ZmKjQpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCi0JaWYgKCFsZW5ndGgpCi0JCXJldHVybjsKLQotCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJIChpcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCSBsZW5ndGgsIGJ1ZmYpOwotCUJVR19PTihwdHIgPT0gTlVMTCk7Ci0KLQlzdGF0ZS0+dGRfc2NhbGUgPQotCXN0YXRlLT5mbGFncyA9IDA7Ci0KLQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlpbnQgb3Bjb2RlPSpwdHIrKzsKLQkJaW50IG9wc2l6ZTsKLQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIFRDUE9QVF9FT0w6Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVENQT1BUX05PUDoJLyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovCi0JCQlsZW5ndGgtLTsKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJb3BzaXplPSpwdHIrKzsKLQkJCWlmIChvcHNpemUgPCAyKSAvKiAic2lsbHkgb3B0aW9ucyIgKi8KLQkJCQlyZXR1cm47Ci0JCQlpZiAob3BzaXplID4gbGVuZ3RoKQotCQkJCWJyZWFrOwkvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi8KLQotCQkJaWYgKG9wY29kZSA9PSBUQ1BPUFRfU0FDS19QRVJNCi0JCQkgICAgJiYgb3BzaXplID09IFRDUE9MRU5fU0FDS19QRVJNKQotCQkJCXN0YXRlLT5mbGFncyB8PSBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk07Ci0JCQllbHNlIGlmIChvcGNvZGUgPT0gVENQT1BUX1dJTkRPVwotCQkJCSAmJiBvcHNpemUgPT0gVENQT0xFTl9XSU5ET1cpIHsKLQkJCQlzdGF0ZS0+dGRfc2NhbGUgPSAqKHVfaW50OF90ICopcHRyOwotCi0JCQkJaWYgKHN0YXRlLT50ZF9zY2FsZSA+IDE0KSB7Ci0JCQkJCS8qIFNlZSBSRkMxMzIzICovCi0JCQkJCXN0YXRlLT50ZF9zY2FsZSA9IDE0OwotCQkJCX0KLQkJCQlzdGF0ZS0+ZmxhZ3MgfD0KLQkJCQkJSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFOwotCQkJfQotCQkJcHRyICs9IG9wc2l6ZSAtIDI7Ci0JCQlsZW5ndGggLT0gb3BzaXplOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0Y3Bfc2Fjayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHN0cnVjdCBpcGhkciAqaXBoLAotCQkgICAgIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0JCSAgICAgX191MzIgKnNhY2spCi17Ci0JdW5zaWduZWQgY2hhciBidWZmWygxNSAqIDQpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXTsKLQl1bnNpZ25lZCBjaGFyICpwdHI7Ci0JaW50IGxlbmd0aCA9ICh0Y3BoLT5kb2ZmKjQpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCV9fdTMyIHRtcDsKLQotCWlmICghbGVuZ3RoKQotCQlyZXR1cm47Ci0KLQlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCSAoaXBoLT5paGwgKiA0KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwKLQkJCQkgbGVuZ3RoLCBidWZmKTsKLQlCVUdfT04ocHRyID09IE5VTEwpOwotCi0JLyogRmFzdCBwYXRoIGZvciB0aW1lc3RhbXAtb25seSBvcHRpb24gKi8KLQlpZiAobGVuZ3RoID09IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQqNAotCSAgICAmJiAqKF9fYmUzMiAqKXB0ciA9PQotCQlfX2NvbnN0YW50X2h0b25sKChUQ1BPUFRfTk9QIDw8IDI0KQotCQkJCSB8IChUQ1BPUFRfTk9QIDw8IDE2KQotCQkJCSB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpCi0JCQkJIHwgVENQT0xFTl9USU1FU1RBTVApKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlpbnQgb3Bjb2RlPSpwdHIrKzsKLQkJaW50IG9wc2l6ZSwgaTsKLQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIFRDUE9QVF9FT0w6Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVENQT1BUX05PUDoJLyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovCi0JCQlsZW5ndGgtLTsKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJb3BzaXplPSpwdHIrKzsKLQkJCWlmIChvcHNpemUgPCAyKSAvKiAic2lsbHkgb3B0aW9ucyIgKi8KLQkJCQlyZXR1cm47Ci0JCQlpZiAob3BzaXplID4gbGVuZ3RoKQotCQkJCWJyZWFrOwkvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi8KLQotCQkJaWYgKG9wY29kZSA9PSBUQ1BPUFRfU0FDSwotCQkJICAgICYmIG9wc2l6ZSA+PSAoVENQT0xFTl9TQUNLX0JBU0UKLQkJCQkJICArIFRDUE9MRU5fU0FDS19QRVJCTE9DSykKLQkJCSAgICAmJiAhKChvcHNpemUgLSBUQ1BPTEVOX1NBQ0tfQkFTRSkKLQkJCQkgJSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKSB7Ci0JCQkJZm9yIChpID0gMDsKLQkJCQkgICAgIGkgPCAob3BzaXplIC0gVENQT0xFTl9TQUNLX0JBU0UpOwotCQkJCSAgICAgaSArPSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spIHsKLQkJCQkJdG1wID0gbnRvaGwoKigoX19iZTMyICopKHB0citpKSsxKSk7Ci0KLQkJCQkJaWYgKGFmdGVyKHRtcCwgKnNhY2spKQotCQkJCQkJKnNhY2sgPSB0bXA7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXB0ciArPSBvcHNpemUgLSAyOwotCQkJbGVuZ3RoIC09IG9wc2l6ZTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCB0Y3BfaW5fd2luZG93KHN0cnVjdCBpcF9jdF90Y3AgKnN0YXRlLAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCi0JCQkgdW5zaWduZWQgaW50IGluZGV4LAotCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgc3RydWN0IGlwaGRyICppcGgsCi0JCQkgc3RydWN0IHRjcGhkciAqdGNwaCkKLXsKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzZW5kZXIgPSAmc3RhdGUtPnNlZW5bZGlyXTsKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZzdGF0ZS0+c2VlblshZGlyXTsKLQlfX3UzMiBzZXEsIGFjaywgc2FjaywgZW5kLCB3aW4sIHN3aW47Ci0JaW50IHJlczsKLQotCS8qCi0JICogR2V0IHRoZSByZXF1aXJlZCBkYXRhIGZyb20gdGhlIHBhY2tldC4KLQkgKi8KLQlzZXEgPSBudG9obCh0Y3BoLT5zZXEpOwotCWFjayA9IHNhY2sgPSBudG9obCh0Y3BoLT5hY2tfc2VxKTsKLQl3aW4gPSBudG9ocyh0Y3BoLT53aW5kb3cpOwotCWVuZCA9IHNlZ21lbnRfc2VxX3BsdXNfbGVuKHNlcSwgc2tiLT5sZW4sIGlwaCwgdGNwaCk7Ci0KLQlpZiAocmVjZWl2ZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNKQotCQl0Y3Bfc2Fjayhza2IsIGlwaCwgdGNwaCwgJnNhY2spOwotCi0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBTVEFSVFxuIik7Ci0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBzcmM9JXUuJXUuJXUuJXU6JWh1IGRzdD0ldS4ldS4ldS4ldTolaHUgIgotCSAgICAgICAic2VxPSV1IGFjaz0ldSBzYWNrPSV1IHdpbj0ldSBlbmQ9JXVcbiIsCi0JCU5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRjcGgtPnNvdXJjZSksCi0JCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRjcGgtPmRlc3QpLAotCQlzZXEsIGFjaywgc2Fjaywgd2luLCBlbmQpOwotCURFQlVHUCgidGNwX2luX3dpbmRvdzogc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpICIKLQkgICAgICAgInJlY2VpdmVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpXG4iLAotCQlzZW5kZXItPnRkX2VuZCwgc2VuZGVyLT50ZF9tYXhlbmQsIHNlbmRlci0+dGRfbWF4d2luLAotCQlzZW5kZXItPnRkX3NjYWxlLAotCQlyZWNlaXZlci0+dGRfZW5kLCByZWNlaXZlci0+dGRfbWF4ZW5kLCByZWNlaXZlci0+dGRfbWF4d2luLAotCQlyZWNlaXZlci0+dGRfc2NhbGUpOwotCi0JaWYgKHNlbmRlci0+dGRfZW5kID09IDApIHsKLQkJLyoKLQkJICogSW5pdGlhbGl6ZSBzZW5kZXIgZGF0YS4KLQkJICovCi0JCWlmICh0Y3BoLT5zeW4gJiYgdGNwaC0+YWNrKSB7Ci0JCQkvKgotCQkJICogT3V0Z29pbmcgU1lOLUFDSyBpbiByZXBseSB0byBhIFNZTi4KLQkJCSAqLwotCQkJc2VuZGVyLT50ZF9lbmQgPQotCQkJc2VuZGVyLT50ZF9tYXhlbmQgPSBlbmQ7Ci0JCQlzZW5kZXItPnRkX21heHdpbiA9ICh3aW4gPT0gMCA/IDEgOiB3aW4pOwotCi0JCQl0Y3Bfb3B0aW9ucyhza2IsIGlwaCwgdGNwaCwgc2VuZGVyKTsKLQkJCS8qCi0JCQkgKiBSRkMgMTMyMzoKLQkJCSAqIEJvdGggc2lkZXMgbXVzdCBzZW5kIHRoZSBXaW5kb3cgU2NhbGUgb3B0aW9uCi0JCQkgKiB0byBlbmFibGUgd2luZG93IHNjYWxpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbi4KLQkJCSAqLwotCQkJaWYgKCEoc2VuZGVyLT5mbGFncyAmIElQX0NUX1RDUF9GTEFHX1dJTkRPV19TQ0FMRQotCQkJICAgICAgJiYgcmVjZWl2ZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFKSkKLQkJCQlzZW5kZXItPnRkX3NjYWxlID0KLQkJCQlyZWNlaXZlci0+dGRfc2NhbGUgPSAwOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29ubmVjdGlvbiwKLQkJCSAqIGl0cyBoaXN0b3J5IGlzIGxvc3QgZm9yIHVzLgotCQkJICogTGV0J3MgdHJ5IHRvIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBwYWNrZXQuCi0JCQkgKi8KLQkJCXNlbmRlci0+dGRfZW5kID0gZW5kOwotCQkJc2VuZGVyLT50ZF9tYXh3aW4gPSAod2luID09IDAgPyAxIDogd2luKTsKLQkJCXNlbmRlci0+dGRfbWF4ZW5kID0gZW5kICsgc2VuZGVyLT50ZF9tYXh3aW47Ci0JCX0KLQl9IGVsc2UgaWYgKCgoc3RhdGUtPnN0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQKLQkJICAgICAmJiBkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQkgICAgfHwgKHN0YXRlLT5zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWCi0JCQkmJiBkaXIgPT0gSVBfQ1RfRElSX1JFUExZKSkKLQkJICAgICYmIGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQpKSB7Ci0JCS8qCi0JCSAqIFJGQyA3OTM6ICJpZiBhIFRDUCBpcyByZWluaXRpYWxpemVkIC4uLiB0aGVuIGl0IG5lZWQKLQkJICogbm90IHdhaXQgYXQgYWxsOyBpdCBtdXN0IG9ubHkgYmUgc3VyZSB0byB1c2Ugc2VxdWVuY2UKLQkJICogbnVtYmVycyBsYXJnZXIgdGhhbiB0aG9zZSByZWNlbnRseSB1c2VkLiIKLQkJICovCi0JCXNlbmRlci0+dGRfZW5kID0KLQkJc2VuZGVyLT50ZF9tYXhlbmQgPSBlbmQ7Ci0JCXNlbmRlci0+dGRfbWF4d2luID0gKHdpbiA9PSAwID8gMSA6IHdpbik7Ci0KLQkJdGNwX29wdGlvbnMoc2tiLCBpcGgsIHRjcGgsIHNlbmRlcik7Ci0JfQotCi0JaWYgKCEodGNwaC0+YWNrKSkgewotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBubyBBQ0ssIGp1c3QgcHJldGVuZCBpdCB3YXMgc2V0IGFuZCBPSy4KLQkJICovCi0JCWFjayA9IHNhY2sgPSByZWNlaXZlci0+dGRfZW5kOwotCX0gZWxzZSBpZiAoKCh0Y3BfZmxhZ193b3JkKHRjcGgpICYgKFRDUF9GTEFHX0FDS3xUQ1BfRkxBR19SU1QpKSA9PQotCQkgICAgKFRDUF9GTEFHX0FDS3xUQ1BfRkxBR19SU1QpKQotCQkgICAmJiAoYWNrID09IDApKSB7Ci0JCS8qCi0JCSAqIEJyb2tlbiBUQ1Agc3RhY2tzLCB0aGF0IHNldCBBQ0sgaW4gUlNUIHBhY2tldHMgYXMgd2VsbAotCQkgKiB3aXRoIHplcm8gYWNrIHZhbHVlLgotCQkgKi8KLQkJYWNrID0gc2FjayA9IHJlY2VpdmVyLT50ZF9lbmQ7Ci0JfQotCi0JaWYgKHNlcSA9PSBlbmQKLQkgICAgJiYgKCF0Y3BoLT5yc3QKLQkJfHwgKHNlcSA9PSAwICYmIHN0YXRlLT5zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UKSkpCi0JCS8qCi0JCSAqIFBhY2tldHMgY29udGFpbnMgbm8gZGF0YTogd2UgYXNzdW1lIGl0IGlzIHZhbGlkCi0JCSAqIGFuZCBjaGVjayB0aGUgYWNrIHZhbHVlIG9ubHkuCi0JCSAqIEhvd2V2ZXIgUlNUIHNlZ21lbnRzIGFyZSBhbHdheXMgdmFsaWRhdGVkIGJ5IHRoZWlyCi0JCSAqIFNFUSBudW1iZXIsIGV4Y2VwdCB3aGVuIHNlcSA9PSAwIChyZXNldCBzZW50IGFuc3dlcmluZwotCQkgKiBTWU4uCi0JCSAqLwotCQlzZXEgPSBlbmQgPSBzZW5kZXItPnRkX2VuZDsKLQotCURFQlVHUCgidGNwX2luX3dpbmRvdzogc3JjPSV1LiV1LiV1LiV1OiVodSBkc3Q9JXUuJXUuJXUuJXU6JWh1ICIKLQkgICAgICAgInNlcT0ldSBhY2s9JXUgc2FjayA9JXUgd2luPSV1IGVuZD0ldVxuIiwKLQkJTklQUVVBRChpcGgtPnNhZGRyKSwgbnRvaHModGNwaC0+c291cmNlKSwKLQkJTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHModGNwaC0+ZGVzdCksCi0JCXNlcSwgYWNrLCBzYWNrLCB3aW4sIGVuZCk7Ci0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWkgIgotCSAgICAgICAicmVjZWl2ZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWlcbiIsCi0JCXNlbmRlci0+dGRfZW5kLCBzZW5kZXItPnRkX21heGVuZCwgc2VuZGVyLT50ZF9tYXh3aW4sCi0JCXNlbmRlci0+dGRfc2NhbGUsCi0JCXJlY2VpdmVyLT50ZF9lbmQsIHJlY2VpdmVyLT50ZF9tYXhlbmQsIHJlY2VpdmVyLT50ZF9tYXh3aW4sCi0JCXJlY2VpdmVyLT50ZF9zY2FsZSk7Ci0KLQlERUJVR1AoInRjcF9pbl93aW5kb3c6IEk9JWkgSUk9JWkgSUlJPSVpIElWPSVpXG4iLAotCQliZWZvcmUoc2VxLCBzZW5kZXItPnRkX21heGVuZCArIDEpLAotCQlhZnRlcihlbmQsIHNlbmRlci0+dGRfZW5kIC0gcmVjZWl2ZXItPnRkX21heHdpbiAtIDEpLAotCQliZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpLAotCQlhZnRlcihhY2ssIHJlY2VpdmVyLT50ZF9lbmQgLSBNQVhBQ0tXSU5ET1coc2VuZGVyKSkpOwotCi0JaWYgKGJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgJiYKLQkgICAgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSAmJgotCSAgICBiZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpICYmCi0JICAgIGFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSkgewotCQkvKgotCQkgKiBUYWtlIGludG8gYWNjb3VudCB3aW5kb3cgc2NhbGluZyAoUkZDIDEzMjMpLgotCQkgKi8KLQkJaWYgKCF0Y3BoLT5zeW4pCi0JCQl3aW4gPDw9IHNlbmRlci0+dGRfc2NhbGU7Ci0KLQkJLyoKLQkJICogVXBkYXRlIHNlbmRlciBkYXRhLgotCQkgKi8KLQkJc3dpbiA9IHdpbiArIChzYWNrIC0gYWNrKTsKLQkJaWYgKHNlbmRlci0+dGRfbWF4d2luIDwgc3dpbikKLQkJCXNlbmRlci0+dGRfbWF4d2luID0gc3dpbjsKLQkJaWYgKGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQpKQotCQkJc2VuZGVyLT50ZF9lbmQgPSBlbmQ7Ci0JCS8qCi0JCSAqIFVwZGF0ZSByZWNlaXZlciBkYXRhLgotCQkgKi8KLQkJaWYgKGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9tYXhlbmQpKQotCQkJcmVjZWl2ZXItPnRkX21heHdpbiArPSBlbmQgLSBzZW5kZXItPnRkX21heGVuZDsKLQkJaWYgKGFmdGVyKHNhY2sgKyB3aW4sIHJlY2VpdmVyLT50ZF9tYXhlbmQgLSAxKSkgewotCQkJcmVjZWl2ZXItPnRkX21heGVuZCA9IHNhY2sgKyB3aW47Ci0JCQlpZiAod2luID09IDApCi0JCQkJcmVjZWl2ZXItPnRkX21heGVuZCsrOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgcmV0cmFuc21pc3Npb25zLgotCQkgKi8KLQkJaWYgKGluZGV4ID09IFRDUF9BQ0tfU0VUKSB7Ci0JCQlpZiAoc3RhdGUtPmxhc3RfZGlyID09IGRpcgotCQkJICAgICYmIHN0YXRlLT5sYXN0X3NlcSA9PSBzZXEKLQkJCSAgICAmJiBzdGF0ZS0+bGFzdF9hY2sgPT0gYWNrCi0JCQkgICAgJiYgc3RhdGUtPmxhc3RfZW5kID09IGVuZAotCQkJICAgICYmIHN0YXRlLT5sYXN0X3dpbiA9PSB3aW4pCi0JCQkJc3RhdGUtPnJldHJhbnMrKzsKLQkJCWVsc2UgewotCQkJCXN0YXRlLT5sYXN0X2RpciA9IGRpcjsKLQkJCQlzdGF0ZS0+bGFzdF9zZXEgPSBzZXE7Ci0JCQkJc3RhdGUtPmxhc3RfYWNrID0gYWNrOwotCQkJCXN0YXRlLT5sYXN0X2VuZCA9IGVuZDsKLQkJCQlzdGF0ZS0+bGFzdF93aW4gPSB3aW47Ci0JCQkJc3RhdGUtPnJldHJhbnMgPSAwOwotCQkJfQotCQl9Ci0JCXJlcyA9IDE7Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJaWYgKHNlbmRlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19CRV9MSUJFUkFMIHx8Ci0JCSAgICBpcF9jdF90Y3BfYmVfbGliZXJhbCkKLQkJCXJlcyA9IDE7Ci0JCWlmICghcmVzICYmIExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJImlwX2N0X3RjcDogJXMgIiwKLQkJCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgPwotCQkJYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSA/Ci0JCQliZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpID8KLQkJCWFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSA/ICJCVUciCi0JCQk6ICJBQ0sgaXMgdW5kZXIgdGhlIGxvd2VyIGJvdW5kIChwb3NzaWJsZSBvdmVybHkgZGVsYXllZCBBQ0spIgotCQkJOiAiQUNLIGlzIG92ZXIgdGhlIHVwcGVyIGJvdW5kIChBQ0tlZCBkYXRhIG5vdCBzZWVuIHlldCkiCi0JCQk6ICJTRVEgaXMgdW5kZXIgdGhlIGxvd2VyIGJvdW5kIChhbHJlYWR5IEFDS2VkIGRhdGEgcmV0cmFuc21pdHRlZCkiCi0JCQk6ICJTRVEgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKG92ZXIgdGhlIHdpbmRvdyBvZiB0aGUgcmVjZWl2ZXIpIik7Ci0JfQotCi0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiByZXM9JWkgc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1ICIKLQkgICAgICAgInJlY2VpdmVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1XG4iLAotCQlyZXMsIHNlbmRlci0+dGRfZW5kLCBzZW5kZXItPnRkX21heGVuZCwgc2VuZGVyLT50ZF9tYXh3aW4sCi0JCXJlY2VpdmVyLT50ZF9lbmQsIHJlY2VpdmVyLT50ZF9tYXhlbmQsIHJlY2VpdmVyLT50ZF9tYXh3aW4pOwotCi0JcmV0dXJuIHJlczsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0vKiBVcGRhdGUgc2VuZGVyLT50ZF9lbmQgYWZ0ZXIgTkFUIHN1Y2Nlc3NmdWxseSBtYW5nbGVkIHRoZSBwYWNrZXQgKi8KLXZvaWQgaXBfY29ubnRyYWNrX3RjcF91cGRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGNwaCA9ICh2b2lkICopc2tiLT5uaC5pcGggKyBza2ItPm5oLmlwaC0+aWhsKjQ7Ci0JX191MzIgZW5kOwotI2lmZGVmIERFQlVHUF9WQVJTCi0Jc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSAqc2VuZGVyID0gJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXTsKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWyFkaXJdOwotI2VuZGlmCi0KLQllbmQgPSBzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0Y3BoLT5zZXEpLCBza2ItPmxlbiwgaXBoLCB0Y3BoKTsKLQotCXdyaXRlX2xvY2tfYmgoJnRjcF9sb2NrKTsKLQkvKgotCSAqIFdlIGhhdmUgdG8gd29ycnkgZm9yIHRoZSBhY2sgaW4gdGhlIHJlcGx5IHBhY2tldCBvbmx5Li4uCi0JICovCi0JaWYgKGFmdGVyKGVuZCwgY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLnRkX2VuZCkpCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXS50ZF9lbmQgPSBlbmQ7Ci0JY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9lbmQgPSBlbmQ7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JREVCVUdQKCJ0Y3BfdXBkYXRlOiBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWkgIgotCSAgICAgICAicmVjZWl2ZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWlcbiIsCi0JCXNlbmRlci0+dGRfZW5kLCBzZW5kZXItPnRkX21heGVuZCwgc2VuZGVyLT50ZF9tYXh3aW4sCi0JCXNlbmRlci0+dGRfc2NhbGUsCi0JCXJlY2VpdmVyLT50ZF9lbmQsIHJlY2VpdmVyLT50ZF9tYXhlbmQsIHJlY2VpdmVyLT50ZF9tYXh3aW4sCi0JCXJlY2VpdmVyLT50ZF9zY2FsZSk7Ci19Ci0KLSNlbmRpZgotCi0jZGVmaW5lCVRIX0ZJTgkweDAxCi0jZGVmaW5lCVRIX1NZTgkweDAyCi0jZGVmaW5lCVRIX1JTVAkweDA0Ci0jZGVmaW5lCVRIX1BVU0gJMHgwOAotI2RlZmluZQlUSF9BQ0sJMHgxMAotI2RlZmluZQlUSF9VUkcJMHgyMAotI2RlZmluZQlUSF9FQ0UJMHg0MAotI2RlZmluZQlUSF9DV1IJMHg4MAotCi0vKiB0YWJsZSBvZiB2YWxpZCBmbGFnIGNvbWJpbmF0aW9ucyAtIEVDRSBhbmQgQ1dSIGFyZSBhbHdheXMgdmFsaWQgKi8KLXN0YXRpYyBjb25zdCB1OCB0Y3BfdmFsaWRfZmxhZ3NbKFRIX0ZJTnxUSF9TWU58VEhfUlNUfFRIX1BVU0h8VEhfQUNLfFRIX1VSRykgKyAxXSA9Ci17Ci0JW1RIX1NZTl0JCQk9IDEsCi0JW1RIX1NZTnxUSF9QVVNIXQkJPSAxLAotCVtUSF9TWU58VEhfVVJHXQkJCT0gMSwKLQlbVEhfU1lOfFRIX1BVU0h8VEhfVVJHXQkJPSAxLAotCVtUSF9TWU58VEhfQUNLXQkJCT0gMSwKLQlbVEhfU1lOfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAotCVtUSF9SU1RdCQkJPSAxLAotCVtUSF9SU1R8VEhfQUNLXQkJCT0gMSwKLQlbVEhfUlNUfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAotCVtUSF9GSU58VEhfQUNLXQkJCT0gMSwKLQlbVEhfQUNLXQkJCT0gMSwKLQlbVEhfQUNLfFRIX1BVU0hdCQk9IDEsCi0JW1RIX0FDS3xUSF9VUkddCQkJPSAxLAotCVtUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCQk9IDEsCi0JW1RIX0ZJTnxUSF9BQ0t8VEhfUFVTSF0JCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9VUkddCQk9IDEsCi0JW1RIX0ZJTnxUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCT0gMSwKLX07Ci0KLS8qIFByb3RlY3QgY29ubnRyYWNrIGFnYWlzdCBicm9rZW4gcGFja2V0cy4gQ29kZSB0YWtlbiBmcm9tIGlwdF91bmNsZWFuLmMuICAqLwotc3RhdGljIGludCB0Y3BfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JdW5zaWduZWQgaW50IHRjcGxlbiA9IHNrYi0+bGVuIC0gaXBoLT5paGwgKiA0OwotCXVfaW50OF90IHRjcGZsYWdzOwotCi0JLyogU21hbGxlciB0aGF0IG1pbmltYWwgVENQIGhlYWRlcj8gKi8KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkiaXBfY3RfdGNwOiBzaG9ydCBwYWNrZXQgIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIE5vdCB3aG9sZSBUQ1AgaGVhZGVyIG9yIG1hbGZvcm1lZCBwYWNrZXQgKi8KLQlpZiAodGgtPmRvZmYqNCA8IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSB8fCB0Y3BsZW4gPCB0aC0+ZG9mZio0KSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkiaXBfY3RfdGNwOiB0cnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldCAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogQ2hlY2tzdW0gaW52YWxpZD8gSWdub3JlLgotCSAqIFdlIHNraXAgY2hlY2tpbmcgcGFja2V0cyBvbiB0aGUgb3V0Z29pbmcgcGF0aAotCSAqIGJlY2F1c2UgaXQgaXMgYXNzdW1lZCB0byBiZSBjb3JyZWN0LgotCSAqLwotCS8qIEZJWE1FOiBTb3VyY2Ugcm91dGUgSVAgb3B0aW9uIHBhY2tldHMgLS1SUiAqLwotCWlmIChpcF9jb25udHJhY2tfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORyAmJgotCSAgICBuZl9pcF9jaGVja3N1bShza2IsIGhvb2tudW0sIGlwaC0+aWhsICogNCwgSVBQUk9UT19UQ1ApKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF90Y3A6IGJhZCBUQ1AgY2hlY2tzdW0gIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIENoZWNrIFRDUCBmbGFncy4gKi8KLQl0Y3BmbGFncyA9ICgoKHVfaW50OF90ICopdGgpWzEzXSAmIH4oVEhfRUNFfFRIX0NXUikpOwotCWlmICghdGNwX3ZhbGlkX2ZsYWdzW3RjcGZsYWdzXSkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICAiaXBfY3RfdGNwOiBpbnZhbGlkIFRDUCBmbGFnIGNvbWJpbmF0aW9uICIpOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgb3IgLTEgZm9yIGludmFsaWQuICovCi1zdGF0aWMgaW50IHRjcF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQllbnVtIHRjcF9jb25udHJhY2sgbmV3X3N0YXRlLCBvbGRfc3RhdGU7Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXN0cnVjdCB0Y3BoZHIgKnRoLCBfdGNwaDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCAqIDQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlCVUdfT04odGggPT0gTlVMTCk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0Jb2xkX3N0YXRlID0gY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGU7Ci0JZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWluZGV4ID0gZ2V0X2Nvbm50cmFja19pbmRleCh0aCk7Ci0JbmV3X3N0YXRlID0gdGNwX2Nvbm50cmFja3NbZGlyXVtpbmRleF1bb2xkX3N0YXRlXTsKLQotCXN3aXRjaCAobmV3X3N0YXRlKSB7Ci0JY2FzZSBUQ1BfQ09OTlRSQUNLX0lHTk9SRToKLQkJLyogSWdub3JlZCBwYWNrZXRzOgotCQkgKgotCQkgKiBhKSBTWU4gaW4gT1JJR0lOQUwKLQkJICogYikgU1lOL0FDSyBpbiBSRVBMWQotCQkgKiBjKSBBQ0sgaW4gcmVwbHkgZGlyZWN0aW9uIGFmdGVyIGluaXRpYWwgU1lOIGluIG9yaWdpbmFsLgotCQkgKi8KLQkJaWYgKGluZGV4ID09IFRDUF9TWU5BQ0tfU0VUCi0JCSAgICAmJiBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID09IFRDUF9TWU5fU0VUCi0JCSAgICAmJiBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2RpciAhPSBkaXIKLQkJICAgICYmIG50b2hsKHRoLT5hY2tfc2VxKSA9PQotCQkJICAgICBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCkgewotCQkJLyogVGhpcyBTWU4vQUNLIGFja25vd2xlZGdlcyBhIFNZTiB0aGF0IHdlIGVhcmxpZXIKLQkJCSAqIGlnbm9yZWQgYXMgaW52YWxpZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnQgYW5kCi0JCQkgKiB0aGUgc2VydmVyIGFyZSBib3RoIGluIHN5bmMsIHdoaWxlIHRoZSBmaXJld2FsbCBpcwotCQkJICogbm90LiBXZSBraWxsIHRoaXMgc2Vzc2lvbiBhbmQgYmxvY2sgdGhlIFNZTi9BQ0sgc28KLQkJCSAqIHRoYXQgdGhlIGNsaWVudCBjYW5ub3QgYnV0IHJldHJhbnNtaXQgaXRzIFNZTiBhbmQKLQkJCSAqIHRodXMgaW5pdGlhdGUgYSBjbGVhbiBuZXcgc2Vzc2lvbi4KLQkJCSAqLwotCQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQotCQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLAotCQkJCQkgICAgICBOVUxMLCAiaXBfY3RfdGNwOiAiCi0JCQkJCSAgICAgICJraWxsaW5nIG91dCBvZiBzeW5jIHNlc3Npb24gIik7Ci0JCQlpZiAoZGVsX3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQpKQotCQkJCWNvbm50cmFjay0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZykKLQkJCQkJCQkgICAgY29ubnRyYWNrKTsKLQkJCXJldHVybiAtTkZfRFJPUDsKLQkJfQotCQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID0gaW5kZXg7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZGlyID0gZGlyOwotCQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X3NlcSA9IG50b2hsKHRoLT5zZXEpOwotCQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCA9Ci0JCSAgICBzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0aC0+c2VxKSwgc2tiLT5sZW4sIGlwaCwgdGgpOwotCi0JCXdyaXRlX3VubG9ja19iaCgmdGNwX2xvY2spOwotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICAiaXBfY3RfdGNwOiBpbnZhbGlkIHBhY2tldCBpZ25vcmVkICIpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCWNhc2UgVENQX0NPTk5UUkFDS19NQVg6Ci0JCS8qIEludmFsaWQgcGFja2V0ICovCi0JCURFQlVHUCgiaXBfY3RfdGNwOiBJbnZhbGlkIGRpcj0laSBpbmRleD0ldSBvc3RhdGU9JXVcbiIsCi0JCSAgICAgICBkaXIsIGdldF9jb25udHJhY2tfaW5kZXgodGgpLAotCQkgICAgICAgb2xkX3N0YXRlKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF90Y3A6IGludmFsaWQgc3RhdGUgIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCWNhc2UgVENQX0NPTk5UUkFDS19TWU5fU0VOVDoKLQkJaWYgKG9sZF9zdGF0ZSA8IFRDUF9DT05OVFJBQ0tfVElNRV9XQUlUKQotCQkJYnJlYWs7Ci0JCWlmICgoY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLmZsYWdzICYKLQkJCSBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUKQotCQkgICAgfHwgYWZ0ZXIobnRvaGwodGgtPnNlcSksCi0JCQkgICAgIGNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXS50ZF9lbmQpKSB7Ci0JCQkvKiBBdHRlbXB0IHRvIHJlb3BlbiBhIGNsb3NlZCBjb25uZWN0aW9uLgotCQkJKiBEZWxldGUgdGhpcyBjb25uZWN0aW9uIGFuZCBsb29rIHVwIGFnYWluLiAqLwotCQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCQlpZiAoZGVsX3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQpKQotCQkJCWNvbm50cmFjay0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZykKLQkJCQkJCQkgICAgY29ubnRyYWNrKTsKLQkJCXJldHVybiAtTkZfUkVQRUFUOwotCQl9IGVsc2UgewotCQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQotCQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLAotCQkJCQkgICAgICBOVUxMLCAiaXBfY3RfdGNwOiBpbnZhbGlkIFNZTiIpOwotCQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JCX0KLQljYXNlIFRDUF9DT05OVFJBQ0tfQ0xPU0U6Ci0JCWlmIChpbmRleCA9PSBUQ1BfUlNUX1NFVAotCQkgICAgJiYgKCh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjb25udHJhY2stPnN0YXR1cykKLQkJCSAmJiBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID09IFRDUF9TWU5fU0VUKQotCQkJfHwgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykKLQkJCSAgICAmJiBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID09IFRDUF9BQ0tfU0VUKSkKLQkJICAgICYmIG50b2hsKHRoLT5hY2tfc2VxKSA9PSBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCkgewotCQkJLyogUlNUIHNlbnQgdG8gaW52YWxpZCBTWU4gb3IgQUNLIHdlIGhhZCBsZXQgdGhyb3VnaAotCQkJICogYXQgYSkgYW5kIGMpIGFib3ZlOgotCQkJICoKLQkJCSAqIGEpIFNZTiB3YXMgaW4gd2luZG93IHRoZW4KLQkJCSAqIGMpIHdlIGhvbGQgYSBoYWxmLW9wZW4gY29ubmVjdGlvbi4KLQkJCSAqCi0JCQkgKiBEZWxldGUgb3VyIGNvbm5lY3Rpb24gZW50cnkuCi0JCQkgKiBXZSBza2lwIHdpbmRvdyBjaGVja2luZywgYmVjYXVzZSBwYWNrZXQgbWlnaHQgQUNLCi0JCQkgKiBzZWdtZW50cyB3ZSBpZ25vcmVkLiAqLwotCQkJZ290byBpbl93aW5kb3c7Ci0JCX0KLQkJLyogSnVzdCBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCQkvKiBLZWVwIGNvbXBpbGVycyBoYXBweS4gKi8KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCF0Y3BfaW5fd2luZG93KCZjb25udHJhY2stPnByb3RvLnRjcCwgZGlyLCBpbmRleCwKLQkJCSAgIHNrYiwgaXBoLCB0aCkpIHsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLSAgICBpbl93aW5kb3c6Ci0JLyogRnJvbSBub3cgb24gd2UgaGF2ZSBnb3QgaW4td2luZG93IHBhY2tldHMgKi8KLQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID0gaW5kZXg7Ci0KLQlERUJVR1AoInRjcF9jb25udHJhY2tzOiBzcmM9JXUuJXUuJXUuJXU6JWh1IGRzdD0ldS4ldS4ldS4ldTolaHUgIgotCSAgICAgICAic3luPSVpIGFjaz0laSBmaW49JWkgcnN0PSVpIG9sZD0laSBuZXc9JWlcbiIsCi0JCU5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAotCQlOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyh0aC0+ZGVzdCksCi0JCSh0aC0+c3luID8gMSA6IDApLCAodGgtPmFjayA/IDEgOiAwKSwKLQkJKHRoLT5maW4gPyAxIDogMCksICh0aC0+cnN0ID8gMSA6IDApLAotCQlvbGRfc3RhdGUsIG5ld19zdGF0ZSk7Ci0KLQljb25udHJhY2stPnByb3RvLnRjcC5zdGF0ZSA9IG5ld19zdGF0ZTsKLQlpZiAob2xkX3N0YXRlICE9IG5ld19zdGF0ZQotCSAgICAmJiAobmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfRklOX1dBSVQKLQkJfHwgbmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfQ0xPU0UpKQotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuW2Rpcl0uZmxhZ3MgfD0gSVBfQ1RfVENQX0ZMQUdfQ0xPU0VfSU5JVDsKLQl0aW1lb3V0ID0gY29ubnRyYWNrLT5wcm90by50Y3AucmV0cmFucyA+PSBpcF9jdF90Y3BfbWF4X3JldHJhbnMKLQkJICAmJiAqdGNwX3RpbWVvdXRzW25ld19zdGF0ZV0gPiBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucwotCQkgID8gaXBfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgOiAqdGNwX3RpbWVvdXRzW25ld19zdGF0ZV07Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0KLQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUsIHNrYik7Ci0JaWYgKG5ld19zdGF0ZSAhPSBvbGRfc3RhdGUpCi0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GTywgc2tiKTsKLQotCWlmICghdGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpKSB7Ci0JCS8qIElmIG9ubHkgcmVwbHkgaXMgYSBSU1QsIHdlIGNhbiBjb25zaWRlciBvdXJzZWx2ZXMgbm90IHRvCi0JCSAgIGhhdmUgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbjogdGhpcyBpcyBhIGZhaXJseSBjb21tb24KLQkJICAgcHJvYmxlbSBjYXNlLCBzbyB3ZSBjYW4gZGVsZXRlIHRoZSBjb25udHJhY2sKLQkJICAgaW1tZWRpYXRlbHkuICAtLVJSICovCi0JCWlmICh0aC0+cnN0KSB7Ci0JCQlpZiAoZGVsX3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQpKQotCQkJCWNvbm50cmFjay0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZykKLQkJCQkJCQkgICAgY29ubnRyYWNrKTsKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCX0KLQl9IGVsc2UgaWYgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykKLQkJICAgJiYgKG9sZF9zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWCi0JCSAgICAgICB8fCBvbGRfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCkKLQkJICAgJiYgbmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQpIHsKLQkJLyogU2V0IEFTU1VSRUQgaWYgd2Ugc2VlIHNlZSB2YWxpZCBhY2sgaW4gRVNUQUJMSVNIRUQKLQkJICAgYWZ0ZXIgU1lOX1JFQ1Ygb3IgYSB2YWxpZCBhbnN3ZXIgZm9yIGEgcGlja2VkIHVwCi0JCSAgIGNvbm5lY3Rpb24uICovCi0JCXNldF9iaXQoSVBTX0FTU1VSRURfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIHNrYik7Ci0JfQotCWlwX2N0X3JlZnJlc2hfYWNjdChjb25udHJhY2ssIGN0aW5mbywgc2tiLCB0aW1lb3V0KTsKLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCi1zdGF0aWMgaW50IHRjcF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWVudW0gdGNwX2Nvbm50cmFjayBuZXdfc3RhdGU7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgdGNwaGRyICp0aCwgX3RjcGg7Ci0jaWZkZWYgREVCVUdQX1ZBUlMKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzZW5kZXIgPSAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXTsKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdOwotI2VuZGlmCi0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCUJVR19PTih0aCA9PSBOVUxMKTsKLQotCS8qIERvbid0IG5lZWQgbG9jayBoZXJlOiB0aGlzIGNvbm50cmFjayBub3QgaW4gY2lyY3VsYXRpb24geWV0ICovCi0JbmV3X3N0YXRlCi0JCT0gdGNwX2Nvbm50cmFja3NbMF1bZ2V0X2Nvbm50cmFja19pbmRleCh0aCldCi0JCVtUQ1BfQ09OTlRSQUNLX05PTkVdOwotCi0JLyogSW52YWxpZDogZGVsZXRlIGNvbm50cmFjayAqLwotCWlmIChuZXdfc3RhdGUgPj0gVENQX0NPTk5UUkFDS19NQVgpIHsKLQkJREVCVUdQKCJpcF9jdF90Y3A6IGludmFsaWQgbmV3IGRlbGV0aW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChuZXdfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19TWU5fU0VOVCkgewotCQkvKiBTWU4gcGFja2V0ICovCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfZW5kID0KLQkJCXNlZ21lbnRfc2VxX3BsdXNfbGVuKG50b2hsKHRoLT5zZXEpLCBza2ItPmxlbiwKLQkJCQkJICAgICBpcGgsIHRoKTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPSBudG9ocyh0aC0+d2luZG93KTsKLQkJaWYgKGNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID09IDApCi0JCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9IDE7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4ZW5kID0KLQkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfZW5kOwotCi0JCXRjcF9vcHRpb25zKHNrYiwgaXBoLCB0aCwgJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0pOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gMDsKLQl9IGVsc2UgaWYgKGlwX2N0X3RjcF9sb29zZSA9PSAwKSB7Ci0JCS8qIERvbid0IHRyeSB0byBwaWNrIHVwIGNvbm5lY3Rpb25zLiAqLwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbm5lY3Rpb24sCi0JCSAqIGl0cyBoaXN0b3J5IGlzIGxvc3QgZm9yIHVzLgotCQkgKiBMZXQncyB0cnkgdG8gdXNlIHRoZSBkYXRhIGZyb20gdGhlIHBhY2tldC4KLQkJICovCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfZW5kID0KLQkJCXNlZ21lbnRfc2VxX3BsdXNfbGVuKG50b2hsKHRoLT5zZXEpLCBza2ItPmxlbiwKLQkJCQkJICAgICBpcGgsIHRoKTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPSBudG9ocyh0aC0+d2luZG93KTsKLQkJaWYgKGNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID09IDApCi0JCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9IDE7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4ZW5kID0KLQkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfZW5kICsKLQkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX3NjYWxlID0gMDsKLQotCQkvKiBXZSBhc3N1bWUgU0FDSyBhbmQgbGliZXJhbCB3aW5kb3cgY2hlY2tpbmcgdG8gaGFuZGxlCi0JCSAqIHdpbmRvdyBzY2FsaW5nICovCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0uZmxhZ3MgPQotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNIHwKLQkJCQkJCSAgICAgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTDsKLQl9Ci0KLQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLnRkX2VuZCA9IDA7Ci0JY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9tYXhlbmQgPSAwOwotCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfbWF4d2luID0gMTsKLQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLnRkX3NjYWxlID0gMDsKLQotCS8qIHRjcF9wYWNrZXQgd2lsbCBzZXQgdGhlbSAqLwotCWNvbm50cmFjay0+cHJvdG8udGNwLnN0YXRlID0gVENQX0NPTk5UUkFDS19OT05FOwotCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPSBUQ1BfTk9ORV9TRVQ7Ci0KLQlERUJVR1AoInRjcF9uZXc6IHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laSAiCi0JICAgICAgICJyZWNlaXZlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laVxuIiwKLQkJc2VuZGVyLT50ZF9lbmQsIHNlbmRlci0+dGRfbWF4ZW5kLCBzZW5kZXItPnRkX21heHdpbiwKLQkJc2VuZGVyLT50ZF9zY2FsZSwKLQkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKLQkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfdGNwID0KLXsKLQkucHJvdG8gCQkJPSBJUFBST1RPX1RDUCwKLQkubmFtZSAJCQk9ICJ0Y3AiLAotCS5wa3RfdG9fdHVwbGUgCQk9IHRjcF9wa3RfdG9fdHVwbGUsCi0JLmludmVydF90dXBsZSAJCT0gdGNwX2ludmVydF90dXBsZSwKLQkucHJpbnRfdHVwbGUgCQk9IHRjcF9wcmludF90dXBsZSwKLQkucHJpbnRfY29ubnRyYWNrIAk9IHRjcF9wcmludF9jb25udHJhY2ssCi0JLnBhY2tldCAJCT0gdGNwX3BhY2tldCwKLQkubmV3IAkJCT0gdGNwX25ldywKLQkuZXJyb3IJCQk9IHRjcF9lcnJvciwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkudG9fbmZhdHRyCQk9IHRjcF90b19uZmF0dHIsCi0JLmZyb21fbmZhdHRyCQk9IG5mYXR0cl90b190Y3AsCi0JLnR1cGxlX3RvX25mYXR0cgk9IGlwX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fdHVwbGUJPSBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMzMGM2Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotCi11bnNpZ25lZCBpbnQgaXBfY3RfdWRwX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwKkhaOwotdW5zaWduZWQgaW50IGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbSBfX3JlYWRfbW9zdGx5ID0gMTgwKkhaOwotCi1zdGF0aWMgaW50IHVkcF9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhwOwotCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKLQlpZiAoaHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQl0dXBsZS0+c3JjLnUudWRwLnBvcnQgPSBocC0+c291cmNlOwotCXR1cGxlLT5kc3QudS51ZHAucG9ydCA9IGhwLT5kZXN0OwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdWRwX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCXR1cGxlLT5zcmMudS51ZHAucG9ydCA9IG9yaWctPmRzdC51LnVkcC5wb3J0OwotCXR1cGxlLT5kc3QudS51ZHAucG9ydCA9IG9yaWctPnNyYy51LnVkcC5wb3J0OwotCXJldHVybiAxOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KLXN0YXRpYyBpbnQgdWRwX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiBzZXFfcHJpbnRmKHMsICJzcG9ydD0laHUgZHBvcnQ9JWh1ICIsCi0JCQkgIG50b2hzKHR1cGxlLT5zcmMudS51ZHAucG9ydCksCi0JCQkgIG50b2hzKHR1cGxlLT5kc3QudS51ZHAucG9ydCkpOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgY29ubnRyYWNrLiAqLwotc3RhdGljIGludCB1ZHBfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBhbmQgbWF5IG1vZGlmeSBjb25udHJhY2t0eXBlICovCi1zdGF0aWMgaW50IHVkcF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQkvKiBJZiB3ZSd2ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzLCB0aGlzIGlzIHNvbWUga2luZCBvZiBVRFAKLQkgICBzdHJlYW0uICBFeHRlbmQgdGltZW91dC4gKi8KLQlpZiAodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpKSB7Ci0JCWlwX2N0X3JlZnJlc2hfYWNjdChjb25udHJhY2ssIGN0aW5mbywgc2tiLAotCQkJCSAgIGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbSk7Ci0JCS8qIEFsc28sIG1vcmUgbGlrZWx5IHRvIGJlIGltcG9ydGFudCwgYW5kIG5vdCBhIHByb2JlICovCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykpCi0JCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIHNrYik7Ci0JfSBlbHNlCi0JCWlwX2N0X3JlZnJlc2hfYWNjdChjb25udHJhY2ssIGN0aW5mbywgc2tiLCBpcF9jdF91ZHBfdGltZW91dCk7Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLwotc3RhdGljIGludCB1ZHBfbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1ZHBfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAotCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0JdW5zaWduZWQgaW50IHVkcGxlbiA9IHNrYi0+bGVuIC0gaXBoLT5paGwgKiA0OwotCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhkcjsKLQotCS8qIEhlYWRlciBpcyB0b28gc21hbGw/ICovCi0JaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7Ci0JaWYgKGhkciA9PSBOVUxMKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1VEUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF91ZHA6IHNob3J0IHBhY2tldCAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogVHJ1bmNhdGVkL21hbGZvcm1lZCBwYWNrZXRzICovCi0JaWYgKG50b2hzKGhkci0+bGVuKSA+IHVkcGxlbiB8fCBudG9ocyhoZHItPmxlbikgPCBzaXplb2YoKmhkcikpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVURQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgImlwX2N0X3VkcDogdHJ1bmNhdGVkL21hbGZvcm1lZCBwYWNrZXQgIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIFBhY2tldCB3aXRoIG5vIGNoZWNrc3VtICovCi0JaWYgKCFoZHItPmNoZWNrKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyogQ2hlY2tzdW0gaW52YWxpZD8gSWdub3JlLgotCSAqIFdlIHNraXAgY2hlY2tpbmcgcGFja2V0cyBvbiB0aGUgb3V0Z29pbmcgcGF0aAotCSAqIGJlY2F1c2UgdGhlIGNoZWNrc3VtIGlzIGFzc3VtZWQgdG8gYmUgY29ycmVjdC4KLQkgKiBGSVhNRTogU291cmNlIHJvdXRlIElQIG9wdGlvbiBwYWNrZXRzIC0tUlIgKi8KLQlpZiAoaXBfY29ubnRyYWNrX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgJiYKLQkgICAgbmZfaXBfY2hlY2tzdW0oc2tiLCBob29rbnVtLCBpcGgtPmlobCAqIDQsIElQUFJPVE9fVURQKSkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICAiaXBfY3RfdWRwOiBiYWQgVURQIGNoZWNrc3VtICIpOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19wcm90b2NvbF91ZHAgPQotewotCS5wcm90byAJCQk9IElQUFJPVE9fVURQLAotCS5uYW1lCQkJPSAidWRwIiwKLQkucGt0X3RvX3R1cGxlCQk9IHVkcF9wa3RfdG9fdHVwbGUsCi0JLmludmVydF90dXBsZQkJPSB1ZHBfaW52ZXJ0X3R1cGxlLAotCS5wcmludF90dXBsZQkJPSB1ZHBfcHJpbnRfdHVwbGUsCi0JLnByaW50X2Nvbm50cmFjawk9IHVkcF9wcmludF9jb25udHJhY2ssCi0JLnBhY2tldAkJCT0gdWRwX3BhY2tldCwKLQkubmV3CQkJPSB1ZHBfbmV3LAotCS5lcnJvcgkJCT0gdWRwX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS50dXBsZV90b19uZmF0dHIJPSBpcF9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKLQkubmZhdHRyX3RvX3R1cGxlCT0gaXBfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5YTk2Mi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qIFNJUCBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgotICogKEMpIDIwMDUgYnkgQ2hyaXN0aWFuIEhlbnRzY2hlbCA8Y2hlbnRzY2hlbEBhcm5ldC5jb20uYXI+Ci0gKiBiYXNlZCBvbiBSUidzIGlwX2Nvbm50cmFja19mdHAuYyBhbmQgb3RoZXIgbW9kdWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gSGVudHNjaGVsIDxjaGVudHNjaGVsQGFybmV0LmNvbS5hcj4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0lQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7Ci0KLSNkZWZpbmUgTUFYX1BPUlRTCTgKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tNQVhfUE9SVFNdOwotc3RhdGljIGludCBwb3J0c19jOwotbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCB1c2hvcnQsICZwb3J0c19jLCAwNDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJwb3J0IG51bWJlcnMgb2Ygc2lwIHNlcnZlcnMiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBzaXBfdGltZW91dCA9IFNJUF9USU1FT1VUOwotbW9kdWxlX3BhcmFtKHNpcF90aW1lb3V0LCB1aW50LCAwNjAwKTsKLU1PRFVMRV9QQVJNX0RFU0Moc2lwX3RpbWVvdXQsICJ0aW1lb3V0IGZvciB0aGUgbWFzdGVyIFNJUCBzZXNzaW9uIik7Ci0KLXVuc2lnbmVkIGludCAoKmlwX25hdF9zaXBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCWNvbnN0IGNoYXIgKipkcHRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9zaXBfaG9vayk7Ci0KLXVuc2lnbmVkIGludCAoKmlwX25hdF9zZHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAsCi0JCQkJY29uc3QgY2hhciAqZHB0cik7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfc2RwX2hvb2spOwotCi1zdGF0aWMgaW50IGRpZ2l0c19sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpOwotc3RhdGljIGludCBlcGFkZHJfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KTsKLXN0YXRpYyBpbnQgc2twX2RpZ2l0c19sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpOwotc3RhdGljIGludCBza3BfZXBhZGRyX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7Ci0KLXN0cnVjdCBzaXBfaGVhZGVyX25mbyB7Ci0JY29uc3QgY2hhcgkqbG5hbWU7Ci0JY29uc3QgY2hhcgkqc25hbWU7Ci0JY29uc3QgY2hhcgkqbG5fc3RyOwotCXNpemVfdAkJbG5sZW47Ci0Jc2l6ZV90CQlzbmxlbjsKLQlzaXplX3QJCWxuX3N0cmxlbjsKLQlpbnQJCWNhc2Vfc2Vuc2l0aXZlOwotCWludAkJKCptYXRjaF9sZW4pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNpcF9oZWFkZXJfbmZvIGN0X3NpcF9oZHJzW10gPSB7Ci0JW1BPU19SRUdfUkVRX1VSSV0gPSB7IAkvKiBTSVAgUkVHSVNURVIgcmVxdWVzdCBVUkkgKi8KLQkJLmxuYW1lCQk9ICJzaXA6IiwKLQkJLmxubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiOiIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIjoiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCi0JfSwKLQlbUE9TX1JFUV9VUkldID0geyAJLyogU0lQIHJlcXVlc3QgVVJJICovCi0JCS5sbmFtZQkJPSAic2lwOiIsCi0JCS5sbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsCi0JCS5sbl9zdHIJCT0gIkAiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJAIikgLSAxLAotCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgotCX0sCi0JW1BPU19GUk9NXSA9IHsJCS8qIFNJUCBGcm9tIGhlYWRlciAqLwotCQkubG5hbWUJCT0gIkZyb206IiwKLQkJLmxubGVuCQk9IHNpemVvZigiRnJvbToiKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJcbmY6IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJcbmY6IikgLSAxLAotCQkubG5fc3RyCQk9ICJzaXA6IiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuLAotCX0sCi0JW1BPU19UT10gPSB7CQkvKiBTSVAgVG8gaGVhZGVyICovCi0JCS5sbmFtZQkJPSAiVG86IiwKLQkJLmxubGVuCQk9IHNpemVvZigiVG86IikgLSAxLAotCQkuc25hbWUJCT0gIlxyXG50OiIsCi0JCS5zbmxlbgkJPSBzaXplb2YoIlxyXG50OiIpIC0gMSwKLQkJLmxuX3N0cgkJPSAic2lwOiIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoInNpcDoiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBza3BfZXBhZGRyX2xlbiwKLQl9LAotCVtQT1NfVklBXSA9IHsgCQkvKiBTSVAgVmlhIGhlYWRlciAqLwotCQkubG5hbWUJCT0gIlZpYToiLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJWaWE6IikgLSAxLAotCQkuc25hbWUJCT0gIlxyXG52OiIsCi0JCS5zbmxlbgkJPSBzaXplb2YoIlxyXG52OiIpIC0gMSwgLyogcmZjMzI2MSAiXHJcbiIgKi8KLQkJLmxuX3N0cgkJPSAiVURQICIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIlVEUCAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuLAotCX0sCi0JW1BPU19DT05UQUNUXSA9IHsgCS8qIFNJUCBDb250YWN0IGhlYWRlciAqLwotCQkubG5hbWUJCT0gIkNvbnRhY3Q6IiwKLQkJLmxubGVuCQk9IHNpemVvZigiQ29udGFjdDoiKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJcbm06IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJcbm06IikgLSAxLAotCQkubG5fc3RyCQk9ICJzaXA6IiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuCi0JfSwKLQlbUE9TX0NPTlRFTlRdID0geyAJLyogU0lQIENvbnRlbnQgbGVuZ3RoIGhlYWRlciAqLwotCQkubG5hbWUJCT0gIkNvbnRlbnQtTGVuZ3RoOiIsCi0JCS5sbmxlbgkJPSBzaXplb2YoIkNvbnRlbnQtTGVuZ3RoOiIpIC0gMSwKLQkJLnNuYW1lCQk9ICJcclxubDoiLAotCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxubDoiKSAtIDEsCi0JCS5sbl9zdHIJCT0gIjoiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI6IikgLSAxLAotCQkubWF0Y2hfbGVuCT0gc2twX2RpZ2l0c19sZW4KLQl9LAotCVtQT1NfTUVESUFdID0gewkJLyogU0RQIG1lZGlhIGluZm8gKi8KLQkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKLQkJLmxuYW1lCQk9ICJcbm09IiwKLQkJLmxubGVuCQk9IHNpemVvZigiXG5tPSIpIC0gMSwKLQkJLnNuYW1lCQk9ICJccm09IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJtPSIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiYXVkaW8gIiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigiYXVkaW8gIikgLSAxLAotCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgotCX0sCi0JW1BPU19PV05FUl0gPSB7IAkvKiBTRFAgb3duZXIgYWRkcmVzcyovCi0JCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCi0JCS5sbmFtZQkJPSAiXG5vPSIsCi0JCS5sbmxlbgkJPSBzaXplb2YoIlxubz0iKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJvPSIsCi0JCS5zbmxlbgkJPSBzaXplb2YoIlxybz0iKSAtIDEsCi0JCS5sbl9zdHIJCT0gIklOIElQNCAiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJJTiBJUDQgIikgLSAxLAotCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgotCX0sCi0JW1BPU19DT05ORUNUSU9OXSA9IHsgCS8qIFNEUCBjb25uZWN0aW9uIGluZm8gKi8KLQkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKLQkJLmxuYW1lCQk9ICJcbmM9IiwKLQkJLmxubGVuCQk9IHNpemVvZigiXG5jPSIpIC0gMSwKLQkJLnNuYW1lCQk9ICJccmM9IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJjPSIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiSU4gSVA0ICIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNCAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCi0JfSwKLQlbUE9TX1NEUF9IRUFERVJdID0geyAJLyogU0RQIHZlcnNpb24gaGVhZGVyICovCi0JCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCi0JCS5sbmFtZQkJPSAiXG52PSIsCi0JCS5sbmxlbgkJPSBzaXplb2YoIlxudj0iKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJ2PSIsCi0JCS5zbmxlbgkJPSBzaXplb2YoIlxydj0iKSAtIDEsCi0JCS5sbl9zdHIJCT0gIj0iLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI9IikgLSAxLAotCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgotCX0KLX07Ci0KLS8qIGdldCBsaW5lIGxlbmdodCB1bnRpbCBmaXJzdCBDUiBvciBMRiBzZWVuLiAqLwotaW50IGN0X3NpcF9sbmxlbihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpsaW1pdCkKLXsKLQljb25zdCBjaGFyICprID0gbGluZTsKLQotCXdoaWxlICgobGluZSA8PSBsaW1pdCkgJiYgKCpsaW5lID09ICdccicgfHwgKmxpbmUgPT0gJ1xuJykpCi0JCWxpbmUrKzsKLQotCXdoaWxlIChsaW5lIDw9IGxpbWl0KSB7Ci0JCWlmICgqbGluZSA9PSAnXHInIHx8ICpsaW5lID09ICdcbicpCi0JCQlicmVhazsKLQkJbGluZSsrOwotCX0KLQlyZXR1cm4gbGluZSAtIGs7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfbG5sZW4pOwotCi0vKiBMaW5lYXIgc3RyaW5nIHNlYXJjaCwgY2FzZSBzZW5zaXRpdmUuICovCi1jb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCi0JCQkgIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAotCQkJICBpbnQgY2FzZV9zZW5zaXRpdmUpCi17Ci0JY29uc3QgY2hhciAqbGltaXQgPSBoYXlzdGFjayArIChoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuKTsKLQotCXdoaWxlIChoYXlzdGFjayA8PSBsaW1pdCkgewotCQlpZiAoY2FzZV9zZW5zaXRpdmUpIHsKLQkJCWlmIChzdHJuY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCi0JCQkJcmV0dXJuIGhheXN0YWNrOwotCQl9IGVsc2UgewotCQkJaWYgKHN0cm5pY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCi0JCQkJcmV0dXJuIGhheXN0YWNrOwotCQl9Ci0JCWhheXN0YWNrKys7Ci0JfQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY3Rfc2lwX3NlYXJjaCk7Ci0KLXN0YXRpYyBpbnQgZGlnaXRzX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCkKLXsKLQlpbnQgbGVuID0gMDsKLQl3aGlsZSAoZHB0ciA8PSBsaW1pdCAmJiBpc2RpZ2l0KCpkcHRyKSkgewotCQlkcHRyKys7Ci0JCWxlbisrOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi0vKiBnZXQgZGlnaXRzIGxlbmdodCwgc2tpcGluZyBibGFuayBzcGFjZXMuICovCi1zdGF0aWMgaW50IHNrcF9kaWdpdHNfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQotewotCWZvciAoOyBkcHRyIDw9IGxpbWl0ICYmICpkcHRyID09ICcgJzsgZHB0cisrKQotCQkoKnNoaWZ0KSsrOwotCi0JcmV0dXJuIGRpZ2l0c19sZW4oZHB0ciwgbGltaXQsIHNoaWZ0KTsKLX0KLQotLyogU2ltcGxlIGlwYWRkciBwYXJzZXIuLiAqLwotc3RhdGljIGludCBwYXJzZV9pcGFkZHIoY29uc3QgY2hhciAqY3AsCWNvbnN0IGNoYXIgKiplbmRwLAotCQkJX19iZTMyICppcGFkZHIsIGNvbnN0IGNoYXIgKmxpbWl0KQotewotCXVuc2lnbmVkIGxvbmcgaW50IHZhbDsKLQlpbnQgaSwgZGlnaXQgPSAwOwotCi0JZm9yIChpID0gMCwgKmlwYWRkciA9IDA7IGNwIDw9IGxpbWl0ICYmIGkgPCA0OyBpKyspIHsKLQkJZGlnaXQgPSAwOwotCQlpZiAoIWlzZGlnaXQoKmNwKSkKLQkJCWJyZWFrOwotCi0JCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAoY2hhciAqKikmY3AsIDEwKTsKLQkJaWYgKHZhbCA+IDB4RkYpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJKCh1X2ludDhfdCAqKWlwYWRkcilbaV0gPSB2YWw7Ci0JCWRpZ2l0ID0gMTsKLQotCQlpZiAoKmNwICE9ICcuJykKLQkJCWJyZWFrOwotCQljcCsrOwotCX0KLQlpZiAoIWRpZ2l0KQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoZW5kcCkKLQkJKmVuZHAgPSBjcDsKLQotCXJldHVybiAwOwotfQotCi0vKiBza2lwIGlwIGFkZHJlc3MuIHJldHVybnMgaXQgbGVuZ2h0LiAqLwotc3RhdGljIGludCBlcGFkZHJfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQotewotCWNvbnN0IGNoYXIgKmF1eCA9IGRwdHI7Ci0JX19iZTMyIGlwOwotCi0JaWYgKHBhcnNlX2lwYWRkcihkcHRyLCAmZHB0ciwgJmlwLCBsaW1pdCkgPCAwKSB7Ci0JCURFQlVHUCgiaXA6ICVzIHBhcnNlIGZhaWxlZC4hXG4iLCBkcHRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogUG9ydCBudW1iZXIgKi8KLQlpZiAoKmRwdHIgPT0gJzonKSB7Ci0JCWRwdHIrKzsKLQkJZHB0ciArPSBkaWdpdHNfbGVuKGRwdHIsIGxpbWl0LCBzaGlmdCk7Ci0JfQotCXJldHVybiBkcHRyIC0gYXV4OwotfQotCi0vKiBnZXQgYWRkcmVzcyBsZW5ndGgsIHNraXBpbmcgdXNlciBpbmZvLiAqLwotc3RhdGljIGludCBza3BfZXBhZGRyX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCkKLXsKLQlpbnQgcyA9ICpzaGlmdDsKLQotCS8qIFNlYXJjaCBmb3IgQCwgYnV0IHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4KLQkgKiBXZSBhcmUgaW5zaWRlIGEgc2lwOiBVUkksIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKLQkgKiBjb250aW51YXRpb24gbGluZXMuICovCi0Jd2hpbGUgKGRwdHIgPD0gbGltaXQgJiYKLQkgICAgICAgKmRwdHIgIT0gJ0AnICYmICpkcHRyICE9ICdccicgJiYgKmRwdHIgIT0gJ1xuJykgewotCQkoKnNoaWZ0KSsrOwotCQlkcHRyKys7Ci0JfQotCi0JaWYgKGRwdHIgPD0gbGltaXQgJiYgKmRwdHIgPT0gJ0AnKSB7Ci0JCWRwdHIrKzsKLQkJKCpzaGlmdCkrKzsKLQl9IGVsc2UKLQkJKnNoaWZ0ID0gczsKLQotCXJldHVybiBlcGFkZHJfbGVuKGRwdHIsIGxpbWl0LCBzaGlmdCk7Ci19Ci0KLS8qIFJldHVybnMgMCBpZiBub3QgZm91bmQsIC0xIGVycm9yIHBhcnNpbmcuICovCi1pbnQgY3Rfc2lwX2dldF9pbmZvKGNvbnN0IGNoYXIgKmRwdHIsIHNpemVfdCBkbGVuLAotCQkgICAgdW5zaWduZWQgaW50ICptYXRjaG9mZiwKLQkJICAgIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCi0JCSAgICBlbnVtIHNpcF9oZWFkZXJfcG9zIHBvcykKLXsKLQlzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8gPSAmY3Rfc2lwX2hkcnNbcG9zXTsKLQljb25zdCBjaGFyICpsaW1pdCwgKmF1eCwgKmsgPSBkcHRyOwotCWludCBzaGlmdCA9IDA7Ci0KLQlsaW1pdCA9IGRwdHIgKyAoZGxlbiAtIGhuZm8tPmxubGVuKTsKLQotCXdoaWxlIChkcHRyIDw9IGxpbWl0KSB7Ci0JCWlmICgoc3RybmNtcChkcHRyLCBobmZvLT5sbmFtZSwgaG5mby0+bG5sZW4pICE9IDApICYmCi0JCSAgICAoaG5mby0+c25hbWUgPT0gTlVMTCB8fAotCQkgICAgIHN0cm5jbXAoZHB0ciwgaG5mby0+c25hbWUsIGhuZm8tPnNubGVuKSAhPSAwKSkgewotCQkJZHB0cisrOwotCQkJY29udGludWU7Ci0JCX0KLQkJYXV4ID0gY3Rfc2lwX3NlYXJjaChobmZvLT5sbl9zdHIsIGRwdHIsIGhuZm8tPmxuX3N0cmxlbiwKLQkJCQkgICAgY3Rfc2lwX2xubGVuKGRwdHIsIGxpbWl0KSwKLQkJCQkgICAgaG5mby0+Y2FzZV9zZW5zaXRpdmUpOwotCQlpZiAoIWF1eCkgewotCQkJREVCVUdQKCInJXMnIG5vdCBmb3VuZCBpbiAnJXMnLlxuIiwgaG5mby0+bG5fc3RyLAotCQkJICAgICAgIGhuZm8tPmxuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhdXggKz0gaG5mby0+bG5fc3RybGVuOwotCi0JCSptYXRjaGxlbiA9IGhuZm8tPm1hdGNoX2xlbihhdXgsIGxpbWl0LCAmc2hpZnQpOwotCQlpZiAoISptYXRjaGxlbikKLQkJCXJldHVybiAtMTsKLQotCQkqbWF0Y2hvZmYgPSAoYXV4IC0gaykgKyBzaGlmdDsKLQotCQlERUJVR1AoIiVzIG1hdGNoIHN1Y2NlZWRlZCEgLSBsZW46ICV1XG4iLCBobmZvLT5sbmFtZSwKLQkJICAgICAgICptYXRjaGxlbik7Ci0JCXJldHVybiAxOwotCX0KLQlERUJVR1AoIiVzIGhlYWRlciBub3QgZm91bmQuXG4iLCBobmZvLT5sbmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfZ2V0X2luZm8pOwotCi1zdGF0aWMgaW50IHNldF9leHBlY3RlZF9ydHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgIF9fYmUzMiBpcGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkJICAgIGNvbnN0IGNoYXIgKmRwdHIpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQ7Ci0JdHlwZW9mKGlwX25hdF9zZHBfaG9vaykgaXBfbmF0X3NkcDsKLQotCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwotCWlmIChleHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCWV4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gaXBhZGRyOwotCWV4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOwotCi0JZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5zcmMudS51ZHAucG9ydCA9IDA7Ci0JZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0KLQlleHAtPmV4cGVjdGZuID0gTlVMTDsKLQlleHAtPmZsYWdzID0gMDsKLQotCWlwX25hdF9zZHAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NkcF9ob29rKTsKLQlpZiAoaXBfbmF0X3NkcCkKLQkJcmV0ID0gaXBfbmF0X3NkcChwc2tiLCBjdGluZm8sIGV4cCwgZHB0cik7Ci0JZWxzZSB7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQotCQkJcmV0ID0gTkZfRFJPUDsKLQkJZWxzZQotCQkJcmV0ID0gTkZfQUNDRVBUOwotCX0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaXBfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBkYXRhbGVuOwotCWNvbnN0IGNoYXIgKmRwdHI7Ci0JaW50IHJldCA9IE5GX0FDQ0VQVDsKLQlpbnQgbWF0Y2hvZmYsIG1hdGNobGVuOwotCV9fYmUzMiBpcGFkZHI7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0JdHlwZW9mKGlwX25hdF9zaXBfaG9vaykgaXBfbmF0X3NpcDsKLQotCS8qIE5vIERhdGEgPyAqLwotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikgewotCQlERUJVR1AoInNrYi0+bGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JaXBfY3RfcmVmcmVzaChjdCwgKnBza2IsIHNpcF90aW1lb3V0ICogSFopOwotCi0JaWYgKCFza2JfaXNfbm9ubGluZWFyKCpwc2tiKSkKLQkJZHB0ciA9ICgqcHNrYiktPmRhdGEgKyBkYXRhb2ZmOwotCWVsc2UgewotCQlERUJVR1AoIkNvcHkgb2Ygc2tidWZmIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlwX25hdF9zaXAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NpcF9ob29rKTsKLQlpZiAoaXBfbmF0X3NpcCkgewotCQlpZiAoIWlwX25hdF9zaXAocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIpKSB7Ci0JCQlyZXQgPSBORl9EUk9QOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBBZnRlciB0aGlzIHBvaW50IE5BVCwgY291bGQgaGF2ZSBtYW5nbGVkIHNrYiwgc28KLQkgICB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHBheWxvYWQgbGVuZ2h0LiAqLwotCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOwotCi0JaWYgKGRhdGFsZW4gPCAoc2l6ZW9mKCJTSVAvMi4wIDIwMCIpIC0gMSkpCi0JCWdvdG8gb3V0OwotCi0JLyogUlRQIGluZm8gb25seSBpbiBzb21lIFNEUCBwa3RzICovCi0JaWYgKG1lbWNtcChkcHRyLCAiSU5WSVRFIiwgc2l6ZW9mKCJJTlZJVEUiKSAtIDEpICE9IDAgJiYKLQkgICAgbWVtY21wKGRwdHIsICJTSVAvMi4wIDIwMCIsIHNpemVvZigiU0lQLzIuMCAyMDAiKSAtIDEpICE9IDApIHsKLQkJZ290byBvdXQ7Ci0JfQotCS8qIEdldCBpcCBhbmQgcG9ydCBhZGRyZXNzIGZyb20gU0RQIHBhY2tldC4gKi8KLQlpZiAoY3Rfc2lwX2dldF9pbmZvKGRwdHIsIGRhdGFsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLAotCQkJICAgIFBPU19DT05ORUNUSU9OKSA+IDApIHsKLQotCQkvKiBXZSdsbCBkcm9wIG9ubHkgaWYgdGhlcmUgYXJlIHBhcnNlIHByb2JsZW1zLiAqLwotCQlpZiAocGFyc2VfaXBhZGRyKGRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgJmlwYWRkciwKLQkJCQkgZHB0ciArIGRhdGFsZW4pIDwgMCkgewotCQkJcmV0ID0gTkZfRFJPUDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgZGF0YWxlbiwgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sCi0JCQkJICAgIFBPU19NRURJQSkgPiAwKSB7Ci0KLQkJCXBvcnQgPSBzaW1wbGVfc3RydG91bChkcHRyICsgbWF0Y2hvZmYsIE5VTEwsIDEwKTsKLQkJCWlmIChwb3J0IDwgMTAyNCkgewotCQkJCXJldCA9IE5GX0RST1A7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlyZXQgPSBzZXRfZXhwZWN0ZWRfcnRwKHBza2IsIGN0LCBjdGluZm8sCi0JCQkJCSAgICAgICBpcGFkZHIsIHBvcnQsIGRwdHIpOwotCQl9Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBzaXBbTUFYX1BPUlRTXTsKLXN0YXRpYyBjaGFyIHNpcF9uYW1lc1tNQVhfUE9SVFNdWzEwXTsKLQotc3RhdGljIHZvaWQgZmluaSh2b2lkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJREVCVUdQKCJ1bnJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwgcG9ydHNbaV0pOwotCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNpcFtpXSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaW50IGksIHJldDsKLQljaGFyICp0bXBuYW1lOwotCi0JaWYgKHBvcnRzX2MgPT0gMCkKLQkJcG9ydHNbcG9ydHNfYysrXSA9IFNJUF9QT1JUOwotCi0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQkvKiBDcmVhdGUgaGVscGVyIHN0cnVjdHVyZSAqLwotCQltZW1zZXQoJnNpcFtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyKSk7Ci0KLQkJc2lwW2ldLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOwotCQlzaXBbaV0udHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7Ci0JCXNpcFtpXS5tYXNrLnNyYy51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQkJc2lwW2ldLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQkJc2lwW2ldLm1heF9leHBlY3RlZCA9IDI7Ci0JCXNpcFtpXS50aW1lb3V0ID0gMyAqIDYwOyAvKiAzIG1pbnV0ZXMgKi8KLQkJc2lwW2ldLm1lID0gVEhJU19NT0RVTEU7Ci0JCXNpcFtpXS5oZWxwID0gc2lwX2hlbHA7Ci0KLQkJdG1wbmFtZSA9ICZzaXBfbmFtZXNbaV1bMF07Ci0JCWlmIChwb3J0c1tpXSA9PSBTSVBfUE9SVCkKLQkJCXNwcmludGYodG1wbmFtZSwgInNpcCIpOwotCQllbHNlCi0JCQlzcHJpbnRmKHRtcG5hbWUsICJzaXAtJWQiLCBpKTsKLQkJc2lwW2ldLm5hbWUgPSB0bXBuYW1lOwotCi0JCURFQlVHUCgicG9ydCAjJWQ6ICVkXG4iLCBpLCBwb3J0c1tpXSk7Ci0KLQkJcmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcigmc2lwW2ldKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKCJFUlJPUiByZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBvcnQgJWRcbiIsCi0JCQkJcG9ydHNbaV0pOwotCQkJZmluaSgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjJmNzUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjIgKzAsMCBAQAotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciB0aGUgc3RhbmRhbG9uZQotICAgaXBfY29ubnRyYWNrIG1vZHVsZS4KLQotICAgVGhlc2UgYXJlIG5vdCByZXF1aXJlZCBieSB0aGUgY29tcGF0aWJpbGl0eSBsYXllci4KLSovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDUgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotZXh0ZXJuIGF0b21pY190IGlwX2Nvbm50cmFja19jb3VudDsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIGlwX2Nvbm50cmFja19zdGF0KTsKLQotc3RhdGljIGludCBraWxsX3Byb3RvKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIChpLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gPT0KLQkJCSooKHVfaW50OF90ICopIGRhdGEpKTsKLX0KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50Ci1wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bykKLXsKLQlzZXFfcHJpbnRmKHMsICJzcmM9JXUuJXUuJXUuJXUgZHN0PSV1LiV1LiV1LiV1ICIsCi0JCSAgIE5JUFFVQUQodHVwbGUtPnNyYy5pcCksIE5JUFFVQUQodHVwbGUtPmRzdC5pcCkpOwotCXJldHVybiBwcm90by0+cHJpbnRfdHVwbGUocywgdHVwbGUpOwotfQotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NUX0FDQ1QKLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNlcV9wcmludF9jb3VudGVycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciAqY291bnRlcikKLXsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAicGFja2V0cz0lbGx1IGJ5dGVzPSVsbHUgIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudGVyLT5wYWNrZXRzLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWNvdW50ZXItPmJ5dGVzKTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNlcV9wcmludF9jb3VudGVycyh4LCB5KQkwCi0jZW5kaWYKLQotc3RydWN0IGN0X2l0ZXJfc3RhdGUgewotCXVuc2lnbmVkIGludCBidWNrZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqY3RfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQotCWZvciAoc3QtPmJ1Y2tldCA9IDA7Ci0JICAgICBzdC0+YnVja2V0IDwgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCSAgICAgc3QtPmJ1Y2tldCsrKSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmaXBfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0pKQotCQkJcmV0dXJuIGlwX2Nvbm50cmFja19oYXNoW3N0LT5idWNrZXRdLm5leHQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCi0JaGVhZCA9IGhlYWQtPm5leHQ7Ci0Jd2hpbGUgKGhlYWQgPT0gJmlwX2Nvbm50cmFja19oYXNoW3N0LT5idWNrZXRdKSB7Ci0JCWlmICgrK3N0LT5idWNrZXQgPj0gaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSBpcF9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XS5uZXh0OwotCX0KLQlyZXR1cm4gaGVhZDsKLX0KLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmN0X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IGN0X2dldF9maXJzdChzZXEpOwotCi0JaWYgKGhlYWQpCi0JCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBjdF9nZXRfbmV4dChzZXEsIGhlYWQpKSkKLQkJCXBvcy0tOwotCXJldHVybiBwb3MgPyBOVUxMIDogaGVhZDsKLX0KLQotc3RhdGljIHZvaWQgKmN0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi17Ci0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIGN0X2dldF9pZHgoc2VxLCAqcG9zKTsKLX0KLQotc3RhdGljIHZvaWQgKmN0X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIGN0X2dldF9uZXh0KHMsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBjdF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotc3RhdGljIGludCBjdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0JY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoID0gdjsKLQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2sgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGhhc2gpOwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwotCi0JSVBfTkZfQVNTRVJUKGNvbm50cmFjayk7Ci0KLQkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCi0JaWYgKERJUkVDVElPTihoYXNoKSkKLQkJcmV0dXJuIDA7Ci0KLQlwcm90byA9IF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQoY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0pOwotCUlQX05GX0FTU0VSVChwcm90byk7Ci0KLQlpZiAoc2VxX3ByaW50ZihzLCAiJS04cyAldSAlbGQgIiwKLQkJICAgICAgcHJvdG8tPm5hbWUsCi0JCSAgICAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtLAotCQkgICAgICB0aW1lcl9wZW5kaW5nKCZjb25udHJhY2stPnRpbWVvdXQpCi0JCSAgICAgID8gKGxvbmcpKGNvbm50cmFjay0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFoKLQkJICAgICAgOiAwKSAhPSAwKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCWlmIChwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGNvbm50cmFjaykpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHByaW50X3R1cGxlKHMsICZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJcHJvdG8pKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCWlmIChzZXFfcHJpbnRfY291bnRlcnMocywgJmNvbm50cmFjay0+Y291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXSkpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKCEodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpKSkKLQkJaWYgKHNlcV9wcmludGYocywgIltVTlJFUExJRURdICIpKQotCQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAocHJpbnRfdHVwbGUocywgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCQlwcm90bykpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHNlcV9wcmludF9jb3VudGVycyhzLCAmY29ubnRyYWNrLT5jb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAodGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpKQotCQlpZiAoc2VxX3ByaW50ZihzLCAiW0FTU1VSRURdICIpKQotCQkJcmV0dXJuIC1FTk9TUEM7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSykKLQlpZiAoc2VxX3ByaW50ZihzLCAibWFyaz0ldSAiLCBjb25udHJhY2stPm1hcmspKQotCQlyZXR1cm4gLUVOT1NQQzsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NPTk5UUkFDS19TRUNNQVJLCi0JaWYgKHNlcV9wcmludGYocywgInNlY21hcms9JXUgIiwgY29ubnRyYWNrLT5zZWNtYXJrKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0jZW5kaWYKLQotCWlmIChzZXFfcHJpbnRmKHMsICJ1c2U9JXVcbiIsIGF0b21pY19yZWFkKCZjb25udHJhY2stPmN0X2dlbmVyYWwudXNlKSkpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3Rfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBjdF9zZXFfc3RhcnQsCi0JLm5leHQgID0gY3Rfc2VxX25leHQsCi0JLnN0b3AgID0gY3Rfc2VxX3N0b3AsCi0JLnNob3cgID0gY3Rfc2VxX3Nob3cKLX07Ci0KLXN0YXRpYyBpbnQgY3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKLQlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3Q7Ci0JaW50IHJldDsKLQotCXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN0X2l0ZXJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJmN0X3NlcV9vcHMpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZyZWU7Ci0Jc2VxICAgICAgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNlcS0+cHJpdmF0ZSA9IHN0OwotCW1lbXNldChzdCwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9pdGVyX3N0YXRlKSk7Ci0JcmV0dXJuIHJldDsKLW91dF9mcmVlOgotCWtmcmVlKHN0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9maWxlX29wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gY3Rfb3BlbiwKLQkucmVhZCAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKLX07Ci0KLS8qIGV4cGVjdHMgKi8KLXN0YXRpYyB2b2lkICpleHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZSA9ICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3Q7Ci0JbG9mZl90IGk7Ci0KLQkvKiBzdHJhbmdlIHNlcV9maWxlIGFwaSBjYWxscyBzdG9wIGV2ZW4gaWYgd2UgZmFpbCwKLQkgKiB0aHVzIHdlIG5lZWQgdG8gZ3JhYiBsb2NrIHNpbmNlIHN0b3AgdW5sb2NrcyAqLwotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JaWYgKGxpc3RfZW1wdHkoZSkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8PSAqcG9zOyBpKyspIHsKLQkJZSA9IGUtPm5leHQ7Ci0JCWlmIChlID09ICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGU7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplID0gdjsKLQotCSsrKnBvczsKLQllID0gZS0+bmV4dDsKLQotCWlmIChlID09ICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4cF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotc3RhdGljIGludCBleHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3QgPSB2OwotCi0JaWYgKGV4cGVjdC0+dGltZW91dC5mdW5jdGlvbikKLQkJc2VxX3ByaW50ZihzLCAiJWxkICIsIHRpbWVyX3BlbmRpbmcoJmV4cGVjdC0+dGltZW91dCkKLQkJCSAgID8gKGxvbmcpKGV4cGVjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKTsKLQllbHNlCi0JCXNlcV9wcmludGYocywgIi0gIik7Ci0KLQlzZXFfcHJpbnRmKHMsICJwcm90bz0ldSAiLCBleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSk7Ci0KLQlwcmludF90dXBsZShzLCAmZXhwZWN0LT50dXBsZSwKLQkJICAgIF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQoZXhwZWN0LT50dXBsZS5kc3QucHJvdG9udW0pKTsKLQlyZXR1cm4gc2VxX3B1dGMocywgJ1xuJyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZXhwX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gZXhwX3NlcV9zdGFydCwKLQkubmV4dCA9IGV4cF9zZXFfbmV4dCwKLQkuc3RvcCA9IGV4cF9zZXFfc3RvcCwKLQkuc2hvdyA9IGV4cF9zZXFfc2hvdwotfTsKLQotc3RhdGljIGludCBleHBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmV4cF9zZXFfb3BzKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhwX2ZpbGVfb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBleHBfb3BlbiwKLQkucmVhZCAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKLX07Ci0KLXN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLXsKLQlpbnQgY3B1OwotCi0JaWYgKCpwb3MgPT0gMCkKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQotCWZvciAoY3B1ID0gKnBvcy0xOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgewotCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQotCQkJY29udGludWU7Ci0JCSpwb3MgPSBjcHUrMTsKLQkJcmV0dXJuICZwZXJfY3B1KGlwX2Nvbm50cmFja19zdGF0LCBjcHUpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlpbnQgY3B1OwotCi0JZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgewotCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQotCQkJY29udGludWU7Ci0JCSpwb3MgPSBjcHUrMTsKLQkJcmV0dXJuICZwZXJfY3B1KGlwX2Nvbm50cmFja19zdGF0LCBjcHUpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBjdF9jcHVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci19Ci0KLXN0YXRpYyBpbnQgY3RfY3B1X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCXVuc2lnbmVkIGludCBucl9jb25udHJhY2tzID0gYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja19jb3VudCk7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19zdGF0ICpzdCA9IHY7Ci0KLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKLQkJc2VxX3ByaW50ZihzZXEsICJlbnRyaWVzICBzZWFyY2hlZCBmb3VuZCBuZXcgaW52YWxpZCBpZ25vcmUgZGVsZXRlIGRlbGV0ZV9saXN0IGluc2VydCBpbnNlcnRfZmFpbGVkIGRyb3AgZWFybHlfZHJvcCBpY21wX2Vycm9yICBleHBlY3RfbmV3IGV4cGVjdF9jcmVhdGUgZXhwZWN0X2RlbGV0ZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAiCi0JCQkiJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICAlMDh4ICUwOHggJTA4eCBcbiIsCi0JCSAgIG5yX2Nvbm50cmFja3MsCi0JCSAgIHN0LT5zZWFyY2hlZCwKLQkJICAgc3QtPmZvdW5kLAotCQkgICBzdC0+bmV3LAotCQkgICBzdC0+aW52YWxpZCwKLQkJICAgc3QtPmlnbm9yZSwKLQkJICAgc3QtPmRlbGV0ZSwKLQkJICAgc3QtPmRlbGV0ZV9saXN0LAotCQkgICBzdC0+aW5zZXJ0LAotCQkgICBzdC0+aW5zZXJ0X2ZhaWxlZCwKLQkJICAgc3QtPmRyb3AsCi0JCSAgIHN0LT5lYXJseV9kcm9wLAotCQkgICBzdC0+ZXJyb3IsCi0KLQkJICAgc3QtPmV4cGVjdF9uZXcsCi0JCSAgIHN0LT5leHBlY3RfY3JlYXRlLAotCQkgICBzdC0+ZXhwZWN0X2RlbGV0ZQotCQkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGN0X2NwdV9zZXFfb3BzID0gewotCS5zdGFydCAgPSBjdF9jcHVfc2VxX3N0YXJ0LAotCS5uZXh0ICAgPSBjdF9jcHVfc2VxX25leHQsCi0JLnN0b3AgICA9IGN0X2NwdV9zZXFfc3RvcCwKLQkuc2hvdyAgID0gY3RfY3B1X3NlcV9zaG93LAotfTsKLQotc3RhdGljIGludCBjdF9jcHVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjdF9jcHVfc2VxX29wcyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2NwdV9zZXFfZm9wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gY3RfY3B1X3NlcV9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2NvbmZpcm0odW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCS8qIFdlJ3ZlIHNlZW4gaXQgY29taW5nIG91dCB0aGUgb3RoZXIgc2lkZTogY29uZmlybSBpdCAqLwotCXJldHVybiBpcF9jb25udHJhY2tfY29uZmlybShwc2tiKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfaGVscCh1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0KLQkvKiBUaGlzIGlzIHdoZXJlIHdlIGNhbGwgdGhlIGhlbHBlcjogYXMgdGhlIHBhY2tldCBnb2VzIG91dC4gKi8KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotCWlmIChjdCAmJiBjdC0+aGVscGVyICYmIGN0aW5mbyAhPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKLQkJdW5zaWduZWQgaW50IHJldDsKLQkJcmV0ID0gY3QtPmhlbHBlci0+aGVscChwc2tiLCBjdCwgY3RpbmZvKTsKLQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19kZWZyYWcodW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJCXN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLSNpZiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUX01PRFVMRSkKLQkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gIElnbm9yZS4gIERvIHRoaXMgYmVmb3JlCi0JICAgZnJhZ21lbnQgY2hlY2suICovCi0JaWYgKCgqcHNrYiktPm5mY3QpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0jZW5kaWYKLQotCS8qIEdhdGhlciBmcmFnbWVudHMuICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7Ci0JCSpwc2tiID0gaXBfY3RfZ2F0aGVyX2ZyYWdzKCpwc2tiLAotCQkJCQkgICBob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HID8KLQkJCQkJICAgSVBfREVGUkFHX0NPTk5UUkFDS19JTiA6Ci0JCQkJCSAgIElQX0RFRlJBR19DT05OVFJBQ0tfT1VUKTsKLQkJaWYgKCEqcHNrYikKLQkJCXJldHVybiBORl9TVE9MRU47Ci0JfQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2xvY2FsKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0JLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCi0JaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwdF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQlyZXR1cm4gaXBfY29ubnRyYWNrX2luKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOwotfQotCi0vKiBDb25uZWN0aW9uIHRyYWNraW5nIG1heSBkcm9wIHBhY2tldHMsIGJ1dCBuZXZlciBhbHRlcnMgdGhlbSwgc28KLSAgIG1ha2UgaXQgdGhlIGZpcnN0IGhvb2suICovCi1zdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX2Nvbm50cmFja19vcHNbXSA9IHsKLQl7Ci0JCS5ob29rCQk9IGlwX2Nvbm50cmFja19kZWZyYWcsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUFJFX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25udHJhY2tfaW4sCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUFJFX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0ssCi0JfSwKLQl7Ci0JCS5ob29rCQk9IGlwX2Nvbm50cmFja19kZWZyYWcsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0RFRlJBRywKLQl9LAotCXsKLQkJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2xvY2FsLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX09VVCwKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDSywKLQl9LAotCXsKLQkJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2hlbHAsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUE9TVF9ST1VUSU5HLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0hFTFBFUiwKLQl9LAotCXsKLQkJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2hlbHAsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfSEVMUEVSLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25maXJtLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX1BPU1RfUk9VVElORywKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDS19DT05GSVJNLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25maXJtLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0NPTkZJUk0sCi0JfSwKLX07Ci0KLS8qIFN5c2N0bCBzdXBwb3J0ICovCi0KLWludCBpcF9jb25udHJhY2tfY2hlY2tzdW0gX19yZWFkX21vc3RseSA9IDE7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0KLS8qIEZyb20gaXBfY29ubnRyYWNrX2NvcmUuYyAqLwotZXh0ZXJuIGludCBpcF9jb25udHJhY2tfbWF4OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0KLS8qIEZyb20gaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jICovCi1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdjsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9sYXN0X2FjazsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9jbG9zZTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnM7Ci1leHRlcm4gaW50IGlwX2N0X3RjcF9sb29zZTsKLWV4dGVybiBpbnQgaXBfY3RfdGNwX2JlX2xpYmVyYWw7Ci1leHRlcm4gaW50IGlwX2N0X3RjcF9tYXhfcmV0cmFuczsKLQotLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9fdWRwLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdWRwX3RpbWVvdXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbTsKLQotLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9faWNtcC5jICovCi1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X2ljbXBfdGltZW91dDsKLQotLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jICovCi1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X2dlbmVyaWNfdGltZW91dDsKLQotLyogTG9nIGludmFsaWQgcGFja2V0cyBvZiBhIGdpdmVuIHByb3RvY29sICovCi1zdGF0aWMgaW50IGxvZ19pbnZhbGlkX3Byb3RvX21pbiA9IDA7Ci1zdGF0aWMgaW50IGxvZ19pbnZhbGlkX3Byb3RvX21heCA9IDI1NTsKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICppcF9jdF9zeXNjdGxfaGVhZGVyOwotCi1zdGF0aWMgY3RsX3RhYmxlIGlwX2N0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX01BWCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19tYXgiLAotCQkuZGF0YQkJPSAmaXBfY29ubnRyYWNrX21heCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfQ09VTlQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfY291bnQiLAotCQkuZGF0YQkJPSAmaXBfY29ubnRyYWNrX2NvdW50LAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19CVUNLRVRTLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2J1Y2tldHMiLAotCQkuZGF0YQkJPSAmaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19DSEVDS1NVTSwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jaGVja3N1bSIsCi0JCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfY2hlY2tzdW0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5ULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9zZW50IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9yZWN2IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVELAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCIsCi0JCS5kYXRhCQk9ICZpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2xhc3RfYWNrIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF90aW1lX3dhaXQiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Nsb3NlIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3VkcF90aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUX1NUUkVBTSwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja191ZHBfdGltZW91dF9zdHJlYW0iLAotCQkuZGF0YQkJPSAmaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19pY21wX3RpbWVvdXQiLAotCQkuZGF0YQkJPSAmaXBfY3RfaWNtcF90aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19nZW5lcmljX3RpbWVvdXQiLAotCQkuZGF0YQkJPSAmaXBfY3RfZ2VuZXJpY190aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElELAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKLQkJLmRhdGEJCT0gJmlwX2N0X2xvZ19pbnZhbGlkLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKLQkJLmV4dHJhMQkJPSAmbG9nX2ludmFsaWRfcHJvdG9fbWluLAotCQkuZXh0cmEyCQk9ICZsb2dfaW52YWxpZF9wcm90b19tYXgsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9NQVhfUkVUUkFOUywKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9tYXhfcmV0cmFucyIsCi0JCS5kYXRhCQk9ICZpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucywKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfTE9PU0UsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX2xvb3NlIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF9sb29zZSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUwsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX2JlX2xpYmVyYWwiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX2JlX2xpYmVyYWwsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9NQVhfUkVUUkFOUywKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfbWF4X3JldHJhbnMiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX21heF9yZXRyYW5zLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotI2RlZmluZSBORVRfSVBfQ09OTlRSQUNLX01BWCAyMDg5Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0ZmlsdGVyX3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORVRGSUxURVIsCi0JCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gaXBfY3Rfc3lzY3RsX3RhYmxlLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBfQ09OTlRSQUNLX01BWCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19tYXgiLAotCQkuZGF0YQkJPSAmaXBfY29ubnRyYWNrX21heCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9pcHY0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKLQkJLnByb2NuYW1lCT0gImlwdjQiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gaXBfY3RfbmV0ZmlsdGVyX3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBDVExfTkVULAotCQkucHJvY25hbWUJPSAibmV0IiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IGlwX2N0X2lwdjRfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotRVhQT1JUX1NZTUJPTChpcF9jdF9sb2dfaW52YWxpZCk7Ci0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0vKiBGSVhNRTogQWxsb3cgTlVMTCBmdW5jdGlvbnMgYW5kIHN1YiBpbiBwb2ludGVycyB0byBnZW5lcmljIGZvcgotICAgdGhlbS4gLS1SUiAqLwotaW50IGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpZiAoaXBfY3RfcHJvdG9zW3Byb3RvLT5wcm90b10gIT0gJmlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9wcm90b3NbcHJvdG8tPnByb3RvXSwgcHJvdG8pOwotIG91dDoKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQotewotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfcHJvdG9zW3Byb3RvLT5wcm90b10sCi0JCQkgICAmaXBfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2wpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JLyogUmVtb3ZlIGFsbCBjb250cmFjayBlbnRyaWVzIGZvciB0aGlzIHByb3RvY29sICovCi0JaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKGtpbGxfcHJvdG8sICZwcm90by0+cHJvdG8pOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MsICpwcm9jX2V4cCwgKnByb2Nfc3RhdDsKLSNlbmRpZgotCWludCByZXQgPSAwOwotCi0JcmV0ID0gaXBfY29ubnRyYWNrX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcmV0ID0gLUVOT01FTTsKLQlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX2Nvbm50cmFjayIsIDA0NDAsICZjdF9maWxlX29wcyk7Ci0JaWYgKCFwcm9jKSBnb3RvIGNsZWFudXBfaW5pdDsKLQotCXByb2NfZXhwID0gcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLAotCQkJCQkmZXhwX2ZpbGVfb3BzKTsKLQlpZiAoIXByb2NfZXhwKSBnb3RvIGNsZWFudXBfcHJvYzsKLQotCXByb2Nfc3RhdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2siLCBTX0lSVUdPLCBwcm9jX25ldF9zdGF0KTsKLQlpZiAoIXByb2Nfc3RhdCkKLQkJZ290byBjbGVhbnVwX3Byb2NfZXhwOwotCi0JcHJvY19zdGF0LT5wcm9jX2ZvcHMgPSAmY3RfY3B1X3NlcV9mb3BzOwotCXByb2Nfc3RhdC0+b3duZXIgPSBUSElTX01PRFVMRTsKLSNlbmRpZgotCi0JcmV0ID0gbmZfcmVnaXN0ZXJfaG9va3MoaXBfY29ubnRyYWNrX29wcywgQVJSQVlfU0laRShpcF9jb25udHJhY2tfb3BzKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJpcF9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIGhvb2tzLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9wcm9jX3N0YXQ7Ci0JfQotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlpcF9jdF9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwX2N0X25ldF90YWJsZSk7Ci0JaWYgKGlwX2N0X3N5c2N0bF9oZWFkZXIgPT0gTlVMTCkgewotCQlwcmludGsoImlwX2Nvbm50cmFjazogY2FuJ3QgcmVnaXN0ZXIgdG8gc3lzY3RsLlxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gY2xlYW51cF9ob29rczsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotIGNsZWFudXBfaG9va3M6Ci0JbmZfdW5yZWdpc3Rlcl9ob29rcyhpcF9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwX2Nvbm50cmFja19vcHMpKTsKLSNlbmRpZgotIGNsZWFudXBfcHJvY19zdGF0OgotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIHByb2NfbmV0X3N0YXQpOwotIGNsZWFudXBfcHJvY19leHA6Ci0JcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2tfZXhwZWN0Iik7Ci0gY2xlYW51cF9wcm9jOgotCXByb2NfbmV0X3JlbW92ZSgiaXBfY29ubnRyYWNrIik7Ci0gY2xlYW51cF9pbml0OgotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0JaXBfY29ubnRyYWNrX2NsZWFudXAoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaSh2b2lkKQotewotCXN5bmNocm9uaXplX25ldCgpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcF9jdF9zeXNjdGxfaGVhZGVyKTsKLSNlbmRpZgotCW5mX3VucmVnaXN0ZXJfaG9va3MoaXBfY29ubnRyYWNrX29wcywgQVJSQVlfU0laRShpcF9jb25udHJhY2tfb3BzKSk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgcHJvY19uZXRfc3RhdCk7Ci0JcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2tfZXhwZWN0Iik7Ci0JcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2siKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCWlwX2Nvbm50cmFja19jbGVhbnVwKCk7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaSk7Ci0KLS8qIFNvbWUgbW9kdWxlcyBuZWVkIHVzLCBidXQgZG9uJ3QgZGVwZW5kIGRpcmVjdGx5IG9uIGFueSBzeW1ib2wuCi0gICBUaGV5IHNob3VsZCBjYWxsIHRoaXMuICovCi12b2lkIG5lZWRfY29ubnRyYWNrKHZvaWQpCi17Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2NoYWluKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4pOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY3RfZXZlbnRfY2FjaGVfaW5pdCk7Ci1FWFBPUlRfUEVSX0NQVV9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19lY2FjaGUpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woaXBfY3RfZ2V0X3R1cGxlKTsKLUVYUE9SVF9TWU1CT0woaW52ZXJ0X3R1cGxlcHIpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9jb25udHJhY2spOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKTsKLUVYUE9SVF9TWU1CT0woX19pcF9jdF9yZWZyZXNoX2FjY3QpOwotCi1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X3B1dCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChfX2lwX2Nvbm50cmFja19leHBlY3RfZmluZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2N0X3VubGlua19leHBlY3QpOwotCi1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja190dXBsZV90YWtlbik7Ci1FWFBPUlRfU1lNQk9MKGlwX2N0X2dhdGhlcl9mcmFncyk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19sb2NrKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2hhc2gpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW50cmFja2VkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19maW5kX2dldCk7Ci0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3RjcF91cGRhdGUpOwotI2VuZGlmCi0KLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19mbHVzaCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChfX2lwX2Nvbm50cmFja19maW5kKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2FsbG9jKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19mcmVlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19oYXNoX2luc2VydCk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfZ2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19oZWxwZXJfcHV0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZSk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19wcm90b19maW5kX2dldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfcHJvdG9fcHV0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2NoZWNrc3VtKTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlMTc1ZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiAoQykgMjAwMS0yMDAyIE1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFZlcnNpb246IDAuMC43Ci0gKgotICogVGh1IDIxIE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJLSBwb3J0IHRvIG5ld25hdCBBUEkKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi1NT0RVTEVfQVVUSE9SKCJNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInRmdHAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2RlZmluZSBNQVhfUE9SVFMgOAotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW01BWF9QT1JUU107Ci1zdGF0aWMgaW50IHBvcnRzX2M7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiB0ZnRwIHNlcnZlcnMiKTsKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCIlczolczoiIGZvcm1hdCwgXAotCQkJCSAgICAgICBfX0ZJTEVfXywgX19GVU5DVElPTl9fICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotdW5zaWduZWQgaW50ICgqaXBfbmF0X3RmdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfdGZ0cF9ob29rKTsKLQotc3RhdGljIGludCB0ZnRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0cnVjdCB0ZnRwaGRyIF90ZnRwaCwgKnRmaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXVuc2lnbmVkIGludCByZXQgPSBORl9BQ0NFUFQ7Ci0JdHlwZW9mKGlwX25hdF90ZnRwX2hvb2spIGlwX25hdF90ZnRwOwotCi0JdGZoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLAotCQkJCSAoKnBza2IpLT5uaC5pcGgtPmlobCo0K3NpemVvZihzdHJ1Y3QgdWRwaGRyKSwKLQkJCQkgc2l6ZW9mKF90ZnRwaCksICZfdGZ0cGgpOwotCWlmICh0ZmggPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCXN3aXRjaCAobnRvaHModGZoLT5vcGNvZGUpKSB7Ci0JLyogUlJRIGFuZCBXUlEgd29ya3MgdGhlIHNhbWUgd2F5ICovCi0JY2FzZSBURlRQX09QQ09ERV9SRUFEOgotCWNhc2UgVEZUUF9PUENPREVfV1JJVEU6Ci0JCURFQlVHUCgiIik7Ci0JCURVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7Ci0JCURVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7Ci0KLQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JCWlmIChleHAgPT0gTlVMTCkKLQkJCXJldHVybiBORl9EUk9QOwotCi0JCWV4cC0+dHVwbGUgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGU7Ci0JCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweGZmZmZmZmZmKTsKLQkJZXhwLT5tYXNrLnNyYy51LnVkcC5wb3J0ID0gMDsKLQkJZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4ZmZmZmZmZmYpOwotCQlleHAtPm1hc2suZHN0LnUudWRwLnBvcnQgPSBodG9ucygweGZmZmYpOwotCQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhmZjsKLQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCWV4cC0+ZmxhZ3MgPSAwOwotCi0JCURFQlVHUCgiZXhwZWN0OiAiKTsKLQkJRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7Ci0JCURVTVBfVFVQTEUoJmV4cC0+bWFzayk7Ci0JCWlwX25hdF90ZnRwID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF90ZnRwX2hvb2spOwotCQlpZiAoaXBfbmF0X3RmdHApCi0JCQlyZXQgPSBpcF9uYXRfdGZ0cChwc2tiLCBjdGluZm8sIGV4cCk7Ci0JCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCi0JCQlyZXQgPSBORl9EUk9QOwotCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQlicmVhazsKLQljYXNlIFRGVFBfT1BDT0RFX0RBVEE6Ci0JY2FzZSBURlRQX09QQ09ERV9BQ0s6Ci0JCURFQlVHUCgiRGF0YS9BQ0sgb3Bjb2RlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBURlRQX09QQ09ERV9FUlJPUjoKLQkJREVCVUdQKCJFcnJvciBvcGNvZGVcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlERUJVR1AoIlVua25vd24gb3Bjb2RlXG4iKTsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIHRmdHBbTUFYX1BPUlRTXTsKLXN0YXRpYyBjaGFyIHRmdHBfbmFtZXNbTUFYX1BPUlRTXVtzaXplb2YoInRmdHAtNjU1MzUiKV07Ci0KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja190ZnRwX2Zpbmkodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgcG9ydHNfYzsgaSsrKSB7Ci0JCURFQlVHUCgidW5yZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBvcnQgJWRcbiIsCi0JCQlwb3J0c1tpXSk7Ci0JCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmdGZ0cFtpXSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfdGZ0cF9pbml0KHZvaWQpCi17Ci0JaW50IGksIHJldDsKLQljaGFyICp0bXBuYW1lOwotCi0JaWYgKHBvcnRzX2MgPT0gMCkKLQkJcG9ydHNbcG9ydHNfYysrXSA9IFRGVFBfUE9SVDsKLQotCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJLyogQ3JlYXRlIGhlbHBlciBzdHJ1Y3R1cmUgKi8KLQkJbWVtc2V0KCZ0ZnRwW2ldLCAwLCBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIpKTsKLQotCQl0ZnRwW2ldLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOwotCQl0ZnRwW2ldLnR1cGxlLnNyYy51LnVkcC5wb3J0ID0gaHRvbnMocG9ydHNbaV0pOwotCQl0ZnRwW2ldLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQkJdGZ0cFtpXS5tYXNrLnNyYy51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQkJdGZ0cFtpXS5tYXhfZXhwZWN0ZWQgPSAxOwotCQl0ZnRwW2ldLnRpbWVvdXQgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLwotCQl0ZnRwW2ldLm1lID0gVEhJU19NT0RVTEU7Ci0JCXRmdHBbaV0uaGVscCA9IHRmdHBfaGVscDsKLQotCQl0bXBuYW1lID0gJnRmdHBfbmFtZXNbaV1bMF07Ci0JCWlmIChwb3J0c1tpXSA9PSBURlRQX1BPUlQpCi0JCQlzcHJpbnRmKHRtcG5hbWUsICJ0ZnRwIik7Ci0JCWVsc2UKLQkJCXNwcmludGYodG1wbmFtZSwgInRmdHAtJWQiLCBpKTsKLQkJdGZ0cFtpXS5uYW1lID0gdG1wbmFtZTsKLQotCQlERUJVR1AoInBvcnQgIyVkOiAlZFxuIiwgaSwgcG9ydHNbaV0pOwotCi0JCXJldD1pcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZ0ZnRwW2ldKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKCJFUlJPUiByZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBvcnQgJWRcbiIsCi0JCQkJcG9ydHNbaV0pOwotCQkJaXBfY29ubnRyYWNrX3RmdHBfZmluaSgpOwotCQkJcmV0dXJuKHJldCk7Ci0JCX0KLQl9Ci0JcmV0dXJuKDApOwotfQotCi1tb2R1bGVfaW5pdChpcF9jb25udHJhY2tfdGZ0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja190ZnRwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGYxYTkuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIEFtYW5kYSBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4KLSAqIChDKSAyMDAyIGJ5IEJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+Ci0gKiBiYXNlZCBvbiBhIGNvcHkgb2YgSFcncyBpcF9uYXRfaXJjLmMgYXMgd2VsbCBhcyBvdGhlciBtb2R1bGVzCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCU1vZHVsZSBsb2FkIHN5bnRheDoKLSAqIAlpbnNtb2QgaXBfbmF0X2FtYW5kYS5vCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotI2luY2x1ZGUgPG5ldC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfYW1hbmRhLmg+Ci0KLQotTU9EVUxFX0FVVEhPUigiQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQW1hbmRhIE5BVCBoZWxwZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCi0JCQkgdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCI2NTUzNSIpXTsKLQl1X2ludDE2X3QgcG9ydDsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0JLyogQ29ubmVjdGlvbiBjb21lcyBmcm9tIGNsaWVudC4gKi8KLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKLQotCS8qIFdoZW4geW91IHNlZSB0aGUgcGFja2V0LCB3ZSBuZWVkIHRvIE5BVCBpdCB0aGUgc2FtZSBhcyB0aGUKLQkgKiB0aGlzIG9uZSAoaWUuIHNhbWUgSVA6IGl0IHdpbGwgYmUgVENQIGFuZCBtYXN0ZXIgaXMgVURQKS4gKi8KLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAocG9ydCA9IG50b2hzKGV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQpOyBwb3J0ICE9IDA7IHBvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBvcnQgPT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlzcHJpbnRmKGJ1ZmZlciwgIiV1IiwgcG9ydCk7Ci0JcmV0ID0gaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGV4cC0+bWFzdGVyLCBjdGluZm8sCi0JCQkJICAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwKLQkJCQkgICAgICAgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0JaWYgKHJldCAhPSBORl9BQ0NFUFQpCi0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9hbWFuZGFfZmluaSh2b2lkKQotewotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfYW1hbmRhX2hvb2ssIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfYW1hbmRhX2luaXQodm9pZCkKLXsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9hbWFuZGFfaG9vaykpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfYW1hbmRhX2hvb2ssIGhlbHApOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChpcF9uYXRfYW1hbmRhX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfbmF0X2FtYW5kYV9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzM3ZmQuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzQgKzAsMCBAQAotLyogTkFUIGZvciBuZXRmaWx0ZXI7IHNoYXJlZCB3aXRoIGNvbXBhdGliaWxpdHkgbGF5ZXIuICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L2ljbXAuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+ICAvKiBGb3IgdGNwX3Byb3QgaW4gZ2V0b3JpZ2RzdCAqLwotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotREVGSU5FX1JXTE9DSyhpcF9uYXRfbG9jayk7Ci0KLS8qIENhbGN1bGF0ZWQgYXQgaW5pdCBiYXNlZCBvbiBtZW1vcnkgc2l6ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpcF9uYXRfaHRhYmxlX3NpemU7Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpieXNvdXJjZTsKLQotI2RlZmluZSBNQVhfSVBfTkFUX1BST1RPIDI1Ngotc3RhdGljIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKmlwX25hdF9wcm90b3NbTUFYX0lQX05BVF9QUk9UT107Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX25hdF9wcm90b2NvbCAqCi1fX2lwX25hdF9wcm90b19maW5kKHVfaW50OF90IHByb3RvbnVtKQotewotCXJldHVybiByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3Byb3Rvc1twcm90b251bV0pOwotfQotCi1zdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICoKLWlwX25hdF9wcm90b19maW5kX2dldCh1X2ludDhfdCBwcm90b251bSkKLXsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXAgPSBfX2lwX25hdF9wcm90b19maW5kKHByb3RvbnVtKTsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHAtPm1lKSkKLQkJcCA9ICZpcF9uYXRfdW5rbm93bl9wcm90b2NvbDsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3Byb3RvX2ZpbmRfZ2V0KTsKLQotdm9pZAotaXBfbmF0X3Byb3RvX3B1dChzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwKQotewotCW1vZHVsZV9wdXQocC0+bWUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3Byb3RvX3B1dCk7Ci0KLS8qIFdlIGtlZXAgYW4gZXh0cmEgaGFzaCBmb3IgZWFjaCBjb25udHJhY2ssIGZvciBmYXN0IHNlYXJjaGluZy4gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1oYXNoX2J5X3NyYyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQkvKiBPcmlnaW5hbCBzcmMsIHRvIGVuc3VyZSB3ZSBtYXAgaXQgY29uc2lzdGVudGx5IGlmIHBvc3MuICovCi0JcmV0dXJuIGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy5pcCwgdHVwbGUtPnNyYy51LmFsbCwKLQkJCSAgICB0dXBsZS0+ZHN0LnByb3RvbnVtLCAwKSAlIGlwX25hdF9odGFibGVfc2l6ZTsKLX0KLQotLyogTm9vbmUgdXNpbmcgY29ubnRyYWNrIGJ5IHRoZSB0aW1lIHRoaXMgY2FsbGVkLiAqLwotc3RhdGljIHZvaWQgaXBfbmF0X2NsZWFudXBfY29ubnRyYWNrKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm4pCi17Ci0JaWYgKCEoY29ubi0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spKQotCQlyZXR1cm47Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JbGlzdF9kZWwoJmNvbm4tPm5hdC5pbmZvLmJ5c291cmNlKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX25hdF9sb2NrKTsKLX0KLQotLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSAqLwotaW50Ci1pcF9uYXRfdXNlZF90dXBsZShjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjaykKLXsKLQkvKiBDb25udHJhY2sgdHJhY2tpbmcgZG9lc24ndCBrZWVwIHRyYWNrIG9mIG91dGdvaW5nIHR1cGxlczsgb25seQotCSAgIGluY29taW5nIG9uZXMuICBOQVQgbWVhbnMgdGhleSBkb24ndCBoYXZlIGEgZml4ZWQgbWFwcGluZywKLQkgICBzbyB3ZSBpbnZlcnQgdGhlIHR1cGxlIGFuZCBsb29rIGZvciB0aGUgaW5jb21pbmcgcmVwbHkuCi0KLQkgICBXZSBjb3VsZCBrZWVwIGEgc2VwYXJhdGUgaGFzaCBpZiB0aGlzIHByb3ZlcyB0b28gc2xvdy4gKi8KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHJlcGx5OwotCi0JaW52ZXJ0X3R1cGxlcHIoJnJlcGx5LCB0dXBsZSk7Ci0JcmV0dXJuIGlwX2Nvbm50cmFja190dXBsZV90YWtlbigmcmVwbHksIGlnbm9yZWRfY29ubnRyYWNrKTsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X3VzZWRfdHVwbGUpOwotCi0vKiBJZiB3ZSBzb3VyY2UgbWFwIHRoaXMgdHVwbGUgc28gcmVwbHkgbG9va3MgbGlrZSByZXBseV90dXBsZSwgd2lsbAotICogdGhhdCBtZWV0IHRoZSBjb25zdHJhaW50cyBvZiByYW5nZS4gKi8KLXN0YXRpYyBpbnQKLWluX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwcm90bzsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIElmIHdlIGFyZSBzdXBwb3NlZCB0byBtYXAgSVBzLCB0aGVuIHdlIG11c3QgYmUgaW4gdGhlCi0JICAgcmFuZ2Ugc3BlY2lmaWVkLCBvdGhlcndpc2UgbGV0IHRoaXMgZHJhZyB1cyBvbnRvIGEgbmV3IHNyYyBJUC4gKi8KLQlpZiAocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpIHsKLQkJaWYgKG50b2hsKHR1cGxlLT5zcmMuaXApIDwgbnRvaGwocmFuZ2UtPm1pbl9pcCkKLQkJICAgIHx8IG50b2hsKHR1cGxlLT5zcmMuaXApID4gbnRvaGwocmFuZ2UtPm1heF9pcCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcHJvdG8gPSBfX2lwX25hdF9wcm90b19maW5kKHR1cGxlLT5kc3QucHJvdG9udW0pOwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpCi0JICAgIHx8IHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgSVBfTkFUX01BTklQX1NSQywKLQkJCSAgICAgICAmcmFuZ2UtPm1pbiwgJnJhbmdlLT5tYXgpKQotCQlyZXQgPSAxOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXNhbWVfc3JjKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlyZXR1cm4gKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0KLQkJPT0gdHVwbGUtPmRzdC5wcm90b251bQotCQkmJiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwCi0JCT09IHR1cGxlLT5zcmMuaXAKLQkJJiYgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51LmFsbAotCQk9PSB0dXBsZS0+c3JjLnUuYWxsKTsKLX0KLQotLyogT25seSBjYWxsZWQgZm9yIFNSQyBtYW5pcCAqLwotc3RhdGljIGludAotZmluZF9hcHByb3ByaWF0ZV9zcmMoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqcmVzdWx0LAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQotewotCXVuc2lnbmVkIGludCBoID0gaGFzaF9ieV9zcmModHVwbGUpOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCi0JcmVhZF9sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdCwgJmJ5c291cmNlW2hdLCBuYXQuaW5mby5ieXNvdXJjZSkgewotCQlpZiAoc2FtZV9zcmMoY3QsIHR1cGxlKSkgewotCQkJLyogQ29weSBzb3VyY2UgcGFydCBmcm9tIHJlcGx5IHR1cGxlLiAqLwotCQkJaW52ZXJ0X3R1cGxlcHIocmVzdWx0LAotCQkJCSAgICAgICAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKLQkJCXJlc3VsdC0+ZHN0ID0gdHVwbGUtPmRzdDsKLQotCQkJaWYgKGluX3JhbmdlKHJlc3VsdCwgcmFuZ2UpKSB7Ci0JCQkJcmVhZF91bmxvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlyZWFkX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotCXJldHVybiAwOwotfQotCi0vKiBGb3IgW0ZVVFVSRV0gZnJhZ21lbnRhdGlvbiBoYW5kbGluZywgd2Ugd2FudCB0aGUgbGVhc3QtdXNlZAotICAgc3JjLWlwL2RzdC1pcC9wcm90byB0cmlwbGUuICBGYWlybmVzcyBkb2Vzbid0IGNvbWUgaW50byBpdC4gIFRodXMKLSAgIGlmIHRoZSByYW5nZSBzcGVjaWZpZXMgMS4yLjMuNCBwb3J0cyAxMDAwMC0xMDAwNSBhbmQgMS4yLjMuNSBwb3J0cwotICAgMS02NTUzNSwgd2UgZG9uJ3QgZG8gcHJvLXJhdGEgYWxsb2NhdGlvbiBiYXNlZCBvbiBwb3J0czsgd2UgY2hvb3NlCi0gICB0aGUgaXAgd2l0aCB0aGUgbG93ZXN0IHNyYy1pcC9kc3QtaXAvcHJvdG8gdXNhZ2UuCi0qLwotc3RhdGljIHZvaWQKLWZpbmRfYmVzdF9pcHNfcHJvdG8oc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQotewotCV9fYmUzMiAqdmFyX2lwcDsKLQkvKiBIb3N0IG9yZGVyICovCi0JdV9pbnQzMl90IG1pbmlwLCBtYXhpcCwgajsKLQotCS8qIE5vIElQIG1hcHBpbmc/ICBEbyBub3RoaW5nLiAqLwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSkKLQkJcmV0dXJuOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQl2YXJfaXBwID0gJnR1cGxlLT5zcmMuaXA7Ci0JZWxzZQotCQl2YXJfaXBwID0gJnR1cGxlLT5kc3QuaXA7Ci0KLQkvKiBGYXN0IHBhdGg6IG9ubHkgb25lIGNob2ljZS4gKi8KLQlpZiAocmFuZ2UtPm1pbl9pcCA9PSByYW5nZS0+bWF4X2lwKSB7Ci0JCSp2YXJfaXBwID0gcmFuZ2UtPm1pbl9pcDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEhhc2hpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUHMgZ2l2ZXMgYSBmYWlybHkgZXZlbgotCSAqIHNwcmVhZCBpbiBwcmFjdGljZSAoaWYgdGhlcmUgYXJlIGEgc21hbGwgbnVtYmVyIG9mIElQcwotCSAqIGludm9sdmVkLCB0aGVyZSB1c3VhbGx5IGFyZW4ndCB0aGF0IG1hbnkgY29ubmVjdGlvbnMKLQkgKiBhbnl3YXkpLiAgVGhlIGNvbnNpc3RlbmN5IG1lYW5zIHRoYXQgc2VydmVycyBzZWUgdGhlIHNhbWUKLQkgKiBjbGllbnQgY29taW5nIGZyb20gdGhlIHNhbWUgSVAgKHNvbWUgSW50ZXJuZXQgQmFua2luZyBzaXRlcwotCSAqIGxpa2UgdGhpcyksIGV2ZW4gYWNyb3NzIHJlYm9vdHMuICovCi0JbWluaXAgPSBudG9obChyYW5nZS0+bWluX2lwKTsKLQltYXhpcCA9IG50b2hsKHJhbmdlLT5tYXhfaXApOwotCWogPSBqaGFzaF8yd29yZHMoKF9fZm9yY2UgdTMyKXR1cGxlLT5zcmMuaXAsIChfX2ZvcmNlIHUzMil0dXBsZS0+ZHN0LmlwLCAwKTsKLQkqdmFyX2lwcCA9IGh0b25sKG1pbmlwICsgaiAlIChtYXhpcCAtIG1pbmlwICsgMSkpOwotfQotCi0vKiBNYW5pcHVsYXRlIHRoZSB0dXBsZSBpbnRvIHRoZSByYW5nZSBnaXZlbi4gIEZvciBORl9JUF9QT1NUX1JPVVRJTkcsCi0gKiB3ZSBjaGFuZ2UgdGhlIHNvdXJjZSB0byBtYXAgaW50byB0aGUgcmFuZ2UuICBGb3IgTkZfSVBfUFJFX1JPVVRJTkcKLSAqIGFuZCBORl9JUF9MT0NBTF9PVVQsIHdlIGNoYW5nZSB0aGUgZGVzdGluYXRpb24gdG8gbWFwIGludG8gdGhlCi0gKiByYW5nZS4gIEl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSB0byBnZXQgYSB1bmlxdWUgdHVwbGUsIGJ1dCB3ZSB0cnkuCi0gKiBBdCB3b3JzdCAob3IgaWYgd2UgcmFjZSksIHdlIHdpbGwgZW5kIHVwIHdpdGggYSBmaW5hbCBkdXBsaWNhdGUgaW4KLSAqIF9faXBfY29ubnRyYWNrX2NvbmZpcm0gYW5kIGRyb3AgdGhlIHBhY2tldC4gKi8KLXN0YXRpYyB2b2lkCi1nZXRfdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZ190dXBsZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCi17Ci0Jc3RydWN0IGlwX25hdF9wcm90b2NvbCAqcHJvdG87Ci0KLQkvKiAxKSBJZiB0aGlzIHNyY2lwL3Byb3RvL3NyYy1wcm90by1wYXJ0IGlzIGN1cnJlbnRseSBtYXBwZWQsCi0JICAgYW5kIHRoYXQgc2FtZSBtYXBwaW5nIGdpdmVzIGEgdW5pcXVlIHR1cGxlIHdpdGhpbiB0aGUgZ2l2ZW4KLQkgICByYW5nZSwgdXNlIHRoYXQuCi0KLQkgICBUaGlzIGlzIG9ubHkgcmVxdWlyZWQgZm9yIHNvdXJjZSAoaWUuIE5BVC9tYXNxKSBtYXBwaW5ncy4KLQkgICBTbyBmYXIsIHdlIGRvbid0IGRvIGxvY2FsIHNvdXJjZSBtYXBwaW5ncywgc28gbXVsdGlwbGUKLQkgICBtYW5pcHMgbm90IGFuIGlzc3VlLiAgKi8KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKLQkJaWYgKGZpbmRfYXBwcm9wcmlhdGVfc3JjKG9yaWdfdHVwbGUsIHR1cGxlLCByYW5nZSkpIHsKLQkJCURFQlVHUCgiZ2V0X3VuaXF1ZV90dXBsZTogRm91bmQgY3VycmVudCBzcmMgbWFwXG4iKTsKLQkJCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKQotCQkJCWlmICghaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCi0JCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qIDIpIFNlbGVjdCB0aGUgbGVhc3QtdXNlZCBJUC9wcm90byBjb21iaW5hdGlvbiBpbiB0aGUgZ2l2ZW4KLQkgICByYW5nZS4gKi8KLQkqdHVwbGUgPSAqb3JpZ190dXBsZTsKLQlmaW5kX2Jlc3RfaXBzX3Byb3RvKHR1cGxlLCByYW5nZSwgY29ubnRyYWNrLCBtYW5pcHR5cGUpOwotCi0JLyogMykgVGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSBtYW5pcCBpcyBtYWRlIHRvIG1hcCBpbnRvCi0JICAgdGhlIHJhbmdlIHRvIG1ha2UgYSB1bmlxdWUgdHVwbGUuICovCi0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcHJvdG8gPSBfX2lwX25hdF9wcm90b19maW5kKG9yaWdfdHVwbGUtPmRzdC5wcm90b251bSk7Ci0KLQkvKiBDaGFuZ2UgcHJvdG9jb2wgaW5mbyB0byBoYXZlIHNvbWUgcmFuZG9taXphdGlvbiAqLwotCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSB7Ci0JCXByb3RvLT51bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGNvbm50cmFjayk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIE9ubHkgYm90aGVyIG1hcHBpbmcgaWYgaXQncyBub3QgYWxyZWFkeSBpbiByYW5nZSBhbmQgdW5pcXVlICovCi0JaWYgKCghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpCi0JICAgICB8fCBwcm90by0+aW5fcmFuZ2UodHVwbGUsIG1hbmlwdHlwZSwgJnJhbmdlLT5taW4sICZyYW5nZS0+bWF4KSkKLQkgICAgJiYgIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQotCQlnb3RvIG91dDsKLQotCS8qIExhc3QgY2hhbmdlOiBnZXQgcHJvdG9jb2wgdG8gdHJ5IHRvIG9idGFpbiB1bmlxdWUgdHVwbGUuICovCi0JcHJvdG8tPnVuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY29ubnRyYWNrKTsKLW91dDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotdW5zaWduZWQgaW50Ci1pcF9uYXRfc2V0dXBfaW5mbyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCSAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBjdXJyX3R1cGxlLCBuZXdfdHVwbGU7Ci0Jc3RydWN0IGlwX25hdF9pbmZvICppbmZvID0gJmNvbm50cmFjay0+bmF0LmluZm87Ci0JaW50IGhhdmVfdG9faGFzaCA9ICEoY29ubnRyYWNrLT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7Ci0JZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUgPSBIT09LMk1BTklQKGhvb2tudW0pOwotCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKLQkJICAgICB8fCBob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORwotCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfSU4KLQkJICAgICB8fCBob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCk7Ci0JQlVHX09OKGlwX25hdF9pbml0aWFsaXplZChjb25udHJhY2ssIG1hbmlwdHlwZSkpOwotCi0JLyogV2hhdCB3ZSd2ZSBnb3Qgd2lsbCBsb29rIGxpa2UgaW52ZXJzZSBvZiByZXBseS4gTm9ybWFsbHkKLQkgICB0aGlzIGlzIHdoYXQgaXMgaW4gdGhlIGNvbm50cmFjaywgZXhjZXB0IGZvciBwcmlvcgotCSAgIG1hbmlwdWxhdGlvbnMgKGZ1dHVyZSBvcHRpbWl6YXRpb246IGlmIG51bV9tYW5pcHMgPT0gMCwKLQkgICBvcmlnX3RwID0KLQkgICBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKSAqLwotCWludmVydF90dXBsZXByKCZjdXJyX3R1cGxlLAotCQkgICAgICAgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCi0JZ2V0X3VuaXF1ZV90dXBsZSgmbmV3X3R1cGxlLCAmY3Vycl90dXBsZSwgcmFuZ2UsIGNvbm50cmFjaywgbWFuaXB0eXBlKTsKLQotCWlmICghaXBfY3RfdHVwbGVfZXF1YWwoJm5ld190dXBsZSwgJmN1cnJfdHVwbGUpKSB7Ci0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgcmVwbHk7Ci0KLQkJLyogQWx0ZXIgY29ubnRyYWNrIHRhYmxlIHNvIHdpbGwgcmVjb2duaXplIHJlcGxpZXMuICovCi0JCWludmVydF90dXBsZXByKCZyZXBseSwgJm5ld190dXBsZSk7Ci0JCWlwX2Nvbm50cmFja19hbHRlcl9yZXBseShjb25udHJhY2ssICZyZXBseSk7Ci0KLQkJLyogTm9uLWF0b21pYzogd2Ugb3duIHRoaXMgYXQgdGhlIG1vbWVudC4gKi8KLQkJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQkJY29ubnRyYWNrLT5zdGF0dXMgfD0gSVBTX1NSQ19OQVQ7Ci0JCWVsc2UKLQkJCWNvbm50cmFjay0+c3RhdHVzIHw9IElQU19EU1RfTkFUOwotCX0KLQotCS8qIFBsYWNlIGluIHNvdXJjZSBoYXNoIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUuICovCi0JaWYgKGhhdmVfdG9faGFzaCkgewotCQl1bnNpZ25lZCBpbnQgc3JjaGFzaAotCQkJPSBoYXNoX2J5X3NyYygmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXQotCQkJCSAgICAgIC50dXBsZSk7Ci0JCXdyaXRlX2xvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQkJbGlzdF9hZGQoJmluZm8tPmJ5c291cmNlLCAmYnlzb3VyY2Vbc3JjaGFzaF0pOwotCQl3cml0ZV91bmxvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQl9Ci0KLQkvKiBJdCdzIGRvbmUuICovCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQotCQlzZXRfYml0KElQU19EU1RfTkFUX0RPTkVfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotCWVsc2UKLQkJc2V0X2JpdChJUFNfU1JDX05BVF9ET05FX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGlwX25hdF9zZXR1cF9pbmZvKTsKLQotLyogUmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZC4gKi8KLXN0YXRpYyBpbnQKLW1hbmlwX3BrdCh1X2ludDE2X3QgcHJvdG8sCi0JICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCi0JICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0YXJnZXQsCi0JICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBpcGhkcm9mZiArIHNpemVvZigqaXBoKSkpCi0JCXJldHVybiAwOwotCi0JaXBoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaXBoZHJvZmY7Ci0KLQkvKiBNYW5pcHVsYXRlIHByb3Rjb2wgcGFydC4gKi8KLQotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwotCXAgPSBfX2lwX25hdF9wcm90b19maW5kKHByb3RvKTsKLQlpZiAoIXAtPm1hbmlwX3BrdChwc2tiLCBpcGhkcm9mZiwgdGFyZ2V0LCBtYW5pcHR5cGUpKQotCQlyZXR1cm4gMDsKLQotCWlwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7Ci0JCW5mX2NzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLmlwKTsKLQkJaXBoLT5zYWRkciA9IHRhcmdldC0+c3JjLmlwOwotCX0gZWxzZSB7Ci0JCW5mX2NzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+ZGFkZHIsIHRhcmdldC0+ZHN0LmlwKTsKLQkJaXBoLT5kYWRkciA9IHRhcmdldC0+ZHN0LmlwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogRG8gcGFja2V0IG1hbmlwdWxhdGlvbnMgYWNjb3JkaW5nIHRvIGlwX25hdF9zZXR1cF9pbmZvLiAqLwotdW5zaWduZWQgaW50IGlwX25hdF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQotewotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBzdGF0dXNiaXQ7Ci0JZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtdHlwZSA9IEhPT0syTUFOSVAoaG9va251bSk7Ci0KLQlpZiAobXR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJc3RhdHVzYml0ID0gSVBTX1NSQ19OQVQ7Ci0JZWxzZQotCQlzdGF0dXNiaXQgPSBJUFNfRFNUX05BVDsKLQotCS8qIEludmVydCBpZiB0aGlzIGlzIHJlcGx5IGRpci4gKi8KLQlpZiAoZGlyID09IElQX0NUX0RJUl9SRVBMWSkKLQkJc3RhdHVzYml0IF49IElQU19OQVRfTUFTSzsKLQotCS8qIE5vbi1hdG9taWM6IHRoZXNlIGJpdHMgZG9uJ3QgY2hhbmdlLiAqLwotCWlmIChjdC0+c3RhdHVzICYgc3RhdHVzYml0KSB7Ci0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdGFyZ2V0OwotCi0JCS8qIFdlIGFyZSBhaW1pbmcgdG8gbG9vayBsaWtlIGludmVyc2Ugb2Ygb3RoZXIgZGlyZWN0aW9uLiAqLwotCQlpbnZlcnRfdHVwbGVwcigmdGFyZ2V0LCAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZSk7Ci0KLQkJaWYgKCFtYW5pcF9wa3QodGFyZ2V0LmRzdC5wcm90b251bSwgcHNrYiwgMCwgJnRhcmdldCwgbXR5cGUpKQotCQkJcmV0dXJuIE5GX0RST1A7Ci0JfQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfcGFja2V0KTsKLQotLyogRGlyIGlzIGRpcmVjdGlvbiBJQ01QIGlzIGNvbWluZyBmcm9tIChvcHBvc2l0ZSB0byBwYWNrZXQgaXQgY29udGFpbnMpICovCi1pbnQgaXBfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQotewotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpY21waGRyIGljbXA7Ci0JCXN0cnVjdCBpcGhkciBpcDsKLQl9ICppbnNpZGU7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBpbm5lciwgdGFyZ2V0OwotCWludCBoZHJsZW4gPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQ7Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKLQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwID0gSE9PSzJNQU5JUChob29rbnVtKTsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRybGVuICsgc2l6ZW9mKCppbnNpZGUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OwotCi0JLyogV2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gbWFuZ2xlIGl0IGJleW9uZCB0cml2aWFsIGNoZWNrc3VtCi0JICAgYWRqdXN0bWVudCwgc28gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNoZWNrc3VtIGlzIGNvcnJlY3QuICovCi0JaWYgKG5mX2lwX2NoZWNrc3VtKCpwc2tiLCBob29rbnVtLCBoZHJsZW4sIDApKQotCQlyZXR1cm4gMDsKLQotCS8qIE11c3QgYmUgUkVMQVRFRCAqLwotCUlQX05GX0FTU0VSVCgoKnBza2IpLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8Ci0JCSAgICAgKCpwc2tiKS0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWSk7Ci0KLQkvKiBSZWRpcmVjdHMgb24gbm9uLW51bGwgbmF0cyBtdXN0IGJlIGRyb3BwZWQsIGVsc2UgdGhleSdsbAotCSAgIHN0YXJ0IHRhbGtpbmcgdG8gZWFjaCBvdGhlciB3aXRob3V0IG91ciB0cmFuc2xhdGlvbiwgYW5kIGJlCi0JICAgY29uZnVzZWQuLi4gLS1SUiAqLwotCWlmIChpbnNpZGUtPmljbXAudHlwZSA9PSBJQ01QX1JFRElSRUNUKSB7Ci0JCS8qIElmIE5BVCBpc24ndCBmaW5pc2hlZCwgYXNzdW1lIGl0IGFuZCBkcm9wLiAqLwotCQlpZiAoKGN0LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSykgIT0gSVBTX05BVF9ET05FX01BU0spCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKLQkJCXJldHVybiAwOwotCX0KLQotCURFQlVHUCgiaWNtcF9yZXBseV90cmFuc2xhdGlvbjogdHJhbnNsYXRpbmcgZXJyb3IgJXAgbWFucCAldSBkaXIgJXNcbiIsCi0JICAgICAgICpwc2tiLCBtYW5pcCwgZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCA/ICJPUklHIiA6ICJSRVBMWSIpOwotCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCi0JcHJvdG8gPSBfX2lwX2Nvbm50cmFja19wcm90b19maW5kKGluc2lkZS0+aXAucHJvdG9jb2wpOwotCWlmICghaXBfY3RfZ2V0X3R1cGxlKCZpbnNpZGUtPmlwLCAqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKyBpbnNpZGUtPmlwLmlobCo0LAotCQkJICAgICAmaW5uZXIsIHByb3RvKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGFuZ2UgaW5uZXIgYmFjayB0byBsb29rIGxpa2UgaW5jb21pbmcgcGFja2V0LiAgV2UgZG8gdGhlCi0JICAgb3Bwb3NpdGUgbWFuaXAgb24gdGhpcyBob29rIHRvIG5vcm1hbCwgYmVjYXVzZSBpdCBtaWdodCBub3QKLQkgICBwYXNzIGFsbCBob29rcyAobG9jYWxseS1nZW5lcmF0ZWQgSUNNUCkuICBDb25zaWRlciBpbmNvbWluZwotCSAgIHBhY2tldDogUFJFUk9VVElORyAoRFNUIG1hbmlwKSwgcm91dGluZyBwcm9kdWNlcyBJQ01QLCBnb2VzCi0JICAgdGhyb3VnaCBQT1NUUk9VVElORyAod2hpY2ggbXVzdCBjb3JyZWN0IHRoZSBEU1QgbWFuaXApLiAqLwotCWlmICghbWFuaXBfcGt0KGluc2lkZS0+aXAucHJvdG9jb2wsIHBza2IsCi0JCSAgICAgICAoKnBza2IpLT5uaC5pcGgtPmlobCo0Ci0JCSAgICAgICArIHNpemVvZihpbnNpZGUtPmljbXApLAotCQkgICAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUsCi0JCSAgICAgICAhbWFuaXApKQotCQlyZXR1cm4gMDsKLQotCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQkvKiBSZWxvYWRpbmcgImluc2lkZSIgaGVyZSBzaW5jZSBtYW5pcF9wa3QgaW5uZXIuICovCi0JCWluc2lkZSA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7Ci0JCWluc2lkZS0+aWNtcC5jaGVja3N1bSA9IDA7Ci0JCWluc2lkZS0+aWNtcC5jaGVja3N1bSA9IGNzdW1fZm9sZChza2JfY2hlY2tzdW0oKnBza2IsIGhkcmxlbiwKLQkJCQkJCQkgICAgICAgKCpwc2tiKS0+bGVuIC0gaGRybGVuLAotCQkJCQkJCSAgICAgICAwKSk7Ci0JfQotCi0JLyogQ2hhbmdlIG91dGVyIHRvIGxvb2sgdGhlIHJlcGx5IHRvIGFuIGluY29taW5nIHBhY2tldAotCSAqIChwcm90byAwIG1lYW5zIGRvbid0IGludmVydCBwZXItcHJvdG8gcGFydCkuICovCi0JaWYgKG1hbmlwID09IElQX05BVF9NQU5JUF9TUkMpCi0JCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOwotCWVsc2UKLQkJc3RhdHVzYml0ID0gSVBTX0RTVF9OQVQ7Ci0KLQkvKiBJbnZlcnQgaWYgdGhpcyBpcyByZXBseSBkaXIuICovCi0JaWYgKGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpCi0JCXN0YXR1c2JpdCBePSBJUFNfTkFUX01BU0s7Ci0KLQlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgewotCQlpbnZlcnRfdHVwbGVwcigmdGFyZ2V0LCAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZSk7Ci0JCWlmICghbWFuaXBfcGt0KDAsIHBza2IsIDAsICZ0YXJnZXQsIG1hbmlwKSkKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24pOwotCi0vKiBQcm90b2NvbCByZWdpc3RyYXRpb24uICovCi1pbnQgaXBfbmF0X3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKQotewotCWludCByZXQgPSAwOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfbmF0X2xvY2spOwotCWlmIChpcF9uYXRfcHJvdG9zW3Byb3RvLT5wcm90b251bV0gIT0gJmlwX25hdF91bmtub3duX3Byb3RvY29sKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHJvdG9zW3Byb3RvLT5wcm90b251bV0sIHByb3RvKTsKLSBvdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X3Byb3RvY29sX3JlZ2lzdGVyKTsKLQotLyogTm9vbmUgc3RvcmVzIHRoZSBwcm90b2NvbCBhbnl3aGVyZTsgc2ltcGx5IGRlbGV0ZSBpdC4gKi8KLXZvaWQgaXBfbmF0X3Byb3RvY29sX3VucmVnaXN0ZXIoc3RydWN0IGlwX25hdF9wcm90b2NvbCAqcHJvdG8pCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfbmF0X2xvY2spOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHJvdG9zW3Byb3RvLT5wcm90b251bV0sCi0JCQkgICAmaXBfbmF0X3Vua25vd25fcHJvdG9jb2wpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotCXN5bmNocm9uaXplX3JjdSgpOwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHJvdG9jb2xfdW5yZWdpc3Rlcik7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLWludAotaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0JTkZBX1BVVChza2IsIENUQV9QUk9UT05BVF9QT1JUX01JTiwgc2l6ZW9mKF9fYmUxNiksCi0JCSZyYW5nZS0+bWluLnRjcC5wb3J0KTsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPTkFUX1BPUlRfTUFYLCBzaXplb2YoX19iZTE2KSwKLQkJJnJhbmdlLT5tYXgudGNwLnBvcnQpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotaW50Ci1pcF9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2Uoc3RydWN0IG5mYXR0ciAqdGJbXSwgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiB3ZSBoYXZlIHRvIHJldHVybiB3aGV0aGVyIHdlIGFjdHVhbGx5IHBhcnNlZCBzb21ldGhpbmcgb3Igbm90ICovCi0KLQlpZiAodGJbQ1RBX1BST1RPTkFUX1BPUlRfTUlOLTFdKSB7Ci0JCXJldCA9IDE7Ci0JCXJhbmdlLT5taW4udGNwLnBvcnQgPQotCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0pOwotCX0KLQotCWlmICghdGJbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdKSB7Ci0JCWlmIChyZXQpCi0JCQlyYW5nZS0+bWF4LnRjcC5wb3J0ID0gcmFuZ2UtPm1pbi50Y3AucG9ydDsKLQl9IGVsc2UgewotCQlyZXQgPSAxOwotCQlyYW5nZS0+bWF4LnRjcC5wb3J0ID0KLQkJCSooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9wb3J0X3JhbmdlX3RvX25mYXR0cik7Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2luaXQodm9pZCkKLXsKLQlzaXplX3QgaTsKLQotCS8qIExlYXZlIHRoZW0gdGhlIHNhbWUgZm9yIHRoZSBtb21lbnQuICovCi0JaXBfbmF0X2h0YWJsZV9zaXplID0gaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCi0JLyogT25lIHZtYWxsb2MgZm9yIGJvdGggaGFzaCB0YWJsZXMgKi8KLQlieXNvdXJjZSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogaXBfbmF0X2h0YWJsZV9zaXplKTsKLQlpZiAoIWJ5c291cmNlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFNldyBpbiBidWlsdGluIHByb3RvY29scy4gKi8KLQl3cml0ZV9sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9JUF9OQVRfUFJPVE87IGkrKykKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbaV0sICZpcF9uYXRfdW5rbm93bl9wcm90b2NvbCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbSVBQUk9UT19UQ1BdLCAmaXBfbmF0X3Byb3RvY29sX3RjcCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbSVBQUk9UT19VRFBdLCAmaXBfbmF0X3Byb3RvY29sX3VkcCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbSVBQUk9UT19JQ01QXSwgJmlwX25hdF9wcm90b2NvbF9pY21wKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBpcF9uYXRfaHRhYmxlX3NpemU7IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmYnlzb3VyY2VbaV0pOwotCX0KLQotCS8qIEZJWE1FOiBNYW4sIHRoaXMgaXMgYSBoYWNrLiAgPFNJR0g+ICovCi0JSVBfTkZfQVNTRVJUKHJjdV9kZXJlZmVyZW5jZShpcF9jb25udHJhY2tfZGVzdHJveWVkKSA9PSBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCwgaXBfbmF0X2NsZWFudXBfY29ubnRyYWNrKTsKLQotCS8qIEluaXRpYWxpemUgZmFrZSBjb25udHJhY2sgc28gdGhhdCBOQVQgd2lsbCBza2lwIGl0ICovCi0JaXBfY29ubnRyYWNrX3VudHJhY2tlZC5zdGF0dXMgfD0gSVBTX05BVF9ET05FX01BU0s7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIENsZWFyIE5BVCBzZWN0aW9uIG9mIGFsbCBjb25udHJhY2tzLCBpbiBjYXNlIHdlJ3JlIGxvYWRlZCBhZ2Fpbi4gKi8KLXN0YXRpYyBpbnQgY2xlYW5fbmF0KHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmRhdGEpCi17Ci0JbWVtc2V0KCZpLT5uYXQsIDAsIHNpemVvZihpLT5uYXQpKTsKLQlpLT5zdGF0dXMgJj0gfihJUFNfTkFUX01BU0sgfCBJUFNfTkFUX0RPTkVfTUFTSyB8IElQU19TRVFfQURKVVNUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9jbGVhbnVwKHZvaWQpCi17Ci0JaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKCZjbGVhbl9uYXQsIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jb25udHJhY2tfZGVzdHJveWVkLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQl2ZnJlZShieXNvdXJjZSk7Ci19Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX2luaXQoaXBfbmF0X2luaXQpOwotbW9kdWxlX2V4aXQoaXBfbmF0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZTAxZDguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiBGVFAgZXh0ZW5zaW9uIGZvciBUQ1AgTkFUIGFsdGVyYXRpb24uICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJmdHAgTkFUIGhlbHBlciIpOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qIEZJWE1FOiBUaW1lIG91dD8gLS1SUiAqLwotCi1zdGF0aWMgaW50Ci1tYW5nbGVfcmZjOTU5X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgICAgX19iZTMyIG5ld2lwLAotCQkgICAgIHVfaW50MTZfdCBwb3J0LAotCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgdTMyICpzZXEpCi17Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCJubm4sbm5uLG5ubixubm4sbm5uLG5ubiIpXTsKLQotCXNwcmludGYoYnVmZmVyLCAiJXUsJXUsJXUsJXUsJXUsJXUiLAotCQlOSVBRVUFEKG5ld2lwKSwgcG9ydD4+OCwgcG9ydCYweEZGKTsKLQotCURFQlVHUCgiY2FsbGluZyBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXRcbiIpOwotCi0JKnNlcSArPSBzdHJsZW4oYnVmZmVyKSAtIG1hdGNobGVuOwotCXJldHVybiBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywgbWF0Y2hvZmYsCi0JCQkJCW1hdGNobGVuLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLX0KLQotLyogfDF8MTMyLjIzNS4xLjJ8NjI3NXwgKi8KLXN0YXRpYyBpbnQKLW1hbmdsZV9lcHJ0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgIF9fYmUzMiBuZXdpcCwKLQkJICAgdV9pbnQxNl90IHBvcnQsCi0JCSAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgIHUzMiAqc2VxKQotewotCWNoYXIgYnVmZmVyW3NpemVvZigifDF8MjU1LjI1NS4yNTUuMjU1fDY1NTM1fCIpXTsKLQotCXNwcmludGYoYnVmZmVyLCAifDF8JXUuJXUuJXUuJXV8JXV8IiwgTklQUVVBRChuZXdpcCksIHBvcnQpOwotCi0JREVCVUdQKCJjYWxsaW5nIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7Ci0KLQkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47Ci0JcmV0dXJuIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwKLQkJCQkJbWF0Y2hsZW4sIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotfQotCi0vKiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLwotc3RhdGljIGludAotbWFuZ2xlX2Vwc3ZfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgX19iZTMyIG5ld2lwLAotCQkgICB1X2ludDE2X3QgcG9ydCwKLQkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCSAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgdTMyICpzZXEpCi17Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCJ8fHw2NTUzNXwiKV07Ci0KLQlzcHJpbnRmKGJ1ZmZlciwgInx8fCV1fCIsIHBvcnQpOwotCi0JREVCVUdQKCJjYWxsaW5nIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7Ci0KLQkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47Ci0JcmV0dXJuIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwKLQkJCQkJbWF0Y2hsZW4sIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotfQotCi1zdGF0aWMgaW50ICgqbWFuZ2xlW10pKHN0cnVjdCBza19idWZmICoqLCBfX2JlMzIsIHVfaW50MTZfdCwKLQkJICAgICB1bnNpZ25lZCBpbnQsCi0JCSAgICAgdW5zaWduZWQgaW50LAotCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKiwKLQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvLAotCQkgICAgIHUzMiAqc2VxKQotPSB7IFtJUF9DVF9GVFBfUE9SVF0gPSBtYW5nbGVfcmZjOTU5X3BhY2tldCwKLSAgICBbSVBfQ1RfRlRQX1BBU1ZdID0gbWFuZ2xlX3JmYzk1OV9wYWNrZXQsCi0gICAgW0lQX0NUX0ZUUF9FUFJUXSA9IG1hbmdsZV9lcHJ0X3BhY2tldCwKLSAgICBbSVBfQ1RfRlRQX0VQU1ZdID0gbWFuZ2xlX2Vwc3ZfcGFja2V0Ci19OwotCi0vKiBTbywgdGhpcyBwYWNrZXQgaGFzIGhpdCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaGluZyBjb2RlLgotICAgTWFuZ2xlIGl0LCBhbmQgY2hhbmdlIHRoZSBleHBlY3RhdGlvbiB0byBtYXRjaCB0aGUgbmV3IHZlcnNpb24uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9mdHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIGVudW0gaXBfY3RfZnRwX3R5cGUgdHlwZSwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAsCi0JCQkgICAgICAgdTMyICpzZXEpCi17Ci0JX19iZTMyIG5ld2lwOwotCXVfaW50MTZfdCBwb3J0OwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBleHAtPm1hc3RlcjsKLQotCURFQlVHUCgiRlRQX05BVDogdHlwZSAlaSwgb2ZmICV1IGxlbiAldVxuIiwgdHlwZSwgbWF0Y2hvZmYsIG1hdGNobGVuKTsKLQotCS8qIENvbm5lY3Rpb24gd2lsbCBjb21lIGZyb20gd2hlcmV2ZXIgdGhpcyBwYWNrZXQgZ29lcywgaGVuY2UgIWRpciAqLwotCW5ld2lwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JZXhwLT5kaXIgPSAhZGlyOwotCi0JLyogV2hlbiB5b3Ugc2VlIHRoZSBwYWNrZXQsIHdlIG5lZWQgdG8gTkFUIGl0IHRoZSBzYW1lIGFzIHRoZQotCSAqIHRoaXMgb25lLiAqLwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfZm9sbG93X21hc3RlcjsKLQotCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCi0JZm9yIChwb3J0ID0gbnRvaHMoZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCk7IHBvcnQgIT0gMDsgcG9ydCsrKSB7Ci0JCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocG9ydCA9PSAwKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCWlmICghbWFuZ2xlW3R5cGVdKHBza2IsIG5ld2lwLCBwb3J0LCBtYXRjaG9mZiwgbWF0Y2hsZW4sIGN0LCBjdGluZm8sCi0JCQkgIHNlcSkpIHsKLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQkJcmV0dXJuIE5GX0RST1A7Ci0JfQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfZnRwX2Zpbmkodm9pZCkKLXsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2Z0cF9ob29rLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2Z0cF9pbml0KHZvaWQpCi17Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfZnRwX2hvb2spKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2Z0cF9ob29rLCBpcF9uYXRfZnRwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogUHJpb3IgdG8gMi42LjExLCB3ZSBoYWQgYSBwb3J0cyBwYXJhbS4gIE5vIGxvbmdlciwgYnV0IGRvbid0IGJyZWFrIHVzZXJzLiAqLwotc3RhdGljIGludCB3YXJuX3NldChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUKLQkgICAgICAgIjoga2VybmVsID49IDIuNi4xMCBvbmx5IHVzZXMgJ3BvcnRzJyBmb3IgY29ubnRyYWNrIG1vZHVsZXNcbiIpOwotCXJldHVybiAwOwotfQotbW9kdWxlX3BhcmFtX2NhbGwocG9ydHMsIHdhcm5fc2V0LCBOVUxMLCBOVUxMLCAwKTsKLQotbW9kdWxlX2luaXQoaXBfbmF0X2Z0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX25hdF9mdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3NzhjZi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qIGlwX25hdF9oZWxwZXIuYyAtIGdlbmVyaWMgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIE5BVCBoZWxwZXJzCi0gKgotICogKEMpIDIwMDAtMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqIChDKSAyMDAzLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIAkxNCBKYW4gMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPjoKLSAqCQktIGFkZCBzdXBwb3J0IGZvciBTQUNLIGFkanVzdG1lbnQKLSAqCTE0IE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+OgotICoJCS0gbWVyZ2UgU0FDSyBzdXBwb3J0IGludG8gbmV3bmF0IEFQSQotICoJMTYgQXVnIDIwMDIgQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT46Ci0gKgkJLSBtYWtlIGlwX25hdF9yZXNpemVfcGFja2V0IG1vcmUgZ2VuZXJpYyAoVENQIGFuZCBVRFApCi0gKgkJLSBhZGQgaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L2ljbXAuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L3VkcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZGVmaW5lIERVTVBfT0ZGU0VUKHgpCXByaW50aygib2Zmc2V0X2JlZm9yZT0lZCwgb2Zmc2V0X2FmdGVyPSVkLCBjb3JyZWN0aW9uX3Bvcz0ldVxuIiwgeC0+b2Zmc2V0X2JlZm9yZSwgeC0+b2Zmc2V0X2FmdGVyLCB4LT5jb3JyZWN0aW9uX3Bvcyk7Ci0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2RlZmluZSBEVU1QX09GRlNFVCh4KQotI2VuZGlmCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBfbmF0X3NlcW9mc19sb2NrKTsKLQotLyogU2V0dXAgVENQIHNlcXVlbmNlIGNvcnJlY3Rpb24gZ2l2ZW4gdGhpcyBjaGFuZ2UgYXQgdGhpcyBzZXF1ZW5jZSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1hZGp1c3RfdGNwX3NlcXVlbmNlKHUzMiBzZXEsCi0JCSAgICBpbnQgc2l6ZWRpZmYsCi0JCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCWludCBkaXI7Ci0Jc3RydWN0IGlwX25hdF9zZXEgKnRoaXNfd2F5LCAqb3RoZXJfd2F5OwotCi0JREVCVUdQKCJpcF9uYXRfcmVzaXplX3BhY2tldDogb2xkX3NpemUgPSAldSwgbmV3X3NpemUgPSAldVxuIiwKLQkJKCpza2IpLT5sZW4sIG5ld19zaXplKTsKLQotCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQotCXRoaXNfd2F5ID0gJmN0LT5uYXQuaW5mby5zZXFbZGlyXTsKLQlvdGhlcl93YXkgPSAmY3QtPm5hdC5pbmZvLnNlcVshZGlyXTsKLQotCURFQlVHUCgiaXBfbmF0X3Jlc2l6ZV9wYWNrZXQ6IFNlcV9vZmZzZXQgYmVmb3JlOiAiKTsKLQlEVU1QX09GRlNFVCh0aGlzX3dheSk7Ci0KLQlzcGluX2xvY2tfYmgoJmlwX25hdF9zZXFvZnNfbG9jayk7Ci0KLQkvKiBTWU4gYWRqdXN0LiBJZiBpdCdzIHVuaW5pdGlhbGl6ZWQsIG9yIHRoaXMgaXMgYWZ0ZXIgbGFzdAotCSAqIGNvcnJlY3Rpb24sIHJlY29yZCBpdDogd2UgZG9uJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUKLQkgKiBhZGp1c3RtZW50IGluIHRoZSB3aW5kb3csIGJ1dCBkbyBkZWFsIHdpdGggY29tbW9uIGNhc2Ugb2YgYQotCSAqIHJldHJhbnNtaXQgKi8KLQlpZiAodGhpc193YXktPm9mZnNldF9iZWZvcmUgPT0gdGhpc193YXktPm9mZnNldF9hZnRlcgotCSAgICB8fCBiZWZvcmUodGhpc193YXktPmNvcnJlY3Rpb25fcG9zLCBzZXEpKSB7Ci0JCSAgICB0aGlzX3dheS0+Y29ycmVjdGlvbl9wb3MgPSBzZXE7Ci0JCSAgICB0aGlzX3dheS0+b2Zmc2V0X2JlZm9yZSA9IHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXI7Ci0JCSAgICB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyICs9IHNpemVkaWZmOwotCX0KLQlzcGluX3VubG9ja19iaCgmaXBfbmF0X3NlcW9mc19sb2NrKTsKLQotCURFQlVHUCgiaXBfbmF0X3Jlc2l6ZV9wYWNrZXQ6IFNlcV9vZmZzZXQgYWZ0ZXI6ICIpOwotCURVTVBfT0ZGU0VUKHRoaXNfd2F5KTsKLX0KLQotLyogRnJvYnMgZGF0YSBpbnNpZGUgdGhpcyBwYWNrZXQsIHdoaWNoIGlzIGxpbmVhci4gKi8KLXN0YXRpYyB2b2lkIG1hbmdsZV9jb250ZW50cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgIHVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCi0JCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKLQkJCSAgICBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAotCQkJICAgIHVuc2lnbmVkIGludCByZXBfbGVuKQotewotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0KLQlCVUdfT04oc2tiX2lzX25vbmxpbmVhcihza2IpKTsKLQlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwaCArIGRhdGFvZmY7Ci0KLQkvKiBtb3ZlIHBvc3QtcmVwbGFjZW1lbnQgKi8KLQltZW1tb3ZlKGRhdGEgKyBtYXRjaF9vZmZzZXQgKyByZXBfbGVuLAotCQlkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuLAotCQlza2ItPnRhaWwgLSAoZGF0YSArIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikpOwotCi0JLyogaW5zZXJ0IGRhdGEgZnJvbSBidWZmZXIgKi8KLQltZW1jcHkoZGF0YSArIG1hdGNoX29mZnNldCwgcmVwX2J1ZmZlciwgcmVwX2xlbik7Ci0KLQkvKiB1cGRhdGUgc2tiIGluZm8gKi8KLQlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbikgewotCQlERUJVR1AoImlwX25hdF9tYW5nbGVfcGFja2V0OiBFeHRlbmRpbmcgcGFja2V0IGJ5ICIKLQkJCSIldSBmcm9tICV1IGJ5dGVzXG4iLCByZXBfbGVuIC0gbWF0Y2hfbGVuLAotCQkgICAgICAgc2tiLT5sZW4pOwotCQlza2JfcHV0KHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbik7Ci0JfSBlbHNlIHsKLQkJREVCVUdQKCJpcF9uYXRfbWFuZ2xlX3BhY2tldDogU2hyaW5raW5nIHBhY2tldCBmcm9tICIKLQkJCSIldSBmcm9tICV1IGJ5dGVzXG4iLCBtYXRjaF9sZW4gLSByZXBfbGVuLAotCQkgICAgICAgc2tiLT5sZW4pOwotCQlfX3NrYl90cmltKHNrYiwgc2tiLT5sZW4gKyByZXBfbGVuIC0gbWF0Y2hfbGVuKTsKLQl9Ci0KLQkvKiBmaXggSVAgaGRyIGNoZWNrc3VtIGluZm9ybWF0aW9uICovCi0Jc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7Ci19Ci0KLS8qIFVudXN1YWwsIGJ1dCBwb3NzaWJsZSBjYXNlLiAqLwotc3RhdGljIGludCBlbmxhcmdlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBleHRyYSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQotCWlmICgoKnBza2IpLT5sZW4gKyBleHRyYSA+IDY1NTM1KQotCQlyZXR1cm4gMDsKLQotCW5za2IgPSBza2JfY29weV9leHBhbmQoKnBza2IsIHNrYl9oZWFkcm9vbSgqcHNrYiksIGV4dHJhLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW5za2IpCi0JCXJldHVybiAwOwotCi0JLyogVHJhbnNmZXIgc29ja2V0IHRvIG5ldyBza2IuICovCi0JaWYgKCgqcHNrYiktPnNrKQotCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOwotCWtmcmVlX3NrYigqcHNrYik7Ci0JKnBza2IgPSBuc2tiOwotCXJldHVybiAxOwotfQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBtYW5nbGluZyB2YXJpYWJsZS1sZW5ndGggYWRkcmVzcyBjaGFuZ2VzIGluc2lkZQotICogTkFUZWQgVENQIGNvbm5lY3Rpb25zIChsaWtlIHRoZSBQT1JUIFhYWCxYWFgsWFhYLFhYWCxYWFgsWFhYCi0gKiBjb21tYW5kIGluIEZUUCkuCi0gKgotICogVGFrZXMgY2FyZSBhYm91dCBhbGwgdGhlIG5hc3R5IHNlcXVlbmNlIG51bWJlciBjaGFuZ2VzLCBjaGVja3N1bW1pbmcsCi0gKiBza2IgZW5sYXJnZW1lbnQsIC4uLgotICoKLSAqICovCi1pbnQKLWlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAotCQkJIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCi0JCQkgdW5zaWduZWQgaW50IHJlcF9sZW4pCi17Ci0Jc3RydWN0IGlwaGRyICppcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGNwaDsKLQlpbnQgb2xkbGVuLCBkYXRhbGVuOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQotCQlyZXR1cm4gMDsKLQotCWlmIChyZXBfbGVuID4gbWF0Y2hfbGVuCi0JICAgICYmIHJlcF9sZW4gLSBtYXRjaF9sZW4gPiBza2JfdGFpbHJvb20oKnBza2IpCi0JICAgICYmICFlbmxhcmdlX3NrYihwc2tiLCByZXBfbGVuIC0gbWF0Y2hfbGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlTS0JfTElORUFSX0FTU0VSVCgqcHNrYik7Ci0KLQlpcGggPSAoKnBza2IpLT5uaC5pcGg7Ci0JdGNwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKLQotCW9sZGxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7Ci0JbWFuZ2xlX2NvbnRlbnRzKCpwc2tiLCBpcGgtPmlobCo0ICsgdGNwaC0+ZG9mZio0LAotCQkJbWF0Y2hfb2Zmc2V0LCBtYXRjaF9sZW4sIHJlcF9idWZmZXIsIHJlcF9sZW4pOwotCi0JZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7Ci0JaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXRjcGgtPmNoZWNrID0gMDsKLQkJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2soZGF0YWxlbiwKLQkJCQkJICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkJICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGNwaCwKLQkJCQkJCQlkYXRhbGVuLCAwKSk7Ci0JfSBlbHNlCi0JCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKLQkJCQkJaHRvbnMob2xkbGVuKSwgaHRvbnMoZGF0YWxlbiksIDEpOwotCi0JaWYgKHJlcF9sZW4gIT0gbWF0Y2hfbGVuKSB7Ci0JCXNldF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cyk7Ci0JCWFkanVzdF90Y3Bfc2VxdWVuY2UobnRvaGwodGNwaC0+c2VxKSwKLQkJCQkgICAgKGludClyZXBfbGVuIC0gKGludCltYXRjaF9sZW4sCi0JCQkJICAgIGN0LCBjdGluZm8pOwotCQkvKiBUZWxsIFRDUCB3aW5kb3cgdHJhY2tpbmcgYWJvdXQgc2VxIGNoYW5nZSAqLwotCQlpcF9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgY3QsIENUSU5GTzJESVIoY3RpbmZvKSk7Ci0JfQotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQpOwotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBtYW5nbGluZyB2YXJpYWJsZS1sZW5ndGggYWRkcmVzcyBjaGFuZ2VzIGluc2lkZQotICogTkFUZWQgVURQIGNvbm5lY3Rpb25zIChsaWtlIHRoZSBDT05ORUNUIERBVEEgWFhYWFggTUVTRyBYWFhYWCBJTkRFWCBYWFhYWAotICogY29tbWFuZCBpbiB0aGUgQW1hbmRhIHByb3RvY29sKQotICoKLSAqIFRha2VzIGNhcmUgYWJvdXQgYWxsIHRoZSBuYXN0eSBzZXF1ZW5jZSBudW1iZXIgY2hhbmdlcywgY2hlY2tzdW1taW5nLAotICogc2tiIGVubGFyZ2VtZW50LCAuLi4KLSAqCi0gKiBYWFggLSBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1lcmdlZCB3aXRoIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldCB3aGljaAotICogICAgICAgc2hvdWxkIGJlIGZhaXJseSBlYXN5IHRvIGRvLgotICovCi1pbnQKLWlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAotCQkJIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCi0JCQkgdW5zaWduZWQgaW50IHJlcF9sZW4pCi17Ci0Jc3RydWN0IGlwaGRyICppcGg7Ci0Jc3RydWN0IHVkcGhkciAqdWRwaDsKLQlpbnQgZGF0YWxlbiwgb2xkbGVuOwotCi0JLyogVURQIGhlbHBlcnMgbWlnaHQgYWNjaWRlbnRhbGx5IG1hbmdsZSB0aGUgd3JvbmcgcGFja2V0ICovCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCWlmICgoKnBza2IpLT5sZW4gPCBpcGgtPmlobCo0ICsgc2l6ZW9mKCp1ZHBoKSArCi0JCQkgICAgICAgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKQotCQlyZXR1cm4gMDsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbgotCSAgICAmJiByZXBfbGVuIC0gbWF0Y2hfbGVuID4gc2tiX3RhaWxyb29tKCpwc2tiKQotCSAgICAmJiAhZW5sYXJnZV9za2IocHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbikpCi0JCXJldHVybiAwOwotCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCXVkcGggPSAodm9pZCAqKWlwaCArIGlwaC0+aWhsKjQ7Ci0KLQlvbGRsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwotCW1hbmdsZV9jb250ZW50cygqcHNrYiwgaXBoLT5paGwqNCArIHNpemVvZigqdWRwaCksCi0JCQltYXRjaF9vZmZzZXQsIG1hdGNoX2xlbiwgcmVwX2J1ZmZlciwgcmVwX2xlbik7Ci0KLQkvKiB1cGRhdGUgdGhlIGxlbmd0aCBvZiB0aGUgVURQIHBhY2tldCAqLwotCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwotCXVkcGgtPmxlbiA9IGh0b25zKGRhdGFsZW4pOwotCi0JLyogZml4IHVkcCBjaGVja3N1bSBpZiB1ZHAgY2hlY2tzdW0gd2FzIHByZXZpb3VzbHkgY2FsY3VsYXRlZCAqLwotCWlmICghdWRwaC0+Y2hlY2sgJiYgKCpwc2tiKS0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCi0JCXJldHVybiAxOwotCi0JaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXVkcGgtPmNoZWNrID0gMDsKLQkJdWRwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJCQkJZGF0YWxlbiwgSVBQUk9UT19VRFAsCi0JCQkJCQljc3VtX3BhcnRpYWwoKGNoYXIgKil1ZHBoLAotCQkJCQkJCSAgICAgZGF0YWxlbiwgMCkpOwotCQlpZiAoIXVkcGgtPmNoZWNrKQotCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKLQl9IGVsc2UKLQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdWRwaC0+Y2hlY2ssICpwc2tiLAotCQkJCQlodG9ucyhvbGRsZW4pLCBodG9ucyhkYXRhbGVuKSwgMSk7Ci0JcmV0dXJuIDE7Ci19Ci1FWFBPUlRfU1lNQk9MKGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldCk7Ci0KLS8qIEFkanVzdCBvbmUgZm91bmQgU0FDSyBvcHRpb24gaW5jbHVkaW5nIGNoZWNrc3VtIGNvcnJlY3Rpb24gKi8KLXN0YXRpYyB2b2lkCi1zYWNrX2FkanVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCSAgICB1bnNpZ25lZCBpbnQgc2Fja29mZiwKLQkgICAgdW5zaWduZWQgaW50IHNhY2tlbmQsCi0JICAgIHN0cnVjdCBpcF9uYXRfc2VxICpuYXRzZXEpCi17Ci0Jd2hpbGUgKHNhY2tvZmYgPCBzYWNrZW5kKSB7Ci0JCXN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlICpzYWNrOwotCQlfX2JlMzIgbmV3X3N0YXJ0X3NlcSwgbmV3X2VuZF9zZXE7Ci0KLQkJc2FjayA9ICh2b2lkICopc2tiLT5kYXRhICsgc2Fja29mZjsKLQkJaWYgKGFmdGVyKG50b2hsKHNhY2stPnN0YXJ0X3NlcSkgLSBuYXRzZXEtPm9mZnNldF9iZWZvcmUsCi0JCQkgIG5hdHNlcS0+Y29ycmVjdGlvbl9wb3MpKQotCQkJbmV3X3N0YXJ0X3NlcSA9IGh0b25sKG50b2hsKHNhY2stPnN0YXJ0X3NlcSkKLQkJCQkJLSBuYXRzZXEtPm9mZnNldF9hZnRlcik7Ci0JCWVsc2UKLQkJCW5ld19zdGFydF9zZXEgPSBodG9ubChudG9obChzYWNrLT5zdGFydF9zZXEpCi0JCQkJCS0gbmF0c2VxLT5vZmZzZXRfYmVmb3JlKTsKLQotCQlpZiAoYWZ0ZXIobnRvaGwoc2Fjay0+ZW5kX3NlcSkgLSBuYXRzZXEtPm9mZnNldF9iZWZvcmUsCi0JCQkgIG5hdHNlcS0+Y29ycmVjdGlvbl9wb3MpKQotCQkJbmV3X2VuZF9zZXEgPSBodG9ubChudG9obChzYWNrLT5lbmRfc2VxKQotCQkJCSAgICAgIC0gbmF0c2VxLT5vZmZzZXRfYWZ0ZXIpOwotCQllbHNlCi0JCQluZXdfZW5kX3NlcSA9IGh0b25sKG50b2hsKHNhY2stPmVuZF9zZXEpCi0JCQkJICAgICAgLSBuYXRzZXEtPm9mZnNldF9iZWZvcmUpOwotCi0JCURFQlVHUCgic2Fja19hZGp1c3Q6IHN0YXJ0X3NlcTogJWQtPiVkLCBlbmRfc2VxOiAlZC0+JWRcbiIsCi0JCQludG9obChzYWNrLT5zdGFydF9zZXEpLCBuZXdfc3RhcnRfc2VxLAotCQkJbnRvaGwoc2Fjay0+ZW5kX3NlcSksIG5ld19lbmRfc2VxKTsKLQotCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLAotCQkJCQlzYWNrLT5zdGFydF9zZXEsIG5ld19zdGFydF9zZXEsIDApOwotCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLAotCQkJCQlzYWNrLT5lbmRfc2VxLCBuZXdfZW5kX3NlcSwgMCk7Ci0JCXNhY2stPnN0YXJ0X3NlcSA9IG5ld19zdGFydF9zZXE7Ci0JCXNhY2stPmVuZF9zZXEgPSBuZXdfZW5kX3NlcTsKLQkJc2Fja29mZiArPSBzaXplb2YoKnNhY2spOwotCX0KLX0KLQotLyogVENQIFNBQ0sgc2VxdWVuY2UgbnVtYmVyIGFkanVzdG1lbnQgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1pcF9uYXRfc2Fja19hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JdW5zaWduZWQgaW50IGRpciwgb3B0b2ZmLCBvcHRlbmQ7Ci0KLQlvcHRvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCW9wdGVuZCA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQ7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIG9wdGVuZCkpCi0JCXJldHVybiAwOwotCi0JZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCi0Jd2hpbGUgKG9wdG9mZiA8IG9wdGVuZCkgewotCQkvKiBVc3VhbGx5OiBvcHRpb24sIGxlbmd0aC4gKi8KLQkJdW5zaWduZWQgY2hhciAqb3AgPSAoKnBza2IpLT5kYXRhICsgb3B0b2ZmOwotCi0JCXN3aXRjaCAob3BbMF0pIHsKLQkJY2FzZSBUQ1BPUFRfRU9MOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgVENQT1BUX05PUDoKLQkJCW9wdG9mZisrOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBubyBwYXJ0aWFsIG9wdGlvbnMgKi8KLQkJCWlmIChvcHRvZmYgKyAxID09IG9wdGVuZAotCQkJICAgIHx8IG9wdG9mZiArIG9wWzFdID4gb3B0ZW5kCi0JCQkgICAgfHwgb3BbMV0gPCAyKQotCQkJCXJldHVybiAwOwotCQkJaWYgKG9wWzBdID09IFRDUE9QVF9TQUNLCi0JCQkgICAgJiYgb3BbMV0gPj0gMitUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0sKLQkJCSAgICAmJiAoKG9wWzFdIC0gMikgJSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spID09IDApCi0JCQkJc2Fja19hZGp1c3QoKnBza2IsIHRjcGgsIG9wdG9mZisyLAotCQkJCQkgICAgb3B0b2ZmK29wWzFdLAotCQkJCQkgICAgJmN0LT5uYXQuaW5mby5zZXFbIWRpcl0pOwotCQkJb3B0b2ZmICs9IG9wWzFdOwotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBUQ1Agc2VxdWVuY2UgbnVtYmVyIGFkanVzdG1lbnQuICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlICovCi1pbnQKLWlwX25hdF9zZXFfYWRqdXN0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwotCWludCBkaXI7Ci0JX19iZTMyIG5ld3NlcSwgbmV3YWNrOwotCXN0cnVjdCBpcF9uYXRfc2VxICp0aGlzX3dheSwgKm90aGVyX3dheTsKLQotCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQotCXRoaXNfd2F5ID0gJmN0LT5uYXQuaW5mby5zZXFbZGlyXTsKLQlvdGhlcl93YXkgPSAmY3QtPm5hdC5pbmZvLnNlcVshZGlyXTsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKLQkJcmV0dXJuIDA7Ci0KLQl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKLQlpZiAoYWZ0ZXIobnRvaGwodGNwaC0+c2VxKSwgdGhpc193YXktPmNvcnJlY3Rpb25fcG9zKSkKLQkJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXIpOwotCWVsc2UKLQkJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlKTsKLQotCWlmIChhZnRlcihudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZSwKLQkJICBvdGhlcl93YXktPmNvcnJlY3Rpb25fcG9zKSkKLQkJbmV3YWNrID0gaHRvbmwobnRvaGwodGNwaC0+YWNrX3NlcSkgLSBvdGhlcl93YXktPm9mZnNldF9hZnRlcik7Ci0JZWxzZQotCQluZXdhY2sgPSBodG9ubChudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZSk7Ci0KLQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPnNlcSwgbmV3c2VxLCAwKTsKLQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPmFja19zZXEsIG5ld2FjaywgMCk7Ci0KLQlERUJVR1AoIkFkanVzdGluZyBzZXF1ZW5jZSBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKLQkJbnRvaGwodGNwaC0+c2VxKSwgbnRvaGwobmV3c2VxKSwgbnRvaGwodGNwaC0+YWNrX3NlcSksCi0JCW50b2hsKG5ld2FjaykpOwotCi0JdGNwaC0+c2VxID0gbmV3c2VxOwotCXRjcGgtPmFja19zZXEgPSBuZXdhY2s7Ci0KLQlpZiAoIWlwX25hdF9zYWNrX2FkanVzdChwc2tiLCB0Y3BoLCBjdCwgY3RpbmZvKSkKLQkJcmV0dXJuIDA7Ci0KLQlpcF9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgY3QsIGRpcik7Ci0KLQlyZXR1cm4gMTsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X3NlcV9hZGp1c3QpOwotCi0vKiBTZXR1cCBOQVQgb24gdGhpcyBleHBlY3RlZCBjb25udHJhY2sgc28gaXQgZm9sbG93cyBtYXN0ZXIuICovCi0vKiBJZiB3ZSBmYWlsIHRvIGdldCBhIGZyZWUgTkFUIHNsb3QsIHdlJ2xsIGdldCBkcm9wcGVkIG9uIGNvbmZpcm0gKi8KLXZvaWQgaXBfbmF0X2ZvbGxvd19tYXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKLQotCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KLQlCVUdfT04oY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKLQotCS8qIENoYW5nZSBzcmMgdG8gd2hlcmUgbWFzdGVyIHNlbmRzIHRvICovCi0JcmFuZ2UuZmxhZ3MgPSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKLQlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKLQkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5kc3QuaXA7Ci0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOwotCi0JLyogRm9yIERTVCBtYW5pcCwgbWFwIHBvcnQgaGVyZSB0byB3aGVyZSBpdCdzIGV4cGVjdGVkLiAqLwotCXJhbmdlLmZsYWdzID0gKElQX05BVF9SQU5HRV9NQVBfSVBTIHwgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7Ci0JcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKLQlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKLQkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5zcmMuaXA7Ci0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLwotCWlwX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BSRV9ST1VUSU5HKTsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X2ZvbGxvd19tYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfaDMyMy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfaDMyMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM5OWVmLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX2gzMjMuYworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogSC4zMjMgZXh0ZW5zaW9uIGZvciBOQVQgYWx0ZXJhdGlvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKgotICogQmFzZWQgb24gdGhlICdicnV0ZSBmb3JjZScgSC4zMjMgTkFUIG1vZHVsZSBieQotICogSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJICAgIHVuc2lnbmVkIGludCBhZGRyb2ZmLCBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KQotewotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0Jc3RydWN0IHsKLQkJX19iZTMyIGlwOwotCQlfX2JlMTYgcG9ydDsKLQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgYnVmOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQotCWJ1Zi5pcCA9IGlwOwotCWJ1Zi5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JYWRkcm9mZiArPSBkYXRhb2ZmOwotCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKLQkJaWYgKCFpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKLQkJCQkJICAgICAgYWRkcm9mZiwgc2l6ZW9mKGJ1ZiksCi0JCQkJCSAgICAgIChjaGFyICopICZidWYsIHNpemVvZihidWYpKSkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoImlwX25hdF9oMzIzOiBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQiCi0JCQkJICAgICAgICIgZXJyb3JcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyogUmVsb2NhdGUgZGF0YSBwb2ludGVyICovCi0JCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQsCi0JCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JCWlmICh0aCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQkqZGF0YSA9ICgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgKwotCQkgICAgdGgtPmRvZmYgKiA0ICsgZGF0YW9mZjsKLQl9IGVsc2UgewotCQlpZiAoIWlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCQkgICAgICBhZGRyb2ZmLCBzaXplb2YoYnVmKSwKLQkJCQkJICAgICAgKGNoYXIgKikgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKSB7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50aygiaXBfbmF0X2gzMjM6IGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldCIKLQkJCQkgICAgICAgIiBlcnJvclxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLyogaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0IHVzZXMgc2tiX21ha2Vfd3JpdGFibGUoKSB0byBjb3B5Ci0JCSAqIG9yIHB1bGwgZXZlcnl0aGluZyBpbiBhIGxpbmVhciBidWZmZXIsIHNvIHdlIGNhbiBzYWZlbHkKLQkJICogdXNlIHRoZSBza2IgcG9pbnRlcnMgbm93ICovCi0JCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArCi0JCSAgICBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRfaDIyNV9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgX19iZTMyIGlwLCB1X2ludDE2X3QgcG9ydCkKLXsKLQlyZXR1cm4gc2V0X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgYWRkci0+aXBBZGRyZXNzLmlwLCBpcCwgcG9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRfaDI0NV9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCSBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KQotewotCXJldHVybiBzZXRfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLAotCQkJYWRkci0+dW5pY2FzdEFkZHJlc3MuaVBBZGRyZXNzLm5ldHdvcmssIGlwLCBwb3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9zaWdfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwKLQkJCVRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCBpOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYWRkcltpXSwgJmlwLCAmcG9ydCkpIHsKLQkJCWlmIChpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmCi0JCQkgICAgcG9ydCA9PSBpbmZvLT5zaWdfcG9ydFtkaXJdKSB7Ci0JCQkJLyogR1ctPkdLICovCi0KLQkJCQkvKiBGaXggZm9yIEdub21lbWVldGluZyAqLwotCQkJCWlmIChpID4gMCAmJgotCQkJCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYWRkclswXSwKLQkJCQkJCSAgJmlwLCAmcG9ydCkgJiYKLQkJCQkgICAgKG50b2hsKGlwKSAmIDB4ZmYwMDAwMDApID09IDB4N2YwMDAwMDApCi0JCQkJCWkgPSAwOwotCi0JCQkJREVCVUdQCi0JCQkJICAgICgiaXBfbmF0X3Jhczogc2V0IHNpZ25hbCBhZGRyZXNzICIKLQkJCQkgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJCQkgICAgIE5JUFFVQUQoaXApLCBwb3J0LAotCQkJCSAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC4KLQkJCQkJICAgICBpcCksIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKLQkJCQlyZXR1cm4gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLCAmYWRkcltpXSwKLQkJCQkJCSAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS4KLQkJCQkJCSAgICAgdHVwbGUuZHN0LmlwLAotCQkJCQkJICAgICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7Ci0JCQl9IGVsc2UgaWYgKGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QuaXAgJiYKLQkJCQkgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0pIHsKLQkJCQkvKiBHSy0+R1cgKi8KLQkJCQlERUJVR1AKLQkJCQkgICAgKCJpcF9uYXRfcmFzOiBzZXQgc2lnbmFsIGFkZHJlc3MgIgotCQkJCSAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJCSAgICAgTklQUVVBRChpcCksIHBvcnQsCi0JCQkJICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLgotCQkJCQkgICAgIGlwKSwgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwotCQkJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsICZhZGRyW2ldLAotCQkJCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLgotCQkJCQkJICAgICB0dXBsZS5zcmMuaXAsCi0JCQkJCQkgICAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2V0X3Jhc19hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBjb3VudCkKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCBpOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYWRkcltpXSwgJmlwLCAmcG9ydCkgJiYKLQkJICAgIGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgJiYKLQkJICAgIHBvcnQgPT0gbnRvaHMoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51LnVkcC5wb3J0KSkgewotCQkJREVCVUdQKCJpcF9uYXRfcmFzOiBzZXQgcmFzQWRkcmVzcyAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJICAgICAgIE5JUFFVQUQoaXApLCBwb3J0LAotCQkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXApLAotCQkJICAgICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUudWRwLgotCQkJCSAgICAgcG9ydCkpOwotCQkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwgJmFkZHJbaV0sCi0JCQkJCSAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkJCSAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS4KLQkJCQkJCSAgIGRzdC51LnVkcC5wb3J0KSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG5hdF9ydHBfcnRjcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQlIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJdV9pbnQxNl90IHBvcnQsIHVfaW50MTZfdCBydHBfcG9ydCwKLQkJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpydHBfZXhwLAotCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0Y3BfZXhwKQotewotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgaTsKLQl1X2ludDE2X3QgbmF0ZWRfcG9ydDsKLQotCS8qIFNldCBleHBlY3RhdGlvbnMgZm9yIE5BVCAqLwotCXJ0cF9leHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gcnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQ7Ci0JcnRwX2V4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfZm9sbG93X21hc3RlcjsKLQlydHBfZXhwLT5kaXIgPSAhZGlyOwotCXJ0Y3BfZXhwLT5zYXZlZF9wcm90by51ZHAucG9ydCA9IHJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydDsKLQlydGNwX2V4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfZm9sbG93X21hc3RlcjsKLQlydGNwX2V4cC0+ZGlyID0gIWRpcjsKLQotCS8qIExvb2t1cCBleGlzdGluZyBleHBlY3RzICovCi0JZm9yIChpID0gMDsgaSA8IEgzMjNfUlRQX0NIQU5ORUxfTUFYOyBpKyspIHsKLQkJaWYgKGluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0gPT0gcnRwX3BvcnQpIHsKLQkJCS8qIEV4cGVjdGVkICovCi0KLQkJCS8qIFVzZSBhbGxvY2F0ZWQgcG9ydHMgZmlyc3QuIFRoaXMgd2lsbCByZWZyZXNoCi0JCQkgKiB0aGUgZXhwZWN0cyAqLwotCQkJcnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPQotCQkJICAgIGh0b25zKGluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0pOwotCQkJcnRjcF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0KLQkJCSAgICBodG9ucyhpbmZvLT5ydHBfcG9ydFtpXVtkaXJdICsgMSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChpbmZvLT5ydHBfcG9ydFtpXVtkaXJdID09IDApIHsKLQkJCS8qIE5vdCBleHBlY3RlZCAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBSdW4gb3V0IG9mIGV4cGVjdGF0aW9ucyAqLwotCWlmIChpID49IEgzMjNfUlRQX0NIQU5ORUxfTUFYKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwX25hdF9oMzIzOiBvdXQgb2YgZXhwZWN0YXRpb25zXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJ5IHRvIGdldCBhIHBhaXIgb2YgcG9ydHMuICovCi0JZm9yIChuYXRlZF9wb3J0ID0gbnRvaHMocnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQpOwotCSAgICAgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0ICs9IDIpIHsKLQkJcnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPSBodG9ucyhuYXRlZF9wb3J0KTsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydHBfZXhwKSA9PSAwKSB7Ci0JCQlydGNwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPQotCQkJICAgIGh0b25zKG5hdGVkX3BvcnQgKyAxKTsKLQkJCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQocnRjcF9leHApID09IDApCi0JCQkJYnJlYWs7Ci0JCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChydHBfZXhwKTsKLQkJfQotCX0KLQotCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfbmF0X2gzMjM6IG91dCBvZiBSVFAgcG9ydHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBNb2RpZnkgc2lnbmFsICovCi0JaWYgKHNldF9oMjQ1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCSAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkgIChwb3J0ICYgMSkgPyBuYXRlZF9wb3J0ICsgMSA6IG5hdGVkX3BvcnQpID09IDApIHsKLQkJLyogU2F2ZSBwb3J0cyAqLwotCQlpbmZvLT5ydHBfcG9ydFtpXVtkaXJdID0gcnRwX3BvcnQ7Ci0JCWluZm8tPnJ0cF9wb3J0W2ldWyFkaXJdID0gbmF0ZWRfcG9ydDsKLQl9IGVsc2UgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChydHBfZXhwKTsKLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQocnRjcF9leHApOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogU3VjY2VzcyAqLwotCURFQlVHUCgiaXBfbmF0X2gzMjM6IGV4cGVjdCBSVFAgJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQocnRwX2V4cC0+dHVwbGUuc3JjLmlwKSwKLQkgICAgICAgbnRvaHMocnRwX2V4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQpLAotCSAgICAgICBOSVBRVUFEKHJ0cF9leHAtPnR1cGxlLmRzdC5pcCksCi0JICAgICAgIG50b2hzKHJ0cF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0KSk7Ci0JREVCVUdQKCJpcF9uYXRfaDMyMzogZXhwZWN0IFJUQ1AgJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQocnRjcF9leHAtPnR1cGxlLnNyYy5pcCksCi0JICAgICAgIG50b2hzKHJ0Y3BfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCksCi0JICAgICAgIE5JUFFVQUQocnRjcF9leHAtPnR1cGxlLmRzdC5pcCksCi0JICAgICAgIG50b2hzKHJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuYXRfdDEyMChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1X2ludDE2X3QgbmF0ZWRfcG9ydCA9IHBvcnQ7Ci0KLQkvKiBTZXQgZXhwZWN0YXRpb25zIGZvciBOQVQgKi8KLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0JZXhwLT5kaXIgPSAhZGlyOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKDsgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfbmF0X2gzMjM6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBNb2RpZnkgc2lnbmFsICovCi0JaWYgKHNldF9oMjQ1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCSAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsIG5hdGVkX3BvcnQpIDwgMCkgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JREVCVUdQKCJpcF9uYXRfaDMyMzogZXhwZWN0IFQuMTIwICV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLCBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgY29ubnRyYWNrIGV4cGVjdCBmdW5jdGlvbiByZXBsYWNlcyBpcF9jb25udHJhY2tfaDI0NV9leHBlY3QoKQotICogd2hpY2ggd2FzIHNldCBieSBpcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYy4gSXQgY2FsbHMgYm90aAotICogaXBfbmF0X2ZvbGxvd19tYXN0ZXIoKSBhbmQgaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0KCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXBfbmF0X2gyNDVfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqdGhpcykKLXsKLQlpcF9uYXRfZm9sbG93X21hc3RlcihuZXcsIHRoaXMpOwotCWlwX2Nvbm50cmFja19oMjQ1X2V4cGVjdChuZXcsIHRoaXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbmF0X2gyNDUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkgICAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdV9pbnQxNl90IG5hdGVkX3BvcnQgPSBwb3J0OwotCi0JLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCi0JZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9oMjQ1X2V4cGVjdDsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBDaGVjayBleGlzdGluZyBleHBlY3RzICovCi0JaWYgKGluZm8tPnNpZ19wb3J0W2Rpcl0gPT0gcG9ydCkKLQkJbmF0ZWRfcG9ydCA9IGluZm8tPnNpZ19wb3J0WyFkaXJdOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKDsgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfbmF0X3E5MzE6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBNb2RpZnkgc2lnbmFsICovCi0JaWYgKHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCSAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkgIG5hdGVkX3BvcnQpID09IDApIHsKLQkJLyogU2F2ZSBwb3J0cyAqLwotCQlpbmZvLT5zaWdfcG9ydFtkaXJdID0gcG9ydDsKLQkJaW5mby0+c2lnX3BvcnRbIWRpcl0gPSBuYXRlZF9wb3J0OwotCX0gZWxzZSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlERUJVR1AoImlwX25hdF9xOTMxOiBleHBlY3QgSC4yNDUgJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLCBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBjb25udHJhY2sgZXhwZWN0IGZ1bmN0aW9uIHJlcGxhY2VzIGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdCgpCi0gKiB3aGljaCB3YXMgc2V0IGJ5IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5jLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpcF9uYXRfcTkzMV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQotewotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7Ci0KLQlpZiAodGhpcy0+dHVwbGUuc3JjLmlwICE9IDApIHsJLyogT25seSBhY2NlcHQgY2FsbHMgZnJvbSBHSyAqLwotCQlpcF9uYXRfZm9sbG93X21hc3RlcihuZXcsIHRoaXMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBUaGlzIG11c3QgYmUgYSBmcmVzaCBvbmUuICovCi0JQlVHX09OKG5ldy0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwotCi0JLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9IG5ldy0+dHVwbGVoYXNoWyF0aGlzLT5kaXJdLnR1cGxlLnNyYy5pcDsKLQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gc291cmNlIG1hbmlwICovCi0JaXBfbmF0X3NldHVwX2luZm8obmV3LCAmcmFuZ2UsIE5GX0lQX1BPU1RfUk9VVElORyk7Ci0KLQkvKiBGb3IgRFNUIG1hbmlwLCBtYXAgcG9ydCBoZXJlIHRvIHdoZXJlIGl0J3MgZXhwZWN0ZWQuICovCi0JcmFuZ2UuZmxhZ3MgPSAoSVBfTkFUX1JBTkdFX01BUF9JUFMgfCBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKTsKLQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSB0aGlzLT5zYXZlZF9wcm90bzsKLQlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAgPQotCSAgICBuZXctPm1hc3Rlci0+dHVwbGVoYXNoWyF0aGlzLT5kaXJdLnR1cGxlLnNyYy5pcDsKLQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gZGVzdGluYXRpb24gbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOwotCi0gICAgICBvdXQ6Ci0JaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KG5ldywgdGhpcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuYXRfcTkzMShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBpZHgsCi0JCSAgICB1X2ludDE2X3QgcG9ydCwgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdV9pbnQxNl90IG5hdGVkX3BvcnQgPSBwb3J0OwotCV9fYmUzMiBpcDsKLQotCS8qIFNldCBleHBlY3RhdGlvbnMgZm9yIE5BVCAqLwotCWV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQgPSBleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0OwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfcTkzMV9leHBlY3Q7Ci0JZXhwLT5kaXIgPSAhZGlyOwotCi0JLyogQ2hlY2sgZXhpc3RpbmcgZXhwZWN0cyAqLwotCWlmIChpbmZvLT5zaWdfcG9ydFtkaXJdID09IHBvcnQpCi0JCW5hdGVkX3BvcnQgPSBpbmZvLT5zaWdfcG9ydFshZGlyXTsKLQotCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCi0JZm9yICg7IG5hdGVkX3BvcnQgIT0gMDsgbmF0ZWRfcG9ydCsrKSB7Ci0JCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhuYXRlZF9wb3J0KTsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAobmF0ZWRfcG9ydCA9PSAwKSB7CS8qIE5vIHBvcnQgYXZhaWxhYmxlICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwX25hdF9yYXM6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBNb2RpZnkgc2lnbmFsICovCi0JaWYgKHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwgJmFkZHJbaWR4XSwKLQkJCSAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkgIG5hdGVkX3BvcnQpID09IDApIHsKLQkJLyogU2F2ZSBwb3J0cyAqLwotCQlpbmZvLT5zaWdfcG9ydFtkaXJdID0gcG9ydDsKLQkJaW5mby0+c2lnX3BvcnRbIWRpcl0gPSBuYXRlZF9wb3J0OwotCi0JCS8qIEZpeCBmb3IgR25vbWVtZWV0aW5nICovCi0JCWlmIChpZHggPiAwICYmCi0JCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYWRkclswXSwgJmlwLCAmcG9ydCkgJiYKLQkJICAgIChudG9obChpcCkgJiAweGZmMDAwMDAwKSA9PSAweDdmMDAwMDAwKSB7Ci0JCQlzZXRfaDIyNV9hZGRyX2hvb2socHNrYiwgZGF0YSwgMCwgJmFkZHJbMF0sCi0JCQkJCSAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCQkgICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogU3VjY2VzcyAqLwotCURFQlVHUCgiaXBfbmF0X3JhczogZXhwZWN0IFEuOTMxICV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLCBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpcF9uYXRfY2FsbGZvcndhcmRpbmdfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQotewotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7Ci0KLQkvKiBUaGlzIG11c3QgYmUgYSBmcmVzaCBvbmUuICovCi0JQlVHX09OKG5ldy0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwotCi0JLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9IG5ldy0+dHVwbGVoYXNoWyF0aGlzLT5kaXJdLnR1cGxlLnNyYy5pcDsKLQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gc291cmNlIG1hbmlwICovCi0JaXBfbmF0X3NldHVwX2luZm8obmV3LCAmcmFuZ2UsIE5GX0lQX1BPU1RfUk9VVElORyk7Ci0KLQkvKiBGb3IgRFNUIG1hbmlwLCBtYXAgcG9ydCBoZXJlIHRvIHdoZXJlIGl0J3MgZXhwZWN0ZWQuICovCi0JcmFuZ2UuZmxhZ3MgPSAoSVBfTkFUX1JBTkdFX01BUF9JUFMgfCBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKTsKLQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSB0aGlzLT5zYXZlZF9wcm90bzsKLQlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAgPSB0aGlzLT5zYXZlZF9pcDsKLQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gZGVzdGluYXRpb24gbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOwotCi0JaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KG5ldywgdGhpcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuYXRfY2FsbGZvcndhcmRpbmcoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgICAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXVfaW50MTZfdCBuYXRlZF9wb3J0OwotCi0JLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCi0JZXhwLT5zYXZlZF9pcCA9IGV4cC0+dHVwbGUuZHN0LmlwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9jYWxsZm9yd2FyZGluZ19leHBlY3Q7Ci0JZXhwLT5kaXIgPSAhZGlyOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKG5hdGVkX3BvcnQgPSBwb3J0OyBuYXRlZF9wb3J0ICE9IDA7IG5hdGVkX3BvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMobmF0ZWRfcG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG5hdGVkX3BvcnQgPT0gMCkgewkvKiBObyBwb3J0IGF2YWlsYWJsZSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJpcF9uYXRfcTkzMTogb3V0IG9mIFRDUCBwb3J0c1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1vZGlmeSBzaWduYWwgKi8KLQlpZiAoIXNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCSAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJICAgbmF0ZWRfcG9ydCkgPT0gMCkgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogU3VjY2VzcyAqLwotCURFQlVHUCgiaXBfbmF0X3E5MzE6IGV4cGVjdCBDYWxsIEZvcndhcmRpbmcgIgotCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLCBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9oMjQ1X2FkZHJfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfaDIyNV9hZGRyX2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X3J0cF9ydGNwX2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X3QxMjBfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfaDI0NV9ob29rKSAhPSBOVUxMKTsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAhPSBOVUxMKTsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9xOTMxX2hvb2spICE9IE5VTEwpOwotCi0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjQ1X2FkZHJfaG9vaywgc2V0X2gyNDVfYWRkcik7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjI1X2FkZHJfaG9vaywgc2V0X2gyMjVfYWRkcik7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9zaWdfYWRkcl9ob29rLCBzZXRfc2lnX2FkZHIpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfcmFzX2FkZHJfaG9vaywgc2V0X3Jhc19hZGRyKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3J0cF9ydGNwX2hvb2ssIG5hdF9ydHBfcnRjcCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF90MTIwX2hvb2ssIG5hdF90MTIwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2gyNDVfaG9vaywgbmF0X2gyNDUpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfY2FsbGZvcndhcmRpbmdfaG9vaywgbmF0X2NhbGxmb3J3YXJkaW5nKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3E5MzFfaG9vaywgbmF0X3E5MzEpOwotCi0JREVCVUdQKCJpcF9uYXRfaDMyMzogaW5pdCBzdWNjZXNzXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDI0NV9hZGRyX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDIyNV9hZGRyX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfc2lnX2FkZHJfaG9vaywgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9yYXNfYWRkcl9ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3J0cF9ydGNwX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfdDEyMF9ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2gyNDVfaG9vaywgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3E5MzFfaG9vaywgTlVMTCk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKLQotTU9EVUxFX0FVVEhPUigiSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJILjMyMyBOQVQgaGVscGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Y2U0YTUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfcHB0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBpcF9uYXRfcHB0cC5jCS0gVmVyc2lvbiAzLjAKLSAqCi0gKiBOQVQgc3VwcG9ydCBmb3IgUFBUUCAoUG9pbnQgdG8gUG9pbnQgVHVubmVsaW5nIFByb3RvY29sKS4KLSAqIFBQVFAgaXMgYSBhIHByb3RvY29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuCi0gKiBJdCBpcyBhIHNwZWNpZmljYXRpb24gZGVmaW5lZCBieSBNaWNyb3NvZnQgYW5kIHNvbWUgdmVuZG9ycwotICogd29ya2luZyB3aXRoIE1pY3Jvc29mdC4gIFBQVFAgaXMgYnVpbHQgb24gdG9wIG9mIGEgbW9kaWZpZWQKLSAqIHZlcnNpb24gb2YgdGhlIEludGVybmV0IEdlbmVyaWMgUm91dGluZyBFbmNhcHN1bGF0aW9uIFByb3RvY29sLgotICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLiAgRG9jdW1lbnRhdGlvbiBvZgotICogUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKLSAqCi0gKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCi0gKgotICogVE9ETzogLSBOQVQgdG8gYSB1bmlxdWUgdHVwbGUsIG5vdCB0byBUQ1Agc291cmNlIHBvcnQKLSAqIAkgICAobmVlZHMgbmV0ZmlsdGVyIHR1cGxlIHJlc2VydmF0aW9uKQotICoKLSAqIENoYW5nZXM6Ci0gKiAgICAgMjAwMi0wMi0xMCAtIFZlcnNpb24gMS4zCi0gKiAgICAgICAtIFVzZSBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQoKSBiZWNhdXNlIG9mIGNsb25lZCBza2IncwotICoJICAgaW4gbG9jYWwgY29ubmVjdGlvbnMgKFBoaWxpcCBDcmFpZyA8cGhpbGlwY0BzbmFwZ2Vhci5jb20+KQotICogICAgICAgLSBhZGQgY2hlY2tzIGZvciBtYWdpY0Nvb2tpZSBhbmQgcHB0cCB2ZXJzaW9uCi0gKiAgICAgICAtIG1ha2UgYXJndW1lbnQgbGlzdCBvZiBwcHRwX3tvdXQsaW59Ym91bmRfcGFja2V0KCkgc2hvcnRlcgotICogICAgICAgLSBtb3ZlIHRvIEM5OSBzdHlsZSBpbml0aWFsaXplcnMKLSAqICAgICAgIC0gcHJpbnQgdmVyc2lvbiBudW1iZXIgYXQgbW9kdWxlIGxvYWR0aW1lCi0gKiAgICAgMjAwMy0wOS0yMiAtIFZlcnNpb24gMS41Ci0gKiAgICAgICAtIHVzZSBTTkFUZWQgdGNwIHNvdXJjZXBvcnQgYXMgY2FsbGlkLCBzaW5jZSB3ZSBnZXQgY2FsbGVkIGJlZm9yZQotICoJICAgVENQIGhlYWRlciBpcyBtYW5nbGVkIChQaGlsaXAgQ3JhaWcgPHBoaWxpcGNAc25hcGdlYXIuY29tPikKLSAqICAgICAyMDA0LTEwLTIyIC0gVmVyc2lvbiAyLjAKLSAqICAgICAgIC0ga2VybmVsIDIuNi54IHZlcnNpb24KLSAqICAgICAyMDA1LTA2LTEwIC0gVmVyc2lvbiAzLjAKLSAqICAgICAgIC0ga2VybmVsID49IDIuNi4xMSB2ZXJzaW9uLAotICoJICAgZnVuZGVkIGJ5IE94Y29kYSBOZXRCb3ggQmx1ZSAoaHR0cDovL3d3dy5uZXRib3hibHVlLmNvbS8pCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmg+Ci0KLSNkZWZpbmUgSVBfTkFUX1BQVFBfVkVSU0lPTiAiMy4wIgotCi0jZGVmaW5lIFJFUV9DSUQocmVxLCBvZmYpCQkoKihfX2JlMTYgKikoKGNoYXIgKikocmVxKSArIChvZmYpKSkKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIE5BVCBoZWxwZXIgbW9kdWxlIGZvciBQUFRQIik7Ci0KLQotI2lmIDAKLWV4dGVybiBjb25zdCBjaGFyICpwcHRwX21zZ19uYW1lW107Ci0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczolczogIiBmb3JtYXQsIF9fRklMRV9fLCBcCi0JCQkJICAgICAgIF9fRlVOQ1RJT05fXywgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgcHB0cF9uYXRfZXhwZWN0ZWQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKm1hc3RlciA9IGN0LT5tYXN0ZXI7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKm90aGVyX2V4cDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHQ7Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICpjdF9wcHRwX2luZm87Ci0Jc3RydWN0IGlwX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7Ci0KLQljdF9wcHRwX2luZm8gPSAmbWFzdGVyLT5oZWxwLmN0X3BwdHBfaW5mbzsKLQluYXRfcHB0cF9pbmZvID0gJm1hc3Rlci0+bmF0LmhlbHAubmF0X3BwdHBfaW5mbzsKLQotCS8qIEFuZCBoZXJlIGdvZXMgdGhlIGdyYW5kIGZpbmFsZSBvZiBjb3Jyb3Npb24uLi4gKi8KLQotCWlmIChleHAtPmRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpIHsKLQkJREVCVUdQKCJ3ZSBhcmUgUE5TLT5QQUNcbiIpOwotCQkvKiB0aGVyZWZvcmUsIGJ1aWxkIHR1cGxlIGZvciBQQUMtPlBOUyAqLwotCQl0LnNyYy5pcCA9IG1hc3Rlci0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwOwotCQl0LnNyYy51LmdyZS5rZXkgPSBtYXN0ZXItPmhlbHAuY3RfcHB0cF9pbmZvLnBhY19jYWxsX2lkOwotCQl0LmRzdC5pcCA9IG1hc3Rlci0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwOwotCQl0LmRzdC51LmdyZS5rZXkgPSBtYXN0ZXItPmhlbHAuY3RfcHB0cF9pbmZvLnBuc19jYWxsX2lkOwotCQl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCX0gZWxzZSB7Ci0JCURFQlVHUCgid2UgYXJlIFBBQy0+UE5TXG4iKTsKLQkJLyogYnVpbGQgdHVwbGUgZm9yIFBOUy0+UEFDICovCi0JCXQuc3JjLmlwID0gbWFzdGVyLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXA7Ci0JCXQuc3JjLnUuZ3JlLmtleSA9IG1hc3Rlci0+bmF0LmhlbHAubmF0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKLQkJdC5kc3QuaXAgPSBtYXN0ZXItPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcDsKLQkJdC5kc3QudS5ncmUua2V5ID0gbWFzdGVyLT5uYXQuaGVscC5uYXRfcHB0cF9pbmZvLnBhY19jYWxsX2lkOwotCQl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCX0KLQotCURFQlVHUCgidHJ5aW5nIHRvIHVuZXhwZWN0IG90aGVyIGRpcjogIik7Ci0JRFVNUF9UVVBMRSgmdCk7Ci0Jb3RoZXJfZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdCk7Ci0JaWYgKG90aGVyX2V4cCkgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChvdGhlcl9leHApOwotCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChvdGhlcl9leHApOwotCQlERUJVR1AoInN1Y2Nlc3NcbiIpOwotCX0gZWxzZSB7Ci0JCURFQlVHUCgibm90IGZvdW5kIVxuIik7Ci0JfQotCi0JLyogVGhpcyBtdXN0IGJlIGEgZnJlc2ggb25lLiAqLwotCUJVR19PTihjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwotCi0JLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcAotCQk9IGN0LT5tYXN0ZXItPnR1cGxlaGFzaFshZXhwLT5kaXJdLnR1cGxlLmRzdC5pcDsKLQlpZiAoZXhwLT5kaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKSB7Ci0JCXJhbmdlLmZsYWdzIHw9IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQ7Ci0JCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IGV4cC0+c2F2ZWRfcHJvdG87Ci0JfQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gc291cmNlIG1hbmlwICovCi0JaXBfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQotCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcAotCQk9IGN0LT5tYXN0ZXItPnR1cGxlaGFzaFshZXhwLT5kaXJdLnR1cGxlLnNyYy5pcDsKLQlpZiAoZXhwLT5kaXIgPT0gSVBfQ1RfRElSX1JFUExZKSB7Ci0JCXJhbmdlLmZsYWdzIHw9IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQ7Ci0JCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IGV4cC0+c2F2ZWRfcHJvdG87Ci0JfQotCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gZGVzdGluYXRpb24gbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Ci19Ci0KLS8qIG91dGJvdW5kIHBhY2tldHMgPT0gZnJvbSBQTlMgdG8gUEFDICovCi1zdGF0aWMgaW50Ci1wcHRwX291dGJvdW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkgIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSkKLQotewotCXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciAqY3RfcHB0cF9pbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm8gPSAmY3QtPm5hdC5oZWxwLm5hdF9wcHRwX2luZm87Ci0JdV9pbnQxNl90IG1zZzsKLQlfX2JlMTYgbmV3X2NhbGxpZDsKLQl1bnNpZ25lZCBpbnQgY2lkX29mZjsKLQotCW5ld19jYWxsaWQgPSBjdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCi0Jc3dpdGNoIChtc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSkpIHsKLQljYXNlIFBQVFBfT1VUX0NBTExfUkVRVUVTVDoKLQkJY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgb2NyZXEuY2FsbElEKTsKLQkJLyogRklYTUU6IGlkZWFsbHkgd2Ugd291bGQgd2FudCB0byByZXNlcnZlIGEgY2FsbCBJRAotCQkgKiBoZXJlLiAgY3VycmVudCBuZXRmaWx0ZXIgTkFUIGNvcmUgaXMgbm90IGFibGUgdG8gZG8KLQkJICogdGhpcyA6KCBGb3Igbm93IHdlIHVzZSBUQ1Agc291cmNlIHBvcnQuIFRoaXMgYnJlYWtzCi0JCSAqIG11bHRpcGxlIGNhbGxzIHdpdGhpbiBvbmUgY29udHJvbCBzZXNzaW9uICovCi0KLQkJLyogc2F2ZSBvcmlnaW5hbCBjYWxsIElEIGluIG5hdF9pbmZvICovCi0JCW5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkID0gY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKLQotCQkvKiBkb24ndCB1c2UgdGNwaC0+c291cmNlIHNpbmNlIHdlIGFyZSBhdCBhIERTVG1hbmlwCi0JCSAqIGhvb2sgKGUuZy4gUFJFUk9VVElORykgYW5kIHBrdCBpcyBub3QgbWFuZ2xlZCB5ZXQgKi8KLQkJbmV3X2NhbGxpZCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudS50Y3AucG9ydDsKLQotCQkvKiBzYXZlIG5ldyBjYWxsIElEIGluIGN0IGluZm8gKi8KLQkJY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZCA9IG5ld19jYWxsaWQ7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9JTl9DQUxMX1JFUExZOgotCQljaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBpY2Fjay5jYWxsSUQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUOgotCQljaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBjbHJyZXEuY2FsbElEKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJREVCVUdQKCJ1bmtub3duIG91dGJvdW5kIHBhY2tldCAweCUwNHg6JXNcbiIsIG1zZywKLQkJICAgICAgKG1zZyA8PSBQUFRQX01TR19NQVgpPwotCQkgICAgICBwcHRwX21zZ19uYW1lW21zZ106cHB0cF9tc2dfbmFtZVswXSk7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCi0JY2FzZSBQUFRQX1NFVF9MSU5LX0lORk86Ci0JCS8qIG9ubHkgbmVlZCB0byBOQVQgaW4gY2FzZSBQQUMgaXMgYmVoaW5kIE5BVCBib3ggKi8KLQljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUOgotCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUExZOgotCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVRVUVTVDoKLQljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUExZOgotCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX0VDSE9fUkVQTFk6Ci0JCS8qIG5vIG5lZWQgdG8gYWx0ZXIgcGFja2V0ICovCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogb25seSBPVVRfQ0FMTF9SRVFVRVNULCBJTl9DQUxMX1JFUExZLCBDQUxMX0NMRUFSX1JFUVVFU1QgcGFzcwotCSAqIGRvd24gdG8gaGVyZSAqLwotCURFQlVHUCgiYWx0ZXJpbmcgY2FsbCBpZCBmcm9tIDB4JTA0eCB0byAweCUwNHhcbiIsCi0JCW50b2hzKFJFUV9DSUQocHB0cFJlcSwgY2lkX29mZikpLCBudG9ocyhuZXdfY2FsbGlkKSk7Ci0KLQkvKiBtYW5nbGUgcGFja2V0ICovCi0JaWYgKGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCSAgICAgY2lkX29mZiArIHNpemVvZihzdHJ1Y3QgcHB0cF9wa3RfaGRyKSArCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IFBwdHBDb250cm9sSGVhZGVyKSwKLQkJCQkgICAgIHNpemVvZihuZXdfY2FsbGlkKSwgKGNoYXIgKikmbmV3X2NhbGxpZCwKLQkJCQkgICAgIHNpemVvZihuZXdfY2FsbGlkKSkgPT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9leHBfZ3JlKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3Rfb3JpZywKLQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3RfcmVwbHkpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBleHBlY3Rfb3JpZy0+bWFzdGVyOwotCXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciAqY3RfcHB0cF9pbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm8gPSAmY3QtPm5hdC5oZWxwLm5hdF9wcHRwX2luZm87Ci0KLQkvKiBzYXZlIG9yaWdpbmFsIFBBQyBjYWxsIElEIGluIG5hdF9pbmZvICovCi0JbmF0X3BwdHBfaW5mby0+cGFjX2NhbGxfaWQgPSBjdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOwotCi0JLyogYWx0ZXIgZXhwZWN0YXRpb24gZm9yIFBOUy0+UEFDIGRpcmVjdGlvbiAqLwotCWV4cGVjdF9vcmlnLT5zYXZlZF9wcm90by5ncmUua2V5ID0gY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKLQlleHBlY3Rfb3JpZy0+dHVwbGUuc3JjLnUuZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCWV4cGVjdF9vcmlnLT50dXBsZS5kc3QudS5ncmUua2V5ID0gY3RfcHB0cF9pbmZvLT5wYWNfY2FsbF9pZDsKLQlleHBlY3Rfb3JpZy0+ZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwotCi0JLyogYWx0ZXIgZXhwZWN0YXRpb24gZm9yIFBBQy0+UE5TIGRpcmVjdGlvbiAqLwotCWV4cGVjdF9yZXBseS0+c2F2ZWRfcHJvdG8uZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCWV4cGVjdF9yZXBseS0+dHVwbGUuc3JjLnUuZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOwotCWV4cGVjdF9yZXBseS0+dHVwbGUuZHN0LnUuZ3JlLmtleSA9IGN0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7Ci0JZXhwZWN0X3JlcGx5LT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7Ci19Ci0KLS8qIGluYm91bmQgcGFja2V0cyA9PSBmcm9tIFBBQyB0byBQTlMgKi8KLXN0YXRpYyBpbnQKLXBwdHBfaW5ib3VuZF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSkKLXsKLQlzdHJ1Y3QgaXBfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm8gPSAmY3QtPm5hdC5oZWxwLm5hdF9wcHRwX2luZm87Ci0JdV9pbnQxNl90IG1zZzsKLQlfX2JlMTYgbmV3X3BjaWQ7Ci0JdW5zaWduZWQgaW50IHBjaWRfb2ZmOwotCi0JbmV3X3BjaWQgPSBuYXRfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKLQotCXN3aXRjaCAobXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpKSB7Ci0JY2FzZSBQUFRQX09VVF9DQUxMX1JFUExZOgotCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgb2NhY2sucGVlcnNDYWxsSUQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfSU5fQ0FMTF9DT05ORUNUOgotCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgaWNjb24ucGVlcnNDYWxsSUQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfSU5fQ0FMTF9SRVFVRVNUOgotCQkvKiBvbmx5IG5lZWQgdG8gbmF0IGluIGNhc2UgUEFDIGlzIGJlaGluZCBOQVQgYm94ICovCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JY2FzZSBQUFRQX1dBTl9FUlJPUl9OT1RJRlk6Ci0JCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCB3YW5lcnIucGVlcnNDYWxsSUQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfQ0FMTF9ESVNDT05ORUNUX05PVElGWToKLQkJcGNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIGRpc2MuY2FsbElEKTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX1NFVF9MSU5LX0lORk86Ci0JCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBzZXRsaW5rLnBlZXJzQ2FsbElEKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlERUJVR1AoInVua25vd24gaW5ib3VuZCBwYWNrZXQgJXNcbiIsIChtc2cgPD0gUFBUUF9NU0dfTUFYKT8KLQkJCXBwdHBfbXNnX25hbWVbbXNnXTpwcHRwX21zZ19uYW1lWzBdKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUOgotCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUExZOgotCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVRVUVTVDoKLQljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUExZOgotCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX0VDSE9fUkVQTFk6Ci0JCS8qIG5vIG5lZWQgdG8gYWx0ZXIgcGFja2V0ICovCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogb25seSBPVVRfQ0FMTF9SRVBMWSwgSU5fQ0FMTF9DT05ORUNULCBJTl9DQUxMX1JFUVVFU1QsCi0JICogV0FOX0VSUk9SX05PVElGWSwgQ0FMTF9ESVNDT05ORUNUX05PVElGWSBwYXNzIGRvd24gaGVyZSAqLwotCi0JLyogbWFuZ2xlIHBhY2tldCAqLwotCURFQlVHUCgiYWx0ZXJpbmcgcGVlciBjYWxsIGlkIGZyb20gMHglMDR4IHRvIDB4JTA0eFxuIiwKLQkJbnRvaHMoUkVRX0NJRChwcHRwUmVxLCBwY2lkX29mZikpLCBudG9ocyhuZXdfcGNpZCkpOwotCi0JaWYgKGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCSAgICAgcGNpZF9vZmYgKyBzaXplb2Yoc3RydWN0IHBwdHBfcGt0X2hkcikgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciksCi0JCQkJICAgICBzaXplb2YobmV3X3BjaWQpLCAoY2hhciAqKSZuZXdfcGNpZCwKLQkJCQkgICAgIHNpemVvZihuZXdfcGNpZCkpID09IDApCi0JCXJldHVybiBORl9EUk9QOwotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLQotZXh0ZXJuIGludCBfX2luaXQgaXBfbmF0X3Byb3RvX2dyZV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IGlwX25hdF9wcm90b19ncmVfZmluaSh2b2lkKTsKLQotc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2hlbHBlcl9wcHRwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JREVCVUdQKCIlczogcmVnaXN0ZXJpbmcgTkFUIGhlbHBlclxuIiwgX19GSUxFX18pOwotCi0JcmV0ID0gaXBfbmF0X3Byb3RvX2dyZV9pbml0KCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCwgcHB0cF9vdXRib3VuZF9wa3QpOwotCi0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kLCBwcHRwX2luYm91bmRfcGt0KTsKLQotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSwgcHB0cF9leHBfZ3JlKTsKLQotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbikpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuLCBwcHRwX25hdF9leHBlY3RlZCk7Ci0KLQlwcmludGsoImlwX25hdF9wcHRwIHZlcnNpb24gJXMgbG9hZGVkXG4iLCBJUF9OQVRfUFBUUF9WRVJTSU9OKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9oZWxwZXJfcHB0cF9maW5pKHZvaWQpCi17Ci0JREVCVUdQKCJjbGVhbnVwX21vZHVsZVxuIiApOwotCi0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUsIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQsIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQotCWlwX25hdF9wcm90b19ncmVfZmluaSgpOwotCi0JcHJpbnRrKCJpcF9uYXRfcHB0cCB2ZXJzaW9uICVzIHVubG9hZGVkXG4iLCBJUF9OQVRfUFBUUF9WRVJTSU9OKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfbmF0X2hlbHBlcl9wcHRwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfbmF0X2hlbHBlcl9wcHRwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYWVlYTMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiBJUkMgZXh0ZW5zaW9uIGZvciBUQ1AgTkFUIGFsdGVyYXRpb24uCi0gKiAoQykgMjAwMC0yMDAxIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAoQykgMjAwNCBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+IElCTSBDb3Jwb3JhdGlvbgotICogYmFzZWQgb24gYSBjb3B5IG9mIFJSJ3MgaXBfbmF0X2Z0cC5jCi0gKgotICogaXBfbmF0X2lyYy5jLHYgMS4xNiAyMDAxLzEyLzA2IDA3OjQyOjEwIGxhZm9yZ2UgRXhwCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19pcmMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUkMgKERDQykgTkFUIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQl1X2ludDE2X3QgcG9ydDsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0JLyogIjQyOTQ5NjcyOTYgNjU2MzUgIiAqLwotCWNoYXIgYnVmZmVyWzE4XTsKLQotCURFQlVHUCgiSVJDX05BVDogaW5mbyAoc2VxICV1ICsgJXUpIGluICV1XG4iLAotCSAgICAgICBleHBlY3QtPnNlcSwgZXhwX2lyY19pbmZvLT5sZW4sCi0JICAgICAgIG50b2hsKHRjcGgtPnNlcSkpOwotCi0JLyogUmVwbHkgY29tZXMgZnJvbSBzZXJ2ZXIuICovCi0JZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JZXhwLT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7Ci0KLQkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCi0JICogdGhpcyBvbmUuICovCi0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChwb3J0ID09IDApCi0JCXJldHVybiBORl9EUk9QOwotCi0JLyogICAgICBzdHJsZW4oIlwxRENDIENIQVQgY2hhdCBBQUFBQUFBQSBQXDFcbiIpPTI3Ci0JICogICAgICBzdHJsZW4oIlwxRENDIFNDSEFUIGNoYXQgQUFBQUFBQUEgUFwxXG4iKT0yOAotCSAqICAgICAgc3RybGVuKCJcMURDQyBTRU5EIEYgQUFBQUFBQUEgUCBTXDFcbiIpPTI2Ci0JICogICAgICBzdHJsZW4oIlwxRENDIE1PVkUgRiBBQUFBQUFBQSBQIFNcMVxuIik9MjYKLQkgKiAgICAgIHN0cmxlbigiXDFEQ0MgVFNFTkQgRiBBQUFBQUFBQSBQIFNcMVxuIik9MjcKLQkgKiAgICAgICAgICAgICAgQUFBQUFBQUFBOiBib3VuZCBhZGRyICgxLjAuMC4wPT0xNjc3NzIxNiwgbWluIDggZGlnaXRzLAotCSAqICAgICAgICAgICAgICAgICAgICAgIDI1NS4yNTUuMjU1LjI1NT09NDI5NDk2NzI5NiwgMTAgZGlnaXRzKQotCSAqICAgICAgICAgICAgICBQOiAgICAgICAgIGJvdW5kIHBvcnQgKG1pbiAxIGQsIG1heCA1ZCAoNjU2MzUpKQotCSAqICAgICAgICAgICAgICBGOiAgICAgICAgIGZpbGVuYW1lICAgKG1pbiAxIGQgKQotCSAqICAgICAgICAgICAgICBTOiAgICAgICAgIHNpemUgICAgICAgKG1pbiAxIGQgKQotCSAqICAgICAgICAgICAgICAweDAxLCBcbjogIHRlcm1pbmF0b3JzCi0JICovCi0KLQkvKiBBQUEgPSAidXMiLCBpZS4gd2hlcmUgc2VydmVyIG5vcm1hbGx5IHRhbGtzIHRvLiAqLwotCXNwcmludGYoYnVmZmVyLCAiJXUgJXUiLAotCQludG9obChleHAtPm1hc3Rlci0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKSwKLQkJcG9ydCk7Ci0JREVCVUdQKCJpcF9uYXRfaXJjOiBJbnNlcnRpbmcgJyVzJyA9PSAldS4ldS4ldS4ldSwgcG9ydCAldVxuIiwKLQkgICAgICAgYnVmZmVyLCBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgcG9ydCk7Ci0KLQlyZXQgPSBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgZXhwLT5tYXN0ZXIsIGN0aW5mbywKLQkJCQkgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBidWZmZXIsCi0JCQkJICAgICAgIHN0cmxlbihidWZmZXIpKTsKLQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2lyY19maW5pKHZvaWQpCi17Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9pcmNfaG9vaywgTlVMTCk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9pcmNfaW5pdCh2b2lkKQotewotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2lyY19ob29rKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9pcmNfaG9vaywgaGVscCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW9yIHRvIDIuNi4xMSwgd2UgaGFkIGEgcG9ydHMgcGFyYW0uICBObyBsb25nZXIsIGJ1dCBkb24ndCBicmVhayB1c2Vycy4gKi8KLXN0YXRpYyBpbnQgd2Fybl9zZXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKLXsKLQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FCi0JICAgICAgICI6IGtlcm5lbCA+PSAyLjYuMTAgb25seSB1c2VzICdwb3J0cycgZm9yIGNvbm50cmFjayBtb2R1bGVzXG4iKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9wYXJhbV9jYWxsKHBvcnRzLCB3YXJuX3NldCwgTlVMTCwgTlVMTCwgMCk7Ci0KLW1vZHVsZV9pbml0KGlwX25hdF9pcmNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfaXJjX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fZ3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODEwMjAuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogaXBfbmF0X3Byb3RvX2dyZS5jIC0gVmVyc2lvbiAyLjAKLSAqCi0gKiBOQVQgcHJvdG9jb2wgaGVscGVyIG1vZHVsZSBmb3IgR1JFLgotICoKLSAqIEdSRSBpcyBhIGdlbmVyaWMgZW5jYXBzdWxhdGlvbiBwcm90b2NvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IG5vdCB2ZXJ5Ci0gKiBzdWl0ZWQgZm9yIE5BVCwgYXMgaXQgaGFzIG5vIHByb3RvY29sLXNwZWNpZmljIHBhcnQgYXMgcG9ydCBudW1iZXJzLgotICoKLSAqIEl0IGhhcyBhbiBvcHRpb25hbCBrZXkgZmllbGQsIHdoaWNoIG1heSBoZWxwIHVzIGRpc3Rpbmd1aXNoaW5nIHR3bwotICogY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgc2FtZSB0d28gaG9zdHMuCi0gKgotICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLCBhcyB3ZWxsIGFzIFJGQyAyNzg0Ci0gKgotICogUFBUUCBpcyBidWlsdCBvbiB0b3Agb2YgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdSRSwgYW5kIGhhcyBhIG1hbmRhdG9yeQotICogZmllbGQgY2FsbGVkICJDYWxsSUQiLCB3aGljaCBzZXJ2ZXMgdXMgZm9yIHRoZSBzYW1lIHB1cnBvc2UgYXMgdGhlIGtleQotICogZmllbGQgaW4gcGxhaW4gR1JFLgotICoKLSAqIERvY3VtZW50YXRpb24gYWJvdXQgUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKLSAqCi0gKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRmaWx0ZXIgTkFUIHByb3RvY29sIGhlbHBlciBtb2R1bGUgZm9yIEdSRSIpOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgXAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKLSNlbmRpZgotCi0vKiBpcyBrZXkgaW4gZ2l2ZW4gcmFuZ2UgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwotc3RhdGljIGludAotZ3JlX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKLQkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQotewotCV9fYmUxNiBrZXk7Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCi0JCWtleSA9IHR1cGxlLT5zcmMudS5ncmUua2V5OwotCWVsc2UKLQkJa2V5ID0gdHVwbGUtPmRzdC51LmdyZS5rZXk7Ci0KLQlyZXR1cm4gbnRvaHMoa2V5KSA+PSBudG9ocyhtaW4tPmdyZS5rZXkpCi0JCSYmIG50b2hzKGtleSkgPD0gbnRvaHMobWF4LT5ncmUua2V5KTsKLX0KLQotLyogZ2VuZXJhdGUgdW5pcXVlIHR1cGxlIC4uLiAqLwotc3RhdGljIGludAotZ3JlX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0Jc3RhdGljIHVfaW50MTZfdCBrZXk7Ci0JX19iZTE2ICprZXlwdHI7Ci0JdW5zaWduZWQgaW50IG1pbiwgaSwgcmFuZ2Vfc2l6ZTsKLQotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJa2V5cHRyID0gJnR1cGxlLT5zcmMudS5ncmUua2V5OwotCWVsc2UKLQkJa2V5cHRyID0gJnR1cGxlLT5kc3QudS5ncmUua2V5OwotCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKLQkJREVCVUdQKCIlcDogTkFUaW5nIEdSRSBQUFRQXG4iLCBjb25udHJhY2spOwotCQltaW4gPSAxOwotCQlyYW5nZV9zaXplID0gMHhmZmZmOwotCX0gZWxzZSB7Ci0JCW1pbiA9IG50b2hzKHJhbmdlLT5taW4uZ3JlLmtleSk7Ci0JCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LmdyZS5rZXkpIC0gbWluICsgMTsKLQl9Ci0KLQlERUJVR1AoIm1pbiA9ICV1LCByYW5nZV9zaXplID0gJXVcbiIsIG1pbiwgcmFuZ2Vfc2l6ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBrZXkrKykgewotCQkqa2V5cHRyID0gaHRvbnMobWluICsga2V5ICUgcmFuZ2Vfc2l6ZSk7Ci0JCWlmICghaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlERUJVR1AoIiVwOiBubyBOQVQgbWFwcGluZ1xuIiwgY29ubnRyYWNrKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBtYW5pcHVsYXRlIGEgR1JFIHBhY2tldCBhY2NvcmRpbmcgdG8gbWFuaXB0eXBlICovCi1zdGF0aWMgaW50Ci1ncmVfbWFuaXBfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgICAgICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCi17Ci0Jc3RydWN0IGdyZV9oZHIgKmdyZWg7Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCAqcGdyZWg7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopKCgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZik7Ci0JdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKLQotCS8qIHBncmVoIGluY2x1ZGVzIHR3byBvcHRpb25hbCAzMmJpdCBmaWVsZHMgd2hpY2ggYXJlIG5vdCByZXF1aXJlZAotCSAqIHRvIGJlIHRoZXJlLiAgVGhhdCdzIHdoZXJlIHRoZSBtYWdpYyAnOCcgY29tZXMgZnJvbSAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgc2l6ZW9mKCpwZ3JlaCktOCkpCi0JCXJldHVybiAwOwotCi0JZ3JlaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGhkcm9mZjsKLQlwZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkcl9wcHRwICopIGdyZWg7Ci0KLQkvKiB3ZSBvbmx5IGhhdmUgZGVzdGluYXRpb24gbWFuaXAgb2YgYSBwYWNrZXQsIHNpbmNlICdzb3VyY2Uga2V5JwotCSAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBwYWNrZXQgaXRzZWxmICovCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKSB7Ci0JCS8qIGtleSBtYW5pcHVsYXRpb24gaXMgYWx3YXlzIGRlc3QgKi8KLQkJc3dpdGNoIChncmVoLT52ZXJzaW9uKSB7Ci0JCWNhc2UgMDoKLQkJCWlmICghZ3JlaC0+a2V5KSB7Ci0JCQkJREVCVUdQKCJjYW4ndCBuYXQgR1JFIHcvbyBrZXlcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGdyZWgtPmNzdW0pIHsKLQkJCQkvKiBGSVhNRTogTmV2ZXIgdGVzdGVkIHRoaXMgY29kZS4uLiAqLwotCQkJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoZ3JlX2NzdW0oZ3JlaCksICpwc2tiLAotCQkJCQkJCSooZ3JlX2tleShncmVoKSksCi0JCQkJCQkJdHVwbGUtPmRzdC51LmdyZS5rZXksIDApOwotCQkJfQotCQkJKihncmVfa2V5KGdyZWgpKSA9IHR1cGxlLT5kc3QudS5ncmUua2V5OwotCQkJYnJlYWs7Ci0JCWNhc2UgR1JFX1ZFUlNJT05fUFBUUDoKLQkJCURFQlVHUCgiY2FsbF9pZCAtPiAweCUwNHhcbiIsCi0JCQkJbnRvaHModHVwbGUtPmRzdC51LmdyZS5rZXkpKTsKLQkJCXBncmVoLT5jYWxsX2lkID0gdHVwbGUtPmRzdC51LmdyZS5rZXk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURFQlVHUCgiY2FuJ3QgbmF0IHVua25vd24gR1JFIHZlcnNpb25cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogbmF0IGhlbHBlciBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGdyZSA9IHsKLQkubmFtZQkJPSAiR1JFIiwKLQkucHJvdG9udW0JPSBJUFBST1RPX0dSRSwKLQkubWFuaXBfcGt0CT0gZ3JlX21hbmlwX3BrdCwKLQkuaW5fcmFuZ2UJPSBncmVfaW5fcmFuZ2UsCi0JLnVuaXF1ZV90dXBsZQk9IGdyZV91bmlxdWVfdHVwbGUsCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCi0JLnJhbmdlX3RvX25mYXR0cgk9IGlwX25hdF9wb3J0X3JhbmdlX3RvX25mYXR0ciwKLQkubmZhdHRyX3RvX3JhbmdlCT0gaXBfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlLAotI2VuZGlmCi19OwotCi1pbnQgX19pbml0IGlwX25hdF9wcm90b19ncmVfaW5pdCh2b2lkKQotewotCXJldHVybiBpcF9uYXRfcHJvdG9jb2xfcmVnaXN0ZXIoJmdyZSk7Ci19Ci0KLXZvaWQgX19leGl0IGlwX25hdF9wcm90b19ncmVfZmluaSh2b2lkKQotewotCWlwX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKCZncmUpOwotfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhNTI4YS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotCi1zdGF0aWMgaW50Ci1pY21wX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAotCSAgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAotCSAgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQotewotCXJldHVybiBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPj0gbnRvaHMobWluLT5pY21wLmlkKSAmJgotCSAgICAgICBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPD0gbnRvaHMobWF4LT5pY21wLmlkKTsKLX0KLQotc3RhdGljIGludAotaWNtcF91bmlxdWVfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCSAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCXN0YXRpYyB1X2ludDE2X3QgaWQ7Ci0JdW5zaWduZWQgaW50IHJhbmdlX3NpemU7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC5pY21wLmlkKSAtIG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKyAxOwotCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKQotCQlyYW5nZV9zaXplID0gMHhGRkZGOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgaWQrKykgewotCQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IGh0b25zKG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKwotCQkJCQkgICAgIChpZCAlIHJhbmdlX3NpemUpKTsKLQkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaWNtcF9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKLQlzdHJ1Y3QgaWNtcGhkciAqaGRyOwotCXVuc2lnbmVkIGludCBoZHJvZmYgPSBpcGhkcm9mZiArIGlwaC0+aWhsKjQ7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIHNpemVvZigqaGRyKSkpCi0JCXJldHVybiAwOwotCi0JaGRyID0gKHN0cnVjdCBpY21waGRyICopKCgqcHNrYiktPmRhdGEgKyBoZHJvZmYpOwotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJmhkci0+Y2hlY2tzdW0sICpwc2tiLAotCQkJICAgICAgIGhkci0+dW4uZWNoby5pZCwgdHVwbGUtPnNyYy51LmljbXAuaWQsIDApOwotCWhkci0+dW4uZWNoby5pZCA9IHR1cGxlLT5zcmMudS5pY21wLmlkOwotCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF9wcm90b2NvbF9pY21wID0gewotCS5uYW1lCQkJPSAiSUNNUCIsCi0JLnByb3RvbnVtCQk9IElQUFJPVE9fSUNNUCwKLQkubWUJCQk9IFRISVNfTU9EVUxFLAotCS5tYW5pcF9wa3QJCT0gaWNtcF9tYW5pcF9wa3QsCi0JLmluX3JhbmdlCQk9IGljbXBfaW5fcmFuZ2UsCi0JLnVuaXF1ZV90dXBsZQkJPSBpY21wX3VuaXF1ZV90dXBsZSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkucmFuZ2VfdG9fbmZhdHRyCT0gaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fcmFuZ2UJPSBpcF9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2UsCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmZjI0Zi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+Ci0KLXN0YXRpYyBpbnQKLXRjcF9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAotCSAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptaW4sCi0JICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1heCkKLXsKLQlfX2JlMTYgcG9ydDsKLQotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJcG9ydCA9IHR1cGxlLT5zcmMudS50Y3AucG9ydDsKLQllbHNlCi0JCXBvcnQgPSB0dXBsZS0+ZHN0LnUudGNwLnBvcnQ7Ci0KLQlyZXR1cm4gbnRvaHMocG9ydCkgPj0gbnRvaHMobWluLT50Y3AucG9ydCkKLQkJJiYgbnRvaHMocG9ydCkgPD0gbnRvaHMobWF4LT50Y3AucG9ydCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF91bmlxdWVfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKLQkJIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAotCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCXN0YXRpYyB1X2ludDE2X3QgcG9ydDsKLQlfX2JlMTYgKnBvcnRwdHI7Ci0JdW5zaWduZWQgaW50IHJhbmdlX3NpemUsIG1pbiwgaTsKLQotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJcG9ydHB0ciA9ICZ0dXBsZS0+c3JjLnUudGNwLnBvcnQ7Ci0JZWxzZQotCQlwb3J0cHRyID0gJnR1cGxlLT5kc3QudS50Y3AucG9ydDsKLQotCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKSB7Ci0JCS8qIElmIGl0J3MgZHN0IHJld3JpdGUsIGNhbid0IGNoYW5nZSBwb3J0ICovCi0JCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX0RTVCkKLQkJCXJldHVybiAwOwotCi0JCS8qIE1hcCBwcml2aWxlZ2VkIG9udG8gcHJpdmlsZWdlZC4gKi8KLQkJaWYgKG50b2hzKCpwb3J0cHRyKSA8IDEwMjQpIHsKLQkJCS8qIExvb3NlIGNvbnZlbnRpb246ID4+IDUxMiBpcyBjcmVkZW50aWFsIHBhc3NpbmcgKi8KLQkJCWlmIChudG9ocygqcG9ydHB0cik8NTEyKSB7Ci0JCQkJbWluID0gMTsKLQkJCQlyYW5nZV9zaXplID0gNTExIC0gbWluICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWluID0gNjAwOwotCQkJCXJhbmdlX3NpemUgPSAxMDIzIC0gbWluICsgMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1pbiA9IDEwMjQ7Ci0JCQlyYW5nZV9zaXplID0gNjU1MzUgLSAxMDI0ICsgMTsKLQkJfQotCX0gZWxzZSB7Ci0JCW1pbiA9IG50b2hzKHJhbmdlLT5taW4udGNwLnBvcnQpOwotCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC50Y3AucG9ydCkgLSBtaW4gKyAxOwotCX0KLQotCS8qIFN0YXJ0IGZyb20gcmFuZG9tIHBvcnQgdG8gYXZvaWQgcHJlZGljdGlvbiAqLwotCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQotCQlwb3J0ID0gIG5ldF9yYW5kb20oKTsKLQotCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgewotCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKLQkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKLQlzdHJ1Y3QgdGNwaGRyICpoZHI7Ci0JdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKLQlfX2JlMzIgb2xkaXAsIG5ld2lwOwotCV9fYmUxNiAqcG9ydHB0ciwgbmV3cG9ydCwgb2xkcG9ydDsKLQlpbnQgaGRyc2l6ZSA9IDg7IC8qIFRDUCBjb25uZWN0aW9uIHRyYWNraW5nIGd1YXJhbnRlZXMgdGhpcyBtdWNoICovCi0KLQkvKiB0aGlzIGNvdWxkIGJlIGEgaW5uZXIgaGVhZGVyIHJldHVybmVkIGluIGljbXAgcGFja2V0OyBpbiBzdWNoCi0JICAgY2FzZXMgd2UgY2Fubm90IHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgc2luY2UgaXQgaXMgb3V0c2lkZSBvZgotCSAgIHRoZSA4IGJ5dGVzIG9mIHRyYW5zcG9ydCBsYXllciBoZWFkZXJzIHdlIGFyZSBndWFyYW50ZWVkICovCi0JaWYgKCgqcHNrYiktPmxlbiA+PSBoZHJvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCi0JCWhkcnNpemUgPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIGhkcnNpemUpKQotCQlyZXR1cm4gMDsKLQotCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKLQloZHIgPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaGRyb2ZmKTsKLQotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgewotCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCi0JCW9sZGlwID0gaXBoLT5zYWRkcjsKLQkJbmV3aXAgPSB0dXBsZS0+c3JjLmlwOwotCQluZXdwb3J0ID0gdHVwbGUtPnNyYy51LnRjcC5wb3J0OwotCQlwb3J0cHRyID0gJmhkci0+c291cmNlOwotCX0gZWxzZSB7Ci0JCS8qIEdldCByaWQgb2YgZHN0IGlwIGFuZCBkc3QgcHQgKi8KLQkJb2xkaXAgPSBpcGgtPmRhZGRyOwotCQluZXdpcCA9IHR1cGxlLT5kc3QuaXA7Ci0JCW5ld3BvcnQgPSB0dXBsZS0+ZHN0LnUudGNwLnBvcnQ7Ci0JCXBvcnRwdHIgPSAmaGRyLT5kZXN0OwotCX0KLQotCW9sZHBvcnQgPSAqcG9ydHB0cjsKLQkqcG9ydHB0ciA9IG5ld3BvcnQ7Ci0KLQlpZiAoaGRyc2l6ZSA8IHNpemVvZigqaGRyKSkKLQkJcmV0dXJuIDE7Ci0KLQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkaXAsIG5ld2lwLCAxKTsKLQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkcG9ydCwgbmV3cG9ydCwgMCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX3RjcCA9IHsKLQkubmFtZQkJCT0gIlRDUCIsCi0JLnByb3RvbnVtCQk9IElQUFJPVE9fVENQLAotCS5tZQkJCT0gVEhJU19NT0RVTEUsCi0JLm1hbmlwX3BrdAkJPSB0Y3BfbWFuaXBfcGt0LAotCS5pbl9yYW5nZQkJPSB0Y3BfaW5fcmFuZ2UsCi0JLnVuaXF1ZV90dXBsZQkJPSB0Y3BfdW5pcXVlX3R1cGxlLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS5yYW5nZV90b19uZmF0dHIJPSBpcF9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b19yYW5nZQk9IGlwX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ1MjE2Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KLQotc3RhdGljIGludAotdWRwX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKLQkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQotewotCV9fYmUxNiBwb3J0OwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlwb3J0ID0gdHVwbGUtPnNyYy51LnVkcC5wb3J0OwotCWVsc2UKLQkJcG9ydCA9IHR1cGxlLT5kc3QudS51ZHAucG9ydDsKLQotCXJldHVybiBudG9ocyhwb3J0KSA+PSBudG9ocyhtaW4tPnVkcC5wb3J0KQotCQkmJiBudG9ocyhwb3J0KSA8PSBudG9ocyhtYXgtPnVkcC5wb3J0KTsKLX0KLQotc3RhdGljIGludAotdWRwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0Jc3RhdGljIHVfaW50MTZfdCBwb3J0OwotCV9fYmUxNiAqcG9ydHB0cjsKLQl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZSwgbWluLCBpOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlwb3J0cHRyID0gJnR1cGxlLT5zcmMudS51ZHAucG9ydDsKLQllbHNlCi0JCXBvcnRwdHIgPSAmdHVwbGUtPmRzdC51LnVkcC5wb3J0OwotCi0JLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKLQkJLyogSWYgaXQncyBkc3QgcmV3cml0ZSwgY2FuJ3QgY2hhbmdlIHBvcnQgKi8KLQkJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG50b2hzKCpwb3J0cHRyKSA8IDEwMjQpIHsKLQkJCS8qIExvb3NlIGNvbnZlbnRpb246ID4+IDUxMiBpcyBjcmVkZW50aWFsIHBhc3NpbmcgKi8KLQkJCWlmIChudG9ocygqcG9ydHB0cik8NTEyKSB7Ci0JCQkJbWluID0gMTsKLQkJCQlyYW5nZV9zaXplID0gNTExIC0gbWluICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWluID0gNjAwOwotCQkJCXJhbmdlX3NpemUgPSAxMDIzIC0gbWluICsgMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1pbiA9IDEwMjQ7Ci0JCQlyYW5nZV9zaXplID0gNjU1MzUgLSAxMDI0ICsgMTsKLQkJfQotCX0gZWxzZSB7Ci0JCW1pbiA9IG50b2hzKHJhbmdlLT5taW4udWRwLnBvcnQpOwotCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC51ZHAucG9ydCkgLSBtaW4gKyAxOwotCX0KLQotCS8qIFN0YXJ0IGZyb20gcmFuZG9tIHBvcnQgdG8gYXZvaWQgcHJlZGljdGlvbiAqLwotCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQotCQlwb3J0ID0gbmV0X3JhbmRvbSgpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7Ci0JCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOwotCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci11ZHBfbWFuaXBfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgICAgICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCi17Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopKCgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZik7Ci0Jc3RydWN0IHVkcGhkciAqaGRyOwotCXVuc2lnbmVkIGludCBoZHJvZmYgPSBpcGhkcm9mZiArIGlwaC0+aWhsKjQ7Ci0JX19iZTMyIG9sZGlwLCBuZXdpcDsKLQlfX2JlMTYgKnBvcnRwdHIsIG5ld3BvcnQ7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIHNpemVvZigqaGRyKSkpCi0JCXJldHVybiAwOwotCi0JaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOwotCWhkciA9IChzdHJ1Y3QgdWRwaGRyICopKCgqcHNrYiktPmRhdGEgKyBoZHJvZmYpOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7Ci0JCS8qIEdldCByaWQgb2Ygc3JjIGlwIGFuZCBzcmMgcHQgKi8KLQkJb2xkaXAgPSBpcGgtPnNhZGRyOwotCQluZXdpcCA9IHR1cGxlLT5zcmMuaXA7Ci0JCW5ld3BvcnQgPSB0dXBsZS0+c3JjLnUudWRwLnBvcnQ7Ci0JCXBvcnRwdHIgPSAmaGRyLT5zb3VyY2U7Ci0JfSBlbHNlIHsKLQkJLyogR2V0IHJpZCBvZiBkc3QgaXAgYW5kIGRzdCBwdCAqLwotCQlvbGRpcCA9IGlwaC0+ZGFkZHI7Ci0JCW5ld2lwID0gdHVwbGUtPmRzdC5pcDsKLQkJbmV3cG9ydCA9IHR1cGxlLT5kc3QudS51ZHAucG9ydDsKLQkJcG9ydHB0ciA9ICZoZHItPmRlc3Q7Ci0JfQotCi0JaWYgKGhkci0+Y2hlY2sgfHwgKCpwc2tiKS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmaGRyLT5jaGVjaywgKnBza2IsIG9sZGlwLCBuZXdpcCwgMSk7Ci0JCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJmhkci0+Y2hlY2ssICpwc2tiLCAqcG9ydHB0ciwgbmV3cG9ydCwgMCk7Ci0JCWlmICghaGRyLT5jaGVjaykKLQkJCWhkci0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKLQl9Ci0JKnBvcnRwdHIgPSBuZXdwb3J0OwotCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF9wcm90b2NvbF91ZHAgPSB7Ci0JLm5hbWUJCQk9ICJVRFAiLAotCS5wcm90b251bQkJPSBJUFBST1RPX1VEUCwKLQkubWUJCQk9IFRISVNfTU9EVUxFLAotCS5tYW5pcF9wa3QJCT0gdWRwX21hbmlwX3BrdCwKLQkuaW5fcmFuZ2UJCT0gdWRwX2luX3JhbmdlLAotCS51bmlxdWVfdHVwbGUJCT0gdWRwX3VuaXF1ZV90dXBsZSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkucmFuZ2VfdG9fbmZhdHRyCT0gaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fcmFuZ2UJPSBpcF9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2UsCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3Vua25vd24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdW5rbm93bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmYwNDk1Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdW5rbm93bi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogVGhlICJ1bmtub3duIiBwcm90b2NvbC4gIFRoaXMgaXMgd2hhdCBpcyB1c2VkIGZvciBwcm90b2NvbHMgd2UKLSAqIGRvbid0IHVuZGVyc3RhbmQuICBJdCdzIHJldHVybmVkIGJ5IGlwX2N0X2ZpbmRfcHJvdG8oKS4KLSAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaWYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0KLXN0YXRpYyBpbnQgdW5rbm93bl9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwX3R5cGUsCi0JCQkgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptaW4sCi0JCQkgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdW5rbm93bl91bmlxdWVfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkJY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCQkJZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JCQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQotewotCS8qIFNvcnJ5OiB3ZSBjYW4ndCBoZWxwIHlvdTsgaWYgaXQncyBub3QgdW5pcXVlLCB3ZSBjYW4ndCBmcm9iCi0JICAgYW55dGhpbmcuICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXVua25vd25fbWFuaXBfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCi0JCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Vua25vd25fcHJvdG9jb2wgPSB7Ci0JLm5hbWUJCQk9ICJ1bmtub3duIiwKLQkvKiAubWUgaXNuJ3Qgc2V0OiBnZXR0aW5nIGEgcmVmIHRvIHRoaXMgY2Fubm90IGZhaWwuICovCi0JLm1hbmlwX3BrdAkJPSB1bmtub3duX21hbmlwX3BrdCwKLQkuaW5fcmFuZ2UJCT0gdW5rbm93bl9pbl9yYW5nZSwKLQkudW5pcXVlX3R1cGxlCQk9IHVua25vd25fdW5pcXVlX3R1cGxlLAotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MGViMWQuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotLyogRXZlcnl0aGluZyBhYm91dCB0aGUgcnVsZXMgZm9yIE5BVC4gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgTkFUX1ZBTElEX0hPT0tTICgoMTw8TkZfSVBfUFJFX1JPVVRJTkcpIHwgKDE8PE5GX0lQX1BPU1RfUk9VVElORykgfCAoMTw8TkZfSVBfTE9DQUxfT1VUKSkKLQotc3RhdGljIHN0cnVjdAotewotCXN0cnVjdCBpcHRfcmVwbGFjZSByZXBsOwotCXN0cnVjdCBpcHRfc3RhbmRhcmQgZW50cmllc1szXTsKLQlzdHJ1Y3QgaXB0X2Vycm9yIHRlcm07Ci19IG5hdF9pbml0aWFsX3RhYmxlIF9faW5pdGRhdGEKLT0geyB7ICJuYXQiLCBOQVRfVkFMSURfSE9PS1MsIDQsCi0gICAgICBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAotICAgICAgeyBbTkZfSVBfUFJFX1JPVVRJTkddID0gMCwKLQlbTkZfSVBfUE9TVF9ST1VUSU5HXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKLSAgICAgIHsgW05GX0lQX1BSRV9ST1VUSU5HXSA9IDAsCi0JW05GX0lQX1BPU1RfUk9VVElOR10gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyIH0sCi0gICAgICAwLCBOVUxMLCB7IH0gfSwKLSAgICB7Ci0JICAgIC8qIFBSRV9ST1VUSU5HICovCi0JICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCQkwLAotCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQktTkZfQUNDRVBUIC0gMSB9IH0sCi0JICAgIC8qIFBPU1RfUk9VVElORyAqLwotCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCTAsIHsgMCwgMCB9LCB7IH0gfSwKLQkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9LAotCSAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfQotICAgIH0sCi0gICAgLyogRVJST1IgKi8KLSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkwLAotCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQlzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCi0JMCwgeyAwLCAwIH0sIHsgfSB9LAotICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSksIElQVF9FUlJPUl9UQVJHRVQgfSB9LAotCSAgeyB9IH0sCi0JIkVSUk9SIgotICAgICAgfQotICAgIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgbmF0X3RhYmxlID0gewotCS5uYW1lCQk9ICJuYXQiLAotCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKLQkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAotCS5tZQkJPSBUSElTX01PRFVMRSwKLQkuYWYJCT0gQUZfSU5FVCwKLX07Ci0KLS8qIFNvdXJjZSBOQVQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXB0X3NuYXRfdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKLQotCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORyk7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotCi0JLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCi0JSVBfTkZfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVECi0JCQkgICAgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOwotCUlQX05GX0FTU0VSVChvdXQpOwotCi0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBob29rbnVtKTsKLX0KLQotLyogQmVmb3JlIDIuNi4xMSB3ZSBkaWQgaW1wbGljaXQgc291cmNlIE5BVCBpZiByZXF1aXJlZC4gV2FybiBhYm91dCBjaGFuZ2UuICovCi1zdGF0aWMgdm9pZCB3YXJuX2lmX2V4dHJhX21hbmdsZShfX2JlMzIgZHN0aXAsIF9fYmUzMiBzcmNpcCkKLXsKLQlzdGF0aWMgaW50IHdhcm5lZCA9IDA7Ci0Jc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBkc3RpcCB9IH0gfTsKLQlzdHJ1Y3QgcnRhYmxlICpydDsKLQotCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSAhPSAwKQotCQlyZXR1cm47Ci0KLQlpZiAocnQtPnJ0X3NyYyAhPSBzcmNpcCAmJiAhd2FybmVkKSB7Ci0JCXByaW50aygiTkFUOiBubyBsb25nZXIgc3VwcG9ydCBpbXBsaWNpdCBzb3VyY2UgbG9jYWwgTkFUXG4iKTsKLQkJcHJpbnRrKCJOQVQ6IHBhY2tldCBzcmMgJXUuJXUuJXUuJXUgLT4gZHN0ICV1LiV1LiV1LiV1XG4iLAotCQkgICAgICAgTklQUVVBRChzcmNpcCksIE5JUFFVQUQoZHN0aXApKTsKLQkJd2FybmVkID0gMTsKLQl9Ci0JaXBfcnRfcHV0KHJ0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBpcHRfZG5hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkJICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOwotCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKLQkJICAgICB8fCBob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCk7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotCi0JLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCi0JSVBfTkZfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEKSk7Ci0KLQlpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQKLQkgICAgJiYgbXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpCi0JCXdhcm5faWZfZXh0cmFfbWFuZ2xlKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICBtci0+cmFuZ2VbMF0ubWluX2lwKTsKLQotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm1yLT5yYW5nZVswXSwgaG9va251bSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXB0X3NuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87Ci0KLQkvKiBNdXN0IGJlIGEgdmFsaWQgcmFuZ2UgKi8KLQlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7Ci0JCXByaW50aygiU05BVDogbXVsdGlwbGUgcmFuZ2VzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87Ci0KLQkvKiBNdXN0IGJlIGEgdmFsaWQgcmFuZ2UgKi8KLQlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7Ci0JCXByaW50aygiRE5BVDogbXVsdGlwbGUgcmFuZ2VzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pIHsKLQkJcHJpbnRrKCJETkFUOiBwb3J0IHJhbmRvbWl6YXRpb24gbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotaW5saW5lIHVuc2lnbmVkIGludAotYWxsb2NfbnVsbF9iaW5kaW5nKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJICAgc3RydWN0IGlwX25hdF9pbmZvICppbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va251bSkKLXsKLQkvKiBGb3JjZSByYW5nZSB0byB0aGlzIElQOyBsZXQgcHJvdG8gZGVjaWRlIG1hcHBpbmcgZm9yCi0JICAgcGVyLXByb3RvIHBhcnRzIChoZW5jZSBub3QgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkuCi0JICAgVXNlIHJlcGx5IGluIGNhc2UgaXQncyBhbHJlYWR5IGJlZW4gbWFuZ2xlZCAoZWcgbG9jYWwgcGFja2V0KS4KLQkqLwotCV9fYmUzMiBpcAotCQk9IChIT09LMk1BTklQKGhvb2tudW0pID09IElQX05BVF9NQU5JUF9TUkMKLQkJICAgPyBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcAotCQkgICA6IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwKTsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlCi0JCT0geyBJUF9OQVRfUkFOR0VfTUFQX0lQUywgaXAsIGlwLCB7IDAgfSwgeyAwIH0gfTsKLQotCURFQlVHUCgiQWxsb2NhdGluZyBOVUxMIGJpbmRpbmcgZm9yICVwICgldS4ldS4ldS4ldSlcbiIsIGNvbm50cmFjaywKLQkgICAgICAgTklQUVVBRChpcCkpOwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjb25udHJhY2ssICZyYW5nZSwgaG9va251bSk7Ci19Ci0KLXVuc2lnbmVkIGludAotYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0JX19iZTMyIGlwCi0JCT0gKEhPT0syTUFOSVAoaG9va251bSkgPT0gSVBfTkFUX01BTklQX1NSQwotCQkgICA/IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwCi0JCSAgIDogY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOwotCXVfaW50MTZfdCBhbGwKLQkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCi0JCSAgID8gY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudS5hbGwKLQkJICAgOiBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51LmFsbCk7Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZQotCQk9IHsgSVBfTkFUX1JBTkdFX01BUF9JUFMsIGlwLCBpcCwgeyBhbGwgfSwgeyBhbGwgfSB9OwotCi0JREVCVUdQKCJBbGxvY2F0aW5nIE5VTEwgYmluZGluZyBmb3IgY29uZmlybWVkICVwICgldS4ldS4ldS4ldSlcbiIsCi0JICAgICAgIGNvbm50cmFjaywgTklQUVVBRChpcCkpOwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjb25udHJhY2ssICZyYW5nZSwgaG9va251bSk7Ci19Ci0KLWludCBpcF9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8pCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGlwdF9kb190YWJsZShwc2tiLCBob29rbnVtLCBpbiwgb3V0LCAmbmF0X3RhYmxlKTsKLQotCWlmIChyZXQgPT0gTkZfQUNDRVBUKSB7Ci0JCWlmICghaXBfbmF0X2luaXRpYWxpemVkKGN0LCBIT09LMk1BTklQKGhvb2tudW0pKSkKLQkJCS8qIE5VTCBtYXBwaW5nICovCi0JCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfc25hdF9yZWcgPSB7Ci0JLm5hbWUJCT0gIlNOQVQiLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkudGFyZ2V0CQk9IGlwdF9zbmF0X3RhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCi0JLnRhYmxlCQk9ICJuYXQiLAotCS5ob29rcwkJPSAxIDw8IE5GX0lQX1BPU1RfUk9VVElORywKLQkuY2hlY2tlbnRyeQk9IGlwdF9zbmF0X2NoZWNrZW50cnksCi19OwotCi1zdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfZG5hdF9yZWcgPSB7Ci0JLm5hbWUJCT0gIkROQVQiLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkudGFyZ2V0CQk9IGlwdF9kbmF0X3RhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCi0JLnRhYmxlCQk9ICJuYXQiLAotCS5ob29rcwkJPSAoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9PVVQpLAotCS5jaGVja2VudHJ5CT0gaXB0X2RuYXRfY2hlY2tlbnRyeSwKLX07Ci0KLWludCBfX2luaXQgaXBfbmF0X3J1bGVfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpcHRfcmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSwgJm5hdF9pbml0aWFsX3RhYmxlLnJlcGwpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7Ci0JaWYgKHJldCAhPSAwKQotCQlnb3RvIHVucmVnaXN0ZXJfdGFibGU7Ci0KLQlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9kbmF0X3JlZyk7Ci0JaWYgKHJldCAhPSAwKQotCQlnb3RvIHVucmVnaXN0ZXJfc25hdDsKLQotCXJldHVybiByZXQ7Ci0KLSB1bnJlZ2lzdGVyX3NuYXQ6Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7Ci0gdW5yZWdpc3Rlcl90YWJsZToKLQl4dF91bnJlZ2lzdGVyX3RhYmxlKCZuYXRfdGFibGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpcF9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpCi17Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9kbmF0X3JlZyk7Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7Ci0JaXB0X3VucmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSk7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NpcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1YzVhOS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qIFNJUCBleHRlbnNpb24gZm9yIFVEUCBOQVQgYWx0ZXJhdGlvbi4KLSAqCi0gKiAoQykgMjAwNSBieSBDaHJpc3RpYW4gSGVudHNjaGVsIDxjaGVudHNjaGVsQGFybmV0LmNvbS5hcj4KLSAqIGJhc2VkIG9uIFJSJ3MgaXBfbmF0X2Z0cC5jIGFuZCBvdGhlciBtb2R1bGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3NpcC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gSGVudHNjaGVsIDxjaGVudHNjaGVsQGFybmV0LmNvbS5hcj4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0lQIE5BVCBoZWxwZXIiKTsKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1zdHJ1Y3QgYWRkcl9tYXAgewotCXN0cnVjdCB7Ci0JCWNoYXIJCXNyY1tzaXplb2YoIm5ubi5ubm4ubm5uLm5ubjpubm5ubiIpXTsKLQkJY2hhcgkJZHN0W3NpemVvZigibm5uLm5ubi5ubm4ubm5uOm5ubm5uIildOwotCQl1bnNpZ25lZCBpbnQJc3JjbGVuLCBzcmNpcGxlbjsKLQkJdW5zaWduZWQgaW50CWRzdGxlbiwgZHN0aXBsZW47Ci0JfSBhZGRyW0lQX0NUX0RJUl9NQVhdOwotfTsKLQotc3RhdGljIHZvaWQgYWRkcl9tYXBfaW5pdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IGFkZHJfbWFwICptYXApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOwotCXVuc2lnbmVkIGludCBuOwotCi0JZm9yIChkaXIgPSAwOyBkaXIgPCBJUF9DVF9ESVJfTUFYOyBkaXIrKykgewotCQl0ID0gJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZTsKLQotCQluID0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5zcmMsICIldS4ldS4ldS4ldSIsCi0JCQkgICAgTklQUVVBRCh0LT5zcmMuaXApKTsKLQkJbWFwLT5hZGRyW2Rpcl0uc3JjaXBsZW4gPSBuOwotCQluICs9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uc3JjICsgbiwgIjoldSIsCi0JCQkgICAgIG50b2hzKHQtPnNyYy51LnVkcC5wb3J0KSk7Ci0JCW1hcC0+YWRkcltkaXJdLnNyY2xlbiA9IG47Ci0KLQkJbiA9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uZHN0LCAiJXUuJXUuJXUuJXUiLAotCQkJICAgIE5JUFFVQUQodC0+ZHN0LmlwKSk7Ci0JCW1hcC0+YWRkcltkaXJdLmRzdGlwbGVuID0gbjsKLQkJbiArPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLmRzdCArIG4sICI6JXUiLAotCQkJICAgICBudG9ocyh0LT5kc3QudS51ZHAucG9ydCkpOwotCQltYXAtPmFkZHJbZGlyXS5kc3RsZW4gPSBuOwotCX0KLX0KLQotc3RhdGljIGludCBtYXBfc2lwX2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBjb25zdCBjaGFyICoqZHB0ciwgc2l6ZV90IGRsZW4sCi0JCQllbnVtIHNpcF9oZWFkZXJfcG9zIHBvcywgc3RydWN0IGFkZHJfbWFwICptYXApCi17Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sIG1hdGNob2ZmLCBhZGRybGVuOwotCWNoYXIgKmFkZHI7Ci0KLQlpZiAoY3Rfc2lwX2dldF9pbmZvKCpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA8PSAwKQotCQlyZXR1cm4gMTsKLQotCWlmICgobWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uc3JjaXBsZW4gfHwKLQkgICAgIG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLnNyY2xlbikgJiYKLQkgICAgbWVtY21wKCpkcHRyICsgbWF0Y2hvZmYsIG1hcC0+YWRkcltkaXJdLnNyYywgbWF0Y2hsZW4pID09IDApIHsKLQkJYWRkciAgICA9IG1hcC0+YWRkclshZGlyXS5kc3Q7Ci0JCWFkZHJsZW4gPSBtYXAtPmFkZHJbIWRpcl0uZHN0bGVuOwotCX0gZWxzZSBpZiAoKG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLmRzdGlwbGVuIHx8Ci0JCSAgICBtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5kc3RsZW4pICYmCi0JCSAgIG1lbWNtcCgqZHB0ciArIG1hdGNob2ZmLCBtYXAtPmFkZHJbZGlyXS5kc3QsIG1hdGNobGVuKSA9PSAwKSB7Ci0JCWFkZHIgICAgPSBtYXAtPmFkZHJbIWRpcl0uc3JjOwotCQlhZGRybGVuID0gbWFwLT5hZGRyWyFkaXJdLnNyY2xlbjsKLQl9IGVsc2UKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoIWlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCSAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwgYWRkciwgYWRkcmxlbikpCi0JCXJldHVybiAwOwotCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JcmV0dXJuIDE7Ci0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9uYXRfc2lwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cikKLXsKLQllbnVtIHNpcF9oZWFkZXJfcG9zIHBvczsKLQlzdHJ1Y3QgYWRkcl9tYXAgbWFwOwotCWludCBkYXRhb2ZmLCBkYXRhbGVuOwotCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7Ci0JaWYgKGRhdGFsZW4gPCBzaXplb2YoIlNJUC8yLjAiKSAtIDEpCi0JCXJldHVybiBORl9EUk9QOwotCi0JYWRkcl9tYXBfaW5pdChjdCwgJm1hcCk7Ci0KLQkvKiBCYXNpYyBydWxlczogcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4gKi8KLQlpZiAoc3RybmNtcCgqZHB0ciwgIlNJUC8yLjAiLCBzaXplb2YoIlNJUC8yLjAiKSAtIDEpICE9IDApIHsKLQkJLyogMTAuMjogQ29uc3RydWN0aW5nIHRoZSBSRUdJU1RFUiBSZXF1ZXN0OgotCQkgKgotCQkgKiBUaGUgInVzZXJpbmZvIiBhbmQgIkAiIGNvbXBvbmVudHMgb2YgdGhlIFNJUCBVUkkgTVVTVCBOT1QKLQkJICogYmUgcHJlc2VudC4KLQkJICovCi0JCWlmIChkYXRhbGVuID49IHNpemVvZigiUkVHSVNURVIiKSAtIDEgJiYKLQkJICAgIHN0cm5jbXAoKmRwdHIsICJSRUdJU1RFUiIsIHNpemVvZigiUkVHSVNURVIiKSAtIDEpID09IDApCi0JCQlwb3MgPSBQT1NfUkVHX1JFUV9VUkk7Ci0JCWVsc2UKLQkJCXBvcyA9IFBPU19SRVFfVVJJOwotCi0JCWlmICghbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIHBvcywgJm1hcCkpCi0JCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0KLQlpZiAoIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBQT1NfRlJPTSwgJm1hcCkgfHwKLQkgICAgIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBQT1NfVE8sICZtYXApIHx8Ci0JICAgICFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX1ZJQSwgJm1hcCkgfHwKLQkgICAgIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBQT1NfQ09OVEFDVCwgJm1hcCkpCi0JCXJldHVybiBORl9EUk9QOwotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFuZ2xlX3NpcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKipkcHRyLCBzaXplX3QgZGxlbiwKLQkJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmbGVuLAotCQkJCSAgICAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKQotewotCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmY7Ci0KLQlpZiAoY3Rfc2lwX2dldF9pbmZvKCpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA8PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICghaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCi0JCQkJICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBidWZmZXIsIGJ1ZmZsZW4pKQotCQlyZXR1cm4gMDsKLQotCS8qIFdlIG5lZWQgdG8gcmVsb2FkIHRoaXMuIFRoYW5rcyBQYXRyaWNrLiAqLwotCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbWFuZ2xlX2NvbnRlbnRfbGVuKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgICBjb25zdCBjaGFyICpkcHRyKQotewotCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBtYXRjaG9mZiwgbWF0Y2hsZW47Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCI2NTUzNiIpXTsKLQlpbnQgYnVmZmxlbjsKLQotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCi0JLyogR2V0IGFjdHVhbCBTRFAgbGVuZ2h0ICovCi0JaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCAmbWF0Y2hvZmYsCi0JCQkgICAgJm1hdGNobGVuLCBQT1NfU0RQX0hFQURFUikgPiAwKSB7Ci0KLQkJLyogc2luY2UgY3Rfc2lwX2dldF9pbmZvKCkgZ2l2ZSB1cyBhIHBvaW50ZXIgcGFzc2luZyAndj0nCi0JCSAgIHdlIG5lZWQgdG8gYWRkIDIgYnl0ZXMgaW4gdGhpcyBjb3VudC4gKi8KLQkJaW50IGNfbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiAtIG1hdGNob2ZmICsgMjsKLQotCQkvKiBOb3csIHVwZGF0ZSBTRFAgbGVuZ2h0ICovCi0JCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgJm1hdGNob2ZmLAotCQkJCSAgICAmbWF0Y2hsZW4sIFBPU19DT05URU5UKSA+IDApIHsKLQotCQkJYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUiLCBjX2xlbik7Ci0KLQkJCXJldHVybiBpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKLQkJCQkJCQltYXRjaG9mZiwgbWF0Y2hsZW4sCi0JCQkJCQkJYnVmZmVyLCBidWZmbGVuKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtYW5nbGVfc2RwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgICBfX2JlMzIgbmV3aXAsIHVfaW50MTZfdCBwb3J0LAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmRwdHIpCi17Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm4iKV07Ci0JdW5zaWduZWQgaW50IGRhdGFvZmYsIGJ1ZmZsZW47Ci0KLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQotCS8qIE1hbmdsZSBvd25lciBhbmQgY29udGFjdCBpbmZvLiAqLwotCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChuZXdpcCkpOwotCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCQkgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfT1dORVIpKQotCQlyZXR1cm4gMDsKLQotCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCQkgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfQ09OTkVDVElPTikpCi0JCXJldHVybiAwOwotCi0JLyogTWFuZ2xlIG1lZGlhIHBvcnQuICovCi0JYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUiLCBwb3J0KTsKLQlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsICZkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCQkJICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgUE9TX01FRElBKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gbWFuZ2xlX2NvbnRlbnRfbGVuKHBza2IsIGN0aW5mbywgY3QsIGRwdHIpOwotfQotCi0vKiBTbywgdGhpcyBwYWNrZXQgaGFzIGhpdCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaGluZyBjb2RlLgotICAgTWFuZ2xlIGl0LCBhbmQgY2hhbmdlIHRoZSBleHBlY3RhdGlvbiB0byBtYXRjaCB0aGUgbmV3IHZlcnNpb24uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9zZHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAsCi0JCQkgICAgICAgY29uc3QgY2hhciAqZHB0cikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGV4cC0+bWFzdGVyOwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JX19iZTMyIG5ld2lwOwotCXVfaW50MTZfdCBwb3J0OwotCi0JREVCVUdQKCJpcF9uYXRfc2RwKCk6XG4iKTsKLQotCS8qIENvbm5lY3Rpb24gd2lsbCBjb21lIGZyb20gcmVwbHkgKi8KLQluZXdpcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCi0JZXhwLT50dXBsZS5kc3QuaXAgPSBuZXdpcDsKLQlleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydDsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCi0JICAgdGhpcyBvbmUuICovCi0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKHBvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChwb3J0ID09IDApCi0JCXJldHVybiBORl9EUk9QOwotCi0JaWYgKCFtYW5nbGVfc2RwKHBza2IsIGN0aW5mbywgY3QsIG5ld2lwLCBwb3J0LCBkcHRyKSkgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NpcF9ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NkcF9ob29rLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NpcF9ob29rKSk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2RwX2hvb2spKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NpcF9ob29rLCBpcF9uYXRfc2lwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NkcF9ob29rLCBpcF9uYXRfc2RwKTsKLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc25tcF9iYXNpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWQwZWYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMzICswLDAgQEAKLS8qCi0gKiBpcF9uYXRfc25tcF9iYXNpYy5jCi0gKgotICogQmFzaWMgU05NUCBBcHBsaWNhdGlvbiBMYXllciBHYXRld2F5Ci0gKgotICogVGhpcyBJUCBOQVQgbW9kdWxlIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBTTk1QIG5ldHdvcmsKLSAqIGRpc2NvdmVyeSBhbmQgbW9uaXRvcmluZyBhcHBsaWNhdGlvbnMgd2hlcmUgdGFyZ2V0IG5ldHdvcmtzIHVzZQotICogY29uZmxpY3RpbmcgcHJpdmF0ZSBhZGRyZXNzIHJlYWxtcy4KLSAqCi0gKiBTdGF0aWMgTkFUIGlzIHVzZWQgdG8gcmVtYXAgdGhlIG5ldHdvcmtzIGZyb20gdGhlIHZpZXcgb2YgdGhlIG5ldHdvcmsKLSAqIG1hbmFnZW1lbnQgc3lzdGVtIGF0IHRoZSBJUCBsYXllciwgYW5kIHRoaXMgbW9kdWxlIHJlbWFwcyBzb21lIGFwcGxpY2F0aW9uCi0gKiBsYXllciBhZGRyZXNzZXMgdG8gbWF0Y2guCi0gKgotICogVGhlIHNpbXBsZXN0IGZvcm0gb2YgQUxHIGlzIHBlcmZvcm1lZCwgd2hlcmUgb25seSB0YWdnZWQgSVAgYWRkcmVzc2VzCi0gKiBhcmUgbW9kaWZpZWQuICBUaGUgbW9kdWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgTUlCIGF3YXJlIGFuZCBvbmx5IHNjYW5zCi0gKiBtZXNzYWdlcyBhdCB0aGUgQVNOLjEvQkVSIGxldmVsLgotICoKLSAqIEN1cnJlbnRseSwgb25seSBTTk1QdjEgYW5kIFNOTVB2MiBhcmUgc3VwcG9ydGVkLgotICoKLSAqIE1vcmUgaW5mb3JtYXRpb24gb24gQUxHIGFuZCBhc3NvY2lhdGVkIGlzc3VlcyBjYW4gYmUgZm91bmQgaW4KLSAqIFJGQyAyOTYyCi0gKgotICogVGhlIEFTQi4xL0JFUiBwYXJzaW5nIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBneHNubXAgcGFja2FnZSBieSBHcmVnb3J5Ci0gKiBNY0xlYW4gJiBKb2NoZW4gRnJpZWRyaWNoLCBzdHJpcHBlZCBkb3duIGZvciB1c2UgaW4gdGhlIGtlcm5lbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUlAgSW50ZXJuZXQgKHd3dy5ycGkubmV0LmF1KS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKgotICogQXV0aG9yOiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBVcGRhdGVzOgotICogMjAwMC0wOC0wNjogQ29udmVydCB0byBuZXcgaGVscGVyIEFQSSAoSGFyYWxkIFdlbHRlKS4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJhc2ljIFNOTVAgQXBwbGljYXRpb24gTGF5ZXIgR2F0ZXdheSIpOwotCi0jZGVmaW5lIFNOTVBfUE9SVCAxNjEKLSNkZWZpbmUgU05NUF9UUkFQX1BPUlQgMTYyCi0jZGVmaW5lIE5PQ1QxKG4pICgqKHU4ICopbikKLQotc3RhdGljIGludCBkZWJ1ZzsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc25tcF9sb2NrKTsKLQotLyoKLSAqIEFwcGxpY2F0aW9uIGxheWVyIGFkZHJlc3MgbWFwcGluZyBtaW1pY3MgdGhlIE5BVCBtYXBwaW5nLCBidXQKLSAqIG9ubHkgZm9yIHRoZSBmaXJzdCBvY3RldCBpbiB0aGlzIGNhc2UgKGEgbW9yZSBmbGV4aWJsZSBzeXN0ZW0KLSAqIGNhbiBiZSBpbXBsZW1lbnRlZCBpZiBuZWVkZWQpLgotICovCi1zdHJ1Y3Qgb2N0MV9tYXAKLXsKLQl1X2ludDhfdCBmcm9tOwotCXVfaW50OF90IHRvOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBCYXNpYyBBU04uMSBkZWNvZGluZyByb3V0aW5lcyAoZ3hzbm1wIGF1dGhvciBEaXJrIFdpc3NlKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ2xhc3MgKi8KLSNkZWZpbmUgQVNOMV9VTkkJMAkvKiBVbml2ZXJzYWwgKi8KLSNkZWZpbmUgQVNOMV9BUEwJMQkvKiBBcHBsaWNhdGlvbiAqLwotI2RlZmluZSBBU04xX0NUWAkyCS8qIENvbnRleHQgKi8KLSNkZWZpbmUgQVNOMV9QUlYJMwkvKiBQcml2YXRlICovCi0KLS8qIFRhZyAqLwotI2RlZmluZSBBU04xX0VPQwkwCS8qIEVuZCBPZiBDb250ZW50cyAqLwotI2RlZmluZSBBU04xX0JPTAkxCS8qIEJvb2xlYW4gKi8KLSNkZWZpbmUgQVNOMV9JTlQJMgkvKiBJbnRlZ2VyICovCi0jZGVmaW5lIEFTTjFfQlRTCTMJLyogQml0IFN0cmluZyAqLwotI2RlZmluZSBBU04xX09UUwk0CS8qIE9jdGV0IFN0cmluZyAqLwotI2RlZmluZSBBU04xX05VTAk1CS8qIE51bGwgKi8KLSNkZWZpbmUgQVNOMV9PSkkJNgkvKiBPYmplY3QgSWRlbnRpZmllciAgKi8KLSNkZWZpbmUgQVNOMV9PSkQJNwkvKiBPYmplY3QgRGVzY3JpcHRpb24gKi8KLSNkZWZpbmUgQVNOMV9FWFQJOAkvKiBFeHRlcm5hbCAqLwotI2RlZmluZSBBU04xX1NFUQkxNgkvKiBTZXF1ZW5jZSAqLwotI2RlZmluZSBBU04xX1NFVAkxNwkvKiBTZXQgKi8KLSNkZWZpbmUgQVNOMV9OVU1TVFIJMTgJLyogTnVtZXJpY2FsIFN0cmluZyAqLwotI2RlZmluZSBBU04xX1BSTlNUUgkxOQkvKiBQcmludGFibGUgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfVEVYU1RSCTIwCS8qIFRlbGV0ZXh0IFN0cmluZyAqLwotI2RlZmluZSBBU04xX1ZJRFNUUgkyMQkvKiBWaWRlbyBTdHJpbmcgKi8KLSNkZWZpbmUgQVNOMV9JQTVTVFIJMjIJLyogSUE1IFN0cmluZyAqLwotI2RlZmluZSBBU04xX1VOSVRJTQkyMwkvKiBVbml2ZXJzYWwgVGltZSAqLwotI2RlZmluZSBBU04xX0dFTlRJTQkyNAkvKiBHZW5lcmFsIFRpbWUgKi8KLSNkZWZpbmUgQVNOMV9HUkFTVFIJMjUJLyogR3JhcGhpY2FsIFN0cmluZyAqLwotI2RlZmluZSBBU04xX1ZJU1NUUgkyNgkvKiBWaXNpYmxlIFN0cmluZyAqLwotI2RlZmluZSBBU04xX0dFTlNUUgkyNwkvKiBHZW5lcmFsIFN0cmluZyAqLwotCi0vKiBQcmltaXRpdmUgLyBDb25zdHJ1Y3RlZCBtZXRob2RzKi8KLSNkZWZpbmUgQVNOMV9QUkkJMAkvKiBQcmltaXRpdmUgKi8KLSNkZWZpbmUgQVNOMV9DT04JMQkvKiBDb25zdHJ1Y3RlZCAqLwotCi0vKgotICogRXJyb3IgY29kZXMuCi0gKi8KLSNkZWZpbmUgQVNOMV9FUlJfTk9FUlJPUgkJMAotI2RlZmluZSBBU04xX0VSUl9ERUNfRU1QVFkJCTIKLSNkZWZpbmUgQVNOMV9FUlJfREVDX0VPQ19NSVNNQVRDSAkzCi0jZGVmaW5lIEFTTjFfRVJSX0RFQ19MRU5HVEhfTUlTTUFUQ0gJNAotI2RlZmluZSBBU04xX0VSUl9ERUNfQkFEVkFMVUUJCTUKLQotLyoKLSAqIEFTTi4xIGNvbnRleHQuCi0gKi8KLXN0cnVjdCBhc24xX2N0eAotewotCWludCBlcnJvcjsJCQkvKiBFcnJvciBjb25kaXRpb24gKi8KLQl1bnNpZ25lZCBjaGFyICpwb2ludGVyOwkJLyogT2N0ZXQganVzdCB0byBiZSBkZWNvZGVkICovCi0JdW5zaWduZWQgY2hhciAqYmVnaW47CQkvKiBGaXJzdCBvY3RldCAqLwotCXVuc2lnbmVkIGNoYXIgKmVuZDsJCS8qIE9jdGV0IGFmdGVyIGxhc3Qgb2N0ZXQgKi8KLX07Ci0KLS8qCi0gKiBPY3RldCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpCi0gKi8KLXN0cnVjdCBhc24xX29jdHN0cgotewotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGxlbjsKLX07Ci0KLXN0YXRpYyB2b2lkIGFzbjFfb3BlbihzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmLAotCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotCWN0eC0+YmVnaW4gPSBidWY7Ci0JY3R4LT5lbmQgPSBidWYgKyBsZW47Ci0JY3R4LT5wb2ludGVyID0gYnVmOwotCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9OT0VSUk9SOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29jdGV0X2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqY2gpCi17Ci0JaWYgKGN0eC0+cG9pbnRlciA+PSBjdHgtPmVuZCkgewotCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0VNUFRZOwotCQlyZXR1cm4gMDsKLQl9Ci0JKmNoID0gKihjdHgtPnBvaW50ZXIpKys7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdGFnX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgaW50ICp0YWcpCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQotCSp0YWcgPSAwOwotCi0JZG8KLQl7Ci0JCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQkJcmV0dXJuIDA7Ci0JCSp0YWcgPDw9IDc7Ci0JCSp0YWcgfD0gY2ggJiAweDdGOwotCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2lkX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpjbHMsCi0JCQkJICAgIHVuc2lnbmVkIGludCAqY29uLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRhZykKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCi0JaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCXJldHVybiAwOwotCi0JKmNscyA9IChjaCAmIDB4QzApID4+IDY7Ci0JKmNvbiA9IChjaCAmIDB4MjApID4+IDU7Ci0JKnRhZyA9IChjaCAmIDB4MUYpOwotCi0JaWYgKCp0YWcgPT0gMHgxRikgewotCQlpZiAoIWFzbjFfdGFnX2RlY29kZShjdHgsIHRhZykpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbGVuZ3RoX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkJdW5zaWduZWQgaW50ICpkZWYsCi0JCQkJCXVuc2lnbmVkIGludCAqbGVuKQotewotCXVuc2lnbmVkIGNoYXIgY2gsIGNudDsKLQotCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQlyZXR1cm4gMDsKLQotCWlmIChjaCA9PSAweDgwKQotCQkqZGVmID0gMDsKLQllbHNlIHsKLQkJKmRlZiA9IDE7Ci0KLQkJaWYgKGNoIDwgMHg4MCkKLQkJCSpsZW4gPSBjaDsKLQkJZWxzZSB7Ci0JCQljbnQgPSAodW5zaWduZWQgY2hhcikgKGNoICYgMHg3Rik7Ci0JCQkqbGVuID0gMDsKLQotCQkJd2hpbGUgKGNudCA+IDApIHsKLQkJCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJKmxlbiA8PD0gODsKLQkJCQkqbGVuIHw9IGNoOwotCQkJCWNudC0tOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2hlYWRlcl9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKiplb2MsCi0JCQkJCXVuc2lnbmVkIGludCAqY2xzLAotCQkJCQl1bnNpZ25lZCBpbnQgKmNvbiwKLQkJCQkJdW5zaWduZWQgaW50ICp0YWcpCi17Ci0JdW5zaWduZWQgaW50IGRlZiwgbGVuOwotCi0JaWYgKCFhc24xX2lkX2RlY29kZShjdHgsIGNscywgY29uLCB0YWcpKQotCQlyZXR1cm4gMDsKLQotCWRlZiA9IGxlbiA9IDA7Ci0JaWYgKCFhc24xX2xlbmd0aF9kZWNvZGUoY3R4LCAmZGVmLCAmbGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGVmKQotCQkqZW9jID0gY3R4LT5wb2ludGVyICsgbGVuOwotCWVsc2UKLQkJKmVvYyA9IE5VTEw7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfZW9jX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqZW9jKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0KLQlpZiAoZW9jID09IDApIHsKLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoY2ggIT0gMHgwMCkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGNoICE9IDB4MDApIHsKLQkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENIOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKGN0eC0+cG9pbnRlciAhPSBlb2MpIHsKLQkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfTEVOR1RIX01JU01BVENIOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX251bGxfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCi17Ci0JY3R4LT5wb2ludGVyID0gZW9jOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2xvbmdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKLQkJCQkgICAgICBsb25nICppbnRlZ2VyKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JdW5zaWduZWQgaW50ICBsZW47Ci0KLQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJcmV0dXJuIDA7Ci0KLQkqaW50ZWdlciA9IChzaWduZWQgY2hhcikgY2g7Ci0JbGVuID0gMTsKLQotCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKLQkJaWYgKCsrbGVuID4gc2l6ZW9mIChsb25nKSkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQkqaW50ZWdlciA8PD0gODsKLQkJKmludGVnZXIgfD0gY2g7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX3VpbnRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmludGVnZXIpCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQl1bnNpZ25lZCBpbnQgIGxlbjsKLQotCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQlyZXR1cm4gMDsKLQotCSppbnRlZ2VyID0gY2g7Ci0JaWYgKGNoID09IDApIGxlbiA9IDA7Ci0JZWxzZSBsZW4gPSAxOwotCi0Jd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgewotCQlpZiAoKytsZW4gPiBzaXplb2YgKHVuc2lnbmVkIGludCkpIHsKLQkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfQkFEVkFMVUU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQkJcmV0dXJuIDA7Ci0KLQkJKmludGVnZXIgPDw9IDg7Ci0JCSppbnRlZ2VyIHw9IGNoOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV91bG9uZ19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqaW50ZWdlcikKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCXVuc2lnbmVkIGludCAgbGVuOwotCi0JaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCXJldHVybiAwOwotCi0JKmludGVnZXIgPSBjaDsKLQlpZiAoY2ggPT0gMCkgbGVuID0gMDsKLQllbHNlIGxlbiA9IDE7Ci0KLQl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7Ci0JCWlmICgrK2xlbiA+IHNpemVvZiAodW5zaWduZWQgbG9uZykpIHsKLQkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfQkFEVkFMVUU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQkJcmV0dXJuIDA7Ci0KLQkJKmludGVnZXIgPDw9IDg7Ci0JCSppbnRlZ2VyIHw9IGNoOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9vY3RldHNfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCQl1bnNpZ25lZCBjaGFyICplb2MsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKipvY3RldHMsCi0JCQkJCXVuc2lnbmVkIGludCAqbGVuKQotewotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQotCSpsZW4gPSAwOwotCi0JKm9jdGV0cyA9IGttYWxsb2MoZW9jIC0gY3R4LT5wb2ludGVyLCBHRlBfQVRPTUlDKTsKLQlpZiAoKm9jdGV0cyA9PSBOVUxMKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXB0ciA9ICpvY3RldHM7Ci0Jd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgewotCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgKHVuc2lnbmVkIGNoYXIgKilwdHIrKykpIHsKLQkJCWtmcmVlKCpvY3RldHMpOwotCQkJKm9jdGV0cyA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkoKmxlbikrKzsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfc3ViaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzdWJpZCkKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCi0JKnN1YmlkID0gMDsKLQotCWRvIHsKLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQkqc3ViaWQgPDw9IDc7Ci0JCSpzdWJpZCB8PSBjaCAmIDB4N0Y7Ci0JfSB3aGlsZSAoKGNoICYgMHg4MCkgPT0gMHg4MCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfb2lkX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKipvaWQsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKmxlbikKLXsKLQl1bnNpZ25lZCBsb25nIHN1YmlkOwotCXVuc2lnbmVkIGludCAgc2l6ZTsKLQl1bnNpZ25lZCBsb25nICpvcHRyOwotCi0Jc2l6ZSA9IGVvYyAtIGN0eC0+cG9pbnRlciArIDE7Ci0JKm9pZCA9IGttYWxsb2Moc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCpvaWQgPT0gTlVMTCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlvcHRyID0gKm9pZDsKLQotCWlmICghYXNuMV9zdWJpZF9kZWNvZGUoY3R4LCAmc3ViaWQpKSB7Ci0JCWtmcmVlKCpvaWQpOwotCQkqb2lkID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN1YmlkIDwgNDApIHsKLQkJb3B0ciBbMF0gPSAwOwotCQlvcHRyIFsxXSA9IHN1YmlkOwotCX0gZWxzZSBpZiAoc3ViaWQgPCA4MCkgewotCQlvcHRyIFswXSA9IDE7Ci0JCW9wdHIgWzFdID0gc3ViaWQgLSA0MDsKLQl9IGVsc2UgewotCQlvcHRyIFswXSA9IDI7Ci0JCW9wdHIgWzFdID0gc3ViaWQgLSA4MDsKLQl9Ci0KLQkqbGVuID0gMjsKLQlvcHRyICs9IDI7Ci0KLQl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7Ci0JCWlmICgrKygqbGVuKSA+IHNpemUpIHsKLQkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfQkFEVkFMVUU7Ci0JCQlrZnJlZSgqb2lkKTsKLQkJCSpvaWQgPSBOVUxMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgb3B0cisrKSkgewotCQkJa2ZyZWUoKm9pZCk7Ci0JCQkqb2lkID0gTlVMTDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTTk1QIGRlY29kaW5nIHJvdXRpbmVzIChneHNubXAgYXV0aG9yIERpcmsgV2lzc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTTk1QIFZlcnNpb25zICovCi0jZGVmaW5lIFNOTVBfVjEJCQkJMAotI2RlZmluZSBTTk1QX1YyQwkJCTEKLSNkZWZpbmUgU05NUF9WMgkJCQkyCi0jZGVmaW5lIFNOTVBfVjMJCQkJMwotCi0vKiBEZWZhdWx0IFNpemVzICovCi0jZGVmaW5lIFNOTVBfU0laRV9DT01NCQkJMjU2Ci0jZGVmaW5lIFNOTVBfU0laRV9PQkpFQ1RJRAkJMTI4Ci0jZGVmaW5lIFNOTVBfU0laRV9CVUZDSFIJCTI1NgotI2RlZmluZSBTTk1QX1NJWkVfQlVGSU5UCQkxMjgKLSNkZWZpbmUgU05NUF9TSVpFX1NNQUxMT0JKRUNUSUQJCTE2Ci0KLS8qIFJlcXVlc3RzICovCi0jZGVmaW5lIFNOTVBfUERVX0dFVAkJCTAKLSNkZWZpbmUgU05NUF9QRFVfTkVYVAkJCTEKLSNkZWZpbmUgU05NUF9QRFVfUkVTUE9OU0UJCTIKLSNkZWZpbmUgU05NUF9QRFVfU0VUCQkJMwotI2RlZmluZSBTTk1QX1BEVV9UUkFQMQkJCTQKLSNkZWZpbmUgU05NUF9QRFVfQlVMSwkJCTUKLSNkZWZpbmUgU05NUF9QRFVfSU5GT1JNCQkJNgotI2RlZmluZSBTTk1QX1BEVV9UUkFQMgkJCTcKLQotLyogRXJyb3JzICovCi0jZGVmaW5lIFNOTVBfTk9FUlJPUgkJCTAKLSNkZWZpbmUgU05NUF9UT09CSUcJCQkxCi0jZGVmaW5lIFNOTVBfTk9TVUNITkFNRQkJCTIKLSNkZWZpbmUgU05NUF9CQURWQUxVRQkJCTMKLSNkZWZpbmUgU05NUF9SRUFET05MWQkJCTQKLSNkZWZpbmUgU05NUF9HRU5FUlJPUgkJCTUKLSNkZWZpbmUgU05NUF9OT0FDQ0VTUwkJCTYKLSNkZWZpbmUgU05NUF9XUk9OR1RZUEUJCQk3Ci0jZGVmaW5lIFNOTVBfV1JPTkdMRU5HVEgJCTgKLSNkZWZpbmUgU05NUF9XUk9OR0VOQ09ESU5HCQk5Ci0jZGVmaW5lIFNOTVBfV1JPTkdWQUxVRQkJCTEwCi0jZGVmaW5lIFNOTVBfTk9DUkVBVElPTgkJCTExCi0jZGVmaW5lIFNOTVBfSU5DT05TSVNURU5UVkFMVUUJCTEyCi0jZGVmaW5lIFNOTVBfUkVTT1VSQ0VVTkFWQUlMQUJMRQkxMwotI2RlZmluZSBTTk1QX0NPTU1JVEZBSUxFRAkJMTQKLSNkZWZpbmUgU05NUF9VTkRPRkFJTEVECQkJMTUKLSNkZWZpbmUgU05NUF9BVVRIT1JJWkFUSU9ORVJST1IJCTE2Ci0jZGVmaW5lIFNOTVBfTk9UV1JJVEFCTEUJCTE3Ci0jZGVmaW5lIFNOTVBfSU5DT05TSVNURU5UTkFNRQkJMTgKLQotLyogR2VuZXJhbCBTTk1QIFYxIFRyYXBzICovCi0jZGVmaW5lIFNOTVBfVFJBUF9DT0xEU1RBUlQJCTAKLSNkZWZpbmUgU05NUF9UUkFQX1dBUk1TVEFSVAkJMQotI2RlZmluZSBTTk1QX1RSQVBfTElOS0RPV04JCTIKLSNkZWZpbmUgU05NUF9UUkFQX0xJTktVUAkJMwotI2RlZmluZSBTTk1QX1RSQVBfQVVURkFJTFVSRQkJNAotI2RlZmluZSBTTk1QX1RSQVBfRVFQTkVJR0hCT1JMT1NTCTUKLSNkZWZpbmUgU05NUF9UUkFQX0VOVFNQRUNJRklDCQk2Ci0KLS8qIFNOTVB2MSBUeXBlcyAqLwotI2RlZmluZSBTTk1QX05VTEwgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTTk1QX0lOVEVHRVIgICAgICAgICAgICAgMSAgICAvKiBsICAqLwotI2RlZmluZSBTTk1QX09DVEVUU1RSICAgICAgICAgICAgMiAgICAvKiBjICAqLwotI2RlZmluZSBTTk1QX0RJU1BMQVlTVFIgICAgICAgICAgMiAgICAvKiBjICAqLwotI2RlZmluZSBTTk1QX09CSkVDVElEICAgICAgICAgICAgMyAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX0lQQUREUiAgICAgICAgICAgICAgNCAgICAvKiB1YyAqLwotI2RlZmluZSBTTk1QX0NPVU5URVIgICAgICAgICAgICAgNSAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX0dBVUdFICAgICAgICAgICAgICAgNiAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX1RJTUVUSUNLUyAgICAgICAgICAgNyAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX09QQVFVRSAgICAgICAgICAgICAgOCAgICAvKiBjICAqLwotCi0vKiBBZGRpdGlvbmFsIFNOTVB2MiBUeXBlcyAqLwotI2RlZmluZSBTTk1QX1VJTlRFR0VSICAgICAgICAgICAgNSAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX0JJVFNUUiAgICAgICAgICAgICAgOSAgICAvKiB1YyAqLwotI2RlZmluZSBTTk1QX05TQVAgICAgICAgICAgICAgICAxMCAgICAvKiB1YyAqLwotI2RlZmluZSBTTk1QX0NPVU5URVI2NCAgICAgICAgICAxMSAgICAvKiB1bCAqLwotI2RlZmluZSBTTk1QX05PU1VDSE9CSkVDVCAgICAgICAxMgotI2RlZmluZSBTTk1QX05PU1VDSElOU1RBTkNFICAgICAxMwotI2RlZmluZSBTTk1QX0VORE9GTUlCVklFVyAgICAgICAxNAotCi11bmlvbiBzbm1wX3N5bnRheAotewotCXVuc2lnbmVkIGNoYXIgdWNbMF07CS8qIDggYml0IHVuc2lnbmVkICovCi0JY2hhciBjWzBdOwkJLyogOCBiaXQgc2lnbmVkICovCi0JdW5zaWduZWQgbG9uZyB1bFswXTsJLyogMzIgYml0IHVuc2lnbmVkICovCi0JbG9uZyBsWzBdOwkJLyogMzIgYml0IHNpZ25lZCAqLwotfTsKLQotc3RydWN0IHNubXBfb2JqZWN0Ci17Ci0JdW5zaWduZWQgbG9uZyAqaWQ7Ci0JdW5zaWduZWQgaW50IGlkX2xlbjsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlOwotCXVuc2lnbmVkIGludCBzeW50YXhfbGVuOwotCXVuaW9uIHNubXBfc3ludGF4IHN5bnRheDsKLX07Ci0KLXN0cnVjdCBzbm1wX3JlcXVlc3QKLXsKLQl1bnNpZ25lZCBsb25nIGlkOwotCXVuc2lnbmVkIGludCBlcnJvcl9zdGF0dXM7Ci0JdW5zaWduZWQgaW50IGVycm9yX2luZGV4OwotfTsKLQotc3RydWN0IHNubXBfdjFfdHJhcAotewotCXVuc2lnbmVkIGxvbmcgKmlkOwotCXVuc2lnbmVkIGludCBpZF9sZW47Ci0JdW5zaWduZWQgbG9uZyBpcF9hZGRyZXNzOwkvKiBwb2ludGVyICAqLwotCXVuc2lnbmVkIGludCBnZW5lcmFsOwotCXVuc2lnbmVkIGludCBzcGVjaWZpYzsKLQl1bnNpZ25lZCBsb25nIHRpbWU7Ci19OwotCi0vKiBTTk1QIHR5cGVzICovCi0jZGVmaW5lIFNOTVBfSVBBICAgIDAKLSNkZWZpbmUgU05NUF9DTlQgICAgMQotI2RlZmluZSBTTk1QX0dHRSAgICAyCi0jZGVmaW5lIFNOTVBfVElUICAgIDMKLSNkZWZpbmUgU05NUF9PUFEgICAgNAotI2RlZmluZSBTTk1QX0M2NCAgICA2Ci0KLS8qIFNOTVAgZXJyb3JzICovCi0jZGVmaW5lIFNFUlJfTlNPICAgIDAKLSNkZWZpbmUgU0VSUl9OU0kgICAgMQotI2RlZmluZSBTRVJSX0VPTSAgICAyCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYW5nbGVfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpiZWdpbiwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKmFkZHIsCi0JCQkJICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKLQkJCQkgIF9fc3VtMTYgKmNoZWNrKTsKLXN0cnVjdCBzbm1wX2NudgotewotCXVuc2lnbmVkIGludCBjbGFzczsKLQl1bnNpZ25lZCBpbnQgdGFnOwotCWludCBzeW50YXg7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNubXBfY252IHNubXBfY29udiBbXSA9Ci17Ci0Je0FTTjFfVU5JLCBBU04xX05VTCwgU05NUF9OVUxMfSwKLQl7QVNOMV9VTkksIEFTTjFfSU5ULCBTTk1QX0lOVEVHRVJ9LAotCXtBU04xX1VOSSwgQVNOMV9PVFMsIFNOTVBfT0NURVRTVFJ9LAotCXtBU04xX1VOSSwgQVNOMV9PVFMsIFNOTVBfRElTUExBWVNUUn0sCi0Je0FTTjFfVU5JLCBBU04xX09KSSwgU05NUF9PQkpFQ1RJRH0sCi0Je0FTTjFfQVBMLCBTTk1QX0lQQSwgU05NUF9JUEFERFJ9LAotCXtBU04xX0FQTCwgU05NUF9DTlQsIFNOTVBfQ09VTlRFUn0sCS8qIENvdW50ZXIzMiAqLwotCXtBU04xX0FQTCwgU05NUF9HR0UsIFNOTVBfR0FVR0V9LAkvKiBHYXVnZTMyID09IFVuc2lnbmVkMzIgICovCi0Je0FTTjFfQVBMLCBTTk1QX1RJVCwgU05NUF9USU1FVElDS1N9LAotCXtBU04xX0FQTCwgU05NUF9PUFEsIFNOTVBfT1BBUVVFfSwKLQotCS8qIFNOTVB2MiBkYXRhIHR5cGVzIGFuZCBlcnJvcnMgKi8KLQl7QVNOMV9VTkksIEFTTjFfQlRTLCBTTk1QX0JJVFNUUn0sCi0Je0FTTjFfQVBMLCBTTk1QX0M2NCwgU05NUF9DT1VOVEVSNjR9LAotCXtBU04xX0NUWCwgU0VSUl9OU08sIFNOTVBfTk9TVUNIT0JKRUNUfSwKLQl7QVNOMV9DVFgsIFNFUlJfTlNJLCBTTk1QX05PU1VDSElOU1RBTkNFfSwKLQl7QVNOMV9DVFgsIFNFUlJfRU9NLCBTTk1QX0VORE9GTUlCVklFV30sCi0JezAsICAgICAgIDAsICAgICAgIC0xfQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc25tcF90YWdfY2xzMnN5bnRheCh1bnNpZ25lZCBpbnQgdGFnLAotCQkJCQkgdW5zaWduZWQgaW50IGNscywKLQkJCQkJIHVuc2lnbmVkIHNob3J0ICpzeW50YXgpCi17Ci0Jc3RydWN0IHNubXBfY252ICpjbnY7Ci0KLQljbnYgPSBzbm1wX2NvbnY7Ci0KLQl3aGlsZSAoY252LT5zeW50YXggIT0gLTEpIHsKLQkJaWYgKGNudi0+dGFnID09IHRhZyAmJiBjbnYtPmNsYXNzID09IGNscykgewotCQkJKnN5bnRheCA9IGNudi0+c3ludGF4OwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY252Kys7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX29iamVjdF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJCXN0cnVjdCBzbm1wX29iamVjdCAqKm9iaikKLXsKLQl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgbGVuLCBpZGxlbjsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlOwotCXVuc2lnbmVkIGNoYXIgKmVvYywgKmVuZCwgKnA7Ci0JdW5zaWduZWQgbG9uZyAqbHAsICppZDsKLQl1bnNpZ25lZCBsb25nIHVsOwotCWxvbmcgbDsKLQotCSpvYmogPSBOVUxMOwotCWlkID0gTlVMTDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9DT04gfHwgdGFnICE9IEFTTjFfU0VRKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT0pJKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAmaWQsICZpZGxlbikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkgewotCQlrZnJlZShpZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjb24gIT0gQVNOMV9QUkkpIHsKLQkJa2ZyZWUoaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0eXBlID0gMDsKLQlpZiAoIXNubXBfdGFnX2NsczJzeW50YXgodGFnLCBjbHMsICZ0eXBlKSkgewotCQlrZnJlZShpZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWwgPSAwOwotCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFNOTVBfSU5URUdFUjoKLQkJCWxlbiA9IHNpemVvZihsb25nKTsKLQkJCWlmICghYXNuMV9sb25nX2RlY29kZShjdHgsIGVuZCwgJmwpKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sCi0JCQkJICAgICAgIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkoKm9iaiktPnN5bnRheC5sWzBdID0gbDsKLQkJCWJyZWFrOwotCQljYXNlIFNOTVBfT0NURVRTVFI6Ci0JCWNhc2UgU05NUF9PUEFRVUU6Ci0JCQlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZShjdHgsIGVuZCwgJnAsICZsZW4pKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sCi0JCQkJICAgICAgIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQltZW1jcHkoKCpvYmopLT5zeW50YXguYywgcCwgbGVuKTsKLQkJCWtmcmVlKHApOwotCQkJYnJlYWs7Ci0JCWNhc2UgU05NUF9OVUxMOgotCQljYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgotCQljYXNlIFNOTVBfTk9TVUNISU5TVEFOQ0U6Ci0JCWNhc2UgU05NUF9FTkRPRk1JQlZJRVc6Ci0JCQlsZW4gPSAwOwotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCksIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoIWFzbjFfbnVsbF9kZWNvZGUoY3R4LCBlbmQpKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWtmcmVlKCpvYmopOwotCQkJCSpvYmogPSBOVUxMOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU05NUF9PQkpFQ1RJRDoKLQkJCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAodW5zaWduZWQgbG9uZyAqKikmbHAsICZsZW4pKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbGVuICo9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmICgqb2JqID09IE5VTEwpIHsKLQkJCQlrZnJlZShscCk7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1lbWNweSgoKm9iaiktPnN5bnRheC51bCwgbHAsIGxlbik7Ci0JCQlrZnJlZShscCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX0lQQUREUjoKLQkJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAobGVuICE9IDQpIHsKLQkJCQlrZnJlZShwKTsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUocCk7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1lbWNweSgoKm9iaiktPnN5bnRheC51YywgcCwgbGVuKTsKLQkJCWtmcmVlKHApOwotCQkJYnJlYWs7Ci0JCWNhc2UgU05NUF9DT1VOVEVSOgotCQljYXNlIFNOTVBfR0FVR0U6Ci0JCWNhc2UgU05NUF9USU1FVElDS1M6Ci0JCQlsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JCQlpZiAoIWFzbjFfdWxvbmdfZGVjb2RlKGN0eCwgZW5kLCAmdWwpKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkoKm9iaiktPnN5bnRheC51bFswXSA9IHVsOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlrZnJlZShpZCk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkoKm9iaiktPnN5bnRheF9sZW4gPSBsZW47Ci0JKCpvYmopLT50eXBlID0gdHlwZTsKLQkoKm9iaiktPmlkID0gaWQ7Ci0JKCpvYmopLT5pZF9sZW4gPSBpZGxlbjsKLQotCWlmICghYXNuMV9lb2NfZGVjb2RlKGN0eCwgZW9jKSkgewotCQlrZnJlZShpZCk7Ci0JCWtmcmVlKCpvYmopOwotCQkqb2JqID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3JlcXVlc3RfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCQkgc3RydWN0IHNubXBfcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZzsKLQl1bnNpZ25lZCBjaGFyICplbmQ7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfdWxvbmdfZGVjb2RlKGN0eCwgZW5kLCAmcmVxdWVzdC0+aWQpKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV91aW50X2RlY29kZShjdHgsIGVuZCwgJnJlcXVlc3QtPmVycm9yX3N0YXR1cykpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmcmVxdWVzdC0+ZXJyb3JfaW5kZXgpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi0vKgotICogRmFzdCBjaGVja3N1bSB1cGRhdGUgZm9yIHBvc3NpYmx5IG9kZGx5LWFsaWduZWQgVURQIGJ5dGUsIGZyb20gdGhlCi0gKiBjb2RlIGV4YW1wbGUgaW4gdGhlIGRyYWZ0LgotICovCi1zdGF0aWMgdm9pZCBmYXN0X2NzdW0oX19zdW0xNiAqY3N1bSwKLQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3B0ciwKLQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnB0ciwKLQkJICAgICAgaW50IG9mZnNldCkKLXsKLQl1bnNpZ25lZCBjaGFyIHNbNF07Ci0KLQlpZiAob2Zmc2V0ICYgMSkgewotCQlzWzBdID0gc1syXSA9IDA7Ci0JCXNbMV0gPSB+Km9wdHI7Ci0JCXNbM10gPSAqbnB0cjsKLQl9IGVsc2UgewotCQlzWzFdID0gc1szXSA9IDA7Ci0JCXNbMF0gPSB+Km9wdHI7Ci0JCXNbMl0gPSAqbnB0cjsKLQl9Ci0KLQkqY3N1bSA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwocywgNCwgfmNzdW1fdW5mb2xkKCpjc3VtKSkpOwotfQotCi0vKgotICogTWFuZ2xlIElQIGFkZHJlc3MuCi0gKiAJLSBiZWdpbiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzbm1wIG1lc3NnYWUKLSAqICAgICAgLSBhZGRyIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIGFkZHJlc3MKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZV9hZGRyZXNzKHVuc2lnbmVkIGNoYXIgKmJlZ2luLAotCQkJCSAgdW5zaWduZWQgY2hhciAqYWRkciwKLQkJCQkgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotCQkJCSAgX19zdW0xNiAqY2hlY2spCi17Ci0JaWYgKG1hcC0+ZnJvbSA9PSBOT0NUMShhZGRyKSkgewotCQl1X2ludDMyX3Qgb2xkOwotCi0JCWlmIChkZWJ1ZykKLQkJCW1lbWNweSgmb2xkLCAodW5zaWduZWQgY2hhciAqKWFkZHIsIHNpemVvZihvbGQpKTsKLQotCQkqYWRkciA9IG1hcC0+dG87Ci0KLQkJLyogVXBkYXRlIFVEUCBjaGVja3N1bSBpZiBiZWluZyB1c2VkICovCi0JCWlmICgqY2hlY2spIHsKLQkJCWZhc3RfY3N1bShjaGVjaywKLQkJCQkgICZtYXAtPmZyb20sICZtYXAtPnRvLCBhZGRyIC0gYmVnaW4pOwotCQl9Ci0KLQkJaWYgKGRlYnVnKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBtYXBwZWQgJXUuJXUuJXUuJXUgdG8gIgotCQkJICAgICAgICIldS4ldS4ldS4ldVxuIiwgTklQUVVBRChvbGQpLCBOSVBRVUFEKCphZGRyKSk7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3RyYXBfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICAgIHN0cnVjdCBzbm1wX3YxX3RyYXAgKnRyYXAsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG9jdDFfbWFwICptYXAsCi0JCQkJICAgICAgX19zdW0xNiAqY2hlY2spCi17Ci0JdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIGxlbjsKLQl1bnNpZ25lZCBjaGFyICplbmQ7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX09KSSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfb2lkX2RlY29kZShjdHgsIGVuZCwgJnRyYXAtPmlkLCAmdHJhcC0+aWRfbGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlnb3RvIGVycl9pZF9mcmVlOwotCi0JaWYgKCEoKGNscyA9PSBBU04xX0FQTCAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IFNOTVBfSVBBKSB8fAotCSAgICAgIChjbHMgPT0gQVNOMV9VTkkgJiYgY29uID09IEFTTjFfUFJJICYmIHRhZyA9PSBBU04xX09UUykpKQotCQlnb3RvIGVycl9pZF9mcmVlOwotCi0JaWYgKCFhc24xX29jdGV0c19kZWNvZGUoY3R4LCBlbmQsICh1bnNpZ25lZCBjaGFyICoqKSZ0cmFwLT5pcF9hZGRyZXNzLCAmbGVuKSkKLQkJZ290byBlcnJfaWRfZnJlZTsKLQotCS8qIElQdjQgb25seSAqLwotCWlmIChsZW4gIT0gNCkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JbWFuZ2xlX2FkZHJlc3MoY3R4LT5iZWdpbiwgY3R4LT5wb2ludGVyIC0gNCwgbWFwLCBjaGVjayk7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmICghYXNuMV91aW50X2RlY29kZShjdHgsIGVuZCwgJnRyYXAtPmdlbmVyYWwpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmICghYXNuMV91aW50X2RlY29kZShjdHgsIGVuZCwgJnRyYXAtPnNwZWNpZmljKSkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JaWYgKCEoKGNscyA9PSBBU04xX0FQTCAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IFNOTVBfVElUKSB8fAotCSAgICAgIChjbHMgPT0gQVNOMV9VTkkgJiYgY29uID09IEFTTjFfUFJJICYmIHRhZyA9PSBBU04xX0lOVCkpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoIWFzbjFfdWxvbmdfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+dGltZSkpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCXJldHVybiAxOwotCi1lcnJfYWRkcl9mcmVlOgotCWtmcmVlKCh1bnNpZ25lZCBsb25nICopdHJhcC0+aXBfYWRkcmVzcyk7Ci0KLWVycl9pZF9mcmVlOgotCWtmcmVlKHRyYXAtPmlkKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNaXNjLiByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaGV4X2R1bXAodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCXNpemVfdCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChpICYmICEoaSAlIDE2KSkKLQkJCXByaW50aygiXG4iKTsKLQkJcHJpbnRrKCIlMDJ4ICIsICooYnVmICsgaSkpOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0KLS8qCi0gKiBQYXJzZSBhbmQgbWFuZ2xlIFNOTVAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gbWFwcGluZy4KLSAqIChBbmQgdGhpcyBpcyB0aGUgZnVja2luZyAnYmFzaWMnIG1ldGhvZCkuCi0gKi8KLXN0YXRpYyBpbnQgc25tcF9wYXJzZV9tYW5nbGUodW5zaWduZWQgY2hhciAqbXNnLAotCQkJICAgICB1X2ludDE2X3QgbGVuLAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKLQkJCSAgICAgX19zdW0xNiAqY2hlY2spCi17Ci0JdW5zaWduZWQgY2hhciAqZW9jLCAqZW5kOwotCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnLCB2ZXJzLCBwZHV0eXBlOwotCXN0cnVjdCBhc24xX2N0eCBjdHg7Ci0Jc3RydWN0IGFzbjFfb2N0c3RyIGNvbW07Ci0Jc3RydWN0IHNubXBfb2JqZWN0ICoqb2JqOwotCi0JaWYgKGRlYnVnID4gMSkKLQkJaGV4X2R1bXAobXNnLCBsZW4pOwotCi0JYXNuMV9vcGVuKCZjdHgsIG1zZywgbGVuKTsKLQotCS8qCi0JICogU3RhcnQgb2YgU05NUCBtZXNzYWdlLgotCSAqLwotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlb2MsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX0NPTiB8fCB0YWcgIT0gQVNOMV9TRVEpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBWZXJzaW9uIDEgb3IgMiBoYW5kbGVkLgotCSAqLwotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCi0JCXJldHVybiAwOwotCWlmICghYXNuMV91aW50X2RlY29kZSAoJmN0eCwgZW5kLCAmdmVycykpCi0JCXJldHVybiAwOwotCWlmIChkZWJ1ZyA+IDEpCi0JCXByaW50ayhLRVJOX0RFQlVHICJic2FsZzogc25tcCB2ZXJzaW9uOiAldVxuIiwgdmVycyArIDEpOwotCWlmICh2ZXJzID4gMSkKLQkJcmV0dXJuIDE7Ci0KLQkvKgotCSAqIENvbW11bml0eS4KLQkgKi8KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZSAoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX09UUykKLQkJcmV0dXJuIDA7Ci0JaWYgKCFhc24xX29jdGV0c19kZWNvZGUoJmN0eCwgZW5kLCAmY29tbS5kYXRhLCAmY29tbS5sZW4pKQotCQlyZXR1cm4gMDsKLQlpZiAoZGVidWcgPiAxKSB7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCXByaW50ayhLRVJOX0RFQlVHICJic2FsZzogY29tbXVuaXR5OiAiKTsKLQkJZm9yIChpID0gMDsgaSA8IGNvbW0ubGVuOyBpKyspCi0JCQlwcmludGsoIiVjIiwgY29tbS5kYXRhW2ldKTsKLQkJcHJpbnRrKCJcbiIpOwotCX0KLQlrZnJlZShjb21tLmRhdGEpOwotCi0JLyoKLQkgKiBQRFUgdHlwZQotCSAqLwotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlb2MsICZjbHMsICZjb24sICZwZHV0eXBlKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNscyAhPSBBU04xX0NUWCB8fCBjb24gIT0gQVNOMV9DT04pCi0JCXJldHVybiAwOwotCWlmIChkZWJ1ZyA+IDEpIHsKLQkJdW5zaWduZWQgY2hhciAqcGR1c1tdID0gewotCQkJW1NOTVBfUERVX0dFVF0gPSAiZ2V0IiwKLQkJCVtTTk1QX1BEVV9ORVhUXSA9ICJnZXQtbmV4dCIsCi0JCQlbU05NUF9QRFVfUkVTUE9OU0VdID0gInJlc3BvbnNlIiwKLQkJCVtTTk1QX1BEVV9TRVRdID0gInNldCIsCi0JCQlbU05NUF9QRFVfVFJBUDFdID0gInRyYXB2MSIsCi0JCQlbU05NUF9QRFVfQlVMS10gPSAiYnVsayIsCi0JCQlbU05NUF9QRFVfSU5GT1JNXSA9ICJpbmZvcm0iLAotCQkJW1NOTVBfUERVX1RSQVAyXSA9ICJ0cmFwdjIiCi0JCX07Ci0KLQkJaWYgKHBkdXR5cGUgPiBTTk1QX1BEVV9UUkFQMikKLQkJCXByaW50ayhLRVJOX0RFQlVHICJic2FsZzogYmFkIHBkdSB0eXBlICV1XG4iLCBwZHV0eXBlKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBwZHU6ICVzXG4iLCBwZHVzW3BkdXR5cGVdKTsKLQl9Ci0JaWYgKHBkdXR5cGUgIT0gU05NUF9QRFVfUkVTUE9OU0UgJiYKLQkgICAgcGR1dHlwZSAhPSBTTk1QX1BEVV9UUkFQMSAmJiBwZHV0eXBlICE9IFNOTVBfUERVX1RSQVAyKQotCQlyZXR1cm4gMTsKLQotCS8qCi0JICogUmVxdWVzdCBoZWFkZXIgb3IgdjEgdHJhcAotCSAqLwotCWlmIChwZHV0eXBlID09IFNOTVBfUERVX1RSQVAxKSB7Ci0JCXN0cnVjdCBzbm1wX3YxX3RyYXAgdHJhcDsKLQkJdW5zaWduZWQgY2hhciByZXQgPSBzbm1wX3RyYXBfZGVjb2RlKCZjdHgsICZ0cmFwLCBtYXAsIGNoZWNrKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlrZnJlZSh0cmFwLmlkKTsKLQkJCWtmcmVlKCh1bnNpZ25lZCBsb25nICopdHJhcC5pcF9hZGRyZXNzKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gcmV0OwotCi0JfSBlbHNlIHsKLQkJc3RydWN0IHNubXBfcmVxdWVzdCByZXE7Ci0KLQkJaWYgKCFzbm1wX3JlcXVlc3RfZGVjb2RlKCZjdHgsICZyZXEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGRlYnVnID4gMSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICJic2FsZzogcmVxdWVzdDogaWQ9MHglbHggZXJyb3Jfc3RhdHVzPSV1ICIKLQkJCSJlcnJvcl9pbmRleD0ldVxuIiwgcmVxLmlkLCByZXEuZXJyb3Jfc3RhdHVzLAotCQkJcmVxLmVycm9yX2luZGV4KTsKLQl9Ci0KLQkvKgotCSAqIExvb3AgdGhyb3VnaCBvYmplY3RzLCBsb29rIGZvciBJUCBhZGRyZXNzZXMgdG8gbWFuZ2xlLgotCSAqLwotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlb2MsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKLQkJcmV0dXJuIDA7Ci0KLQlvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9PTSBpbiBic2FsZyglZClcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKCFhc24xX2VvY19kZWNvZGUoJmN0eCwgZW9jKSkgewotCQl1bnNpZ25lZCBpbnQgaTsKLQotCQlpZiAoIXNubXBfb2JqZWN0X2RlY29kZSgmY3R4LCBvYmopKSB7Ci0JCQlpZiAoKm9iaikgewotCQkJCWtmcmVlKCgqb2JqKS0+aWQpOwotCQkJCWtmcmVlKCpvYmopOwotCQkJfQotCQkJa2ZyZWUob2JqKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGRlYnVnID4gMSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBvYmplY3Q6ICIpOwotCQkJZm9yIChpID0gMDsgaSA8ICgqb2JqKS0+aWRfbGVuOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXByaW50aygiLiIpOwotCQkJCXByaW50aygiJWx1IiwgKCpvYmopLT5pZFtpXSk7Ci0JCQl9Ci0JCQlwcmludGsoIjogdHlwZT0ldVxuIiwgKCpvYmopLT50eXBlKTsKLQotCQl9Ci0KLQkJaWYgKCgqb2JqKS0+dHlwZSA9PSBTTk1QX0lQQUREUikKLQkJCW1hbmdsZV9hZGRyZXNzKGN0eC5iZWdpbiwgY3R4LnBvaW50ZXIgLSA0ICwgbWFwLCBjaGVjayk7Ci0KLQkJa2ZyZWUoKCpvYmopLT5pZCk7Ci0JCWtmcmVlKCpvYmopOwotCX0KLQlrZnJlZShvYmopOwotCi0JaWYgKCFhc24xX2VvY19kZWNvZGUoJmN0eCwgZW9jKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTkFUIHJvdXRpbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFNOTVAgdHJhbnNsYXRpb24gcm91dGluZS4KLSAqLwotc3RhdGljIGludCBzbm1wX3RyYW5zbGF0ZShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHN0cnVjdCBza19idWZmICoqcHNrYikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoKF9fYmUzMiAqKWlwaCArIGlwaC0+aWhsKTsKLQl1X2ludDE2X3QgdWRwbGVuID0gbnRvaHModWRwaC0+bGVuKTsKLQl1X2ludDE2X3QgcGF5bGVuID0gdWRwbGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0Jc3RydWN0IG9jdDFfbWFwIG1hcDsKLQotCS8qCi0JICogRGV0ZXJtaW5lIG1hcHBwaW5nIGZvciBhcHBsaWNhdGlvbiBsYXllciBhZGRyZXNzZXMgYmFzZWQKLQkgKiBvbiBOQVQgbWFuaXB1bGF0aW9ucyBmb3IgdGhlIHBhY2tldC4KLQkgKi8KLQlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgewotCQkvKiBTTkFUIHRyYXBzICovCi0JCW1hcC5mcm9tID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXApOwotCQltYXAudG8gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCk7Ci0JfSBlbHNlIHsKLQkJLyogRE5BVCByZXBsaWVzICovCi0JCW1hcC5mcm9tID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOwotCQltYXAudG8gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCk7Ci0JfQotCi0JaWYgKG1hcC5mcm9tID09IG1hcC50bykKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCWlmICghc25tcF9wYXJzZV9tYW5nbGUoKHVuc2lnbmVkIGNoYXIgKil1ZHBoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLAotCQkJICAgICAgIHBheWxlbiwgJm1hcCwgJnVkcGgtPmNoZWNrKSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnNhbGc6IHBhcnNlciBmYWlsZWRcbiIpOwotCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgc2V0IHVwIGV4cGVjdGF0aW9ucywganVzdCBhZGp1c3QgaW50ZXJuYWwgSVAKLSAqIGFkZHJlc3NlcyBpZiB0aGlzIGlzIGJlaW5nIE5BVHRlZCAqLwotc3RhdGljIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdW5zaWduZWQgaW50IHJldDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoKHVfaW50MzJfdCAqKWlwaCArIGlwaC0+aWhsKTsKLQotCS8qIFNOTVAgcmVwbGllcyBhbmQgb3JpZ2luYXRpbmcgU05NUCB0cmFwcyBnZXQgbWFuZ2xlZCAqLwotCWlmICh1ZHBoLT5zb3VyY2UgPT0gaHRvbnMoU05NUF9QT1JUKSAmJiBkaXIgIT0gSVBfQ1RfRElSX1JFUExZKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCWlmICh1ZHBoLT5kZXN0ID09IGh0b25zKFNOTVBfVFJBUF9QT1JUKSAmJiBkaXIgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyogTm8gTkFUPyAqLwotCWlmICghKGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBhY2tldCBsZW5ndGggaXMgb2suICBTbyBmYXIsIHdlIHdlcmUgb25seSBndWFyYW50ZWVkCi0JICogdG8gaGF2ZSBhIHZhbGlkIGxlbmd0aCBJUCBoZWFkZXIgcGx1cyA4IGJ5dGVzLCB3aGljaCBtZWFucyB3ZSBoYXZlCi0JICogZW5vdWdoIHJvb20gZm9yIGEgVURQIGhlYWRlci4gIEp1c3QgdmVyaWZ5IHRoZSBVRFAgbGVuZ3RoIGZpZWxkIHNvIHdlCi0JICogY2FuIG1lc3MgYXJvdW5kIHdpdGggdGhlIHBheWxvYWQuCi0JICovCi0JaWYgKG50b2hzKHVkcGgtPmxlbikgIT0gKCpwc2tiKS0+bGVuIC0gKGlwaC0+aWhsIDw8IDIpKSB7Ci0JCSBpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJIHByaW50ayhLRVJOX1dBUk5JTkcgIlNOTVA6IGRyb3BwaW5nIG1hbGZvcm1lZCBwYWNrZXQgIgotCQkJCSJzcmM9JXUuJXUuJXUuJXUgZHN0PSV1LiV1LiV1LiV1XG4iLAotCQkJCU5JUFFVQUQoaXBoLT5zYWRkciksIE5JUFFVQUQoaXBoLT5kYWRkcikpOwotCQkgcmV0dXJuIE5GX0RST1A7Ci0JfQotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCXNwaW5fbG9ja19iaCgmc25tcF9sb2NrKTsKLQlyZXQgPSBzbm1wX3RyYW5zbGF0ZShjdCwgY3RpbmZvLCBwc2tiKTsKLQlzcGluX3VubG9ja19iaCgmc25tcF9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgc25tcF9oZWxwZXIgPSB7Ci0JLm1heF9leHBlY3RlZCA9IDAsCi0JLnRpbWVvdXQgPSAxODAsCi0JLm1lID0gVEhJU19NT0RVTEUsCi0JLmhlbHAgPSBoZWxwLAotCS5uYW1lID0gInNubXAiLAotCi0JLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnVkcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoU05NUF9QT1JUKX19fSwKLQkJICAuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVURQfSwKLQl9LAotCS5tYXNrID0gey5zcmMgPSB7LnUgPSB7MHhGRkZGfX0sCi0JCSAuZHN0ID0gey5wcm90b251bSA9IDB4RkZ9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgc25tcF90cmFwX2hlbHBlciA9IHsKLQkubWF4X2V4cGVjdGVkID0gMCwKLQkudGltZW91dCA9IDE4MCwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkuaGVscCA9IGhlbHAsCi0JLm5hbWUgPSAic25tcF90cmFwIiwKLQotCS50dXBsZSA9IHsuc3JjID0gey51ID0gey51ZHAgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKFNOTVBfVFJBUF9QT1JUKX19fSwKLQkJICAuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVURQfSwKLQl9LAotCS5tYXNrID0gey5zcmMgPSB7LnUgPSB7MHhGRkZGfX0sCi0JCSAuZHN0ID0gey5wcm90b251bSA9IDB4RkZ9LAotCX0sCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgc3R1ZmYuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfc25tcF9iYXNpY19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZzbm1wX2hlbHBlcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcigmc25tcF90cmFwX2hlbHBlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX2hlbHBlcik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfc25tcF9iYXNpY19maW5pKHZvaWQpCi17Ci0JaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX2hlbHBlcik7Ci0JaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX3RyYXBfaGVscGVyKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfbmF0X3NubXBfYmFzaWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfc25tcF9iYXNpY19maW5pKTsKLQotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2MDApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjZmRmNi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFsb25lCi0gICBpcF9uYXQgbW9kdWxlLgotCi0gICBUaGVzZSBhcmUgbm90IHJlcXVpcmVkIGJ5IHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgotKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotLyoKLSAqIDIzIEFwciAyMDAxOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogCS0gbmV3IEFQSSBhbmQgaGFuZGxpbmcgb2YgY29ubnRyYWNrL25hdCBoZWxwZXJzCi0gKiAJLSBub3cgY2FwYWJsZSBvZiBtdWx0aXBsZSBleHBlY3RhdGlvbnMgZm9yIG9uZSBtYXN0ZXIKLSAqICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19YRlJNCi1zdGF0aWMgdm9pZCBuYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7Ci0JdW5zaWduZWQgbG9uZyBzdGF0dXNiaXQ7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoY3QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl0ID0gJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZTsKLQotCWlmIChkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQlzdGF0dXNiaXQgPSBJUFNfRFNUX05BVDsKLQllbHNlCi0JCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOwotCi0JaWYgKGN0LT5zdGF0dXMgJiBzdGF0dXNiaXQpIHsKLQkJZmwtPmZsNF9kc3QgPSB0LT5kc3QuaXA7Ci0JCWlmICh0LT5kc3QucHJvdG9udW0gPT0gSVBQUk9UT19UQ1AgfHwKLQkJICAgIHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1VEUCkKLQkJCWZsLT5mbF9pcF9kcG9ydCA9IHQtPmRzdC51LnRjcC5wb3J0OwotCX0KLQotCXN0YXR1c2JpdCBePSBJUFNfTkFUX01BU0s7Ci0KLQlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgewotCQlmbC0+Zmw0X3NyYyA9IHQtPnNyYy5pcDsKLQkJaWYgKHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1RDUCB8fAotCQkgICAgdC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVURQKQotCQkJZmwtPmZsX2lwX3Nwb3J0ID0gdC0+c3JjLnUudGNwLnBvcnQ7Ci0JfQotfQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwX25hdF9mbih1bnNpZ25lZCBpbnQgaG9va251bSwKLQkgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm87Ci0JLyogbWFuaXB0eXBlID09IFNSQyBmb3IgcG9zdHJvdXRpbmcuICovCi0JZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUgPSBIT09LMk1BTklQKGhvb2tudW0pOwotCi0JLyogV2UgbmV2ZXIgc2VlIGZyYWdtZW50czogY29ubnRyYWNrIGRlZnJhZ3Mgb24gcHJlLXJvdXRpbmcKLQkgICBhbmQgbG9jYWwtb3V0LCBhbmQgaXBfbmF0X291dCBwcm90ZWN0cyBwb3N0LXJvdXRpbmcuICovCi0JSVBfTkZfQVNTRVJUKCEoKCpwc2tiKS0+bmguaXBoLT5mcmFnX29mZgotCQkgICAgICAgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSk7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotCS8qIENhbid0IHRyYWNrPyAgSXQncyBub3QgZHVlIHRvIHN0cmVzcywgb3IgY29ubnRyYWNrIHdvdWxkCi0JICAgaGF2ZSBkcm9wcGVkIGl0LiAgSGVuY2UgaXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsdHkgdG8KLQkgICBwYWNrZXQgZmlsdGVyIGl0IG91dCwgb3IgaW1wbGVtZW50IGNvbm50cmFjay9OQVQgZm9yIHRoYXQKLQkgICBwcm90b2NvbC4gOCkgLS1SUiAqLwotCWlmICghY3QpIHsKLQkJLyogRXhjZXB0aW9uOiBJQ01QIHJlZGlyZWN0IHRvIG5ldyBjb25uZWN0aW9uIChub3QgaW4KLQkJICAgaGFzaCB0YWJsZSB5ZXQpLiAgV2UgbXVzdCBub3QgbGV0IHRoaXMgdGhyb3VnaCwgaW4KLQkJICAgY2FzZSB3ZSdyZSBkb2luZyBOQVQgdG8gdGhlIHNhbWUgbmV0d29yay4gKi8KLQkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7Ci0JCQlzdHJ1Y3QgaWNtcGhkciBfaGRyLCAqaHA7Ci0KLQkJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLAotCQkJCQkJKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKLQkJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOwotCQkJaWYgKGhwICE9IE5VTEwgJiYKLQkJCSAgICBocC0+dHlwZSA9PSBJQ01QX1JFRElSRUNUKQotCQkJCXJldHVybiBORl9EUk9QOwotCQl9Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogRG9uJ3QgdHJ5IHRvIE5BVCBpZiB0aGlzIHBhY2tldCBpcyBub3QgY29ubnRyYWNrZWQgKi8KLQlpZiAoY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlzd2l0Y2ggKGN0aW5mbykgewotCWNhc2UgSVBfQ1RfUkVMQVRFRDoKLQljYXNlIElQX0NUX1JFTEFURUQrSVBfQ1RfSVNfUkVQTFk6Ci0JCWlmICgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgewotCQkJaWYgKCFpcF9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbihjdCwgY3RpbmZvLAotCQkJCQkJCSAgIGhvb2tudW0sIHBza2IpKQotCQkJCXJldHVybiBORl9EUk9QOwotCQkJZWxzZQotCQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCX0KLQkJLyogRmFsbCB0aHJ1Li4uIChPbmx5IElDTVBzIGNhbiBiZSBJUF9DVF9JU19SRVBMWSkgKi8KLQljYXNlIElQX0NUX05FVzoKLQkJaW5mbyA9ICZjdC0+bmF0LmluZm87Ci0KLQkJLyogU2VlbiBpdCBiZWZvcmU/ICBUaGlzIGNhbiBoYXBwZW4gZm9yIGxvb3BiYWNrLCByZXRyYW5zLAotCQkgICBvciBsb2NhbCBwYWNrZXRzLi4gKi8KLQkJaWYgKCFpcF9uYXRfaW5pdGlhbGl6ZWQoY3QsIG1hbmlwdHlwZSkpIHsKLQkJCXVuc2lnbmVkIGludCByZXQ7Ci0KLQkJCWlmICh1bmxpa2VseShpc19jb25maXJtZWQoY3QpKSkKLQkJCQkvKiBOQVQgbW9kdWxlIHdhcyBsb2FkZWQgbGF0ZSAqLwotCQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZ19jb25maXJtZWQoY3QsIGluZm8sCi0JCQkJCQkJCSAgIGhvb2tudW0pOwotCQkJZWxzZSBpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9JTikKLQkJCQkvKiBMT0NBTF9JTiBob29rIGRvZXNuJ3QgaGF2ZSBhIGNoYWluISAgKi8KLQkJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOwotCQkJZWxzZQotCQkJCXJldCA9IGlwX25hdF9ydWxlX2ZpbmQocHNrYiwgaG9va251bSwKLQkJCQkJCSAgICAgICBpbiwgb3V0LCBjdCwKLQkJCQkJCSAgICAgICBpbmZvKTsKLQotCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpIHsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9IGVsc2UKLQkJCURFQlVHUCgiQWxyZWFkeSBzZXR1cCBtYW5pcCAlcyBmb3IgY3QgJXBcbiIsCi0JCQkgICAgICAgbWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMgPyAiU1JDIiA6ICJEU1QiLAotCQkJICAgICAgIGN0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBFU1RBQkxJU0hFRCAqLwotCQlJUF9ORl9BU1NFUlQoY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVECi0JCQkgICAgIHx8IGN0aW5mbyA9PSAoSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpKTsKLQkJaW5mbyA9ICZjdC0+bmF0LmluZm87Ci0JfQotCi0JSVBfTkZfQVNTRVJUKGluZm8pOwotCXJldHVybiBpcF9uYXRfcGFja2V0KGN0LCBjdGluZm8sIGhvb2tudW0sIHBza2IpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pcF9uYXRfaW4odW5zaWduZWQgaW50IGhvb2tudW0sCi0JICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0JdW5zaWduZWQgaW50IHJldDsKLQlfX2JlMzIgZGFkZHIgPSAoKnBza2IpLT5uaC5pcGgtPmRhZGRyOwotCi0JcmV0ID0gaXBfbmF0X2ZuKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOwotCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOCi0JICAgICYmIGRhZGRyICE9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHIpIHsKLQkJZHN0X3JlbGVhc2UoKCpwc2tiKS0+ZHN0KTsKLQkJKCpwc2tiKS0+ZHN0ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotaXBfbmF0X291dCh1bnNpZ25lZCBpbnQgaG9va251bSwKLQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0jaWZkZWYgQ09ORklHX1hGUk0KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLSNlbmRpZgotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KLQlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlyZXQgPSBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7Ci0jaWZkZWYgQ09ORklHX1hGUk0KLQlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTgotCSAgICAmJiAoY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKSkgIT0gTlVMTCkgewotCQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCi0JCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcAotCQkgICAgfHwgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51LmFsbCAhPQotCQkgICAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS5hbGwKLQkJICAgICkKLQkJCXJldHVybiBpcF94ZnJtX21lX2hhcmRlcihwc2tiKSA9PSAwID8gcmV0IDogTkZfRFJPUDsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pcF9uYXRfbG9jYWxfZm4odW5zaWduZWQgaW50IGhvb2tudW0sCi0JCXN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0JLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCi0JaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JcmV0ID0gaXBfbmF0X2ZuKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOwotCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOCi0JICAgICYmIChjdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pKSAhPSBOVUxMKSB7Ci0JCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0KLQkJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QuaXAgIT0KLQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwKSB7Ci0JCQlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKHBza2IsIFJUTl9VTlNQRUMpKQotCQkJCXJldCA9IE5GX0RST1A7Ci0JCX0KLSNpZmRlZiBDT05GSUdfWEZSTQotCQllbHNlIGlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LnUuYWxsICE9Ci0JCQkgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudS5hbGwpCi0JCQlpZiAoaXBfeGZybV9tZV9oYXJkZXIocHNrYikpCi0JCQkJcmV0ID0gTkZfRFJPUDsKLSNlbmRpZgotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwX25hdF9hZGp1c3QodW5zaWduZWQgaW50IGhvb2tudW0sCi0JICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKLQlpZiAoY3QgJiYgdGVzdF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cykpIHsKLQkJREVCVUdQKCJpcF9uYXRfc3RhbmRhbG9uZTogYWRqdXN0aW5nIHNlcXVlbmNlIG51bWJlclxuIik7Ci0JCWlmICghaXBfbmF0X3NlcV9hZGp1c3QocHNrYiwgY3QsIGN0aW5mbykpCi0JCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogV2UgbXVzdCBiZSBhZnRlciBjb25uZWN0aW9uIHRyYWNraW5nIGFuZCBiZWZvcmUgcGFja2V0IGZpbHRlcmluZy4gKi8KLQotc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcF9uYXRfb3BzW10gPSB7Ci0JLyogQmVmb3JlIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBkZXN0aW5hdGlvbiAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X2luLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX1BSRV9ST1VUSU5HLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX0RTVCwKLQl9LAotCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBzb3VyY2UgKi8KLQl7Ci0JCS5ob29rCQk9IGlwX25hdF9vdXQsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUE9TVF9ST1VUSU5HLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NSQywKLQl9LAotCS8qIEFmdGVyIGNvbm50cmFjaywgYWRqdXN0IHNlcXVlbmNlIG51bWJlciAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X2FkanVzdCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9QT1NUX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU0VRX0FESlVTVCwKLQl9LAotCS8qIEJlZm9yZSBwYWNrZXQgZmlsdGVyaW5nLCBjaGFuZ2UgZGVzdGluYXRpb24gKi8KLQl7Ci0JCS5ob29rCQk9IGlwX25hdF9sb2NhbF9mbiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNULAotCX0sCi0JLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X2ZuLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NSQywKLQl9LAotCS8qIEFmdGVyIGNvbm50cmFjaywgYWRqdXN0IHNlcXVlbmNlIG51bWJlciAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X2FkanVzdCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9TRVFfQURKVVNULAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfc3RhbmRhbG9uZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQluZWVkX2Nvbm50cmFjaygpOwotCi0jaWZkZWYgQ09ORklHX1hGUk0KLQlCVUdfT04oaXBfbmF0X2RlY29kZV9zZXNzaW9uICE9IE5VTEwpOwotCWlwX25hdF9kZWNvZGVfc2Vzc2lvbiA9IG5hdF9kZWNvZGVfc2Vzc2lvbjsKLSNlbmRpZgotCXJldCA9IGlwX25hdF9ydWxlX2luaXQoKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImlwX25hdF9pbml0OiBjYW4ndCBzZXR1cCBydWxlcy5cbiIpOwotCQlnb3RvIGNsZWFudXBfZGVjb2RlX3Nlc3Npb247Ci0JfQotCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2tzKGlwX25hdF9vcHMsIEFSUkFZX1NJWkUoaXBfbmF0X29wcykpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiaXBfbmF0X2luaXQ6IGNhbid0IHJlZ2lzdGVyIGhvb2tzLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9ydWxlX2luaXQ7Ci0JfQotCXJldHVybiByZXQ7Ci0KLSBjbGVhbnVwX3J1bGVfaW5pdDoKLQlpcF9uYXRfcnVsZV9jbGVhbnVwKCk7Ci0gY2xlYW51cF9kZWNvZGVfc2Vzc2lvbjoKLSNpZmRlZiBDT05GSUdfWEZSTQotCWlwX25hdF9kZWNvZGVfc2Vzc2lvbiA9IE5VTEw7Ci0Jc3luY2hyb25pemVfbmV0KCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X3N0YW5kYWxvbmVfZmluaSh2b2lkKQotewotCW5mX3VucmVnaXN0ZXJfaG9va3MoaXBfbmF0X29wcywgQVJSQVlfU0laRShpcF9uYXRfb3BzKSk7Ci0JaXBfbmF0X3J1bGVfY2xlYW51cCgpOwotI2lmZGVmIENPTkZJR19YRlJNCi0JaXBfbmF0X2RlY29kZV9zZXNzaW9uID0gTlVMTDsKLQlzeW5jaHJvbml6ZV9uZXQoKTsKLSNlbmRpZgotfQotCi1tb2R1bGVfaW5pdChpcF9uYXRfc3RhbmRhbG9uZV9pbml0KTsKLW1vZHVsZV9leGl0KGlwX25hdF9zdGFuZGFsb25lX2ZpbmkpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfdGZ0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3OTM1Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfdGZ0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogKEMpIDIwMDEtMjAwMiBNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBWZXJzaW9uOiAwLjAuNwotICoKLSAqIFRodSAyMSBNYXIgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogCS0gUG9ydCB0byBuZXduYXQgQVBJCi0gKgotICogVGhpcyBtb2R1bGUgY3VycmVudGx5IHN1cHBvcnRzIEROQVQ6Ci0gKiBpcHRhYmxlcyAtdCBuYXQgLUEgUFJFUk9VVElORyAtZCB4LngueC54IC1qIEROQVQgLS10by1kZXN0IHgueC54LnkKLSAqCi0gKiBhbmQgU05BVDoKLSAqIGlwdGFibGVzIC10IG5hdCAtQSBQT1NUUk9VVElORyB7IC1qIE1BU1FVRVJBREUgLCAtaiBTTkFUIC0tdG8tc291cmNlIHgueC54LnggfQotICoKLSAqIEl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2l0aAotICogLWogU05BVCAtLXRvLXNvdXJjZSB4LngueC54LXgueC54Lnkgc2luY2UgSSBvbmx5IGhhdmUgb25lIGV4dGVybmFsIGlwCi0gKiBJZiB5b3UgZG8gdGVzdCB0aGlzIHBsZWFzZSBsZXQgbWUga25vdyBpZiBpdCB3b3JrcyBvciBub3QuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi1NT0RVTEVfQVVUSE9SKCJNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInRmdHAgTkFUIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBleHAtPm1hc3RlcjsKLQotCWV4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQKLQkJPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUudWRwLnBvcnQ7Ci0JZXhwLT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQotCQlyZXR1cm4gTkZfRFJPUDsKLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X3RmdHBfZmluaSh2b2lkKQotewotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfdGZ0cF9ob29rLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXBfbmF0X3RmdHBfaW5pdCh2b2lkKQotewotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3RmdHBfaG9vaykpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfdGZ0cF9ob29rLCBoZWxwKTsKLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaXBfbmF0X3RmdHBfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfdGZ0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKaW5kZXggYTE0Nzk4YS4uNzAyZDk0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKQEAgLTgsMTggKzgsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAyMDAwLTAzLTI3OiBTaW1wbGlmaWVkIGNvZGUgKHRoYW5rcyB0byBBbmRpIEtsZWVuIGZvciBjbHVlcykuCi0gKiAyMDAwLTA1LTIwOiBGaXhlZCBub3RpZmllciBwcm9ibGVtcyAoZm9sbG93aW5nIE1pZ3VlbCBGcmVpdGFzJyByZXBvcnQpLgotICogMjAwMC0wNi0xOTogRml4ZWQgc28gbmZtYXJrIGlzIGNvcGllZCB0byBtZXRhZGF0YSAocmVwb3J0ZWQgYnkgU2ViYXN0aWFuCi0gKiAgICAgICAgICAgICBaYW5kZXIpLgotICogMjAwMC0wOC0wMTogQWRkZWQgTmljayBXaWxsaWFtcycgTUFDIHN1cHBvcnQuCi0gKiAyMDAyLTA2LTI1OiBDb2RlIGNsZWFudXAuCi0gKiAyMDA1LTAxLTEwOiBBZGRlZCAvcHJvYyBjb3VudGVyIGZvciBkcm9wcGVkIHBhY2tldHM7IGZpeGVkIHNvCi0gKiAgICAgICAgICAgICBwYWNrZXRzIGFyZW4ndCBkZWxpdmVyZWQgdG8gdXNlciBzcGFjZSBpZiB0aGV5J3JlIGdvaW5nCi0gKiAgICAgICAgICAgICB0byBiZSBkcm9wcGVkLgotICogMjAwNS0wNS0yNjogbG9jYWxfYmhfe2Rpc2FibGUsZW5hYmxlfSBhcm91bmQgbmZfcmVpbmplY3QgKEhhcmFsZCBXZWx0ZSkKLSAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTE5MSwxMiArMTc5LDEzIEBACiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogaXBxX2J1aWxkX3BhY2tldF9tZXNzYWdlKHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5LCBpbnQgKmVycnApCiB7Ci0JdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWw7CiAJc2l6ZV90IHNpemUgPSAwOwogCXNpemVfdCBkYXRhX2xlbiA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaXBxX3BhY2tldF9tc2cgKnBtc2c7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAlyZWFkX2xvY2tfYmgoJnF1ZXVlX2xvY2spOwogCkBAIC0yMzQsMTUgKzIyMywxNiBAQAogCWlmICghc2tiKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAKLQlvbGRfdGFpbD0gc2tiLT50YWlsOworCW9sZF90YWlsID0gc2tiLT50YWlsOwogCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIElQUU1fUEFDS0VULCBzaXplIC0gc2l6ZW9mKCpubGgpKTsKIAlwbXNnID0gTkxNU0dfREFUQShubGgpOwogCW1lbXNldChwbXNnLCAwLCBzaXplb2YoKnBtc2cpKTsKIAogCXBtc2ctPnBhY2tldF9pZCAgICAgICA9ICh1bnNpZ25lZCBsb25nICllbnRyeTsKIAlwbXNnLT5kYXRhX2xlbiAgICAgICAgPSBkYXRhX2xlbjsKLQlwbXNnLT50aW1lc3RhbXBfc2VjICAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3NlYzsKLQlwbXNnLT50aW1lc3RhbXBfdXNlYyAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3VzZWM7CisJdHYgPSBrdGltZV90b190aW1ldmFsKGVudHJ5LT5za2ItPnRzdGFtcCk7CisJcG1zZy0+dGltZXN0YW1wX3NlYyAgID0gdHYudHZfc2VjOworCXBtc2ctPnRpbWVzdGFtcF91c2VjICA9IHR2LnR2X3VzZWM7CiAJcG1zZy0+bWFyayAgICAgICAgICAgID0gZW50cnktPnNrYi0+bWFyazsKIAlwbXNnLT5ob29rICAgICAgICAgICAgPSBlbnRyeS0+aW5mby0+aG9vazsKIAlwbXNnLT5od19wcm90b2NvbCAgICAgPSBlbnRyeS0+c2tiLT5wcm90b2NvbDsKQEAgLTM3OCw3ICszNjgsNyBAQAogCX0KIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKCZlLT5za2IsIHYtPmRhdGFfbGVuKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGUtPnNrYi0+ZGF0YSwgdi0+cGF5bG9hZCwgdi0+ZGF0YV9sZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGUtPnNrYiwgdi0+cGF5bG9hZCwgdi0+ZGF0YV9sZW4pOwogCWUtPnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCXJldHVybiAwOwpAQCAtNDk1LDcgKzQ4NSw3IEBACiAJaWYgKHNrYmxlbiA8IHNpemVvZigqbmxoKSkKIAkJcmV0dXJuOwogCi0JbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlubGggPSBubG1zZ19oZHIoc2tiKTsKIAlubG1zZ2xlbiA9IG5saC0+bmxtc2dfbGVuOwogCWlmIChubG1zZ2xlbiA8IHNpemVvZigqbmxoKSB8fCBza2JsZW4gPCBubG1zZ2xlbikKIAkJcmV0dXJuOwpAQCAtNjc4LDcgKzY2OCw3IEBACiAKIAluZXRsaW5rX3JlZ2lzdGVyX25vdGlmaWVyKCZpcHFfbmxfbm90aWZpZXIpOwogCWlwcW5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfRklSRVdBTEwsIDAsIGlwcV9yY3Zfc2ssCi0JCQkJICAgICAgVEhJU19NT0RVTEUpOworCQkJCSAgICAgIE5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoaXBxbmwgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImlwX3F1ZXVlOiBmYWlsZWQgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0XG4iKTsKIAkJZ290byBjbGVhbnVwX25ldGxpbmtfbm90aWZpZXI7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggNTBjYzRiOS4uZTNmODNiZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtNywxMiArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE5IEphbiAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJLSBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgYXMgc29vbiBhcyB3ZSBoYXZlIHJ1bGVzIGluc2lkZQotICogCSAgYSB0YWJsZQotICogMDggT2N0IDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmVAbmV0ZmlsdGVyLm9yZz4KLSAqIAktIEdlbmVyYWxpemUgaW50byAieF90YWJsZXMiIGxheWVyIGFuZCAie2lwLGlwNixhcnB9X3RhYmxlcyIKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgpAQCAtMTk4LDcgKzE5Miw3IEBACiB7CiAJLyogU3RvcCBpdGVyYXRpb24gaWYgaXQgZG9lc24ndCBtYXRjaCAqLwogCWlmICghbS0+dS5rZXJuZWwubWF0Y2gtPm1hdGNoKHNrYiwgaW4sIG91dCwgbS0+dS5rZXJuZWwubWF0Y2gsIG0tPmRhdGEsCi0JCQkJICAgICAgb2Zmc2V0LCBza2ItPm5oLmlwaC0+aWhsKjQsIGhvdGRyb3ApKQorCQkJCSAgICAgIG9mZnNldCwgaXBfaGRybGVuKHNrYiksIGhvdGRyb3ApKQogCQlyZXR1cm4gMTsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtMjMxLDcgKzIyNSw3IEBACiAJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwotCWlwID0gKCpwc2tiKS0+bmguaXBoOworCWlwID0gaXBfaGRyKCpwc2tiKTsKIAlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXAtPmlobCAqIDQ7CiAJaW5kZXYgPSBpbiA/IGluLT5uYW1lIDogbnVsbGRldm5hbWU7CiAJb3V0ZGV2ID0gb3V0ID8gb3V0LT5uYW1lIDogbnVsbGRldm5hbWU7CkBAIC0zMjAsNyArMzE0LDcgQEAKIAkJCQkJPSAweDU3YWNjMDAxOwogI2VuZGlmCiAJCQkJLyogVGFyZ2V0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzdHVmZi4gKi8KLQkJCQlpcCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJCQlpcCA9IGlwX2hkcigqcHNrYik7CiAJCQkJZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGlwLT5paGwgKiA0OwogCiAJCQkJaWYgKHZlcmRpY3QgPT0gSVBUX0NPTlRJTlVFKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggNDJiMDgwMi4uNDBlMjczNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0yMSwxNSArMjEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgotCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMVVNURVJJUC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKICNkZWZpbmUgQ0xVU1RFUklQX1ZFUlNJT04gIjAuOCIKIApAQCAtMjQwLDcgKzIzNyw3IEBACiBzdGF0aWMgaW5saW5lIHVfaW50MzJfdAogY2x1c3RlcmlwX2hhc2hmbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqY29uZmlnKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAl1bnNpZ25lZCBsb25nIGhhc2h2YWw7CiAJdV9pbnQxNl90IHNwb3J0LCBkcG9ydDsKIAl1X2ludDE2X3QgKnBvcnRzOwpAQCAtMzEwLDE1ICszMDcsMTYgQEAKICAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqY2lwaW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1X2ludDMyX3QgKm1hcmssIGhhc2g7CisJdV9pbnQzMl90IGhhc2g7CiAKIAkvKiBkb24ndCBuZWVkIHRvIGNsdXN0ZXJpcF9jb25maWdfZ2V0KCkgaGVyZSwgc2luY2UgcmVmY291bnQKIAkgKiBpcyBvbmx5IGRlY3JlbWVudGVkIGJ5IGRlc3Ryb3koKSAtIGFuZCBpcF90YWJsZXMgZ3VhcmFudGVlcwogCSAqIHRoYXQgdGhlIC0+dGFyZ2V0KCkgZnVuY3Rpb24gaXNuJ3QgY2FsbGVkIGFmdGVyIC0+ZGVzdHJveSgpICovCiAKLQltYXJrID0gbmZfY3RfZ2V0X21hcmsoKCpwc2tiKSwgJmN0aW5mbyk7Ci0JaWYgKG1hcmsgPT0gTlVMTCkgeworCWN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKwlpZiAoY3QgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNMVVNURVJJUDogbm8gY29ubnRyYWNrIVxuIik7CiAJCQkvKiBGSVhNRTogbmVlZCB0byBkcm9wIGludmFsaWQgb25lcywgc2luY2UgcmVwbGllcwogCQkJICogdG8gb3V0Z29pbmcgY29ubmVjdGlvbnMgb2Ygb3RoZXIgbm9kZXMgd2lsbCBiZQpAQCAtMzI4LDcgKzMyNiw3IEBACiAKIAkvKiBzcGVjaWFsIGNhc2U6IElDTVAgZXJyb3IgaGFuZGxpbmcuIGNvbm50cmFjayBkaXN0aW5ndWlzaGVzIGJldHdlZW4KIAkgKiBlcnJvciBtZXNzYWdlcyAoUkVMQVRFRCkgYW5kIGluZm9ybWF0aW9uIHJlcXVlc3RzIChzZWUgYmVsb3cpICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QCisJaWYgKGlwX2hkcigqcHNrYiktPnByb3RvY29sID09IElQUFJPVE9fSUNNUAogCSAgICAmJiAoY3RpbmZvID09IElQX0NUX1JFTEFURUQKIAkJfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQrSVBfQ1RfSVNfUkVQTFkpKQogCQlyZXR1cm4gWFRfQ09OVElOVUU7CkBAIC0zNDEsNyArMzM5LDcgQEAKIAogCXN3aXRjaCAoY3RpbmZvKSB7CiAJCWNhc2UgSVBfQ1RfTkVXOgotCQkJKm1hcmsgPSBoYXNoOworCQkJY3QtPm1hcmsgPSBoYXNoOwogCQkJYnJlYWs7CiAJCWNhc2UgSVBfQ1RfUkVMQVRFRDoKIAkJY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgpAQCAtMzU4LDcgKzM1Niw3IEBACiAjaWZkZWYgREVCVUdfQ0xVU1RFUlAKIAlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOwogI2VuZGlmCi0JREVCVUdQKCJoYXNoPSV1IGN0X2hhc2g9JXUgIiwgaGFzaCwgKm1hcmspOworCURFQlVHUCgiaGFzaD0ldSBjdF9oYXNoPSV1ICIsIGhhc2gsIGN0LT5tYXJrKTsKIAlpZiAoIWNsdXN0ZXJpcF9yZXNwb25zaWJsZShjaXBpbmZvLT5jb25maWcsIGhhc2gpKSB7CiAJCURFQlVHUCgibm90IHJlc3BvbnNpYmxlXG4iKTsKIAkJcmV0dXJuIE5GX0RST1A7CkBAIC01MjEsNyArNTE5LDcgQEAKIAkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewotCXN0cnVjdCBhcnBoZHIgKmFycCA9ICgqcHNrYiktPm5oLmFycGg7CisJc3RydWN0IGFycGhkciAqYXJwID0gYXJwX2hkcigqcHNrYik7CiAJc3RydWN0IGFycF9wYXlsb2FkICpwYXlsb2FkOwogCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCA0ZjU2NTYzLi45MThjYTkyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTUsMTQgKzUsMTMgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogaXB0X0VDTi5jLHYgMS41IDIwMDIvMDgvMTggMTk6MzY6NTEgbGFmb3JnZSBFeHAKICovCiAKICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKQEAgLTI5LDEzICsyOCwxMyBAQAogc3RhdGljIGlubGluZSBpbnQKIHNldF9lY3RfaXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBjb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbykKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAKIAlpZiAoKGlwaC0+dG9zICYgSVBUX0VDTl9JUF9NQVNLKSAhPSAoZWluZm8tPmlwX2VjdCAmIElQVF9FQ05fSVBfTUFTSykpIHsKIAkJX191OCBvbGR0b3M7CiAJCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQkJcmV0dXJuIDA7Ci0JCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAkJb2xkdG9zID0gaXBoLT50b3M7CiAJCWlwaC0+dG9zICY9IH5JUFRfRUNOX0lQX01BU0s7CiAJCWlwaC0+dG9zIHw9IChlaW5mby0+aXBfZWN0ICYgSVBUX0VDTl9JUF9NQVNLKTsKQEAgLTUyLDcgKzUxLDcgQEAKIAlfX2JlMTYgb2xkdmFsOwogCiAJLyogTm90IGVub3VnaHQgaGVhZGVyPyAqLwotCXRjcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJdGNwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgaXBfaGRybGVuKCpwc2tiKSwKIAkJCQkgIHNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJaWYgKCF0Y3BoKQogCQlyZXR1cm4gMDsKQEAgLTYzLDkgKzYyLDkgQEAKIAkgICAgIHRjcGgtPmN3ciA9PSBlaW5mby0+cHJvdG8udGNwLmN3cikpKQogCQlyZXR1cm4gMTsKIAotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2YoKnRjcGgpKSkKIAkJcmV0dXJuIDA7Ci0JdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwl0Y3BoID0gKHZvaWQgKilpcF9oZHIoKnBza2IpICsgaXBfaGRybGVuKCpwc2tiKTsKIAogCW9sZHZhbCA9ICgoX19iZTE2ICopdGNwaClbNl07CiAJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX1NFVF9FQ0UpCkBAIC05Myw3ICs5Miw3IEBACiAJCQlyZXR1cm4gTkZfRFJPUDsKIAogCWlmIChlaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfU0VUX0VDRSB8IElQVF9FQ05fT1BfU0VUX0NXUikKLQkgICAgJiYgKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkgICAgJiYgaXBfaGRyKCpwc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCiAJCWlmICghc2V0X2VjdF90Y3AocHNrYiwgZWluZm8pKQogCQkJcmV0dXJuIE5GX0RST1A7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCmluZGV4IGQ5YzM3ZmQuLmE0MmM1Y2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwpAQCAtMzk5LDkgKzM5OSw5IEBACiAJCS8qIE1BQyBsb2dnaW5nIGZvciBpbnB1dCBjaGFpbiBvbmx5LiAqLwogCQlwcmludGsoIk1BQz0iKTsKIAkJaWYgKHNrYi0+ZGV2ICYmIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4KLQkJICAgICYmIHNrYi0+bWFjLnJhdyAhPSAodm9pZCopc2tiLT5uaC5pcGgpIHsKKwkJICAgICYmIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCQlpbnQgaTsKLQkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc2tiX21hY19oZWFkZXIoc2tiKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKysscCsrKQogCQkJCXByaW50aygiJTAyeCVjIiwgKnAsCiAJCQkJICAgICAgIGk9PXNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSAxCkBAIC00NzcsMTQgKzQ3NywxMCBAQAogCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2xvZ19yZWcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWlmIChuZl9sb2dfcmVnaXN0ZXIoUEZfSU5FVCwgJmlwdF9sb2dfbG9nZ2VyKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXB0X0xPRzogbm90IGxvZ2dpbmcgdmlhIHN5c3RlbSBjb25zb2xlICIKLQkJICAgICAgICJzaW5jZSBzb21lYm9keSBlbHNlIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgUEZfSU5FVFxuIik7Ci0JCS8qIHdlIGNhbm5vdCBtYWtlIG1vZHVsZSBsb2FkIGZhaWwgaGVyZSwgc2luY2Ugb3RoZXJ3aXNlCi0JCSAqIGlwdGFibGVzIHVzZXJzcGFjZSB3b3VsZCBhYm9ydCAqLwotCX0KLQotCXJldHVybiAwOworCXJldCA9IG5mX2xvZ19yZWdpc3RlcihQRl9JTkVULCAmaXB0X2xvZ19sb2dnZXIpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUVYSVNUKQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2xvZ19yZWcpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfbG9nX2Zpbmkodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKaW5kZXggYjU5NTVmMy4uZDRmMmQ3NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKQEAgLTE5LDEyICsxOSw4IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTQ4LDcgKzQ0LDcgQEAKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKIAogCWlmIChtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykgewogCQlERUJVR1AoIm1hc3F1ZXJhZGVfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CkBAIC02OSwzMyArNjUsMjYgQEAKIAkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7Ci0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQ7Ci0jZW5kaWYKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIG5ld3JhbmdlOwotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptcjsKKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIG5ld3JhbmdlOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptcjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlfX2JlMzIgbmV3c3JjOwogCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HKTsKKwlORl9DVF9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOwogCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCWN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKIAluYXQgPSBuZmN0X25hdChjdCk7Ci0jZW5kaWYKLQlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQKKworCU5GX0NUX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAogCQkJICAgIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFkpKTsKIAogCS8qIFNvdXJjZSBhZGRyZXNzIGlzIDAuMC4wLjAgLSBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXQgdGhhdCBpcwogCSAqIHByb2JhYmx5IG5vdCBzdXBwb3NlZCB0byBiZSBtYXNxdWVyYWRlZC4KIAkgKi8KLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCWlmIChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwID09IDApCi0jZWxzZQotCWlmIChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwID09IDApCi0jZW5kaWYKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCW1yID0gdGFyZ2luZm87CkBAIC0xMDcsNDAgKzk2LDMwIEBACiAJfQogCiAJd3JpdGVfbG9ja19iaCgmbWFzcV9sb2NrKTsKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCW5hdC0+bWFzcV9pbmRleCA9IG91dC0+aWZpbmRleDsKLSNlbHNlCi0JY3QtPm5hdC5tYXNxX2luZGV4ID0gb3V0LT5pZmluZGV4OwotI2VuZGlmCiAJd3JpdGVfdW5sb2NrX2JoKCZtYXNxX2xvY2spOwogCiAJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KLQluZXdyYW5nZSA9ICgoc3RydWN0IGlwX25hdF9yYW5nZSkKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKIAkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKIAkJICBuZXdzcmMsIG5ld3NyYywKIAkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1kZXZpY2VfY21wKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmlmaW5kZXgpCitkZXZpY2VfY21wKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICppZmluZGV4KQogewotCWludCByZXQ7Ci0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdCA9IG5mY3RfbmF0KGkpOworCWludCByZXQ7CiAKIAlpZiAoIW5hdCkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYKIAogCXJlYWRfbG9ja19iaCgmbWFzcV9sb2NrKTsKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCXJldCA9IChuYXQtPm1hc3FfaW5kZXggPT0gKGludCkobG9uZylpZmluZGV4KTsKLSNlbHNlCi0JcmV0ID0gKGktPm5hdC5tYXNxX2luZGV4ID09IChpbnQpKGxvbmcpaWZpbmRleCk7Ci0jZW5kaWYKIAlyZWFkX3VubG9ja19iaCgmbWFzcV9sb2NrKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNTYsOSArMTM1LDkgQEAKIAkJLyogRGV2aWNlIHdhcyBkb3duZWQuICBTZWFyY2ggZW50aXJlIHRhYmxlIGZvcgogCQkgICBjb25udHJhY2tzIHdoaWNoIHdlcmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZGV2aWNlLAogCQkgICBhbmQgZm9yZ2V0IHRoZW0uICovCi0JCUlQX05GX0FTU0VSVChkZXYtPmlmaW5kZXggIT0gMCk7CisJCU5GX0NUX0FTU0VSVChkZXYtPmlmaW5kZXggIT0gMCk7CiAKLQkJaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKGRldmljZV9jbXAsICh2b2lkICopKGxvbmcpZGV2LT5pZmluZGV4KTsKKwkJbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGRldmljZV9jbXAsICh2b2lkICopKGxvbmcpZGV2LT5pZmluZGV4KTsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC0xNzQsOSArMTUzLDkgQEAKIAkJLyogSVAgYWRkcmVzcyB3YXMgZGVsZXRlZC4gIFNlYXJjaCBlbnRpcmUgdGFibGUgZm9yCiAJCSAgIGNvbm50cmFja3Mgd2hpY2ggd2VyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBkZXZpY2UsCiAJCSAgIGFuZCBmb3JnZXQgdGhlbS4gKi8KLQkJSVBfTkZfQVNTRVJUKGRldi0+aWZpbmRleCAhPSAwKTsKKwkJTkZfQ1RfQVNTRVJUKGRldi0+aWZpbmRleCAhPSAwKTsKIAotCQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoZGV2aWNlX2NtcCwgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOworCQluZl9jdF9pdGVyYXRlX2NsZWFudXAoZGV2aWNlX2NtcCwgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOwogCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTE5NCw3ICsxNzMsNyBAQAogCS5uYW1lCQk9ICJNQVNRVUVSQURFIiwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBtYXNxdWVyYWRlX3RhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCisJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcsCiAJLmNoZWNrZW50cnkJPSBtYXNxdWVyYWRlX2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKaW5kZXggZmQ3YWFhMy4uMDY4YzY5YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCkBAIC0xNiwxMSArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+Ci0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jZW5kaWYKIAogI2RlZmluZSBNT0RVTEVOQU1FICJORVRNQVAiCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC00MCw3ICszNiw3IEBACiAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CiAKIAlpZiAoIShtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykpIHsKIAkJREVCVUdQKE1PRFVMRU5BTUUiOmNoZWNrOiBiYWQgTUFQX0lQUy5cbiIpOwpAQCAtNjEsMzkgKzU3LDM5IEBACiAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OworCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlfX2JlMzIgbmV3X2lwLCBuZXRtYXNrOwotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisJc3RydWN0IG5mX25hdF9yYW5nZSBuZXdyYW5nZTsKIAotCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HCisJTkZfQ1RfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKIAkJICAgICB8fCBob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORwogCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOworCWN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKIAogCW5ldG1hc2sgPSB+KG1yLT5yYW5nZVswXS5taW5faXAgXiBtci0+cmFuZ2VbMF0ubWF4X2lwKTsKIAogCWlmIChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKQotCQluZXdfaXAgPSAoKnBza2IpLT5uaC5pcGgtPmRhZGRyICYgfm5ldG1hc2s7CisJCW5ld19pcCA9IGlwX2hkcigqcHNrYiktPmRhZGRyICYgfm5ldG1hc2s7CiAJZWxzZQotCQluZXdfaXAgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyICYgfm5ldG1hc2s7CisJCW5ld19pcCA9IGlwX2hkcigqcHNrYiktPnNhZGRyICYgfm5ldG1hc2s7CiAJbmV3X2lwIHw9IG1yLT5yYW5nZVswXS5taW5faXAgJiBuZXRtYXNrOwogCi0JbmV3cmFuZ2UgPSAoKHN0cnVjdCBpcF9uYXRfcmFuZ2UpCisJbmV3cmFuZ2UgPSAoKHN0cnVjdCBuZl9uYXRfcmFuZ2UpCiAJCXsgbXItPnJhbmdlWzBdLmZsYWdzIHwgSVBfTkFUX1JBTkdFX01BUF9JUFMsCiAJCSAgbmV3X2lwLCBuZXdfaXAsCiAJCSAgbXItPnJhbmdlWzBdLm1pbiwgbXItPnJhbmdlWzBdLm1heCB9KTsKIAogCS8qIEhhbmQgbW9kaWZpZWQgcmFuZ2UgdG8gZ2VuZXJpYyBzZXR1cC4gKi8KLQlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CisJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOwogfQogCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCB0YXJnZXRfbW9kdWxlID0gewogCS5uYW1lIAkJPSBNT0RVTEVOQU1FLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0IAk9IHRhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCisJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSB8CiAJCQkgICgxIDw8IE5GX0lQX0xPQ0FMX09VVCksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKaW5kZXggYzJiNmI4MC4uNjhjYzc2YTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKQEAgLTE5LDExICsxOSw3IEBACiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNlbmRpZgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtNDMsNyArMzksNyBAQAogCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKIAogCWlmIChtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykgewogCQlERUJVR1AoInJlZGlyZWN0X2NoZWNrOiBiYWQgTUFQX0lQUy5cbiIpOwpAQCAtNjQsMTcgKzYwLDE3IEBACiAJCWNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCV9fYmUzMiBuZXdkc3Q7Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSBuZXdyYW5nZTsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIG5ld3JhbmdlOwogCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKKwlORl9DVF9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORwogCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKIAotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0JSVBfTkZfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEKSk7CisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOworCU5GX0NUX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCkpOwogCiAJLyogTG9jYWwgcGFja2V0czogbWFrZSB0aGVtIGdvIHRvIGxvb3BiYWNrICovCiAJaWYgKGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKQpAQCAtOTYsMjAgKzkyLDIwIEBACiAJfQogCiAJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KLQluZXdyYW5nZSA9ICgoc3RydWN0IGlwX25hdF9yYW5nZSkKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKIAkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKIAkJICBuZXdkc3QsIG5ld2RzdCwKIAkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHJlZGlyZWN0X3JlZyA9IHsKIAkubmFtZQkJPSAiUkVESVJFQ1QiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IHJlZGlyZWN0X3RhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCisJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSwKIAkuY2hlY2tlbnRyeQk9IHJlZGlyZWN0X2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggODBmNzM5ZS4uOTA0MWUwNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC0xLDcgKzEsNSBAQAogLyoKICAqIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3IgcmVqZWN0aW5nIHBhY2tldHMuCi0gKiBBZGRlZCBzdXBwb3J0IGZvciBjdXN0b21pemVkIHJlamVjdCBwYWNrZXRzIChKb3pzZWYgS2FkbGVjc2lrKS4KLSAqIEFkZGVkIHN1cHBvcnQgZm9yIElDTVAgdHlwZS0zLWNvZGUtMTMgKE1hY2llaiBTb2x0eXNpYWspLiBbUkZDIDE4MTJdCiAgKi8KIAogLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbApAQCAtNDMsNyArNDEsNyBAQAogc3RhdGljIHZvaWQgc2VuZF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLCBpbnQgaG9vaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IG9sZHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqbmlwaDsKIAlzdHJ1Y3QgdGNwaGRyIF9vdGNwaCwgKm90aCwgKnRjcGg7CiAJX19iZTE2IHRtcF9wb3J0OwogCV9fYmUzMiB0bXBfYWRkcjsKQEAgLTUxLDEwICs0OSwxMCBAQAogCXVuc2lnbmVkIGludCBhZGRyX3R5cGU7CiAKIAkvKiBJUCBoZWFkZXIgY2hlY2tzOiBmcmFnbWVudC4gKi8KLQlpZiAob2xkc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKKwlpZiAoaXBfaGRyKG9sZHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKIAkJcmV0dXJuOwogCi0Jb3RoID0gc2tiX2hlYWRlcl9wb2ludGVyKG9sZHNrYiwgb2xkc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJb3RoID0gc2tiX2hlYWRlcl9wb2ludGVyKG9sZHNrYiwgaXBfaGRybGVuKG9sZHNrYiksCiAJCQkJIHNpemVvZihfb3RjcGgpLCAmX290Y3BoKTsKIAlpZiAob3RoID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTY0LDcgKzYyLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogQ2hlY2sgY2hlY2tzdW0gKi8KLQlpZiAobmZfaXBfY2hlY2tzdW0ob2xkc2tiLCBob29rLCBpcGgtPmlobCAqIDQsIElQUFJPVE9fVENQKSkKKwlpZiAobmZfaXBfY2hlY2tzdW0ob2xkc2tiLCBob29rLCBpcF9oZHJsZW4ob2xkc2tiKSwgSVBQUk9UT19UQ1ApKQogCQlyZXR1cm47CiAKIAkvKiBXZSBuZWVkIGEgbGluZWFyLCB3cml0ZWFibGUgc2tiLiAgV2UgYWxzbyBuZWVkIHRvIGV4cGFuZApAQCAtODQsMjAgKzgyLDIxIEBACiAJc2tiX3NoaW5mbyhuc2tiKS0+Z3NvX3NlZ3MgPSAwOwogCXNrYl9zaGluZm8obnNrYiktPmdzb190eXBlID0gMDsKIAotCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgodV9pbnQzMl90Kiluc2tiLT5uaC5pcGggKyBuc2tiLT5uaC5pcGgtPmlobCk7CisJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihuc2tiKSArIGlwX2hkcmxlbihuc2tiKSk7CiAKIAkvKiBTd2FwIHNvdXJjZSBhbmQgZGVzdCAqLwotCXRtcF9hZGRyID0gbnNrYi0+bmguaXBoLT5zYWRkcjsKLQluc2tiLT5uaC5pcGgtPnNhZGRyID0gbnNrYi0+bmguaXBoLT5kYWRkcjsKLQluc2tiLT5uaC5pcGgtPmRhZGRyID0gdG1wX2FkZHI7CisJbmlwaCA9IGlwX2hkcihuc2tiKTsKKwl0bXBfYWRkciA9IG5pcGgtPnNhZGRyOworCW5pcGgtPnNhZGRyID0gbmlwaC0+ZGFkZHI7CisJbmlwaC0+ZGFkZHIgPSB0bXBfYWRkcjsKIAl0bXBfcG9ydCA9IHRjcGgtPnNvdXJjZTsKIAl0Y3BoLT5zb3VyY2UgPSB0Y3BoLT5kZXN0OwogCXRjcGgtPmRlc3QgPSB0bXBfcG9ydDsKIAogCS8qIFRydW5jYXRlIHRvIGxlbmd0aCAobm8gZGF0YSkgKi8KIAl0Y3BoLT5kb2ZmID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLzQ7Ci0Jc2tiX3RyaW0obnNrYiwgbnNrYi0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7Ci0JbnNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMobnNrYi0+bGVuKTsKKwlza2JfdHJpbShuc2tiLCBpcF9oZHJsZW4obnNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCW5pcGgtPnRvdF9sZW4gPSBodG9ucyhuc2tiLT5sZW4pOwogCiAJaWYgKHRjcGgtPmFjaykgewogCQluZWVkc19hY2sgPSAwOwpAQCAtMTA1LDkgKzEwNCw5IEBACiAJCXRjcGgtPmFja19zZXEgPSAwOwogCX0gZWxzZSB7CiAJCW5lZWRzX2FjayA9IDE7Ci0JCXRjcGgtPmFja19zZXEgPSBodG9ubChudG9obChvdGgtPnNlcSkgKyBvdGgtPnN5biArIG90aC0+ZmluCi0JCQkJICAgICAgKyBvbGRza2ItPmxlbiAtIG9sZHNrYi0+bmguaXBoLT5paGwqNAotCQkJCSAgICAgIC0gKG90aC0+ZG9mZjw8MikpOworCQl0Y3BoLT5hY2tfc2VxID0gaHRvbmwobnRvaGwob3RoLT5zZXEpICsgb3RoLT5zeW4gKyBvdGgtPmZpbiArCisJCQkJICAgICAgb2xkc2tiLT5sZW4gLSBpcF9oZHJsZW4ob2xkc2tiKSAtCisJCQkJICAgICAgKG90aC0+ZG9mZiA8PCAyKSk7CiAJCXRjcGgtPnNlcSA9IDA7CiAJfQogCkBAIC0xMjIsMTQgKzEyMSwxMyBAQAogCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW0gKi8KIAl0Y3BoLT5jaGVjayA9IDA7CiAJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2soc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCSAgIG5za2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJICAgbnNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkgICBuaXBoLT5zYWRkciwgbmlwaC0+ZGFkZHIsCiAJCQkJICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGNwaCwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgMCkpOwogCiAJLyogU2V0IERGLCBpZCA9IDAgKi8KLQluc2tiLT5uaC5pcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwotCW5za2ItPm5oLmlwaC0+aWQgPSAwOworCW5pcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCW5pcGgtPmlkID0gMDsKIAogCWFkZHJfdHlwZSA9IFJUTl9VTlNQRUM7CiAJaWYgKGhvb2sgIT0gTkZfSVBfRk9SV0FSRApAQCAtMTQ1LDEyICsxNDMsMTEgQEAKIAluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogQWRqdXN0IElQIFRUTCAqLwotCW5za2ItPm5oLmlwaC0+dHRsID0gZHN0X21ldHJpYyhuc2tiLT5kc3QsIFJUQVhfSE9QTElNSVQpOworCW5pcGgtPnR0bCA9IGRzdF9tZXRyaWMobnNrYi0+ZHN0LCBSVEFYX0hPUExJTUlUKTsKIAogCS8qIEFkanVzdCBJUCBjaGVja3N1bSAqLwotCW5za2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwotCW5za2ItPm5oLmlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKiluc2tiLT5uaC5pcGgsCi0JCQkJCSAgIG5za2ItPm5oLmlwaC0+aWhsKTsKKwluaXBoLT5jaGVjayA9IDA7CisJbmlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oc2tiX25ldHdvcmtfaGVhZGVyKG5za2IpLCBuaXBoLT5paGwpOwogCiAJLyogIk5ldmVyIGhhcHBlbnMiICovCiAJaWYgKG5za2ItPmxlbiA+IGRzdF9tdHUobnNrYi0+ZHN0KSkKQEAgLTE4Miw3ICsxNzksNyBAQAogCiAJLyogT3VyIG5haXZlIHJlc3BvbnNlIGNvbnN0cnVjdGlvbiBkb2Vzbid0IGRlYWwgd2l0aCBJUAogCSAgIG9wdGlvbnMsIGFuZCBwcm9iYWJseSBzaG91bGRuJ3QgdHJ5LiAqLwotCWlmICgoKnBza2IpLT5uaC5pcGgtPmlobDw8MiAhPSBzaXplb2Yoc3RydWN0IGlwaGRyKSkKKwlpZiAoaXBfaGRybGVuKCpwc2tiKSAhPSBzaXplb2Yoc3RydWN0IGlwaGRyKSkKIAkJcmV0dXJuIE5GX0RST1A7CiAKIAkvKiBXQVJOSU5HOiBUaGlzIGNvZGUgY2F1c2VzIHJlZW50cnkgd2l0aGluIGlwdGFibGVzLgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwppbmRleCBiZDQ0MDRlLi41MTFlNWZmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwpAQCAtNywyMSArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDAxMDMyMCBNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQHdsdWcud2VzdGJvLnNlPgotICogCSogY29waWVkIGlwdF9CQUxBTkNFLmMgdG8gaXB0X1NBTUUuYyBhbmQgY2hhbmdlZCBhIGZldyB0aGluZ3MuCi0gKiAwMTA3MjggTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KLSAqIAkqIGFkZGVkIC0tbm9kc3QgdG8gbm90IGluY2x1ZGUgZGVzdGluYXRpb24taXAgaW4gbmV3IHNvdXJjZQotICogCSAgY2FsY3VsYXRpb25zLgotICoJKiBhZGRlZCBzb21lIG1vcmUgc2FuaXR5LWNoZWNrcy4KLSAqIDAxMDcyOSBNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQHdsdWcud2VzdGJvLnNlPgotICogCSogZml4ZWQgYSBidWdneSBpZi1zdGF0ZW1lbnQgaW4gc2FtZV9jaGVjaygpLCBzaG91bGQgaGF2ZQotICogCSAgdXNlZCBudG9obCgpIGJ1dCBkaWRuJ3QuCi0gKiAJKiBhZGRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSByYW5nZXMuIElQVF9TQU1FX01BWF9SQU5HRSBpcwotICogCSAgZGVmaW5lZCBpbiBsaW51eC9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmgKLSAqIAkgIGFuZCBpcyBjdXJyZW50bHkgc2V0IHRvIDEwLgotICogCSogYWRkZWQgc3VwcG9ydCBmb3IgMS1hZGRyZXNzIHJhbmdlLCBuaWNlIHRvIGhhdmUgbm93IHRoYXQKLSAqIAkgIHdlIGhhdmUgbXVsdGlwbGUgcmFuZ2VzLgogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgpAQCAtMzUsMTEgKzIwLDcgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMTM4LDE3ICsxMTksMTcgQEAKIAkJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQljb25zdCB2b2lkICp0YXJnaW5mbykKIHsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJdV9pbnQzMl90IHRtcGlwLCBhaW5kZXg7CiAJX19iZTMyIG5ld19pcDsKIAljb25zdCBzdHJ1Y3QgaXB0X3NhbWVfaW5mbyAqc2FtZSA9IHRhcmdpbmZvOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7Ci0JY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDsKKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIG5ld3JhbmdlOworCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQ7CiAKLQlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORyB8fAorCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HIHx8CiAJCQlob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORyk7Ci0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKwljdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CiAKIAl0ID0gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZTsKIApAQCAtMTU3LDE3ICsxMzgsMTAgQEAKIAkgICBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgaW5kZXggaW4gc2FtZS0+aXBhcnJheSB3aGljaAogCSAgIGhvbGRzIHRoZSBpcGFkZHJlc3Mgd2Ugc2hvdWxkIHVzZSAqLwogCi0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKIAl0bXBpcCA9IG50b2hsKHQtPnNyYy51My5pcCk7CiAKIAlpZiAoIShzYW1lLT5pbmZvICYgSVBUX1NBTUVfTk9EU1QpKQogCQl0bXBpcCArPSBudG9obCh0LT5kc3QudTMuaXApOwotI2Vsc2UKLQl0bXBpcCA9IG50b2hsKHQtPnNyYy5pcCk7Ci0KLQlpZiAoIShzYW1lLT5pbmZvICYgSVBUX1NBTUVfTk9EU1QpKQotCQl0bXBpcCArPSBudG9obCh0LT5kc3QuaXApOwotI2VuZGlmCiAJYWluZGV4ID0gdG1waXAgJSBzYW1lLT5pcG51bTsKIAogCW5ld19pcCA9IGh0b25sKHNhbWUtPmlwYXJyYXlbYWluZGV4XSk7CkBAIC0xNzgsMTMgKzE1MiwxMyBAQAogCQkJTklQUVVBRChuZXdfaXApKTsKIAogCS8qIFRyYW5zZmVyIGZyb20gb3JpZ2luYWwgcmFuZ2UuICovCi0JbmV3cmFuZ2UgPSAoKHN0cnVjdCBpcF9uYXRfcmFuZ2UpCisJbmV3cmFuZ2UgPSAoKHN0cnVjdCBuZl9uYXRfcmFuZ2UpCiAJCXsgc2FtZS0+cmFuZ2VbMF0uZmxhZ3MsIG5ld19pcCwgbmV3X2lwLAogCQkgIC8qIEZJWE1FOiBVc2UgcG9ydHMgZnJvbSBjb3JyZWN0IHJhbmdlISAqLwogCQkgIHNhbWUtPnJhbmdlWzBdLm1pbiwgc2FtZS0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHNhbWVfcmVnID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggY2VkZjlmNy4uMGFkMDJmMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC0yOSwxMyArMjksMTMgQEAKICAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqdG9zaW5mbyA9IHRhcmdpbmZvOwotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKCpwc2tiKTsKIAogCWlmICgoaXBoLT50b3MgJiBJUFRPU19UT1NfTUFTSykgIT0gdG9zaW5mby0+dG9zKSB7CiAJCV9fdTggb2xkdG9zOwogCQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJCXJldHVybiBORl9EUk9QOwotCQlpcGggPSAoKnBza2IpLT5uaC5pcGg7CisJCWlwaCA9IGlwX2hkcigqcHNrYik7CiAJCW9sZHRvcyA9IGlwaC0+dG9zOwogCQlpcGgtPnRvcyA9IChpcGgtPnRvcyAmIElQVE9TX1BSRUNfTUFTSykgfCB0b3NpbmZvLT50b3M7CiAJCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGh0b25zKG9sZHRvcyksIGh0b25zKGlwaC0+dG9zKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwppbmRleCA2NGJlMzFjLi5hOTkxZWM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCiAJCXJldHVybiBORl9EUk9QOwogCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOworCWlwaCA9IGlwX2hkcigqcHNrYik7CiAKIAlzd2l0Y2ggKGluZm8tPm1vZGUpIHsKIAkJY2FzZSBJUFRfVFRMX1NFVDoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKaW5kZXggOWFjYzAxOC4uMjNiNjA3YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKQEAgLTIsMjAgKzIsNiBAQAogICogbmV0ZmlsdGVyIG1vZHVsZSBmb3IgdXNlcnNwYWNlIHBhY2tldCBsb2dnaW5nIGRhZW1vbnMKICAqCiAgKiAoQykgMjAwMC0yMDA0IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIDIwMDAvMDkvMjIgdWxvZy1jcHJhbmdlIGZlYXR1cmUgYWRkZWQKLSAqIDIwMDEvMDEvMDQgaW4ta2VybmVsIHF1ZXVlIGFzIHByb3Bvc2VkIGJ5IFNlYmFzdGlhbiBaYW5kZXIKLSAqIAkJCQkJCTx6YW5kZXJAZm9rdXMuZ21kLmRlPgotICogMjAwMS8wMS8zMCBwZXItcnVsZSBubGdyb3VwIGNvbmZsaWN0cyB3aXRoIGdsb2JhbCBxdWV1ZS4KLSAqICAgICAgICAgICAgbmxncm91cCBub3cgZ2xvYmFsIChzeXNjdGwpCi0gKiAyMDAxLzA0LzE5IHVsb2ctcXVldWUgcmV3b3JrZWQsIG5vdyBmaXhlZCBidWZmZXIgc2l6ZSBzcGVjaWZpZWQgYXQKLSAqIAkgICAgICBtb2R1bGUgbG9hZHRpbWUgLUhXCi0gKiAyMDAyLzA3LzA3IHJlbW92ZSBicm9rZW4gbmZsb2dfcmN2KCkgZnVuY3Rpb24gLUhXCi0gKiAyMDAyLzA4LzI5IGZpeCBzaGlmdGVkL3Vuc2hpZnRlZCBubGdyb3VwIGJ1ZyAtSFcKLSAqIDIwMDIvMTAvMzAgZml4IHVuaW5pdGlhbGl6ZWQgbWFjX2xlbiBmaWVsZCAtIDxBbmRlcnMgSy4gUGVkZXJzZW4+Ci0gKiAyMDA0LzEwLzI1IGZpeCBlcnJvbmVvdXMgY2FsY3VsYXRpb24gb2YgJ2xlbicgcGFyYW1ldGVyIHRvIE5MTVNHX1BVVAotICoJICAgICAgcmVzdWx0aW5nIGluIGJvZ3VzICdlcnJvciBkdXJpbmcgTkxNU0dfUFVUJyBtZXNzYWdlcy4KLSAqCiAgKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCiAgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CiAgKgpAQCAtNDIsOCArMjgsNiBAQAogICogZmx1c2h0aW1lb3V0OgogICogICBTcGVjaWZ5LCBhZnRlciBob3cgbWFueSBodW5kcmVkdGhzIG9mIGEgc2Vjb25kIHRoZSBxdWV1ZSBzaG91bGQgYmUKICAqICAgZmx1c2hlZCBldmVuIGlmIGl0IGlzIG5vdCBmdWxsIHlldC4KLSAqCi0gKiBpcHRfVUxPRy5jLHYgMS4yMiAyMDAyLzEwLzMwIDA5OjA3OjMxIGxhZm9yZ2UgRXhwCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTg3LDYgKzE3MSw3IEBACiAJdWxvZ19wYWNrZXRfbXNnX3QgKnBtOwogCXNpemVfdCBzaXplLCBjb3B5X2xlbjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKIAogCS8qIGZmcyA9PSBmaW5kIGZpcnN0IGJpdCBzZXQsIG5lY2Vzc2FyeSBiZWNhdXNlIHVzZXJzcGFjZQogCSAqIGlzIGFscmVhZHkgc2hpZnRpbmcgZ3JvdXBudW1iZXIsIGJ1dCB3ZSBuZWVkIHVuc2hpZnRlZC4KQEAgLTIzMiwxMyArMjE3LDE0IEBACiAJcG0gPSBOTE1TR19EQVRBKG5saCk7CiAKIAkvKiBXZSBtaWdodCBub3QgaGF2ZSBhIHRpbWVzdGFtcCwgZ2V0IG9uZSAqLwotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjID09IDApCisJaWYgKHNrYi0+dHN0YW1wLnR2NjQgPT0gMCkKIAkJX19uZXRfdGltZXN0YW1wKChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYik7CiAKIAkvKiBjb3B5IGhvb2ssIHByZWZpeCwgdGltZXN0YW1wLCBwYXlsb2FkLCBldGMuICovCiAJcG0tPmRhdGFfbGVuID0gY29weV9sZW47Ci0JcHV0X3VuYWxpZ25lZChza2ItPnRzdGFtcC5vZmZfc2VjLCAmcG0tPnRpbWVzdGFtcF9zZWMpOwotCXB1dF91bmFsaWduZWQoc2tiLT50c3RhbXAub2ZmX3VzZWMsICZwbS0+dGltZXN0YW1wX3VzZWMpOworCXR2ID0ga3RpbWVfdG9fdGltZXZhbChza2ItPnRzdGFtcCk7CisJcHV0X3VuYWxpZ25lZCh0di50dl9zZWMsICZwbS0+dGltZXN0YW1wX3NlYyk7CisJcHV0X3VuYWxpZ25lZCh0di50dl91c2VjLCAmcG0tPnRpbWVzdGFtcF91c2VjKTsKIAlwdXRfdW5hbGlnbmVkKHNrYi0+bWFyaywgJnBtLT5tYXJrKTsKIAlwbS0+aG9vayA9IGhvb2tudW07CiAJaWYgKHByZWZpeCAhPSBOVUxMKQpAQCAtMjQ5LDkgKzIzNSw5IEBACiAJCSoocG0tPnByZWZpeCkgPSAnXDAnOwogCiAJaWYgKGluICYmIGluLT5oYXJkX2hlYWRlcl9sZW4gPiAwCi0JICAgICYmIHNrYi0+bWFjLnJhdyAhPSAodm9pZCAqKSBza2ItPm5oLmlwaAorCSAgICAmJiBza2ItPm1hY19oZWFkZXIgIT0gc2tiLT5uZXR3b3JrX2hlYWRlcgogCSAgICAmJiBpbi0+aGFyZF9oZWFkZXJfbGVuIDw9IFVMT0dfTUFDX0xFTikgewotCQltZW1jcHkocG0tPm1hYywgc2tiLT5tYWMucmF3LCBpbi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJbWVtY3B5KHBtLT5tYWMsIHNrYl9tYWNfaGVhZGVyKHNrYiksIGluLT5oYXJkX2hlYWRlcl9sZW4pOwogCQlwbS0+bWFjX2xlbiA9IGluLT5oYXJkX2hlYWRlcl9sZW47CiAJfSBlbHNlCiAJCXBtLT5tYWNfbGVuID0gMDsKQEAgLTM2MywxMiArMzQ5LDUyIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgY29tcGF0X2lwdF91bG9nX2luZm8geworCWNvbXBhdF91aW50X3QJbmxfZ3JvdXA7CisJY29tcGF0X3NpemVfdAljb3B5X3JhbmdlOworCWNvbXBhdF9zaXplX3QJcXRocmVzaG9sZDsKKwljaGFyCQlwcmVmaXhbVUxPR19QUkVGSVhfTEVOXTsKK307CisKK3N0YXRpYyB2b2lkIGNvbXBhdF9mcm9tX3VzZXIodm9pZCAqZHN0LCB2b2lkICpzcmMpCit7CisJc3RydWN0IGNvbXBhdF9pcHRfdWxvZ19pbmZvICpjbCA9IHNyYzsKKwlzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyBsID0geworCQkubmxfZ3JvdXAJPSBjbC0+bmxfZ3JvdXAsCisJCS5jb3B5X3JhbmdlCT0gY2wtPmNvcHlfcmFuZ2UsCisJCS5xdGhyZXNob2xkCT0gY2wtPnF0aHJlc2hvbGQsCisJfTsKKworCW1lbWNweShsLnByZWZpeCwgY2wtPnByZWZpeCwgc2l6ZW9mKGwucHJlZml4KSk7CisJbWVtY3B5KGRzdCwgJmwsIHNpemVvZihsKSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X3RvX3VzZXIodm9pZCBfX3VzZXIgKmRzdCwgdm9pZCAqc3JjKQoreworCXN0cnVjdCBpcHRfdWxvZ19pbmZvICpsID0gc3JjOworCXN0cnVjdCBjb21wYXRfaXB0X3Vsb2dfaW5mbyBjbCA9IHsKKwkJLm5sX2dyb3VwCT0gbC0+bmxfZ3JvdXAsCisJCS5jb3B5X3JhbmdlCT0gbC0+Y29weV9yYW5nZSwKKwkJLnF0aHJlc2hvbGQJPSBsLT5xdGhyZXNob2xkLAorCX07CisKKwltZW1jcHkoY2wucHJlZml4LCBsLT5wcmVmaXgsIHNpemVvZihjbC5wcmVmaXgpKTsKKwlyZXR1cm4gY29weV90b191c2VyKGRzdCwgJmNsLCBzaXplb2YoY2wpKSA/IC1FRkFVTFQgOiAwOworfQorI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKwogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X3Vsb2dfcmVnID0gewogCS5uYW1lCQk9ICJVTE9HIiwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBpcHRfdWxvZ190YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF91bG9nX2luZm8pLAogCS5jaGVja2VudHJ5CT0gaXB0X3Vsb2dfY2hlY2tlbnRyeSwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pcHRfdWxvZ19pbmZvKSwKKwkuY29tcGF0X2Zyb21fdXNlciA9IGNvbXBhdF9mcm9tX3VzZXIsCisJLmNvbXBhdF90b191c2VyCT0gY29tcGF0X3RvX3VzZXIsCisjZW5kaWYKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCkBAIC0zOTAsMTQgKzQxNiwxMSBAQAogCX0KIAogCS8qIGluaXRpYWxpemUgdWxvZ19idWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IFVMT0dfTUFYTkxHUk9VUFM7IGkrKykgewotCQlpbml0X3RpbWVyKCZ1bG9nX2J1ZmZlcnNbaV0udGltZXIpOwotCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZnVuY3Rpb24gPSB1bG9nX3RpbWVyOwotCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZGF0YSA9IGk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBVTE9HX01BWE5MR1JPVVBTOyBpKyspCisJCXNldHVwX3RpbWVyKCZ1bG9nX2J1ZmZlcnNbaV0udGltZXIsIHVsb2dfdGltZXIsIGkpOwogCiAJbmZsb2dubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX05GTE9HLCBVTE9HX01BWE5MR1JPVVBTLCBOVUxMLAotCQkJCQlUSElTX01PRFVMRSk7CisJCQkJCU5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoIW5mbG9nbmwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKaW5kZXggY2ZhMDQ3Mi4uYTY1MmExNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYwpAQCAtMzMsNyArMzMsNyBAQAogCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCWludCByZXQgPSAxOwogCiAJaWYgKGluZm8tPnNvdXJjZSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCmluZGV4IDM3NTA4YjIuLjI2MjE4MTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwpAQCAtMSw3ICsxLDUgQEAKIC8qIElQIHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiB0aGUgSVB2NCBhbmQgVENQIEVDTiBiaXRzCiAgKgotICogaXB0X2Vjbi5jLHYgMS4zIDIwMDIvMDUvMjkgMTU6MDk6MDAgbGFmb3JnZSBFeHAKLSAqCiAgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xMSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KQEAgLTI2LDcgKzI1LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX2lwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICBjb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICplaW5mbykKIHsKLQlyZXR1cm4gKChza2ItPm5oLmlwaC0+dG9zJklQVF9FQ05fSVBfTUFTSykgPT0gZWluZm8tPmlwX2VjdCk7CisJcmV0dXJuIChpcF9oZHIoc2tiKS0+dG9zICYgSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBtYXRjaF90Y3AoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTM4LDggKzM3LDcgQEAKIAkvKiBJbiBwcmFjdGljZSwgVENQIG1hdGNoIGRvZXMgdGhpcywgc28gY2FuJ3QgZmFpbC4gIEJ1dCBsZXQncwogCSAqIGJlIGdvb2QgY2l0aXplbnMuCiAJICovCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksIHNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJaWYgKHRoID09IE5VTEwpIHsKIAkJKmhvdGRyb3AgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTgwLDcgKzc4LDcgQEAKIAkJCXJldHVybiAwOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikpIHsKLQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKKwkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKIAkJCXJldHVybiAwOwogCQlpZiAoIW1hdGNoX3RjcChza2IsIGluZm8sIGhvdGRyb3ApKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCmluZGV4IGJjNWQ1ZTYuLjMzYWY5ZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfaXByYW5nZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCWlmIChpbmZvLT5mbGFncyAmIElQUkFOR0VfU1JDKSB7CiAJCWlmICgoKG50b2hsKGlwaC0+c2FkZHIpIDwgbnRvaGwoaW5mby0+c3JjLm1pbl9pcCkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwppbmRleCBhZWNiOWM0Li4xNWE5ZThiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKQEAgLTE4MywxMSArMTgzLDExIEBACiAJaW50IHJldCA9IGluZm8tPmludmVydDsKIAogCWlmIChpbmZvLT5zaWRlID09IElQVF9SRUNFTlRfREVTVCkKLQkJYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwkJYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAllbHNlCi0JCWFkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCWFkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAKLQl0dGwgPSBza2ItPm5oLmlwaC0+dHRsOworCXR0bCA9IGlwX2hkcihza2IpLT50dGw7CiAJLyogdXNlIFRUTCBhcyBzZWVuIGJlZm9yZSBmb3J3YXJkaW5nICovCiAJaWYgKG91dCAmJiAhc2tiLT5zaykKIAkJdHRsKys7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwppbmRleCA1ZDMzYjUxLi5kMzE0ODQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3Rvc19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCi0JcmV0dXJuIChza2ItPm5oLmlwaC0+dG9zID09IGluZm8tPnRvcykgXiBpbmZvLT5pbnZlcnQ7CisJcmV0dXJuIChpcF9oZHIoc2tiKS0+dG9zID09IGluZm8tPnRvcykgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdG9zX21hdGNoID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKaW5kZXggMWVjYTlmNC4uYWIwMmQ5ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCkBAIC0xLDcgKzEsNSBAQAogLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBUVEwKICAqCi0gKiBpcHRfdHRsLmMsdiAxLjUgMjAwMC8xMS8xMyAxMToxNjowOCBsYWZvcmdlIEV4cAotICoKICAqIChDKSAyMDAwLDIwMDEgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTI2LDE5ICsyNCwyMCBAQAogCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3R0bF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHU4IHR0bCA9IGlwX2hkcihza2IpLT50dGw7CiAKIAlzd2l0Y2ggKGluZm8tPm1vZGUpIHsKIAkJY2FzZSBJUFRfVFRMX0VROgotCQkJcmV0dXJuIChza2ItPm5oLmlwaC0+dHRsID09IGluZm8tPnR0bCk7CisJCQlyZXR1cm4gKHR0bCA9PSBpbmZvLT50dGwpOwogCQkJYnJlYWs7CiAJCWNhc2UgSVBUX1RUTF9ORToKLQkJCXJldHVybiAoIShza2ItPm5oLmlwaC0+dHRsID09IGluZm8tPnR0bCkpOworCQkJcmV0dXJuICghKHR0bCA9PSBpbmZvLT50dGwpKTsKIAkJCWJyZWFrOwogCQljYXNlIElQVF9UVExfTFQ6Ci0JCQlyZXR1cm4gKHNrYi0+bmguaXBoLT50dGwgPCBpbmZvLT50dGwpOworCQkJcmV0dXJuICh0dGwgPCBpbmZvLT50dGwpOwogCQkJYnJlYWs7CiAJCWNhc2UgSVBUX1RUTF9HVDoKLQkJCXJldHVybiAoc2tiLT5uaC5pcGgtPnR0bCA+IGluZm8tPnR0bCk7CisJCQlyZXR1cm4gKHR0bCA+IGluZm8tPnR0bCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlwdF90dGw6IHVua25vd24gbW9kZSAlZFxuIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKaW5kZXggZDFkNjFlOS4uNDI3Mjg5MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtMTAyLDcgKzEwMyw3IEBACiB7CiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJICAgIHx8IGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKCJpcHRfaG9vazogaGFwcHkgY3JhY2tpbmcuXG4iKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKaW5kZXggOThiNjZlZi4uOTI3ODgwMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKQEAgLTcsOCArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIEV4dGVuZGVkIHRvIGFsbCBmaXZlIG5ldGZpbHRlciBob29rcyBieSBCcmFkIENoYXBtYW4gJiBIYXJhbGQgV2VsdGUKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgpAQCAtMTcsNiArMTUsNyBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTEzMCwxMyArMTI5LDE0IEBACiAJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXVuc2lnbmVkIGludCByZXQ7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAJdV9pbnQ4X3QgdG9zOwogCV9fYmUzMiBzYWRkciwgZGFkZHI7CiAJdV9pbnQzMl90IG1hcms7CiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkgICAgfHwgaXBfaGRybGVuKCpwc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoImlwdF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtMTQ0LDE5ICsxNDQsMjMgQEAKIAogCS8qIFNhdmUgdGhpbmdzIHdoaWNoIGNvdWxkIGFmZmVjdCByb3V0ZSAqLwogCW1hcmsgPSAoKnBza2IpLT5tYXJrOwotCXNhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5zYWRkcjsKLQlkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7Ci0JdG9zID0gKCpwc2tiKS0+bmguaXBoLT50b3M7CisJaXBoID0gaXBfaGRyKCpwc2tiKTsKKwlzYWRkciA9IGlwaC0+c2FkZHI7CisJZGFkZHIgPSBpcGgtPmRhZGRyOworCXRvcyA9IGlwaC0+dG9zOwogCiAJcmV0ID0gaXB0X2RvX3RhYmxlKHBza2IsIGhvb2ssIGluLCBvdXQsICZwYWNrZXRfbWFuZ2xlcik7CiAJLyogUmVyb3V0ZSBmb3IgQU5ZIGNoYW5nZS4gKi8KLQlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJiByZXQgIT0gTkZfUVVFVUUKLQkgICAgJiYgKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIgIT0gc2FkZHIKLQkJfHwgKCpwc2tiKS0+bmguaXBoLT5kYWRkciAhPSBkYWRkcgotCQl8fCAoKnBza2IpLT5tYXJrICE9IG1hcmsKLQkJfHwgKCpwc2tiKS0+bmguaXBoLT50b3MgIT0gdG9zKSkKLQkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihwc2tiLCBSVE5fVU5TUEVDKSkKLQkJCXJldCA9IE5GX0RST1A7CisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYgcmV0ICE9IE5GX1FVRVVFKSB7CisJCWlwaCA9IGlwX2hkcigqcHNrYik7CisKKwkJaWYgKGlwaC0+c2FkZHIgIT0gc2FkZHIgfHwKKwkJICAgIGlwaC0+ZGFkZHIgIT0gZGFkZHIgfHwKKwkJICAgICgqcHNrYiktPm1hcmsgIT0gbWFyayB8fAorCQkgICAgaXBoLT50b3MgIT0gdG9zKQorCQkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihwc2tiLCBSVE5fVU5TUEVDKSkKKwkJCQlyZXQgPSBORl9EUk9QOworCX0KIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwppbmRleCA4ZjNlOTJkLi4wNjU0ZWFhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKQEAgLTQsMTQgKzQsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gbW92ZSBMMyBwcm90b2NvbCBkZXBlbmRlbnQgcGFydCB0byB0aGlzIGZpbGUuCi0gKiAyMyBNYXIgMjAwNDogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gYWRkIGdldF9mZWF0dXJlcygpIHRvIHN1cHBvcnQgdmFyaW91cyBzaXplIG9mIGNvbm50cmFjawotICoJICBzdHJ1Y3R1cmVzLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtODcsNyArNzksNyBAQAogCWxvY2FsX2JoX2VuYWJsZSgpOwogCiAJaWYgKHNrYikKLQkJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCiAJcmV0dXJuIHNrYjsKIH0KQEAgLTk3LDE2ICs4OSwxNiBAQAogCSAgICAgdV9pbnQ4X3QgKnByb3RvbnVtKQogewogCS8qIE5ldmVyIGhhcHBlbiAqLwotCWlmICgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgeworCWlmIChpcF9oZHIoKnBza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpcHY0X3ByZXBhcmU6IEZyYWcgb2YgcHJvdG8gJXUgKGhvb2s9JXUpXG4iLAotCQkJKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCwgaG9va251bSk7CisJCQlpcF9oZHIoKnBza2IpLT5wcm90b2NvbCwgaG9va251bSk7CiAJCX0KIAkJcmV0dXJuIC1ORl9EUk9QOwogCX0KIAotCSpkYXRhb2ZmID0gKCpwc2tiKS0+bmgucmF3IC0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7Ci0JKnByb3RvbnVtID0gKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbDsKKwkqZGF0YW9mZiA9IHNrYl9uZXR3b3JrX29mZnNldCgqcHNrYikgKyBpcF9oZHJsZW4oKnBza2IpOworCSpwcm90b251bSA9IGlwX2hkcigqcHNrYiktPnByb3RvY29sOwogCiAJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KQEAgLTE1Miw5ICsxNDQsOCBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJcmV0dXJuIGhlbHAtPmhlbHBlci0+aGVscChwc2tiLAotCQkJICAgICAgICgqcHNrYiktPm5oLnJhdyAtICgqcHNrYiktPmRhdGEKLQkJCQkJICAgICAgICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKLQkJCSAgICAgICBjdCwgY3RpbmZvKTsKKwkJCQkgIHNrYl9uZXR3b3JrX29mZnNldCgqcHNrYikgKyBpcF9oZHJsZW4oKnBza2IpLAorCQkJCSAgY3QsIGN0aW5mbyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9jb25udHJhY2tfZGVmcmFnKHVuc2lnbmVkIGludCBob29rbnVtLApAQCAtMTcxLDcgKzE2Miw3IEBACiAjZW5kaWYKIAogCS8qIEdhdGhlciBmcmFnbWVudHMuICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJaWYgKGlwX2hkcigqcHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSB7CiAJCSpwc2tiID0gbmZfY3RfaXB2NF9nYXRoZXJfZnJhZ3MoKnBza2IsCiAJCQkJCQlob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HID8KIAkJCQkJCUlQX0RFRlJBR19DT05OVFJBQ0tfSU4gOgpAQCAtMTk5LDcgKzE5MCw3IEBACiB7CiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJICAgIHx8IGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKCJpcHRfaG9vazogaGFwcHkgY3JhY2tpbmcuXG4iKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKaW5kZXggNWZkMWU1My4uZjRmYzY1NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKQEAgLTQsMTEgKzQsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZW5hYmxlIHdvcmtpbmcgd2l0aCBMYXllciAzIHByb3RvY29sIGluZGVwZW5kZW50IGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9faWNtcC5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xNTgsNyArMTUzLDcgQEAKIAlORl9DVF9BU1NFUlQoc2tiLT5uZmN0ID09IE5VTEwpOwogCiAJLyogTm90IGVub3VnaCBoZWFkZXI/ICovCi0JaW5zaWRlID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LCBzaXplb2YoX2luKSwgJl9pbik7CisJaW5zaWRlID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksIHNpemVvZihfaW4pLCAmX2luKTsKIAlpZiAoaW5zaWRlID09IE5VTEwpCiAJCXJldHVybiAtTkZfQUNDRVBUOwogCkBAIC0xNzIsNyArMTY3LDcgQEAKIAkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KIAlpbm5lcnByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoUEZfSU5FVCwgaW5zaWRlLT5pcC5wcm90b2NvbCk7CiAKLQlkYXRhb2ZmID0gc2tiLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKGluc2lkZS0+aWNtcCk7CisJZGF0YW9mZiA9IGlwX2hkcmxlbihza2IpICsgc2l6ZW9mKGluc2lkZS0+aWNtcCk7CiAJLyogQXJlIHRoZXkgdGFsa2luZyBhYm91dCBvbmUgb2Ygb3VyIGNvbm5lY3Rpb25zPyAqLwogCWlmICghbmZfY3RfZ2V0X3R1cGxlKHNrYiwgZGF0YW9mZiwgZGF0YW9mZiArIGluc2lkZS0+aXAuaWhsKjQsIFBGX0lORVQsCiAJCQkgICAgIGluc2lkZS0+aXAucHJvdG9jb2wsICZvcmlndHVwbGUsCkBAIC0yMjcsNyArMjIyLDcgQEAKIAlzdHJ1Y3QgaWNtcGhkciBfaWgsICppY21waDsKIAogCS8qIE5vdCBlbm91Z2ggaGVhZGVyPyAqLwotCWljbXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LCBzaXplb2YoX2loKSwgJl9paCk7CisJaWNtcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF9paCksICZfaWgpOwogCWlmIChpY21waCA9PSBOVUxMKSB7CiAJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX0lDTVApKQogCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDQ1MmU5ZDMuLmVhMDJmMDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC00MzEsNyArNDMxLDcgQEAKIAl9ICppbnNpZGU7CiAJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgaW5uZXIsIHRhcmdldDsKLQlpbnQgaGRybGVuID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCWludCBoZHJsZW4gPSBpcF9oZHJsZW4oKnBza2IpOwogCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXNiaXQ7CiAJZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcCA9IEhPT0syTUFOSVAoaG9va251bSk7CkBAIC00MzksNyArNDM5LDcgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcmxlbiArIHNpemVvZigqaW5zaWRlKSkpCiAJCXJldHVybiAwOwogCi0JaW5zaWRlID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyBpcF9oZHJsZW4oKnBza2IpOwogCiAJLyogV2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gbWFuZ2xlIGl0IGJleW9uZCB0cml2aWFsIGNoZWNrc3VtCiAJICAgYWRqdXN0bWVudCwgc28gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNoZWNrc3VtIGlzIGNvcnJlY3QuICovCkBAIC00NjksOSArNDY5LDkgQEAKIAlsNHByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoUEZfSU5FVCwgaW5zaWRlLT5pcC5wcm90b2NvbCk7CiAKIAlpZiAoIW5mX2N0X2dldF90dXBsZSgqcHNrYiwKLQkJCSAgICAgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgaWNtcGhkciksCi0JCQkgICAgICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKwotCQkJICAgICBzaXplb2Yoc3RydWN0IGljbXBoZHIpICsgaW5zaWRlLT5pcC5paGwqNCwKKwkJCSAgICAgaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgaWNtcGhkciksCisJCQkgICAgIChpcF9oZHJsZW4oKnBza2IpICsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKyBpbnNpZGUtPmlwLmlobCAqIDQpLAogCQkJICAgICAodV9pbnQxNl90KUFGX0lORVQsCiAJCQkgICAgIGluc2lkZS0+aXAucHJvdG9jb2wsCiAJCQkgICAgICZpbm5lciwgbDNwcm90bywgbDRwcm90bykpCkBAIC00ODMsMTQgKzQ4MywxNCBAQAogCSAgIHBhY2tldDogUFJFUk9VVElORyAoRFNUIG1hbmlwKSwgcm91dGluZyBwcm9kdWNlcyBJQ01QLCBnb2VzCiAJICAgdGhyb3VnaCBQT1NUUk9VVElORyAod2hpY2ggbXVzdCBjb3JyZWN0IHRoZSBEU1QgbWFuaXApLiAqLwogCWlmICghbWFuaXBfcGt0KGluc2lkZS0+aXAucHJvdG9jb2wsIHBza2IsCi0JCSAgICAgICAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKGluc2lkZS0+aWNtcCksCisJCSAgICAgICBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKGluc2lkZS0+aWNtcCksCiAJCSAgICAgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZSwKIAkJICAgICAgICFtYW5pcCkpCiAJCXJldHVybiAwOwogCiAJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCS8qIFJlbG9hZGluZyAiaW5zaWRlIiBoZXJlIHNpbmNlIG1hbmlwX3BrdCBpbm5lci4gKi8KLQkJaW5zaWRlID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwkJaW5zaWRlID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaXBfaGRybGVuKCpwc2tiKTsKIAkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0gMDsKIAkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0KIAkJCWNzdW1fZm9sZChza2JfY2hlY2tzdW0oKnBza2IsIGhkcmxlbiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKaW5kZXggOWNiZjNmOS4uZmNlYmM5NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAkJICAgIHVuc2lnbmVkIGludCBhZGRyb2ZmLCBfX2JlMzIgaXAsIF9fYmUxNiBwb3J0KQogewogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBuZl9jb25uICpjdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOworCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CiAJc3RydWN0IHsKIAkJX19iZTMyIGlwOwogCQlfX2JlMTYgcG9ydDsKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlidWYucG9ydCA9IHBvcnQ7CiAJYWRkcm9mZiArPSBkYXRhb2ZmOwogCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwlpZiAoaXBfaGRyKCpwc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKIAkJaWYgKCFuZl9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKIAkJCQkJICAgICAgYWRkcm9mZiwgc2l6ZW9mKGJ1ZiksCiAJCQkJCSAgICAgIChjaGFyICopICZidWYsIHNpemVvZihidWYpKSkgewpAQCAtNTUsMTEgKzU1LDExIEBACiAJCX0KIAogCQkvKiBSZWxvY2F0ZSBkYXRhIHBvaW50ZXIgKi8KLQkJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCwKKwkJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGlwX2hkcmxlbigqcHNrYiksCiAJCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJCWlmICh0aCA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwotCQkqZGF0YSA9ICgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgKworCQkqZGF0YSA9ICgqcHNrYiktPmRhdGEgKyBpcF9oZHJsZW4oKnBza2IpICsKIAkJICAgIHRoLT5kb2ZmICogNCArIGRhdGFvZmY7CiAJfSBlbHNlIHsKIAkJaWYgKCFuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKQEAgLTczLDggKzczLDggQEAKIAkJLyogbmZfbmF0X21hbmdsZV91ZHBfcGFja2V0IHVzZXMgc2tiX21ha2Vfd3JpdGFibGUoKSB0byBjb3B5CiAJCSAqIG9yIHB1bGwgZXZlcnl0aGluZyBpbiBhIGxpbmVhciBidWZmZXIsIHNvIHdlIGNhbiBzYWZlbHkKIAkJICogdXNlIHRoZSBza2IgcG9pbnRlcnMgbm93ICovCi0JCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArCi0JCSAgICBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJCSpkYXRhID0gKCgqcHNrYiktPmRhdGEgKyBpcF9oZHJsZW4oKnBza2IpICsKKwkJCSBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzgzLDcgKzM4Myw3IEBACiBzdGF0aWMgdm9pZCBpcF9uYXRfcTkzMV9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm5ldywKIAkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcykKIHsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CiAKIAlpZiAodGhpcy0+dHVwbGUuc3JjLnUzLmlwICE9IDApIHsJLyogT25seSBhY2NlcHQgY2FsbHMgZnJvbSBHSyAqLwogCQluZl9uYXRfZm9sbG93X21hc3RlcihuZXcsIHRoaXMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKaW5kZXggNDlhOTBjMy4uMTViNmU1YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCkBAIC04NywxMiArODcsMTMgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCiAJQlVHX09OKHNrYl9pc19ub25saW5lYXIoc2tiKSk7Ci0JZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT5uaC5pcGggKyBkYXRhb2ZmOworCWRhdGEgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIGRhdGFvZmY7CiAKIAkvKiBtb3ZlIHBvc3QtcmVwbGFjZW1lbnQgKi8KIAltZW1tb3ZlKGRhdGEgKyBtYXRjaF9vZmZzZXQgKyByZXBfbGVuLAogCQlkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuLAotCQlza2ItPnRhaWwgLSAoZGF0YSArIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikpOworCQlza2ItPnRhaWwgLSAoc2tiLT5uZXR3b3JrX2hlYWRlciArIGRhdGFvZmYgKworCQkJICAgICBtYXRjaF9vZmZzZXQgKyBtYXRjaF9sZW4pKTsKIAogCS8qIGluc2VydCBkYXRhIGZyb20gYnVmZmVyICovCiAJbWVtY3B5KGRhdGEgKyBtYXRjaF9vZmZzZXQsIHJlcF9idWZmZXIsIHJlcF9sZW4pOwpAQCAtMTExLDggKzExMiw4IEBACiAJfQogCiAJLyogZml4IElQIGhkciBjaGVja3N1bSBpbmZvcm1hdGlvbiAqLwotCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwotCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCWlwX2hkcihza2IpLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogfQogCiAvKiBVbnVzdWFsLCBidXQgcG9zc2libGUgY2FzZS4gKi8KQEAgLTE1Miw2ICsxNTMsNyBAQAogCQkJIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCiAJCQkgdW5zaWduZWQgaW50IHJlcF9sZW4pCiB7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSgqcHNrYiktPmRzdDsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWludCBvbGRsZW4sIGRhdGFsZW47CkBAIC0xNjYsNyArMTY4LDcgQEAKIAogCVNLQl9MSU5FQVJfQVNTRVJUKCpwc2tiKTsKIAotCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoKnBza2IpOwogCXRjcGggPSAodm9pZCAqKWlwaCArIGlwaC0+aWhsKjQ7CiAKIAlvbGRsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwpAQCAtMTc1LDExICsxNzcsMjIgQEAKIAogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwogCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl0Y3BoLT5jaGVjayA9IDA7Ci0JCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKGRhdGFsZW4sCi0JCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCi0JCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCi0JCQkJCQkJZGF0YWxlbiwgMCkpOworCQlpZiAoIShydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSAmJgorCQkgICAgKCpwc2tiKS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfQUxMX0NTVU0pIHsKKwkJCSgqcHNrYiktPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CisJCQkoKnBza2IpLT5jc3VtX3N0YXJ0ID0gc2tiX2hlYWRyb29tKCpwc2tiKSArCisJCQkJCSAgICAgIHNrYl9uZXR3b3JrX29mZnNldCgqcHNrYikgKworCQkJCQkgICAgICBpcGgtPmlobCAqIDQ7CisJCQkoKnBza2IpLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKKwkJCXRjcGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhkYXRhbGVuLAorCQkJCQkJICAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIDApOworCQl9IGVsc2UgeworCQkJdGNwaC0+Y2hlY2sgPSAwOworCQkJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2soZGF0YWxlbiwKKwkJCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAorCQkJCQkJCQlkYXRhbGVuLCAwKSk7CisJCX0KIAl9IGVsc2UKIAkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAogCQkJCSAgICAgICBodG9ucyhvbGRsZW4pLCBodG9ucyhkYXRhbGVuKSwgMSk7CkBAIC0xOTAsNyArMjAzLDcgQEAKIAkJCQkgICAgKGludClyZXBfbGVuIC0gKGludCltYXRjaF9sZW4sCiAJCQkJICAgIGN0LCBjdGluZm8pOwogCQkvKiBUZWxsIFRDUCB3aW5kb3cgdHJhY2tpbmcgYWJvdXQgc2VxIGNoYW5nZSAqLwotCQluZl9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKKwkJbmZfY29ubnRyYWNrX3RjcF91cGRhdGUoKnBza2IsIGlwX2hkcmxlbigqcHNrYiksCiAJCQkJCWN0LCBDVElORk8yRElSKGN0aW5mbykpOwogCX0KIAlyZXR1cm4gMTsKQEAgLTIxNiwxMiArMjI5LDEzIEBACiAJCQkgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKIAkJCSB1bnNpZ25lZCBpbnQgcmVwX2xlbikKIHsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CiAJaW50IGRhdGFsZW4sIG9sZGxlbjsKIAogCS8qIFVEUCBoZWxwZXJzIG1pZ2h0IGFjY2lkZW50YWxseSBtYW5nbGUgdGhlIHdyb25nIHBhY2tldCAqLwotCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoKnBza2IpOwogCWlmICgoKnBza2IpLT5sZW4gPCBpcGgtPmlobCo0ICsgc2l6ZW9mKCp1ZHBoKSArCiAJCQkgICAgICAgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKQogCQlyZXR1cm4gMDsKQEAgLTIzNCw3ICsyNDgsNyBAQAogCSAgICAhZW5sYXJnZV9za2IocHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbikpCiAJCXJldHVybiAwOwogCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOworCWlwaCA9IGlwX2hkcigqcHNrYik7CiAJdWRwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKIAogCW9sZGxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7CkBAIC0yNTAsMTMgKzI2NCwyNSBAQAogCQlyZXR1cm4gMTsKIAogCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1ZHBoLT5jaGVjayA9IDA7Ci0JCXVkcGgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkJCWRhdGFsZW4sIElQUFJPVE9fVURQLAotCQkJCQkJY3N1bV9wYXJ0aWFsKChjaGFyICopdWRwaCwKLQkJCQkJCQkgICAgIGRhdGFsZW4sIDApKTsKLQkJaWYgKCF1ZHBoLT5jaGVjaykKLQkJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CisJCWlmICghKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfTE9DQUwpICYmCisJCSAgICAoKnBza2IpLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9BTExfQ1NVTSkgeworCQkJKCpwc2tiKS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKKwkJCSgqcHNrYiktPmNzdW1fc3RhcnQgPSBza2JfaGVhZHJvb20oKnBza2IpICsKKwkJCQkJICAgICAgc2tiX25ldHdvcmtfb2Zmc2V0KCpwc2tiKSArCisJCQkJCSAgICAgIGlwaC0+aWhsICogNDsKKwkJCSgqcHNrYiktPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOworCQkJdWRwaC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkJCQkgZGF0YWxlbiwgSVBQUk9UT19VRFAsCisJCQkJCQkJIDApOworCQl9IGVsc2UgeworCQkJdWRwaC0+Y2hlY2sgPSAwOworCQkJdWRwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCQkJCWRhdGFsZW4sIElQUFJPVE9fVURQLAorCQkJCQkJCWNzdW1fcGFydGlhbCgoY2hhciAqKXVkcGgsCisJCQkJCQkJCSAgICAgZGF0YWxlbiwgMCkpOworCQkJaWYgKCF1ZHBoLT5jaGVjaykKKwkJCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCQl9CiAJfSBlbHNlCiAJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnVkcGgtPmNoZWNrLCAqcHNrYiwKIAkJCQkgICAgICAgaHRvbnMob2xkbGVuKSwgaHRvbnMoZGF0YWxlbiksIDEpOwpAQCAtMzE4LDggKzM0NCw4IEBACiAJdW5zaWduZWQgaW50IGRpciwgb3B0b2ZmLCBvcHRlbmQ7CiAJc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQgPSBuZmN0X25hdChjdCk7CiAKLQlvcHRvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCW9wdGVuZCA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQ7CisJb3B0b2ZmID0gaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwlvcHRlbmQgPSBpcF9oZHJsZW4oKnBza2IpICsgdGNwaC0+ZG9mZiAqIDQ7CiAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIG9wdGVuZCkpCiAJCXJldHVybiAwOwpAQCAtMzcxLDEwICszOTcsMTAgQEAKIAl0aGlzX3dheSA9ICZuYXQtPmluZm8uc2VxW2Rpcl07CiAJb3RoZXJfd2F5ID0gJm5hdC0+aW5mby5zZXFbIWRpcl07CiAKLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQrc2l6ZW9mKCp0Y3BoKSkpCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKCp0Y3BoKSkpCiAJCXJldHVybiAwOwogCi0JdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7CisJdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYik7CiAJaWYgKGFmdGVyKG50b2hsKHRjcGgtPnNlcSksIHRoaXNfd2F5LT5jb3JyZWN0aW9uX3BvcykpCiAJCW5ld3NlcSA9IGh0b25sKG50b2hsKHRjcGgtPnNlcSkgKyB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyKTsKIAllbHNlCkBAIC0zOTksNyArNDI1LDcgQEAKIAlpZiAoIW5mX25hdF9zYWNrX2FkanVzdChwc2tiLCB0Y3BoLCBjdCwgY3RpbmZvKSkKIAkJcmV0dXJuIDA7CiAKLQluZl9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwgY3QsIGRpcik7CisJbmZfY29ubnRyYWNrX3RjcF91cGRhdGUoKnBza2IsIGlwX2hkcmxlbigqcHNrYiksIGN0LCBkaXIpOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCmluZGV4IDdiYTM0MWMuLmE2Njg4ODcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCkBAIC01Myw3ICs1Myw3IEBACiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0OwogCXN0cnVjdCBuZl9jdF9wcHRwX21hc3RlciAqY3RfcHB0cF9pbmZvOwogCXN0cnVjdCBuZl9uYXRfcHB0cCAqbmF0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CiAKIAljdF9wcHRwX2luZm8gPSAmbmZjdF9oZWxwKG1hc3RlciktPmhlbHAuY3RfcHB0cF9pbmZvOwogCW5hdF9wcHRwX2luZm8gPSAmbmZjdF9uYXQobWFzdGVyKS0+aGVscC5uYXRfcHB0cF9pbmZvOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYwppbmRleCAxNDdhNDM3Li4yYTI4MzM5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAKIAlpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQgJiYKIAkgICAgbXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpCi0JCXdhcm5faWZfZXh0cmFfbWFuZ2xlKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIsCisJCXdhcm5faWZfZXh0cmFfbWFuZ2xlKGlwX2hkcigqcHNrYiktPmRhZGRyLAogCQkJCSAgICAgbXItPnJhbmdlWzBdLm1pbl9pcCk7CiAKIAlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIGhvb2tudW0pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zaXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc2lwLmMKaW5kZXggYjEyY2Q3Yy4uYmZkODhlNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zaXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CkBAIC05Miw3ICs5Myw3IEBACiAJaWYgKCFuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKIAkJCQkgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGFkZHIsIGFkZHJsZW4pKQogCQlyZXR1cm4gMDsKLQkqZHB0ciA9ICgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CiAJcmV0dXJuIDE7CiAKIH0KQEAgLTEwNiw3ICsxMDcsNyBAQAogCXN0cnVjdCBhZGRyX21hcCBtYXA7CiAJaW50IGRhdGFvZmYsIGRhdGFsZW47CiAKLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlkYXRhb2ZmID0gaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKIAlpZiAoZGF0YWxlbiA8IHNpemVvZigiU0lQLzIuMCIpIC0gMSkKIAkJcmV0dXJuIE5GX0RST1A7CkBAIC0xNTUsNyArMTU2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBXZSBuZWVkIHRvIHJlbG9hZCB0aGlzLiBUaGFua3MgUGF0cmljay4gKi8KLQkqZHB0ciA9ICgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE2OCw3ICsxNjksNyBAQAogCWNoYXIgYnVmZmVyW3NpemVvZigiNjU1MzYiKV07CiAJaW50IGJ1ZmZsZW47CiAKLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlkYXRhb2ZmID0gaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAogCS8qIEdldCBhY3R1YWwgU0RQIGxlbmdodCAqLwogCWlmIChjdF9zaXBfZ2V0X2luZm8oY3QsIGRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsICZtYXRjaG9mZiwKQEAgLTIwMCw3ICsyMDEsNyBAQAogCWNoYXIgYnVmZmVyW3NpemVvZigibm5uLm5ubi5ubm4ubm5uIildOwogCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBidWZmbGVuOwogCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJZGF0YW9mZiA9IGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CiAKIAkvKiBNYW5nbGUgb3duZXIgYW5kIGNvbnRhY3QgaW5mby4gKi8KIAlidWZmbGVuID0gc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQobmV3aXApKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc25tcF9iYXNpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKaW5kZXggY2U1YzQ5My4uNmU4ODUwNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKQEAgLTM4LDEwICszOCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqCiAgKiBBdXRob3I6IEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFVwZGF0ZXM6Ci0gKiAyMDAwLTA4LTA2OiBDb252ZXJ0IHRvIG5ldyBoZWxwZXIgQVBJIChIYXJhbGQgV2VsdGUpLgotICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC0xMTk0LDcgKzExOTAsNyBAQAogCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKIAkJCSAgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKCpwc2tiKTsKIAlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoKF9fYmUzMiAqKWlwaCArIGlwaC0+aWhsKTsKIAl1X2ludDE2X3QgdWRwbGVuID0gbnRvaHModWRwaC0+bGVuKTsKIAl1X2ludDE2X3QgcGF5bGVuID0gdWRwbGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwpAQCAtMTIzNSw3ICsxMjMxLDcgQEAKIHsKIAlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwogCXVuc2lnbmVkIGludCByZXQ7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgodV9pbnQzMl90ICopaXBoICsgaXBoLT5paGwpOwogCiAJLyogU05NUCByZXBsaWVzIGFuZCBvcmlnaW5hdGluZyBTTk1QIHRyYXBzIGdldCBtYW5nbGVkICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDE1YWEzZGIuLjY0YmJlZDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC04Niw4ICs4Niw3IEBACiAKIAkvKiBXZSBuZXZlciBzZWUgZnJhZ21lbnRzOiBjb25udHJhY2sgZGVmcmFncyBvbiBwcmUtcm91dGluZwogCSAgIGFuZCBsb2NhbC1vdXQsIGFuZCBuZl9uYXRfb3V0IHByb3RlY3RzIHBvc3Qtcm91dGluZy4gKi8KLQlORl9DVF9BU1NFUlQoISgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmCi0JCSAgICAgICAmIGh0b25zKElQX01GfElQX09GRlNFVCkpKTsKKwlORl9DVF9BU1NFUlQoIShpcF9oZHIoKnBza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkpOwogCiAJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOwogCS8qIENhbid0IHRyYWNrPyAgSXQncyBub3QgZHVlIHRvIHN0cmVzcywgb3IgY29ubnRyYWNrIHdvdWxkCkBAIC05OCwxMSArOTcsMTAgQEAKIAkJLyogRXhjZXB0aW9uOiBJQ01QIHJlZGlyZWN0IHRvIG5ldyBjb25uZWN0aW9uIChub3QgaW4KIAkJICAgaGFzaCB0YWJsZSB5ZXQpLiAgV2UgbXVzdCBub3QgbGV0IHRoaXMgdGhyb3VnaCwgaW4KIAkJICAgY2FzZSB3ZSdyZSBkb2luZyBOQVQgdG8gdGhlIHNhbWUgbmV0d29yay4gKi8KLQkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWlmIChpcF9oZHIoKnBza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKIAkJCXN0cnVjdCBpY21waGRyIF9oZHIsICpocDsKIAotCQkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsCi0JCQkJCQkoKnBza2IpLT5uaC5pcGgtPmlobCo0LAorCQkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGlwX2hkcmxlbigqcHNrYiksCiAJCQkJCQlzaXplb2YoX2hkciksICZfaGRyKTsKIAkJCWlmIChocCAhPSBOVUxMICYmCiAJCQkgICAgaHAtPnR5cGUgPT0gSUNNUF9SRURJUkVDVCkKQEAgLTEyMiw3ICsxMjAsNyBAQAogCXN3aXRjaCAoY3RpbmZvKSB7CiAJY2FzZSBJUF9DVF9SRUxBVEVEOgogCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKLQkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWlmIChpcF9oZHIoKnBza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKIAkJCWlmICghbmZfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oY3QsIGN0aW5mbywKIAkJCQkJCQkgICBob29rbnVtLCBwc2tiKSkKIAkJCQlyZXR1cm4gTkZfRFJPUDsKQEAgLTE3NywxMSArMTc1LDExIEBACiAJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0OwotCV9fYmUzMiBkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7CisJX19iZTMyIGRhZGRyID0gaXBfaGRyKCpwc2tiKS0+ZGFkZHI7CiAKIAlyZXQgPSBuZl9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKLQkgICAgZGFkZHIgIT0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcikgeworCSAgICBkYWRkciAhPSBpcF9oZHIoKnBza2IpLT5kYWRkcikgewogCQlkc3RfcmVsZWFzZSgoKnBza2IpLT5kc3QpOwogCQkoKnBza2IpLT5kc3QgPSBOVUxMOwogCX0KQEAgLTIwMyw3ICsyMDEsNyBAQAogCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8Ci0JICAgICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCSAgICBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlyZXQgPSBuZl9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CkBAIC0yMzYsNyArMjM0LDcgQEAKIAogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSB8fAotCSAgICAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKKwkgICAgaXBfaGRybGVuKCpwc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJcmV0ID0gbmZfbmF0X2ZuKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvYy5jIGIvbmV0L2lwdjQvcHJvYy5jCmluZGV4IGFlNjhhNjkuLjM3YWI1ODAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Byb2MuYworKysgYi9uZXQvaXB2NC9wcm9jLmMKQEAgLTg3LDE5ICs4Nyw2IEBACiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1mb2xkX2ZpZWxkKHZvaWQgKm1pYltdLCBpbnQgb2ZmdCkKLXsKLQl1bnNpZ25lZCBsb25nIHJlcyA9IDA7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliWzBdLCBpKSkgKyBvZmZ0KTsKLQkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopIHBlcl9jcHVfcHRyKG1pYlsxXSwgaSkpICsgb2ZmdCk7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KIC8qIHNubXAgaXRlbXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25tcF9taWIgc25tcDRfaXBzdGF0c19saXN0W10gPSB7CiAJU05NUF9NSUJfSVRFTSgiSW5SZWNlaXZlcyIsIElQU1RBVFNfTUlCX0lOUkVDRUlWRVMpLApAQCAtMjY2LDggKzI1Myw4IEBACiAKIAlmb3IgKGkgPSAwOyBzbm1wNF9pcHN0YXRzX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSBpcF9zdGF0aXN0aWNzLAotCQkJCSAgICAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSkpOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKWlwX3N0YXRpc3RpY3MsCisJCQkJCSAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSkpOwogCiAJc2VxX3B1dHMoc2VxLCAiXG5JY21wOiIpOwogCWZvciAoaSA9IDA7IHNubXA0X2ljbXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKQEAgLTI3Niw4ICsyNjMsOCBAQAogCXNlcV9wdXRzKHNlcSwgIlxuSWNtcDoiKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF9pY21wX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSBpY21wX3N0YXRpc3RpY3MsCi0JCQkJICAgICAgc25tcDRfaWNtcF9saXN0W2ldLmVudHJ5KSk7CisJCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgKiopaWNtcF9zdGF0aXN0aWNzLAorCQkJCQkgICBzbm1wNF9pY21wX2xpc3RbaV0uZW50cnkpKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOwogCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQpAQCAtMjg4LDEyICsyNzUsMTIgQEAKIAkJLyogTWF4Q29ubiBmaWVsZCBpcyBzaWduZWQsIFJGQyAyMDEyICovCiAJCWlmIChzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSA9PSBUQ1BfTUlCX01BWENPTk4pCiAJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbGQiLAotCQkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIHRjcF9zdGF0aXN0aWNzLAotCQkJCQkgICAgICBzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSkpOworCQkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCAqKil0Y3Bfc3RhdGlzdGljcywKKwkJCQkJCSAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7CiAJCWVsc2UKIAkJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdGNwX3N0YXRpc3RpY3MsCi0JCQkJCSAgICAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7CisJCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKXRjcF9zdGF0aXN0aWNzLAorCQkJCQkJICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKIAl9CiAKIAlzZXFfcHV0cyhzZXEsICJcblVkcDoiKTsKQEAgLTMwMyw4ICsyOTAsOCBAQAogCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOwogCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAotCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdWRwX3N0YXRpc3RpY3MsCi0JCQkJICAgICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKKwkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCAqKil1ZHBfc3RhdGlzdGljcywKKwkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKIAogCS8qIHRoZSBVRFAgYW5kIFVEUC1MaXRlIE1JQnMgYXJlIHRoZSBzYW1lICovCiAJc2VxX3B1dHMoc2VxLCAiXG5VZHBMaXRlOiIpOwpAQCAtMzE0LDggKzMwMSw4IEBACiAJc2VxX3B1dHMoc2VxLCAiXG5VZHBMaXRlOiIpOwogCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAotCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdWRwbGl0ZV9zdGF0aXN0aWNzLAotCQkJCSAgICAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSAgICAgKTsKKwkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCAqKil1ZHBsaXRlX3N0YXRpc3RpY3MsCisJCQkJCSAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7CiAKIAlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwpAQCAtMzQ4LDggKzMzNSw4IEBACiAJc2VxX3B1dHMoc2VxLCAiXG5UY3BFeHQ6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfbmV0X2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSBuZXRfc3RhdGlzdGljcywKLQkJCQkgICAgICBzbm1wNF9uZXRfbGlzdFtpXS5lbnRyeSkpOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKW5ldF9zdGF0aXN0aWNzLAorCQkJCQkgICBzbm1wNF9uZXRfbGlzdFtpXS5lbnRyeSkpOwogCiAJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb3RvY29sLmMgYi9uZXQvaXB2NC9wcm90b2NvbC5jCmluZGV4IGRhNzBmZWYuLjk3MWFiOTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Byb3RvY29sLmMKKysrIGIvbmV0L2lwdjQvcHJvdG9jb2wuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPG5ldC9pcGlwLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgogCi1zdHJ1Y3QgbmV0X3Byb3RvY29sICppbmV0X3Byb3Rvc1tNQVhfSU5FVF9QUk9UT1NdOworc3RydWN0IG5ldF9wcm90b2NvbCAqaW5ldF9wcm90b3NbTUFYX0lORVRfUFJPVE9TXSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0X3Byb3RvX2xvY2spOwogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCA4N2U5YzE2Li4yNGQ3YzlmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSkpCiAJCXJldHVybiAxOwogCi0JdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwl0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKIAlpZiAodHlwZSA8IDMyKSB7CiAJCV9fdTMyIGRhdGEgPSByYXdfc2soc2spLT5maWx0ZXIuZGF0YTsKIApAQCAtMTg0LDggKzE4NCw4IEBACiB2b2lkIHJhd19lcnIgKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJaW50IGVyciA9IDA7CiAJaW50IGhhcmRlcnIgPSAwOwogCkBAIC0yNTYsNyArMjU2LDcgQEAKIAl9CiAJbmZfcmVzZXQoc2tiKTsKIAotCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJcmF3X3Jjdl9za2Ioc2ssIHNrYik7CiAJcmV0dXJuIDA7CkBAIC0yOTEsMTEgKzI5MSwxMyBAQAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CiAKLQlza2ItPm5oLmlwaCA9IGlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWVyciA9IG1lbWNweV9mcm9taW92ZWNlbmQoKHZvaWQgKilpcGgsIGZyb20sIDAsIGxlbmd0aCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcl9mYXVsdDsKQEAgLTYxMyw3ICs2MTUsNyBAQAogCS8qIENvcHkgdGhlIGFkZHJlc3MuICovCiAJaWYgKHNpbikgewogCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJCXNpbi0+c2luX3BvcnQgPSAwOwogCQltZW1zZXQoJnNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJfQpAQCAtODg3LDcgKzg4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmF3X3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJhd19zZXFfb3BzID0gewogCS5zdGFydCA9IHJhd19zZXFfc3RhcnQsCiAJLm5leHQgID0gcmF3X3NlcV9uZXh0LAogCS5zdG9wICA9IHJhd19zZXFfc3RvcCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDM3ZTBkNGQuLmNiNzZlM2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtODIsNyArODIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KQEAgLTEwNCw2ICsxMDMsNyBAQAogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bmV0L2lwX21wX2FsZy5oPgogI2luY2x1ZGUgPG5ldC9uZXRldmVudC5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjZW5kaWYKQEAgLTM2NCw3ICszNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ0X2NhY2hlX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ0X2NhY2hlX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IHJ0X2NhY2hlX3NlcV9zdGFydCwKIAkubmV4dCAgID0gcnRfY2FjaGVfc2VxX25leHQsCiAJLnN0b3AgICA9IHJ0X2NhY2hlX3NlcV9zdG9wLApAQCAtNDcwLDcgKzQ3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnRfY3B1X3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ0X2NwdV9zZXFfb3BzID0gewogCS5zdGFydCAgPSBydF9jcHVfc2VxX3N0YXJ0LAogCS5uZXh0ICAgPSBydF9jcHVfc2VxX25leHQsCiAJLnN0b3AgICA9IHJ0X2NwdV9zZXFfc3RvcCwKQEAgLTE1MTksNyArMTUxOSw3IEBACiBzdGF0aWMgaW50IGlwX3J0X2J1ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXByaW50ayhLRVJOX0RFQlVHICJpcF9ydF9idWc6ICV1LiV1LiV1LiV1IC0+ICV1LiV1LiV1LiV1LCAlc1xuIiwKLQkJTklQUVVBRChza2ItPm5oLmlwaC0+c2FkZHIpLCBOSVBRVUFEKHNrYi0+bmguaXBoLT5kYWRkciksCisJCU5JUFFVQUQoaXBfaGRyKHNrYiktPnNhZGRyKSwgTklQUVVBRChpcF9oZHIoc2tiKS0+ZGFkZHIpLAogCQlza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIj8iKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTE2OTgsOSArMTY5OCw5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hcnRpYW4gc291cmNlICV1LiV1LiV1LiV1IGZyb20gIgogCQkJIiV1LiV1LiV1LiV1LCBvbiBkZXYgJXNcbiIsCiAJCQlOSVBRVUFEKGRhZGRyKSwgTklQUVVBRChzYWRkciksIGRldi0+bmFtZSk7Ci0JCWlmIChkZXYtPmhhcmRfaGVhZGVyX2xlbiAmJiBza2ItPm1hYy5yYXcpIHsKKwkJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmIHNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkgewogCQkJaW50IGk7Ci0JCQl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsbCBoZWFkZXI6ICIpOwogCQkJZm9yIChpID0gMDsgaSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKyssIHArKykgewogCQkJCXByaW50aygiJTAyeCIsICpwKTsKQEAgLTIxMzQsNyArMjEzNCw3IEBACiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldikpICE9IE5VTEwpIHsKIAkJCWludCBvdXIgPSBpcF9jaGVja19tYyhpbl9kZXYsIGRhZGRyLCBzYWRkciwKLQkJCQlza2ItPm5oLmlwaC0+cHJvdG9jb2wpOworCQkJCWlwX2hkcihza2IpLT5wcm90b2NvbCk7CiAJCQlpZiAob3VyCiAjaWZkZWYgQ09ORklHX0lQX01ST1VURQogCQkJICAgIHx8ICghTE9DQUxfTUNBU1QoZGFkZHIpICYmIElOX0RFVl9NRk9SV0FSRChpbl9kZXYpKQpAQCAtMjM5Niw3ICsyMzk2LDcgQEAKIAogCQkvKiBJdCBpcyBlcXVpdmFsZW50IHRvIGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwgKi8KIAkJZGV2X291dCA9IGlwX2Rldl9maW5kKG9sZGZscC0+Zmw0X3NyYyk7Ci0JCWlmIChkZXZfb3V0ID09IE5VTEwpCisJCWlmICgoZGV2X291dCA9PSBOVUxMKSAmJiAhKHN5c2N0bF9pcF9ub25sb2NhbF9iaW5kKSkKIAkJCWdvdG8gb3V0OwogCiAJCS8qIEkgcmVtb3ZlZCBjaGVjayBmb3Igb2lmID09IGRldl9vdXQtPm9pZiBoZXJlLgpAQCAtMjQwNyw3ICsyNDA3LDcgQEAKIAkJICAgICAgb2YgYW5vdGhlciBpZmFjZS4gLS1BTksKIAkJICovCiAKLQkJaWYgKG9sZGZscC0+b2lmID09IDAKKwkJaWYgKGRldl9vdXQgJiYgb2xkZmxwLT5vaWYgPT0gMAogCQkgICAgJiYgKE1VTFRJQ0FTVChvbGRmbHAtPmZsNF9kc3QpIHx8IG9sZGZscC0+Zmw0X2RzdCA9PSBodG9ubCgweEZGRkZGRkZGKSkpIHsKIAkJCS8qIFNwZWNpYWwgaGFjazogdXNlciBjYW4gZGlyZWN0IG11bHRpY2FzdHMKIAkJCSAgIGFuZCBsaW1pdGVkIGJyb2FkY2FzdCB2aWEgbmVjZXNzYXJ5IGludGVyZmFjZQpAQCAtMjY4Myw3ICsyNjgzLDcgQEAKIAkJaWQgPSBydC0+cGVlci0+aXBfaWRfY291bnQ7CiAJCWlmIChydC0+cGVlci0+dGNwX3RzX3N0YW1wKSB7CiAJCQl0cyA9IHJ0LT5wZWVyLT50Y3BfdHM7Ci0JCQl0c2FnZSA9IHh0aW1lLnR2X3NlYyAtIHJ0LT5wZWVyLT50Y3BfdHNfc3RhbXA7CisJCQl0c2FnZSA9IGdldF9zZWNvbmRzKCkgLSBydC0+cGVlci0+dGNwX3RzX3N0YW1wOwogCQl9CiAJfQogCkBAIC0yNzIxLDcgKzI3MjEsNyBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLWludCBpbmV0X3J0bV9nZXRyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0X3J0bV9nZXRyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBydG1zZyAqcnRtOwogCXN0cnVjdCBubGF0dHIgKnRiW1JUQV9NQVgrMV07CkBAIC0yNzQ3LDEwICsyNzQ3LDExIEBACiAJLyogUmVzZXJ2ZSByb29tIGZvciBkdW1teSBoZWFkZXJzLCB0aGlzIHNrYiBjYW4gcGFzcwogCSAgIHRocm91Z2ggZ29vZCBjaHVuayBvZiByb3V0aW5nIGVuZ2luZS4KIAkgKi8KLQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJLyogQnVnZml4OiBuZWVkIHRvIGdpdmUgaXBfcm91dGVfaW5wdXQgZW5vdWdoIG9mIGFuIElQIGhlYWRlciB0byBub3QgZ2FnLiAqLwotCXNrYi0+bmguaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fSUNNUDsKKwlpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPSBJUFBST1RPX0lDTVA7CiAJc2tiX3Jlc2VydmUoc2tiLCBNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCiAJc3JjID0gdGJbUlRBX1NSQ10gPyBubGFfZ2V0X2JlMzIodGJbUlRBX1NSQ10pIDogMDsKQEAgLTMxOTMsNiArMzE5NCw4IEBACiAJeGZybV9pbml0KCk7CiAJeGZybTRfaW5pdCgpOwogI2VuZGlmCisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fR0VUUk9VVEUsIGluZXRfcnRtX2dldHJvdXRlLCBOVUxMKTsKKwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3luY29va2llcy5jIGIvbmV0L2lwdjQvc3luY29va2llcy5jCmluZGV4IDMzMDE2Y2MuLjJkYTFiZTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYworKysgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKQEAgLTEyNSwxMCArMTI1LDExIEBACiBfX3UzMiBjb29raWVfdjRfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2ICptc3NwKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJY29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAJaW50IG1zc2luZDsKIAljb25zdCBfX3UxNiBtc3MgPSAqbXNzcDsKIAotCiAJdHAtPmxhc3Rfc3lucV9vdmVyZmxvdyA9IGppZmZpZXM7CiAKIAkvKiBYWFggc29ydCBtc3N0YWJbXSBieSBwcm9iYWJpbGl0eT8gIEJpbmFyeSBzZWFyY2g/ICovCkBAIC0xMzgsOSArMTM5LDggQEAKIAogCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1NZTkNPT0tJRVNTRU5UKTsKIAotCXJldHVybiBzZWN1cmVfdGNwX3N5bl9jb29raWUoc2tiLT5uaC5pcGgtPnNhZGRyLCBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICBza2ItPmgudGgtPnNvdXJjZSwgc2tiLT5oLnRoLT5kZXN0LAotCQkJCSAgICAgbnRvaGwoc2tiLT5oLnRoLT5zZXEpLAorCXJldHVybiBzZWN1cmVfdGNwX3N5bl9jb29raWUoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkgICAgIHRoLT5zb3VyY2UsIHRoLT5kZXN0LCBudG9obCh0aC0+c2VxKSwKIAkJCQkgICAgIGppZmZpZXMgLyAoSFogKiA2MCksIG1zc2luZCk7CiB9CiAKQEAgLTE1NywxNCArMTU3LDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNvb2tpZV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UzMiBjb29raWUpCiB7Ci0JX191MzIgc2VxOwotCV9fdTMyIG1zc2luZDsKLQotCXNlcSA9IG50b2hsKHNrYi0+aC50aC0+c2VxKS0xOwotCW1zc2luZCA9IGNoZWNrX3RjcF9zeW5fY29va2llKGNvb2tpZSwKLQkJCQkgICAgICBza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkgICAgICBza2ItPmgudGgtPnNvdXJjZSwgc2tiLT5oLnRoLT5kZXN0LAotCQkJCSAgICAgIHNlcSwgamlmZmllcyAvIChIWiAqIDYwKSwgQ09VTlRFUl9UUklFUyk7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKKwlfX3UzMiBzZXEgPSBudG9obCh0aC0+c2VxKSAtIDE7CisJX191MzIgbXNzaW5kID0gY2hlY2tfdGNwX3N5bl9jb29raWUoY29va2llLCBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCQkgICAgdGgtPnNvdXJjZSwgdGgtPmRlc3QsIHNlcSwKKwkJCQkJICAgIGppZmZpZXMgLyAoSFogKiA2MCksCisJCQkJCSAgICBDT1VOVEVSX1RSSUVTKTsKIAogCXJldHVybiBtc3NpbmQgPCBOVU1fTVNTID8gbXNzdGFiW21zc2luZF0gKyAxIDogMDsKIH0KQEAgLTE5MSwxNCArMTkwLDE1IEBACiAJc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxOwogCXN0cnVjdCB0Y3BfcmVxdWVzdF9zb2NrICp0cmVxOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCV9fdTMyIGNvb2tpZSA9IG50b2hsKHNrYi0+aC50aC0+YWNrX3NlcSkgLSAxOworCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOworCV9fdTMyIGNvb2tpZSA9IG50b2hsKHRoLT5hY2tfc2VxKSAtIDE7CiAJc3RydWN0IHNvY2sgKnJldCA9IHNrOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKIAlpbnQgbXNzOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCV9fdTggcmN2X3dzY2FsZTsKIAotCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICFza2ItPmgudGgtPmFjaykKKwlpZiAoIXN5c2N0bF90Y3Bfc3luY29va2llcyB8fCAhdGgtPmFjaykKIAkJZ290byBvdXQ7CiAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0cC0+bGFzdF9zeW5xX292ZXJmbG93ICsgVENQX1RJTUVPVVRfSU5JVCkgfHwKQEAgLTIyMCwxMiArMjIwLDEyIEBACiAJfQogCWlyZXEgPSBpbmV0X3JzayhyZXEpOwogCXRyZXEgPSB0Y3BfcnNrKHJlcSk7Ci0JdHJlcS0+cmN2X2lzbgkJPSBudG9obChza2ItPmgudGgtPnNlcSkgLSAxOworCXRyZXEtPnJjdl9pc24JCT0gbnRvaGwodGgtPnNlcSkgLSAxOwogCXRyZXEtPnNudF9pc24JCT0gY29va2llOwogCXJlcS0+bXNzCQk9IG1zczsKLQlpcmVxLT5ybXRfcG9ydAkJPSBza2ItPmgudGgtPnNvdXJjZTsKLQlpcmVxLT5sb2NfYWRkcgkJPSBza2ItPm5oLmlwaC0+ZGFkZHI7Ci0JaXJlcS0+cm10X2FkZHIJCT0gc2tiLT5uaC5pcGgtPnNhZGRyOworCWlyZXEtPnJtdF9wb3J0CQk9IHRoLT5zb3VyY2U7CisJaXJlcS0+bG9jX2FkZHIJCT0gaXBfaGRyKHNrYiktPmRhZGRyOworCWlyZXEtPnJtdF9hZGRyCQk9IGlwX2hkcihza2IpLT5zYWRkcjsKIAlpcmVxLT5vcHQJCT0gTlVMTDsKIAogCS8qIFdlIHRocm93ZWQgdGhlIG9wdGlvbnMgb2YgdGhlIGluaXRpYWwgU1lOIGF3YXksIHNvIHdlIGhvcGUKQEAgLTI2MSw4ICsyNjEsOCBAQAogCQkJCQkJLnRvcyA9IFJUX0NPTk5fRkxBR1Moc2spIH0gfSwKIAkJCQkgICAgLnByb3RvID0gSVBQUk9UT19UQ1AsCiAJCQkJICAgIC51bGlfdSA9IHsgLnBvcnRzID0KLQkJCQkJICAgICAgIHsgLnNwb3J0ID0gc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkJIC5kcG9ydCA9IHNrYi0+aC50aC0+c291cmNlIH0gfSB9OworCQkJCQkgICAgICAgeyAuc3BvcnQgPSB0aC0+ZGVzdCwKKwkJCQkJCSAuZHBvcnQgPSB0aC0+c291cmNlIH0gfSB9OwogCQlzZWN1cml0eV9yZXFfY2xhc3NpZnlfZmxvdyhyZXEsICZmbCk7CiAJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSkgewogCQkJcmVxc2tfZnJlZShyZXEpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwppbmRleCAwYWEzMDQ3Li42ODE3ZDY0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYworKysgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwpAQCAtNjQ3LDYgKzY0NywxNCBAQAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKIAl9LAogCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9GUlRPX1JFU1BPTlNFLAorCQkucHJvY25hbWUJPSAidGNwX2ZydG9fcmVzcG9uc2UiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9mcnRvX3Jlc3BvbnNlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKIAkJLmN0bF9uYW1lCT0gTkVUX1RDUF9MT1dfTEFURU5DWSwKIAkJLnByb2NuYW1lCT0gInRjcF9sb3dfbGF0ZW5jeSIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2xvd19sYXRlbmN5LApAQCAtODAzLDYgKzgxMSwxNCBAQAogCQkucHJvY19oYW5kbGVyICAgPSAmcHJvY19hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCwKIAkJLnN0cmF0ZWd5CT0gJnN0cmF0ZWd5X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sLAogCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX01BWF9TU1RIUkVTSCwKKwkJLnByb2NuYW1lCT0gInRjcF9tYXhfc3N0aHJlc2giLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9tYXhfc3N0aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDM4MzRiMTAuLjJjZjlhODkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0yOTcsNyArMjk3LDcgQEAKICAqIEFsbCB0aGUgc2tfc3RyZWFtX21lbV9zY2hlZHVsZSgpIGlzIG9mIHRoaXMgbmF0dXJlOiBhY2NvdW50aW5nCiAgKiBpcyBzdHJpY3QsIGFjdGlvbnMgYXJlIGFkdmlzb3J5IGFuZCBoYXZlIHNvbWUgbGF0ZW5jeS4KICAqLwotaW50IHRjcF9tZW1vcnlfcHJlc3N1cmU7CitpbnQgdGNwX21lbW9yeV9wcmVzc3VyZSBfX3JlYWRfbW9zdGx5OwogCiBFWFBPUlRfU1lNQk9MKHRjcF9tZW1vcnlfcHJlc3N1cmUpOwogCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJCS8qIFN1YnRyYWN0IDEsIGlmIEZJTiBpcyBpbiBxdWV1ZS4gKi8KIAkJCWlmIChhbnN3ICYmICFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKIAkJCQlhbnN3IC09Ci0JCSAgICAgICAoKHN0cnVjdCBza19idWZmICopc2stPnNrX3JlY2VpdmVfcXVldWUucHJldiktPmgudGgtPmZpbjsKKwkJICAgICAgIHRjcF9oZHIoKHN0cnVjdCBza19idWZmICopc2stPnNrX3JlY2VpdmVfcXVldWUucHJldiktPmZpbjsKIAkJfSBlbHNlCiAJCQlhbnN3ID0gdHAtPnVyZ19zZXEgLSB0cC0+Y29waWVkX3NlcTsKIAkJcmVsZWFzZV9zb2NrKHNrKTsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX07CisJfQogCiAJcmV0dXJuIHB1dF91c2VyKGFuc3csIChpbnQgX191c2VyICopYXJnKTsKIH0KQEAgLTQ2MCw5ICs0NjAsOSBAQAogCXJldHVybiBhZnRlcih0cC0+d3JpdGVfc2VxLCB0cC0+cHVzaGVkX3NlcSArICh0cC0+bWF4X3dpbmRvdyA+PiAxKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZW50YWlsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2VudGFpbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHRjcF9za2JfY2IgKnRjYiA9IFRDUF9TS0JfQ0Ioc2tiKTsKIAogCXNrYi0+Y3N1bSAgICA9IDA7CkBAIC00NzAsMTAgKzQ3MCw4IEBACiAJdGNiLT5mbGFncyAgID0gVENQQ0JfRkxBR19BQ0s7CiAJdGNiLT5zYWNrZWQgID0gMDsKIAlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKLQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJdGNwX2FkZF93cml0ZV9xdWV1ZV90YWlsKHNrLCBza2IpOwogCXNrX2NoYXJnZV9za2Ioc2ssIHNrYik7Ci0JaWYgKCFzay0+c2tfc2VuZF9oZWFkKQotCQlzay0+c2tfc2VuZF9oZWFkID0gc2tiOwogCWlmICh0cC0+bm9uYWdsZSAmIFRDUF9OQUdMRV9QVVNIKQogCQl0cC0+bm9uYWdsZSAmPSB+VENQX05BR0xFX1BVU0g7CiB9CkBAIC00ODgsMTUgKzQ4NiwxNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRjcF9wdXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGZsYWdzLAotCQkJICAgIGludCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfcHVzaChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50IG1zc19ub3csCisJCQkgICAgaW50IG5vbmFnbGUpCiB7Ci0JaWYgKHNrLT5za19zZW5kX2hlYWQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za193cml0ZV9xdWV1ZS5wcmV2OworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKHRjcF9zZW5kX2hlYWQoc2spKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAJCWlmICghKGZsYWdzICYgTVNHX01PUkUpIHx8IGZvcmNlZF9wdXNoKHRwKSkKIAkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CiAJCXRjcF9tYXJrX3VyZyh0cCwgZmxhZ3MsIHNrYik7Ci0JCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwLCBtc3Nfbm93LAorCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCBtc3Nfbm93LAogCQkJCQkgIChmbGFncyAmIE1TR19NT1JFKSA/IFRDUF9OQUdMRV9DT1JLIDogbm9uYWdsZSk7CiAJfQogfQpAQCAtNTI2LDEzICs1MjYsMTMgQEAKIAkJZ290byBkb19lcnJvcjsKIAogCXdoaWxlIChwc2l6ZSA+IDApIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za193cml0ZV9xdWV1ZS5wcmV2OworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdGNwX3dyaXRlX3F1ZXVlX3RhaWwoc2spOwogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BvZmZzZXQgLyBQQUdFX1NJWkVdOwogCQlpbnQgY29weSwgaSwgY2FuX2NvYWxlc2NlOwogCQlpbnQgb2Zmc2V0ID0gcG9mZnNldCAlIFBBR0VfU0laRTsKIAkJaW50IHNpemUgPSBtaW5fdChzaXplX3QsIHBzaXplLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCi0JCWlmICghc2stPnNrX3NlbmRfaGVhZCB8fCAoY29weSA9IHNpemVfZ29hbCAtIHNrYi0+bGVuKSA8PSAwKSB7CisJCWlmICghdGNwX3NlbmRfaGVhZChzaykgfHwgKGNvcHkgPSBzaXplX2dvYWwgLSBza2ItPmxlbikgPD0gMCkgewogbmV3X3NlZ21lbnQ6CiAJCQlpZiAoIXNrX3N0cmVhbV9tZW1vcnlfZnJlZShzaykpCiAJCQkJZ290byB3YWl0X2Zvcl9zbmRidWY7CkBAIC01NDIsNyArNTQyLDcgQEAKIAkJCWlmICghc2tiKQogCQkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OwogCi0JCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKKwkJCXNrYl9lbnRhaWwoc2ssIHNrYik7CiAJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQl9CiAKQEAgLTU4OCw4ICs1ODgsOCBAQAogCiAJCWlmIChmb3JjZWRfcHVzaCh0cCkpIHsKIAkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7Ci0JCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOwotCQl9IGVsc2UgaWYgKHNrYiA9PSBzay0+c2tfc2VuZF9oZWFkKQorCQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCQl9IGVsc2UgaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKIAkJCXRjcF9wdXNoX29uZShzaywgbXNzX25vdyk7CiAJCWNvbnRpbnVlOwogCkBAIC01OTcsNyArNTk3LDcgQEAKIAkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CiB3YWl0X2Zvcl9tZW1vcnk6CiAJCWlmIChjb3BpZWQpCi0JCQl0Y3BfcHVzaChzaywgdHAsIGZsYWdzICYgfk1TR19NT1JFLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CisJCQl0Y3BfcHVzaChzaywgZmxhZ3MgJiB+TVNHX01PUkUsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKIAogCQlpZiAoKGVyciA9IHNrX3N0cmVhbV93YWl0X21lbW9yeShzaywgJnRpbWVvKSkgIT0gMCkKIAkJCWdvdG8gZG9fZXJyb3I7CkBAIC02MDgsNyArNjA4LDcgQEAKIAogb3V0OgogCWlmIChjb3BpZWQpCi0JCXRjcF9wdXNoKHNrLCB0cCwgZmxhZ3MsIG1zc19ub3csIHRwLT5ub25hZ2xlKTsKKwkJdGNwX3B1c2goc2ssIGZsYWdzLCBtc3Nfbm93LCB0cC0+bm9uYWdsZSk7CiAJcmV0dXJuIGNvcGllZDsKIAogZG9fZXJyb3I6CkBAIC02MzksOCArNjM5LDkgQEAKICNkZWZpbmUgVENQX1BBR0Uoc2spCShzay0+c2tfc25kbXNnX3BhZ2UpCiAjZGVmaW5lIFRDUF9PRkYoc2spCShzay0+c2tfc25kbXNnX29mZikKIAotc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X3NpemUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X3NpemUoc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWludCB0bXAgPSB0cC0+bXNzX2NhY2hlOwogCiAJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9TRykgewpAQCAtNzA0LDkgKzcwNSw5IEBACiAJCXdoaWxlIChzZWdsZW4gPiAwKSB7CiAJCQlpbnQgY29weTsKIAotCQkJc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLnByZXY7CisJCQlza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAKLQkJCWlmICghc2stPnNrX3NlbmRfaGVhZCB8fAorCQkJaWYgKCF0Y3Bfc2VuZF9oZWFkKHNrKSB8fAogCQkJICAgIChjb3B5ID0gc2l6ZV9nb2FsIC0gc2tiLT5sZW4pIDw9IDApIHsKIAogbmV3X3NlZ21lbnQ6CkBAIC03MTYsNyArNzE3LDcgQEAKIAkJCQlpZiAoIXNrX3N0cmVhbV9tZW1vcnlfZnJlZShzaykpCiAJCQkJCWdvdG8gd2FpdF9mb3Jfc25kYnVmOwogCi0JCQkJc2tiID0gc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc2ssIHNlbGVjdF9zaXplKHNrLCB0cCksCisJCQkJc2tiID0gc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc2ssIHNlbGVjdF9zaXplKHNrKSwKIAkJCQkJCQkgICAwLCBzay0+c2tfYWxsb2NhdGlvbik7CiAJCQkJaWYgKCFza2IpCiAJCQkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OwpAQCAtNzI3LDcgKzcyOCw3IEBACiAJCQkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9BTExfQ1NVTSkKIAkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCi0JCQkJc2tiX2VudGFpbChzaywgdHAsIHNrYik7CisJCQkJc2tiX2VudGFpbChzaywgc2tiKTsKIAkJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQkJfQogCkBAIC04MzIsOCArODMzLDggQEAKIAogCQkJaWYgKGZvcmNlZF9wdXNoKHRwKSkgewogCQkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7Ci0JCQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKLQkJCX0gZWxzZSBpZiAoc2tiID09IHNrLT5za19zZW5kX2hlYWQpCisJCQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCQkJfSBlbHNlIGlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCiAJCQkJdGNwX3B1c2hfb25lKHNrLCBtc3Nfbm93KTsKIAkJCWNvbnRpbnVlOwogCkBAIC04NDEsNyArODQyLDcgQEAKIAkJCXNldF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogd2FpdF9mb3JfbWVtb3J5OgogCQkJaWYgKGNvcGllZCkKLQkJCQl0Y3BfcHVzaChzaywgdHAsIGZsYWdzICYgfk1TR19NT1JFLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CisJCQkJdGNwX3B1c2goc2ssIGZsYWdzICYgfk1TR19NT1JFLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CiAKIAkJCWlmICgoZXJyID0gc2tfc3RyZWFtX3dhaXRfbWVtb3J5KHNrLCAmdGltZW8pKSAhPSAwKQogCQkJCWdvdG8gZG9fZXJyb3I7CkBAIC04NTMsMTYgKzg1NCwxOCBAQAogCiBvdXQ6CiAJaWYgKGNvcGllZCkKLQkJdGNwX3B1c2goc2ssIHRwLCBmbGFncywgbXNzX25vdywgdHAtPm5vbmFnbGUpOworCQl0Y3BfcHVzaChzaywgZmxhZ3MsIG1zc19ub3csIHRwLT5ub25hZ2xlKTsKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGNvcGllZDsKIAogZG9fZmF1bHQ6CiAJaWYgKCFza2ItPmxlbikgewotCQlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2IpCi0JCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKLQkJX19za2JfdW5saW5rKHNrYiwgJnNrLT5za193cml0ZV9xdWV1ZSk7CisJCXRjcF91bmxpbmtfd3JpdGVfcXVldWUoc2tiLCBzayk7CisJCS8qIEl0IGlzIHRoZSBvbmUgcGxhY2UgaW4gYWxsIG9mIFRDUCwgZXhjZXB0IGNvbm5lY3Rpb24KKwkJICogcmVzZXQsIHdoZXJlIHdlIGNhbiBiZSB1bmxpbmtpbmcgdGhlIHNlbmRfaGVhZC4KKwkJICovCisJCXRjcF9jaGVja19zZW5kX2hlYWQoc2ssIHNrYik7CiAJCXNrX3N0cmVhbV9mcmVlX3NrYihzaywgc2tiKTsKIAl9CiAKQEAgLTEwMTYsOSArMTAxOSw5IEBACiAKIAlza2JfcXVldWVfd2Fsaygmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYikgewogCQlvZmZzZXQgPSBzZXEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJaWYgKHNrYi0+aC50aC0+c3luKQorCQlpZiAodGNwX2hkcihza2IpLT5zeW4pCiAJCQlvZmZzZXQtLTsKLQkJaWYgKG9mZnNldCA8IHNrYi0+bGVuIHx8IHNrYi0+aC50aC0+ZmluKSB7CisJCWlmIChvZmZzZXQgPCBza2ItPmxlbiB8fCB0Y3BfaGRyKHNrYiktPmZpbikgewogCQkJKm9mZiA9IG9mZnNldDsKIAkJCXJldHVybiBza2I7CiAJCX0KQEAgLTEwNzAsNyArMTA3Myw3IEBACiAJCQlpZiAob2Zmc2V0ICE9IHNrYi0+bGVuKQogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChza2ItPmgudGgtPmZpbikgeworCQlpZiAodGNwX2hkcihza2IpLT5maW4pIHsKIAkJCXNrX2VhdF9za2Ioc2ssIHNrYiwgMCk7CiAJCQkrK3NlcTsKIAkJCWJyZWFrOwpAQCAtMTE3NCwxMSArMTE3NywxMSBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJb2Zmc2V0ID0gKnNlcSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwotCQkJaWYgKHNrYi0+aC50aC0+c3luKQorCQkJaWYgKHRjcF9oZHIoc2tiKS0+c3luKQogCQkJCW9mZnNldC0tOwogCQkJaWYgKG9mZnNldCA8IHNrYi0+bGVuKQogCQkJCWdvdG8gZm91bmRfb2tfc2tiOwotCQkJaWYgKHNrYi0+aC50aC0+ZmluKQorCQkJaWYgKHRjcF9oZHIoc2tiKS0+ZmluKQogCQkJCWdvdG8gZm91bmRfZmluX29rOwogCQkJQlVHX1RSQVAoZmxhZ3MgJiBNU0dfUEVFSyk7CiAJCQlza2IgPSBza2ItPm5leHQ7CkBAIC0xMzg5LDEyICsxMzkyLDEyIEBACiBza2lwX2NvcHk6CiAJCWlmICh0cC0+dXJnX2RhdGEgJiYgYWZ0ZXIodHAtPmNvcGllZF9zZXEsIHRwLT51cmdfc2VxKSkgewogCQkJdHAtPnVyZ19kYXRhID0gMDsKLQkJCXRjcF9mYXN0X3BhdGhfY2hlY2soc2ssIHRwKTsKKwkJCXRjcF9mYXN0X3BhdGhfY2hlY2soc2spOwogCQl9CiAJCWlmICh1c2VkICsgb2Zmc2V0IDwgc2tiLT5sZW4pCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2tiLT5oLnRoLT5maW4pCisJCWlmICh0Y3BfaGRyKHNrYiktPmZpbikKIAkJCWdvdG8gZm91bmRfZmluX29rOwogCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgewogCQkJc2tfZWF0X3NrYihzaywgc2tiLCBjb3BpZWRfZWFybHkpOwpAQCAtMTU2Myw3ICsxNTY2LDcgQEAKIAkgKi8KIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgewogCQl1MzIgbGVuID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gVENQX1NLQl9DQihza2IpLT5zZXEgLQotCQkJICBza2ItPmgudGgtPmZpbjsKKwkJCSAgdGNwX2hkcihza2IpLT5maW47CiAJCWRhdGFfd2FzX3VucmVhZCArPSBsZW47CiAJCV9fa2ZyZWVfc2tiKHNrYik7CiAJfQpAQCAtMTczMiw3ICsxNzM1LDcgQEAKIAogCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7CiAJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQlza19zdHJlYW1fd3JpdGVxdWV1ZV9wdXJnZShzayk7CisJdGNwX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAjaWZkZWYgQ09ORklHX05FVF9ETUEKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2FzeW5jX3dhaXRfcXVldWUpOwpAQCAtMTc1OCw3ICsxNzYxLDcgQEAKIAl0Y3Bfc2V0X2NhX3N0YXRlKHNrLCBUQ1BfQ0FfT3Blbik7CiAJdGNwX2NsZWFyX3JldHJhbnModHApOwogCWluZXRfY3NrX2RlbGFja19pbml0KHNrKTsKLQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKKwl0Y3BfaW5pdF9zZW5kX2hlYWQoc2spOwogCXRwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDA7CiAJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOwogCV9fc2tfZHN0X3Jlc2V0KHNrKTsKQEAgLTE4MzAsNyArMTgzMyw3IEBACiAJCQkgKiBmb3IgY3VycmVudGx5IHF1ZXVlZCBzZWdtZW50cy4KIAkJCSAqLwogCQkJdHAtPm5vbmFnbGUgfD0gVENQX05BR0xFX09GRnxUQ1BfTkFHTEVfUFVTSDsKLQkJCXRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCk7CisJCQl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJCX0gZWxzZSB7CiAJCQl0cC0+bm9uYWdsZSAmPSB+VENQX05BR0xFX09GRjsKIAkJfQpAQCAtMTg1NCw3ICsxODU3LDcgQEAKIAkJCXRwLT5ub25hZ2xlICY9IH5UQ1BfTkFHTEVfQ09SSzsKIAkJCWlmICh0cC0+bm9uYWdsZSZUQ1BfTkFHTEVfT0ZGKQogCQkJCXRwLT5ub25hZ2xlIHw9IFRDUF9OQUdMRV9QVVNIOwotCQkJdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwKTsKKwkJCXRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTk1NCw3ICsxOTU3LDggQEAKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwotCX07CisJfQorCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjEyNCw3ICsyMTI4LDcgQEAKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQl9OworCX0KIAogCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMjE3MCw3ICsyMTc0LDcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKnRoKSkpCiAJCWdvdG8gb3V0OwogCi0JdGggPSBza2ItPmgudGg7CisJdGggPSB0Y3BfaGRyKHNrYik7CiAJdGhsZW4gPSB0aC0+ZG9mZiAqIDQ7CiAJaWYgKHRobGVuIDwgc2l6ZW9mKCp0aCkpCiAJCWdvdG8gb3V0OwpAQCAtMjIxMCw3ICsyMjE0LDcgQEAKIAlkZWx0YSA9IGh0b25sKG9sZGxlbiArICh0aGxlbiArIGxlbikpOwogCiAJc2tiID0gc2VnczsKLQl0aCA9IHNrYi0+aC50aDsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAlzZXEgPSBudG9obCh0aC0+c2VxKTsKIAogCWRvIHsKQEAgLTIyMTksMjMgKzIyMjMsMjUgQEAKIAkJdGgtPmNoZWNrID0gfmNzdW1fZm9sZCgoX19mb3JjZSBfX3dzdW0pKChfX2ZvcmNlIHUzMil0aC0+Y2hlY2sgKwogCQkJCSAgICAgICAoX19mb3JjZSB1MzIpZGVsdGEpKTsKIAkJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCi0JCQl0aC0+Y2hlY2sgPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKHNrYi0+aC5yYXcsIHRobGVuLAotCQkJCQkJCSAgIHNrYi0+Y3N1bSkpOworCQkJdGgtPmNoZWNrID0KKwkJCSAgICAgY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAorCQkJCQkJICAgIHRobGVuLCBza2ItPmNzdW0pKTsKIAogCQlzZXEgKz0gbGVuOwogCQlza2IgPSBza2ItPm5leHQ7Ci0JCXRoID0gc2tiLT5oLnRoOworCQl0aCA9IHRjcF9oZHIoc2tiKTsKIAogCQl0aC0+c2VxID0gaHRvbmwoc2VxKTsKIAkJdGgtPmN3ciA9IDA7CiAJfSB3aGlsZSAoc2tiLT5uZXh0KTsKIAotCWRlbHRhID0gaHRvbmwob2xkbGVuICsgKHNrYi0+dGFpbCAtIHNrYi0+aC5yYXcpICsgc2tiLT5kYXRhX2xlbik7CisJZGVsdGEgPSBodG9ubChvbGRsZW4gKyAoc2tiLT50YWlsIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyKSArCisJCSAgICAgIHNrYi0+ZGF0YV9sZW4pOwogCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQoKF9fZm9yY2UgX193c3VtKSgoX19mb3JjZSB1MzIpdGgtPmNoZWNrICsKIAkJCQkoX19mb3JjZSB1MzIpZGVsdGEpKTsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2ItPmgucmF3LCB0aGxlbiwKLQkJCQkJCSAgIHNrYi0+Y3N1bSkpOworCQl0aC0+Y2hlY2sgPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJCQkgICB0aGxlbiwgc2tiLT5jc3VtKSk7CiAKIG91dDoKIAlyZXR1cm4gc2VnczsKQEAgLTIzNzIsNiArMjM3OCwyMyBAQAogRVhQT1JUX1NZTUJPTChfX3RjcF9wdXRfbWQ1c2lnX3Bvb2wpOwogI2VuZGlmCiAKK3ZvaWQgdGNwX2RvbmUoc3RydWN0IHNvY2sgKnNrKQoreworCWlmKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQgfHwgc2stPnNrX3N0YXRlID09IFRDUF9TWU5fUkVDVikKKwkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0FUVEVNUFRGQUlMUyk7CisKKwl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOworCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7CisKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCWVsc2UKKwkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKHNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF9kb25lKTsKKwogZXh0ZXJuIHZvaWQgX19za2JfY2JfdG9vX3NtYWxsX2Zvcl90Y3AoaW50LCBpbnQpOwogZXh0ZXJuIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3Jlbm87CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9iaWMuYyBiL25ldC9pcHY0L3RjcF9iaWMuYwppbmRleCA1NzMwMzMzLi4yODFjOWY5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfYmljLmMKKysrIGIvbmV0L2lwdjQvdGNwX2JpYy5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIC8qIFRyYWNrIGRlbGF5ZWQgYWNrbm93bGVkZ21lbnQgcmF0aW8gdXNpbmcgc2xpZGluZyB3aW5kb3cKICAqIHJhdGlvID0gKDE1KnJhdGlvICsgc2FtcGxlKSAvIDE2CiAgKi8KLXN0YXRpYyB2b2lkIGJpY3RjcF9hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQpCitzdGF0aWMgdm9pZCBiaWN0Y3BfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250LCBrdGltZV90IGxhc3QpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCAzNGFlM2YxLi44NmIyNjUzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCitpbnQgc3lzY3RsX3RjcF9tYXhfc3N0aHJlc2ggPSAwOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRjcF9jb25nX2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKHRjcF9jb25nX2xpc3QpOwogCkBAIC0xMjQsNyArMTI2LDcgQEAKICNlbmRpZgogCiAJaWYgKGNhKSB7Ci0JCWNhLT5ub25fcmVzdHJpY3RlZCA9IDE7CS8qIGRlZmF1bHQgaXMgYWx3YXlzIGFsbG93ZWQgKi8KKwkJY2EtPmZsYWdzIHw9IFRDUF9DT05HX05PTl9SRVNUUklDVEVEOwkvKiBkZWZhdWx0IGlzIGFsd2F5cyBhbGxvd2VkICovCiAJCWxpc3RfbW92ZSgmY2EtPmxpc3QsICZ0Y3BfY29uZ19saXN0KTsKIAkJcmV0ID0gMDsKIAl9CkBAIC0xNzksNyArMTgxLDcgQEAKIAkqYnVmID0gJ1wwJzsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2EsICZ0Y3BfY29uZ19saXN0LCBsaXN0KSB7Ci0JCWlmICghY2EtPm5vbl9yZXN0cmljdGVkKQorCQlpZiAoIShjYS0+ZmxhZ3MgJiBUQ1BfQ09OR19OT05fUkVTVFJJQ1RFRCkpCiAJCQljb250aW51ZTsKIAkJb2ZmcyArPSBzbnByaW50ZihidWYgKyBvZmZzLCBtYXhsZW4gLSBvZmZzLAogCQkJCSAiJXMlcyIsCkBAIC0yMTAsMTYgKzIxMiwxNiBAQAogCQl9CiAJfQogCi0JLyogcGFzcyAyIGNsZWFyICovCisJLyogcGFzcyAyIGNsZWFyIG9sZCB2YWx1ZXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjYSwgJnRjcF9jb25nX2xpc3QsIGxpc3QpCi0JCWNhLT5ub25fcmVzdHJpY3RlZCA9IDA7CisJCWNhLT5mbGFncyAmPSB+VENQX0NPTkdfTk9OX1JFU1RSSUNURUQ7CiAKIAkvKiBwYXNzIDMgbWFyayBhcyBhbGxvd2VkICovCiAJd2hpbGUgKChuYW1lID0gc3Ryc2VwKCZ2YWwsICIgIikpICYmICpuYW1lKSB7CiAJCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CiAJCVdBUk5fT04oIWNhKTsKIAkJaWYgKGNhKQotCQkJY2EtPm5vbl9yZXN0cmljdGVkID0gMTsKKwkJCWNhLT5mbGFncyB8PSBUQ1BfQ09OR19OT05fUkVTVFJJQ1RFRDsKIAl9CiBvdXQ6CiAJc3Bpbl91bmxvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CkBAIC0yNTQsNyArMjU2LDcgQEAKIAlpZiAoIWNhKQogCQllcnIgPSAtRU5PRU5UOwogCi0JZWxzZSBpZiAoIShjYS0+bm9uX3Jlc3RyaWN0ZWQgfHwgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkpCisJZWxzZSBpZiAoISgoY2EtPmZsYWdzICYgVENQX0NPTkdfTk9OX1JFU1RSSUNURUQpIHx8IGNhcGFibGUoQ0FQX05FVF9BRE1JTikpKQogCQllcnIgPSAtRVBFUk07CiAKIAllbHNlIGlmICghdHJ5X21vZHVsZV9nZXQoY2EtPm93bmVyKSkKQEAgLTI3NCwxMCArMjc2LDEzIEBACiAKIAogLyoKLSAqIExpbmVhciBpbmNyZWFzZSBkdXJpbmcgc2xvdyBzdGFydAorICogU2xvdyBzdGFydCAoZXhwb25lbnRpYWwgaW5jcmVhc2UpIHdpdGgKKyAqIFJGQzM3NDIgTGltaXRlZCBTbG93IFN0YXJ0IChmYXN0IGxpbmVhciBpbmNyZWFzZSkgc3VwcG9ydC4KICAqLwogdm9pZCB0Y3Bfc2xvd19zdGFydChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogeworCWludCBjbnQgPSAwOworCiAJaWYgKHN5c2N0bF90Y3BfYWJjKSB7CiAJCS8qIFJGQzM0NjU6IFNsb3cgU3RhcnQKIAkJICogVENQIHNlbmRlciBTSE9VTEQgaW5jcmVhc2UgY3duZCBieSB0aGUgbnVtYmVyIG9mCkBAIC0yODYsMTcgKzI5MSwyNSBAQAogCQkgKi8KIAkJaWYgKHRwLT5ieXRlc19hY2tlZCA8IHRwLT5tc3NfY2FjaGUpCiAJCQlyZXR1cm47Ci0KLQkJLyogV2UgTUFZIGluY3JlYXNlIGJ5IDIgaWYgZGlzY292ZXJlZCBkZWxheWVkIGFjayAqLwotCQlpZiAoc3lzY3RsX3RjcF9hYmMgPiAxICYmIHRwLT5ieXRlc19hY2tlZCA+PSAyKnRwLT5tc3NfY2FjaGUpIHsKLQkJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApCi0JCQkJdHAtPnNuZF9jd25kKys7Ci0JCX0KIAl9CisKKwlpZiAoc3lzY3RsX3RjcF9tYXhfc3N0aHJlc2ggPiAwICYmCisJICAgIHRwLT5zbmRfY3duZCA+IHN5c2N0bF90Y3BfbWF4X3NzdGhyZXNoKQorCQljbnQgKz0gc3lzY3RsX3RjcF9tYXhfc3N0aHJlc2g+PjE7CisJZWxzZQorCQljbnQgKz0gdHAtPnNuZF9jd25kOworCisJLyogUkZDMzQ2NTogV2UgTUFZIGluY3JlYXNlIGJ5IDIgaWYgZGlzY292ZXJlZCBkZWxheWVkIGFjayAqLworCWlmIChzeXNjdGxfdGNwX2FiYyA+IDEgJiYgdHAtPmJ5dGVzX2Fja2VkID49IDIqdHAtPm1zc19jYWNoZSkKKwkJY250IDw8PSAxOwogCXRwLT5ieXRlc19hY2tlZCA9IDA7CiAKLQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQotCQl0cC0+c25kX2N3bmQrKzsKKwl0cC0+c25kX2N3bmRfY250ICs9IGNudDsKKwl3aGlsZSAodHAtPnNuZF9jd25kX2NudCA+PSB0cC0+c25kX2N3bmQpIHsKKwkJdHAtPnNuZF9jd25kX2NudCAtPSB0cC0+c25kX2N3bmQ7CisJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApCisJCQl0cC0+c25kX2N3bmQrKzsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0Y3Bfc2xvd19zdGFydCk7CiAKQEAgLTM1OCw4ICszNzEsOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodGNwX3Jlbm9fbWluX2N3bmQpOwogCiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9yZW5vID0geworCS5mbGFncwkJPSBUQ1BfQ09OR19OT05fUkVTVFJJQ1RFRCwKIAkubmFtZQkJPSAicmVubyIsCi0JLm5vbl9yZXN0cmljdGVkID0gMSwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLnNzdGhyZXNoCT0gdGNwX3Jlbm9fc3N0aHJlc2gsCiAJLmNvbmdfYXZvaWQJPSB0Y3BfcmVub19jb25nX2F2b2lkLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2N1YmljLmMgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwppbmRleCA5YTU4MmZiLi4xNDIyNDQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY3ViaWMuYworKysgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBUQ1AgQ1VCSUM6IEJpbmFyeSBJbmNyZWFzZSBDb25nZXN0aW9uIGNvbnRyb2wgZm9yIFRDUCB2Mi4wCisgKiBUQ1AgQ1VCSUM6IEJpbmFyeSBJbmNyZWFzZSBDb25nZXN0aW9uIGNvbnRyb2wgZm9yIFRDUCB2Mi4xCiAgKgogICogVGhpcyBpcyBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBDVUJJQyBUQ1AgaW4KICAqIEluam9uZyBSaGVlLCBMaXNvbmcgWHUuCkBAIC01MSw4ICs1MSw2IEBACiBtb2R1bGVfcGFyYW0odGNwX2ZyaWVuZGxpbmVzcywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModGNwX2ZyaWVuZGxpbmVzcywgInR1cm4gb24vb2ZmIHRjcCBmcmllbmRsaW5lc3MiKTsKIAotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCiAvKiBCSUMgVENQIFBhcmFtZXRlcnMgKi8KIHN0cnVjdCBiaWN0Y3AgewogCXUzMgljbnQ7CQkvKiBpbmNyZWFzZSBjd25kIGJ5IDEgYWZ0ZXIgQUNLcyAqLwpAQCAtOTMsNTAgKzkxLDUxIEBACiAJCXRjcF9zayhzayktPnNuZF9zc3RocmVzaCA9IGluaXRpYWxfc3N0aHJlc2g7CiB9CiAKLS8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCi1zdGF0aWMgaW5saW5lIHVfaW50NjRfdCBkaXY2NF82NCh1X2ludDY0X3QgZGl2aWRlbmQsIHVfaW50NjRfdCBkaXZpc29yKQotewotCXVfaW50MzJfdCBkID0gZGl2aXNvcjsKLQotCWlmIChkaXZpc29yID4gMHhmZmZmZmZmZlVMTCkgewotCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBmbHMoZGl2aXNvciA+PiAzMik7Ci0KLQkJZCA9IGRpdmlzb3IgPj4gc2hpZnQ7Ci0JCWRpdmlkZW5kID4+PSBzaGlmdDsKLQl9Ci0KLQkvKiBhdm9pZCA2NCBiaXQgZGl2aXNpb24gaWYgcG9zc2libGUgKi8KLQlpZiAoZGl2aWRlbmQgPj4gMzIpCi0JCWRvX2RpdihkaXZpZGVuZCwgZCk7Ci0JZWxzZQotCQlkaXZpZGVuZCA9ICh1aW50MzJfdCkgZGl2aWRlbmQgLyBkOwotCi0JcmV0dXJuIGRpdmlkZW5kOwotfQotCi0vKgotICogY2FsY3VsYXRlIHRoZSBjdWJpYyByb290IG9mIHggdXNpbmcgTmV3dG9uLVJhcGhzb24KKy8qIGNhbGN1bGF0ZSB0aGUgY3ViaWMgcm9vdCBvZiB4IHVzaW5nIGEgdGFibGUgbG9va3VwIGZvbGxvd2VkIGJ5IG9uZQorICogTmV3dG9uLVJhcGhzb24gaXRlcmF0aW9uLgorICogQXZnIGVyciB+PSAwLjE5NSUKICAqLwogc3RhdGljIHUzMiBjdWJpY19yb290KHU2NCBhKQogewotCXUzMiB4LCB4MTsKLQotCS8qIEluaXRpYWwgZXN0aW1hdGUgaXMgYmFzZWQgb246Ci0JICogY2JydCh4KSA9IGV4cChsb2coeCkgLyAzKQorCXUzMiB4LCBiLCBzaGlmdDsKKwkvKgorCSAqIGNicnQoeCkgTVNCIHZhbHVlcyBmb3IgeCBNU0IgdmFsdWVzIGluIFswLi42M10uCisJICogUHJlY29tcHV0ZWQgdGhlbiByZWZpbmVkIGJ5IGhhbmQgLSBXaWxseSBUYXJyZWF1CisJICoKKwkgKiBGb3IgeCBpbiBbMC4uNjNdLAorCSAqICAgdiA9IGNicnQoeCA8PCAxOCkgLSAxCisJICogICBjYnJ0KHgpID0gKHZbeF0gKyAxMCkgPj4gNgogCSAqLwotCXggPSAxdSA8PCAoZmxzNjQoYSkvMyk7CisJc3RhdGljIGNvbnN0IHU4IHZbXSA9IHsKKwkJLyogMHgwMCAqLyAgICAwLCAgIDU0LCAgIDU0LCAgIDU0LCAgMTE4LCAgMTE4LCAgMTE4LCAgMTE4LAorCQkvKiAweDA4ICovICAxMjMsICAxMjksICAxMzQsICAxMzgsICAxNDMsICAxNDcsICAxNTEsICAxNTYsCisJCS8qIDB4MTAgKi8gIDE1NywgIDE2MSwgIDE2NCwgIDE2OCwgIDE3MCwgIDE3MywgIDE3NiwgIDE3OSwKKwkJLyogMHgxOCAqLyAgMTgxLCAgMTg1LCAgMTg3LCAgMTkwLCAgMTkyLCAgMTk0LCAgMTk3LCAgMTk5LAorCQkvKiAweDIwICovICAyMDAsICAyMDIsICAyMDQsICAyMDYsICAyMDksICAyMTEsICAyMTMsICAyMTUsCisJCS8qIDB4MjggKi8gIDIxNywgIDIxOSwgIDIyMSwgIDIyMiwgIDIyNCwgIDIyNSwgIDIyNywgIDIyOSwKKwkJLyogMHgzMCAqLyAgMjMxLCAgMjMyLCAgMjM0LCAgMjM2LCAgMjM3LCAgMjM5LCAgMjQwLCAgMjQyLAorCQkvKiAweDM4ICovICAyNDQsICAyNDUsICAyNDYsICAyNDgsICAyNTAsICAyNTEsICAyNTIsICAyNTQsCisJfTsKKworCWIgPSBmbHM2NChhKTsKKwlpZiAoYiA8IDcpIHsKKwkJLyogYSBpbiBbMC4uNjNdICovCisJCXJldHVybiAoKHUzMil2Wyh1MzIpYV0gKyAzNSkgPj4gNjsKKwl9CisKKwliID0gKChiICogODQpID4+IDgpIC0gMTsKKwlzaGlmdCA9IChhID4+IChiICogMykpOworCisJeCA9ICgodTMyKSgoKHUzMil2W3NoaWZ0XSArIDEwKSA8PCBiKSkgPj4gNjsKIAogCS8qCi0JICogSXRlcmF0aW9uIGJhc2VkIG9uOgorCSAqIE5ld3Rvbi1SYXBoc29uIGl0ZXJhdGlvbgogCSAqICAgICAgICAgICAgICAgICAgICAgICAgIDIKIAkgKiB4ICAgID0gKCAyICogeCAgKyAgYSAvIHggICkgLyAzCiAJICogIGsrMSAgICAgICAgICBrICAgICAgICAgawogCSAqLwotCWRvIHsKLQkJeDEgPSB4OwotCQl4ID0gKDIgKiB4ICsgKHVpbnQzMl90KSBkaXY2NF82NChhLCB4KngpKSAvIDM7Ci0JfSB3aGlsZSAoYWJzKHgxIC0geCkgPiAxKTsKLQorCXggPSAoMiAqIHggKyAodTMyKWRpdjY0XzY0KGEsICh1NjQpeCAqICh1NjQpKHggLSAxKSkpOworCXggPSAoKHggKiAzNDEpID4+IDEwKTsKIAlyZXR1cm4geDsKIH0KIApAQCAtMjE1LDcgKzIxNCw5IEBACiAJaWYgKGNhLT5kZWxheV9taW4gPiAwKSB7CiAJCS8qIG1heCBpbmNyZW1lbnQgPSBTbWF4ICogcnR0IC8gMC4xICAqLwogCQltaW5fY250ID0gKGN3bmQgKiBIWiAqIDgpLygxMCAqIG1heF9pbmNyZW1lbnQgKiBjYS0+ZGVsYXlfbWluKTsKLQkJaWYgKGNhLT5jbnQgPCBtaW5fY250KQorCisJCS8qIHVzZSBjb25jYXZlIGdyb3d0aCB3aGVuIHRoZSB0YXJnZXQgaXMgYWJvdmUgdGhlIG9yaWdpbiAqLworCQlpZiAoY2EtPmNudCA8IG1pbl9jbnQgJiYgdCA+PSBjYS0+YmljX0spCiAJCQljYS0+Y250ID0gbWluX2NudDsKIAl9CiAKQEAgLTMzMyw3ICszMzQsNyBAQAogLyogVHJhY2sgZGVsYXllZCBhY2tub3dsZWRnbWVudCByYXRpbyB1c2luZyBzbGlkaW5nIHdpbmRvdwogICogcmF0aW8gPSAoMTUqcmF0aW8gKyBzYW1wbGUpIC8gMTYKICAqLwotc3RhdGljIHZvaWQgYmljdGNwX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIGNudCkKK3N0YXRpYyB2b2lkIGJpY3RjcF9hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQsIGt0aW1lX3QgbGFzdCkKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAKQEAgLTQwMSw0ICs0MDIsNCBAQAogTU9EVUxFX0FVVEhPUigiU2FuZ3RhZSBIYSwgU3RlcGhlbiBIZW1taW5nZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ1VCSUMgVENQIik7Ci1NT0RVTEVfVkVSU0lPTigiMi4wIik7CitNT0RVTEVfVkVSU0lPTigiMi4xIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaHRjcC5jIGIvbmV0L2lwdjQvdGNwX2h0Y3AuYwppbmRleCAxMDIwZWI0Li40YmE0YTdhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaHRjcC5jCisrKyBiL25ldC9pcHY0L3RjcF9odGNwLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1lYXN1cmVfYWNoaWV2ZWRfdGhyb3VnaHB1dChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwa3RzX2Fja2VkKQorc3RhdGljIHZvaWQgbWVhc3VyZV9hY2hpZXZlZF90aHJvdWdocHV0KHN0cnVjdCBzb2NrICpzaywgdTMyIHBrdHNfYWNrZWQsIGt0aW1lX3QgbGFzdCkKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaHlibGEuYyBiL25ldC9pcHY0L3RjcF9oeWJsYS5jCmluZGV4IDU5ZTY5MWQuLmU1YmUzNTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9oeWJsYS5jCisrKyBiL25ldC9pcHY0L3RjcF9oeWJsYS5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAljYS0+c25kX2N3bmRfY2VudHMgKz0gb2RkOwogCiAJLyogY2hlY2sgd2hlbiBmcmFjdGlvbnMgZ29lcyA+PTEyOCBhbmQgaW5jcmVhc2UgY3duZCBieSAxLiAqLwotCXdoaWxlKGNhLT5zbmRfY3duZF9jZW50cyA+PSAxMjgpIHsKKwl3aGlsZSAoY2EtPnNuZF9jd25kX2NlbnRzID49IDEyOCkgewogCQl0cC0+c25kX2N3bmQrKzsKIAkJY2EtPnNuZF9jd25kX2NlbnRzIC09IDEyODsKIAkJdHAtPnNuZF9jd25kX2NudCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYyBiL25ldC9pcHY0L3RjcF9pbGxpbm9pcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGM0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYwpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIFRDUCBJbGxpbm9pcyBjb25nZXN0aW9uIGNvbnRyb2wuCisgKiBIb21lIHBhZ2U6CisgKglodHRwOi8vd3d3LmV3cy51aXVjLmVkdS9+c2hhb2xpdS90Y3BpbGxpbm9pcy9pbmRleC5odG1sCisgKgorICogVGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW46CisgKiAiVENQLUlsbGlub2lzOiBBIExvc3MgYW5kIERlbGF5LUJhc2VkIENvbmdlc3Rpb24gQ29udHJvbCBBbGdvcml0aG0KKyAqICBmb3IgSGlnaC1TcGVlZCBOZXR3b3JrcyIKKyAqIGh0dHA6Ly93d3cuZXdzLnVpdWMuZWR1L35zaGFvbGl1L3BhcGVyc2FuZHNsaWRlcy9saXViYXNzcmkwNnBlcmYucGRmCisgKgorICogSW1wbGVtZW50ZWQgZnJvbSBkZXNjcmlwdGlvbiBpbiBwYXBlciBhbmQgbnMtMiBzaW11bGF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNkZWZpbmUgQUxQSEFfU0hJRlQJNworI2RlZmluZSBBTFBIQV9TQ0FMRQkoMXU8PEFMUEhBX1NISUZUKQorI2RlZmluZSBBTFBIQV9NSU4JKCgzKkFMUEhBX1NDQUxFKS8xMCkJLyogfjAuMyAqLworI2RlZmluZSBBTFBIQV9NQVgJKDEwKkFMUEhBX1NDQUxFKQkvKiAxMC4wICovCisjZGVmaW5lIEFMUEhBX0JBU0UJQUxQSEFfU0NBTEUJCS8qIDEuMCAqLworI2RlZmluZSBVMzJfTUFYCQkoKHUzMil+MFUpCisjZGVmaW5lIFJUVF9NQVgJCShVMzJfTUFYIC8gQUxQSEFfTUFYKQkvKiAzLjMgc2VjcyAqLworCisjZGVmaW5lIEJFVEFfU0hJRlQJNgorI2RlZmluZSBCRVRBX1NDQUxFCSgxdTw8QkVUQV9TSElGVCkKKyNkZWZpbmUgQkVUQV9NSU4JKEJFVEFfU0NBTEUvOCkJCS8qIDAuMTI1ICovCisjZGVmaW5lIEJFVEFfTUFYCShCRVRBX1NDQUxFLzIpCQkvKiAwLjUgKi8KKyNkZWZpbmUgQkVUQV9CQVNFCUJFVEFfTUFYCisKK3N0YXRpYyBpbnQgd2luX3RocmVzaCBfX3JlYWRfbW9zdGx5ID0gMTU7Cittb2R1bGVfcGFyYW0od2luX3RocmVzaCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2luX3RocmVzaCwgIldpbmRvdyB0aHJlc2hvbGQgZm9yIHN0YXJ0aW5nIGFkYXB0aXZlIHNpemluZyIpOworCitzdGF0aWMgaW50IHRoZXRhIF9fcmVhZF9tb3N0bHkgPSA1OworbW9kdWxlX3BhcmFtKHRoZXRhLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aGV0YSwgIiMgb2YgZmFzdCBSVFQncyBiZWZvcmUgZnVsbCBncm93dGgiKTsKKworLyogVENQIElsbGlub2lzIFBhcmFtZXRlcnMgKi8KK3N0cnVjdCBpbGxpbm9pcyB7CisJdTY0CXN1bV9ydHQ7CS8qIHN1bSBvZiBydHQncyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBydHQgKi8KKwl1MTYJY250X3J0dDsJLyogIyBvZiBydHRzIG1lYXN1cmVkIHdpdGhpbiBsYXN0IHJ0dCAqLworCXUzMgliYXNlX3J0dDsJLyogbWluIG9mIGFsbCBydHQgaW4gdXNlYyAqLworCXUzMgltYXhfcnR0OwkvKiBtYXggb2YgYWxsIHJ0dCBpbiB1c2VjICovCisJdTMyCWVuZF9zZXE7CS8qIHJpZ2h0IGVkZ2Ugb2YgY3VycmVudCBSVFQgKi8KKwl1MzIJYWxwaGE7CQkvKiBBZGRpdGl2ZSBpbmNyZWFzZSAqLworCXUzMgliZXRhOwkJLyogTXVsaXBsaWNhdGl2ZSBkZWNyZWFzZSAqLworCXUxNglhY2tlZDsJCS8qICMgcGFja2V0cyBhY2tlZCBieSBjdXJyZW50IEFDSyAqLworCXU4CXJ0dF9hYm92ZTsJLyogYXZlcmFnZSBydHQgaGFzIGdvbmUgYWJvdmUgdGhyZXNob2xkICovCisJdTgJcnR0X2xvdzsJLyogIyBvZiBydHRzIG1lYXN1cmVtZW50cyBiZWxvdyB0aHJlc2hvbGQgKi8KK307CisKK3N0YXRpYyB2b2lkIHJ0dF9yZXNldChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKworCWNhLT5lbmRfc2VxID0gdHAtPnNuZF9ueHQ7CisJY2EtPmNudF9ydHQgPSAwOworCWNhLT5zdW1fcnR0ID0gMDsKKworCS8qIFRPRE86IGFnZSBtYXhfcnR0PyAqLworfQorCitzdGF0aWMgdm9pZCB0Y3BfaWxsaW5vaXNfaW5pdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKworCWNhLT5hbHBoYSA9IEFMUEhBX01BWDsKKwljYS0+YmV0YSA9IEJFVEFfQkFTRTsKKwljYS0+YmFzZV9ydHQgPSAweDdmZmZmZmZmOworCWNhLT5tYXhfcnR0ID0gMDsKKworCWNhLT5hY2tlZCA9IDA7CisJY2EtPnJ0dF9sb3cgPSAwOworCWNhLT5ydHRfYWJvdmUgPSAwOworCisJcnR0X3Jlc2V0KHNrKTsKK30KKworLyogTWVhc3VyZSBSVFQgZm9yIGVhY2ggYWNrLiAqLworc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIHBrdHNfYWNrZWQsIGt0aW1lX3QgbGFzdCkKK3sKKwlzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBydHQ7CisKKwljYS0+YWNrZWQgPSBwa3RzX2Fja2VkOworCisJcnR0ID0ga3RpbWVfdG9fdXMobmV0X3RpbWVkZWx0YShsYXN0KSk7CisKKwkvKiBpZ25vcmUgYm9ndXMgdmFsdWVzLCB0aGlzIHByZXZlbnRzIHdyYXBhcm91bmQgaW4gYWxwaGEgbWF0aCAqLworCWlmIChydHQgPiBSVFRfTUFYKQorCQlydHQgPSBSVFRfTUFYOworCisJLyoga2VlcCB0cmFjayBvZiBtaW5pbXVtIFJUVCBzZWVuIHNvIGZhciAqLworCWlmIChjYS0+YmFzZV9ydHQgPiBydHQpCisJCWNhLT5iYXNlX3J0dCA9IHJ0dDsKKworCS8qIGFuZCBtYXggKi8KKwlpZiAoY2EtPm1heF9ydHQgPCBydHQpCisJCWNhLT5tYXhfcnR0ID0gcnR0OworCisJKytjYS0+Y250X3J0dDsKKwljYS0+c3VtX3J0dCArPSBydHQ7Cit9CisKKy8qIE1heGltdW0gcXVldWluZyBkZWxheSAqLworc3RhdGljIGlubGluZSB1MzIgbWF4X2RlbGF5KGNvbnN0IHN0cnVjdCBpbGxpbm9pcyAqY2EpCit7CisJcmV0dXJuIGNhLT5tYXhfcnR0IC0gY2EtPmJhc2VfcnR0OworfQorCisvKiBBdmVyYWdlIHF1ZXVpbmcgZGVsYXkgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGF2Z19kZWxheShjb25zdCBzdHJ1Y3QgaWxsaW5vaXMgKmNhKQoreworCXU2NCB0ID0gY2EtPnN1bV9ydHQ7CisKKwlkb19kaXYodCwgY2EtPmNudF9ydHQpOworCXJldHVybiB0IC0gY2EtPmJhc2VfcnR0OworfQorCisvKgorICogQ29tcHV0ZSB2YWx1ZSBvZiBhbHBoYSB1c2VkIGZvciBhZGRpdGl2ZSBpbmNyZWFzZS4KKyAqIElmIHNtYWxsIHdpbmRvdyB0aGVuIHVzZSAxLjAsIGVxdWl2YWxlbnQgdG8gUmVuby4KKyAqCisgKiBGb3IgbGFyZ2VyIHdpbmRvd3MsIGFkanVzdCBiYXNlZCBvbiBhdmVyYWdlIGRlbGF5LgorICogQS4gSWYgYXZlcmFnZSBkZWxheSBpcyBhdCBtaW5pbXVtICh3ZSBhcmUgdW5jb25nZXN0ZWQpLAorICogICAgdGhlbiB1c2UgbGFyZ2UgYWxwaGEgKDEwLjApIHRvIGluY3JlYXNlIGZhc3Rlci4KKyAqIEIuIElmIGF2ZXJhZ2UgZGVsYXkgaXMgYXQgbWF4aW11bSAoZ2V0dGluZyBjb25nZXN0ZWQpCisgKiAgICB0aGVuIHVzZSBzbWFsbCBhbHBoYSAoMC4zKQorICoKKyAqIFRoZSByZXN1bHQgaXMgYSBjb252ZXggd2luZG93IGdyb3d0aCBjdXJ2ZS4KKyAqLworc3RhdGljIHUzMiBhbHBoYShzdHJ1Y3QgaWxsaW5vaXMgKmNhLCB1MzIgZGEsIHUzMiBkbSkKK3sKKwl1MzIgZDEgPSBkbSAvIDEwMDsJLyogTG93IHRocmVzaG9sZCAqLworCisJaWYgKGRhIDw9IGQxKSB7CisJCS8qIElmIG5ldmVyIGdvdCBvdXQgb2YgbG93IGRlbGF5IHpvbmUsIHRoZW4gdXNlIG1heCAqLworCQlpZiAoIWNhLT5ydHRfYWJvdmUpCisJCQlyZXR1cm4gQUxQSEFfTUFYOworCisJCS8qIFdhaXQgZm9yIDUgZ29vZCBSVFQncyBiZWZvcmUgYWxsb3dpbmcgYWxwaGEgdG8gZ28gYWxwaGEgbWF4LgorCQkgKiBUaGlzIHByZXZlbnRzIG9uZSBnb29kIFJUVCBmcm9tIGNhdXNpbmcgc3VkZGVuIHdpbmRvdyBpbmNyZWFzZS4KKwkJICovCisJCWlmICgrK2NhLT5ydHRfbG93IDwgdGhldGEpCisJCQlyZXR1cm4gY2EtPmFscGhhOworCisJCWNhLT5ydHRfbG93ID0gMDsKKwkJY2EtPnJ0dF9hYm92ZSA9IDA7CisJCXJldHVybiBBTFBIQV9NQVg7CisJfQorCisJY2EtPnJ0dF9hYm92ZSA9IDE7CisKKwkvKgorCSAqIEJhc2VkIG9uOgorCSAqCisJICogICAgICAoZG0gLSBkMSkgYW1pbiBhbWF4CisJICogazEgPSAtLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICAgICAgICBhbWF4IC0gYW1pbgorCSAqCisJICogICAgICAgKGRtIC0gZDEpIGFtaW4KKwkgKiBrMiA9IC0tLS0tLS0tLS0tLS0tLS0gIC0gZDEKKwkgKiAgICAgICAgYW1heCAtIGFtaW4KKwkgKgorCSAqICAgICAgICAgICAgIGsxCisJICogYWxwaGEgPSAtLS0tLS0tLS0tCisJICogICAgICAgICAgazIgKyBkYQorCSAqLworCisJZG0gLT0gZDE7CisJZGEgLT0gZDE7CisJcmV0dXJuIChkbSAqIEFMUEhBX01BWCkgLworCQkoZG0gKyAoZGEgICogKEFMUEhBX01BWCAtIEFMUEhBX01JTikpIC8gQUxQSEFfTUlOKTsKK30KKworLyoKKyAqIEJldGEgdXNlZCBmb3IgbXVsdGlwbGljYXRpdmUgZGVjcmVhc2UuCisgKiBGb3Igc21hbGwgd2luZG93IHNpemVzIHJldHVybnMgc2FtZSB2YWx1ZSBhcyBSZW5vICgwLjUpCisgKgorICogSWYgZGVsYXkgaXMgc21hbGwgKDEwJSBvZiBtYXgpIHRoZW4gYmV0YSA9IDEvOAorICogSWYgZGVsYXkgaXMgdXAgdG8gODAlIG9mIG1heCB0aGVuIGJldGEgPSAxLzIKKyAqIEluIGJldHdlZW4gaXMgYSBsaW5lYXIgZnVuY3Rpb24KKyAqLworc3RhdGljIHUzMiBiZXRhKHUzMiBkYSwgdTMyIGRtKQoreworCXUzMiBkMiwgZDM7CisKKwlkMiA9IGRtIC8gMTA7CisJaWYgKGRhIDw9IGQyKQorCQlyZXR1cm4gQkVUQV9NSU47CisKKwlkMyA9ICg4ICogZG0pIC8gMTA7CisJaWYgKGRhID49IGQzIHx8IGQzIDw9IGQyKQorCQlyZXR1cm4gQkVUQV9NQVg7CisKKwkvKgorCSAqIEJhc2VkIG9uOgorCSAqCisJICogICAgICAgYm1pbiBkMyAtIGJtYXggZDIKKwkgKiBrMyA9IC0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgICAgICAgIGQzIC0gZDIKKwkgKgorCSAqICAgICAgIGJtYXggLSBibWluCisJICogazQgPSAtLS0tLS0tLS0tLS0tCisJICogICAgICAgICBkMyAtIGQyCisJICoKKwkgKiBiID0gazMgKyBrNCBkYQorCSAqLworCXJldHVybiAoQkVUQV9NSU4gKiBkMyAtIEJFVEFfTUFYICogZDIgKyAoQkVUQV9NQVggLSBCRVRBX01JTikgKiBkYSkKKwkJLyAoZDMgLSBkMik7Cit9CisKKy8qIFVwZGF0ZSBhbHBoYSBhbmQgYmV0YSB2YWx1ZXMgb25jZSBwZXIgUlRUICovCitzdGF0aWMgdm9pZCB1cGRhdGVfcGFyYW1zKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKHRwLT5zbmRfY3duZCA8IHdpbl90aHJlc2gpIHsKKwkJY2EtPmFscGhhID0gQUxQSEFfQkFTRTsKKwkJY2EtPmJldGEgPSBCRVRBX0JBU0U7CisJfSBlbHNlIGlmIChjYS0+Y250X3J0dCA+IDApIHsKKwkJdTMyIGRtID0gbWF4X2RlbGF5KGNhKTsKKwkJdTMyIGRhID0gYXZnX2RlbGF5KGNhKTsKKworCQljYS0+YWxwaGEgPSBhbHBoYShjYSwgZGEsIGRtKTsKKwkJY2EtPmJldGEgPSBiZXRhKGRhLCBkbSk7CisJfQorCisJcnR0X3Jlc2V0KHNrKTsKK30KKworLyoKKyAqIEluIGNhc2Ugb2YgbG9zcywgcmVzZXQgdG8gZGVmYXVsdCB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX3N0YXRlKHN0cnVjdCBzb2NrICpzaywgdTggbmV3X3N0YXRlKQoreworCXN0cnVjdCBpbGxpbm9pcyAqY2EgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAobmV3X3N0YXRlID09IFRDUF9DQV9Mb3NzKSB7CisJCWNhLT5hbHBoYSA9IEFMUEhBX0JBU0U7CisJCWNhLT5iZXRhID0gQkVUQV9CQVNFOworCQljYS0+cnR0X2xvdyA9IDA7CisJCWNhLT5ydHRfYWJvdmUgPSAwOworCQlydHRfcmVzZXQoc2spOworCX0KK30KKworLyoKKyAqIEluY3JlYXNlIHdpbmRvdyBpbiByZXNwb25zZSB0byBzdWNjZXNzZnVsIGFja25vd2xlZGdtZW50LgorICovCitzdGF0aWMgdm9pZCB0Y3BfaWxsaW5vaXNfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBydHQsCisJCQkJICAgIHUzMiBpbl9mbGlnaHQsIGludCBmbGFnKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBpbGxpbm9pcyAqY2EgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoYWZ0ZXIoYWNrLCBjYS0+ZW5kX3NlcSkpCisJCXVwZGF0ZV9wYXJhbXMoc2spOworCisJLyogUkZDMjg2MSBvbmx5IGluY3JlYXNlIGN3bmQgaWYgZnVsbHkgdXRpbGl6ZWQgKi8KKwlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2ssIGluX2ZsaWdodCkpCisJCXJldHVybjsKKworCS8qIEluIHNsb3cgc3RhcnQgKi8KKwlpZiAodHAtPnNuZF9jd25kIDw9IHRwLT5zbmRfc3N0aHJlc2gpCisJCXRjcF9zbG93X3N0YXJ0KHRwKTsKKworCWVsc2UgeworCQl1MzIgZGVsdGE7CisKKwkJLyogc25kX2N3bmRfY250IGlzICMgb2YgcGFja2V0cyBzaW5jZSBsYXN0IGN3bmQgaW5jcmVtZW50ICovCisJCXRwLT5zbmRfY3duZF9jbnQgKz0gY2EtPmFja2VkOworCQljYS0+YWNrZWQgPSAxOworCisJCS8qIFRoaXMgaXMgY2xvc2UgYXBwcm94aW1hdGlvbiBvZjoKKwkJICogdHAtPnNuZF9jd25kICs9IGFscGhhL3RwLT5zbmRfY3duZAorCQkqLworCQlkZWx0YSA9ICh0cC0+c25kX2N3bmRfY250ICogY2EtPmFscGhhKSA+PiBBTFBIQV9TSElGVDsKKwkJaWYgKGRlbHRhID49IHRwLT5zbmRfY3duZCkgeworCQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCArIGRlbHRhIC8gdHAtPnNuZF9jd25kLAorCQkJCQkgICAodTMyKSB0cC0+c25kX2N3bmRfY2xhbXApOworCQkJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MzIgdGNwX2lsbGlub2lzX3NzdGhyZXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCisJLyogTXVsdGlwbGljYXRpdmUgZGVjcmVhc2UgKi8KKwlyZXR1cm4gbWF4KCh0cC0+c25kX2N3bmQgKiBjYS0+YmV0YSkgPj4gQkVUQV9TSElGVCwgMlUpOworfQorCisKKy8qIEV4dHJhY3QgaW5mbyBmb3IgVGNwIHNvY2tldCBpbmZvIHByb3ZpZGVkIHZpYSBuZXRsaW5rLiAqLworc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX2luZm8oc3RydWN0IHNvY2sgKnNrLCB1MzIgZXh0LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfVkVHQVNJTkZPIC0gMSkpKSB7CisJCXN0cnVjdCB0Y3B2ZWdhc19pbmZvIGluZm8gPSB7CisJCQkudGNwdl9lbmFibGVkID0gMSwKKwkJCS50Y3B2X3J0dGNudCA9IGNhLT5jbnRfcnR0LAorCQkJLnRjcHZfbWlucnR0ID0gY2EtPmJhc2VfcnR0LAorCQl9OworCQl1NjQgdCA9IGNhLT5zdW1fcnR0OworCisJCWRvX2Rpdih0LCBjYS0+Y250X3J0dCk7CisJCWluZm8udGNwdl9ydHQgPSB0OworCisJCW5sYV9wdXQoc2tiLCBJTkVUX0RJQUdfVkVHQVNJTkZPLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9pbGxpbm9pcyA9IHsKKwkuZmxhZ3MJCT0gVENQX0NPTkdfUlRUX1NUQU1QLAorCS5pbml0CQk9IHRjcF9pbGxpbm9pc19pbml0LAorCS5zc3RocmVzaAk9IHRjcF9pbGxpbm9pc19zc3RocmVzaCwKKwkubWluX2N3bmQJPSB0Y3BfcmVub19taW5fY3duZCwKKwkuY29uZ19hdm9pZAk9IHRjcF9pbGxpbm9pc19jb25nX2F2b2lkLAorCS5zZXRfc3RhdGUJPSB0Y3BfaWxsaW5vaXNfc3RhdGUsCisJLmdldF9pbmZvCT0gdGNwX2lsbGlub2lzX2luZm8sCisJLnBrdHNfYWNrZWQJPSB0Y3BfaWxsaW5vaXNfYWNrZWQsCisKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImlsbGlub2lzIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRjcF9pbGxpbm9pc19yZWdpc3Rlcih2b2lkKQoreworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlsbGlub2lzKSA+IElDU0tfQ0FfUFJJVl9TSVpFKTsKKwlyZXR1cm4gdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2lsbGlub2lzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjcF9pbGxpbm9pc191bnJlZ2lzdGVyKHZvaWQpCit7CisJdGNwX3VucmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3BfaWxsaW5vaXMpOworfQorCittb2R1bGVfaW5pdCh0Y3BfaWxsaW5vaXNfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQodGNwX2lsbGlub2lzX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIEhlbW1pbmdlciwgU2hhbyBMaXUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVENQIElsbGlub2lzIik7CitNT0RVTEVfVkVSU0lPTigiMS4wIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDFhMTQxOTEuLjA1MWYwZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC04Niw2ICs4Niw3IEBACiBpbnQgc3lzY3RsX3RjcF9yZmMxMzM3IF9fcmVhZF9tb3N0bHk7CiBpbnQgc3lzY3RsX3RjcF9tYXhfb3JwaGFucyBfX3JlYWRfbW9zdGx5ID0gTlJfRklMRTsKIGludCBzeXNjdGxfdGNwX2ZydG8gX19yZWFkX21vc3RseTsKK2ludCBzeXNjdGxfdGNwX2ZydG9fcmVzcG9uc2UgX19yZWFkX21vc3RseTsKIGludCBzeXNjdGxfdGNwX25vbWV0cmljc19zYXZlIF9fcmVhZF9tb3N0bHk7CiAKIGludCBzeXNjdGxfdGNwX21vZGVyYXRlX3JjdmJ1ZiBfX3JlYWRfbW9zdGx5ID0gMTsKQEAgLTEwMCw2ICsxMDEsNyBAQAogI2RlZmluZSBGTEFHX0VDRQkJMHg0MCAvKiBFQ0UgaW4gdGhpcyBBQ0sJCQkJKi8KICNkZWZpbmUgRkxBR19EQVRBX0xPU1QJCTB4ODAgLyogU0FDSyBkZXRlY3RlZCBkYXRhIGxvc3NhZ2UuCQkqLwogI2RlZmluZSBGTEFHX1NMT1dQQVRICQkweDEwMCAvKiBEbyBub3Qgc2tpcCBSRkMgY2hlY2tzIGZvciB3aW5kb3cgdXBkYXRlLiovCisjZGVmaW5lIEZMQUdfT05MWV9PUklHX1NBQ0tFRAkweDIwMCAvKiBTQUNLcyBvbmx5IG5vbi1yZXhtaXQgc2VudCBiZWZvcmUgUlRPICovCiAKICNkZWZpbmUgRkxBR19BQ0tFRAkJKEZMQUdfREFUQV9BQ0tFRHxGTEFHX1NZTl9BQ0tFRCkKICNkZWZpbmUgRkxBR19OT1RfRFVQCQkoRkxBR19EQVRBfEZMQUdfV0lOX1VQREFURXxGTEFHX0FDS0VEKQpAQCAtMTEwLDYgKzExMiw4IEBACiAjZGVmaW5lIElzRmFjayh0cCkgKCh0cCktPnJ4X29wdC5zYWNrX29rICYgMikKICNkZWZpbmUgSXNEU2Fjayh0cCkgKCh0cCktPnJ4X29wdC5zYWNrX29rICYgNCkKIAorI2RlZmluZSBJc1NhY2tGcnRvKCkgKHN5c2N0bF90Y3BfZnJ0byA9PSAweDIpCisKICNkZWZpbmUgVENQX1JFTU5BTlQgKFRDUF9GTEFHX0ZJTnxUQ1BfRkxBR19VUkd8VENQX0ZMQUdfU1lOfFRDUF9GTEFHX1BTSCkKIAogLyogQWRhcHQgdGhlIE1TUyB2YWx1ZSB1c2VkIHRvIG1ha2UgZGVsYXllZCBhY2sgZGVjaXNpb24gdG8gdGhlCkBAIC0xMzYsNyArMTQwLDcgQEAKIAkJICoKIAkJICogImxlbiIgaXMgaW52YXJpYW50IHNlZ21lbnQgbGVuZ3RoLCBpbmNsdWRpbmcgVENQIGhlYWRlci4KIAkJICovCi0JCWxlbiArPSBza2ItPmRhdGEgLSBza2ItPmgucmF3OworCQlsZW4gKz0gc2tiLT5kYXRhIC0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJaWYgKGxlbiA+PSBUQ1BfTUlOX1JDVk1TUyArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSB8fAogCQkgICAgLyogSWYgUFNIIGlzIG5vdCBzZXQsIHBhY2tldCBzaG91bGQgYmUKIAkJICAgICAqIGZ1bGwgc2l6ZWQsIHByb3ZpZGVkIHBlZXIgVENQIGlzIG5vdCBiYWRseSBicm9rZW4uCkBAIC0xNDQsNyArMTQ4LDcgQEAKIAkJICAgICAqIHRvIGhhbmRsZSBzdXBlci1sb3cgbXR1IGxpbmtzIGZhaXJseS4KIAkJICAgICAqLwogCQkgICAgKGxlbiA+PSBUQ1BfTUlOX01TUyArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAmJgotCQkgICAgICEodGNwX2ZsYWdfd29yZChza2ItPmgudGgpJlRDUF9SRU1OQU5UKSkpIHsKKwkJICAgICAhKHRjcF9mbGFnX3dvcmQodGNwX2hkcihza2IpKSAmIFRDUF9SRU1OQU5UKSkpIHsKIAkJCS8qIFN1YnRyYWN0IGFsc28gaW52YXJpYW50IChpZiBwZWVyIGlzIFJGQyBjb21wbGlhbnQpLAogCQkJICogdGNwIGhlYWRlciBwbHVzIGZpeGVkIHRpbWVzdGFtcCBvcHRpb24gbGVuZ3RoLgogCQkJICogUmVzdWx0aW5nICJsZW4iIGlzIE1TUyBmcmVlIG9mIFNBQ0sgaml0dGVyLgpAQCAtMjMxLDkgKzIzNSw5IEBACiAgKi8KIAogLyogU2xvdyBwYXJ0IG9mIGNoZWNrIzIuICovCi1zdGF0aWMgaW50IF9fdGNwX2dyb3dfd2luZG93KGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgX190Y3BfZ3Jvd193aW5kb3coY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCS8qIE9wdGltaXplIHRoaXMhICovCiAJaW50IHRydWVzaXplID0gdGNwX3dpbl9mcm9tX3NwYWNlKHNrYi0+dHJ1ZXNpemUpLzI7CiAJaW50IHdpbmRvdyA9IHRjcF93aW5fZnJvbV9zcGFjZShzeXNjdGxfdGNwX3JtZW1bMl0pLzI7CkBAIC0yNDgsOSArMjUyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF9ncm93X3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCitzdGF0aWMgdm9pZCB0Y3BfZ3Jvd193aW5kb3coc3RydWN0IHNvY2sgKnNrLAogCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAkvKiBDaGVjayAjMSAqLwogCWlmICh0cC0+cmN2X3NzdGhyZXNoIDwgdHAtPndpbmRvd19jbGFtcCAmJgogCSAgICAoaW50KXRwLT5yY3Zfc3N0aHJlc2ggPCB0Y3Bfc3BhY2Uoc2spICYmCkBAIC0yNjMsNyArMjY5LDcgQEAKIAkJaWYgKHRjcF93aW5fZnJvbV9zcGFjZShza2ItPnRydWVzaXplKSA8PSBza2ItPmxlbikKIAkJCWluY3IgPSAyKnRwLT5hZHZtc3M7CiAJCWVsc2UKLQkJCWluY3IgPSBfX3RjcF9ncm93X3dpbmRvdyhzaywgdHAsIHNrYik7CisJCQlpbmNyID0gX190Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7CiAKIAkJaWYgKGluY3IpIHsKIAkJCXRwLT5yY3Zfc3N0aHJlc2ggPSBtaW4odHAtPnJjdl9zc3RocmVzaCArIGluY3IsIHRwLT53aW5kb3dfY2xhbXApOwpAQCAtMzI2LDggKzMzMiw5IEBACiB9CiAKIC8qIDUuIFJlY2FsY3VsYXRlIHdpbmRvdyBjbGFtcCBhZnRlciBzb2NrZXQgaGl0IGl0cyBtZW1vcnkgYm91bmRzLiAqLwotc3RhdGljIHZvaWQgdGNwX2NsYW1wX3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfY2xhbXBfd2luZG93KHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAKIAlpY3NrLT5pY3NrX2Fjay5xdWljayA9IDA7CkBAIC00OTksOCArNTA2LDkgQEAKICAqIGVhY2ggQUNLIHdlIHNlbmQsIGhlIGluY3JlbWVudHMgc25kX2N3bmQgYW5kIHRyYW5zbWl0cyBtb3JlIG9mIGhpcwogICogcXVldWUuICAtRGF2ZU0KICAqLwotc3RhdGljIHZvaWQgdGNwX2V2ZW50X2RhdGFfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB0Y3BfZXZlbnRfZGF0YV9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJdTMyIG5vdzsKIApAQCAtNTQxLDcgKzU0OSw3IEBACiAJVENQX0VDTl9jaGVja19jZSh0cCwgc2tiKTsKIAogCWlmIChza2ItPmxlbiA+PSAxMjgpCi0JCXRjcF9ncm93X3dpbmRvdyhzaywgdHAsIHNrYik7CisJCXRjcF9ncm93X3dpbmRvdyhzaywgc2tiKTsKIH0KIAogLyogQ2FsbGVkIHRvIGNvbXB1dGUgYSBzbW9vdGhlZCBydHQgZXN0aW1hdGUuIFRoZSBkYXRhIGZlZCB0byB0aGlzCkBAIC01NzQsNyArNTgyLDcgQEAKIAkgKiBkb2VzIG5vdCBtYXR0ZXIgaG93IHRvIF9jYWxjdWxhdGVfIGl0LiBTZWVtcywgaXQgd2FzIHRyYXAKIAkgKiB0aGF0IFZKIGZhaWxlZCB0byBhdm9pZC4gOCkKIAkgKi8KLQlpZihtID09IDApCisJaWYgKG0gPT0gMCkKIAkJbSA9IDE7CiAJaWYgKHRwLT5zcnR0ICE9IDApIHsKIAkJbSAtPSAodHAtPnNydHQgPj4gMyk7CS8qIG0gaXMgbm93IGVycm9yIGluIHJ0dCBlc3QgKi8KQEAgLTc1OSwxNSArNzY3LDE3IEBACiB9CiAKIC8qIFNldCBzbG93IHN0YXJ0IHRocmVzaG9sZCBhbmQgY3duZCBub3QgZmFsbGluZyB0byBzbG93IHN0YXJ0ICovCi12b2lkIHRjcF9lbnRlcl9jd3Ioc3RydWN0IHNvY2sgKnNrKQordm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHNldF9zc3RocmVzaCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAKIAl0cC0+cHJpb3Jfc3N0aHJlc2ggPSAwOwogCXRwLT5ieXRlc19hY2tlZCA9IDA7Ci0JaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA8IFRDUF9DQV9DV1IpIHsKKwlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA8IFRDUF9DQV9DV1IpIHsKIAkJdHAtPnVuZG9fbWFya2VyID0gMDsKLQkJdHAtPnNuZF9zc3RocmVzaCA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9vcHMtPnNzdGhyZXNoKHNrKTsKKwkJaWYgKHNldF9zc3RocmVzaCkKKwkJCXRwLT5zbmRfc3N0aHJlc2ggPSBpY3NrLT5pY3NrX2NhX29wcy0+c3N0aHJlc2goc2spOwogCQl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLAogCQkJCSAgIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyAxVSk7CiAJCXRwLT5zbmRfY3duZF9jbnQgPSAwOwpAQCAtOTM0LDcgKzk0NCw4IEBACiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGFja19za2ItPmgucmF3ICsgVENQX1NLQl9DQihhY2tfc2tiKS0+c2Fja2VkOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IChza2JfdHJhbnNwb3J0X2hlYWRlcihhY2tfc2tiKSArCisJCQkgICAgICBUQ1BfU0tCX0NCKGFja19za2IpLT5zYWNrZWQpOwogCXN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlICpzcCA9IChzdHJ1Y3QgdGNwX3NhY2tfYmxvY2tfd2lyZSAqKShwdHIrMik7CiAJc3RydWN0IHNrX2J1ZmYgKmNhY2hlZF9za2I7CiAJaW50IG51bV9zYWNrcyA9IChwdHJbMV0gLSBUQ1BPTEVOX1NBQ0tfQkFTRSk+PjM7CkBAIC0xMDM4LDcgKzEwNDksNyBAQAogCWNhY2hlZF9za2IgPSB0cC0+ZmFzdHBhdGhfc2tiX2hpbnQ7CiAJY2FjaGVkX2ZhY2tfY291bnQgPSB0cC0+ZmFzdHBhdGhfY250X2hpbnQ7CiAJaWYgKCFjYWNoZWRfc2tiKSB7Ci0JCWNhY2hlZF9za2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKKwkJY2FjaGVkX3NrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKIAkJY2FjaGVkX2ZhY2tfY291bnQgPSAwOwogCX0KIApAQCAtMTA1NSwxMCArMTA2NiwxMyBAQAogCQlpZiAoYWZ0ZXIoZW5kX3NlcSwgdHAtPmhpZ2hfc2VxKSkKIAkJCWZsYWcgfD0gRkxBR19EQVRBX0xPU1Q7CiAKLQkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlX2Zyb20oc2tiLCBzaykgeworCQl0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykgewogCQkJaW50IGluX3NhY2ssIHBjb3VudDsKIAkJCXU4IHNhY2tlZDsKIAorCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCQlicmVhazsKKwogCQkJY2FjaGVkX3NrYiA9IHNrYjsKIAkJCWNhY2hlZF9mYWNrX2NvdW50ID0gZmFja19jb3VudDsKIAkJCWlmIChpID09IGZpcnN0X3NhY2tfaW5kZXgpIHsKQEAgLTExNTksNiArMTE3MywxOCBAQAogCQkJCQkJLyogY2xlYXIgbG9zdCBoaW50ICovCiAJCQkJCQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IE5VTEw7CiAJCQkJCX0KKwkJCQkJLyogU0FDSyBlbmhhbmNlZCBGLVJUTyBkZXRlY3Rpb24uCisJCQkJCSAqIFNldCBmbGFnIGlmIGFuZCBvbmx5IGlmIG5vbi1yZXhtaXR0ZWQKKwkJCQkJICogc2VnbWVudHMgYmVsb3cgZnJ0b19oaWdobWFyayBhcmUKKwkJCQkJICogU0FDS2VkIChSRkM0MTM4OyBBcHBlbmRpeCBCKS4KKwkJCQkJICogQ2xlYXJpbmcgY29ycmVjdCBkdWUgdG8gaW4tb3JkZXIgd2FsaworCQkJCQkgKi8KKwkJCQkJaWYgKGFmdGVyKGVuZF9zZXEsIHRwLT5mcnRvX2hpZ2htYXJrKSkgeworCQkJCQkJZmxhZyAmPSB+RkxBR19PTkxZX09SSUdfU0FDS0VEOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKCEoc2Fja2VkICYgVENQQ0JfUkVUUkFOUykpCisJCQkJCQkJZmxhZyB8PSBGTEFHX09OTFlfT1JJR19TQUNLRUQ7CisJCQkJCX0KIAkJCQl9CiAKIAkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9TQUNLRURfQUNLRUQ7CkBAIC0xMTk1LDcgKzEyMjEsOSBAQAogCWlmIChsb3N0X3JldHJhbnMgJiYgaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfUmVjb3ZlcnkpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCisJCQkJYnJlYWs7CiAJCQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5zZXEsIGxvc3RfcmV0cmFucykpCiAJCQkJYnJlYWs7CiAJCQlpZiAoIWFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEpKQpAQCAtMTIyNCw3ICsxMjUyLDggQEAKIAogCXRwLT5sZWZ0X291dCA9IHRwLT5zYWNrZWRfb3V0ICsgdHAtPmxvc3Rfb3V0OwogCi0JaWYgKChyZW9yZCA8IHRwLT5mYWNrZXRzX291dCkgJiYgaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcykKKwlpZiAoKHJlb3JkIDwgdHAtPmZhY2tldHNfb3V0KSAmJiBpY3NrLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9Mb3NzICYmCisJICAgICghdHAtPmZydG9faGlnaG1hcmsgfHwgYWZ0ZXIodHAtPnNuZF91bmEsIHRwLT5mcnRvX2hpZ2htYXJrKSkpCiAJCXRjcF91cGRhdGVfcmVvcmRlcmluZyhzaywgKCh0cC0+ZmFja2V0c19vdXQgKyAxKSAtIHJlb3JkKSwgMCk7CiAKICNpZiBGQVNUUkVUUkFOU19ERUJVRyA+IDAKQEAgLTEyMzYsOSArMTI2NSw1NCBAQAogCXJldHVybiBmbGFnOwogfQogCi0vKiBSVE8gb2NjdXJyZWQsIGJ1dCBkbyBub3QgeWV0IGVudGVyIGxvc3Mgc3RhdGUuIEluc3RlYWQsIHRyYW5zbWl0IHR3byBuZXcKLSAqIHNlZ21lbnRzIHRvIHNlZSBmcm9tIHRoZSBuZXh0IEFDS3Mgd2hldGhlciBhbnkgZGF0YSB3YXMgcmVhbGx5IG1pc3NpbmcuCi0gKiBJZiB0aGUgUlRPIHdhcyBzcHVyaW91cywgbmV3IEFDS3Mgc2hvdWxkIGFycml2ZS4KKy8qIEYtUlRPIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkOgorICogIC0gdGhlcmUgbXVzdCBiZSBzb21lIHVuc2VudCBuZXcgZGF0YQorICogIC0gdGhlIGFkdmVydGlzZWQgd2luZG93IHNob3VsZCBhbGxvdyBzZW5kaW5nIGl0CisgKiAgLSBUQ1AgaGFzIG5ldmVyIHJldHJhbnNtaXR0ZWQgYW55dGhpbmcgb3RoZXIgdGhhbiBoZWFkIChTQUNLIGVuaGFuY2VkCisgKiAgICB2YXJpYW50IGZyb20gQXBwZW5kaXggQiBvZiBSRkM0MTM4IGlzIG1vcmUgcm9idXN0IGhlcmUpCisgKi8KK2ludCB0Y3BfdXNlX2ZydG8oc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoIXN5c2N0bF90Y3BfZnJ0byB8fCAhdGNwX3NlbmRfaGVhZChzaykgfHwKKwkJYWZ0ZXIoVENQX1NLQl9DQih0Y3Bfc2VuZF9oZWFkKHNrKSktPmVuZF9zZXEsCisJCSAgICAgIHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQpKQorCQlyZXR1cm4gMDsKKworCWlmIChJc1NhY2tGcnRvKCkpCisJCXJldHVybiAxOworCisJLyogQXZvaWQgZXhwZW5zaXZlIHdhbGtpbmcgb2YgcmV4bWl0IHF1ZXVlIGlmIHBvc3NpYmxlICovCisJaWYgKHRwLT5yZXRyYW5zX291dCA+IDEpCisJCXJldHVybiAwOworCisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpOwkvKiBTa2lwcyBoZWFkICovCisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOworCQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfUkVUUkFOUykKKwkJCXJldHVybiAwOworCQkvKiBTaG9ydC1jaXJjdWl0IHdoZW4gZmlyc3Qgbm9uLVNBQ0tlZCBza2IgaGFzIGJlZW4gY2hlY2tlZCAqLworCQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCZUQ1BDQl9TQUNLRURfQUNLRUQpKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCisvKiBSVE8gb2NjdXJyZWQsIGJ1dCBkbyBub3QgeWV0IGVudGVyIExvc3Mgc3RhdGUuIEluc3RlYWQsIGRlZmVyIFJUTworICogcmVjb3ZlcnkgYSBiaXQgYW5kIHVzZSBoZXVyaXN0aWNzIGluIHRjcF9wcm9jZXNzX2ZydG8oKSB0byBkZXRlY3QgaWYKKyAqIHRoZSBSVE8gd2FzIHNwdXJpb3VzLiBPbmx5IGNsZWFyIFNBQ0tFRF9SRVRSQU5TIG9mIHRoZSBoZWFkIGhlcmUgdG8KKyAqIGtlZXAgcmV0cmFuc19vdXQgY291bnRpbmcgYWNjdXJhdGUgKHdpdGggU0FDSyBGLVJUTywgb3RoZXIgdGhhbiBoZWFkCisgKiBtYXkgc3RpbGwgaGF2ZSB0aGF0IGJpdCBzZXQpOyBUQ1BDQl9MT1NUIGFuZCByZW1haW5pbmcgU0FDS0VEX1JFVFJBTlMKKyAqIGJpdHMgYXJlIGhhbmRsZWQgaWYgdGhlIExvc3Mgc3RhdGUgaXMgcmVhbGx5IHRvIGJlIGVudGVyZWQgKGluCisgKiB0Y3BfZW50ZXJfZnJ0b19sb3NzKS4KKyAqCisgKiBEbyBsaWtlIHRjcF9lbnRlcl9sb3NzKCkgd291bGQ7IHdoZW4gUlRPIGV4cGlyZXMgdGhlIHNlY29uZCB0aW1lIGl0CisgKiBkb2VzOgorICogICJSZWR1Y2Ugc3N0aHJlc2ggaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGluc2lkZSB0aGlzIHdpbmRvdy4iCiAgKi8KIHZvaWQgdGNwX2VudGVyX2ZydG8oc3RydWN0IHNvY2sgKnNrKQogewpAQCAtMTI0NiwzOSArMTMyMCw2OSBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQl0cC0+ZnJ0b19jb3VudGVyID0gMTsKLQotCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fAorCWlmICgoIXRwLT5mcnRvX2NvdW50ZXIgJiYgaWNzay0+aWNza19jYV9zdGF0ZSA8PSBUQ1BfQ0FfRGlzb3JkZXIpIHx8CiAJICAgIHRwLT5zbmRfdW5hID09IHRwLT5oaWdoX3NlcSB8fAotCSAgICAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfTG9zcyAmJiAhaWNzay0+aWNza19yZXRyYW5zbWl0cykpIHsKKwkgICAgKChpY3NrLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9Mb3NzIHx8IHRwLT5mcnRvX2NvdW50ZXIpICYmCisJICAgICAhaWNzay0+aWNza19yZXRyYW5zbWl0cykpIHsKIAkJdHAtPnByaW9yX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2goc2spOwotCQl0cC0+c25kX3NzdGhyZXNoID0gaWNzay0+aWNza19jYV9vcHMtPnNzdGhyZXNoKHNrKTsKKwkJLyogT3VyIHN0YXRlIGlzIHRvbyBvcHRpbWlzdGljIGluIHNzdGhyZXNoKCkgY2FsbCBiZWNhdXNlIGN3bmQKKwkJICogaXMgbm90IHJlZHVjZWQgdW50aWwgdGNwX2VudGVyX2ZydG9fbG9zcygpIHdoZW4gcHJldmlvdXMgRlJUTworCQkgKiByZWNvdmVyeSBoYXMgbm90IHlldCBjb21wbGV0ZWQuIFBhdHRlcm4gd291bGQgYmUgdGhpczogUlRPLAorCQkgKiBDdW11bGF0aXZlIEFDSywgUlRPICgyeFJUTyBmb3IgdGhlIHNhbWUgc2VnbWVudCBkb2VzIG5vdCBlbmQKKwkJICogdXAgaGVyZSB0d2ljZSkuCisJCSAqIFJGQzQxMzggc2hvdWxkIGJlIG1vcmUgc3BlY2lmaWMgb24gd2hhdCB0byBkbywgZXZlbiB0aG91Z2gKKwkJICogUlRPIGlzIHF1aXRlIHVubGlrZWx5IHRvIG9jY3VyIGFmdGVyIHRoZSBmaXJzdCBDdW11bGF0aXZlIEFDSworCQkgKiBkdWUgdG8gYmFjay1vZmYgYW5kIGNvbXBsZXhpdHkgb2YgdHJpZ2dlcmluZyBldmVudHMgLi4uCisJCSAqLworCQlpZiAodHAtPmZydG9fY291bnRlcikgeworCQkJdTMyIHN0b3JlZF9jd25kOworCQkJc3RvcmVkX2N3bmQgPSB0cC0+c25kX2N3bmQ7CisJCQl0cC0+c25kX2N3bmQgPSAyOworCQkJdHAtPnNuZF9zc3RocmVzaCA9IGljc2stPmljc2tfY2Ffb3BzLT5zc3RocmVzaChzayk7CisJCQl0cC0+c25kX2N3bmQgPSBzdG9yZWRfY3duZDsKKwkJfSBlbHNlIHsKKwkJCXRwLT5zbmRfc3N0aHJlc2ggPSBpY3NrLT5pY3NrX2NhX29wcy0+c3N0aHJlc2goc2spOworCQl9CisJCS8qIC4uLiBpbiB0aGVvcnksIGNvbmcuY29udHJvbCBtb2R1bGUgY291bGQgZG8gImFueSB0cmlja3MiIGluCisJCSAqIHNzdGhyZXNoKCksIHdoaWNoIG1lYW5zIHRoYXQgY2Ffc3RhdGUsIGxvc3QgYml0cyBhbmQgbG9zdF9vdXQKKwkJICogY291bnRlciB3b3VsZCBoYXZlIHRvIGJlIGZha2VkIGJlZm9yZSB0aGUgY2FsbCBvY2N1cnMuIFdlCisJCSAqIGNvbnNpZGVyIHRoYXQgdG9vIGV4cGVuc2l2ZSwgdW5saWtlbHkgYW5kIGhhY2t5LCBzbyBtb2R1bGVzCisJCSAqIHVzaW5nIHRoZXNlIGluIHNzdGhyZXNoKCkgbXVzdCBkZWFsIHRoZXNlIGluY29tcGF0aWJpbGl0eQorCQkgKiBpc3N1ZXMgaWYgdGhleSByZWNlaXZlcyBDQV9FVkVOVF9GUlRPIGFuZCBmcnRvX2NvdW50ZXIgIT0gMAorCQkgKi8KIAkJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9GUlRPKTsKIAl9CiAKLQkvKiBIYXZlIHRvIGNsZWFyIHJldHJhbnNtaXNzaW9uIG1hcmtlcnMgaGVyZSB0byBrZWVwIHRoZSBib29ra2VlcGluZwotCSAqIGluIHNoYXBlLCBldmVuIHRob3VnaCB3ZSBhcmUgbm90IHlldCBpbiBMb3NzIHN0YXRlLgotCSAqIElmIHNvbWV0aGluZyB3YXMgcmVhbGx5IGxvc3QsIGl0IGlzIGV2ZW50dWFsbHkgY2F1Z2h0IHVwCi0JICogaW4gdGNwX2VudGVyX2ZydG9fbG9zcy4KLQkgKi8KLQl0cC0+cmV0cmFuc19vdXQgPSAwOwogCXRwLT51bmRvX21hcmtlciA9IHRwLT5zbmRfdW5hOwogCXRwLT51bmRvX3JldHJhbnMgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKLQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1JFVFJBTlM7CisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKSB7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfUkVUUkFOUzsKKwkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKIAotCXRjcF9zZXRfY2Ffc3RhdGUoc2ssIFRDUF9DQV9PcGVuKTsKLQl0cC0+ZnJ0b19oaWdobWFyayA9IHRwLT5zbmRfbnh0OworCS8qIEVhcmxpZXIgbG9zcyByZWNvdmVyeSB1bmRlcndheSAoc2VlIFJGQzQxMzg7IEFwcGVuZGl4IEIpLgorCSAqIFRoZSBsYXN0IGNvbmRpdGlvbiBpcyBuZWNlc3NhcnkgYXQgbGVhc3QgaW4gdHAtPmZydG9fY291bnRlciBjYXNlLgorCSAqLworCWlmIChJc1NhY2tGcnRvKCkgJiYgKHRwLT5mcnRvX2NvdW50ZXIgfHwKKwkgICAgKCgxIDw8IGljc2stPmljc2tfY2Ffc3RhdGUpICYgKFRDUEZfQ0FfUmVjb3Zlcnl8VENQRl9DQV9Mb3NzKSkpICYmCisJICAgIGFmdGVyKHRwLT5oaWdoX3NlcSwgdHAtPnNuZF91bmEpKSB7CisJCXRwLT5mcnRvX2hpZ2htYXJrID0gdHAtPmhpZ2hfc2VxOworCX0gZWxzZSB7CisJCXRwLT5mcnRvX2hpZ2htYXJrID0gdHAtPnNuZF9ueHQ7CisJfQorCXRjcF9zZXRfY2Ffc3RhdGUoc2ssIFRDUF9DQV9EaXNvcmRlcik7CisJdHAtPmhpZ2hfc2VxID0gdHAtPnNuZF9ueHQ7CisJdHAtPmZydG9fY291bnRlciA9IDE7CiB9CiAKIC8qIEVudGVyIExvc3Mgc3RhdGUgYWZ0ZXIgRi1SVE8gd2FzIGFwcGxpZWQuIER1cGFjayBhcnJpdmVkIGFmdGVyIFJUTywKICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZCBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIFJUTyByZWNvdmVyeSwKICAqIGkuZS4gbWFyayBldmVyeXRoaW5nIGxvc3QgYW5kIGRvIGdvLWJhY2stTiByZXRyYW5zbWlzc2lvbi4KICAqLwotc3RhdGljIHZvaWQgdGNwX2VudGVyX2ZydG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCB0Y3BfZW50ZXJfZnJ0b19sb3NzKHN0cnVjdCBzb2NrICpzaywgaW50IGFsbG93ZWRfc2VnbWVudHMsIGludCBmbGFnKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMjg3LDEwICsxMzkxLDIzIEBACiAJdHAtPnNhY2tlZF9vdXQgPSAwOwogCXRwLT5sb3N0X291dCA9IDA7CiAJdHAtPmZhY2tldHNfb3V0ID0gMDsKKwl0cC0+cmV0cmFuc19vdXQgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX0xPU1Q7CisJCS8qCisJCSAqIENvdW50IHRoZSByZXRyYW5zbWlzc2lvbiBtYWRlIG9uIFJUTyBjb3JyZWN0bHkgKG9ubHkgd2hlbgorCQkgKiB3YWl0aW5nIGZvciB0aGUgZmlyc3QgQUNLIGFuZCBkaWQgbm90IGdldCBpdCkuLi4KKwkJICovCisJCWlmICgodHAtPmZydG9fY291bnRlciA9PSAxKSAmJiAhKGZsYWcmRkxBR19EQVRBX0FDS0VEKSkgeworCQkJdHAtPnJldHJhbnNfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQkvKiAuLi5lbnRlciB0aGlzIGlmIGJyYW5jaCBqdXN0IGZvciB0aGUgZmlyc3Qgc2VnbWVudCAqLworCQkJZmxhZyB8PSBGTEFHX0RBVEFfQUNLRUQ7CisJCX0gZWxzZSB7CisJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+KFRDUENCX0xPU1R8VENQQ0JfU0FDS0VEX1JFVFJBTlMpOworCQl9CiAJCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkpIHsKIAogCQkJLyogRG8gbm90IG1hcmsgdGhvc2Ugc2VnbWVudHMgbG9zdCB0aGF0IHdlcmUKQEAgLTEzMDgsNyArMTQyNSw3IEBACiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKIAotCXRwLT5zbmRfY3duZCA9IHRwLT5mcnRvX2NvdW50ZXIgKyB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKzE7CisJdHAtPnNuZF9jd25kID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSArIGFsbG93ZWRfc2VnbWVudHM7CiAJdHAtPnNuZF9jd25kX2NudCA9IDA7CiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiAJdHAtPnVuZG9fbWFya2VyID0gMDsKQEAgLTEzNjYsNyArMTQ4Myw5IEBACiAJaWYgKCFob3cpCiAJCXRwLT51bmRvX21hcmtlciA9IHRwLT5zbmRfdW5hOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKIAkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1JFVFJBTlMpCiAJCQl0cC0+dW5kb19tYXJrZXIgPSAwOwpAQCAtMTQwMSwxNCArMTUyMCwxNCBAQAogCSAqIHJlY2VpdmVyIF9ob3N0XyBpcyBoZWF2aWx5IGNvbmdlc3RlZCAob3IgYnVnZ3kpLgogCSAqIERvIHByb2Nlc3Npbmcgc2ltaWxhciB0byBSVE8gdGltZW91dC4KIAkgKi8KLQlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMICYmCisJaWYgKChza2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpICE9IE5VTEwgJiYKIAkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKSkgewogCQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFNBQ0tSRU5FR0lORyk7CiAKIAkJdGNwX2VudGVyX2xvc3Moc2ssIDEpOwogCQlpY3NrLT5pY3NrX3JldHJhbnNtaXRzKys7Ci0JCXRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpOworCQl0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSk7CiAJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJCQkgIGljc2stPmljc2tfcnRvLCBUQ1BfUlRPX01BWCk7CiAJCXJldHVybiAxOwpAQCAtMTQyNiwxMCArMTU0NSwxMiBAQAogCXJldHVybiAodGNwX3RpbWVfc3RhbXAgLSBUQ1BfU0tCX0NCKHNrYiktPndoZW4gPiBpbmV0X2NzayhzayktPmljc2tfcnRvKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGNwX2hlYWRfdGltZWRvdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSBpbnQgdGNwX2hlYWRfdGltZWRvdXQoc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJcmV0dXJuIHRwLT5wYWNrZXRzX291dCAmJgotCSAgICAgICB0Y3Bfc2tiX3RpbWVkb3V0KHNrLCBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJICAgICAgIHRjcF9za2JfdGltZWRvdXQoc2ssIHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSk7CiB9CiAKIC8qIExpbnV4IE5ld1Jlbm8vU0FDSy9GQUNLL0VDTiBzdGF0ZSBtYWNoaW5lLgpAQCAtMTUyNSwxMCArMTY0NiwxNSBAQAogICogTWFpbiBxdWVzdGlvbjogbWF5IHdlIGZ1cnRoZXIgY29udGludWUgZm9yd2FyZCB0cmFuc21pc3Npb24KICAqIHdpdGggdGhlIHNhbWUgY3duZD8KICAqLwotc3RhdGljIGludCB0Y3BfdGltZV90b19yZWNvdmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbnQgdGNwX3RpbWVfdG9fcmVjb3ZlcihzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJX191MzIgcGFja2V0c19vdXQ7CiAKKwkvKiBEbyBub3QgcGVyZm9ybSBhbnkgcmVjb3ZlcnkgZHVyaW5nIEZSVE8gYWxnb3JpdGhtICovCisJaWYgKHRwLT5mcnRvX2NvdW50ZXIpCisJCXJldHVybiAwOworCiAJLyogVHJpY2sjMTogVGhlIGxvc3MgaXMgcHJvdmVuLiAqLwogCWlmICh0cC0+bG9zdF9vdXQpCiAJCXJldHVybiAxOwpAQCAtMTU0MCw3ICsxNjY2LDcgQEAKIAkvKiBUcmljayMzIDogd2hlbiB3ZSB1c2UgUkZDMjk4OCB0aW1lciByZXN0YXJ0LCBmYXN0CiAJICogcmV0cmFuc21pdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRpbWVvdXQgb2YgcXVldWUgaGVhZC4KIAkgKi8KLQlpZiAodGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkKKwlpZiAodGNwX2hlYWRfdGltZWRvdXQoc2spKQogCQlyZXR1cm4gMTsKIAogCS8qIFRyaWNrIzQ6IEl0IGlzIHN0aWxsIG5vdCBPSy4uLiBCdXQgd2lsbCBpdCBiZSB1c2VmdWwgdG8gZGVsYXkKQEAgLTE1NDksNyArMTY3NSw3IEBACiAJcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CiAJaWYgKHBhY2tldHNfb3V0IDw9IHRwLT5yZW9yZGVyaW5nICYmCiAJICAgIHRwLT5zYWNrZWRfb3V0ID49IG1heF90KF9fdTMyLCBwYWNrZXRzX291dC8yLCBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpICYmCi0JICAgICF0Y3BfbWF5X3NlbmRfbm93KHNrLCB0cCkpIHsKKwkgICAgIXRjcF9tYXlfc2VuZF9ub3coc2spKSB7CiAJCS8qIFdlIGhhdmUgbm90aGluZyB0byBzZW5kLiBUaGlzIGNvbm5lY3Rpb24gaXMgbGltaXRlZAogCQkgKiBlaXRoZXIgYnkgcmVjZWl2ZXIgd2luZG93IG9yIGJ5IGFwcGxpY2F0aW9uLgogCQkgKi8KQEAgLTE1ODksOCArMTcxNSwxMCBAQAogCiAvKiBBY2NvdW50IGZvciBBQ0ssIEFDS2luZyBzb21lIGRhdGEgaW4gUmVubyBSZWNvdmVyeSBwaGFzZS4gKi8KIAotc3RhdGljIHZvaWQgdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGFja2VkKQorc3RhdGljIHZvaWQgdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHN0cnVjdCBzb2NrICpzaywgaW50IGFja2VkKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJaWYgKGFja2VkID4gMCkgewogCQkvKiBPbmUgQUNLIGFja2VkIGhvbGUuIFRoZSByZXN0IGVhdCBkdXBsaWNhdGUgQUNLcy4gKi8KIAkJaWYgKGFja2VkLTEgPj0gdHAtPnNhY2tlZF9vdXQpCkBAIC0xNjA5LDkgKzE3MzcsMTAgQEAKIH0KIAogLyogTWFyayBoZWFkIG9mIHF1ZXVlIHVwIGFzIGxvc3QuICovCi1zdGF0aWMgdm9pZCB0Y3BfbWFya19oZWFkX2xvc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorc3RhdGljIHZvaWQgdGNwX21hcmtfaGVhZF9sb3N0KHN0cnVjdCBzb2NrICpzaywKIAkJCSAgICAgICBpbnQgcGFja2V0cywgdTMyIGhpZ2hfc2VxKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGNudDsKIApAQCAtMTYyMCwxMSArMTc0OSwxMyBAQAogCQlza2IgPSB0cC0+bG9zdF9za2JfaGludDsKIAkJY250ID0gdHAtPmxvc3RfY250X2hpbnQ7CiAJfSBlbHNlIHsKLQkJc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKIAkJY250ID0gMDsKIAl9CiAKLQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQkvKiBUT0RPOiBkbyB0aGlzIGJldHRlciAqLwogCQkvKiB0aGlzIGlzIG5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuLi4gKi8KIAkJdHAtPmxvc3Rfc2tiX2hpbnQgPSBza2I7CkBAIC0xNjM4LDEyICsxNzY5LDExIEBACiAKIAkJCS8qIGNsZWFyIHhtaXRfcmV0cmFuc21pdF9xdWV1ZSBoaW50cwogCQkJICogIGlmIHRoaXMgaXMgYmV5b25kIGhpbnQgKi8KLQkJCWlmKHRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ICE9IE5VTEwgJiYKLQkJCSAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwKLQkJCQkgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKSB7Ci0KKwkJCWlmICh0cC0+cmV0cmFuc21pdF9za2JfaGludCAhPSBOVUxMICYmCisJCQkgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLAorCQkJCSAgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKQogCQkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gTlVMTDsKLQkJCX0KKwogCQl9CiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKQEAgLTE2NTEsMTUgKzE3ODEsMTcgQEAKIAogLyogQWNjb3VudCBuZXdseSBkZXRlY3RlZCBsb3N0IHBhY2tldChzKSAqLwogCi1zdGF0aWMgdm9pZCB0Y3BfdXBkYXRlX3Njb3JlYm9hcmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIHZvaWQgdGNwX3VwZGF0ZV9zY29yZWJvYXJkKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmIChJc0ZhY2sodHApKSB7CiAJCWludCBsb3N0ID0gdHAtPmZhY2tldHNfb3V0IC0gdHAtPnJlb3JkZXJpbmc7CiAJCWlmIChsb3N0IDw9IDApCiAJCQlsb3N0ID0gMTsKLQkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCB0cCwgbG9zdCwgdHAtPmhpZ2hfc2VxKTsKKwkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCBsb3N0LCB0cC0+aGlnaF9zZXEpOwogCX0gZWxzZSB7Ci0JCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgdHAsIDEsIHRwLT5oaWdoX3NlcSk7CisJCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgMSwgdHAtPmhpZ2hfc2VxKTsKIAl9CiAKIAkvKiBOZXcgaGV1cmlzdGljczogaXQgaXMgcG9zc2libGUgb25seSBhZnRlciB3ZSBzd2l0Y2hlZApAQCAtMTY2NywxMyArMTc5OSwxNSBAQAogCSAqIEhlbmNlLCB3ZSBjYW4gZGV0ZWN0IHRpbWVkIG91dCBwYWNrZXRzIGR1cmluZyBmYXN0CiAJICogcmV0cmFuc21pdCB3aXRob3V0IGZhbGxpbmcgdG8gc2xvdyBzdGFydC4KIAkgKi8KLQlpZiAoIUlzUmVubyh0cCkgJiYgdGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkgeworCWlmICghSXNSZW5vKHRwKSAmJiB0Y3BfaGVhZF90aW1lZG91dChzaykpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCQlza2IgPSB0cC0+c2NvcmVib2FyZF9za2JfaGludCA/IHRwLT5zY29yZWJvYXJkX3NrYl9oaW50Ci0JCQk6IHNrLT5za193cml0ZV9xdWV1ZS5uZXh0OworCQkJOiB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7CiAKLQkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlX2Zyb20oc2tiLCBzaykgeworCQl0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykgeworCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCQlicmVhazsKIAkJCWlmICghdGNwX3NrYl90aW1lZG91dChzaywgc2tiKSkKIAkJCQlicmVhazsKIApAQCAtMTc0NSw5ICsxODc5LDExIEBACiAvKiBVbmRvIHByb2NlZHVyZXMuICovCiAKICNpZiBGQVNUUkVUUkFOU19ERUJVRyA+IDEKLXN0YXRpYyB2b2lkIERCR1VORE8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBjaGFyICptc2cpCitzdGF0aWMgdm9pZCBEQkdVTkRPKHN0cnVjdCBzb2NrICpzaywgY29uc3QgY2hhciAqbXNnKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwogCXByaW50ayhLRVJOX0RFQlVHICJVbmRvICVzICV1LiV1LiV1LiV1LyV1IGMldSBsJXUgc3MldS8ldSBwJXVcbiIsCiAJICAgICAgIG1zZywKIAkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwKQEAgLTE3OTMsMTMgKzE5MjksMTUgQEAKIH0KIAogLyogUGVvcGxlIGNlbGVicmF0ZTogIldlIGxvdmUgb3VyIFByZXNpZGVudCEiICovCi1zdGF0aWMgaW50IHRjcF90cnlfdW5kb19yZWNvdmVyeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19yZWNvdmVyeShzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAlpZiAodGNwX21heV91bmRvKHRwKSkgewogCQkvKiBIYXBweSBlbmQhIFdlIGRpZCBub3QgcmV0cmFuc21pdCBhbnl0aGluZwogCQkgKiBvciBvdXIgb3JpZ2luYWwgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZC4KIAkJICovCi0JCURCR1VORE8oc2ssIHRwLCBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgPyAibG9zcyIgOiAicmV0cmFucyIpOworCQlEQkdVTkRPKHNrLCBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgPyAibG9zcyIgOiAicmV0cmFucyIpOwogCQl0Y3BfdW5kb19jd3Ioc2ssIDEpOwogCQlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9Mb3NzKQogCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQTE9TU1VORE8pOwpAQCAtMTgxOSwxMCArMTk1NywxMiBAQAogfQogCiAvKiBUcnkgdG8gdW5kbyBjd25kIHJlZHVjdGlvbiwgYmVjYXVzZSBELVNBQ0tzIGFja2VkIGFsbCByZXRyYW5zbWl0dGVkIGRhdGEgKi8KLXN0YXRpYyB2b2lkIHRjcF90cnlfdW5kb19kc2FjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfdHJ5X3VuZG9fZHNhY2soc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJaWYgKHRwLT51bmRvX21hcmtlciAmJiAhdHAtPnVuZG9fcmV0cmFucykgewotCQlEQkdVTkRPKHNrLCB0cCwgIkQtU0FDSyIpOworCQlEQkdVTkRPKHNrLCAiRC1TQUNLIik7CiAJCXRjcF91bmRvX2N3cihzaywgMSk7CiAJCXRwLT51bmRvX21hcmtlciA9IDA7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUERTQUNLVU5ETyk7CkBAIC0xODMxLDkgKzE5NzEsOSBAQAogCiAvKiBVbmRvIGR1cmluZyBmYXN0IHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLwogCi1zdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCQlpbnQgYWNrZWQpCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgaW50IGFja2VkKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCS8qIFBhcnRpYWwgQUNLIGFycml2ZWQuIEZvcmNlIEhvZSdzIHJldHJhbnNtaXQuICovCiAJaW50IGZhaWxlZCA9IElzUmVubyh0cCkgfHwgdHAtPmZhY2tldHNfb3V0PnRwLT5yZW9yZGVyaW5nOwogCkBAIC0xODQ2LDcgKzE5ODYsNyBAQAogCiAJCXRjcF91cGRhdGVfcmVvcmRlcmluZyhzaywgdGNwX2ZhY2tldHNfb3V0KHRwKSArIGFja2VkLCAxKTsKIAotCQlEQkdVTkRPKHNrLCB0cCwgIkhvZSIpOworCQlEQkdVTkRPKHNrLCAiSG9lIik7CiAJCXRjcF91bmRvX2N3cihzaywgMCk7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFBBUlRJQUxVTkRPKTsKIApAQCAtMTg2MCwxNyArMjAwMCwyMSBAQAogfQogCiAvKiBVbmRvIGR1cmluZyBsb3NzIHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLwotc3RhdGljIGludCB0Y3BfdHJ5X3VuZG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19sb3NzKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmICh0Y3BfbWF5X3VuZG8odHApKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZShza2IsIHNrKSB7CisJCXRjcF9mb3Jfd3JpdGVfcXVldWUoc2tiLCBzaykgeworCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCQlicmVhazsKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9MT1NUOwogCQl9CiAKIAkJY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogCi0JCURCR1VORE8oc2ssIHRwLCAicGFydGlhbCBsb3NzIik7CisJCURCR1VORE8oc2ssICJwYXJ0aWFsIGxvc3MiKTsKIAkJdHAtPmxvc3Rfb3V0ID0gMDsKIAkJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQ7CiAJCXRjcF91bmRvX2N3cihzaywgMSk7CkBAIC0xODkyLDE1ICsyMDM2LDE3IEBACiAJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9DT01QTEVURV9DV1IpOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdHJ5X3RvX29wZW4oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIHRjcF90cnlfdG9fb3BlbihzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFnKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQ7CiAKIAlpZiAodHAtPnJldHJhbnNfb3V0ID09IDApCiAJCXRwLT5yZXRyYW5zX3N0YW1wID0gMDsKIAogCWlmIChmbGFnJkZMQUdfRUNFKQotCQl0Y3BfZW50ZXJfY3dyKHNrKTsKKwkJdGNwX2VudGVyX2N3cihzaywgMSk7CiAKIAlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9DV1IpIHsKIAkJaW50IHN0YXRlID0gVENQX0NBX09wZW47CkBAIC0xOTg3LDcgKzIxMzMsNyBAQAogCSAgICBiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5oaWdoX3NlcSkgJiYKIAkgICAgaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfT3BlbiAmJgogCSAgICB0cC0+ZmFja2V0c19vdXQgPiB0cC0+cmVvcmRlcmluZykgewotCQl0Y3BfbWFya19oZWFkX2xvc3Qoc2ssIHRwLCB0cC0+ZmFja2V0c19vdXQtdHAtPnJlb3JkZXJpbmcsIHRwLT5oaWdoX3NlcSk7CisJCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgdHAtPmZhY2tldHNfb3V0LXRwLT5yZW9yZGVyaW5nLCB0cC0+aGlnaF9zZXEpOwogCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BMT1NTKTsKIAl9CiAKQEAgLTE5OTcsMTQgKzIxNDMsMTMgQEAKIAkvKiBFLiBDaGVjayBzdGF0ZSBleGl0IGNvbmRpdGlvbnMuIFN0YXRlIGNhbiBiZSB0ZXJtaW5hdGVkCiAJICogICAgd2hlbiBoaWdoX3NlcSBpcyBBQ0tlZC4gKi8KIAlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbikgewotCQlpZiAoIXN5c2N0bF90Y3BfZnJ0bykKLQkJCUJVR19UUkFQKHRwLT5yZXRyYW5zX291dCA9PSAwKTsKKwkJQlVHX1RSQVAodHAtPnJldHJhbnNfb3V0ID09IDApOwogCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CiAJfSBlbHNlIGlmICghYmVmb3JlKHRwLT5zbmRfdW5hLCB0cC0+aGlnaF9zZXEpKSB7CiAJCXN3aXRjaCAoaWNzay0+aWNza19jYV9zdGF0ZSkgewogCQljYXNlIFRDUF9DQV9Mb3NzOgogCQkJaWNzay0+aWNza19yZXRyYW5zbWl0cyA9IDA7Ci0JCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrLCB0cCkpCisJCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrKSkKIAkJCQlyZXR1cm47CiAJCQlicmVhazsKIApAQCAtMjAxOCw3ICsyMTYzLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgVENQX0NBX0Rpc29yZGVyOgotCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisJCQl0Y3BfdHJ5X3VuZG9fZHNhY2soc2spOwogCQkJaWYgKCF0cC0+dW5kb19tYXJrZXIgfHwKIAkJCSAgICAvKiBGb3IgU0FDSyBjYXNlIGRvIG5vdCBPcGVuIHRvIGFsbG93IHRvIHVuZG8KIAkJCSAgICAgKiBjYXRjaGluZyBmb3IgYWxsIGR1cGxpY2F0ZSBBQ0tzLiAqLwpAQCAtMjAzMSw3ICsyMTc2LDcgQEAKIAkJY2FzZSBUQ1BfQ0FfUmVjb3Zlcnk6CiAJCQlpZiAoSXNSZW5vKHRwKSkKIAkJCQl0Y3BfcmVzZXRfcmVub19zYWNrKHRwKTsKLQkJCWlmICh0Y3BfdHJ5X3VuZG9fcmVjb3Zlcnkoc2ssIHRwKSkKKwkJCWlmICh0Y3BfdHJ5X3VuZG9fcmVjb3Zlcnkoc2spKQogCQkJCXJldHVybjsKIAkJCXRjcF9jb21wbGV0ZV9jd3Ioc2spOwogCQkJYnJlYWs7CkBAIC0yMDQ3LDE0ICsyMTkyLDE0IEBACiAJCX0gZWxzZSB7CiAJCQlpbnQgYWNrZWQgPSBwcmlvcl9wYWNrZXRzIC0gdHAtPnBhY2tldHNfb3V0OwogCQkJaWYgKElzUmVubyh0cCkpCi0JCQkJdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHNrLCB0cCwgYWNrZWQpOwotCQkJaXNfZHVwYWNrID0gdGNwX3RyeV91bmRvX3BhcnRpYWwoc2ssIHRwLCBhY2tlZCk7CisJCQkJdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHNrLCBhY2tlZCk7CisJCQlpc19kdXBhY2sgPSB0Y3BfdHJ5X3VuZG9fcGFydGlhbChzaywgYWNrZWQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgVENQX0NBX0xvc3M6CiAJCWlmIChmbGFnJkZMQUdfREFUQV9BQ0tFRCkKIAkJCWljc2stPmljc2tfcmV0cmFuc21pdHMgPSAwOwotCQlpZiAoIXRjcF90cnlfdW5kb19sb3NzKHNrLCB0cCkpIHsKKwkJaWYgKCF0Y3BfdHJ5X3VuZG9fbG9zcyhzaykpIHsKIAkJCXRjcF9tb2RlcmF0ZV9jd25kKHRwKTsKIAkJCXRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc2spOwogCQkJcmV0dXJuOwpAQCAtMjA3MSwxMCArMjIxNiwxMCBAQAogCQl9CiAKIAkJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0Rpc29yZGVyKQotCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisJCQl0Y3BfdHJ5X3VuZG9fZHNhY2soc2spOwogCi0JCWlmICghdGNwX3RpbWVfdG9fcmVjb3ZlcihzaywgdHApKSB7Ci0JCQl0Y3BfdHJ5X3RvX29wZW4oc2ssIHRwLCBmbGFnKTsKKwkJaWYgKCF0Y3BfdGltZV90b19yZWNvdmVyKHNrKSkgeworCQkJdGNwX3RyeV90b19vcGVuKHNrLCBmbGFnKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0yMTEzLDggKzIyNTgsOCBAQAogCQl0Y3Bfc2V0X2NhX3N0YXRlKHNrLCBUQ1BfQ0FfUmVjb3ZlcnkpOwogCX0KIAotCWlmIChpc19kdXBhY2sgfHwgdGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkKLQkJdGNwX3VwZGF0ZV9zY29yZWJvYXJkKHNrLCB0cCk7CisJaWYgKGlzX2R1cGFjayB8fCB0Y3BfaGVhZF90aW1lZG91dChzaykpCisJCXRjcF91cGRhdGVfc2NvcmVib2FyZChzayk7CiAJdGNwX2N3bmRfZG93bihzayk7CiAJdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZShzayk7CiB9CkBAIC0yMTkwLDggKzIzMzUsMTAgQEAKICAqIFJGQzI5ODggcmVjb21tZW5kcyB0byByZXN0YXJ0IHRpbWVyIHRvIG5vdytydG8uCiAgKi8KIAotc3RhdGljIHZvaWQgdGNwX2Fja19wYWNrZXRzX291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfYWNrX3BhY2tldHNfb3V0KHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmICghdHAtPnBhY2tldHNfb3V0KSB7CiAJCWluZXRfY3NrX2NsZWFyX3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TKTsKIAl9IGVsc2UgewpAQCAtMjI1NSwxNCArMjQwMiw2IEBACiAJcmV0dXJuIGFja2VkOwogfQogCi1zdGF0aWMgdTMyIHRjcF91c3J0dChzdHJ1Y3QgdGltZXZhbCAqdHYpCi17Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXJldHVybiAobm93LnR2X3NlYyAtIHR2LT50dl9zZWMpICogMTAwMDAwMCArIChub3cudHZfdXNlYyAtIHR2LT50dl91c2VjKTsKLX0KLQogLyogUmVtb3ZlIGFja25vd2xlZGdlZCBmcmFtZXMgZnJvbSB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUuICovCiBzdGF0aWMgaW50IHRjcF9jbGVhbl9ydHhfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBfX3MzMiAqc2VxX3J0dF9wKQogewpAQCAtMjI3MywxMiArMjQxMiwxMCBAQAogCWludCBhY2tlZCA9IDA7CiAJX19zMzIgc2VxX3J0dCA9IC0xOwogCXUzMiBwa3RzX2Fja2VkID0gMDsKLQl2b2lkICgqcnR0X3NhbXBsZSkoc3RydWN0IHNvY2sgKnNrLCB1MzIgdXNydHQpCi0JCT0gaWNzay0+aWNza19jYV9vcHMtPnJ0dF9zYW1wbGU7Ci0Jc3RydWN0IHRpbWV2YWwgdHYgPSB7IC50dl9zZWMgPSAwLCAudHZfdXNlYyA9IDAgfTsKKwlrdGltZV90IGxhc3RfYWNrdCA9IGt0aW1lX3NldCgwLDApOwogCi0Jd2hpbGUgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgJiYKLQkgICAgICAgc2tiICE9IHNrLT5za19zZW5kX2hlYWQpIHsKKwl3aGlsZSAoKHNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkgJiYKKwkgICAgICAgc2tiICE9IHRjcF9zZW5kX2hlYWQoc2spKSB7CiAJCXN0cnVjdCB0Y3Bfc2tiX2NiICpzY2IgPSBUQ1BfU0tCX0NCKHNrYik7CiAJCV9fdTggc2Fja2VkID0gc2NiLT5zYWNrZWQ7CiAKQEAgLTIzMTgsMTMgKzI0NTUsMTMgQEAKIAogCQlpZiAoc2Fja2VkKSB7CiAJCQlpZiAoc2Fja2VkICYgVENQQ0JfUkVUUkFOUykgewotCQkJCWlmKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKQorCQkJCWlmIChzYWNrZWQgJiBUQ1BDQl9TQUNLRURfUkVUUkFOUykKIAkJCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAJCQkJYWNrZWQgfD0gRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQ7CiAJCQkJc2VxX3J0dCA9IC0xOwogCQkJfSBlbHNlIGlmIChzZXFfcnR0IDwgMCkgewogCQkJCXNlcV9ydHQgPSBub3cgLSBzY2ItPndoZW47Ci0JCQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmdHYpOworCQkJCWxhc3RfYWNrdCA9IHNrYi0+dHN0YW1wOwogCQkJfQogCQkJaWYgKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkKIAkJCQl0cC0+c2Fja2VkX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMjMzNywyMyArMjQ3NCwyNCBAQAogCQkJfQogCQl9IGVsc2UgaWYgKHNlcV9ydHQgPCAwKSB7CiAJCQlzZXFfcnR0ID0gbm93IC0gc2NiLT53aGVuOwotCQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmdHYpOworCQkJbGFzdF9hY2t0ID0gc2tiLT50c3RhbXA7CiAJCX0KIAkJdGNwX2RlY19wY291bnRfYXBwcm94KCZ0cC0+ZmFja2V0c19vdXQsIHNrYik7CiAJCXRjcF9wYWNrZXRzX291dF9kZWModHAsIHNrYik7Ci0JCV9fc2tiX3VubGluayhza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworCQl0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHNrYiwgc2spOwogCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CiAJCWNsZWFyX2FsbF9yZXRyYW5zX2hpbnRzKHRwKTsKIAl9CiAKIAlpZiAoYWNrZWQmRkxBR19BQ0tFRCkgewotCQl0Y3BfYWNrX3VwZGF0ZV9ydHQoc2ssIGFja2VkLCBzZXFfcnR0KTsKLQkJdGNwX2Fja19wYWNrZXRzX291dChzaywgdHApOwotCQlpZiAocnR0X3NhbXBsZSAmJiAhKGFja2VkICYgRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQpKQotCQkJKCpydHRfc2FtcGxlKShzaywgdGNwX3VzcnR0KCZ0dikpOworCQljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHMKKwkJCT0gaW5ldF9jc2soc2spLT5pY3NrX2NhX29wczsKIAotCQlpZiAoaWNzay0+aWNza19jYV9vcHMtPnBrdHNfYWNrZWQpCi0JCQlpY3NrLT5pY3NrX2NhX29wcy0+cGt0c19hY2tlZChzaywgcGt0c19hY2tlZCk7CisJCXRjcF9hY2tfdXBkYXRlX3J0dChzaywgYWNrZWQsIHNlcV9ydHQpOworCQl0Y3BfYWNrX3BhY2tldHNfb3V0KHNrKTsKKworCQlpZiAoY2Ffb3BzLT5wa3RzX2Fja2VkKQorCQkJY2Ffb3BzLT5wa3RzX2Fja2VkKHNrLCBwa3RzX2Fja2VkLCBsYXN0X2Fja3QpOwogCX0KIAogI2lmIEZBU1RSRVRSQU5TX0RFQlVHID4gMApAQCAtMjM5MCw3ICsyNTI4LDcgQEAKIAogCS8qIFdhcyBpdCBhIHVzYWJsZSB3aW5kb3cgb3Blbj8gKi8KIAotCWlmICghYWZ0ZXIoVENQX1NLQl9DQihzay0+c2tfc2VuZF9oZWFkKS0+ZW5kX3NlcSwKKwlpZiAoIWFmdGVyKFRDUF9TS0JfQ0IodGNwX3NlbmRfaGVhZChzaykpLT5lbmRfc2VxLAogCQkgICB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSkgewogCQlpY3NrLT5pY3NrX2JhY2tvZmYgPSAwOwogCQlpbmV0X2Nza19jbGVhcl94bWl0X3RpbWVyKHNrLCBJQ1NLX1RJTUVfUFJPQkUwKTsKQEAgLTI0MzMsMTMgKzI1NzEsMTQgQEAKICAqIFdpbmRvdyB1cGRhdGUgYWxnb3JpdGhtLCBkZXNjcmliZWQgaW4gUkZDNzkzL1JGQzExMjIgKHVzZWQgaW4gbGludXgtMi4yCiAgKiBhbmQgaW4gRnJlZUJTRC4gTmV0QlNEJ3Mgb25lIGlzIGV2ZW4gd29yc2UuKSBpcyB3cm9uZy4KICAqLwotc3RhdGljIGludCB0Y3BfYWNrX3VwZGF0ZV93aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYWNrLCB1MzIgYWNrX3NlcSkKK3N0YXRpYyBpbnQgdGNwX2Fja191cGRhdGVfd2luZG93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGFjaywKKwkJCQkgdTMyIGFja19zZXEpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IGZsYWcgPSAwOwotCXUzMiBud2luID0gbnRvaHMoc2tiLT5oLnRoLT53aW5kb3cpOworCXUzMiBud2luID0gbnRvaHModGNwX2hkcihza2IpLT53aW5kb3cpOwogCi0JaWYgKGxpa2VseSghc2tiLT5oLnRoLT5zeW4pKQorCWlmIChsaWtlbHkoIXRjcF9oZHIoc2tiKS0+c3luKSkKIAkJbndpbiA8PD0gdHAtPnJ4X29wdC5zbmRfd3NjYWxlOwogCiAJaWYgKHRjcF9tYXlfdXBkYXRlX3dpbmRvdyh0cCwgYWNrLCBhY2tfc2VxLCBud2luKSkgewpAQCAtMjQ1Myw3ICsyNTkyLDcgQEAKIAkJCSAqIGZhc3QgcGF0aCBpcyByZWNvdmVyZWQgZm9yIHNlbmRpbmcgVENQLgogCQkJICovCiAJCQl0cC0+cHJlZF9mbGFncyA9IDA7Ci0JCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrLCB0cCk7CisJCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrKTsKIAogCQkJaWYgKG53aW4gPiB0cC0+bWF4X3dpbmRvdykgewogCQkJCXRwLT5tYXhfd2luZG93ID0gbndpbjsKQEAgLTI0NjcsMzkgKzI2MDYsMTI4IEBACiAJcmV0dXJuIGZsYWc7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF9wcm9jZXNzX2ZydG8oc3RydWN0IHNvY2sgKnNrLCB1MzIgcHJpb3Jfc25kX3VuYSkKKy8qIEEgdmVyeSBjb25zZXJ2YXRpdmUgc3B1cmlvdXMgUlRPIHJlc3BvbnNlIGFsZ29yaXRobTogcmVkdWNlIGN3bmQgYW5kCisgKiBjb250aW51ZSBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX2NvbnNlcnZhdGl2ZV9zcHVyX3RvX3Jlc3BvbnNlKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CisJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJdGNwX21vZGVyYXRlX2N3bmQodHApOworfQorCisvKiBBIGNvbnNlcnZhdGl2ZSBzcHVyaW91cyBSVE8gcmVzcG9uc2UgYWxnb3JpdGhtOiByZWR1Y2UgY3duZCB1c2luZworICogcmF0ZSBoYWx2aW5nIGFuZCBjb250aW51ZSBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX3JhdGVoYWx2aW5nX3NwdXJfdG9fcmVzcG9uc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXRjcF9lbnRlcl9jd3Ioc2ssIDApOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdW5kb19zcHVyX3RvX3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWcpCit7CisJaWYgKGZsYWcmRkxBR19FQ0UpCisJCXRjcF9yYXRlaGFsdmluZ19zcHVyX3RvX3Jlc3BvbnNlKHNrKTsKKwllbHNlCisJCXRjcF91bmRvX2N3cihzaywgMSk7Cit9CisKKy8qIEYtUlRPIHNwdXJpb3VzIFJUTyBkZXRlY3Rpb24gYWxnb3JpdGhtIChSRkM0MTM4KQorICoKKyAqIEYtUlRPIGFmZmVjdHMgZHVyaW5nIHR3byBuZXcgQUNLcyBmb2xsb3dpbmcgUlRPICh3ZWxsLCBhbG1vc3QsIHNlZSBpbmxpbmUKKyAqIGNvbW1lbnRzKS4gU3RhdGUgKEFDSyBudW1iZXIpIGlzIGtlcHQgaW4gZnJ0b19jb3VudGVyLiBXaGVuIEFDSyBhZHZhbmNlcworICogd2luZG93IChidXQgbm90IHRvIG9yIGJleW9uZCBoaWdoZXN0IHNlcXVlbmNlIHNlbnQgYmVmb3JlIFJUTyk6CisgKiAgIE9uIEZpcnN0IEFDSywgIHNlbmQgdHdvIG5ldyBzZWdtZW50cyBvdXQuCisgKiAgIE9uIFNlY29uZCBBQ0ssIFJUTyB3YXMgbGlrZWx5IHNwdXJpb3VzLiBEbyBzcHVyaW91cyByZXNwb25zZSAocmVzcG9uc2UKKyAqICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtIGlzIG5vdCBwYXJ0IG9mIHRoZSBGLVJUTyBkZXRlY3Rpb24gYWxnb3JpdGhtCisgKiAgICAgICAgICAgICAgICAgIGdpdmVuIGluIFJGQzQxMzggYnV0IGNhbiBiZSBzZWxlY3RlZCBzZXBhcmF0ZWx5KS4KKyAqIE90aGVyd2lzZSAoYmFzaWNhbGx5IG9uIGR1cGxpY2F0ZSBBQ0spLCBSVE8gd2FzIChsaWtlbHkpIGNhdXNlZCBieSBhIGxvc3MKKyAqIGFuZCBUQ1AgZmFsbHMgYmFjayB0byBjb252ZW50aW9uYWwgUlRPIHJlY292ZXJ5LgorICoKKyAqIFJhdGlvbmFsZTogaWYgdGhlIFJUTyB3YXMgc3B1cmlvdXMsIG5ldyBBQ0tzIHNob3VsZCBhcnJpdmUgZnJvbSB0aGUKKyAqIG9yaWdpbmFsIHdpbmRvdyBldmVuIGFmdGVyIHdlIHRyYW5zbWl0IHR3byBuZXcgZGF0YSBzZWdtZW50cy4KKyAqCisgKiBTQUNLIHZlcnNpb246CisgKiAgIG9uIGZpcnN0IHN0ZXAsIHdhaXQgdW50aWwgZmlyc3QgY3VtdWxhdGl2ZSBBQ0sgYXJyaXZlcywgdGhlbiBtb3ZlIHRvCisgKiAgIHRoZSBzZWNvbmQgc3RlcC4gSW4gc2Vjb25kIHN0ZXAsIHRoZSBuZXh0IEFDSyBkZWNpZGVzLgorICoKKyAqIEYtUlRPIGlzIGltcGxlbWVudGVkIChtYWlubHkpIGluIGZvdXIgZnVuY3Rpb25zOgorICogICAtIHRjcF91c2VfZnJ0bygpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIFRDUCBpcyBjYW4gdXNlIEYtUlRPCisgKiAgIC0gdGNwX2VudGVyX2ZydG8oKSBwcmVwYXJlcyBUQ1Agc3RhdGUgb24gUlRPIGlmIEYtUlRPIGlzIHVzZWQsIGl0IGlzCisgKiAgICAgY2FsbGVkIHdoZW4gdGNwX3VzZV9mcnRvKCkgc2hvd2VkIGdyZWVuIGxpZ2h0CisgKiAgIC0gdGNwX3Byb2Nlc3NfZnJ0bygpIGhhbmRsZXMgaW5jb21pbmcgQUNLcyBkdXJpbmcgRi1SVE8gYWxnb3JpdGhtCisgKiAgIC0gdGNwX2VudGVyX2ZydG9fbG9zcygpIGlzIGNhbGxlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGV2aWRlbmNlCisgKiAgICAgdG8gcHJvdmUgdGhhdCB0aGUgUlRPIGlzIGluZGVlZCBzcHVyaW91cy4gSXQgdHJhbnNmZXJzIHRoZSBjb250cm9sCisgKiAgICAgZnJvbSBGLVJUTyB0byB0aGUgY29udmVudGlvbmFsIFJUTyByZWNvdmVyeQorICovCitzdGF0aWMgaW50IHRjcF9wcm9jZXNzX2ZydG8oc3RydWN0IHNvY2sgKnNrLCB1MzIgcHJpb3Jfc25kX3VuYSwgaW50IGZsYWcpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKIAl0Y3Bfc3luY19sZWZ0X291dCh0cCk7CiAKLQlpZiAodHAtPnNuZF91bmEgPT0gcHJpb3Jfc25kX3VuYSB8fAotCSAgICAhYmVmb3JlKHRwLT5zbmRfdW5hLCB0cC0+ZnJ0b19oaWdobWFyaykpIHsKLQkJLyogUlRPIHdhcyBjYXVzZWQgYnkgbG9zcywgc3RhcnQgcmV0cmFuc21pdHRpbmcgaW4KLQkJICogZ28tYmFjay1OIHNsb3cgc3RhcnQKKwkvKiBEdXBsaWNhdGUgdGhlIGJlaGF2aW9yIGZyb20gTG9zcyBzdGF0ZSAoZmFzdHJldHJhbnNfYWxlcnQpICovCisJaWYgKGZsYWcmRkxBR19EQVRBX0FDS0VEKQorCQlpbmV0X2NzayhzayktPmljc2tfcmV0cmFuc21pdHMgPSAwOworCisJaWYgKCFiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5mcnRvX2hpZ2htYXJrKSkgeworCQl0Y3BfZW50ZXJfZnJ0b19sb3NzKHNrLCB0cC0+ZnJ0b19jb3VudGVyICsgMSwgZmxhZyk7CisJCXJldHVybiAxOworCX0KKworCWlmICghSXNTYWNrRnJ0bygpIHx8IElzUmVubyh0cCkpIHsKKwkJLyogUkZDNDEzOCBzaG9ydGNvbWluZyBpbiBzdGVwIDI7IHNob3VsZCBhbHNvIGhhdmUgY2FzZSBjKToKKwkJICogQUNLIGlzbid0IGR1cGxpY2F0ZSBub3IgYWR2YW5jZXMgd2luZG93LCBlLmcuLCBvcHBvc2l0ZSBkaXIKKwkJICogZGF0YSwgd2ludXBkYXRlCiAJCSAqLwotCQl0Y3BfZW50ZXJfZnJ0b19sb3NzKHNrKTsKLQkJcmV0dXJuOworCQlpZiAoKHRwLT5zbmRfdW5hID09IHByaW9yX3NuZF91bmEpICYmIChmbGFnJkZMQUdfTk9UX0RVUCkgJiYKKwkJICAgICEoZmxhZyZGTEFHX0ZPUldBUkRfUFJPR1JFU1MpKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKCEoZmxhZyZGTEFHX0RBVEFfQUNLRUQpKSB7CisJCQl0Y3BfZW50ZXJfZnJ0b19sb3NzKHNrLCAodHAtPmZydG9fY291bnRlciA9PSAxID8gMCA6IDMpLAorCQkJCQkgICAgZmxhZyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKGZsYWcmRkxBR19EQVRBX0FDS0VEKSAmJiAodHAtPmZydG9fY291bnRlciA9PSAxKSkgeworCQkJLyogUHJldmVudCBzZW5kaW5nIG9mIG5ldyBkYXRhLiAqLworCQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwKKwkJCQkJICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmICgodHAtPmZydG9fY291bnRlciA9PSAyKSAmJgorCQkgICAgKCEoZmxhZyZGTEFHX0ZPUldBUkRfUFJPR1JFU1MpIHx8CisJCSAgICAgKChmbGFnJkZMQUdfREFUQV9TQUNLRUQpICYmICEoZmxhZyZGTEFHX09OTFlfT1JJR19TQUNLRUQpKSkpIHsKKwkJCS8qIFJGQzQxMzggc2hvcnRjb21pbmcgKHNlZSBjb21tZW50IGFib3ZlKSAqLworCQkJaWYgKCEoZmxhZyZGTEFHX0ZPUldBUkRfUFJPR1JFU1MpICYmIChmbGFnJkZMQUdfTk9UX0RVUCkpCisJCQkJcmV0dXJuIDE7CisKKwkJCXRjcF9lbnRlcl9mcnRvX2xvc3Moc2ssIDMsIGZsYWcpOworCQkJcmV0dXJuIDE7CisJCX0KIAl9CiAKIAlpZiAodHAtPmZydG9fY291bnRlciA9PSAxKSB7Ci0JCS8qIEZpcnN0IEFDSyBhZnRlciBSVE8gYWR2YW5jZXMgdGhlIHdpbmRvdzogYWxsb3cgdHdvIG5ldwotCQkgKiBzZWdtZW50cyBvdXQuCi0JCSAqLwogCQl0cC0+c25kX2N3bmQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgMjsKLQl9IGVsc2UgewotCQkvKiBBbHNvIHRoZSBzZWNvbmQgQUNLIGFmdGVyIFJUTyBhZHZhbmNlcyB0aGUgd2luZG93LgotCQkgKiBUaGUgUlRPIHdhcyBsaWtlbHkgc3B1cmlvdXMuIFJlZHVjZSBjd25kIGFuZCBjb250aW51ZQotCQkgKiBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZQotCQkgKi8KLQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7Ci0JCXRjcF9tb2RlcmF0ZV9jd25kKHRwKTsKKwkJdHAtPmZydG9fY291bnRlciA9IDI7CisJCXJldHVybiAxOworCX0gZWxzZSAvKiBmcnRvX2NvdW50ZXIgPT0gMiAqLyB7CisJCXN3aXRjaCAoc3lzY3RsX3RjcF9mcnRvX3Jlc3BvbnNlKSB7CisJCWNhc2UgMjoKKwkJCXRjcF91bmRvX3NwdXJfdG9fcmVzcG9uc2Uoc2ssIGZsYWcpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRjcF9jb25zZXJ2YXRpdmVfc3B1cl90b19yZXNwb25zZSh0cCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRjcF9yYXRlaGFsdmluZ19zcHVyX3RvX3Jlc3BvbnNlKHNrKTsKKwkJCWJyZWFrOworCQl9CisJCXRwLT5mcnRvX2NvdW50ZXIgPSAwOwogCX0KLQotCS8qIEYtUlRPIGFmZmVjdHMgb24gdHdvIG5ldyBBQ0tzIGZvbGxvd2luZyBSVE8uCi0JICogQXQgbGF0ZXN0IG9uIHRoaXJkIEFDSyB0aGUgVENQIGJlaGF2aW9yIGlzIGJhY2sgdG8gbm9ybWFsLgotCSAqLwotCXRwLT5mcnRvX2NvdW50ZXIgPSAodHAtPmZydG9fY291bnRlciArIDEpICUgMzsKKwlyZXR1cm4gMDsKIH0KIAogLyogVGhpcyByb3V0aW5lIGRlYWxzIHdpdGggaW5jb21pbmcgYWNrcywgYnV0IG5vdCBvdXRnb2luZyBvbmVzLiAqLwpAQCAtMjUxMyw2ICsyNzQxLDcgQEAKIAl1MzIgcHJpb3JfaW5fZmxpZ2h0OwogCXMzMiBzZXFfcnR0OwogCWludCBwcmlvcl9wYWNrZXRzOworCWludCBmcnRvX2N3bmQgPSAwOwogCiAJLyogSWYgdGhlIGFjayBpcyBuZXdlciB0aGFuIHNlbnQgb3Igb2xkZXIgdGhhbiBwcmV2aW91cyBhY2tzCiAJICogdGhlbiB3ZSBjYW4gcHJvYmFibHkgaWdub3JlIGl0LgpAQCAtMjU0OSwxMiArMjc3OCwxMiBAQAogCQllbHNlCiAJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BQVVJFQUNLUyk7CiAKLQkJZmxhZyB8PSB0Y3BfYWNrX3VwZGF0ZV93aW5kb3coc2ssIHRwLCBza2IsIGFjaywgYWNrX3NlcSk7CisJCWZsYWcgfD0gdGNwX2Fja191cGRhdGVfd2luZG93KHNrLCBza2IsIGFjaywgYWNrX3NlcSk7CiAKIAkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkKQogCQkJZmxhZyB8PSB0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZShzaywgc2tiLCBwcmlvcl9zbmRfdW5hKTsKIAotCQlpZiAoVENQX0VDTl9yY3ZfZWNuX2VjaG8odHAsIHNrYi0+aC50aCkpCisJCWlmIChUQ1BfRUNOX3Jjdl9lY25fZWNobyh0cCwgdGNwX2hkcihza2IpKSkKIAkJCWZsYWcgfD0gRkxBR19FQ0U7CiAKIAkJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9TTE9XX0FDSyk7CkBAIC0yNTc1LDE1ICsyODA0LDE2IEBACiAJZmxhZyB8PSB0Y3BfY2xlYW5fcnR4X3F1ZXVlKHNrLCAmc2VxX3J0dCk7CiAKIAlpZiAodHAtPmZydG9fY291bnRlcikKLQkJdGNwX3Byb2Nlc3NfZnJ0byhzaywgcHJpb3Jfc25kX3VuYSk7CisJCWZydG9fY3duZCA9IHRjcF9wcm9jZXNzX2ZydG8oc2ssIHByaW9yX3NuZF91bmEsIGZsYWcpOwogCiAJaWYgKHRjcF9hY2tfaXNfZHViaW91cyhzaywgZmxhZykpIHsKIAkJLyogQWR2YW5jZSBDV05ELCBpZiBzdGF0ZSBhbGxvd3MgdGhpcy4gKi8KLQkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJiB0Y3BfbWF5X3JhaXNlX2N3bmQoc2ssIGZsYWcpKQorCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmICFmcnRvX2N3bmQgJiYKKwkJICAgIHRjcF9tYXlfcmFpc2VfY3duZChzaywgZmxhZykpCiAJCQl0Y3BfY29uZ19hdm9pZChzaywgYWNrLCAgc2VxX3J0dCwgcHJpb3JfaW5fZmxpZ2h0LCAwKTsKIAkJdGNwX2Zhc3RyZXRyYW5zX2FsZXJ0KHNrLCBwcmlvcl9zbmRfdW5hLCBwcmlvcl9wYWNrZXRzLCBmbGFnKTsKIAl9IGVsc2UgewotCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpKQorCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmICFmcnRvX2N3bmQpCiAJCQl0Y3BfY29uZ19hdm9pZChzaywgYWNrLCBzZXFfcnR0LCBwcmlvcl9pbl9mbGlnaHQsIDEpOwogCX0KIApAQCAtMjU5OSw3ICsyODI5LDcgQEAKIAkgKiBiZWluZyB1c2VkIHRvIHRpbWUgdGhlIHByb2JlcywgYW5kIGlzIHByb2JhYmx5IGZhciBoaWdoZXIgdGhhbgogCSAqIGl0IG5lZWRzIHRvIGJlIGZvciBub3JtYWwgcmV0cmFuc21pc3Npb24uCiAJICovCi0JaWYgKHNrLT5za19zZW5kX2hlYWQpCisJaWYgKHRjcF9zZW5kX2hlYWQoc2spKQogCQl0Y3BfYWNrX3Byb2JlKHNrKTsKIAlyZXR1cm4gMTsKIApAQCAtMjYyMCwxMyArMjg1MCwxMyBAQAogdm9pZCB0Y3BfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm9wdF9yeCwgaW50IGVzdGFiKQogewogCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlpbnQgbGVuZ3RoPSh0aC0+ZG9mZio0KS1zaXplb2Yoc3RydWN0IHRjcGhkcik7CiAKIAlwdHIgPSAodW5zaWduZWQgY2hhciAqKSh0aCArIDEpOwogCW9wdF9yeC0+c2F3X3RzdGFtcCA9IDA7CiAKLQl3aGlsZShsZW5ndGg+MCkgeworCXdoaWxlIChsZW5ndGggPiAwKSB7CiAJCWludCBvcGNvZGU9KnB0cisrOwogCQlpbnQgb3BzaXplOwogCkBAIC0yNjQyLDkgKzI4NzIsOSBAQAogCQkJCQlyZXR1cm47CiAJCQkJaWYgKG9wc2l6ZSA+IGxlbmd0aCkKIAkJCQkJcmV0dXJuOwkvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi8KLQkJCQlzd2l0Y2gob3Bjb2RlKSB7CisJCQkJc3dpdGNoIChvcGNvZGUpIHsKIAkJCQljYXNlIFRDUE9QVF9NU1M6Ci0JCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9NU1MgJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKKwkJCQkJaWYgKG9wc2l6ZT09VENQT0xFTl9NU1MgJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKIAkJCQkJCXUxNiBpbl9tc3MgPSBudG9ocyhnZXRfdW5hbGlnbmVkKChfX2JlMTYgKilwdHIpKTsKIAkJCQkJCWlmIChpbl9tc3MpIHsKIAkJCQkJCQlpZiAob3B0X3J4LT51c2VyX21zcyAmJiBvcHRfcngtPnVzZXJfbXNzIDwgaW5fbXNzKQpAQCAtMjY1NCwxMiArMjg4NCwxMiBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVENQT1BUX1dJTkRPVzoKLQkJCQkJaWYob3BzaXplPT1UQ1BPTEVOX1dJTkRPVyAmJiB0aC0+c3luICYmICFlc3RhYikKKwkJCQkJaWYgKG9wc2l6ZT09VENQT0xFTl9XSU5ET1cgJiYgdGgtPnN5biAmJiAhZXN0YWIpCiAJCQkJCQlpZiAoc3lzY3RsX3RjcF93aW5kb3dfc2NhbGluZykgewogCQkJCQkJCV9fdTggc25kX3dzY2FsZSA9ICooX191OCAqKSBwdHI7CiAJCQkJCQkJb3B0X3J4LT53c2NhbGVfb2sgPSAxOwogCQkJCQkJCWlmIChzbmRfd3NjYWxlID4gMTQpIHsKLQkJCQkJCQkJaWYobmV0X3JhdGVsaW1pdCgpKQorCQkJCQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAidGNwX3BhcnNlX29wdGlvbnM6IElsbGVnYWwgd2luZG93ICIKIAkJCQkJCQkJCSAgICAgICAic2NhbGluZyB2YWx1ZSAlZCA+MTQgcmVjZWl2ZWQuXG4iLAogCQkJCQkJCQkJICAgICAgIHNuZF93c2NhbGUpOwpAQCAtMjY2OSw3ICsyODk5LDcgQEAKIAkJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUQ1BPUFRfVElNRVNUQU1QOgotCQkJCQlpZihvcHNpemU9PVRDUE9MRU5fVElNRVNUQU1QKSB7CisJCQkJCWlmIChvcHNpemU9PVRDUE9MRU5fVElNRVNUQU1QKSB7CiAJCQkJCQlpZiAoKGVzdGFiICYmIG9wdF9yeC0+dHN0YW1wX29rKSB8fAogCQkJCQkJICAgICghZXN0YWIgJiYgc3lzY3RsX3RjcF90aW1lc3RhbXBzKSkgewogCQkJCQkJCW9wdF9yeC0+c2F3X3RzdGFtcCA9IDE7CkBAIC0yNjc5LDcgKzI5MDksNyBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVENQT1BUX1NBQ0tfUEVSTToKLQkJCQkJaWYob3BzaXplPT1UQ1BPTEVOX1NBQ0tfUEVSTSAmJiB0aC0+c3luICYmICFlc3RhYikgeworCQkJCQlpZiAob3BzaXplPT1UQ1BPTEVOX1NBQ0tfUEVSTSAmJiB0aC0+c3luICYmICFlc3RhYikgewogCQkJCQkJaWYgKHN5c2N0bF90Y3Bfc2FjaykgewogCQkJCQkJCW9wdF9yeC0+c2Fja19vayA9IDE7CiAJCQkJCQkJdGNwX3NhY2tfcmVzZXQob3B0X3J4KTsKQEAgLTI2ODgsNyArMjkxOCw3IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBUQ1BPUFRfU0FDSzoKLQkJCQkJaWYoKG9wc2l6ZSA+PSAoVENQT0xFTl9TQUNLX0JBU0UgKyBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKSAmJgorCQkJCQlpZiAoKG9wc2l6ZSA+PSAoVENQT0xFTl9TQUNLX0JBU0UgKyBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKSAmJgogCQkJCQkgICAhKChvcHNpemUgLSBUQ1BPTEVOX1NBQ0tfQkFTRSkgJSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spICYmCiAJCQkJCSAgIG9wdF9yeC0+c2Fja19vaykgewogCQkJCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgPSAocHRyIC0gMikgLSAodW5zaWduZWQgY2hhciAqKXRoOwpAQCAtMjcwMSwxMCArMjkzMSwxMSBAQAogCQkJCQkgKi8KIAkJCQkJYnJlYWs7CiAjZW5kaWYKLQkJCQl9OworCQkJCX0KKwogCQkJCXB0cis9b3BzaXplLTI7CiAJCQkJbGVuZ3RoLT1vcHNpemU7Ci0JCX07CisJCX0KIAl9CiB9CiAKQEAgLTI3MzcsNyArMjk2OCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3N0b3JlX3RzX3JlY2VudChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewogCXRwLT5yeF9vcHQudHNfcmVjZW50ID0gdHAtPnJ4X29wdC5yY3ZfdHN2YWw7Ci0JdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSB4dGltZS50dl9zZWM7CisJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSBnZXRfc2Vjb25kcygpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3JlcGxhY2VfdHNfcmVjZW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBzZXEpCkBAIC0yNzUwLDggKzI5ODEsOCBAQAogCQkgKiBOb3Qgb25seSwgYWxzbyBpdCBvY2N1cnMgZm9yIGV4cGlyZWQgdGltZXN0YW1wcy4KIAkJICovCiAKLQkJaWYoKHMzMikodHAtPnJ4X29wdC5yY3ZfdHN2YWwgLSB0cC0+cnhfb3B0LnRzX3JlY2VudCkgPj0gMCB8fAotCQkgICB4dGltZS50dl9zZWMgPj0gdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCisJCWlmICgoczMyKSh0cC0+cnhfb3B0LnJjdl90c3ZhbCAtIHRwLT5yeF9vcHQudHNfcmVjZW50KSA+PSAwIHx8CisJCSAgIGdldF9zZWNvbmRzKCkgPj0gdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCiAJCQl0Y3Bfc3RvcmVfdHNfcmVjZW50KHRwKTsKIAl9CiB9CkBAIC0yNzgyLDcgKzMwMTMsNyBAQAogc3RhdGljIGludCB0Y3BfZGlzb3JkZXJlZF9hY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCXUzMiBzZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAl1MzIgYWNrID0gVENQX1NLQl9DQihza2IpLT5hY2tfc2VxOwogCkBAIC0yODAzLDcgKzMwMzQsNyBAQAogewogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXJldHVybiAoKHMzMikodHAtPnJ4X29wdC50c19yZWNlbnQgLSB0cC0+cnhfb3B0LnJjdl90c3ZhbCkgPiBUQ1BfUEFXU19XSU5ET1cgJiYKLQkJeHRpbWUudHZfc2VjIDwgdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMgJiYKKwkJZ2V0X3NlY29uZHMoKSA8IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfMjREQVlTICYmCiAJCSF0Y3BfZGlzb3JkZXJlZF9hY2soc2ssIHNrYikpOwogfQogCkBAIC0yOTEwLDcgKzMxNDEsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW1wb3NzaWJsZSwgc2stPnNrX3N0YXRlPSVkXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXywgc2stPnNrX3N0YXRlKTsKIAkJCWJyZWFrOwotCX07CisJfQogCiAJLyogSXQgX2lzXyBwb3NzaWJsZSwgdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBvdXQtb2Ytb3JkZXIgX2FmdGVyXyBGSU4uCiAJICogUHJvYmFibHksIHdlIHNob3VsZCByZXNldCBpbiB0aGlzIGNhc2UuIEZvciBub3cgZHJvcCB0aGVtLgpAQCAtMzAwOSw3ICszMjQwLDcgQEAKIAkJCSAqLwogCQkJdHAtPnJ4X29wdC5udW1fc2Fja3MtLTsKIAkJCXRwLT5yeF9vcHQuZWZmX3NhY2tzID0gbWluKHRwLT5yeF9vcHQubnVtX3NhY2tzICsgdHAtPnJ4X29wdC5kc2FjaywgNCAtIHRwLT5yeF9vcHQudHN0YW1wX29rKTsKLQkJCWZvcihpPXRoaXNfc2FjazsgaSA8IHRwLT5yeF9vcHQubnVtX3NhY2tzOyBpKyspCisJCQlmb3IgKGk9dGhpc19zYWNrOyBpIDwgdHAtPnJ4X29wdC5udW1fc2Fja3M7IGkrKykKIAkJCQlzcFtpXSA9IHNwW2krMV07CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzA2Miw3ICszMjkzLDcgQEAKIAkJdHAtPnJ4X29wdC5udW1fc2Fja3MtLTsKIAkJc3AtLTsKIAl9Ci0JZm9yKDsgdGhpc19zYWNrID4gMDsgdGhpc19zYWNrLS0sIHNwLS0pCisJZm9yICg7IHRoaXNfc2FjayA+IDA7IHRoaXNfc2Fjay0tLCBzcC0tKQogCQkqc3AgPSAqKHNwLTEpOwogCiBuZXdfc2FjazoKQEAgLTMwODgsNyArMzMxOSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlmb3IodGhpc19zYWNrID0gMDsgdGhpc19zYWNrIDwgbnVtX3NhY2tzOyApIHsKKwlmb3IgKHRoaXNfc2FjayA9IDA7IHRoaXNfc2FjayA8IG51bV9zYWNrczsgKSB7CiAJCS8qIENoZWNrIGlmIHRoZSBzdGFydCBvZiB0aGUgc2FjayBpcyBjb3ZlcmVkIGJ5IFJDVi5OWFQuICovCiAJCWlmICghYmVmb3JlKHRwLT5yY3Zfbnh0LCBzcC0+c3RhcnRfc2VxKSkgewogCQkJaW50IGk7CkBAIC0zMTQ0LDggKzMzNzUsOCBAQAogCQlfX3NrYl91bmxpbmsoc2tiLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOwogCQl0cC0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQkJaWYoc2tiLT5oLnRoLT5maW4pCi0JCQl0Y3BfZmluKHNrYiwgc2ssIHNrYi0+aC50aCk7CisJCWlmICh0Y3BfaGRyKHNrYiktPmZpbikKKwkJCXRjcF9maW4oc2tiLCBzaywgdGNwX2hkcihza2IpKTsKIAl9CiB9CiAKQEAgLTMxNTMsNyArMzM4NCw3IEBACiAKIHN0YXRpYyB2b2lkIHRjcF9kYXRhX3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgZWF0ZW4gPSAtMTsKIApAQCAtMzIxMCw5ICszNDQxLDkgQEAKIAkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOwogCQl9CiAJCXRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCQlpZihza2ItPmxlbikKLQkJCXRjcF9ldmVudF9kYXRhX3JlY3Yoc2ssIHRwLCBza2IpOwotCQlpZih0aC0+ZmluKQorCQlpZiAoc2tiLT5sZW4pCisJCQl0Y3BfZXZlbnRfZGF0YV9yZWN2KHNrLCBza2IpOworCQlpZiAodGgtPmZpbikKIAkJCXRjcF9maW4oc2tiLCBzaywgdGgpOwogCiAJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewpAQCAtMzIyOCw3ICszNDU5LDcgQEAKIAkJaWYgKHRwLT5yeF9vcHQubnVtX3NhY2tzKQogCQkJdGNwX3NhY2tfcmVtb3ZlKHRwKTsKIAotCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrLCB0cCk7CisJCXRjcF9mYXN0X3BhdGhfY2hlY2soc2spOwogCiAJCWlmIChlYXRlbiA+IDApCiAJCQlfX2tmcmVlX3NrYihza2IpOwpAQCAtMzM5Miw3ICszNjIzLDcgQEAKIAkJICogLSBibG9hdGVkIG9yIGNvbnRhaW5zIGRhdGEgYmVmb3JlICJzdGFydCIgb3IKIAkJICogICBvdmVybGFwcyB0byB0aGUgbmV4dCBvbmUuCiAJCSAqLwotCQlpZiAoIXNrYi0+aC50aC0+c3luICYmICFza2ItPmgudGgtPmZpbiAmJgorCQlpZiAoIXRjcF9oZHIoc2tiKS0+c3luICYmICF0Y3BfaGRyKHNrYiktPmZpbiAmJgogCQkgICAgKHRjcF93aW5fZnJvbV9zcGFjZShza2ItPnRydWVzaXplKSA+IHNrYi0+bGVuIHx8CiAJCSAgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBzdGFydCkgfHwKIAkJICAgICAoc2tiLT5uZXh0ICE9IHRhaWwgJiYKQEAgLTM0MDMsNyArMzYzNCw3IEBACiAJCXN0YXJ0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCQlza2IgPSBza2ItPm5leHQ7CiAJfQotCWlmIChza2IgPT0gdGFpbCB8fCBza2ItPmgudGgtPnN5biB8fCBza2ItPmgudGgtPmZpbikKKwlpZiAoc2tiID09IHRhaWwgfHwgdGNwX2hkcihza2IpLT5zeW4gfHwgdGNwX2hkcihza2IpLT5maW4pCiAJCXJldHVybjsKIAogCXdoaWxlIChiZWZvcmUoc3RhcnQsIGVuZCkpIHsKQEAgLTM0MTksMTEgKzM2NTAsMTQgQEAKIAkJbnNrYiA9IGFsbG9jX3NrYihjb3B5K2hlYWRlciwgR0ZQX0FUT01JQyk7CiAJCWlmICghbnNrYikKIAkJCXJldHVybjsKKworCQlza2Jfc2V0X21hY19oZWFkZXIobnNrYiwgc2tiX21hY19oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZCk7CisJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIobnNrYiwgKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0KKwkJCQkJICAgICAgc2tiLT5oZWFkKSk7CisJCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihuc2tiLCAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtCisJCQkJCQlza2ItPmhlYWQpKTsKIAkJc2tiX3Jlc2VydmUobnNrYiwgaGVhZGVyKTsKIAkJbWVtY3B5KG5za2ItPmhlYWQsIHNrYi0+aGVhZCwgaGVhZGVyKTsKLQkJbnNrYi0+bmgucmF3ID0gbnNrYi0+aGVhZCArIChza2ItPm5oLnJhdy1za2ItPmhlYWQpOwotCQluc2tiLT5oLnJhdyA9IG5za2ItPmhlYWQgKyAoc2tiLT5oLnJhdy1za2ItPmhlYWQpOwotCQluc2tiLT5tYWMucmF3ID0gbnNrYi0+aGVhZCArIChza2ItPm1hYy5yYXctc2tiLT5oZWFkKTsKIAkJbWVtY3B5KG5za2ItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOwogCQlUQ1BfU0tCX0NCKG5za2IpLT5zZXEgPSBUQ1BfU0tCX0NCKG5za2IpLT5lbmRfc2VxID0gc3RhcnQ7CiAJCV9fc2tiX2luc2VydChuc2tiLCBza2ItPnByZXYsIHNrYiwgbGlzdCk7CkBAIC0zNDQ5LDcgKzM2ODMsOSBAQAogCQkJCV9fa2ZyZWVfc2tiKHNrYik7CiAJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQUkNWQ09MTEFQU0VEKTsKIAkJCQlza2IgPSBuZXh0OwotCQkJCWlmIChza2IgPT0gdGFpbCB8fCBza2ItPmgudGgtPnN5biB8fCBza2ItPmgudGgtPmZpbikKKwkJCQlpZiAoc2tiID09IHRhaWwgfHwKKwkJCQkgICAgdGNwX2hkcihza2IpLT5zeW4gfHwKKwkJCQkgICAgdGNwX2hkcihza2IpLT5maW4pCiAJCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtMzUxNCw3ICszNzUwLDcgQEAKIAlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9QUlVORUNBTExFRCk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKQotCQl0Y3BfY2xhbXBfd2luZG93KHNrLCB0cCk7CisJCXRjcF9jbGFtcF93aW5kb3coc2spOwogCWVsc2UgaWYgKHRjcF9tZW1vcnlfcHJlc3N1cmUpCiAJCXRwLT5yY3Zfc3N0aHJlc2ggPSBtaW4odHAtPnJjdl9zc3RocmVzaCwgNFUgKiB0cC0+YWR2bXNzKTsKIApAQCAtMzU4Myw4ICszODE5LDEwIEBACiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiB9CiAKLXN0YXRpYyBpbnQgdGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbnQgdGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHNwZWNpZmljIHNlbmQgYnVmZmVyIHNldHRpbmcsIGRvCiAJICogbm90IG1vZGlmeSBpdC4KIAkgKi8KQEAgLTM2MTYsNyArMzg1NCw3IEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAodGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHNrLCB0cCkpIHsKKwlpZiAodGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHNrKSkgewogCQlpbnQgc25kbWVtID0gbWF4X3QodTMyLCB0cC0+cnhfb3B0Lm1zc19jbGFtcCwgdHAtPm1zc19jYWNoZSkgKwogCQkJTUFYX1RDUF9IRUFERVIgKyAxNiArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiksCiAJCSAgICBkZW1hbmRlZCA9IG1heF90KHVuc2lnbmVkIGludCwgdHAtPnNuZF9jd25kLApAQCAtMzY0MCw5ICszODc4LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9kYXRhX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwKTsKKwl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJdGNwX2NoZWNrX3NwYWNlKHNrKTsKIH0KIApAQCAtMzc5MCw3ICs0MDI4LDcgQEAKIAlpbnQgZXJyOwogCiAJbG9jYWxfYmhfZW5hYmxlKCk7Ci0JaWYgKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSkKKwlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBobGVuLCB0cC0+dWNvcHkuaW92LCBjaHVuayk7CiAJZWxzZQogCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIGhsZW4sCkBAIC0zODIyLDcgKzQwNjAsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB0Y3BfY2hlY2tzdW1fY29tcGxldGVfdXNlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJcmV0dXJuICFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmCiAJCV9fdGNwX2NoZWNrc3VtX2NvbXBsZXRlX3VzZXIoc2ssIHNrYik7CiB9CiAKQEAgLTM4NDAsNyArNDA3OCw3IEBACiAJaWYgKCF0cC0+dWNvcHkuZG1hX2NoYW4gJiYgdHAtPnVjb3B5LnBpbm5lZF9saXN0KQogCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBnZXRfc29mdG5ldF9kbWEoKTsKIAotCWlmICh0cC0+dWNvcHkuZG1hX2NoYW4gJiYgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKKwlpZiAodHAtPnVjb3B5LmRtYV9jaGFuICYmIHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikpIHsKIAogCQlkbWFfY29va2llID0gZG1hX3NrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHRwLT51Y29weS5kbWFfY2hhbiwKIAkJCXNrYiwgaGxlbiwgdHAtPnVjb3B5LmlvdiwgY2h1bmssIHRwLT51Y29weS5waW5uZWRfbGlzdCk7CkBAIC0zODU2LDcgKzQwOTQsNyBAQAogCQl0Y3BfcmN2X3NwYWNlX2FkanVzdChzayk7CiAKIAkJaWYgKCh0cC0+dWNvcHkubGVuID09IDApIHx8Ci0JCSAgICAodGNwX2ZsYWdfd29yZChza2ItPmgudGgpICYgVENQX0ZMQUdfUFNIKSB8fAorCQkgICAgKHRjcF9mbGFnX3dvcmQodGNwX2hkcihza2IpKSAmIFRDUF9GTEFHX1BTSCkgfHwKIAkJICAgIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpID4gKHNrLT5za19yY3ZidWYgPj4gMSkpKSB7CiAJCQl0cC0+dWNvcHkud2FrZXVwID0gMTsKIAkJCXNrLT5za19kYXRhX3JlYWR5KHNrLCAwKTsKQEAgLTM5NzYsNyArNDIxNCw3IEBACiAJCQkJICovCiAJCQkJdGNwX2Fjayhzaywgc2tiLCAwKTsKIAkJCQlfX2tmcmVlX3NrYihza2IpOwotCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UgeyAvKiBIZWFkZXIgdG9vIHNtYWxsICovCiAJCQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7CkBAIC00MDQ3LDEyICs0Mjg1LDEyIEBACiAJCQkJdHAtPnJjdl9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiAJCQl9CiAKLQkJCXRjcF9ldmVudF9kYXRhX3JlY3Yoc2ssIHRwLCBza2IpOworCQkJdGNwX2V2ZW50X2RhdGFfcmVjdihzaywgc2tiKTsKIAogCQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSAhPSB0cC0+c25kX3VuYSkgewogCQkJCS8qIFdlbGwsIG9ubHkgb25lIHNtYWxsIGp1bXBsZXQgaW4gZmFzdCBwYXRoLi4uICovCiAJCQkJdGNwX2Fjayhzaywgc2tiLCBGTEFHX0RBVEEpOwotCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CiAJCQkJaWYgKCFpbmV0X2Nza19hY2tfc2NoZWR1bGVkKHNrKSkKIAkJCQkJZ290byBub19hY2s7CiAJCQl9CkBAIC00MTA5LDcgKzQzNDcsNyBAQAogCQlnb3RvIGRpc2NhcmQ7CiAJfQogCi0JaWYodGgtPnJzdCkgeworCWlmICh0aC0+cnN0KSB7CiAJCXRjcF9yZXNldChzayk7CiAJCWdvdG8gZGlzY2FyZDsKIAl9CkBAIC00MTI0LDcgKzQzNjIsNyBAQAogCX0KIAogc3RlcDU6Ci0JaWYodGgtPmFjaykKKwlpZiAodGgtPmFjaykKIAkJdGNwX2Fjayhzaywgc2tiLCBGTEFHX1NMT1dQQVRIKTsKIAogCXRjcF9yY3ZfcnR0X21lYXN1cmVfdHMoc2ssIHNrYik7CkBAIC00MTM1LDcgKzQzNzMsNyBAQAogCS8qIHN0ZXAgNzogcHJvY2VzcyB0aGUgc2VnbWVudCB0ZXh0ICovCiAJdGNwX2RhdGFfcXVldWUoc2ssIHNrYik7CiAKLQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKKwl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOwogCXRjcF9hY2tfc25kX2NoZWNrKHNrKTsKIAlyZXR1cm4gMDsKIApAQCAtNDQxMiwxMyArNDY1MCwxMyBAQAogCQlnb3RvIGRpc2NhcmQ7CiAKIAljYXNlIFRDUF9MSVNURU46Ci0JCWlmKHRoLT5hY2spCisJCWlmICh0aC0+YWNrKQogCQkJcmV0dXJuIDE7CiAKLQkJaWYodGgtPnJzdCkKKwkJaWYgKHRoLT5yc3QpCiAJCQlnb3RvIGRpc2NhcmQ7CiAKLQkJaWYodGgtPnN5bikgeworCQlpZiAodGgtPnN5bikgewogCQkJaWYgKGljc2stPmljc2tfYWZfb3BzLT5jb25uX3JlcXVlc3Qoc2ssIHNrYikgPCAwKQogCQkJCXJldHVybiAxOwogCkBAIC00NDUyLDcgKzQ2OTAsNyBAQAogCQkvKiBEbyBzdGVwNiBvbndhcmQgYnkgaGFuZC4gKi8KIAkJdGNwX3VyZyhzaywgc2tiLCB0aCk7CiAJCV9fa2ZyZWVfc2tiKHNrYik7Ci0JCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOworCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ0NzQsNyArNDcxMiw3IEBACiAJfQogCiAJLyogc3RlcCAyOiBjaGVjayBSU1QgYml0ICovCi0JaWYodGgtPnJzdCkgeworCWlmICh0aC0+cnN0KSB7CiAJCXRjcF9yZXNldChzayk7CiAJCWdvdG8gZGlzY2FyZDsKIAl9CkBAIC00NDk3LDcgKzQ3MzUsNyBAQAogCWlmICh0aC0+YWNrKSB7CiAJCWludCBhY2NlcHRhYmxlID0gdGNwX2Fjayhzaywgc2tiLCBGTEFHX1NMT1dQQVRIKTsKIAotCQlzd2l0Y2goc2stPnNrX3N0YXRlKSB7CisJCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CiAJCWNhc2UgVENQX1NZTl9SRUNWOgogCQkJaWYgKGFjY2VwdGFibGUpIHsKIAkJCQl0cC0+Y29waWVkX3NlcSA9IHRwLT5yY3Zfbnh0OwpAQCAtNDY0NCw3ICs0ODgyLDcgQEAKIAogCS8qIHRjcF9kYXRhIGNvdWxkIG1vdmUgc29ja2V0IHRvIFRJTUUtV0FJVCAqLwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7Ci0JCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOworCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOwogCQl0Y3BfYWNrX3NuZF9jaGVjayhzayk7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCAwYmE3NGJiLi41YTNlN2Y4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgSUNNUF9NSU5fTEVOR1RIIDgKIAogLyogU29ja2V0IHVzZWQgZm9yIHNlbmRpbmcgUlNUcyAqLwotc3RhdGljIHN0cnVjdCBzb2NrZXQgKnRjcF9zb2NrZXQ7CitzdGF0aWMgc3RydWN0IHNvY2tldCAqdGNwX3NvY2tldCBfX3JlYWRfbW9zdGx5OwogCiB2b2lkIHRjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKQEAgLTEyNSwxMCArMTI1LDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgX191MzIgdGNwX3Y0X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQkgIHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICBza2ItPmgudGgtPmRlc3QsCi0JCQkJCSAgc2tiLT5oLnRoLT5zb3VyY2UpOworCXJldHVybiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSAgaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkgIHRjcF9oZHIoc2tiKS0+ZGVzdCwKKwkJCQkJICB0Y3BfaGRyKHNrYiktPnNvdXJjZSk7CiB9CiAKIGludCB0Y3BfdHdza191bmlxdWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqc2t0dywgdm9pZCAqdHdwKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJICovCiAJaWYgKHRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgJiYKIAkgICAgKHR3cCA9PSBOVUxMIHx8IChzeXNjdGxfdGNwX3R3X3JldXNlICYmCi0JCQkgICAgIHh0aW1lLnR2X3NlYyAtIHRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgPiAxKSkpIHsKKwkJCSAgICAgZ2V0X3NlY29uZHMoKSAtIHRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgPiAxKSkpIHsKIAkJdHAtPndyaXRlX3NlcSA9IHRjcHR3LT50d19zbmRfbnh0ICsgNjU1MzUgKyAyOwogCQlpZiAodHAtPndyaXRlX3NlcSA9PSAwKQogCQkJdHAtPndyaXRlX3NlcSA9IDE7CkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJICogd2hlbiB0cnlpbmcgbmV3IGNvbm5lY3Rpb24uCiAJCSAqLwogCQlpZiAocGVlciAhPSBOVUxMICYmCi0JCSAgICBwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPj0geHRpbWUudHZfc2VjKSB7CisJCSAgICBwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPj0gZ2V0X3NlY29uZHMoKSkgewogCQkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSBwZWVyLT50Y3BfdHNfc3RhbXA7CiAJCQl0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHBlZXItPnRjcF90czsKIAkJfQpAQCAtMzU0LDggKzM1NCw4IEBACiAJc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyAoaXBoLT5paGwgPDwgMikpOwogCXN0cnVjdCB0Y3Bfc29jayAqdHA7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKLQlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlfX3UzMiBzZXE7CiAJaW50IGVycjsKQEAgLTQ5OSwxMSArNDk5LDEyIEBACiB2b2lkIHRjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKGxlbiwgaW5ldC0+c2FkZHIsCiAJCQkJCSAgaW5ldC0+ZGFkZHIsIDApOworCQlza2ItPmNzdW1fc3RhcnQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5oZWFkOwogCQlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCX0gZWxzZSB7CiAJCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayhsZW4sIGluZXQtPnNhZGRyLCBpbmV0LT5kYWRkciwKQEAgLTUxNSwxNyArNTE2LDE4IEBACiAKIGludCB0Y3BfdjRfZ3NvX3NlbmRfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqdGgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKLQl0aCA9IHNrYi0+aC50aDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAogCXRoLT5jaGVjayA9IDA7CiAJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CisJc2tiLT5jc3VtX3N0YXJ0ID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZDsKIAlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAlyZXR1cm4gMDsKQEAgLTU0Niw3ICs1NDgsNyBAQAogCiBzdGF0aWMgdm9pZCB0Y3BfdjRfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAJc3RydWN0IHsKIAkJc3RydWN0IHRjcGhkciB0aDsKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwpAQCAtNTg1LDcgKzU4Nyw3IEBACiAJYXJnLmlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihyZXAudGgpOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKLQlrZXkgPSBzayA/IHRjcF92NF9tZDVfZG9fbG9va3VwKHNrLCBza2ItPm5oLmlwaC0+ZGFkZHIpIDogTlVMTDsKKwlrZXkgPSBzayA/IHRjcF92NF9tZDVfZG9fbG9va3VwKHNrLCBpcF9oZHIoc2tiKS0+ZGFkZHIpIDogTlVMTDsKIAlpZiAoa2V5KSB7CiAJCXJlcC5vcHRbMF0gPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAogCQkJCSAgIChUQ1BPUFRfTk9QIDw8IDE2KSB8CkBAIC01OTcsMTQgKzU5OSwxNCBAQAogCiAJCXRjcF92NF9kb19jYWxjX21kNV9oYXNoKChfX3U4ICopJnJlcC5vcHRbMV0sCiAJCQkJCWtleSwKLQkJCQkJc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQlza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCWlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkJaXBfaGRyKHNrYiktPnNhZGRyLAogCQkJCQkmcmVwLnRoLCBJUFBST1RPX1RDUCwKIAkJCQkJYXJnLmlvdlswXS5pb3ZfbGVuKTsKIAl9CiAjZW5kaWYKLQlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKiBYWFggKi8KKwlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJICAgICAgaXBfaGRyKHNrYiktPnNhZGRyLCAvKiBYWFggKi8KIAkJCQkgICAgICBzaXplb2Yoc3RydWN0IHRjcGhkciksIElQUFJPVE9fVENQLCAwKTsKIAlhcmcuY3N1bW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKSAvIDI7CiAKQEAgLTYyMiw3ICs2MjQsNyBAQAogCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssCiAJCQkgICAgdTMyIHdpbiwgdTMyIHRzKQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCXN0cnVjdCB7CiAJCXN0cnVjdCB0Y3BoZHIgdGg7CiAJCV9fYmUzMiBvcHRbKFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgPj4gMikKQEAgLTY3MCw3ICs2NzIsNyBAQAogCSAqIHNrYi0+c2spIGhvbGRzIHRydWUsIGJ1dCB3ZSBwcm9ncmFtIGRlZmVuc2l2ZWx5LgogCSAqLwogCWlmICghdHdzayAmJiBza2ItPnNrKSB7Ci0JCWtleSA9IHRjcF92NF9tZDVfZG9fbG9va3VwKHNrYi0+c2ssIHNrYi0+bmguaXBoLT5kYWRkcik7CisJCWtleSA9IHRjcF92NF9tZDVfZG9fbG9va3VwKHNrYi0+c2ssIGlwX2hkcihza2IpLT5kYWRkcik7CiAJfSBlbHNlIGlmICh0d3NrICYmIHR3c2stPnR3X21kNV9rZXlsZW4pIHsKIAkJdHdfa2V5LmtleSA9IHR3c2stPnR3X21kNV9rZXk7CiAJCXR3X2tleS5rZXlsZW4gPSB0d3NrLT50d19tZDVfa2V5bGVuOwpAQCAtNjkwLDE0ICs2OTIsMTQgQEAKIAogCQl0Y3BfdjRfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKSZyZXAub3B0W29mZnNldF0sCiAJCQkJCWtleSwKLQkJCQkJc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQlza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCWlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkJaXBfaGRyKHNrYiktPnNhZGRyLAogCQkJCQkmcmVwLnRoLCBJUFBST1RPX1RDUCwKIAkJCQkJYXJnLmlvdlswXS5pb3ZfbGVuKTsKIAl9CiAjZW5kaWYKLQlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKiBYWFggKi8KKwlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJICAgICAgaXBfaGRyKHNrYiktPnNhZGRyLCAvKiBYWFggKi8KIAkJCQkgICAgICBhcmcuaW92WzBdLmlvdl9sZW4sIElQUFJPVE9fVENQLCAwKTsKIAlhcmcuY3N1bW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKSAvIDI7CiAKQEAgLTc0NSw3ICs3NDcsNyBAQAogCXNrYiA9IHRjcF9tYWtlX3N5bmFjayhzaywgZHN0LCByZXEpOwogCiAJaWYgKHNrYikgewotCQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwkJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAKIAkJdGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHNrYi0+bGVuLAogCQkJCQkgaXJlcS0+bG9jX2FkZHIsCkBAIC03ODEsNyArNzgzLDcgQEAKIAkJd2FybnRpbWUgPSBqaWZmaWVzOwogCQlwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICAicG9zc2libGUgU1lOIGZsb29kaW5nIG9uIHBvcnQgJWQuIFNlbmRpbmcgY29va2llcy5cbiIsCi0JCSAgICAgICBudG9ocyhza2ItPmgudGgtPmRlc3QpKTsKKwkJICAgICAgIG50b2hzKHRjcF9oZHIoc2tiKS0+ZGVzdCkpOwogCX0KIH0KICNlbmRpZgpAQCAtMTEzMyw4ICsxMTM1LDggQEAKIAkgKi8KIAlfX3U4ICpoYXNoX2xvY2F0aW9uID0gTlVMTDsKIAlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmhhc2hfZXhwZWN0ZWQ7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCWludCBsZW5ndGggPSAodGgtPmRvZmYgPDwgMikgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAJaW50IGdlbmhhc2g7CiAJdW5zaWduZWQgY2hhciAqcHRyOwpAQCAtMTI1MSw4ICsxMjUzLDggQEAKIAlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXE7CiAJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CiAJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwotCV9fYmUzMiBzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKLQlfX2JlMzIgZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisJX19iZTMyIHNhZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOworCV9fYmUzMiBkYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAlfX3UzMiBpc24gPSBUQ1BfU0tCX0NCKHNrYiktPndoZW47CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKQEAgLTEzMjcsNyArMTMyOSw3IEBACiAJaXJlcS0+cm10X2FkZHIgPSBzYWRkcjsKIAlpcmVxLT5vcHQgPSB0Y3BfdjRfc2F2ZV9vcHRpb25zKHNrLCBza2IpOwogCWlmICghd2FudF9jb29raWUpCi0JCVRDUF9FQ05fY3JlYXRlX3JlcXVlc3QocmVxLCBza2ItPmgudGgpOworCQlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgdGNwX2hkcihza2IpKTsKIAogCWlmICh3YW50X2Nvb2tpZSkgewogI2lmZGVmIENPTkZJR19TWU5fQ09PS0lFUwpAQCAtMTM1MSw3ICsxMzUzLDcgQEAKIAkJICAgIChkc3QgPSBpbmV0X2Nza19yb3V0ZV9yZXEoc2ssIHJlcSkpICE9IE5VTEwgJiYKIAkJICAgIChwZWVyID0gcnRfZ2V0X3BlZXIoKHN0cnVjdCBydGFibGUgKilkc3QpKSAhPSBOVUxMICYmCiAJCSAgICBwZWVyLT52NGRhZGRyID09IHNhZGRyKSB7Ci0JCQlpZiAoeHRpbWUudHZfc2VjIDwgcGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMICYmCisJCQlpZiAoZ2V0X3NlY29uZHMoKSA8IHBlZXItPnRjcF90c19zdGFtcCArIFRDUF9QQVdTX01TTCAmJgogCQkJICAgIChzMzIpKHBlZXItPnRjcF90cyAtIHJlcS0+dHNfcmVjZW50KSA+CiAJCQkJCQkJVENQX1BBV1NfV0lORE9XKSB7CiAJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfUEFXU1BBU1NJVkVSRUpFQ1RFRCk7CkBAIC0xMzc1LDcgKzEzNzcsNyBAQAogCQkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVENQOiBkcm9wIG9wZW4gIgogCQkJCSAgICAgICAicmVxdWVzdCBmcm9tICV1LiV1LiV1LiV1LyV1XG4iLAogCQkJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwKLQkJCQkgICAgICAgbnRvaHMoc2tiLT5oLnRoLT5zb3VyY2UpKTsKKwkJCQkgICAgICAgbnRvaHModGNwX2hkcihza2IpLT5zb3VyY2UpKTsKIAkJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAJCX0KQEAgLTE0MzksNyArMTQ0MSw3IEBACiAJbmV3aW5ldC0+b3B0CSAgICAgID0gaXJlcS0+b3B0OwogCWlyZXEtPm9wdAkgICAgICA9IE5VTEw7CiAJbmV3aW5ldC0+bWNfaW5kZXggICAgID0gaW5ldF9paWYoc2tiKTsKLQluZXdpbmV0LT5tY190dGwJICAgICAgPSBza2ItPm5oLmlwaC0+dHRsOworCW5ld2luZXQtPm1jX3R0bAkgICAgICA9IGlwX2hkcihza2IpLT50dGw7CiAJaW5ldF9jc2sobmV3c2spLT5pY3NrX2V4dF9oZHJfbGVuID0gMDsKIAlpZiAobmV3aW5ldC0+b3B0KQogCQlpbmV0X2NzayhuZXdzayktPmljc2tfZXh0X2hkcl9sZW4gPSBuZXdpbmV0LT5vcHQtPm9wdGxlbjsKQEAgLTE0ODEsOCArMTQ4Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqdGNwX3Y0X2huZF9yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2OwogCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KQEAgLTE0OTEsOSArMTQ5Myw4IEBACiAJaWYgKHJlcSkKIAkJcmV0dXJuIHRjcF9jaGVja19yZXEoc2ssIHNrYiwgcmVxLCBwcmV2KTsKIAotCW5zayA9IGluZXRfbG9va3VwX2VzdGFibGlzaGVkKCZ0Y3BfaGFzaGluZm8sIHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkgICAgICB0aC0+c291cmNlLCBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICAgdGgtPmRlc3QsIGluZXRfaWlmKHNrYikpOworCW5zayA9IGluZXRfbG9va3VwX2VzdGFibGlzaGVkKCZ0Y3BfaGFzaGluZm8sIGlwaC0+c2FkZHIsIHRoLT5zb3VyY2UsCisJCQkJICAgICAgaXBoLT5kYWRkciwgdGgtPmRlc3QsIGluZXRfaWlmKHNrYikpOwogCiAJaWYgKG5zaykgewogCQlpZiAobnNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7CkBAIC0xNTEzLDE1ICsxNTE0LDE3IEBACiAKIHN0YXRpYyBfX3N1bTE2IHRjcF92NF9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IpCiB7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlpZiAoIXRjcF92NF9jaGVjayhza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCSAgc2tiLT5uaC5pcGgtPmRhZGRyLCBza2ItPmNzdW0pKSB7CisJCWlmICghdGNwX3Y0X2NoZWNrKHNrYi0+bGVuLCBpcGgtPnNhZGRyLAorCQkJCSAgaXBoLT5kYWRkciwgc2tiLT5jc3VtKSkgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAogCQkJCSAgICAgICBza2ItPmxlbiwgSVBQUk9UT19UQ1AsIDApOwogCiAJaWYgKHNrYi0+bGVuIDw9IDc2KSB7CkBAIC0xNTU1LDcgKzE1NTgsNyBAQAogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsgLyogRmFzdCBwYXRoICovCiAJCVRDUF9DSEVDS19USU1FUihzayk7Ci0JCWlmICh0Y3BfcmN2X2VzdGFibGlzaGVkKHNrLCBza2IsIHNrYi0+aC50aCwgc2tiLT5sZW4pKSB7CisJCWlmICh0Y3BfcmN2X2VzdGFibGlzaGVkKHNrLCBza2IsIHRjcF9oZHIoc2tiKSwgc2tiLT5sZW4pKSB7CiAJCQlyc2sgPSBzazsKIAkJCWdvdG8gcmVzZXQ7CiAJCX0KQEAgLTE1NjMsNyArMTU2Niw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChza2ItPmxlbiA8IChza2ItPmgudGgtPmRvZmYgPDwgMikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJaWYgKHNrYi0+bGVuIDwgdGNwX2hkcmxlbihza2IpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQlnb3RvIGNzdW1fZXJyOwogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CkBAIC0xNTgxLDcgKzE1ODQsNyBAQAogCX0KIAogCVRDUF9DSEVDS19USU1FUihzayk7Ci0JaWYgKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkgeworCWlmICh0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgdGNwX2hkcihza2IpLCBza2ItPmxlbikpIHsKIAkJcnNrID0gc2s7CiAJCWdvdG8gcmVzZXQ7CiAJfQpAQCAtMTYxMCw2ICsxNjEzLDcgQEAKIAogaW50IHRjcF92NF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IHJldDsKQEAgLTE2MjMsNyArMTYyNyw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCi0JdGggPSBza2ItPmgudGg7CisJdGggPSB0Y3BfaGRyKHNrYik7CiAKIAlpZiAodGgtPmRvZmYgPCBzaXplb2Yoc3RydWN0IHRjcGhkcikgLyA0KQogCQlnb3RvIGJhZF9wYWNrZXQ7CkBAIC0xNjM0LDIzICsxNjM4LDIxIEBACiAJICogUGFja2V0IGxlbmd0aCBhbmQgZG9mZiBhcmUgdmFsaWRhdGVkIGJ5IGhlYWRlciBwcmVkaWN0aW9uLAogCSAqIHByb3ZpZGVkIGNhc2Ugb2YgdGgtPmRvZmY9PTAgaXMgZWxpbWluYXRlZC4KIAkgKiBTbywgd2UgZGVmZXIgdGhlIGNoZWNrcy4gKi8KLQlpZiAoKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCi0JICAgICB0Y3BfdjRfY2hlY2tzdW1faW5pdChza2IpKSkKKwlpZiAoIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgJiYgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc2tiKSkKIAkJZ290byBiYWRfcGFja2V0OwogCi0JdGggPSBza2ItPmgudGg7CisJdGggPSB0Y3BfaGRyKHNrYik7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJVENQX1NLQl9DQihza2IpLT5zZXEgPSBudG9obCh0aC0+c2VxKTsKIAlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSAoVENQX1NLQl9DQihza2IpLT5zZXEgKyB0aC0+c3luICsgdGgtPmZpbiArCiAJCQkJICAgIHNrYi0+bGVuIC0gdGgtPmRvZmYgKiA0KTsKIAlUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgPSBudG9obCh0aC0+YWNrX3NlcSk7CiAJVENQX1NLQl9DQihza2IpLT53aGVuCSA9IDA7Ci0JVENQX1NLQl9DQihza2IpLT5mbGFncwkgPSBza2ItPm5oLmlwaC0+dG9zOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MJID0gaXBoLT50b3M7CiAJVENQX1NLQl9DQihza2IpLT5zYWNrZWQJID0gMDsKIAotCXNrID0gX19pbmV0X2xvb2t1cCgmdGNwX2hhc2hpbmZvLCBza2ItPm5oLmlwaC0+c2FkZHIsIHRoLT5zb3VyY2UsCi0JCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsIHRoLT5kZXN0LAotCQkJICAgaW5ldF9paWYoc2tiKSk7Ci0KKwlzayA9IF9faW5ldF9sb29rdXAoJnRjcF9oYXNoaW5mbywgaXBoLT5zYWRkciwgdGgtPnNvdXJjZSwKKwkJCSAgIGlwaC0+ZGFkZHIsIHRoLT5kZXN0LCBpbmV0X2lpZihza2IpKTsKIAlpZiAoIXNrKQogCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CiAKQEAgLTE3MjQsOCArMTcyNiw3IEBACiAJc3dpdGNoICh0Y3BfdGltZXdhaXRfc3RhdGVfcHJvY2VzcyhpbmV0X3R3c2soc2spLCBza2IsIHRoKSkgewogCWNhc2UgVENQX1RXX1NZTjogewogCQlzdHJ1Y3Qgc29jayAqc2syID0gaW5ldF9sb29rdXBfbGlzdGVuZXIoJnRjcF9oYXNoaW5mbywKLQkJCQkJCQlza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCQkJdGgtPmRlc3QsCisJCQkJCQkJaXBoLT5kYWRkciwgdGgtPmRlc3QsCiAJCQkJCQkJaW5ldF9paWYoc2tiKSk7CiAJCWlmIChzazIpIHsKIAkJCWluZXRfdHdza19kZXNjaGVkdWxlKGluZXRfdHdzayhzayksICZ0Y3BfZGVhdGhfcm93KTsKQEAgLTE3NzAsNyArMTc3MSw3IEBACiAKIAlpZiAocGVlcikgewogCQlpZiAoKHMzMikocGVlci0+dGNwX3RzIC0gdHAtPnJ4X29wdC50c19yZWNlbnQpIDw9IDAgfHwKLQkJICAgIChwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPCB4dGltZS50dl9zZWMgJiYKKwkJICAgIChwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPCBnZXRfc2Vjb25kcygpICYmCiAJCSAgICAgcGVlci0+dGNwX3RzX3N0YW1wIDw9IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wKSkgewogCQkJcGVlci0+dGNwX3RzX3N0YW1wID0gdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXA7CiAJCQlwZWVyLT50Y3BfdHMgPSB0cC0+cnhfb3B0LnRzX3JlY2VudDsKQEAgLTE3OTEsNyArMTc5Miw3IEBACiAJCWNvbnN0IHN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayAqdGNwdHcgPSB0Y3BfdHdzaygoc3RydWN0IHNvY2sgKil0dyk7CiAKIAkJaWYgKChzMzIpKHBlZXItPnRjcF90cyAtIHRjcHR3LT50d190c19yZWNlbnQpIDw9IDAgfHwKLQkJICAgIChwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPCB4dGltZS50dl9zZWMgJiYKKwkJICAgIChwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPCBnZXRfc2Vjb25kcygpICYmCiAJCSAgICAgcGVlci0+dGNwX3RzX3N0YW1wIDw9IHRjcHR3LT50d190c19yZWNlbnRfc3RhbXApKSB7CiAJCQlwZWVyLT50Y3BfdHNfc3RhbXAgPSB0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wOwogCQkJcGVlci0+dGNwX3RzCSAgID0gdGNwdHctPnR3X3RzX3JlY2VudDsKQEAgLTE4OTAsNyArMTg5MSw3IEBACiAJdGNwX2NsZWFudXBfY29uZ2VzdGlvbl9jb250cm9sKHNrKTsKIAogCS8qIENsZWFudXAgdXAgdGhlIHdyaXRlIGJ1ZmZlci4gKi8KLQlza19zdHJlYW1fd3JpdGVxdWV1ZV9wdXJnZShzayk7CisJdGNwX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKIAogCS8qIENsZWFucyB1cCBvdXIsIGhvcGVmdWxseSBlbXB0eSwgb3V0X29mX29yZGVyX3F1ZXVlLiAqLwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKQEAgLTIyOTMsMTMgKzIyOTQsMTMgQEAKIAkJcmVxKTsKIH0KIAotc3RhdGljIHZvaWQgZ2V0X3RjcDRfc29jayhzdHJ1Y3Qgc29jayAqc3AsIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCitzdGF0aWMgdm9pZCBnZXRfdGNwNF9zb2NrKHN0cnVjdCBzb2NrICpzaywgY2hhciAqdG1wYnVmLCBpbnQgaSkKIHsKIAlpbnQgdGltZXJfYWN0aXZlOwogCXVuc2lnbmVkIGxvbmcgdGltZXJfZXhwaXJlczsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNwKTsKLQljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2NzayhzcCk7Ci0Jc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc3ApOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJX19iZTMyIGRlc3QgPSBpbmV0LT5kYWRkcjsKIAlfX2JlMzIgc3JjID0gaW5ldC0+cmN2X3NhZGRyOwogCV9fdTE2IGRlc3RwID0gbnRvaHMoaW5ldC0+ZHBvcnQpOwpAQCAtMjMxMSw5ICsyMzEyLDkgQEAKIAl9IGVsc2UgaWYgKGljc2stPmljc2tfcGVuZGluZyA9PSBJQ1NLX1RJTUVfUFJPQkUwKSB7CiAJCXRpbWVyX2FjdGl2ZQk9IDQ7CiAJCXRpbWVyX2V4cGlyZXMJPSBpY3NrLT5pY3NrX3RpbWVvdXQ7Ci0JfSBlbHNlIGlmICh0aW1lcl9wZW5kaW5nKCZzcC0+c2tfdGltZXIpKSB7CisJfSBlbHNlIGlmICh0aW1lcl9wZW5kaW5nKCZzay0+c2tfdGltZXIpKSB7CiAJCXRpbWVyX2FjdGl2ZQk9IDI7Ci0JCXRpbWVyX2V4cGlyZXMJPSBzcC0+c2tfdGltZXIuZXhwaXJlczsKKwkJdGltZXJfZXhwaXJlcwk9IHNrLT5za190aW1lci5leHBpcmVzOwogCX0gZWxzZSB7CiAJCXRpbWVyX2FjdGl2ZQk9IDA7CiAJCXRpbWVyX2V4cGlyZXMgPSBqaWZmaWVzOwpAQCAtMjMyMSwxNyArMjMyMiwxNyBAQAogCiAJc3ByaW50Zih0bXBidWYsICIlNGQ6ICUwOFg6JTA0WCAlMDhYOiUwNFggJTAyWCAlMDhYOiUwOFggJTAyWDolMDhsWCAiCiAJCQkiJTA4WCAlNWQgJThkICVsdSAlZCAlcCAldSAldSAldSAldSAlZCIsCi0JCWksIHNyYywgc3JjcCwgZGVzdCwgZGVzdHAsIHNwLT5za19zdGF0ZSwKKwkJaSwgc3JjLCBzcmNwLCBkZXN0LCBkZXN0cCwgc2stPnNrX3N0YXRlLAogCQl0cC0+d3JpdGVfc2VxIC0gdHAtPnNuZF91bmEsCi0JCXNwLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOID8gc3AtPnNrX2Fja19iYWNrbG9nIDoKKwkJc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4gPyBzay0+c2tfYWNrX2JhY2tsb2cgOgogCQkJCQkgICAgICh0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxKSwKIAkJdGltZXJfYWN0aXZlLAogCQlqaWZmaWVzX3RvX2Nsb2NrX3QodGltZXJfZXhwaXJlcyAtIGppZmZpZXMpLAogCQlpY3NrLT5pY3NrX3JldHJhbnNtaXRzLAotCQlzb2NrX2lfdWlkKHNwKSwKKwkJc29ja19pX3VpZChzayksCiAJCWljc2stPmljc2tfcHJvYmVzX291dCwKLQkJc29ja19pX2lubyhzcCksCi0JCWF0b21pY19yZWFkKCZzcC0+c2tfcmVmY250KSwgc3AsCisJCXNvY2tfaV9pbm8oc2spLAorCQlhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCksIHNrLAogCQlpY3NrLT5pY3NrX3J0bywKIAkJaWNzay0+aWNza19hY2suYXRvLAogCQkoaWNzay0+aWNza19hY2sucXVpY2sgPDwgMSkgfCBpY3NrLT5pY3NrX2Fjay5waW5ncG9uZywKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9scC5jIGIvbmV0L2lwdjQvdGNwX2xwLmMKaW5kZXggZjBlYmFmMC4uNDMyOTRhZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2xwLmMKKysrIGIvbmV0L2lwdjQvdGNwX2xwLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogICogICAzLiBjYWxjIHNtb290aGVkIE9XRCAoU09XRCkuCiAgKiBNb3N0IGlkZWFzIGNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgVENQLUxQIGltcGxlbWVudGF0aW9uLgogICovCi1zdGF0aWMgdm9pZCB0Y3BfbHBfcnR0X3NhbXBsZShzdHJ1Y3Qgc29jayAqc2ssIHUzMiB1c3J0dCkKK3N0YXRpYyB2b2lkIHRjcF9scF9ydHRfc2FtcGxlKHN0cnVjdCBzb2NrICpzaywgdTMyIHJ0dCkKIHsKIAlzdHJ1Y3QgbHAgKmxwID0gaW5ldF9jc2tfY2Eoc2spOwogCXM2NCBtb3dkID0gdGNwX2xwX293ZF9jYWxjdWxhdG9yKHNrKTsKQEAgLTI2MSwxMSArMjYxLDEzIEBACiAgKiBuZXdSZW5vIGluIGluY3JlYXNlIGNhc2UuCiAgKiBXZSB3b3JrIGl0IG91dCBieSBmb2xsb3dpbmcgdGhlIGlkZWEgZnJvbSBUQ1AtTFAncyBwYXBlciBkaXJlY3RseQogICovCi1zdGF0aWMgdm9pZCB0Y3BfbHBfcGt0c19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBudW1fYWNrZWQpCitzdGF0aWMgdm9pZCB0Y3BfbHBfcGt0c19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBudW1fYWNrZWQsIGt0aW1lX3QgbGFzdCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgbHAgKmxwID0gaW5ldF9jc2tfY2Eoc2spOwogCisJdGNwX2xwX3J0dF9zYW1wbGUoc2ssICBrdGltZV90b191cyhuZXRfdGltZWRlbHRhKGxhc3QpKSk7CisKIAkvKiBjYWxjIGluZmVyZW5jZSAqLwogCWlmICh0Y3BfdGltZV9zdGFtcCA+IHRwLT5yeF9vcHQucmN2X3RzZWNyKQogCQlscC0+aW5mZXJlbmNlID0gMyAqICh0Y3BfdGltZV9zdGFtcCAtIHRwLT5yeF9vcHQucmN2X3RzZWNyKTsKQEAgLTMxMiwxMSArMzE0LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9scCA9IHsKKwkuZmxhZ3MgPSBUQ1BfQ09OR19SVFRfU1RBTVAsCiAJLmluaXQgPSB0Y3BfbHBfaW5pdCwKIAkuc3N0aHJlc2ggPSB0Y3BfcmVub19zc3RocmVzaCwKIAkuY29uZ19hdm9pZCA9IHRjcF9scF9jb25nX2F2b2lkLAogCS5taW5fY3duZCA9IHRjcF9yZW5vX21pbl9jd25kLAotCS5ydHRfc2FtcGxlID0gdGNwX2xwX3J0dF9zYW1wbGUsCiAJLnBrdHNfYWNrZWQgPSB0Y3BfbHBfcGt0c19hY2tlZCwKIAogCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IDZiNWM2NGYuLmExMmIwOGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCQl0dy0+dHdfc3Vic3RhdGUJICA9IFRDUF9USU1FX1dBSVQ7CiAJCXRjcHR3LT50d19yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wKSB7Ci0JCQl0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID0geHRpbWUudHZfc2VjOworCQkJdGNwdHctPnR3X3RzX3JlY2VudF9zdGFtcCA9IGdldF9zZWNvbmRzKCk7CiAJCQl0Y3B0dy0+dHdfdHNfcmVjZW50CSAgPSB0bXBfb3B0LnJjdl90c3ZhbDsKIAkJfQogCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wKSB7CiAJCQl0Y3B0dy0+dHdfdHNfcmVjZW50CSAgPSB0bXBfb3B0LnJjdl90c3ZhbDsKLQkJCXRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgPSB4dGltZS50dl9zZWM7CisJCQl0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID0gZ2V0X3NlY29uZHMoKTsKIAkJfQogCiAJCWluZXRfdHdza19wdXQodHcpOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJaWYgKHBhd3NfcmVqZWN0KQogCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9QQVdTRVNUQUJSRUpFQ1RFRCk7CiAKLQlpZighdGgtPnJzdCkgeworCWlmICghdGgtPnJzdCkgewogCQkvKiBJbiB0aGlzIGNhc2Ugd2UgbXVzdCByZXNldCB0aGUgVElNRVdBSVQgdGltZXIuCiAJCSAqCiAJCSAqIElmIGl0IGlzIEFDS2xlc3MgU1lOIGl0IG1heSBiZSBib3RoIG9sZCBkdXBsaWNhdGUKQEAgLTMyNCw3ICszMjQsNyBAQAogCQkJCWlmICh0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKSA9PSBOVUxMKQogCQkJCQlCVUcoKTsKIAkJCX0KLQkJfSB3aGlsZSgwKTsKKwkJfSB3aGlsZSAoMCk7CiAjZW5kaWYKIAogCQkvKiBMaW5rYWdlIHVwZGF0ZXMuICovCkBAIC0zODcsOCArMzg3LDggQEAKIAkJLyogTm93IHNldHVwIHRjcF9zb2NrICovCiAJCW5ld3RwID0gdGNwX3NrKG5ld3NrKTsKIAkJbmV3dHAtPnByZWRfZmxhZ3MgPSAwOwotCQluZXd0cC0+cmN2X254dCA9IHRyZXEtPnJjdl9pc24gKyAxOwotCQluZXd0cC0+c25kX254dCA9IG5ld3RwLT5zbmRfdW5hID0gbmV3dHAtPnNuZF9zbWwgPSB0cmVxLT5zbnRfaXNuICsgMTsKKwkJbmV3dHAtPnJjdl93dXAgPSBuZXd0cC0+Y29waWVkX3NlcSA9IG5ld3RwLT5yY3Zfbnh0ID0gdHJlcS0+cmN2X2lzbiArIDE7CisJCW5ld3RwLT5zbmRfc21sID0gbmV3dHAtPnNuZF91bmEgPSBuZXd0cC0+c25kX254dCA9IHRyZXEtPnNudF9pc24gKyAxOwogCiAJCXRjcF9wcmVxdWV1ZV9pbml0KG5ld3RwKTsKIApAQCAtNDIyLDEwICs0MjIsOCBAQAogCQl0Y3Bfc2V0X2NhX3N0YXRlKG5ld3NrLCBUQ1BfQ0FfT3Blbik7CiAJCXRjcF9pbml0X3htaXRfdGltZXJzKG5ld3NrKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3dHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7Ci0JCW5ld3RwLT5yY3Zfd3VwID0gdHJlcS0+cmN2X2lzbiArIDE7CiAJCW5ld3RwLT53cml0ZV9zZXEgPSB0cmVxLT5zbnRfaXNuICsgMTsKIAkJbmV3dHAtPnB1c2hlZF9zZXEgPSBuZXd0cC0+d3JpdGVfc2VxOwotCQluZXd0cC0+Y29waWVkX3NlcSA9IHRyZXEtPnJjdl9pc24gKyAxOwogCiAJCW5ld3RwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDA7CiAKQEAgLTQ0MCw3ICs0MzgsNyBAQAogCQkJCQkJICAgICAgIGtlZXBhbGl2ZV90aW1lX3doZW4obmV3dHApKTsKIAogCQluZXd0cC0+cnhfb3B0LnRzdGFtcF9vayA9IGlyZXEtPnRzdGFtcF9vazsKLQkJaWYoKG5ld3RwLT5yeF9vcHQuc2Fja19vayA9IGlyZXEtPnNhY2tfb2spICE9IDApIHsKKwkJaWYgKChuZXd0cC0+cnhfb3B0LnNhY2tfb2sgPSBpcmVxLT5zYWNrX29rKSAhPSAwKSB7CiAJCQlpZiAoc3lzY3RsX3RjcF9mYWNrKQogCQkJCW5ld3RwLT5yeF9vcHQuc2Fja19vayB8PSAyOwogCQl9CkBAIC00NTUsMTIgKzQ1MywxMyBAQAogCQkJbmV3dHAtPnJ4X29wdC5zbmRfd3NjYWxlID0gbmV3dHAtPnJ4X29wdC5yY3Zfd3NjYWxlID0gMDsKIAkJCW5ld3RwLT53aW5kb3dfY2xhbXAgPSBtaW4obmV3dHAtPndpbmRvd19jbGFtcCwgNjU1MzVVKTsKIAkJfQotCQluZXd0cC0+c25kX3duZCA9IG50b2hzKHNrYi0+aC50aC0+d2luZG93KSA8PCBuZXd0cC0+cnhfb3B0LnNuZF93c2NhbGU7CisJCW5ld3RwLT5zbmRfd25kID0gKG50b2hzKHRjcF9oZHIoc2tiKS0+d2luZG93KSA8PAorCQkJCSAgbmV3dHAtPnJ4X29wdC5zbmRfd3NjYWxlKTsKIAkJbmV3dHAtPm1heF93aW5kb3cgPSBuZXd0cC0+c25kX3duZDsKIAogCQlpZiAobmV3dHAtPnJ4X29wdC50c3RhbXBfb2spIHsKIAkJCW5ld3RwLT5yeF9vcHQudHNfcmVjZW50ID0gcmVxLT50c19yZWNlbnQ7Ci0JCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IHh0aW1lLnR2X3NlYzsKKwkJCW5ld3RwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gZ2V0X3NlY29uZHMoKTsKIAkJCW5ld3RwLT50Y3BfaGVhZGVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CiAJCX0gZWxzZSB7CiAJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IDA7CkBAIC00OTAsNyArNDg5LDcgQEAKIAkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKIAkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2KQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCV9fYmUzMiBmbGcgPSB0Y3BfZmxhZ193b3JkKHRoKSAmIChUQ1BfRkxBR19SU1R8VENQX0ZMQUdfU1lOfFRDUF9GTEFHX0FDSyk7CiAJaW50IHBhd3NfcmVqZWN0ID0gMDsKIAlzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgdG1wX29wdDsKQEAgLTUwNiw3ICs1MDUsNyBAQAogCQkJICogaXQgY2FuIGJlIGVzdGltYXRlZCAoYXBwcm94aW1hdGVseSkKIAkJCSAqIGZyb20gYW5vdGhlciBkYXRhLgogCQkJICovCi0JCQl0bXBfb3B0LnRzX3JlY2VudF9zdGFtcCA9IHh0aW1lLnR2X3NlYyAtICgoVENQX1RJTUVPVVRfSU5JVC9IWik8PHJlcS0+cmV0cmFucyk7CisJCQl0bXBfb3B0LnRzX3JlY2VudF9zdGFtcCA9IGdldF9zZWNvbmRzKCkgLSAoKFRDUF9USU1FT1VUX0lOSVQvSFopPDxyZXEtPnJldHJhbnMpOwogCQkJcGF3c19yZWplY3QgPSB0Y3BfcGF3c19jaGVjaygmdG1wX29wdCwgdGgtPnJzdCk7CiAJCX0KIAl9CkBAIC03MTIsOCArNzExLDggQEAKIAlpbnQgc3RhdGUgPSBjaGlsZC0+c2tfc3RhdGU7CiAKIAlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihjaGlsZCkpIHsKLQkJcmV0ID0gdGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKGNoaWxkLCBza2IsIHNrYi0+aC50aCwgc2tiLT5sZW4pOwotCisJCXJldCA9IHRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhjaGlsZCwgc2tiLCB0Y3BfaGRyKHNrYiksCisJCQkJCSAgICBza2ItPmxlbik7CiAJCS8qIFdha2V1cCBwYXJlbnQsIHNlbmQgU0lHSU8gKi8KIAkJaWYgKHN0YXRlID09IFRDUF9TWU5fUkVDViAmJiBjaGlsZC0+c2tfc3RhdGUgIT0gc3RhdGUpCiAJCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCAzYzI0ODgxLi5lNzBhNjg0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC02MiwxNCArNjIsMTMgQEAKIC8qIEJ5IGRlZmF1bHQsIFJGQzI4NjEgYmVoYXZpb3IuICAqLwogaW50IHN5c2N0bF90Y3Bfc2xvd19zdGFydF9hZnRlcl9pZGxlIF9fcmVhZF9tb3N0bHkgPSAxOwogCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrLT5za19zZW5kX2hlYWQgPSBza2ItPm5leHQ7Ci0JaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZSkKLQkJc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwl0Y3BfYWR2YW5jZV9zZW5kX2hlYWQoc2ssIHNrYik7CiAJdHAtPnNuZF9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JdGNwX3BhY2tldHNfb3V0X2luYyhzaywgdHAsIHNrYik7CisJdGNwX3BhY2tldHNfb3V0X2luYyhzaywgc2tiKTsKIH0KIAogLyogU05ELk5YVCwgaWYgd2luZG93IHdhcyBub3Qgc2hydW5rLgpAQCAtNzgsOCArNzcsMTAgQEAKICAqIEFueXRoaW5nIGluIGJldHdlZW4gU05ELlVOQS4uLlNORC5VTkErU05ELldORCBhbHNvIGNhbiBiZSBhbHJlYWR5CiAgKiBpbnZhbGlkLiBPSywgbGV0J3MgbWFrZSB0aGlzIGZvciBub3c6CiAgKi8KLXN0YXRpYyBpbmxpbmUgX191MzIgdGNwX2FjY2VwdGFibGVfc2VxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbmxpbmUgX191MzIgdGNwX2FjY2VwdGFibGVfc2VxKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmICghYmVmb3JlKHRwLT5zbmRfdW5hK3RwLT5zbmRfd25kLCB0cC0+c25kX254dCkpCiAJCXJldHVybiB0cC0+c25kX254dDsKIAllbHNlCkBAIC0yMzgsNyArMjM5LDcgQEAKIAl1MzIgbmV3X3dpbiA9IF9fdGNwX3NlbGVjdF93aW5kb3coc2spOwogCiAJLyogTmV2ZXIgc2hyaW5rIHRoZSBvZmZlcmVkIHdpbmRvdyAqLwotCWlmKG5ld193aW4gPCBjdXJfd2luKSB7CisJaWYgKG5ld193aW4gPCBjdXJfd2luKSB7CiAJCS8qIERhbmdlciBXaWxsIFJvYmluc29uIQogCQkgKiBEb24ndCB1cGRhdGUgcmN2X3d1cC9yY3Zfd25kIGhlcmUgb3IgZWxzZQogCQkgKiB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFkdmVydGlzZSBhIHplcm8KQEAgLTI4OSwxMCArMjkwLDEyIEBACiAJCQkgICAgICAgKFRDUE9QVF9TQUNLIDw8ICA4KSB8CiAJCQkgICAgICAgKFRDUE9MRU5fU0FDS19CQVNFICsgKHRwLT5yeF9vcHQuZWZmX3NhY2tzICoKIAkJCQkJCSAgICAgVENQT0xFTl9TQUNLX1BFUkJMT0NLKSkpOwotCQlmb3IodGhpc19zYWNrID0gMDsgdGhpc19zYWNrIDwgdHAtPnJ4X29wdC5lZmZfc2Fja3M7IHRoaXNfc2FjaysrKSB7CisKKwkJZm9yICh0aGlzX3NhY2sgPSAwOyB0aGlzX3NhY2sgPCB0cC0+cnhfb3B0LmVmZl9zYWNrczsgdGhpc19zYWNrKyspIHsKIAkJCSpwdHIrKyA9IGh0b25sKHNwW3RoaXNfc2Fja10uc3RhcnRfc2VxKTsKIAkJCSpwdHIrKyA9IGh0b25sKHNwW3RoaXNfc2Fja10uZW5kX3NlcSk7CiAJCX0KKwogCQlpZiAodHAtPnJ4X29wdC5kc2FjaykgewogCQkJdHAtPnJ4X29wdC5kc2FjayA9IDA7CiAJCQl0cC0+cnhfb3B0LmVmZl9zYWNrcy0tOwpAQCAtMzM3LDcgKzM0MCw3IEBACiAJICovCiAJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9NU1MgPDwgMjQpIHwgKFRDUE9MRU5fTVNTIDw8IDE2KSB8IG1zcyk7CiAJaWYgKHRzKSB7Ci0JCWlmKHNhY2spCisJCWlmIChzYWNrKQogCQkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9TQUNLX1BFUk0gPDwgMjQpIHwKIAkJCQkgICAgICAgKFRDUE9MRU5fU0FDS19QRVJNIDw8IDE2KSB8CiAJCQkJICAgICAgIChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpIHwKQEAgLTM0OSw3ICszNTIsNyBAQAogCQkJCSAgICAgICBUQ1BPTEVOX1RJTUVTVEFNUCk7CiAJCSpwdHIrKyA9IGh0b25sKHRzdGFtcCk7CQkvKiBUU1ZBTCAqLwogCQkqcHRyKysgPSBodG9ubCh0c19yZWNlbnQpOwkvKiBUU0VDUiAqLwotCX0gZWxzZSBpZihzYWNrKQorCX0gZWxzZSBpZiAoc2FjaykKIAkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKIAkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAogCQkJICAgICAgIChUQ1BPUFRfU0FDS19QRVJNIDw8IDgpIHwKQEAgLTQwNiw3ICs0MDksNyBAQAogCS8qIElmIGNvbmdlc3Rpb24gY29udHJvbCBpcyBkb2luZyB0aW1lc3RhbXBpbmcsIHdlIG11c3QKIAkgKiB0YWtlIHN1Y2ggYSB0aW1lc3RhbXAgYmVmb3JlIHdlIHBvdGVudGlhbGx5IGNsb25lL2NvcHkuCiAJICovCi0JaWYgKGljc2stPmljc2tfY2Ffb3BzLT5ydHRfc2FtcGxlKQorCWlmIChpY3NrLT5pY3NrX2NhX29wcy0+ZmxhZ3MgJiBUQ1BfQ09OR19SVFRfU1RBTVApCiAJCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCiAJaWYgKGxpa2VseShjbG9uZV9pdCkpIHsKQEAgLTQzMCw3ICs0MzMsNyBAQAogCXN5c2N0bF9mbGFncyA9IDA7CiAJaWYgKHVubGlrZWx5KHRjYi0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX1NZTikpIHsKIAkJdGNwX2hlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsgVENQT0xFTl9NU1M7Ci0JCWlmKHN5c2N0bF90Y3BfdGltZXN0YW1wcykgeworCQlpZiAoc3lzY3RsX3RjcF90aW1lc3RhbXBzKSB7CiAJCQl0Y3BfaGVhZGVyX3NpemUgKz0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsKIAkJCXN5c2N0bF9mbGFncyB8PSBTWVNDVExfRkxBR19UU1RBTVBTOwogCQl9CkBAIC00NjUsMTEgKzQ2OCwxMiBAQAogCQl0Y3BfaGVhZGVyX3NpemUgKz0gVENQT0xFTl9NRDVTSUdfQUxJR05FRDsKICNlbmRpZgogCi0JdGggPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChza2IsIHRjcF9oZWFkZXJfc2l6ZSk7Ci0Jc2tiLT5oLnRoID0gdGg7CisJc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOwogCiAJLyogQnVpbGQgVENQIGhlYWRlciBhbmQgY2hlY2tzdW0gaXQuICovCisJdGggPSB0Y3BfaGRyKHNrYik7CiAJdGgtPnNvdXJjZQkJPSBpbmV0LT5zcG9ydDsKIAl0aC0+ZGVzdAkJPSBpbmV0LT5kcG9ydDsKIAl0aC0+c2VxCQkJPSBodG9ubCh0Y2ItPnNlcSk7CkBAIC01MTUsNyArNTE5LDcgQEAKIAkJCQkJICAgICBtZDUgPyAmbWQ1X2hhc2hfbG9jYXRpb24gOgogI2VuZGlmCiAJCQkJCSAgICAgTlVMTCk7Ci0JCVRDUF9FQ05fc2VuZChzaywgdHAsIHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKKwkJVENQX0VDTl9zZW5kKHNrLCBza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKQEAgLTUyNCw3ICs1MjgsNyBAQAogCQl0cC0+YWZfc3BlY2lmaWMtPmNhbGNfbWQ1X2hhc2gobWQ1X2hhc2hfbG9jYXRpb24sCiAJCQkJCSAgICAgICBtZDUsCiAJCQkJCSAgICAgICBzaywgTlVMTCwgTlVMTCwKLQkJCQkJICAgICAgIHNrYi0+aC50aCwKKwkJCQkJICAgICAgIHRjcF9oZHIoc2tiKSwKIAkJCQkJICAgICAgIHNrLT5za19wcm90b2NvbCwKIAkJCQkJICAgICAgIHNrYi0+bGVuKTsKIAl9CkBAIC01NDUsNyArNTQ5LDcgQEAKIAlpZiAobGlrZWx5KGVyciA8PSAwKSkKIAkJcmV0dXJuIGVycjsKIAotCXRjcF9lbnRlcl9jd3Ioc2spOworCXRjcF9lbnRlcl9jd3Ioc2ssIDEpOwogCiAJcmV0dXJuIG5ldF94bWl0X2V2YWwoZXJyKTsKIApAQCAtNTY3LDEyICs1NzEsOCBAQAogCS8qIEFkdmFuY2Ugd3JpdGVfc2VxIGFuZCBwbGFjZSBvbnRvIHRoZSB3cml0ZV9xdWV1ZS4gKi8KIAl0cC0+d3JpdGVfc2VxID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCXNrYl9oZWFkZXJfcmVsZWFzZShza2IpOwotCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwl0Y3BfYWRkX3dyaXRlX3F1ZXVlX3RhaWwoc2ssIHNrYik7CiAJc2tfY2hhcmdlX3NrYihzaywgc2tiKTsKLQotCS8qIFF1ZXVlIGl0LCByZW1lbWJlcmluZyB3aGVyZSB3ZSBtdXN0IHN0YXJ0IHNlbmRpbmcuICovCi0JaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gTlVMTCkKLQkJc2stPnNrX3NlbmRfaGVhZCA9IHNrYjsKIH0KIAogc3RhdGljIHZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbXNzX25vdykKQEAgLTcwNSw3ICs3MDUsNyBAQAogCiAJLyogTGluayBCVUZGIGludG8gdGhlIHNlbmQgcXVldWUuICovCiAJc2tiX2hlYWRlcl9yZWxlYXNlKGJ1ZmYpOwotCV9fc2tiX2FwcGVuZChza2IsIGJ1ZmYsICZzay0+c2tfd3JpdGVfcXVldWUpOworCXRjcF9pbnNlcnRfd3JpdGVfcXVldWVfYWZ0ZXIoc2tiLCBidWZmLCBzayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTczNiw3ICs3MzYsNyBAQAogCX0KIAlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gazsKIAotCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CiAJc2tiLT5kYXRhX2xlbiAtPSBsZW47CiAJc2tiLT5sZW4gPSBza2ItPmRhdGFfbGVuOwogfQpAQCAtOTMwLDggKzkzMCw5IEBACiAKIC8qIENvbmdlc3Rpb24gd2luZG93IHZhbGlkYXRpb24uIChSRkMyODYxKSAqLwogCi1zdGF0aWMgdm9pZCB0Y3BfY3duZF92YWxpZGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfY3duZF92YWxpZGF0ZShzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJX191MzIgcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CiAKIAlpZiAocGFja2V0c19vdXQgPj0gdHAtPnNuZF9jd25kKSB7CkBAIC0xMDU2LDcgKzEwNTcsNyBAQAogCXJldHVybiAhYWZ0ZXIoZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCk7CiB9CiAKLS8qIFRoaXMgY2hlY2tzIGlmIHRoZSBkYXRhIGJlYXJpbmcgcGFja2V0IFNLQiAodXN1YWxseSBzay0+c2tfc2VuZF9oZWFkKQorLyogVGhpcyBjaGVja3MgaWYgdGhlIGRhdGEgYmVhcmluZyBwYWNrZXQgU0tCICh1c3VhbGx5IHRjcF9zZW5kX2hlYWQoc2spKQogICogc2hvdWxkIGJlIHB1dCBvbiB0aGUgd2lyZSByaWdodCBub3cuICBJZiBzbywgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCiAgKiBwYWNrZXRzIGFsbG93ZWQgYnkgdGhlIGNvbmdlc3Rpb24gd2luZG93LgogICovCkBAIC0xMDc5LDE1ICsxMDgwLDEwIEBACiAJcmV0dXJuIGN3bmRfcXVvdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRjcF9za2JfaXNfbGFzdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrKQogewotCXJldHVybiBza2ItPm5leHQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZTsKLX0KLQotaW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKTsKIAogCXJldHVybiAoc2tiICYmCiAJCXRjcF9zbmRfdGVzdChzaywgc2tiLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLApAQCAtMTE0Myw3ICsxMTM5LDcgQEAKIAogCS8qIExpbmsgQlVGRiBpbnRvIHRoZSBzZW5kIHF1ZXVlLiAqLwogCXNrYl9oZWFkZXJfcmVsZWFzZShidWZmKTsKLQlfX3NrYl9hcHBlbmQoc2tiLCBidWZmLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwl0Y3BfaW5zZXJ0X3dyaXRlX3F1ZXVlX2FmdGVyKHNrYiwgYnVmZiwgc2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTUzLDggKzExNDksOSBAQAogICoKICAqIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gSm9obiBIZWZmbmVyLgogICovCi1zdGF0aWMgaW50IHRjcF90c29fc2hvdWxkX2RlZmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgdGNwX3Rzb19zaG91bGRfZGVmZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OwogCkBAIC0xMjQ5LDEwICsxMjQ2LDEwIEBACiAKIAkvKiBIYXZlIGVub3VnaCBkYXRhIGluIHRoZSBzZW5kIHF1ZXVlIHRvIHByb2JlPyAqLwogCWxlbiA9IDA7Ci0JaWYgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSA9PSBOVUxMKQorCWlmICgoc2tiID0gdGNwX3NlbmRfaGVhZChzaykpID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAl3aGlsZSAoKGxlbiArPSBza2ItPmxlbikgPCBwcm9iZV9zaXplICYmICF0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikpCi0JCXNrYiA9IHNrYi0+bmV4dDsKKwkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYik7CiAJaWYgKGxlbiA8IHByb2JlX3NpemUpCiAJCXJldHVybiAtMTsKIApAQCAtMTI3OSw5ICsxMjc2LDkgQEAKIAkJcmV0dXJuIC0xOwogCXNrX2NoYXJnZV9za2Ioc2ssIG5za2IpOwogCi0Jc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQlfX3NrYl9pbnNlcnQobnNrYiwgc2tiLT5wcmV2LCBza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOwotCXNrLT5za19zZW5kX2hlYWQgPSBuc2tiOworCXNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOworCXRjcF9pbnNlcnRfd3JpdGVfcXVldWVfYmVmb3JlKG5za2IsIHNrYiwgc2spOworCXRjcF9hZHZhbmNlX3NlbmRfaGVhZChzaywgc2tiKTsKIAogCVRDUF9TS0JfQ0IobnNrYiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwogCVRDUF9TS0JfQ0IobnNrYiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIHByb2JlX3NpemU7CkBAIC0xMjkyLDcgKzEyODksNyBAQAogCiAJbGVuID0gMDsKIAl3aGlsZSAobGVuIDwgcHJvYmVfc2l6ZSkgewotCQluZXh0ID0gc2tiLT5uZXh0OworCQluZXh0ID0gdGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYik7CiAKIAkJY29weSA9IG1pbl90KGludCwgc2tiLT5sZW4sIHByb2JlX3NpemUgLSBsZW4pOwogCQlpZiAobnNrYi0+aXBfc3VtbWVkKQpAQCAtMTMwNSw3ICsxMzAyLDcgQEAKIAkJCS8qIFdlJ3ZlIGVhdGVuIGFsbCB0aGUgZGF0YSBmcm9tIHRoaXMgc2tiLgogCQkJICogVGhyb3cgaXQgYXdheS4gKi8KIAkJCVRDUF9TS0JfQ0IobnNrYiktPmZsYWdzIHw9IFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3M7Ci0JCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwkJCXRjcF91bmxpbmtfd3JpdGVfcXVldWUoc2tiLCBzayk7CiAJCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CiAJCX0gZWxzZSB7CiAJCQlUQ1BfU0tCX0NCKG5za2IpLT5mbGFncyB8PSBUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYKQEAgLTEzMzMsNyArMTMzMCw3IEBACiAJCS8qIERlY3JlbWVudCBjd25kIGhlcmUgYmVjYXVzZSB3ZSBhcmUgc2VuZGluZwogCQkqIGVmZmVjdGl2ZWx5IHR3byBwYWNrZXRzLiAqLwogCQl0cC0+c25kX2N3bmQtLTsKLQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIG5za2IpOworCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCBuc2tiKTsKIAogCQlpY3NrLT5pY3NrX210dXAucHJvYmVfc2l6ZSA9IHRjcF9tc3NfdG9fbXR1KHNrLCBuc2tiLT5sZW4pOwogCQl0cC0+bXR1X3Byb2JlLnByb2JlX3NlcV9zdGFydCA9IFRDUF9TS0JfQ0IobnNrYiktPnNlcTsKQEAgLTEzNzcsNyArMTM3NCw3IEBACiAJCXNlbnRfcGt0cyA9IDE7CiAJfQogCi0Jd2hpbGUgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSkgeworCXdoaWxlICgoc2tiID0gdGNwX3NlbmRfaGVhZChzaykpKSB7CiAJCXVuc2lnbmVkIGludCBsaW1pdDsKIAogCQl0c29fc2VncyA9IHRjcF9pbml0X3Rzb19zZWdzKHNrLCBza2IsIG1zc19ub3cpOwpAQCAtMTM5Niw3ICsxMzkzLDcgQEAKIAkJCQkJCSAgICAgIG5vbmFnbGUgOiBUQ1BfTkFHTEVfUFVTSCkpKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKLQkJCWlmICh0Y3BfdHNvX3Nob3VsZF9kZWZlcihzaywgdHAsIHNrYikpCisJCQlpZiAodGNwX3Rzb19zaG91bGRfZGVmZXIoc2ssIHNrYikpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQyNSwzMSArMTQyMiwzMSBAQAogCQkvKiBBZHZhbmNlIHRoZSBzZW5kX2hlYWQuICBUaGlzIG9uZSBpcyBzZW50IG91dC4KIAkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgogCQkgKi8KLQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHNrYik7CiAKIAkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKIAkJc2VudF9wa3RzKys7CiAJfQogCiAJaWYgKGxpa2VseShzZW50X3BrdHMpKSB7Ci0JCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7CisJCXRjcF9jd25kX3ZhbGlkYXRlKHNrKTsKIAkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAhdHAtPnBhY2tldHNfb3V0ICYmIHNrLT5za19zZW5kX2hlYWQ7CisJcmV0dXJuICF0cC0+cGFja2V0c19vdXQgJiYgdGNwX3NlbmRfaGVhZChzayk7CiB9CiAKIC8qIFB1c2ggb3V0IGFueSBwZW5kaW5nIGZyYW1lcyB3aGljaCB3ZXJlIGhlbGQgYmFjayBkdWUgdG8KICAqIFRDUF9DT1JLIG9yIGF0dGVtcHQgYXQgY29hbGVzY2luZyB0aW55IHBhY2tldHMuCiAgKiBUaGUgc29ja2V0IG11c3QgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuCiAgKi8KLXZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQordm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGN1cl9tc3MsCisJCQkgICAgICAgaW50IG5vbmFnbGUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOwogCiAJaWYgKHNrYikgewogCQlpZiAodGNwX3dyaXRlX3htaXQoc2ssIGN1cl9tc3MsIG5vbmFnbGUpKQotCQkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7CisJCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2spOwogCX0KIH0KIApAQCAtMTQ1OSw3ICsxNDU2LDcgQEAKIHZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOwogCXVuc2lnbmVkIGludCB0c29fc2VncywgY3duZF9xdW90YTsKIAogCUJVR19PTighc2tiIHx8IHNrYi0+bGVuIDwgbXNzX25vdyk7CkBAIC0xNDkzLDggKzE0OTAsOCBAQAogCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAogCQlpZiAobGlrZWx5KCF0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDEsIHNrLT5za19hbGxvY2F0aW9uKSkpIHsKLQkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOwotCQkJdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKKwkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHNrYik7CisJCQl0Y3BfY3duZF92YWxpZGF0ZShzayk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xNjIwLDcgKzE2MTcsNyBAQAogc3RhdGljIHZvaWQgdGNwX3JldHJhbnNfdHJ5X2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG1zc19ub3cpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKm5leHRfc2tiID0gc2tiLT5uZXh0OworCXN0cnVjdCBza19idWZmICpuZXh0X3NrYiA9IHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpOwogCiAJLyogVGhlIGZpcnN0IHRlc3Qgd2UgbXVzdCBtYWtlIGlzIHRoYXQgbmVpdGhlciBvZiB0aGVzZSB0d28KIAkgKiBTS0IncyBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBzb21lb25lIGVsc2UuCkBAIC0xNjMwLDcgKzE2MjcsNyBAQAogCQl1MTYgZmxhZ3MgPSBUQ1BfU0tCX0NCKHNrYiktPmZsYWdzOwogCiAJCS8qIEFsc28gcHVudCBpZiBuZXh0IHNrYiBoYXMgYmVlbiBTQUNLJ2QuICovCi0JCWlmKFRDUF9TS0JfQ0IobmV4dF9za2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpCisJCWlmIChUQ1BfU0tCX0NCKG5leHRfc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQogCQkJcmV0dXJuOwogCiAJCS8qIE5leHQgc2tiIGlzIG91dCBvZiB3aW5kb3cuICovCkBAIC0xNjUyLDkgKzE2NDksMTEgQEAKIAkJY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogCiAJCS8qIE9rLglXZSB3aWxsIGJlIGFibGUgdG8gY29sbGFwc2UgdGhlIHBhY2tldC4gKi8KLQkJX19za2JfdW5saW5rKG5leHRfc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwkJdGNwX3VubGlua193cml0ZV9xdWV1ZShuZXh0X3NrYiwgc2spOwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgbmV4dF9za2Jfc2l6ZSksIG5leHRfc2tiLT5kYXRhLCBuZXh0X3NrYl9zaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShuZXh0X3NrYiwKKwkJCQkJICBza2JfcHV0KHNrYiwgbmV4dF9za2Jfc2l6ZSksCisJCQkJCSAgbmV4dF9za2Jfc2l6ZSk7CiAKIAkJaWYgKG5leHRfc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKQEAgLTE3MDYsNyArMTcwNSw5IEBACiAJdW5zaWduZWQgaW50IG1zcyA9IHRjcF9jdXJyZW50X21zcyhzaywgMCk7CiAJaW50IGxvc3QgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQlpZiAoc2tiLT5sZW4gPiBtc3MgJiYKIAkJICAgICEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSkgewogCQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9SRVRSQU5TKSB7CkBAIC0xNzg4LDEzICsxNzg5LDEzIEBACiAJfQogCiAJLyogQ29sbGFwc2UgdHdvIGFkamFjZW50IHBhY2tldHMgaWYgd29ydGh3aGlsZSBhbmQgd2UgY2FuLiAqLwotCWlmKCEoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSAmJgotCSAgIChza2ItPmxlbiA8IChjdXJfbXNzID4+IDEpKSAmJgotCSAgIChza2ItPm5leHQgIT0gc2stPnNrX3NlbmRfaGVhZCkgJiYKLQkgICAoc2tiLT5uZXh0ICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWUpICYmCi0JICAgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCAmJiBza2Jfc2hpbmZvKHNrYi0+bmV4dCktPm5yX2ZyYWdzID09IDApICYmCi0JICAgKHRjcF9za2JfcGNvdW50KHNrYikgPT0gMSAmJiB0Y3Bfc2tiX3Bjb3VudChza2ItPm5leHQpID09IDEpICYmCi0JICAgKHN5c2N0bF90Y3BfcmV0cmFuc19jb2xsYXBzZSAhPSAwKSkKKwlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pICYmCisJICAgIChza2ItPmxlbiA8IChjdXJfbXNzID4+IDEpKSAmJgorCSAgICAodGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYikgIT0gdGNwX3NlbmRfaGVhZChzaykpICYmCisJICAgICghdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpKSAmJgorCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwICYmIHNrYl9zaGluZm8odGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYikpLT5ucl9mcmFncyA9PSAwKSAmJgorCSAgICAodGNwX3NrYl9wY291bnQoc2tiKSA9PSAxICYmIHRjcF9za2JfcGNvdW50KHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpKSA9PSAxKSAmJgorCSAgICAoc3lzY3RsX3RjcF9yZXRyYW5zX2NvbGxhcHNlICE9IDApKQogCQl0Y3BfcmV0cmFuc190cnlfY29sbGFwc2Uoc2ssIHNrYiwgY3VyX21zcyk7CiAKIAlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cmVidWlsZF9oZWFkZXIoc2spKQpAQCAtMTgwNCw5ICsxODA1LDkgQEAKIAkgKiByZXRyYW5zbWl0IHdoZW4gb2xkIGRhdGEgaXMgYXR0YWNoZWQuICBTbyBzdHJpcCBpdCBvZmYKIAkgKiBzaW5jZSBpdCBpcyBjaGVhcCB0byBkbyBzbyBhbmQgc2F2ZXMgYnl0ZXMgb24gdGhlIG5ldHdvcmsuCiAJICovCi0JaWYoc2tiLT5sZW4gPiAwICYmCi0JICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikgJiYKLQkgICB0cC0+c25kX3VuYSA9PSAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gMSkpIHsKKwlpZiAoc2tiLT5sZW4gPiAwICYmCisJICAgIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCisJICAgIHRwLT5zbmRfdW5hID09IChUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSAxKSkgewogCQlpZiAoIXBza2JfdHJpbShza2IsIDApKSB7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAtIDE7CiAJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMTsKQEAgLTE4NzIsMTUgKzE4NzMsMTcgQEAKIAkJc2tiID0gdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQ7CiAJCXBhY2tldF9jbnQgPSB0cC0+cmV0cmFuc21pdF9jbnRfaGludDsKIAl9ZWxzZXsKLQkJc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKIAkJcGFja2V0X2NudCA9IDA7CiAJfQogCiAJLyogRmlyc3QgcGFzczogcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuICovCiAJaWYgKHRwLT5sb3N0X291dCkgewotCQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJCXRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbShza2IsIHNrKSB7CiAJCQlfX3U4IHNhY2tlZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkOwogCisJCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQorCQkJCWJyZWFrOwogCQkJLyogd2UgY291bGQgZG8gYmV0dGVyIHRoYW4gdG8gYXNzaWduIGVhY2ggdGltZSAqLwogCQkJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBza2I7CiAJCQl0cC0+cmV0cmFuc21pdF9jbnRfaGludCA9IHBhY2tldF9jbnQ7CkBAIC0xOTA2LDggKzE5MDksNyBAQAogCQkJCQllbHNlCiAJCQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTTE9XU1RBUlRSRVRSQU5TKTsKIAotCQkJCQlpZiAoc2tiID09Ci0JCQkJCSAgICBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkKKwkJCQkJaWYgKHNrYiA9PSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpCiAJCQkJCQlpbmV0X2Nza19yZXNldF94bWl0X3RpbWVyKHNrLCBJQ1NLX1RJTUVfUkVUUkFOUywKIAkJCQkJCQkJCSAgaW5ldF9jc2soc2spLT5pY3NrX3J0bywKIAkJCQkJCQkJCSAgVENQX1JUT19NQVgpOwpAQCAtMTkzNywxOCArMTkzOSwyMCBAQAogCSAqIHNlZ21lbnRzIHRvIHNlbmQuCiAJICovCiAKLQlpZiAodGNwX21heV9zZW5kX25vdyhzaywgdHApKQorCWlmICh0Y3BfbWF5X3NlbmRfbm93KHNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRwLT5mb3J3YXJkX3NrYl9oaW50KSB7CiAJCXNrYiA9IHRwLT5mb3J3YXJkX3NrYl9oaW50OwogCQlwYWNrZXRfY250ID0gdHAtPmZvcndhcmRfY250X2hpbnQ7CiAJfSBlbHNlewotCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKKwkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOwogCQlwYWNrZXRfY250ID0gMDsKIAl9CiAKLQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQl0cC0+Zm9yd2FyZF9jbnRfaGludCA9IHBhY2tldF9jbnQ7CiAJCXRwLT5mb3J3YXJkX3NrYl9oaW50ID0gc2tiOwogCkBAIC0xOTczLDcgKzE5NzcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoc2tiID09IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKQorCQlpZiAoc2tiID09IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkKIAkJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJCQkJICBpbmV0X2NzayhzayktPmljc2tfcnRvLAogCQkJCQkJICBUQ1BfUlRPX01BWCk7CkBAIC0xOTg5LDcgKzE5OTMsNyBAQAogdm9pZCB0Y3Bfc2VuZF9maW4oc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVla190YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAJaW50IG1zc19ub3c7CiAKIAkvKiBPcHRpbWl6YXRpb24sIHRhY2sgb24gdGhlIEZJTiBpZiB3ZSBoYXZlIGEgcXVldWUgb2YKQEAgLTE5OTgsNyArMjAwMiw3IEBACiAJICovCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgMSk7CiAKLQlpZiAoc2stPnNrX3NlbmRfaGVhZCAhPSBOVUxMKSB7CisJaWYgKHRjcF9zZW5kX2hlYWQoc2spICE9IE5VTEwpIHsKIAkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX0ZJTjsKIAkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKys7CiAJCXRwLT53cml0ZV9zZXErKzsKQEAgLTIwMjUsNyArMjAyOSw3IEBACiAJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKIAkJdGNwX3F1ZXVlX3NrYihzaywgc2tiKTsKIAl9Ci0JX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csIFRDUF9OQUdMRV9PRkYpOworCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIG1zc19ub3csIFRDUF9OQUdMRV9PRkYpOwogfQogCiAvKiBXZSBnZXQgaGVyZSB3aGVuIGEgcHJvY2VzcyBjbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IgKGVpdGhlciBkdWUgdG8KQEAgLTIwMzUsNyArMjAzOSw2IEBACiAgKi8KIHZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgZ2ZwX3QgcHJpb3JpdHkpCiB7Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCS8qIE5PVEU6IE5vIFRDUCBvcHRpb25zIGF0dGFjaGVkIGFuZCB3ZSBuZXZlciByZXRyYW5zbWl0IHRoaXMuICovCkBAIC0yMDU1LDcgKzIwNTgsNyBAQAogCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOwogCiAJLyogU2VuZCBpdCBvZmYuICovCi0JVENQX1NLQl9DQihza2IpLT5zZXEgPSB0Y3BfYWNjZXB0YWJsZV9zZXEoc2ssIHRwKTsKKwlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHRjcF9hY2NlcHRhYmxlX3NlcShzayk7CiAJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CiAJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CiAJaWYgKHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYiwgMCwgcHJpb3JpdHkpKQpAQCAtMjA3MSw3ICsyMDc0LDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiogc2tiOwogCi0Jc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSk7CisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOwogCWlmIChza2IgPT0gTlVMTCB8fCAhKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MmVENQQ0JfRkxBR19TWU4pKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJ0Y3Bfc2VuZF9zeW5hY2s6IHdyb25nIHF1ZXVlIHN0YXRlXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yMDgxLDkgKzIwODQsOSBAQAogCQkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwogCQkJaWYgKG5za2IgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCV9fc2tiX3VubGluayhza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworCQkJdGNwX3VubGlua193cml0ZV9xdWV1ZShza2IsIHNrKTsKIAkJCXNrYl9oZWFkZXJfcmVsZWFzZShuc2tiKTsKLQkJCV9fc2tiX3F1ZXVlX2hlYWQoJnNrLT5za193cml0ZV9xdWV1ZSwgbnNrYik7CisJCQlfX3RjcF9hZGRfd3JpdGVfcXVldWVfaGVhZChzaywgbnNrYik7CiAJCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CiAJCQlza19jaGFyZ2Vfc2tiKHNrLCBuc2tiKTsKIAkJCXNrYiA9IG5za2I7CkBAIC0yMTMzLDggKzIxMzYsMTAgQEAKIAlpZiAobWQ1KQogCQl0Y3BfaGVhZGVyX3NpemUgKz0gVENQT0xFTl9NRDVTSUdfQUxJR05FRDsKICNlbmRpZgotCXNrYi0+aC50aCA9IHRoID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOworCXNrYl9wdXNoKHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCisJdGggPSB0Y3BfaGRyKHNrYik7CiAJbWVtc2V0KHRoLCAwLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogCXRoLT5zeW4gPSAxOwogCXRoLT5hY2sgPSAxOwpAQCAtMjE4OCw3ICsyMTkzLDcgQEAKIAkJdHAtPmFmX3NwZWNpZmljLT5jYWxjX21kNV9oYXNoKG1kNV9oYXNoX2xvY2F0aW9uLAogCQkJCQkgICAgICAgbWQ1LAogCQkJCQkgICAgICAgTlVMTCwgZHN0LCByZXEsCi0JCQkJCSAgICAgICBza2ItPmgudGgsIHNrLT5za19wcm90b2NvbCwKKwkJCQkJICAgICAgIHRjcF9oZHIoc2tiKSwgc2stPnNrX3Byb3RvY29sLAogCQkJCQkgICAgICAgc2tiLT5sZW4pOwogCX0KICNlbmRpZgpAQCAtMjI3MSw3ICsyMjc2LDcgQEAKIAlza2JfcmVzZXJ2ZShidWZmLCBNQVhfVENQX0hFQURFUik7CiAKIAlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IFRDUENCX0ZMQUdfU1lOOwotCVRDUF9FQ05fc2VuZF9zeW4oc2ssIHRwLCBidWZmKTsKKwlUQ1BfRUNOX3NlbmRfc3luKHNrLCBidWZmKTsKIAlUQ1BfU0tCX0NCKGJ1ZmYpLT5zYWNrZWQgPSAwOwogCXNrYl9zaGluZm8oYnVmZiktPmdzb19zZWdzID0gMTsKIAlza2Jfc2hpbmZvKGJ1ZmYpLT5nc29fc2l6ZSA9IDA7CkBAIC0yMjg1LDcgKzIyOTAsNyBAQAogCVRDUF9TS0JfQ0IoYnVmZiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAl0cC0+cmV0cmFuc19zdGFtcCA9IFRDUF9TS0JfQ0IoYnVmZiktPndoZW47CiAJc2tiX2hlYWRlcl9yZWxlYXNlKGJ1ZmYpOwotCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgYnVmZik7CisJX190Y3BfYWRkX3dyaXRlX3F1ZXVlX3RhaWwoc2ssIGJ1ZmYpOwogCXNrX2NoYXJnZV9za2Ioc2ssIGJ1ZmYpOwogCXRwLT5wYWNrZXRzX291dCArPSB0Y3Bfc2tiX3Bjb3VudChidWZmKTsKIAl0Y3BfdHJhbnNtaXRfc2tiKHNrLCBidWZmLCAxLCBHRlBfS0VSTkVMKTsKQEAgLTIzNjMsNyArMjM2OCw2IEBACiB7CiAJLyogSWYgd2UgaGF2ZSBiZWVuIHJlc2V0LCB3ZSBtYXkgbm90IHNlbmQgYWdhaW4uICovCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKLQkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJCXN0cnVjdCBza19idWZmICpidWZmOwogCiAJCS8qIFdlIGFyZSBub3QgcHV0dGluZyB0aGlzIG9uIHRoZSB3cml0ZSBxdWV1ZSwgc28KQEAgLTIzODksNyArMjM5Myw3IEBACiAJCXNrYl9zaGluZm8oYnVmZiktPmdzb190eXBlID0gMDsKIAogCQkvKiBTZW5kIGl0IG9mZiwgdGhpcyBjbGVhcnMgZGVsYXllZCBhY2tzIGZvciB1cy4gKi8KLQkJVENQX1NLQl9DQihidWZmKS0+c2VxID0gVENQX1NLQl9DQihidWZmKS0+ZW5kX3NlcSA9IHRjcF9hY2NlcHRhYmxlX3NlcShzaywgdHApOworCQlUQ1BfU0tCX0NCKGJ1ZmYpLT5zZXEgPSBUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxID0gdGNwX2FjY2VwdGFibGVfc2VxKHNrKTsKIAkJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCQl0Y3BfdHJhbnNtaXRfc2tiKHNrLCBidWZmLCAwLCBHRlBfQVRPTUlDKTsKIAl9CkBAIC0yNDQxLDcgKzI0NDUsNyBAQAogCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCQlpZiAoKHNrYiA9IHNrLT5za19zZW5kX2hlYWQpICE9IE5VTEwgJiYKKwkJaWYgKChza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKSkgIT0gTlVMTCAmJgogCQkgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+c25kX3VuYSt0cC0+c25kX3duZCkpIHsKIAkJCWludCBlcnI7CiAJCQl1bnNpZ25lZCBpbnQgbXNzID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAwKTsKQEAgLTI0NjcsNyArMjQ3MSw3IEBACiAJCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAkJCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYiwgMSwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIWVycikgewotCQkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOworCQkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHNrYik7CiAJCQl9CiAJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgewpAQCAtMjQ5MSw3ICsyNDk1LDcgQEAKIAogCWVyciA9IHRjcF93cml0ZV93YWtldXAoc2spOwogCi0JaWYgKHRwLT5wYWNrZXRzX291dCB8fCAhc2stPnNrX3NlbmRfaGVhZCkgeworCWlmICh0cC0+cGFja2V0c19vdXQgfHwgIXRjcF9zZW5kX2hlYWQoc2spKSB7CiAJCS8qIENhbmNlbCBwcm9iZSB0aW1lciwgaWYgaXQgaXMgbm90IHJlcXVpcmVkLiAqLwogCQlpY3NrLT5pY3NrX3Byb2Jlc19vdXQgPSAwOwogCQlpY3NrLT5pY3NrX2JhY2tvZmYgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3Byb2JlLmMgYi9uZXQvaXB2NC90Y3BfcHJvYmUuYwppbmRleCA2MWY0MDZmMi4uMzkzOGQ1ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3Byb2JlLmMKKysrIGIvbmV0L2lwdjQvdGNwX3Byb2JlLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC0zNCw0MyArMzYsNDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiVENQIGN3bmQgc25vb3BlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IHBvcnQgPSAwOworc3RhdGljIGludCBwb3J0IF9fcmVhZF9tb3N0bHkgPSAwOwogTU9EVUxFX1BBUk1fREVTQyhwb3J0LCAiUG9ydCB0byBtYXRjaCAoMD1hbGwpIik7CiBtb2R1bGVfcGFyYW0ocG9ydCwgaW50LCAwKTsKIAotc3RhdGljIGludCBidWZzaXplID0gNjQqMTAyNDsKK3N0YXRpYyBpbnQgYnVmc2l6ZSBfX3JlYWRfbW9zdGx5ID0gNjQqMTAyNDsKIE1PRFVMRV9QQVJNX0RFU0MoYnVmc2l6ZSwgIkxvZyBidWZmZXIgc2l6ZSAoZGVmYXVsdCA2NGspIik7CiBtb2R1bGVfcGFyYW0oYnVmc2l6ZSwgaW50LCAwKTsKIAorc3RhdGljIGludCBmdWxsIF9fcmVhZF9tb3N0bHk7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGwsICJGdWxsIGxvZyAoMT1ldmVyeSBhY2sgcGFja2V0IHJlY2VpdmVkLCAgMD1vbmx5IGN3bmQgY2hhbmdlcykiKTsKK21vZHVsZV9wYXJhbShmdWxsLCBpbnQsIDApOworCiBzdGF0aWMgY29uc3QgY2hhciBwcm9jbmFtZVtdID0gInRjcHByb2JlIjsKIAogc3RydWN0IHsKLQlzdHJ1Y3Qga2ZpZm8gICpmaWZvOwotCXNwaW5sb2NrX3QgICAgbG9jazsKKwlzdHJ1Y3Qga2ZpZm8JKmZpZm87CisJc3BpbmxvY2tfdAlsb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IHRpbWV2YWwgdHN0YXJ0OworCWt0aW1lX3QJCXN0YXJ0OworCXUzMgkJbGFzdGN3bmQ7CiB9IHRjcHc7CiAKKy8qCisgKiBQcmludCB0byBsb2cgd2l0aCB0aW1lc3RhbXBzLgorICogRklYTUU6IGNhdXNlcyBhbiBleHRyYSBjb3B5CisgKi8KIHN0YXRpYyB2b2lkIHByaW50bChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbjsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3RydWN0IHRpbWVzcGVjIHR2OwogCWNoYXIgdGJ1ZlsyNTZdOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJLyogd2FudCBtb25vdG9uaWMgdGltZSBzaW5jZSBzdGFydCBvZiB0Y3BfcHJvYmUgKi8KKwl0diA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgdGNwdy5zdGFydCkpOwogCi0Jbm93LnR2X3NlYyAtPSB0Y3B3LnRzdGFydC50dl9zZWM7Ci0Jbm93LnR2X3VzZWMgLT0gdGNwdy50c3RhcnQudHZfdXNlYzsKLQlpZiAobm93LnR2X3VzZWMgPCAwKSB7Ci0JCS0tbm93LnR2X3NlYzsKLQkJbm93LnR2X3VzZWMgKz0gMTAwMDAwMDsKLQl9Ci0KLQlsZW4gPSBzcHJpbnRmKHRidWYsICIlbHUuJTA2bHUgIiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIG5vdy50dl9zZWMsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBub3cudHZfdXNlYyk7CisJbGVuID0gc3ByaW50Zih0YnVmLCAiJWx1LiUwOWx1ICIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKSB0di50dl9zZWMsICh1bnNpZ25lZCBsb25nKSB0di50dl9uc2VjKTsKIAlsZW4gKz0gdnNjbnByaW50Zih0YnVmK2xlbiwgc2l6ZW9mKHRidWYpLWxlbiwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CiAKQEAgLTc4LDM4ICs4Miw0NCBAQAogCXdha2VfdXAoJnRjcHcud2FpdCk7CiB9CiAKLXN0YXRpYyBpbnQganRjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAotCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKKy8qCisgKiBIb29rIGluc2VydGVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCByZWNlaXZlIHBhY2tldC4KKyAqIE5vdGU6IGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRjcF9yY3ZfZXN0YWJsaXNoZWQoKSEKKyAqLworc3RhdGljIGludCBqdGNwX3Jjdl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IHRjcGhkciAqdGgsIHVuc2lnbmVkIGxlbikKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKLQlpZiAocG9ydCA9PSAwIHx8IG50b2hzKGluZXQtPmRwb3J0KSA9PSBwb3J0IHx8Ci0JICAgIG50b2hzKGluZXQtPnNwb3J0KSA9PSBwb3J0KSB7CisJLyogT25seSB1cGRhdGUgaWYgcG9ydCBtYXRjaGVzICovCisJaWYgKChwb3J0ID09IDAgfHwgbnRvaHMoaW5ldC0+ZHBvcnQpID09IHBvcnQgfHwgbnRvaHMoaW5ldC0+c3BvcnQpID09IHBvcnQpCisJICAgICYmIChmdWxsIHx8IHRwLT5zbmRfY3duZCAhPSB0Y3B3Lmxhc3Rjd25kKSkgewogCQlwcmludGwoIiVkLiVkLiVkLiVkOiV1ICVkLiVkLiVkLiVkOiV1ICVkICUjeCAlI3ggJXUgJXUgJXVcbiIsCiAJCSAgICAgICBOSVBRVUFEKGluZXQtPnNhZGRyKSwgbnRvaHMoaW5ldC0+c3BvcnQpLAogCQkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwKLQkJICAgICAgIHNpemUsIHRwLT5zbmRfbnh0LCB0cC0+c25kX3VuYSwKKwkJICAgICAgIHNrYi0+bGVuLCB0cC0+c25kX254dCwgdHAtPnNuZF91bmEsCiAJCSAgICAgICB0cC0+c25kX2N3bmQsIHRjcF9jdXJyZW50X3NzdGhyZXNoKHNrKSwKLQkJICAgICAgIHRwLT5zbmRfd25kKTsKKwkJICAgICAgIHRwLT5zbmRfd25kLCB0cC0+c3J0dCA+PiAzKTsKKwkJdGNwdy5sYXN0Y3duZCA9IHRwLT5zbmRfY3duZDsKIAl9CiAKIAlqcHJvYmVfcmV0dXJuKCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QganByb2JlIHRjcF9zZW5kX3Byb2JlID0geworc3RhdGljIHN0cnVjdCBqcHJvYmUgdGNwX3Byb2JlID0gewogCS5rcCA9IHsKLQkJLnN5bWJvbF9uYW1lCT0gInRjcF9zZW5kbXNnIiwKKwkJLnN5bWJvbF9uYW1lCT0gInRjcF9yY3ZfZXN0YWJsaXNoZWQiLAogCX0sCi0JLmVudHJ5CT0gSlBST0JFX0VOVFJZKGp0Y3Bfc2VuZG1zZyksCisJLmVudHJ5CT0gSlBST0JFX0VOVFJZKGp0Y3BfcmN2X2VzdGFibGlzaGVkKSwKIH07CiAKIAogc3RhdGljIGludCB0Y3Bwcm9iZV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCiB7CiAJa2ZpZm9fcmVzZXQodGNwdy5maWZvKTsKLQlkb19nZXR0aW1lb2ZkYXkoJnRjcHcudHN0YXJ0KTsKKwl0Y3B3LnN0YXJ0ID0ga3RpbWVfZ2V0KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2Miw3ICsxNzIsNyBAQAogCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUocHJvY25hbWUsIFNfSVJVU1IsICZ0Y3Bwcm9iZV9mb3BzKSkKIAkJZ290byBlcnIwOwogCi0JcmV0ID0gcmVnaXN0ZXJfanByb2JlKCZ0Y3Bfc2VuZF9wcm9iZSk7CisJcmV0ID0gcmVnaXN0ZXJfanByb2JlKCZ0Y3BfcHJvYmUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMTsKIApAQCAtMTgwLDcgKzE5MCw3IEBACiB7CiAJa2ZpZm9fZnJlZSh0Y3B3LmZpZm8pOwogCXByb2NfbmV0X3JlbW92ZShwcm9jbmFtZSk7Ci0JdW5yZWdpc3Rlcl9qcHJvYmUoJnRjcF9zZW5kX3Byb2JlKTsKKwl1bnJlZ2lzdGVyX2pwcm9iZSgmdGNwX3Byb2JlKTsKIAogfQogbW9kdWxlX2V4aXQodGNwcHJvYmVfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IGE5MjQzY2YuLjJjYTk3YjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgbWF4X3Byb2JlczsKIAotCWlmICh0cC0+cGFja2V0c19vdXQgfHwgIXNrLT5za19zZW5kX2hlYWQpIHsKKwlpZiAodHAtPnBhY2tldHNfb3V0IHx8ICF0Y3Bfc2VuZF9oZWFkKHNrKSkgewogCQlpY3NrLT5pY3NrX3Byb2Jlc19vdXQgPSAwOwogCQlyZXR1cm47CiAJfQpAQCAtMjg0LDcgKzI4NCw3IEBACiAJaWYgKCF0cC0+cGFja2V0c19vdXQpCiAJCWdvdG8gb3V0OwogCi0JQlVHX1RSQVAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJQlVHX1RSQVAoIXRjcF93cml0ZV9xdWV1ZV9lbXB0eShzaykpOwogCiAJaWYgKCF0cC0+c25kX3duZCAmJiAhc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpICYmCiAJICAgICEoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX1NZTl9TRU5UIHwgVENQRl9TWU5fUkVDVikpKSB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXRjcF9lbnRlcl9sb3NzKHNrLCAwKTsKLQkJdGNwX3JldHJhbnNtaXRfc2tiKHNrLCBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJCXRjcF9yZXRyYW5zbWl0X3NrYihzaywgdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spKTsKIAkJX19za19kc3RfcmVzZXQoc2spOwogCQlnb3RvIG91dF9yZXNldF90aW1lcjsKIAl9CkBAIC0zNDEsNyArMzQxLDcgQEAKIAkJdGNwX2VudGVyX2xvc3Moc2ssIDApOwogCX0KIAotCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSA+IDApIHsKKwlpZiAodGNwX3JldHJhbnNtaXRfc2tiKHNrLCB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpID4gMCkgewogCQkvKiBSZXRyYW5zbWlzc2lvbiBmYWlsZWQgYmVjYXVzZSBvZiBsb2NhbCBjb25nZXN0aW9uLAogCQkgKiBkbyBub3QgYmFja29mZi4KIAkJICovCkBAIC00ODIsNyArNDgyLDcgQEAKIAllbGFwc2VkID0ga2VlcGFsaXZlX3RpbWVfd2hlbih0cCk7CiAKIAkvKiBJdCBpcyBhbGl2ZSB3aXRob3V0IGtlZXBhbGl2ZSA4KSAqLwotCWlmICh0cC0+cGFja2V0c19vdXQgfHwgc2stPnNrX3NlbmRfaGVhZCkKKwlpZiAodHAtPnBhY2tldHNfb3V0IHx8IHRjcF9zZW5kX2hlYWQoc2spKQogCQlnb3RvIHJlc2NoZWQ7CiAKIAllbGFwc2VkID0gdGNwX3RpbWVfc3RhbXAgLSB0cC0+cmN2X3RzdGFtcDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF92ZWdhcy5jIGIvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMKaW5kZXggNWM0ODRkYy4uNzNlMTljZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMKKysrIGIvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMKQEAgLTM4LDYgKzM4LDggQEAKIAogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAorI2luY2x1ZGUgInRjcF92ZWdhcy5oIgorCiAvKiBEZWZhdWx0IHZhbHVlcyBvZiB0aGUgVmVnYXMgdmFyaWFibGVzLCBpbiBmaXhlZC1wb2ludCByZXByZXNlbnRhdGlvbgogICogd2l0aCBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCiAgKi8KQEAgLTU0LDE3ICs1Niw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGdhbW1hLCAibGltaXQgb24gaW5jcmVhc2UgKHNjYWxlIGJ5IDIpIik7CiAKIAotLyogVmVnYXMgdmFyaWFibGVzICovCi1zdHJ1Y3QgdmVnYXMgewotCXUzMgliZWdfc25kX254dDsJLyogcmlnaHQgZWRnZSBkdXJpbmcgbGFzdCBSVFQgKi8KLQl1MzIJYmVnX3NuZF91bmE7CS8qIGxlZnQgZWRnZSAgZHVyaW5nIGxhc3QgUlRUICovCi0JdTMyCWJlZ19zbmRfY3duZDsJLyogc2F2ZXMgdGhlIHNpemUgb2YgdGhlIGN3bmQgKi8KLQl1OAlkb2luZ192ZWdhc19ub3c7LyogaWYgdHJ1ZSwgZG8gdmVnYXMgZm9yIHRoaXMgUlRUICovCi0JdTE2CWNudFJUVDsJCS8qICMgb2YgUlRUcyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBSVFQgKi8KLQl1MzIJbWluUlRUOwkJLyogbWluIG9mIFJUVHMgbWVhc3VyZWQgd2l0aGluIGxhc3QgUlRUIChpbiB1c2VjKSAqLwotCXUzMgliYXNlUlRUOwkvKiB0aGUgbWluIG9mIGFsbCBWZWdhcyBSVFQgbWVhc3VyZW1lbnRzIHNlZW4gKGluIHVzZWMpICovCi19OwotCiAvKiBUaGVyZSBhcmUgc2V2ZXJhbCBzaXR1YXRpb25zIHdoZW4gd2UgbXVzdCAicmUtc3RhcnQiIFZlZ2FzOgogICoKICAqICBvIHdoZW4gYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkCkBAIC04MSw3ICs3Miw3IEBACiAgKiBJbnN0ZWFkIHdlIG11c3Qgd2FpdCB1bnRpbCB0aGUgY29tcGxldGlvbiBvZiBhbiBSVFQgZHVyaW5nCiAgKiB3aGljaCB3ZSBhY3R1YWxseSByZWNlaXZlIEFDS3MuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB2ZWdhc19lbmFibGUoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIHZvaWQgdmVnYXNfZW5hYmxlKHN0cnVjdCBzb2NrICpzaykKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgdmVnYXMgKnZlZ2FzID0gaW5ldF9jc2tfY2Eoc2spOwpAQCAtMTA0LDEzICs5NSwxNCBAQAogCXZlZ2FzLT5kb2luZ192ZWdhc19ub3cgPSAwOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdmVnYXNfaW5pdChzdHJ1Y3Qgc29jayAqc2spCit2b2lkIHRjcF92ZWdhc19pbml0KHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgdmVnYXMgKnZlZ2FzID0gaW5ldF9jc2tfY2Eoc2spOwogCiAJdmVnYXMtPmJhc2VSVFQgPSAweDdmZmZmZmZmOwogCXZlZ2FzX2VuYWJsZShzayk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfdmVnYXNfaW5pdCk7CiAKIC8qIERvIFJUVCBzYW1wbGluZyBuZWVkZWQgZm9yIFZlZ2FzLgogICogQmFzaWNhbGx5IHdlOgpAQCAtMTIwLDEwICsxMTIsMTMgQEAKICAqICAgbyBtaW4tZmlsdGVyIFJUVCBzYW1wbGVzIGZyb20gYSBtdWNoIGxvbmdlciB3aW5kb3cgKGZvcmV2ZXIgZm9yIG5vdykKICAqICAgICB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiBkZWxheSAoYmFzZVJUVCkKICAqLwotc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX3J0dF9jYWxjKHN0cnVjdCBzb2NrICpzaywgdTMyIHVzcnR0KQordm9pZCB0Y3BfdmVnYXNfcGt0c19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQsIGt0aW1lX3QgbGFzdCkKIHsKIAlzdHJ1Y3QgdmVnYXMgKnZlZ2FzID0gaW5ldF9jc2tfY2Eoc2spOwotCXUzMiB2cnR0ID0gdXNydHQgKyAxOyAvKiBOZXZlciBhbGxvdyB6ZXJvIHJ0dCBvciBiYXNlUlRUICovCisJdTMyIHZydHQ7CisKKwkvKiBOZXZlciBhbGxvdyB6ZXJvIHJ0dCBvciBiYXNlUlRUICovCisJdnJ0dCA9IGt0aW1lX3RvX3VzKG5ldF90aW1lZGVsdGEobGFzdCkpICsgMTsKIAogCS8qIEZpbHRlciB0byBmaW5kIHByb3BhZ2F0aW9uIGRlbGF5OiAqLwogCWlmICh2cnR0IDwgdmVnYXMtPmJhc2VSVFQpCkBAIC0xMzUsOCArMTMwLDkgQEAKIAl2ZWdhcy0+bWluUlRUID0gbWluKHZlZ2FzLT5taW5SVFQsIHZydHQpOwogCXZlZ2FzLT5jbnRSVFQrKzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF92ZWdhc19wa3RzX2Fja2VkKTsKIAotc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX3N0YXRlKHN0cnVjdCBzb2NrICpzaywgdTggY2Ffc3RhdGUpCit2b2lkIHRjcF92ZWdhc19zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHU4IGNhX3N0YXRlKQogewogCiAJaWYgKGNhX3N0YXRlID09IFRDUF9DQV9PcGVuKQpAQCAtMTQ0LDYgKzE0MCw3IEBACiAJZWxzZQogCQl2ZWdhc19kaXNhYmxlKHNrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF92ZWdhc19zdGF0ZSk7CiAKIC8qCiAgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBpZGxlIGFuZCB3ZSBhcmUgcmVzdGFydGluZywKQEAgLTE1NCwxMiArMTUxLDEzIEBACiAgKiBwYWNrZXRzLCBfdGhlbl8gd2UgY2FuIG1ha2UgVmVnYXMgY2FsY3VsYXRpb25zCiAgKiBhZ2Fpbi4KICAqLwotc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX2N3bmRfZXZlbnQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHRjcF9jYV9ldmVudCBldmVudCkKK3ZvaWQgdGNwX3ZlZ2FzX2N3bmRfZXZlbnQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHRjcF9jYV9ldmVudCBldmVudCkKIHsKIAlpZiAoZXZlbnQgPT0gQ0FfRVZFTlRfQ1dORF9SRVNUQVJUIHx8CiAJICAgIGV2ZW50ID09IENBX0VWRU5UX1RYX1NUQVJUKQogCQl0Y3BfdmVnYXNfaW5pdChzayk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfdmVnYXNfY3duZF9ldmVudCk7CiAKIHN0YXRpYyB2b2lkIHRjcF92ZWdhc19jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywKIAkJCQkgdTMyIHNlcV9ydHQsIHUzMiBpbl9mbGlnaHQsIGludCBmbGFnKQpAQCAtMzM2LDMwICszMzQsMjkgQEAKIH0KIAogLyogRXh0cmFjdCBpbmZvIGZvciBUY3Agc29ja2V0IGluZm8gcHJvdmlkZWQgdmlhIG5ldGxpbmsuICovCi1zdGF0aWMgdm9pZCB0Y3BfdmVnYXNfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCB1MzIgZXh0LAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHRjcF92ZWdhc19nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHUzMiBleHQsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IHZlZ2FzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKIAlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19WRUdBU0lORk8gLSAxKSkpIHsKLQkJc3RydWN0IHRjcHZlZ2FzX2luZm8gKmluZm87CisJCXN0cnVjdCB0Y3B2ZWdhc19pbmZvIGluZm8gPSB7CisJCQkudGNwdl9lbmFibGVkID0gY2EtPmRvaW5nX3ZlZ2FzX25vdywKKwkJCS50Y3B2X3J0dGNudCA9IGNhLT5jbnRSVFQsCisJCQkudGNwdl9ydHQgPSBjYS0+YmFzZVJUVCwKKwkJCS50Y3B2X21pbnJ0dCA9IGNhLT5taW5SVFQsCisJCX07CiAKLQkJaW5mbyA9IFJUQV9EQVRBKF9fUlRBX1BVVChza2IsIElORVRfRElBR19WRUdBU0lORk8sCi0JCQkJCSAgc2l6ZW9mKCppbmZvKSkpOwotCi0JCWluZm8tPnRjcHZfZW5hYmxlZCA9IGNhLT5kb2luZ192ZWdhc19ub3c7Ci0JCWluZm8tPnRjcHZfcnR0Y250ID0gY2EtPmNudFJUVDsKLQkJaW5mby0+dGNwdl9ydHQgPSBjYS0+YmFzZVJUVDsKLQkJaW5mby0+dGNwdl9taW5ydHQgPSBjYS0+bWluUlRUOwotCXJ0YXR0cl9mYWlsdXJlOgk7CisJCW5sYV9wdXQoc2tiLCBJTkVUX0RJQUdfVkVHQVNJTkZPLCBzaXplb2YoaW5mbyksICZpbmZvKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfdmVnYXNfZ2V0X2luZm8pOwogCiBzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfdmVnYXMgPSB7CisJLmZsYWdzCQk9IFRDUF9DT05HX1JUVF9TVEFNUCwKIAkuaW5pdAkJPSB0Y3BfdmVnYXNfaW5pdCwKIAkuc3N0aHJlc2gJPSB0Y3BfcmVub19zc3RocmVzaCwKIAkuY29uZ19hdm9pZAk9IHRjcF92ZWdhc19jb25nX2F2b2lkLAogCS5taW5fY3duZAk9IHRjcF9yZW5vX21pbl9jd25kLAotCS5ydHRfc2FtcGxlCT0gdGNwX3ZlZ2FzX3J0dF9jYWxjLAorCS5wa3RzX2Fja2VkCT0gdGNwX3ZlZ2FzX3BrdHNfYWNrZWQsCiAJLnNldF9zdGF0ZQk9IHRjcF92ZWdhc19zdGF0ZSwKIAkuY3duZF9ldmVudAk9IHRjcF92ZWdhc19jd25kX2V2ZW50LAogCS5nZXRfaW5mbwk9IHRjcF92ZWdhc19nZXRfaW5mbywKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF92ZWdhcy5oIGIvbmV0L2lwdjQvdGNwX3ZlZ2FzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyZmE4MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF92ZWdhcy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBUQ1AgVmVnYXMgY29uZ2VzdGlvbiBjb250cm9sIGludGVyZmFjZQorICovCisjaWZuZGVmIF9fVENQX1ZFR0FTX0gKKyNkZWZpbmUgX19UQ1BfVkVHQVNfSCAxCisKKy8qIFZlZ2FzIHZhcmlhYmxlcyAqLworc3RydWN0IHZlZ2FzIHsKKwl1MzIJYmVnX3NuZF9ueHQ7CS8qIHJpZ2h0IGVkZ2UgZHVyaW5nIGxhc3QgUlRUICovCisJdTMyCWJlZ19zbmRfdW5hOwkvKiBsZWZ0IGVkZ2UgIGR1cmluZyBsYXN0IFJUVCAqLworCXUzMgliZWdfc25kX2N3bmQ7CS8qIHNhdmVzIHRoZSBzaXplIG9mIHRoZSBjd25kICovCisJdTgJZG9pbmdfdmVnYXNfbm93Oy8qIGlmIHRydWUsIGRvIHZlZ2FzIGZvciB0aGlzIFJUVCAqLworCXUxNgljbnRSVFQ7CQkvKiAjIG9mIFJUVHMgbWVhc3VyZWQgd2l0aGluIGxhc3QgUlRUICovCisJdTMyCW1pblJUVDsJCS8qIG1pbiBvZiBSVFRzIG1lYXN1cmVkIHdpdGhpbiBsYXN0IFJUVCAoaW4gdXNlYykgKi8KKwl1MzIJYmFzZVJUVDsJLyogdGhlIG1pbiBvZiBhbGwgVmVnYXMgUlRUIG1lYXN1cmVtZW50cyBzZWVuIChpbiB1c2VjKSAqLworfTsKKworZXh0ZXJuIHZvaWQgdGNwX3ZlZ2FzX2luaXQoc3RydWN0IHNvY2sgKnNrKTsKK2V4dGVybiB2b2lkIHRjcF92ZWdhc19zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHU4IGNhX3N0YXRlKTsKK2V4dGVybiB2b2lkIHRjcF92ZWdhc19wa3RzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIGNudCwga3RpbWVfdCBsYXN0KTsKK2V4dGVybiB2b2lkIHRjcF92ZWdhc19jd25kX2V2ZW50KHN0cnVjdCBzb2NrICpzaywgZW51bSB0Y3BfY2FfZXZlbnQgZXZlbnQpOworZXh0ZXJuIHZvaWQgdGNwX3ZlZ2FzX2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyNlbmRpZgkvKiBfX1RDUF9WRUdBU19IICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdmVuby5jIGIvbmV0L2lwdjQvdGNwX3Zlbm8uYwppbmRleCBjZTU3YmYzLi45ZWRiMzQwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdmVuby5jCisrKyBiL25ldC9pcHY0L3RjcF92ZW5vLmMKQEAgLTY5LDEwICs2OSwxMyBAQAogfQogCiAvKiBEbyBydHQgc2FtcGxpbmcgbmVlZGVkIGZvciBWZW5vLiAqLwotc3RhdGljIHZvaWQgdGNwX3Zlbm9fcnR0X2NhbGMoc3RydWN0IHNvY2sgKnNrLCB1MzIgdXNydHQpCitzdGF0aWMgdm9pZCB0Y3BfdmVub19wa3RzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIGNudCwga3RpbWVfdCBsYXN0KQogewogCXN0cnVjdCB2ZW5vICp2ZW5vID0gaW5ldF9jc2tfY2Eoc2spOwotCXUzMiB2cnR0ID0gdXNydHQgKyAxOwkvKiBOZXZlciBhbGxvdyB6ZXJvIHJ0dCBvciBiYXNlcnR0ICovCisJdTMyIHZydHQ7CisKKwkvKiBOZXZlciBhbGxvdyB6ZXJvIHJ0dCBvciBiYXNlUlRUICovCisJdnJ0dCA9IGt0aW1lX3RvX3VzKG5ldF90aW1lZGVsdGEobGFzdCkpICsgMTsKIAogCS8qIEZpbHRlciB0byBmaW5kIHByb3BhZ2F0aW9uIGRlbGF5OiAqLwogCWlmICh2cnR0IDwgdmVuby0+YmFzZXJ0dCkKQEAgLTE5OSwxMCArMjAyLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF92ZW5vID0geworCS5mbGFncwkJPSBUQ1BfQ09OR19SVFRfU1RBTVAsCiAJLmluaXQJCT0gdGNwX3Zlbm9faW5pdCwKIAkuc3N0aHJlc2gJPSB0Y3BfdmVub19zc3RocmVzaCwKIAkuY29uZ19hdm9pZAk9IHRjcF92ZW5vX2NvbmdfYXZvaWQsCi0JLnJ0dF9zYW1wbGUJPSB0Y3BfdmVub19ydHRfY2FsYywKKwkucGt0c19hY2tlZAk9IHRjcF92ZW5vX3BrdHNfYWNrZWQsCiAJLnNldF9zdGF0ZQk9IHRjcF92ZW5vX3N0YXRlLAogCS5jd25kX2V2ZW50CT0gdGNwX3Zlbm9fY3duZF9ldmVudCwKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3dlc3R3b29kLmMgYi9uZXQvaXB2NC90Y3Bfd2VzdHdvb2QuYwppbmRleCA0ZTFiNjEwLi5lNjFlMDlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfd2VzdHdvb2QuYworKysgYi9uZXQvaXB2NC90Y3Bfd2VzdHdvb2QuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgKiBDYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBncm91cCBvZiBwYWNrZXRzLgogICogYnV0IGFsbCB3ZXN0d29vZCBuZWVkcyBpcyB0aGUgbGFzdCBzYW1wbGUgb2Ygc3J0dC4KICAqLwotc3RhdGljIHZvaWQgdGNwX3dlc3R3b29kX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250KQorc3RhdGljIHZvaWQgdGNwX3dlc3R3b29kX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250LCBrdGltZV90IGxhc3QpCiB7CiAJc3RydWN0IHdlc3R3b29kICp3ID0gaW5ldF9jc2tfY2Eoc2spOwogCWlmIChjbnQgPiAwKQpAQCAtMjI2LDcgKzIyNiw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHdlc3R3b29kICp3ID0gaW5ldF9jc2tfY2Eoc2spOwogCi0Jc3dpdGNoKGV2ZW50KSB7CisJc3dpdGNoIChldmVudCkgewogCWNhc2UgQ0FfRVZFTlRfRkFTVF9BQ0s6CiAJCXdlc3R3b29kX2Zhc3RfYncoc2spOwogCQlicmVhazsKQEAgLTI2MCwxNiArMjYwLDEzIEBACiB7CiAJY29uc3Qgc3RydWN0IHdlc3R3b29kICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKIAlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19WRUdBU0lORk8gLSAxKSkpIHsKLQkJc3RydWN0IHJ0YXR0ciAqcnRhOwotCQlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyAqaW5mbzsKKwkJc3RydWN0IHRjcHZlZ2FzX2luZm8gaW5mbyA9IHsKKwkJCS50Y3B2X2VuYWJsZWQgPSAxLAorCQkJLnRjcHZfcnR0ID0gamlmZmllc190b191c2VjcyhjYS0+cnR0KSwKKwkJCS50Y3B2X21pbnJ0dCA9IGppZmZpZXNfdG9fdXNlY3MoY2EtPnJ0dF9taW4pLAorCQl9OwogCi0JCXJ0YSA9IF9fUlRBX1BVVChza2IsIElORVRfRElBR19WRUdBU0lORk8sIHNpemVvZigqaW5mbykpOwotCQlpbmZvID0gUlRBX0RBVEEocnRhKTsKLQkJaW5mby0+dGNwdl9lbmFibGVkID0gMTsKLQkJaW5mby0+dGNwdl9ydHRjbnQgPSAwOwotCQlpbmZvLT50Y3B2X3J0dCA9IGppZmZpZXNfdG9fdXNlY3MoY2EtPnJ0dCk7Ci0JCWluZm8tPnRjcHZfbWlucnR0ID0gamlmZmllc190b191c2VjcyhjYS0+cnR0X21pbik7Ci0JcnRhdHRyX2ZhaWx1cmU6CTsKKwkJbmxhX3B1dChza2IsIElORVRfRElBR19WRUdBU0lORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3llYWguYyBiL25ldC9pcHY0L3RjcF95ZWFoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1ZWQyMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF95ZWFoLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKgorICogICBZZUFIIFRDUAorICoKKyAqIEZvciBmdXJ0aGVyIGRldGFpbHMgbG9vayBhdDoKKyAqICAgIGh0dHA6Ly93aWwuY3MuY2FsdGVjaC5lZHUvcGZsZG5ldDIwMDcvcGFwZXIvWWVBSF9UQ1AucGRmCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KKworI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgInRjcF92ZWdhcy5oIgorCisjZGVmaW5lIFRDUF9ZRUFIX0FMUEhBICAgICAgIDgwIC8vbGluIG51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBhdCB0aGUgYm90dGxlbmVjaworI2RlZmluZSBUQ1BfWUVBSF9HQU1NQSAgICAgICAgMSAvL2xpbiBmcmFjdGlvbiBvZiBxdWV1ZSB0byBiZSByZW1vdmVkIHBlciBydHQKKyNkZWZpbmUgVENQX1lFQUhfREVMVEEgICAgICAgIDMgLy9sb2cgbWluaW11bSBmcmFjdGlvbiBvZiBjd25kIHRvIGJlIHJlbW92ZWQgb24gbG9zcworI2RlZmluZSBUQ1BfWUVBSF9FUFNJTE9OICAgICAgMSAvL2xvZyBtYXhpbXVtIGZyYWN0aW9uIHRvIGJlIHJlbW92ZWQgb24gZWFybHkgZGVjb25nZXN0aW9uCisjZGVmaW5lIFRDUF9ZRUFIX1BIWSAgICAgICAgICA4IC8vbGluIG1heGltdW0gZGVsdGEgZnJvbSBiYXNlCisjZGVmaW5lIFRDUF9ZRUFIX1JITyAgICAgICAgIDE2IC8vbGluIG1pbnVtdW0gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHJ0dCB0byBjb25zaWRlciBjb21wZXRpdGlvbiBvbiBsb3NzCisjZGVmaW5lIFRDUF9ZRUFIX1pFVEEgICAgICAgIDUwIC8vbGluIG1pbmltdW0gbnVtYmVyIG9mIHN0YXRlIHN3aXRjaHMgdG8gcmVzZXQgcmVub19jb3VudAorCisjZGVmaW5lIFRDUF9TQ0FMQUJMRV9BSV9DTlQJIDEwMFUKKworLyogWWVBSCB2YXJpYWJsZXMgKi8KK3N0cnVjdCB5ZWFoIHsKKwlzdHJ1Y3QgdmVnYXMgdmVnYXM7CS8qIG11c3QgYmUgZmlyc3QgKi8KKworCS8qIFllQUggKi8KKwl1MzIgbGFzdFE7CisJdTMyIGRvaW5nX3Jlbm9fbm93OworCisJdTMyIHJlbm9fY291bnQ7CisJdTMyIGZhc3RfY291bnQ7CisKKwl1MzIgcGt0c19hY2tlZDsKK307CisKK3N0YXRpYyB2b2lkIHRjcF95ZWFoX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB5ZWFoICp5ZWFoID0gaW5ldF9jc2tfY2Eoc2spOworCisJdGNwX3ZlZ2FzX2luaXQoc2spOworCisJeWVhaC0+ZG9pbmdfcmVub19ub3cgPSAwOworCXllYWgtPmxhc3RRID0gMDsKKworCXllYWgtPnJlbm9fY291bnQgPSAyOworCisJLyogRW5zdXJlIHRoZSBNRCBhcml0aG1ldGljIHdvcmtzLiAgVGhpcyBpcyBzb21ld2hhdCBwZWRhbnRpYywKKwkgKiBzaW5jZSBJIGRvbid0IHRoaW5rIHdlIHdpbGwgc2VlIGEgY3duZCB0aGlzIGxhcmdlLiA6KSAqLworCXRwLT5zbmRfY3duZF9jbGFtcCA9IG1pbl90KHUzMiwgdHAtPnNuZF9jd25kX2NsYW1wLCAweGZmZmZmZmZmLzEyOCk7CisKK30KKworCitzdGF0aWMgdm9pZCB0Y3BfeWVhaF9wa3RzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIHBrdHNfYWNrZWQsIGt0aW1lX3QgbGFzdCkKK3sKKwljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CisJc3RydWN0IHllYWggKnllYWggPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbikKKwkJeWVhaC0+cGt0c19hY2tlZCA9IHBrdHNfYWNrZWQ7CisKKwl0Y3BfdmVnYXNfcGt0c19hY2tlZChzaywgcGt0c19hY2tlZCwgbGFzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF95ZWFoX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLAorCQkJCXUzMiBzZXFfcnR0LCB1MzIgaW5fZmxpZ2h0LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgeWVhaCAqeWVhaCA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaywgaW5fZmxpZ2h0KSkKKwkJcmV0dXJuOworCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQorCQl0Y3Bfc2xvd19zdGFydCh0cCk7CisKKwllbHNlIGlmICgheWVhaC0+ZG9pbmdfcmVub19ub3cpIHsKKwkJLyogU2NhbGFibGUgKi8KKworCQl0cC0+c25kX2N3bmRfY250Kz15ZWFoLT5wa3RzX2Fja2VkOworCQlpZiAodHAtPnNuZF9jd25kX2NudCA+IG1pbih0cC0+c25kX2N3bmQsIFRDUF9TQ0FMQUJMRV9BSV9DTlQpKXsKKwkJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApCisJCQkJdHAtPnNuZF9jd25kKys7CisJCQl0cC0+c25kX2N3bmRfY250ID0gMDsKKwkJfQorCisJCXllYWgtPnBrdHNfYWNrZWQgPSAxOworCisJfSBlbHNlIHsKKwkJLyogUmVubyAqLworCisJCWlmICh0cC0+c25kX2N3bmRfY250IDwgdHAtPnNuZF9jd25kKQorCQkJdHAtPnNuZF9jd25kX2NudCsrOworCisJCWlmICh0cC0+c25kX2N3bmRfY250ID49IHRwLT5zbmRfY3duZCkgeworCQkJdHAtPnNuZF9jd25kKys7CisJCQl0cC0+c25kX2N3bmRfY250ID0gMDsKKwkJfQorCX0KKworCS8qIFRoZSBrZXkgcGxheWVycyBhcmUgdl92ZWdhcy5iZWdfc25kX3VuYSBhbmQgdl9iZWdfc25kX254dC4KKwkgKgorCSAqIFRoZXNlIGFyZSBzbyBuYW1lZCBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZSBhcHByb3hpbWF0ZSB2YWx1ZXMKKwkgKiBvZiBzbmRfdW5hIGFuZCBzbmRfbnh0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgUlRULiBNb3JlCisJICogcHJlY2lzZWx5LCB0aGV5IHJlcHJlc2VudCB0aGUgYW1vdW50IG9mIGRhdGEgc2VudCBkdXJpbmcgdGhlIFJUVC4KKwkgKiBBdCB0aGUgZW5kIG9mIHRoZSBSVFQsIHdoZW4gd2UgcmVjZWl2ZSBhbiBBQ0sgZm9yIHZfYmVnX3NuZF9ueHQsCisJICogd2Ugd2lsbCBjYWxjdWxhdGUgdGhhdCAodl9iZWdfc25kX254dCAtIHZfdmVnYXMuYmVnX3NuZF91bmEpIG91dHN0YW5kaW5nCisJICogYnl0ZXMgb2YgZGF0YSBoYXZlIGJlZW4gQUNLZWQgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIFJUVCwgZ2l2aW5nCisJICogYW4gImFjdHVhbCIgcmF0ZSBvZjoKKwkgKgorCSAqICAgICAodl9iZWdfc25kX254dCAtIHZfdmVnYXMuYmVnX3NuZF91bmEpIC8gKHJ0dCBkdXJhdGlvbikKKwkgKgorCSAqIFVuZm9ydHVuYXRlbHksIHZfdmVnYXMuYmVnX3NuZF91bmEgaXMgbm90IGV4YWN0bHkgZXF1YWwgdG8gc25kX3VuYSwKKwkgKiBiZWNhdXNlIGRlbGF5ZWQgQUNLcyBjYW4gY292ZXIgbW9yZSB0aGFuIG9uZSBzZWdtZW50LCBzbyB0aGV5CisJICogZG9uJ3QgbGluZSB1cCB5ZWFobHkgd2l0aCB0aGUgYm91bmRhcmllcyBvZiBSVFRzLgorCSAqCisJICogQW5vdGhlciB1bmZvcnR1bmF0ZSBmYWN0IG9mIGxpZmUgaXMgdGhhdCBkZWxheWVkIEFDS3MgZGVsYXkgdGhlCisJICogYWR2YW5jZSBvZiB0aGUgbGVmdCBlZGdlIG9mIG91ciBzZW5kIHdpbmRvdywgc28gdGhhdCB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgd2Ugc2VuZCBpbiBhbiBSVFQgaXMgb2Z0ZW4gbGVzcyB0aGFuIG91ciBjd25kIHdpbGwgYWxsb3cuCisJICogU28gd2Uga2VlcCB0cmFjayBvZiBvdXIgY3duZCBzZXBhcmF0ZWx5LCBpbiB2X2JlZ19zbmRfY3duZC4KKwkgKi8KKworCWlmIChhZnRlcihhY2ssIHllYWgtPnZlZ2FzLmJlZ19zbmRfbnh0KSkgeworCisJCS8qIFdlIGRvIHRoZSBWZWdhcyBjYWxjdWxhdGlvbnMgb25seSBpZiB3ZSBnb3QgZW5vdWdoIFJUVAorCQkgKiBzYW1wbGVzIHRoYXQgd2UgY2FuIGJlIHJlYXNvbmFibHkgc3VyZSB0aGF0IHdlIGdvdAorCQkgKiBhdCBsZWFzdCBvbmUgUlRUIHNhbXBsZSB0aGF0IHdhc24ndCBmcm9tIGEgZGVsYXllZCBBQ0suCisJCSAqIElmIHdlIG9ubHkgaGFkIDIgc2FtcGxlcyB0b3RhbCwKKwkJICogdGhlbiB0aGF0IG1lYW5zIHdlJ3JlIGdldHRpbmcgb25seSAxIEFDSyBwZXIgUlRULCB3aGljaAorCQkgKiBtZWFucyB0aGV5J3JlIGFsbW9zdCBjZXJ0YWlubHkgZGVsYXllZCBBQ0tzLgorCQkgKiBJZiAgd2UgaGF2ZSAzIHNhbXBsZXMsIHdlIHNob3VsZCBiZSBPSy4KKwkJICovCisKKwkJaWYgKHllYWgtPnZlZ2FzLmNudFJUVCA+IDIpIHsKKwkJCXUzMiBydHQsIHF1ZXVlOworCQkJdTY0IGJ3OworCisJCQkvKiBXZSBoYXZlIGVub3VnaCBSVFQgc2FtcGxlcywgc28sIHVzaW5nIHRoZSBWZWdhcworCQkJICogYWxnb3JpdGhtLCB3ZSBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGluY3JlYXNlIG9yCisJCQkgKiBkZWNyZWFzZSBjd25kLCBhbmQgYnkgaG93IG11Y2guCisJCQkgKi8KKworCQkJLyogUGx1Y2sgb3V0IHRoZSBSVFQgd2UgYXJlIHVzaW5nIGZvciB0aGUgVmVnYXMKKwkJCSAqIGNhbGN1bGF0aW9ucy4gVGhpcyBpcyB0aGUgbWluIFJUVCBzZWVuIGR1cmluZyB0aGUKKwkJCSAqIGxhc3QgUlRULiBUYWtpbmcgdGhlIG1pbiBmaWx0ZXJzIG91dCB0aGUgZWZmZWN0cworCQkJICogb2YgZGVsYXllZCBBQ0tzLCBhdCB0aGUgY29zdCBvZiBub3RpY2luZyBjb25nZXN0aW9uCisJCQkgKiBhIGJpdCBsYXRlci4KKwkJCSAqLworCQkJcnR0ID0geWVhaC0+dmVnYXMubWluUlRUOworCisJCQkvKiBDb21wdXRlIGV4Y2VzcyBudW1iZXIgb2YgcGFja2V0cyBhYm92ZSBiYW5kd2lkdGgKKwkJCSAqIEF2b2lkIGRvaW5nIGZ1bGwgNjQgYml0IGRpdmlkZS4KKwkJCSAqLworCQkJYncgPSB0cC0+c25kX2N3bmQ7CisJCQlidyAqPSBydHQgLSB5ZWFoLT52ZWdhcy5iYXNlUlRUOworCQkJZG9fZGl2KGJ3LCBydHQpOworCQkJcXVldWUgPSBidzsKKworCQkJaWYgKHF1ZXVlID4gVENQX1lFQUhfQUxQSEEgfHwKKwkJCSAgICBydHQgLSB5ZWFoLT52ZWdhcy5iYXNlUlRUID4gKHllYWgtPnZlZ2FzLmJhc2VSVFQgLyBUQ1BfWUVBSF9QSFkpKSB7CisJCQkJaWYgKHF1ZXVlID4gVENQX1lFQUhfQUxQSEEKKwkJCQkgICAgJiYgdHAtPnNuZF9jd25kID4geWVhaC0+cmVub19jb3VudCkgeworCQkJCQl1MzIgcmVkdWN0aW9uID0gbWluKHF1ZXVlIC8gVENQX1lFQUhfR0FNTUEgLAorCQkJCQkJCSAgICB0cC0+c25kX2N3bmQgPj4gVENQX1lFQUhfRVBTSUxPTik7CisKKwkJCQkJdHAtPnNuZF9jd25kIC09IHJlZHVjdGlvbjsKKworCQkJCQl0cC0+c25kX2N3bmQgPSBtYXgodHAtPnNuZF9jd25kLAorCQkJCQkJCSAgIHllYWgtPnJlbm9fY291bnQpOworCisJCQkJCXRwLT5zbmRfc3N0aHJlc2ggPSB0cC0+c25kX2N3bmQ7CisJCQkJfQorCisJCQkJaWYgKHllYWgtPnJlbm9fY291bnQgPD0gMikKKwkJCQkJeWVhaC0+cmVub19jb3VudCA9IG1heCh0cC0+c25kX2N3bmQ+PjEsIDJVKTsKKwkJCQllbHNlCisJCQkJCXllYWgtPnJlbm9fY291bnQrKzsKKworCQkJCXllYWgtPmRvaW5nX3Jlbm9fbm93ID0gbWluKHllYWgtPmRvaW5nX3Jlbm9fbm93ICsgMSwKKwkJCQkJCQkgICAweGZmZmZmZlUpOworCQkJfSBlbHNlIHsKKwkJCQl5ZWFoLT5mYXN0X2NvdW50Kys7CisKKwkJCQlpZiAoeWVhaC0+ZmFzdF9jb3VudCA+IFRDUF9ZRUFIX1pFVEEpIHsKKwkJCQkJeWVhaC0+cmVub19jb3VudCA9IDI7CisJCQkJCXllYWgtPmZhc3RfY291bnQgPSAwOworCQkJCX0KKworCQkJCXllYWgtPmRvaW5nX3Jlbm9fbm93ID0gMDsKKwkJCX0KKworCQkJeWVhaC0+bGFzdFEgPSBxdWV1ZTsKKworCQl9CisKKwkJLyogU2F2ZSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IHdpbmRvdyBzbyB3ZSBjYW4gdXNlIHRoaXMKKwkJICogYXQgdGhlIGVuZCBvZiB0aGUgbmV4dCBSVFQuCisJCSAqLworCQl5ZWFoLT52ZWdhcy5iZWdfc25kX3VuYSAgPSB5ZWFoLT52ZWdhcy5iZWdfc25kX254dDsKKwkJeWVhaC0+dmVnYXMuYmVnX3NuZF9ueHQgID0gdHAtPnNuZF9ueHQ7CisJCXllYWgtPnZlZ2FzLmJlZ19zbmRfY3duZCA9IHRwLT5zbmRfY3duZDsKKworCQkvKiBXaXBlIHRoZSBzbGF0ZSBjbGVhbiBmb3IgdGhlIG5leHQgUlRULiAqLworCQl5ZWFoLT52ZWdhcy5jbnRSVFQgPSAwOworCQl5ZWFoLT52ZWdhcy5taW5SVFQgPSAweDdmZmZmZmZmOworCX0KK30KKworc3RhdGljIHUzMiB0Y3BfeWVhaF9zc3RocmVzaChzdHJ1Y3Qgc29jayAqc2spIHsKKwljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgeWVhaCAqeWVhaCA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgcmVkdWN0aW9uOworCisJaWYgKHllYWgtPmRvaW5nX3Jlbm9fbm93IDwgVENQX1lFQUhfUkhPKSB7CisJCXJlZHVjdGlvbiA9IHllYWgtPmxhc3RROworCisJCXJlZHVjdGlvbiA9IG1pbiggcmVkdWN0aW9uLCBtYXgodHAtPnNuZF9jd25kPj4xLCAyVSkgKTsKKworCQlyZWR1Y3Rpb24gPSBtYXgoIHJlZHVjdGlvbiwgdHAtPnNuZF9jd25kID4+IFRDUF9ZRUFIX0RFTFRBKTsKKwl9IGVsc2UKKwkJcmVkdWN0aW9uID0gbWF4KHRwLT5zbmRfY3duZD4+MSwyVSk7CisKKwl5ZWFoLT5mYXN0X2NvdW50ID0gMDsKKwl5ZWFoLT5yZW5vX2NvdW50ID0gbWF4KHllYWgtPnJlbm9fY291bnQ+PjEsIDJVKTsKKworCXJldHVybiB0cC0+c25kX2N3bmQgLSByZWR1Y3Rpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF95ZWFoID0geworCS5mbGFncwkJPSBUQ1BfQ09OR19SVFRfU1RBTVAsCisJLmluaXQJCT0gdGNwX3llYWhfaW5pdCwKKwkuc3N0aHJlc2gJPSB0Y3BfeWVhaF9zc3RocmVzaCwKKwkuY29uZ19hdm9pZAk9IHRjcF95ZWFoX2NvbmdfYXZvaWQsCisJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCisJLnNldF9zdGF0ZQk9IHRjcF92ZWdhc19zdGF0ZSwKKwkuY3duZF9ldmVudAk9IHRjcF92ZWdhc19jd25kX2V2ZW50LAorCS5nZXRfaW5mbwk9IHRjcF92ZWdhc19nZXRfaW5mbywKKwkucGt0c19hY2tlZAk9IHRjcF95ZWFoX3BrdHNfYWNrZWQsCisKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInllYWgiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGNwX3llYWhfcmVnaXN0ZXIodm9pZCkKK3sKKwlCVUdfT04oc2l6ZW9mKHN0cnVjdCB5ZWFoKSA+IElDU0tfQ0FfUFJJVl9TSVpFKTsKKwl0Y3BfcmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3BfeWVhaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0Y3BfeWVhaF91bnJlZ2lzdGVyKHZvaWQpCit7CisJdGNwX3VucmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3BfeWVhaCk7Cit9CisKK21vZHVsZV9pbml0KHRjcF95ZWFoX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHRjcF95ZWFoX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBbmdlbG8gUC4gQ2FzdGVsbGFuaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJZZUFIIFRDUCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3llYWguaCBiL25ldC9pcHY0L3RjcF95ZWFoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzYjcxOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF95ZWFoLmgKQEAgLTAsMCArMSw3IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgPG5ldC90Y3AuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggZmM2MjBhNy4uY2VjMGYyYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTE3NSw3ICsxNzUsOCBAQAogCQkJOwogCQl9CiAJCXJlc3VsdCA9IGJlc3Q7Ci0JCWZvcihpID0gMDsgaSA8ICgxIDw8IDE2KSAvIFVEUF9IVEFCTEVfU0laRTsgaSsrLCByZXN1bHQgKz0gVURQX0hUQUJMRV9TSVpFKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoMSA8PCAxNikgLyBVRFBfSFRBQkxFX1NJWkU7CisJCSAgICAgaSsrLCByZXN1bHQgKz0gVURQX0hUQUJMRV9TSVpFKSB7CiAJCQlpZiAocmVzdWx0ID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0pCiAJCQkJcmVzdWx0ID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0KIAkJCQkJKyAoKHJlc3VsdCAtIHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdKSAmCkBAIC0yMTIsMTMgKzIxMywxMyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotX19pbmxpbmVfXyBpbnQgdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKK2ludCB1ZHBfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAogCQkJaW50ICgqc2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpCiB7CiAJcmV0dXJuICBfX3VkcF9saWJfZ2V0X3BvcnQoc2ssIHNudW0sIHVkcF9oYXNoLCAmdWRwX3BvcnRfcm92ZXIsIHNjbXApOwogfQogCi1pbmxpbmUgaW50IGlwdjRfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICpzazEsIGNvbnN0IHN0cnVjdCBzb2NrICpzazIpCitpbnQgaXB2NF9yY3Zfc2FkZHJfZXF1YWwoY29uc3Qgc3RydWN0IHNvY2sgKnNrMSwgY29uc3Qgc3RydWN0IHNvY2sgKnNrMikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0MSA9IGluZXRfc2soc2sxKSwgKmluZXQyID0gaW5ldF9zayhzazIpOwogCkBAIC0yNzAsMTAgKzI3MSwxMCBAQAogCQkJCQljb250aW51ZTsKIAkJCQlzY29yZSs9MjsKIAkJCX0KLQkJCWlmKHNjb3JlID09IDkpIHsKKwkJCWlmIChzY29yZSA9PSA5KSB7CiAJCQkJcmVzdWx0ID0gc2s7CiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYoc2NvcmUgPiBiYWRuZXNzKSB7CisJCQl9IGVsc2UgaWYgKHNjb3JlID4gYmFkbmVzcykgewogCQkJCXJlc3VsdCA9IHNrOwogCQkJCWJhZG5lc3MgPSBzY29yZTsKIAkJCX0KQEAgLTMyOSw4ICszMzAsOCBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7CiAJc3RydWN0IHVkcGhkciAqdWggPSAoc3RydWN0IHVkcGhkciopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKLQlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgaGFyZGVycjsKIAlpbnQgZXJyOwpAQCAtMzkwLDcgKzM5MSw3IEBACiAJc29ja19wdXQoc2spOwogfQogCi1fX2lubGluZV9fIHZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3ZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKIHsKIAlyZXR1cm4gX191ZHA0X2xpYl9lcnIoc2tiLCBpbmZvLCB1ZHBfaGFzaCk7CiB9CkBAIC00MTksMTMgKzQyMCwxNCBAQAogCQkJCSBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBpbnQgbGVuICAgICAgKQogewogCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0Jc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJX193c3VtIGNzdW0gPSAwOwogCiAJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkgPT0gMSkgewogCQkvKgogCQkgKiBPbmx5IG9uZSBmcmFnbWVudCBvbiB0aGUgc29ja2V0LgogCQkgKi8KKwkJc2tiLT5jc3VtX3N0YXJ0ID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZDsKIAkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKIAkJdWgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNyYywgZHN0LCBsZW4sIElQUFJPVE9fVURQLCAwKTsKIAl9IGVsc2UgewpAQCAtNDM0LDcgKzQzNiw3IEBACiAJCSAqIGZyYWdtZW50cyBvbiB0aGUgc29ja2V0IHNvIHRoYXQgYWxsIGNzdW1zIG9mIHNrX2J1ZmZzCiAJCSAqIHNob3VsZCBiZSB0b2dldGhlcgogCQkgKi8KLQkJb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJb2Zmc2V0ID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCk7CiAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwpAQCAtNDY5LDcgKzQ3MSw3IEBACiAJLyoKIAkgKiBDcmVhdGUgYSBVRFAgaGVhZGVyCiAJICovCi0JdWggPSBza2ItPmgudWg7CisJdWggPSB1ZHBfaGRyKHNrYik7CiAJdWgtPnNvdXJjZSA9IGZsLT5mbF9pcF9zcG9ydDsKIAl1aC0+ZGVzdCA9IGZsLT5mbF9pcF9kcG9ydDsKIAl1aC0+bGVuID0gaHRvbnModXAtPmxlbik7CkBAIC03NjUsMzggKzc2NywzOCBAQAogCiBpbnQgdWRwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3dpdGNoKGNtZCkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ09VVFE6CiAJewotCQljYXNlIFNJT0NPVVRROgotCQl7Ci0JCQlpbnQgYW1vdW50ID0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKLQkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKLQkJfQotCi0JCWNhc2UgU0lPQ0lOUToKLQkJewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCXVuc2lnbmVkIGxvbmcgYW1vdW50OwotCi0JCQlhbW91bnQgPSAwOwotCQkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCQlpZiAoc2tiICE9IE5VTEwpIHsKLQkJCQkvKgotCQkJCSAqIFdlIHdpbGwgb25seSByZXR1cm4gdGhlIGFtb3VudAotCQkJCSAqIG9mIHRoaXMgcGFja2V0IHNpbmNlIHRoYXQgaXMgYWxsCi0JCQkJICogdGhhdCB3aWxsIGJlIHJlYWQuCi0JCQkJICovCi0JCQkJYW1vdW50ID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJaW50IGFtb3VudCA9IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKIAl9Ci0JcmV0dXJuKDApOworCisJY2FzZSBTSU9DSU5ROgorCXsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgbG9uZyBhbW91bnQ7CisKKwkJYW1vdW50ID0gMDsKKwkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogV2Ugd2lsbCBvbmx5IHJldHVybiB0aGUgYW1vdW50CisJCQkgKiBvZiB0aGlzIHBhY2tldCBzaW5jZSB0aGF0IGlzIGFsbAorCQkJICogdGhhdCB3aWxsIGJlIHJlYWQuCisJCQkgKi8KKwkJCWFtb3VudCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04MTAsNyArODEyLDkgQEAKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBjb3BpZWQsIGVyciwgY29weV9vbmx5LCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CisJdW5zaWduZWQgaW50IHVsZW4sIGNvcGllZDsKKwlpbnQgZXJyOworCWludCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CiAKIAkvKgogCSAqCUNoZWNrIGFueSBwYXNzZWQgYWRkcmVzc2VzCkBAIC04MjYsMjggKzgzMCwyNSBAQAogCWlmICghc2tiKQogCQlnb3RvIG91dDsKIAotCWNvcGllZCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlmIChjb3BpZWQgPiBsZW4pIHsKLQkJY29waWVkID0gbGVuOworCXVsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwljb3BpZWQgPSBsZW47CisJaWYgKGNvcGllZCA+IHVsZW4pCisJCWNvcGllZCA9IHVsZW47CisJZWxzZSBpZiAoY29waWVkIDwgdWxlbikKIAkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOwotCX0KIAogCS8qCi0JICogCURlY2lkZSB3aGV0aGVyIHRvIGNoZWNrc3VtIGFuZC9vciBjb3B5IGRhdGEuCi0JICoKLQkgKiAJVURQOiAgICAgIGNoZWNrc3VtIG1heSBoYXZlIGJlZW4gY29tcHV0ZWQgaW4gSFcsCi0JICogCSAgICAgICAgICAocmUtKWNvbXB1dGUgaXQgaWYgbWVzc2FnZSBpcyB0cnVuY2F0ZWQuCi0JICogCVVEUC1MaXRlOiBhbHdheXMgbmVlZHMgdG8gY2hlY2tzdW0sIG5vIEhXIHN1cHBvcnQuCisJICogSWYgY2hlY2tzdW0gaXMgbmVlZGVkIGF0IGFsbCwgdHJ5IHRvIGRvIGl0IHdoaWxlIGNvcHlpbmcgdGhlCisJICogZGF0YS4gIElmIHRoZSBkYXRhIGlzIHRydW5jYXRlZCwgb3IgaWYgd2Ugb25seSB3YW50IGEgcGFydGlhbAorCSAqIGNvdmVyYWdlIGNoZWNrc3VtIChVRFAtTGl0ZSksIGRvIGl0IGJlZm9yZSB0aGUgY29weS4KIAkgKi8KLQljb3B5X29ubHkgPSAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKTsKIAotCWlmIChpc191ZHBsaXRlICB8fCAgKCFjb3B5X29ubHkgICYmICBtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpKSB7Ci0JCWlmIChfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwlpZiAoY29waWVkIDwgdWxlbiB8fCBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCQlnb3RvIGNzdW1fY29weV9lcnI7Ci0JCWNvcHlfb25seSA9IDE7CiAJfQogCi0JaWYgKGNvcHlfb25seSkKKwlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCiAJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29waWVkICAgICAgICk7CiAJZWxzZSB7CkBAIC04NjYsOCArODY3LDggQEAKIAlpZiAoc2luKQogCXsKIAkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLT5zaW5fcG9ydCA9IHNrYi0+aC51aC0+c291cmNlOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJc2luLT5zaW5fcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJfQogCWlmIChpbmV0LT5jbXNnX2ZsYWdzKQpAQCAtODc1LDcgKzg3Niw3IEBACiAKIAllcnIgPSBjb3BpZWQ7CiAJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQotCQllcnIgPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJZXJyID0gdWxlbjsKIAogb3V0X2ZyZWU6CiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CkBAIC05NDksNyArOTUwLDcgQEAKIAkJcmV0dXJuIDE7CiAKIAkvKiBOb3cgd2UgY2FuIGdldCB0aGUgcG9pbnRlcnMgKi8KLQl1aCA9IHNrYi0+aC51aDsKKwl1aCA9IHVkcF9oZHIoc2tiKTsKIAl1ZHBkYXRhID0gKF9fdTggKil1aCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAl1ZHBkYXRhMzIgPSAoX19iZTMyICopdWRwZGF0YTsKIApAQCAtOTU5LDcgKzk2MCw3IEBACiAJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBrZWVwYWxpdmUgcGFja2V0LiAgSWYgc28sIGVhdCBpdC4gKi8KIAkJaWYgKGxlbiA9PSAxICYmIHVkcGRhdGFbMF0gPT0gMHhmZikgewogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAobGVuID4gc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSAmJiB1ZHBkYXRhMzJbMF0gIT0gMCApIHsKKwkJfSBlbHNlIGlmIChsZW4gPiBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICYmIHVkcGRhdGEzMlswXSAhPSAwKSB7CiAJCQkvKiBFU1AgUGFja2V0IHdpdGhvdXQgTm9uLUVTUCBoZWFkZXIgKi8KIAkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAkJfSBlbHNlCkBAIC05OTAsNyArOTkxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBOb3cgd2UgY2FuIHVwZGF0ZSBhbmQgdmVyaWZ5IHRoZSBwYWNrZXQgbGVuZ3RoLi4uICovCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaXBobGVuID0gaXBoLT5paGwgPDwgMjsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pIC0gbGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBpcGhsZW4gKyBsZW4pIHsKQEAgLTEwMDIsNyArMTAwMyw4IEBACiAJICogdHJhbnNwb3J0IGhlYWRlciB0byBwb2ludCB0byBFU1AuICBLZWVwIFVEUCBvbiB0aGUgc3RhY2sKIAkgKiBmb3IgbGF0ZXIuCiAJICovCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdWxsKHNrYiwgbGVuKTsKKwlfX3NrYl9wdWxsKHNrYiwgbGVuKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJLyogbW9kaWZ5IHRoZSBwcm90b2NvbCAoaXQncyBFU1AhKSAqLwogCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0VTUDsKQEAgLTEwOTUsMTAgKzEwOTcsOSBAQAogCQl9CiAJfQogCi0JaWYgKHNrLT5za19maWx0ZXIgJiYgc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChzay0+c2tfZmlsdGVyKSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCQlnb3RvIGRyb3A7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCiAJaWYgKChyYyA9IHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpKSA8IDApIHsKQEAgLTExNDMsMTAgKzExNDQsMTAgQEAKIAogCQkJc2tuZXh0ID0gdWRwX3Y0X21jYXN0X25leHQoc2tfbmV4dChzayksIHVoLT5kZXN0LCBkYWRkciwKIAkJCQkJCSAgIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwotCQkJaWYoc2tuZXh0KQorCQkJaWYgKHNrbmV4dCkKIAkJCQlza2IxID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAKLQkJCWlmKHNrYjEpIHsKKwkJCWlmIChza2IxKSB7CiAJCQkJaW50IHJldCA9IHVkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IxKTsKIAkJCQlpZiAocmV0ID4gMCkKIAkJCQkJLyogd2Ugc2hvdWxkIHByb2JhYmx5IHJlLXByb2Nlc3MgaW5zdGVhZApAQCAtMTE1NCw3ICsxMTU1LDcgQEAKIAkJCQkJa2ZyZWVfc2tiKHNrYjEpOwogCQkJfQogCQkJc2sgPSBza25leHQ7Ci0JCX0gd2hpbGUoc2tuZXh0KTsKKwkJfSB3aGlsZSAoc2tuZXh0KTsKIAl9IGVsc2UKIAkJa2ZyZWVfc2tiKHNrYik7CiAJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOwpAQCAtMTE2NiwyNSArMTE2NywzNyBAQAogICogT3RoZXJ3aXNlLCBjc3VtIGNvbXBsZXRpb24gcmVxdWlyZXMgY2hhY2tzdW1taW5nIHBhY2tldCBib2R5LAogICogaW5jbHVkaW5nIHVkcCBoZWFkZXIgYW5kIGZvbGRpbmcgaXQgdG8gc2tiLT5jc3VtLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdWRwNF9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCitzdGF0aWMgaW5saW5lIGludCB1ZHA0X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCQkgaW50IHByb3RvKQogeworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOworCWludCBlcnI7CisKKwlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwlVRFBfU0tCX0NCKHNrYiktPmNzY292ID0gc2tiLT5sZW47CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKSB7CisJCWVyciA9IHVkcGxpdGVfY2hlY2tzdW1faW5pdChza2IsIHVoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWYgKHVoLT5jaGVjayA9PSAwKSB7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCSAgICAgICBpZiAoIWNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtICAgICAgICkpCisJICAgICAgIGlmICghY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgc2tiLT5sZW4sCisJCQkJICAgICAgcHJvdG8sIHNrYi0+Y3N1bSkpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KLQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCSAgICAgICBza2ItPmxlbiwgSVBQUk9UT19VRFAsIDApOworCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKKwkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCSAgICAgICBza2ItPmxlbiwgcHJvdG8sIDApOwogCS8qIFByb2JhYmx5LCB3ZSBzaG91bGQgY2hlY2tzdW0gdWRwIGhlYWRlciAoaXQgc2hvdWxkIGJlIGluIGNhY2hlCiAJICogaW4gYW55IGNhc2UpIGFuZCBkYXRhIGluIHRpbnkgcGFja2V0cyAoPCByeCBjb3B5YnJlYWspLgogCSAqLwogCi0JLyogVURQID0gVURQLUxpdGUgd2l0aCBhIG5vbi1wYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlICovCi0JVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMTkyLDE0ICsxMjA1LDE0IEBACiAgKi8KIAogaW50IF9fdWRwNF9saWJfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10sCi0JCSAgIGludCBpc191ZHBsaXRlKQorCQkgICBpbnQgcHJvdG8pCiB7CiAJc3RydWN0IHNvY2sgKnNrOwotCXN0cnVjdCB1ZHBoZHIgKnVoID0gc2tiLT5oLnVoOworCXN0cnVjdCB1ZHBoZHIgKnVoID0gdWRwX2hkcihza2IpOwogCXVuc2lnbmVkIHNob3J0IHVsZW47CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7Ci0JX19iZTMyIHNhZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOwotCV9fYmUzMiBkYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwlfX2JlMzIgc2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CisJX19iZTMyIGRhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCiAJLyoKIAkgKiAgVmFsaWRhdGUgdGhlIHBhY2tldC4KQEAgLTEyMTEsMjAgKzEyMjQsMTcgQEAKIAlpZiAodWxlbiA+IHNrYi0+bGVuKQogCQlnb3RvIHNob3J0X3BhY2tldDsKIAotCWlmKCEgaXNfdWRwbGl0ZSApIHsJCS8qIFVEUCB2YWxpZGF0ZXMgdWxlbi4gKi8KLQorCWlmIChwcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkvKiBVRFAgdmFsaWRhdGVzIHVsZW4uICovCiAJCWlmICh1bGVuIDwgc2l6ZW9mKCp1aCkgfHwgcHNrYl90cmltX3Jjc3VtKHNrYiwgdWxlbikpCiAJCQlnb3RvIHNob3J0X3BhY2tldDsKLQkJdWggPSBza2ItPmgudWg7Ci0KLQkJdWRwNF9jc3VtX2luaXQoc2tiLCB1aCk7Ci0KLQl9IGVsc2UgCXsJCQkvKiBVRFAtTGl0ZSB2YWxpZGF0ZXMgY3Njb3YuICovCi0JCWlmICh1ZHBsaXRlNF9jc3VtX2luaXQoc2tiLCB1aCkpCi0JCQlnb3RvIGNzdW1fZXJyb3I7CisJCXVoID0gdWRwX2hkcihza2IpOwogCX0KIAotCWlmKHJ0LT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVHxSVENGX01VTFRJQ0FTVCkpCisJaWYgKHVkcDRfY3N1bV9pbml0KHNrYiwgdWgsIHByb3RvKSkKKwkJZ290byBjc3VtX2Vycm9yOworCisJaWYgKHJ0LT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVHxSVENGX01VTFRJQ0FTVCkpCiAJCXJldHVybiBfX3VkcDRfbGliX21jYXN0X2RlbGl2ZXIoc2tiLCB1aCwgc2FkZHIsIGRhZGRyLCB1ZHB0YWJsZSk7CiAKIAlzayA9IF9fdWRwNF9saWJfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLCBkYWRkciwgdWgtPmRlc3QsCkBAIC0xMjUwLDcgKzEyNjAsNyBAQAogCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCWdvdG8gY3N1bV9lcnJvcjsKIAotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTLCBpc191ZHBsaXRlKTsKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfTk9QT1JUUywgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKTsKIAlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9QT1JUX1VOUkVBQ0gsIDApOwogCiAJLyoKQEAgLTEyNTgsMTEgKzEyNjgsMTEgQEAKIAkgKiBkb24ndCB3YW5uYSBsaXN0ZW4uICBJZ25vcmUgaXQuCiAJICovCiAJa2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogCiBzaG9ydF9wYWNrZXQ6CiAJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVURQJXM6IHNob3J0IHBhY2tldDogRnJvbSAldS4ldS4ldS4ldToldSAlZC8lZCB0byAldS4ldS4ldS4ldToldVxuIiwKLQkJICAgICAgIGlzX3VkcGxpdGU/ICItTGl0ZSIgOiAiIiwKKwkJICAgICAgIHByb3RvID09IElQUFJPVE9fVURQTElURSA/ICItTGl0ZSIgOiAiIiwKIAkJICAgICAgIE5JUFFVQUQoc2FkZHIpLAogCQkgICAgICAgbnRvaHModWgtPnNvdXJjZSksCiAJCSAgICAgICB1bGVuLApAQCAtMTI3NywyMSArMTI4NywyMSBAQAogCSAqIHRoZSBuZXR3b3JrIGlzIGNvbmNlcm5lZCwgYW55d2F5KSBhcyBwZXIgNC4xLjMuNCAoTVVTVCkuCiAJICovCiAJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVURQJXM6IGJhZCBjaGVja3N1bS4gRnJvbSAlZC4lZC4lZC4lZDolZCB0byAlZC4lZC4lZC4lZDolZCB1bGVuICVkXG4iLAotCQkgICAgICAgaXNfdWRwbGl0ZT8gIi1MaXRlIiA6ICIiLAorCQkgICAgICAgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFID8gIi1MaXRlIiA6ICIiLAogCQkgICAgICAgTklQUVVBRChzYWRkciksCiAJCSAgICAgICBudG9ocyh1aC0+c291cmNlKSwKIAkJICAgICAgIE5JUFFVQUQoZGFkZHIpLAogCQkgICAgICAgbnRvaHModWgtPmRlc3QpLAogCQkgICAgICAgdWxlbik7CiBkcm9wOgotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CisJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTLCBwcm90byA9PSBJUFBST1RPX1VEUExJVEUpOwogCWtmcmVlX3NrYihza2IpOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAotX19pbmxpbmVfXyBpbnQgdWRwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gX191ZHA0X2xpYl9yY3Yoc2tiLCB1ZHBfaGFzaCwgMCk7CisJcmV0dXJuIF9fdWRwNF9saWJfcmN2KHNrYiwgdWRwX2hhc2gsIElQUFJPVE9fVURQKTsKIH0KIAogaW50IHVkcF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQpAQCAtMTMxMywxMyArMTMyMywxMyBAQAogCWludCB2YWw7CiAJaW50IGVyciA9IDA7CiAKLQlpZihvcHRsZW48c2l6ZW9mKGludCkpCisJaWYgKG9wdGxlbjxzaXplb2YoaW50KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0Jc3dpdGNoKG9wdG5hbWUpIHsKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIFVEUF9DT1JLOgogCQlpZiAodmFsICE9IDApIHsKIAkJCXVwLT5jb3JrZmxhZyA9IDE7CkBAIC0xMzczLDcgKzEzODMsNyBAQAogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTQwNCwxNSArMTQxNCwxNSBAQAogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwogCWludCB2YWwsIGxlbjsKIAotCWlmKGdldF91c2VyKGxlbixvcHRsZW4pKQorCWlmIChnZXRfdXNlcihsZW4sb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGludCkpOwogCi0JaWYobGVuIDwgMCkKKwlpZiAobGVuIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2gob3B0bmFtZSkgeworCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgVURQX0NPUks6CiAJCXZhbCA9IHVwLT5jb3JrZmxhZzsKIAkJYnJlYWs7CkBAIC0xNDMzLDExICsxNDQzLDExIEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX07CisJfQogCi0JaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsbGVuKSkKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnZhbCxsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0ODYsMTUgKzE0OTYsMTEgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCQlzcGluX2xvY2tfYmgoJnJjdnEtPmxvY2spOwotCQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKHJjdnEpKSAhPSBOVUxMKSB7Ci0JCQlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7Ci0JCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTLCBpc19saXRlKTsKLQkJCQlfX3NrYl91bmxpbmsoc2tiLCByY3ZxKTsKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJCQlicmVhazsKLQkJCX0KKwkJd2hpbGUgKChza2IgPSBza2JfcGVlayhyY3ZxKSkgIT0gTlVMTCAmJgorCQkgICAgICAgdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CisJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX2xpdGUpOworCQkJX19za2JfdW5saW5rKHNrYiwgcmN2cSk7CisJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQogCQlzcGluX3VubG9ja19iaCgmcmN2cS0+bG9jayk7CiAKQEAgLTE1NzMsNyArMTU3OSw3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gdWRwX2dldF9maXJzdChzZXEpOwogCiAJaWYgKHNrKQotCQl3aGlsZShwb3MgJiYgKHNrID0gdWRwX2dldF9uZXh0KHNlcSwgc2spKSAhPSBOVUxMKQorCQl3aGlsZSAocG9zICYmIChzayA9IHVkcF9nZXRfbmV4dChzZXEsIHNrKSkgIT0gTlVMTCkKIAkJCS0tcG9zOwogCXJldHVybiBwb3MgPyBOVUxMIDogc2s7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBsaXRlLmMgYi9uZXQvaXB2NC91ZHBsaXRlLmMKaW5kZXggYjI4ZmUxZS4uZjM0ZmQ2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY0L3VkcGxpdGUuYwpAQCAtMzEsNyArMzEsNyBAQAogCiBzdGF0aWMgaW50IHVkcGxpdGVfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIF9fdWRwNF9saWJfcmN2KHNrYiwgdWRwbGl0ZV9oYXNoLCAxKTsKKwlyZXR1cm4gX191ZHA0X2xpYl9yY3Yoc2tiLCB1ZHBsaXRlX2hhc2gsIElQUFJPVE9fVURQTElURSk7CiB9CiAKIHN0YXRpYyB2b2lkIHVkcGxpdGVfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfaW5wdXQuYyBiL25ldC9pcHY0L3hmcm00X2lucHV0LmMKaW5kZXggNzhlODBkZS4uNWNlY2E5NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfaW5wdXQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCkBAIC0yOCw3ICsyOCw3IEBACiAJc3dpdGNoIChuZXh0aGRyKSB7CiAJY2FzZSBJUFBST1RPX0lQSVA6CiAJY2FzZSBJUFBST1RPX0lQVjY6Ci0JCSpzcGkgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCSpzcGkgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJCSpzZXEgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zOSw5ICszOSw5IEBACiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgogc3RhdGljIGlubGluZSBpbnQgeGZybTRfcmN2X2VuY2FwX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0KIAlpZiAoc2tiLT5kc3QgPT0gTlVMTCkgeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCiAJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLAogCQkJCSAgIHNrYi0+ZGV2KSkKIAkJCWdvdG8gZHJvcDsKQEAgLTU1LDE4ICs1NSwxOCBAQAogCiBpbnQgeGZybTRfcmN2X2VuY2FwKHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGVuY2FwX3R5cGUpCiB7Ci0JaW50IGVycjsKIAlfX2JlMzIgc3BpLCBzZXE7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm1fdmVjW1hGUk1fTUFYX0RFUFRIXTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAlpbnQgeGZybV9uciA9IDA7CiAJaW50IGRlY2FwcyA9IDA7CisJaW50IGVyciA9IHhmcm00X3BhcnNlX3NwaShza2IsIGlwX2hkcihza2IpLT5wcm90b2NvbCwgJnNwaSwgJnNlcSk7CiAKLQlpZiAoKGVyciA9IHhmcm00X3BhcnNlX3NwaShza2IsIHNrYi0+bmguaXBoLT5wcm90b2NvbCwgJnNwaSwgJnNlcSkpICE9IDApCisJaWYgKGVyciAhPSAwKQogCQlnb3RvIGRyb3A7CiAKIAlkbyB7Ci0JCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAkJaWYgKHhmcm1fbnIgPT0gWEZSTV9NQVhfREVQVEgpCiAJCQlnb3RvIGRyb3A7CkBAIC0xMTMsNyArMTEzLDggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKChlcnIgPSB4ZnJtX3BhcnNlX3NwaShza2IsIHNrYi0+bmguaXBoLT5wcm90b2NvbCwgJnNwaSwgJnNlcSkpIDwgMCkKKwkJZXJyID0geGZybV9wYXJzZV9zcGkoc2tiLCBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsICZzcGksICZzZXEpOworCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gZHJvcDsKIAl9IHdoaWxlICghZXJyKTsKIApAQCAtMTQ2LDE1ICsxNDcsMTUgQEAKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwotCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwkJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKKwkJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCiAJCU5GX0hPT0soUEZfSU5FVCwgTkZfSVBfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCiAJCQl4ZnJtNF9yY3ZfZW5jYXBfZmluaXNoKTsKIAkJcmV0dXJuIDA7CiAjZWxzZQotCQlyZXR1cm4gLXNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwkJcmV0dXJuIC1pcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X21vZGVfYmVldC5jIGIvbmV0L2lwdjQveGZybTRfbW9kZV9iZWV0LmMKaW5kZXggZDQxOWUxNS4uYTczZTcxMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfbW9kZV9iZWV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfbW9kZV9iZWV0LmMKQEAgLTI5LDIwICsyOSwyMSBAQAogICovCiBzdGF0aWMgaW50IHhmcm00X2JlZXRfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoLCAqdG9wX2lwaCA9IE5VTEw7CisJc3RydWN0IGlwaGRyICppcGgsICp0b3BfaXBoOwogCWludCBoZHJsZW4sIG9wdGxlbjsKIAotCWlwaCA9IHNrYi0+bmguaXBoOwotCXNrYi0+aC5pcGlwaCA9IGlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCiAJaGRybGVuID0gMDsKIAlvcHRsZW4gPSBpcGgtPmlobCAqIDQgLSBzaXplb2YoKmlwaCk7CiAJaWYgKHVubGlrZWx5KG9wdGxlbikpCiAJCWhkcmxlbiArPSBJUFY0X0JFRVRfUEhNQVhMRU4gLSAob3B0bGVuICYgNCk7CiAKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbiArIGhkcmxlbik7Ci0JdG9wX2lwaCA9IHNrYi0+bmguaXBoOwotCXNrYi0+aC5yYXcgKz0gc2l6ZW9mKCppcGgpIC0gaGRybGVuOworCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbiAtIElQVjRfQkVFVF9QSE1BWExFTiArIGhkcmxlbik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9wX2lwaCA9IGlwX2hkcihza2IpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSBzaXplb2YoKmlwaCkgLSBoZHJsZW47CiAKIAltZW1tb3ZlKHRvcF9pcGgsIGlwaCwgc2l6ZW9mKCppcGgpKTsKIAlpZiAodW5saWtlbHkob3B0bGVuKSkgewpAQCAtNTAsNyArNTEsNyBAQAogCiAJCUJVR19PTihvcHRsZW4gPCAwKTsKIAotCQlwaCA9IChzdHJ1Y3QgaXBfYmVldF9waGRyICopc2tiLT5oLnJhdzsKKwkJcGggPSAoc3RydWN0IGlwX2JlZXRfcGhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXBoLT5wYWRsZW4gPSA0IC0gKG9wdGxlbiAmIDQpOwogCQlwaC0+aGRybGVuID0gb3B0bGVuIC8gODsKIAkJcGgtPm5leHRoZHIgPSB0b3BfaXBoLT5wcm90b2NvbDsKQEAgLTY5LDIwICs3MCwxOCBAQAogCiBzdGF0aWMgaW50IHhmcm00X2JlZXRfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCWludCBwaGxlbiA9IDA7CiAJaW50IG9wdGxlbiA9IDA7Ci0JX191OCBwaF9uZXh0aGRyID0gMCwgcHJvdG9jb2wgPSAwOworCXU4IHBoX25leHRoZHIgPSAwOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0JcHJvdG9jb2wgPSBpcGgtPnByb3RvY29sOwotCiAJaWYgKHVubGlrZWx5KGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19CRUVUUEgpKSB7CiAJCXN0cnVjdCBpcF9iZWV0X3BoZHIgKnBoOwogCiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqcGgpKSkKIAkJCWdvdG8gb3V0OwotCQlwaCA9IChzdHJ1Y3QgaXBfYmVldF9waGRyICopKHNrYi0+aC5pcGlwaCArIDEpOworCQlwaCA9IChzdHJ1Y3QgaXBfYmVldF9waGRyICopKGlwaXBfaGRyKHNrYikgKyAxKTsKIAogCQlwaGxlbiA9IHNpemVvZigqcGgpICsgcGgtPnBhZGxlbjsKIAkJb3B0bGVuID0gcGgtPmhkcmxlbiAqIDggKyAoSVBWNF9CRUVUX1BITUFYTEVOIC0gcGhsZW4pOwpAQCAtOTYsMjIgKzk1LDIwIEBACiAJCXBoX25leHRoZHIgPSBwaC0+bmV4dGhkcjsKIAl9CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YSArIChwaGxlbiAtIHNpemVvZigqaXBoKSk7Ci0JbWVtbW92ZShza2ItPm5oLnJhdywgaXBoLCBzaXplb2YoKmlwaCkpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyAocGhsZW4gKyBvcHRsZW4pOwotCXNrYi0+ZGF0YSA9IHNrYi0+aC5yYXc7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHBobGVuIC0gc2l6ZW9mKCppcGgpKTsKKwltZW1tb3ZlKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpcGgsIHNpemVvZigqaXBoKSk7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgcGhsZW4gKyBvcHRsZW4pOworCXNrYi0+ZGF0YSA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpcGgtPmlobCA9IChzaXplb2YoKmlwaCkgKyBvcHRsZW4pIC8gNDsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGlwaC0+aWhsICogNCk7CiAJaXBoLT5kYWRkciA9IHgtPnNlbC5kYWRkci5hNDsKIAlpcGgtPnNhZGRyID0geC0+c2VsLnNhZGRyLmE0OwogCWlmIChwaF9uZXh0aGRyKQogCQlpcGgtPnByb3RvY29sID0gcGhfbmV4dGhkcjsKLQllbHNlCi0JCWlwaC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKIAlpcGgtPmNoZWNrID0gMDsKLQlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKHNrYi0+bmgucmF3LCBpcGgtPmlobCk7CisJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bShza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaXBoLT5paGwpOwogCWVyciA9IDA7CiBvdXQ6CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X21vZGVfdHJhbnNwb3J0LmMgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3RyYW5zcG9ydC5jCmluZGV4IDkyNjc2YjcuLjYwMTA0NzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X21vZGVfdHJhbnNwb3J0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfbW9kZV90cmFuc3BvcnQuYwpAQCAtMjMsMTYgKzIzLDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgeGZybTRfdHJhbnNwb3J0X291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlpbnQgaWhsOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJaW50IGlobCA9IGlwaC0+aWhsICogNDsKIAotCWlwaCA9IHNrYi0+bmguaXBoOwotCXNrYi0+aC5pcGlwaCA9IGlwaDsKLQotCWlobCA9IGlwaC0+aWhsICogNDsKLQlza2ItPmgucmF3ICs9IGlobDsKLQotCXNrYi0+bmgucmF3ID0gbWVtbW92ZShza2JfcHVzaChza2IsIHgtPnByb3BzLmhlYWRlcl9sZW4pLCBpcGgsIGlobCk7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlciArIGlobDsKKwlza2JfcHVzaChza2IsIHgtPnByb3BzLmhlYWRlcl9sZW4pOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCW1lbW1vdmUoc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIGlwaCwgaWhsKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYsMTIgKzQzLDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgeGZybTRfdHJhbnNwb3J0X2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBpaGwgPSBza2ItPmRhdGEgLSBza2ItPmgucmF3OworCWludCBpaGwgPSBza2ItPmRhdGEgLSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCi0JaWYgKHNrYi0+aC5yYXcgIT0gc2tiLT5uaC5yYXcpCi0JCXNrYi0+bmgucmF3ID0gbWVtbW92ZShza2ItPmgucmF3LCBza2ItPm5oLnJhdywgaWhsKTsKLQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuICsgaWhsKTsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWlmIChza2ItPnRyYW5zcG9ydF9oZWFkZXIgIT0gc2tiLT5uZXR3b3JrX2hlYWRlcikgeworCQltZW1tb3ZlKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQlza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaWhsKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKKwl9CisJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGlobCk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKaW5kZXggY2ViNDM3Ni4uYTJmMmU2YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYworKysgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCkBAIC0xNiw4ICsxNiw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcGlwX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqb3V0ZXJfaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IGlwaGRyICppbm5lcl9pcGggPSBza2ItPmguaXBpcGg7CisJc3RydWN0IGlwaGRyICpvdXRlcl9pcGggPSBpcF9oZHIoc2tiKTsKKwlzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaCA9IGlwaXBfaGRyKHNrYik7CiAKIAlpZiAoSU5FVF9FQ05faXNfY2Uob3V0ZXJfaXBoLT50b3MpKQogCQlJUF9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CkBAIC0yNiw3ICsyNiw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcGhkciAqaXBoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChJTkVUX0VDTl9pc19jZShpcGgtPnRvcykpCi0JCUlQNl9FQ05fc2V0X2NlKHNrYi0+bmguaXB2NmgpOworCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIH0KIAogLyogQWRkIGVuY2Fwc3VsYXRpb24gaGVhZGVyLgpAQCAtNDYsMTEgKzQ2LDEyIEBACiAJc3RydWN0IGlwaGRyICppcGgsICp0b3BfaXBoOwogCWludCBmbGFnczsKIAotCWlwaCA9IHNrYi0+bmguaXBoOwotCXNrYi0+aC5pcGlwaCA9IGlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCi0Jc2tiLT5uaC5yYXcgPSBza2JfcHVzaChza2IsIHgtPnByb3BzLmhlYWRlcl9sZW4pOwotCXRvcF9pcGggPSBza2ItPm5oLmlwaDsKKwlza2JfcHVzaChza2IsIHgtPnByb3BzLmhlYWRlcl9sZW4pOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXRvcF9pcGggPSBpcF9oZHIoc2tiKTsKIAogCXRvcF9pcGgtPmlobCA9IDU7CiAJdG9wX2lwaC0+dmVyc2lvbiA9IDQ7CkBAIC05MCwxMCArOTEsMTEgQEAKIAogc3RhdGljIGludCB4ZnJtNF90dW5uZWxfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9tYWM7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlzd2l0Y2goaXBoLT5wcm90b2NvbCl7CisJc3dpdGNoIChpcGgtPnByb3RvY29sKXsKIAkJY2FzZSBJUFBST1RPX0lQSVA6CiAJCQlicmVhazsKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCkBAIC0xMTEsMTAgKzExMywxMCBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lQSVApIHsKIAkJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQotCQkJaXB2NF9jb3B5X2RzY3AoaXBoLCBza2ItPmguaXBpcGgpOworCQkJaXB2NF9jb3B5X2RzY3AoaXBoLCBpcGlwX2hkcihza2IpKTsKIAkJaWYgKCEoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKSkKIAkJCWlwaXBfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CiAJfQpAQCAtMTI1LDkgKzEyNywxMCBAQAogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJfQogI2VuZGlmCi0Jc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCi0JCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCW9sZF9tYWMgPSBza2JfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1za2ItPm1hY19sZW4pOworCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSwgb2xkX21hYywgc2tiLT5tYWNfbGVuKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAllcnIgPSAwOwogCiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYyBiL25ldC9pcHY0L3hmcm00X291dHB1dC5jCmluZGV4IDAzOGNhMTYuLjQ0ZWYyMDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jCisrKyBiL25ldC9pcHY0L3hmcm00X291dHB1dC5jCkBAIC0yMiwxNCArMjIsMTMgQEAKIHsKIAlpbnQgbXR1LCByZXQgPSAwOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwogCiAJaWYgKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9YRlJNX1RVTk5FTF9TSVpFKQogCQlnb3RvIG91dDsKIAogCUlQQ0Ioc2tiKS0+ZmxhZ3MgfD0gSVBTS0JfWEZSTV9UVU5ORUxfU0laRTsKIAotCWlmICghKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpIHx8IHNrYi0+bG9jYWxfZGYpCisJaWYgKCEoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSB8fCBza2ItPmxvY2FsX2RmKQogCQlnb3RvIG91dDsKIAogCWRzdCA9IHNrYi0+ZHN0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCA1ZDUxYTJhLi40ZmY4ZWQzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAKIAkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgewogCQkJdW5zaWduZWQgc2hvcnQgZW5jYXBfZmFtaWx5ID0geGZybVtpXS0+cHJvcHMuZmFtaWx5OwotCQkJc3dpdGNoKGVuY2FwX2ZhbWlseSkgeworCQkJc3dpdGNoIChlbmNhcF9mYW1pbHkpIHsKIAkJCWNhc2UgQUZfSU5FVDoKIAkJCQlmbF90dW5uZWwuZmw0X2RzdCA9IHhmcm1baV0tPmlkLmRhZGRyLmE0OwogCQkJCWZsX3R1bm5lbC5mbDRfc3JjID0geGZybVtpXS0+cHJvcHMuc2FkZHIuYTQ7CkBAIC0yMDksOCArMjA5LDggQEAKIHN0YXRpYyB2b2lkCiBfZGVjb2RlX3Nlc3Npb240KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQl1OCAqeHBydGggPSBza2ItPm5oLnJhdyArIGlwaC0+aWhsKjQ7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwl1OCAqeHBydGggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIGlwaC0+aWhsICogNDsKIAogCW1lbXNldChmbCwgMCwgc2l6ZW9mKHN0cnVjdCBmbG93aSkpOwogCWlmICghKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpKSB7CkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJZGVmYXVsdDoKIAkJCWZsLT5mbF9pcHNlY19zcGkgPSAwOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAl9CiAJZmwtPnByb3RvID0gaXBoLT5wcm90b2NvbDsKIAlmbC0+Zmw0X2RzdCA9IGlwaC0+ZGFkZHI7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCmluZGV4IDNlZWYwNjQuLjU2ODUxMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCkBAIC0xMiw5ICsxMiw4IEBACiAKIHN0YXRpYyBpbnQgaXBpcF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAotCWlwaCA9IHNrYi0+bmguaXBoOwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L0tjb25maWcgYi9uZXQvaXB2Ni9LY29uZmlnCmluZGV4IDc5NjgyZWYuLjhlNWQ1NGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L0tjb25maWcKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtNTcsNiArNTcsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQVjZfT1BUSU1JU1RJQ19EQUQKKwlib29sICJJUHY2OiBFbmFibGUgUkZDIDQ0MjkgT3B0aW1pc3RpYyBEQUQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJUFY2ICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG9wdGltaXN0aWMgRHVwbGljYXRlCisJICBBZGRyZXNzIERldGVjdGlvbi4gIEl0IGFsbG93cyBmb3IgYXV0b2NvbmZpZ3VyZWQgYWRkcmVzc2VzCisJICB0byBiZSB1c2VkIG1vcmUgcXVpY2tseS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElORVQ2X0FICiAJdHJpc3RhdGUgIklQdjY6IEFIIHRyYW5zZm9ybWF0aW9uIgogCWRlcGVuZHMgb24gSVBWNgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvTWFrZWZpbGUgYi9uZXQvaXB2Ni9NYWtlZmlsZQppbmRleCBkNDYwMDE3Li5iYjMzMzA5MDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L01ha2VmaWxlCisrKyBiL25ldC9pcHY2L01ha2VmaWxlCkBAIC03LDE0ICs3LDE1IEBACiBpcHY2LW9ianMgOj0JYWZfaW5ldDYubyBhbnljYXN0Lm8gaXA2X291dHB1dC5vIGlwNl9pbnB1dC5vIGFkZHJjb25mLm8gXAogCQlyb3V0ZS5vIGlwNl9maWIubyBpcHY2X3NvY2tnbHVlLm8gbmRpc2MubyB1ZHAubyB1ZHBsaXRlLm8gXAogCQlyYXcubyBwcm90b2NvbC5vIGljbXAubyBtY2FzdC5vIHJlYXNzZW1ibHkubyB0Y3BfaXB2Ni5vIFwKLQkJZXh0aGRycy5vIHN5c2N0bF9uZXRfaXB2Ni5vIGRhdGFncmFtLm8gcHJvYy5vIFwKLQkJaXA2X2Zsb3dsYWJlbC5vIGlwdjZfc3ltcy5vIGluZXQ2X2Nvbm5lY3Rpb25fc29jay5vCisJCWV4dGhkcnMubyBzeXNjdGxfbmV0X2lwdjYubyBkYXRhZ3JhbS5vIFwKKwkJaXA2X2Zsb3dsYWJlbC5vIGluZXQ2X2Nvbm5lY3Rpb25fc29jay5vCiAKIGlwdjYtJChDT05GSUdfWEZSTSkgKz0geGZybTZfcG9saWN5Lm8geGZybTZfc3RhdGUubyB4ZnJtNl9pbnB1dC5vIFwKIAl4ZnJtNl9vdXRwdXQubwogaXB2Ni0kKENPTkZJR19ORVRGSUxURVIpICs9IG5ldGZpbHRlci5vCiBpcHY2LSQoQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTKSArPSBmaWI2X3J1bGVzLm8KIGlwdjYtJChDT05GSUdfSVBWNl9NSVA2KSArPSBtaXA2Lm8KK2lwdjYtJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiAKIGlwdjYtb2JqcyArPSAkKGlwdjYteSkKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggNDUyYTgyYy4uZTA0ZTQ5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC04MSw2ICs4MSw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0yMDgsOSArMjA5LDcgQEAKIH07CiAKIC8qIElQdjYgV2lsZGNhcmQgQWRkcmVzcyBhbmQgTG9vcGJhY2sgQWRkcmVzcyBkZWZpbmVkIGJ5IFJGQzI1NTMgKi8KLSNpZiAwCiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9hbnkgPSBJTjZBRERSX0FOWV9JTklUOwotI2VuZGlmCiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9sb29wYmFjayA9IElONkFERFJfTE9PUEJBQ0tfSU5JVDsKIAogc3RhdGljIHZvaWQgYWRkcmNvbmZfZGVsX3RpbWVyKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKQEAgLTI0Niw2ICsyNDUsMzcgQEAKIAlhZGRfdGltZXIoJmlmcC0+dGltZXIpOwogfQogCitzdGF0aWMgaW50IHNubXA2X2FsbG9jX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCWludCBlcnIgPSAtRU5PTUVNOworCisJaWYgKCFpZGV2IHx8ICFpZGV2LT5kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2NiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwkJZ290byBlcnJfaXA7CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2LAorCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nl9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKKwkJZ290byBlcnJfaWNtcDsKKworCXJldHVybiAwOworCitlcnJfaWNtcDoKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOworZXJyX2lwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc25tcDZfZnJlZV9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Nik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2KTsKKwlyZXR1cm4gMDsKK30KKwogLyogTm9ib2R5IHJlZmVycyB0byB0aGlzIGRldmljZSwgd2UgbWF5IGRlc3Ryb3kgaXQuICovCiAKIHN0YXRpYyB2b2lkIGluNl9kZXZfZmluaXNoX2Rlc3Ryb3lfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKQEAgLTI3MSw2ICszMDEsOCBAQAogCWNhbGxfcmN1KCZpZGV2LT5yY3UsIGluNl9kZXZfZmluaXNoX2Rlc3Ryb3lfcmN1KTsKIH0KIAorRVhQT1JUX1NZTUJPTChpbjZfZGV2X2ZpbmlzaF9kZXN0cm95KTsKKwogc3RhdGljIHN0cnVjdCBpbmV0Nl9kZXYgKiBpcHY2X2FkZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICpuZGV2OwpAQCAtNTI4LDYgKzU2MCwxNiBAQAogCiAJaWZhLT5ydCA9IHJ0OwogCisJLyoKKwkgKiBwYXJ0IG9uZSBvZiBSRkMgNDQyOSwgc2VjdGlvbiAzLjMKKwkgKiBXZSBzaG91bGQgbm90IGNvbmZpZ3VyZSBhbiBhZGRyZXNzIGFzCisJICogb3B0aW1pc3RpYyBpZiB3ZSBkbyBub3QgeWV0IGtub3cgdGhlIGxpbmsKKwkgKiBsYXllciBhZGRyZXNzIG9mIG91ciBuZXhob3Agcm91dGVyCisJICovCisKKwlpZiAocnQtPnJ0NmlfbmV4dGhvcCA9PSBOVUxMKQorCQlpZmEtPmZsYWdzICY9IH5JRkFfRl9PUFRJTUlTVElDOworCiAJaWZhLT5pZGV2ID0gaWRldjsKIAlpbjZfZGV2X2hvbGQoaWRldik7CiAJLyogRm9yIGNhbGxlciAqLwpAQCAtNzA0LDYgKzc0Niw3IEBACiAJaW50IHRtcF9wbGVuOwogCWludCByZXQgPSAwOwogCWludCBtYXhfYWRkcmVzc2VzOworCXUzMiBhZGRyX2ZsYWdzOwogCiAJd3JpdGVfbG9jaygmaWRldi0+bG9jayk7CiAJaWYgKGlmdCkgewpAQCAtNzYxLDEwICs4MDQsMTcgQEAKIAlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CisKKwlhZGRyX2ZsYWdzID0gSUZBX0ZfVEVNUE9SQVJZOworCS8qIHNldCBpbiBhZGRyY29uZl9wcmVmaXhfcmN2KCkgKi8KKwlpZiAoaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpCisJCWFkZHJfZmxhZ3MgfD0gSUZBX0ZfT1BUSU1JU1RJQzsKKwogCWlmdCA9ICFtYXhfYWRkcmVzc2VzIHx8CiAJICAgICAgaXB2Nl9jb3VudF9hZGRyZXNzZXMoaWRldikgPCBtYXhfYWRkcmVzc2VzID8KIAkJaXB2Nl9hZGRfYWRkcihpZGV2LCAmYWRkciwgdG1wX3BsZW4sCi0JCQkgICAgICBpcHY2X2FkZHJfdHlwZSgmYWRkcikmSVBWNl9BRERSX1NDT1BFX01BU0ssIElGQV9GX1RFTVBPUkFSWSkgOiBOVUxMOworCQkJICAgICAgaXB2Nl9hZGRyX3R5cGUoJmFkZHIpJklQVjZfQUREUl9TQ09QRV9NQVNLLAorCQkJICAgICAgYWRkcl9mbGFncykgOiBOVUxMOwogCWlmICghaWZ0IHx8IElTX0VSUihpZnQpKSB7CiAJCWluNl9pZmFfcHV0KGlmcCk7CiAJCWluNl9kZXZfcHV0KGlkZXYpOwpAQCAtODk2LDEzICs5NDYsMTQgQEAKIAkJCSAqIC0gVGVudGF0aXZlIEFkZHJlc3MgKFJGQzI0NjIgc2VjdGlvbiA1LjQpCiAJCQkgKiAgLSBBIHRlbnRhdGl2ZSBhZGRyZXNzIGlzIG5vdCBjb25zaWRlcmVkCiAJCQkgKiAgICAiYXNzaWduZWQgdG8gYW4gaW50ZXJmYWNlIiBpbiB0aGUgdHJhZGl0aW9uYWwKLQkJCSAqICAgIHNlbnNlLgorCQkJICogICAgc2Vuc2UsIHVubGVzcyBpdCBpcyBhbHNvIGZsYWdnZWQgYXMgb3B0aW1pc3RpYy4KIAkJCSAqIC0gQ2FuZGlkYXRlIFNvdXJjZSBBZGRyZXNzIChzZWN0aW9uIDQpCiAJCQkgKiAgLSBJbiBhbnkgY2FzZSwgYW55Y2FzdCBhZGRyZXNzZXMsIG11bHRpY2FzdAogCQkJICogICAgYWRkcmVzc2VzLCBhbmQgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgTVVTVAogCQkJICogICAgTk9UIGJlIGluY2x1ZGVkIGluIGEgY2FuZGlkYXRlIHNldC4KIAkJCSAqLwotCQkJaWYgKGlmYS0+ZmxhZ3MgJiBJRkFfRl9URU5UQVRJVkUpCisJCQlpZiAoKGlmYS0+ZmxhZ3MgJiBJRkFfRl9URU5UQVRJVkUpICYmCisJCQkgICAgKCEoaWZhLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICh1bmxpa2VseShzY29yZS5hZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSB8fAogCQkJCSAgICAgc2NvcmUuYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpIHsKQEAgLTk2MSwxNSArMTAxMiwxNyBAQAogCQkJCX0KIAkJCX0KIAotCQkJLyogUnVsZSAzOiBBdm9pZCBkZXByZWNhdGVkIGFkZHJlc3MgKi8KKwkJCS8qIFJ1bGUgMzogQXZvaWQgZGVwcmVjYXRlZCBhbmQgb3B0aW1pc3RpYyBhZGRyZXNzZXMgKi8KIAkJCWlmIChoaXNjb3JlLnJ1bGUgPCAzKSB7CiAJCQkJaWYgKGlwdjZfc2FkZHJfcHJlZmVycmVkKGhpc2NvcmUuYWRkcl90eXBlKSB8fAotCQkJCSAgICAhKGlmYV9yZXN1bHQtPmZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCkpCisJCQkJICAgKCgoaWZhX3Jlc3VsdC0+ZmxhZ3MgJgorCQkJCSAgICAoSUZBX0ZfREVQUkVDQVRFRHxJRkFfRl9PUFRJTUlTVElDKSkgPT0gMCkpKQogCQkJCQloaXNjb3JlLmF0dHJzIHw9IElQVjZfU0FERFJfU0NPUkVfUFJFRkVSUkVEOwogCQkJCWhpc2NvcmUucnVsZSsrOwogCQkJfQogCQkJaWYgKGlwdjZfc2FkZHJfcHJlZmVycmVkKHNjb3JlLmFkZHJfdHlwZSkgfHwKLQkJCSAgICAhKGlmYS0+ZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEKSkgeworCQkJICAgKCgoaWZhX3Jlc3VsdC0+ZmxhZ3MgJgorCQkJICAgIChJRkFfRl9ERVBSRUNBVEVEfElGQV9GX09QVElNSVNUSUMpKSA9PSAwKSkpIHsKIAkJCQlzY29yZS5hdHRycyB8PSBJUFY2X1NBRERSX1NDT1JFX1BSRUZFUlJFRDsKIAkJCQlpZiAoIShoaXNjb3JlLmF0dHJzICYgSVBWNl9TQUREUl9TQ09SRV9QUkVGRVJSRUQpKSB7CiAJCQkJCXNjb3JlLnJ1bGUgPSAzOwpAQCAtMTEwNyw4ICsxMTYwLDEwIEBACiAJcmV0dXJuIGlwdjZfZGV2X2dldF9zYWRkcihkc3QgPyBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2IDogTlVMTCwgZGFkZHIsIHNhZGRyKTsKIH0KIAorRVhQT1JUX1NZTUJPTChpcHY2X2dldF9zYWRkcik7CiAKLWludCBpcHY2X2dldF9sbGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoraW50IGlwdjZfZ2V0X2xsYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCSAgICB1bnNpZ25lZCBjaGFyIGJhbm5lZF9mbGFncykKIHsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwogCWludCBlcnIgPSAtRUFERFJOT1RBVkFJTDsKQEAgLTExMTksNyArMTE3NCw3IEBACiAKIAkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAkJZm9yIChpZnA9aWRldi0+YWRkcl9saXN0OyBpZnA7IGlmcD1pZnAtPmlmX25leHQpIHsKLQkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CisJCQlpZiAoaWZwLT5zY29wZSA9PSBJRkFfTElOSyAmJiAhKGlmcC0+ZmxhZ3MgJiBiYW5uZWRfZmxhZ3MpKSB7CiAJCQkJaXB2Nl9hZGRyX2NvcHkoYWRkciwgJmlmcC0+YWRkcik7CiAJCQkJZXJyID0gMDsKIAkJCQlicmVhazsKQEAgLTExNjEsNiArMTIxNiw4IEBACiAJcmV0dXJuIGlmcCAhPSBOVUxMOwogfQogCitFWFBPUlRfU1lNQk9MKGlwdjZfY2hrX2FkZHIpOworCiBzdGF0aWMKIGludCBpcHY2X2Noa19zYW1lX2FkZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTY2OSw2ICsxNzI2LDEzIEBACiAKIAkJaWYgKGlmcCA9PSBOVUxMICYmIHZhbGlkX2xmdCkgewogCQkJaW50IG1heF9hZGRyZXNzZXMgPSBpbjZfZGV2LT5jbmYubWF4X2FkZHJlc3NlczsKKwkJCXUzMiBhZGRyX2ZsYWdzID0gMDsKKworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJCQlpZiAoaW42X2Rldi0+Y25mLm9wdGltaXN0aWNfZGFkICYmCisJCQkgICAgIWlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nKQorCQkJCWFkZHJfZmxhZ3MgPSBJRkFfRl9PUFRJTUlTVElDOworI2VuZGlmCiAKIAkJCS8qIERvIG5vdCBhbGxvdyB0byBjcmVhdGUgdG9vIG11Y2ggb2YgYXV0b2NvbmZpZ3VyZWQKIAkJCSAqIGFkZHJlc3NlczsgdGhpcyB3b3VsZCBiZSB0b28gZWFzeSB3YXkgdG8gY3Jhc2gga2VybmVsLgpAQCAtMTY3Niw3ICsxNzQwLDggQEAKIAkJCWlmICghbWF4X2FkZHJlc3NlcyB8fAogCQkJICAgIGlwdjZfY291bnRfYWRkcmVzc2VzKGluNl9kZXYpIDwgbWF4X2FkZHJlc3NlcykKIAkJCQlpZnAgPSBpcHY2X2FkZF9hZGRyKGluNl9kZXYsICZhZGRyLCBwaW5mby0+cHJlZml4X2xlbiwKLQkJCQkJCSAgICBhZGRyX3R5cGUmSVBWNl9BRERSX1NDT1BFX01BU0ssIDApOworCQkJCQkJICAgIGFkZHJfdHlwZSZJUFY2X0FERFJfU0NPUEVfTUFTSywKKwkJCQkJCSAgICBhZGRyX2ZsYWdzKTsKIAogCQkJaWYgKCFpZnAgfHwgSVNfRVJSKGlmcCkpIHsKIAkJCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKQEAgLTE4ODQsNiArMTk0OSwxMSBAQAogCiAJCWFkZHJjb25mX3ByZWZpeF9yb3V0ZSgmaWZwLT5hZGRyLCBpZnAtPnByZWZpeF9sZW4sIGRldiwKIAkJCQkgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodmFsaWRfbGZ0ICogSFopLCBmbGFncyk7CisJCS8qCisJCSAqIE5vdGUgdGhhdCBzZWN0aW9uIDMuMSBvZiBSRkMgNDQyOSBpbmRpY2F0ZXMKKwkJICogdGhhdCB0aGUgT3B0aW1pc3RpYyBmbGFnIHNob3VsZCBub3QgYmUgc2V0IGZvcgorCQkgKiBtYW51YWxseSBjb25maWd1cmVkIGFkZHJlc3NlcworCQkgKi8KIAkJYWRkcmNvbmZfZGFkX3N0YXJ0KGlmcCwgMCk7CiAJCWluNl9pZmFfcHV0KGlmcCk7CiAJCWFkZHJjb25mX3ZlcmlmeSgwKTsKQEAgLTIwNjAsOCArMjEzMCwxNiBAQAogc3RhdGljIHZvaWQgYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCiB7CiAJc3RydWN0IGluZXQ2X2lmYWRkciAqIGlmcDsKKwl1MzIgYWRkcl9mbGFncyA9IElGQV9GX1BFUk1BTkVOVDsKIAotCWlmcCA9IGlwdjZfYWRkX2FkZHIoaWRldiwgYWRkciwgNjQsIElGQV9MSU5LLCBJRkFfRl9QRVJNQU5FTlQpOworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJaWYgKGlkZXYtPmNuZi5vcHRpbWlzdGljX2RhZCAmJgorCSAgICAhaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcpCisJCWFkZHJfZmxhZ3MgfD0gSUZBX0ZfT1BUSU1JU1RJQzsKKyNlbmRpZgorCisKKwlpZnAgPSBpcHY2X2FkZF9hZGRyKGlkZXYsIGFkZHIsIDY0LCBJRkFfTElOSywgYWRkcl9mbGFncyk7CiAJaWYgKCFJU19FUlIoaWZwKSkgewogCQlhZGRyY29uZl9wcmVmaXhfcm91dGUoJmlmcC0+YWRkciwgaWZwLT5wcmVmaXhfbGVuLCBpZGV2LT5kZXYsIDAsIDApOwogCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwLCAwKTsKQEAgLTIxMjksNyArMjIwNyw3IEBACiB7CiAJc3RydWN0IGluNl9hZGRyIGxsYWRkcjsKIAotCWlmICghaXB2Nl9nZXRfbGxhZGRyKGxpbmtfZGV2LCAmbGxhZGRyKSkgeworCWlmICghaXB2Nl9nZXRfbGxhZGRyKGxpbmtfZGV2LCAmbGxhZGRyLCBJRkFfRl9URU5UQVRJVkUpKSB7CiAJCWFkZHJjb25mX2FkZF9saW5rbG9jYWwoaWRldiwgJmxsYWRkcik7CiAJCXJldHVybiAwOwogCX0KQEAgLTIyNDAsNyArMjMxOCw3IEBACiAJCWRlZmF1bHQ6CiAJCQlhZGRyY29uZl9kZXZfY29uZmlnKGRldik7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCQlpZiAoaWRldikgewogCQkJaWYgKHJ1bl9wZW5kaW5nKQogCQkJCWFkZHJjb25mX2RhZF9ydW4oaWRldik7CkBAIC0yMjkzLDcgKzIzNzEsNyBAQAogCQl9CiAjZW5kaWYKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gTk9USUZZX09LOwogfQpAQCAtMjQ3NCw3ICsyNTUyLDExIEBACiAJdW5zaWduZWQgbG9uZyByYW5kX251bTsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaWZwLT5pZGV2OwogCi0JcmFuZF9udW0gPSBuZXRfcmFuZG9tKCkgJSAoaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2RlbGF5ID8gOiAxKTsKKwlpZiAoaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpCisJCXJhbmRfbnVtID0gMDsKKwllbHNlCisJCXJhbmRfbnVtID0gbmV0X3JhbmRvbSgpICUgKGlkZXYtPmNuZi5ydHJfc29saWNpdF9kZWxheSA/IDogMSk7CisKIAlpZnAtPnByb2JlcyA9IGlkZXYtPmNuZi5kYWRfdHJhbnNtaXRzOwogCWFkZHJjb25mX21vZF90aW1lcihpZnAsIEFDX0RBRCwgcmFuZF9udW0pOwogfQpAQCAtMjQ5Niw3ICsyNTc4LDcgQEAKIAlpZiAoZGV2LT5mbGFncyYoSUZGX05PQVJQfElGRl9MT09QQkFDSykgfHwKIAkgICAgIShpZnAtPmZsYWdzJklGQV9GX1RFTlRBVElWRSkgfHwKIAkgICAgaWZwLT5mbGFncyAmIElGQV9GX05PREFEKSB7Ci0JCWlmcC0+ZmxhZ3MgJj0gfklGQV9GX1RFTlRBVElWRTsKKwkJaWZwLT5mbGFncyAmPSB+KElGQV9GX1RFTlRBVElWRXxJRkFfRl9PUFRJTUlTVElDKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIApAQCAtMjUxNiw2ICsyNTk4LDE0IEBACiAJCWFkZHJjb25mX2RhZF9zdG9wKGlmcCk7CiAJCXJldHVybjsKIAl9CisKKwkvKgorCSAqIE9wdGltaXN0aWMgbm9kZXMgY2FuIHN0YXJ0IHJlY2VpdmluZworCSAqIEZyYW1lcyByaWdodCBhd2F5CisJICovCisJaWYoaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpCisJCWlwNl9pbnNfcnQoaWZwLT5ydCk7CisKIAlhZGRyY29uZl9kYWRfa2ljayhpZnApOwogCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOwogb3V0OgpAQCAtMjU0MCw3ICsyNjMwLDcgQEAKIAkJICogREFEIHdhcyBzdWNjZXNzZnVsCiAJCSAqLwogCi0JCWlmcC0+ZmxhZ3MgJj0gfklGQV9GX1RFTlRBVElWRTsKKwkJaWZwLT5mbGFncyAmPSB+KElGQV9GX1RFTlRBVElWRXxJRkFfRl9PUFRJTUlTVElDKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIApAQCAtMzE2NCw3ICszMjU0LDYgQEAKIAogCXNfaWR4ID0gY2ItPmFyZ3NbMF07CiAJc19pcF9pZHggPSBpcF9pZHggPSBjYi0+YXJnc1sxXTsKLQlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCiAJZm9yIChkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CiAJCWlmIChpZHggPCBzX2lkeCkKQEAgLTMyMjYsNyArMzMxNSw2IEBACiAJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAkJaW42X2Rldl9wdXQoaWRldik7CiAJfQotCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAljYi0+YXJnc1swXSA9IGlkeDsKIAljYi0+YXJnc1sxXSA9IGlwX2lkeDsKIAlyZXR1cm4gc2tiLT5sZW47CkBAIC0zMzU5LDYgKzM0NDcsOSBAQAogI2VuZGlmCiAJYXJyYXlbREVWQ09ORl9QUk9YWV9ORFBdID0gY25mLT5wcm94eV9uZHA7CiAJYXJyYXlbREVWQ09ORl9BQ0NFUFRfU09VUkNFX1JPVVRFXSA9IGNuZi0+YWNjZXB0X3NvdXJjZV9yb3V0ZTsKKyNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAorCWFycmF5W0RFVkNPTkZfT1BUSU1JU1RJQ19EQURdID0gY25mLT5vcHRpbWlzdGljX2RhZDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHNpemVfdCBpbmV0Nl9pZl9ubG1zZ19zaXplKHZvaWQpCkBAIC0zMzcyLDE0ICszNDYzLDQ0IEBACiAJCQlubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX0lORVQ2X0ZMQUdTICovCiAJCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV9jYWNoZWluZm8pKQogCQkJKyBubGFfdG90YWxfc2l6ZShERVZDT05GX01BWCAqIDQpIC8qIElGTEFfSU5FVDZfQ09ORiAqLworCQkJKyBubGFfdG90YWxfc2l6ZShJUFNUQVRTX01JQl9NQVggKiA4KSAvKiBJRkxBX0lORVQ2X1NUQVRTICovCisJCQkrIG5sYV90b3RhbF9zaXplKElDTVA2X01JQl9NQVggKiA4KSAvKiBJRkxBX0lORVQ2X0lDTVA2U1RBVFMgKi8KIAkJICk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NubXA2X2ZpbGxfc3RhdHModTY0ICpzdGF0cywgdm9pZCAqKm1pYiwgaW50IGl0ZW1zLAorCQkJCSAgICAgIGludCBieXRlcykKK3sKKwlpbnQgaTsKKwlpbnQgcGFkID0gYnl0ZXMgLSBzaXplb2YodTY0KSAqIGl0ZW1zOworCUJVR19PTihwYWQgPCAwKTsKKworCS8qIFVzZSBwdXRfdW5hbGlnbmVkKCkgYmVjYXVzZSBzdGF0cyBtYXkgbm90IGJlIGFsaWduZWQgZm9yIHU2NC4gKi8KKwlwdXRfdW5hbGlnbmVkKGl0ZW1zLCAmc3RhdHNbMF0pOworCWZvciAoaSA9IDE7IGkgPCBpdGVtczsgaSsrKQorCQlwdXRfdW5hbGlnbmVkKHNubXBfZm9sZF9maWVsZChtaWIsIGkpLCAmc3RhdHNbaV0pOworCisJbWVtc2V0KCZzdGF0c1tpdGVtc10sIDAsIHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNubXA2X2ZpbGxfc3RhdHModTY0ICpzdGF0cywgc3RydWN0IGluZXQ2X2RldiAqaWRldiwgaW50IGF0dHJ0eXBlLAorCQkJICAgICBpbnQgYnl0ZXMpCit7CisJc3dpdGNoKGF0dHJ0eXBlKSB7CisJY2FzZSBJRkxBX0lORVQ2X1NUQVRTOgorCQlfX3NubXA2X2ZpbGxfc3RhdHMoc3RhdHMsICh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYsIElQU1RBVFNfTUlCX01BWCwgYnl0ZXMpOworCQlicmVhazsKKwljYXNlIElGTEFfSU5FVDZfSUNNUDZTVEFUUzoKKwkJX19zbm1wNl9maWxsX3N0YXRzKHN0YXRzLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIElDTVA2X01JQl9NQVgsIGJ5dGVzKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW50IGluZXQ2X2ZpbGxfaWZpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsCiAJCQkgICAgIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZGV2LT5kZXY7Ci0Jc3RydWN0IG5sYXR0ciAqY29uZjsKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJc3RydWN0IGlmaW5mb21zZyAqaGRyOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXZvaWQgKnByb3RvaW5mbzsKQEAgLTM0MTksMTIgKzM1NDAsMjIgQEAKIAljaS5yZXRyYW5zX3RpbWUgPSBpZGV2LT5uZF9wYXJtcy0+cmV0cmFuc190aW1lOwogCU5MQV9QVVQoc2tiLCBJRkxBX0lORVQ2X0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKIAotCWNvbmYgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfQ09ORiwgREVWQ09ORl9NQVggKiBzaXplb2YoczMyKSk7Ci0JaWYgKGNvbmYgPT0gTlVMTCkKKwlubGEgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfQ09ORiwgREVWQ09ORl9NQVggKiBzaXplb2YoczMyKSk7CisJaWYgKG5sYSA9PSBOVUxMKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpcHY2X3N0b3JlX2RldmNvbmYoJmlkZXYtPmNuZiwgbmxhX2RhdGEoY29uZiksIG5sYV9sZW4oY29uZikpOworCWlwdjZfc3RvcmVfZGV2Y29uZigmaWRldi0+Y25mLCBubGFfZGF0YShubGEpLCBubGFfbGVuKG5sYSkpOwogCi0JLyogWFhYIC0gU3RhdGlzdGljcy9NQyBub3QgaW1wbGVtZW50ZWQgKi8KKwkvKiBYWFggLSBNQyBub3QgaW1wbGVtZW50ZWQgKi8KKworCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9TVEFUUywgSVBTVEFUU19NSUJfTUFYICogc2l6ZW9mKHU2NCkpOworCWlmIChubGEgPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJc25tcDZfZmlsbF9zdGF0cyhubGFfZGF0YShubGEpLCBpZGV2LCBJRkxBX0lORVQ2X1NUQVRTLCBubGFfbGVuKG5sYSkpOworCisJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBJRkxBX0lORVQ2X0lDTVA2U1RBVFMsIElDTVA2X01JQl9NQVggKiBzaXplb2YodTY0KSk7CisJaWYgKG5sYSA9PSBOVUxMKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlzbm1wNl9maWxsX3N0YXRzKG5sYV9kYXRhKG5sYSksIGlkZXYsIElGTEFfSU5FVDZfSUNNUDZTVEFUUywgbmxhX2xlbihubGEpKTsKIAogCW5sYV9uZXN0X2VuZChza2IsIHByb3RvaW5mbyk7CiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CkBAIC0zNTUwLDMwICszNjgxLDIwIEBACiAJCXJ0bmxfc2V0X3NrX2VycihSVE5MR1JQX0lQVjZfUFJFRklYLCBlcnIpOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmV0bGlua19saW5rIGluZXQ2X3J0bmV0bGlua190YWJsZVtSVE1fTlJfTVNHVFlQRVNdID0gewotCVtSVE1fR0VUTElOSyAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGluZXQ2X2R1bXBfaWZpbmZvLCB9LAotCVtSVE1fTkVXQUREUiAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fbmV3YWRkciwgfSwKLQlbUlRNX0RFTEFERFIgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX2RlbGFkZHIsIH0sCi0JW1JUTV9HRVRBRERSIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGluZXQ2X3J0bV9nZXRhZGRyLAotCQkJCSAgICAgLmR1bXBpdAk9IGluZXQ2X2R1bXBfaWZhZGRyLCB9LAotCVtSVE1fR0VUTVVMVElDQVNUIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gaW5ldDZfZHVtcF9pZm1jYWRkciwgfSwKLQlbUlRNX0dFVEFOWUNBU1QgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQJPSBpbmV0Nl9kdW1wX2lmYWNhZGRyLCB9LAotCVtSVE1fTkVXUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX25ld3JvdXRlLCB9LAotCVtSVE1fREVMUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX2RlbHJvdXRlLCB9LAotCVtSVE1fR0VUUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX2dldHJvdXRlLAotCQkJCSAgICAgIC5kdW1waXQJPSBpbmV0Nl9kdW1wX2ZpYiwgfSwKLSNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKLQlbUlRNX0dFVFJVTEUgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ICAgPSBmaWI2X3J1bGVzX2R1bXAsICAgfSwKLSNlbmRpZgotfTsKLQogc3RhdGljIHZvaWQgX19pcHY2X2lmYV9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7CiAJaW5ldDZfaWZhX25vdGlmeShldmVudCA/IDogUlRNX05FV0FERFIsIGlmcCk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBSVE1fTkVXQUREUjoKLQkJaXA2X2luc19ydChpZnAtPnJ0KTsKKwkJLyoKKwkJICogSWYgdGhlIGFkZHJlc3Mgd2FzIG9wdGltaXN0aWMKKwkJICogd2UgaW5zZXJ0ZWQgdGhlIHJvdXRlIGF0IHRoZSBzdGFydCBvZgorCQkgKiBvdXIgREFEIHByb2Nlc3MsIHNvIHdlIGRvbid0IG5lZWQKKwkJICogdG8gZG8gaXQgYWdhaW4KKwkJICovCisJCWlmICghKGlmcC0+cnQtPnJ0Nmlfbm9kZSkpCisJCQlpcDZfaW5zX3J0KGlmcC0+cnQpOwogCQlpZiAoaWZwLT5pZGV2LT5jbmYuZm9yd2FyZGluZykKIAkJCWFkZHJjb25mX2pvaW5fYW55Y2FzdChpZnApOwogCQlicmVhazsKQEAgLTM4OTQsNiArNDAxNSwxNyBAQAogCQkJLm1vZGUJCT0JMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlYywKIAkJfSwKKyNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAorCQl7CisJCQkuY3RsX25hbWUJPQlDVExfVU5OVU1CRVJFRCwKKwkJCS5wcm9jbmFtZSAgICAgICA9ICAgICAgICJvcHRpbWlzdGljX2RhZCIsCisJCQkuZGF0YSAgICAgICAgICAgPSAgICAgICAmaXB2Nl9kZXZjb25mLm9wdGltaXN0aWNfZGFkLAorCQkJLm1heGxlbiAgICAgICAgID0gICAgICAgc2l6ZW9mKGludCksCisJCQkubW9kZSAgICAgICAgICAgPSAgICAgICAwNjQ0LAorCQkJLnByb2NfaGFuZGxlciAgID0gICAgICAgJnByb2NfZG9pbnR2ZWMsCisKKwkJfSwKKyNlbmRpZgogCQl7CiAJCQkuY3RsX25hbWUJPQkwLAkvKiBzZW50aW5lbCAqLwogCQl9CkBAIC00MDIxLDExICs0MTUzLDE1IEBACiAJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmaW5ldDZhZGRyX2NoYWluLCBuYik7CiB9CiAKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKTsKKwogaW50IHVucmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CiAJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpbmV0NmFkZHJfY2hhaW4sbmIpOwogfQogCitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKTsKKwogLyoKICAqCUluaXQgLyBjbGVhbnVwIGNvZGUKICAqLwpAQCAtNDA2NCw3ICs0MjAwLDE4IEBACiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHY2X2Rldl9ub3RmKTsKIAogCWFkZHJjb25mX3ZlcmlmeSgwKTsKLQlydG5ldGxpbmtfbGlua3NbUEZfSU5FVDZdID0gaW5ldDZfcnRuZXRsaW5rX3RhYmxlOworCisJZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUTElOSywgTlVMTCwgaW5ldDZfZHVtcF9pZmluZm8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKKworCS8qIE9ubHkgdGhlIGZpcnN0IGNhbGwgdG8gX19ydG5sX3JlZ2lzdGVyIGNhbiBmYWlsICovCisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fTkVXQUREUiwgaW5ldDZfcnRtX25ld2FkZHIsIE5VTEwpOworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0RFTEFERFIsIGluZXQ2X3J0bV9kZWxhZGRyLCBOVUxMKTsKKwlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRBRERSLCBpbmV0Nl9ydG1fZ2V0YWRkciwgaW5ldDZfZHVtcF9pZmFkZHIpOworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVE1VTFRJQ0FTVCwgTlVMTCwgaW5ldDZfZHVtcF9pZm1jYWRkcik7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUQU5ZQ0FTVCwgTlVMTCwgaW5ldDZfZHVtcF9pZmFjYWRkcik7CisKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJYWRkcmNvbmZfc3lzY3RsLnN5c2N0bF9oZWFkZXIgPQogCQlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoYWRkcmNvbmZfc3lzY3RsLmFkZHJjb25mX3Jvb3RfZGlyKTsKQEAgLTQwNzIsNiArNDIxOSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKK2Vycm91dDoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXB2Nl9kZXZfbm90Zik7CisKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIF9fZXhpdCBhZGRyY29uZl9jbGVhbnVwKHZvaWQpCkBAIC00MDgzLDcgKzQyMzQsNiBAQAogCiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlwdjZfZGV2X25vdGYpOwogCi0JcnRuZXRsaW5rX2xpbmtzW1BGX0lORVQ2XSA9IE5VTEw7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCWFkZHJjb25mX3N5c2N0bF91bnJlZ2lzdGVyKCZpcHY2X2RldmNvbmZfZGZsdCk7CiAJYWRkcmNvbmZfc3lzY3RsX3VucmVnaXN0ZXIoJmlwdjZfZGV2Y29uZik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCA1Y2FjMTRhLi4xOGNiOTI4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTk4LDYgKzk4LDExIEBACiAJaW50IHRyeV9sb2FkaW5nX21vZHVsZSA9IDA7CiAJaW50IGVycjsKIAorCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXICYmCisJICAgIHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSAmJgorCSAgICAhaW5ldF9laGFzaF9zZWNyZXQpCisJCWJ1aWxkX2VoYXNoX3NlY3JldCgpOworCiAJLyogTG9vayBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlL3Byb3RvY29sIHBhaXIuICovCiAJYW5zd2VyID0gTlVMTDsKIGxvb2t1cF9wcm90b2NvbDoKQEAgLTM0OSw2ICszNTQsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfYmluZCk7CisKIGludCBpbmV0Nl9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC0zNjUsNiArMzcyLDggQEAKIAlyZXR1cm4gaW5ldF9yZWxlYXNlKHNvY2spOwogfQogCitFWFBPUlRfU1lNQk9MKGluZXQ2X3JlbGVhc2UpOworCiBpbnQgaW5ldDZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CkBAIC00MjgsNiArNDM3LDggQEAKIAlyZXR1cm4oMCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfZ2V0bmFtZSk7CisKIGludCBpbmV0Nl9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTQzNyw2ICs0NDgsOSBAQAogCWNhc2UgU0lPQ0dTVEFNUDoKIAkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZyk7CiAKKwljYXNlIFNJT0NHU1RBTVBOUzoKKwkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcG5zKHNrLCAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWFyZyk7CisKIAljYXNlIFNJT0NBRERSVDoKIAljYXNlIFNJT0NERUxSVDoKIApAQCAtNDU3LDYgKzQ3MSw4IEBACiAJcmV0dXJuKDApOwogfQogCitFWFBPUlRfU1lNQk9MKGluZXQ2X2lvY3RsKTsKKwogY29uc3Qgc3RydWN0IHByb3RvX29wcyBpbmV0Nl9zdHJlYW1fb3BzID0gewogCS5mYW1pbHkJCSAgID0gUEZfSU5FVDYsCiAJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLApAQCAtNjAzLDYgKzYxOSw4IEBACiAJZ290byBvdXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfcmVnaXN0ZXJfcHJvdG9zdyk7CisKIHZvaWQKIGluZXQ2X3VucmVnaXN0ZXJfcHJvdG9zdyhzdHJ1Y3QgaW5ldF9wcm90b3N3ICpwKQogewpAQCAtNjE5LDYgKzYzNyw4IEBACiAJfQogfQogCitFWFBPUlRfU1lNQk9MKGluZXQ2X3VucmVnaXN0ZXJfcHJvdG9zdyk7CisKIGludCBpbmV0Nl9za19yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc29jayAqc2spCiB7CiAJaW50IGVycjsKQEAgLTY3OCw3ICs2OTgsOCBAQAogCWlmIChucC0+cnhvcHQuYWxsKSB7CiAJCWlmICgob3B0LT5ob3AgJiYgKG5wLT5yeG9wdC5iaXRzLmhvcG9wdHMgfHwKIAkJCQkgIG5wLT5yeG9wdC5iaXRzLm9ob3BvcHRzKSkgfHwKLQkJICAgICgoSVBWNl9GTE9XSU5GT19NQVNLICYgKihfX2JlMzIqKXNrYi0+bmgucmF3KSAmJgorCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0sgJgorCQkgICAgICAqKF9fYmUzMiAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpKSAmJgogCQkgICAgIG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdykgfHwKIAkJICAgIChvcHQtPnNyY3J0ICYmIChucC0+cnhvcHQuYml0cy5zcmNydCB8fAogCQkgICAgIG5wLT5yeG9wdC5iaXRzLm9zcmNydCkpIHx8CkBAIC02OTEsNjEgKzcxMiwyOCBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpcHY2X29wdF9hY2NlcHRlZCk7CiAKLWludAotc25tcDZfbWliX2luaXQodm9pZCAqcHRyWzJdLCBzaXplX3QgbWlic2l6ZSwgc2l6ZV90IG1pYmFsaWduKQotewotCWlmIChwdHIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwdHJbMF0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplKTsKLQlpZiAoIXB0clswXSkKLQkJZ290byBlcnIwOwotCi0JcHRyWzFdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSk7Ci0JaWYgKCFwdHJbMV0pCi0JCWdvdG8gZXJyMTsKLQotCXJldHVybiAwOwotCi1lcnIxOgotCWZyZWVfcGVyY3B1KHB0clswXSk7Ci0JcHRyWzBdID0gTlVMTDsKLWVycjA6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQKLXNubXA2X21pYl9mcmVlKHZvaWQgKnB0clsyXSkKLXsKLQlpZiAocHRyID09IE5VTEwpCi0JCXJldHVybjsKLQlmcmVlX3BlcmNwdShwdHJbMF0pOwotCWZyZWVfcGVyY3B1KHB0clsxXSk7Ci0JcHRyWzBdID0gcHRyWzFdID0gTlVMTDsKLX0KLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9pcHY2X21pYnModm9pZCkKIHsKLQlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzLCBzaXplb2YgKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzLCBzaXplb2YgKHN0cnVjdCBpcHN0YXRzX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKIAkJZ290byBlcnJfaXBfbWliOwotCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpY21wdjZfc3RhdGlzdGljcywgc2l6ZW9mIChzdHJ1Y3QgaWNtcHY2X21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpY21wdjZfc3RhdGlzdGljcywgc2l6ZW9mIChzdHJ1Y3QgaWNtcHY2X21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQogCQlnb3RvIGVycl9pY21wX21pYjsKLQlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopdWRwX3N0YXRzX2luNiwgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKil1ZHBfc3RhdHNfaW42LCBzaXplb2YgKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCiAJCWdvdG8gZXJyX3VkcF9taWI7Ci0JaWYgKHNubXA2X21pYl9pbml0KCh2b2lkICoqKXVkcGxpdGVfc3RhdHNfaW42LCBzaXplb2YgKHN0cnVjdCB1ZHBfbWliKSwKLQkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQorCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKXVkcGxpdGVfc3RhdHNfaW42LCBzaXplb2YgKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCiAJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwogCXJldHVybiAwOwogCiBlcnJfdWRwbGl0ZV9taWI6Ci0Jc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopdWRwX3N0YXRzX2luNik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKIGVycl91ZHBfbWliOgotCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKIGVycl9pY21wX21pYjoKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzKTsKIGVycl9pcF9taWI6CiAJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTc1MywxMCArNzQxLDEwIEBACiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfaXB2Nl9taWJzKHZvaWQpCiB7Ci0Jc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzKTsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpY21wdjZfc3RhdGlzdGljcyk7Ci0Jc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopdWRwX3N0YXRzX2luNik7Ci0Jc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzKTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0c19pbjYpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbmV0Nl9pbml0KHZvaWQpCkBAIC05MjksNiArOTE3LDggQEAKIHsKIAkvKiBGaXJzdCBvZiBhbGwgZGlzYWxsb3cgbmV3IHNvY2tldHMgY3JlYXRpb24uICovCiAJc29ja191bnJlZ2lzdGVyKFBGX0lORVQ2KTsKKwkvKiBEaXNhbGxvdyBhbnkgZnVydGhlciBuZXRsaW5rIG1lc3NhZ2VzICovCisJcnRubF91bnJlZ2lzdGVyX2FsbChQRl9JTkVUNik7CiAKIAkvKiBDbGVhbnVwIGNvZGUgcGFydHMuICovCiAJaXB2Nl9wYWNrZXRfY2xlYW51cCgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWg2LmMgYi9uZXQvaXB2Ni9haDYuYwppbmRleCBkYzY4YjcyLi5iNjk2Yzg0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9haDYuYworKysgYi9uZXQvaXB2Ni9haDYuYwpAQCAtMjM4LDggKzIzOCw4IEBACiAJdG9wX2lwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKIAl0b3BfaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKCp0b3BfaXBoKSk7CiAKLQluZXh0aGRyID0gKnNrYi0+bmgucmF3OwotCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fQUg7CisJbmV4dGhkciA9ICpza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkqc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgPSBJUFBST1RPX0FIOwogCiAJLyogV2hlbiB0aGVyZSBhcmUgbm8gZXh0ZW5zaW9uIGhlYWRlcnMsIHdlIG9ubHkgbmVlZCB0byBzYXZlIHRoZSBmaXJzdAogCSAqIDggYnl0ZXMgb2YgdGhlIGJhc2UgSVAgaGVhZGVyLgpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJbWVtY3B5KHRtcF9iYXNlLCB0b3BfaXBoLCBzaXplb2YodG1wX2Jhc2UpKTsKIAogCXRtcF9leHQgPSBOVUxMOwotCWV4dGxlbiA9IHNrYi0+aC5yYXcgLSAodW5zaWduZWQgY2hhciAqKSh0b3BfaXBoICsgMSk7CisJZXh0bGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJaWYgKGV4dGxlbikgewogCQlleHRsZW4gKz0gc2l6ZW9mKCp0bXBfZXh0KTsKIAkJdG1wX2V4dCA9IGttYWxsb2MoZXh0bGVuLCBHRlBfQVRPTUlDKTsKQEAgLTI2OCw3ICsyNjgsNyBAQAogCQkJZ290byBlcnJvcl9mcmVlX2lwaDsKIAl9CiAKLQlhaCA9IChzdHJ1Y3QgaXBfYXV0aF9oZHIgKilza2ItPmgucmF3OworCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJYWgtPm5leHRoZHIgPSBuZXh0aGRyOwogCiAJdG9wX2lwaC0+cHJpb3JpdHkgICAgPSAwOwpAQCAtMzE2LDggKzMxNiw4IEBACiAJICoKIAkgKiBUbyBlcmFzZSBBSDoKIAkgKiBLZWVwaW5nIGNvcHkgb2YgY2xlYXJlZCBoZWFkZXJzLiBBZnRlciBBSCBwcm9jZXNzaW5nLAotCSAqIE1vdmluZyB0aGUgcG9pbnRlciBvZiBza2ItPm5oLnJhdyBieSB1c2luZyBza2JfcHVsbCBhcyBsb25nIGFzIEFICi0JICogaGVhZGVyIGxlbmd0aC4gVGhlbiBjb3B5IGJhY2sgdGhlIGNvcHkgYXMgbG9uZyBhcyBoZHJfbGVuCisJICogTW92aW5nIHRoZSBwb2ludGVyIG9mIHNrYi0+bmV0d29ya19oZWFkZXIgYnkgdXNpbmcgc2tiX3B1bGwgYXMgbG9uZworCSAqIGFzIEFIIGhlYWRlciBsZW5ndGguIFRoZW4gY29weSBiYWNrIHRoZSBjb3B5IGFzIGxvbmcgYXMgaGRyX2xlbgogCSAqIElmIGRlc3RpbmF0aW9uIGhlYWRlciBmb2xsb3dpbmcgQUggZXhpc3RzLCBjb3B5IGl0IGludG8gYWZ0ZXIgW0V4dDJdLgogCSAqCiAJICogfDw+fFtJUHY2XVtFeHQxXVtFeHQyXVtEZXN0XVtQYXlsb2FkXQpAQCAtMzI1LDYgKzMyNSw3IEBACiAJICovCiAKIAlzdHJ1Y3QgaXB2Nl9hdXRoX2hkciAqYWg7CisJc3RydWN0IGlwdjZoZHIgKmlwNmg7CiAJc3RydWN0IGFoX2RhdGEgKmFocDsKIAl1bnNpZ25lZCBjaGFyICp0bXBfaGRyID0gTlVMTDsKIAl1MTYgaGRyX2xlbjsKQEAgLTM0MSw3ICszNDIsNyBAQAogCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCiAJCWdvdG8gb3V0OwogCi0JaGRyX2xlbiA9IHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3OworCWhkcl9sZW4gPSBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgaXB2Nl9hdXRoX2hkciopc2tiLT5kYXRhOwogCWFocCA9IHgtPmRhdGE7CiAJbmV4dGhkciA9IGFoLT5uZXh0aGRyOwpAQCAtMzU0LDE2ICszNTUsMTcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBhaF9obGVuKSkKIAkJZ290byBvdXQ7CiAKLQl0bXBfaGRyID0ga21lbWR1cChza2ItPm5oLnJhdywgaGRyX2xlbiwgR0ZQX0FUT01JQyk7CisJdG1wX2hkciA9IGttZW1kdXAoc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIGhkcl9sZW4sIEdGUF9BVE9NSUMpOwogCWlmICghdG1wX2hkcikKIAkJZ290byBvdXQ7Ci0JaWYgKGlwdjZfY2xlYXJfbXV0YWJsZV9vcHRpb25zKHNrYi0+bmguaXB2NmgsIGhkcl9sZW4sIFhGUk1fUE9MSUNZX0lOKSkKKwlpcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwlpZiAoaXB2Nl9jbGVhcl9tdXRhYmxlX29wdGlvbnMoaXA2aCwgaGRyX2xlbiwgWEZSTV9QT0xJQ1lfSU4pKQogCQlnb3RvIGZyZWVfb3V0OwotCXNrYi0+bmguaXB2NmgtPnByaW9yaXR5ICAgID0gMDsKLQlza2ItPm5oLmlwdjZoLT5mbG93X2xibFswXSA9IDA7Ci0Jc2tiLT5uaC5pcHY2aC0+Zmxvd19sYmxbMV0gPSAwOwotCXNrYi0+bmguaXB2NmgtPmZsb3dfbGJsWzJdID0gMDsKLQlza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQgICA9IDA7CisJaXA2aC0+cHJpb3JpdHkgICAgPSAwOworCWlwNmgtPmZsb3dfbGJsWzBdID0gMDsKKwlpcDZoLT5mbG93X2xibFsxXSA9IDA7CisJaXA2aC0+Zmxvd19sYmxbMl0gPSAwOworCWlwNmgtPmhvcF9saW1pdCAgID0gMDsKIAogCXsKIAkJdTggYXV0aF9kYXRhW01BWF9BSF9BVVRIX0xFTl07CkBAIC0zODIsNyArMzg0LDkgQEAKIAkJfQogCX0KIAotCXNrYi0+aC5yYXcgPSBtZW1jcHkoc2tiLT5uaC5yYXcgKz0gYWhfaGxlbiwgdG1wX2hkciwgaGRyX2xlbik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBhaF9obGVuOworCW1lbWNweShza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgdG1wX2hkciwgaGRyX2xlbik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlfX3NrYl9wdWxsKHNrYiwgYWhfaGxlbiArIGhkcl9sZW4pOwogCiAJa2ZyZWUodG1wX2hkcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwppbmRleCAzYjRlOGRjLi40MDNlZWU2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY2L2RhdGFncmFtLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCQkgICAgIF9fYmUxNiBwb3J0LCB1MzIgaW5mbywgdTggKnBheWxvYWQpCiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wICA9IGluZXQ2X3NrKHNrKTsKLQlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoID0gKHN0cnVjdCBpY21wNmhkciAqKXNrYi0+aC5yYXc7CisJc3RydWN0IGljbXA2aGRyICppY21waCA9IGljbXA2X2hkcihza2IpOwogCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CiAKIAlpZiAoIW5wLT5yZWN2ZXJyKQpAQCAtMjI3LDExICsyMjcsMTIgQEAKIAlzZXJyLT5lZS5lZV9wYWQgPSAwOwogCXNlcnItPmVlLmVlX2luZm8gPSBpbmZvOwogCXNlcnItPmVlLmVlX2RhdGEgPSAwOwotCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4KikmKCgoc3RydWN0IGlwdjZoZHIqKShpY21waCsxKSktPmRhZGRyKSAtIHNrYi0+bmgucmF3OworCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4ICopJigoKHN0cnVjdCBpcHY2aGRyICopKGljbXBoICsgMSkpLT5kYWRkcikgLQorCQkJCSAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2Vyci0+cG9ydCA9IHBvcnQ7CiAKLQlza2ItPmgucmF3ID0gcGF5bG9hZDsKIAlfX3NrYl9wdWxsKHNrYiwgcGF5bG9hZCAtIHNrYi0+ZGF0YSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikpCiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMjUxLDggKzI1Miw5IEBACiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAotCWlwaCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotCXNrYi0+bmguaXB2NmggPSBpcGg7CisJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZmbC0+Zmw2X2RzdCk7CiAKIAlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKQEAgLTI2MywxMSArMjY1LDExIEBACiAJc2Vyci0+ZWUuZWVfcGFkID0gMDsKIAlzZXJyLT5lZS5lZV9pbmZvID0gaW5mbzsKIAlzZXJyLT5lZS5lZV9kYXRhID0gMDsKLQlzZXJyLT5hZGRyX29mZnNldCA9ICh1OCopJmlwaC0+ZGFkZHIgLSBza2ItPm5oLnJhdzsKKwlzZXJyLT5hZGRyX29mZnNldCA9ICh1OCAqKSZpcGgtPmRhZGRyIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2Vyci0+cG9ydCA9IGZsLT5mbF9pcF9kcG9ydDsKIAotCXNrYi0+aC5yYXcgPSBza2ItPnRhaWw7Ci0JX19za2JfcHVsbChza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikpCiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMzA5LDIxICszMTEsMjQgQEAKIAogCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnLT5tc2dfbmFtZTsKIAlpZiAoc2luKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNpbi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJc2luLT5zaW42X2Zsb3dpbmZvID0gMDsKIAkJc2luLT5zaW42X3BvcnQgPSBzZXJyLT5wb3J0OwogCQlzaW4tPnNpbjZfc2NvcGVfaWQgPSAwOwogCQlpZiAoc2Vyci0+ZWUuZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9JQ01QNikgewogCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbi0+c2luNl9hZGRyLAotCQkJICAoc3RydWN0IGluNl9hZGRyICopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQpKTsKKwkJCQkgIChzdHJ1Y3QgaW42X2FkZHIgKikobmggKyBzZXJyLT5hZGRyX29mZnNldCkpOwogCQkJaWYgKG5wLT5zbmRmbG93KQotCQkJCXNpbi0+c2luNl9mbG93aW5mbyA9ICooX19iZTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCAtIDI0KSAmIElQVjZfRkxPV0lORk9fTUFTSzsKKwkJCQlzaW4tPnNpbjZfZmxvd2luZm8gPQorCQkJCQkoKihfX2JlMzIgKikobmggKyBzZXJyLT5hZGRyX29mZnNldCAtIDI0KSAmCisJCQkJCSBJUFY2X0ZMT1dJTkZPX01BU0spOwogCQkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW4tPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQogCQkJCXNpbi0+c2luNl9zY29wZV9pZCA9IElQNkNCKHNrYiktPmlpZjsKIAkJfSBlbHNlIHsKIAkJCWlwdjZfYWRkcl9zZXQoJnNpbi0+c2luNl9hZGRyLCAwLCAwLAogCQkJCSAgICAgIGh0b25sKDB4ZmZmZiksCi0JCQkJICAgICAgKihfX2JlMzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CisJCQkJICAgICAgKihfX2JlMzIgKikobmggKyBzZXJyLT5hZGRyX29mZnNldCkpOwogCQl9CiAJfQogCkBAIC0zMzUsNyArMzQwLDcgQEAKIAkJc2luLT5zaW42X2Zsb3dpbmZvID0gMDsKIAkJc2luLT5zaW42X3Njb3BlX2lkID0gMDsKIAkJaWYgKHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUDYpIHsKLQkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAkJCWlmIChucC0+cnhvcHQuYWxsKQogCQkJCWRhdGFncmFtX3JlY3ZfY3RsKHNrLCBtc2csIHNrYik7CiAJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCkBAIC0zNDQsOCArMzQ5LDcgQEAKIAkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQkJaXB2Nl9hZGRyX3NldCgmc2luLT5zaW42X2FkZHIsIDAsIDAsCi0JCQkJICAgICAgaHRvbmwoMHhmZmZmKSwKLQkJCQkgICAgICBza2ItPm5oLmlwaC0+c2FkZHIpOworCQkJCSAgICAgIGh0b25sKDB4ZmZmZiksIGlwX2hkcihza2IpLT5zYWRkcik7CiAJCQlpZiAoaW5ldC0+Y21zZ19mbGFncykKIAkJCQlpcF9jbXNnX3JlY3YobXNnLCBza2IpOwogCQl9CkBAIC0zODEsMzMgKzM4NSwzNCBAQAogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7CisJdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWlmIChucC0+cnhvcHQuYml0cy5yeGluZm8pIHsKIAkJc3RydWN0IGluNl9wa3RpbmZvIHNyY19pbmZvOwogCiAJCXNyY19pbmZvLmlwaTZfaWZpbmRleCA9IG9wdC0+aWlmOwotCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X1BLVElORk8sIHNpemVvZihzcmNfaW5mbyksICZzcmNfaW5mbyk7CiAJfQogCiAJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSkgewotCQlpbnQgaGxpbSA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJaW50IGhsaW0gPSBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQ7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOwogCX0KIAogCWlmIChucC0+cnhvcHQuYml0cy5yeHRjbGFzcykgewotCQlpbnQgdGNsYXNzID0gKG50b2hsKCooX19iZTMyICopc2tiLT5uaC5pcHY2aCkgPj4gMjApICYgMHhmZjsKKwkJaW50IHRjbGFzcyA9IChudG9obCgqKF9fYmUzMiAqKWlwdjZfaGRyKHNrYikpID4+IDIwKSAmIDB4ZmY7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfVENMQVNTLCBzaXplb2YodGNsYXNzKSwgJnRjbGFzcyk7CiAJfQogCi0JaWYgKG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyAmJiAoKihfX2JlMzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLKSkgewotCQlfX2JlMzIgZmxvd2luZm8gPSAqKF9fYmUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0s7CisJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyAmJiAoKihfX2JlMzIgKiluaCAmIElQVjZfRkxPV0lORk9fTUFTSykpIHsKKwkJX19iZTMyIGZsb3dpbmZvID0gKihfX2JlMzIgKiluaCAmIElQVjZfRkxPV0lORk9fTUFTSzsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9GTE9XSU5GTywgc2l6ZW9mKGZsb3dpbmZvKSwgJmZsb3dpbmZvKTsKIAl9CiAKIAkvKiBIYkggaXMgYWxsb3dlZCBvbmx5IG9uY2UgKi8KIAlpZiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyAmJiBvcHQtPmhvcCkgewotCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmhvcDsKKwkJdTggKnB0ciA9IG5oICsgb3B0LT5ob3A7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfSE9QT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKIAl9CiAKQEAgLTQyMywxMSArNDI4LDExIEBACiAJCSAqIElQVjZfUkVDVkRTVE9QVFMgaXMgbW9yZSBnZW5lcmljLiAtLXlvc2hmdWppCiAJCSAqLwogCQl1bnNpZ25lZCBpbnQgb2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQkJdTggbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJCXU4IG5leHRoZHIgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCiAJCXdoaWxlIChvZmYgPD0gb3B0LT5sYXN0b3B0KSB7CiAJCQl1bnNpZ25lZCBsZW47Ci0JCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvZmY7CisJCQl1OCAqcHRyID0gbmggKyBvZmY7CiAKIAkJCXN3aXRjaChuZXh0aGRyKSB7CiAJCQljYXNlIElQUFJPVE9fRFNUT1BUUzoKQEAgLTQ2MSwyNyArNDY2LDI3IEBACiAJCXN0cnVjdCBpbjZfcGt0aW5mbyBzcmNfaW5mbzsKIAogCQlzcmNfaW5mby5pcGk2X2lmaW5kZXggPSBvcHQtPmlpZjsKLQkJaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwkJaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKIAl9CiAJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4b2hsaW0pIHsKLQkJaW50IGhsaW0gPSBza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQ7CisJCWludCBobGltID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJIT1BMSU1JVCwgc2l6ZW9mKGhsaW0pLCAmaGxpbSk7CiAJfQogCWlmIChucC0+cnhvcHQuYml0cy5vaG9wb3B0cyAmJiBvcHQtPmhvcCkgewotCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmhvcDsKKwkJdTggKnB0ciA9IG5oICsgb3B0LT5ob3A7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkhPUE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CiAJfQogCWlmIChucC0+cnhvcHQuYml0cy5vZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKLQkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5kc3QwOworCQl1OCAqcHRyID0gbmggKyBvcHQtPmRzdDA7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkRTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CiAJfQogCWlmIChucC0+cnhvcHQuYml0cy5vc3JjcnQgJiYgb3B0LT5zcmNydCkgewotCQlzdHJ1Y3QgaXB2Nl9ydF9oZHIgKnJ0aGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2ItPm5oLnJhdyArIG9wdC0+c3JjcnQpOworCQlzdHJ1Y3QgaXB2Nl9ydF9oZHIgKnJ0aGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKShuaCArIG9wdC0+c3JjcnQpOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJSVEhEUiwgKHJ0aGRyLT5oZHJsZW4rMSkgPDwgMywgcnRoZHIpOwogCX0KIAlpZiAobnAtPnJ4b3B0LmJpdHMub2RzdG9wdHMgJiYgb3B0LT5kc3QxKSB7Ci0JCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+ZHN0MTsKKwkJdTggKnB0ciA9IG5oICsgb3B0LT5kc3QxOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJEU1RPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTcxOCw3ICs3MjMsNyBAQAogCQkJCSAgICAgICBjbXNnLT5jbXNnX3R5cGUpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogCiBleGl0X2Y6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9lc3A2LmMgYi9uZXQvaXB2Ni9lc3A2LmMKaW5kZXggMzYzZTYzZi4uNzEwN2JiNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXNwNi5jCisrKyBiL25ldC9pcHY2L2VzcDYuYwpAQCAtNDIsMjEgKzQyLDE5IEBACiBzdGF0aWMgaW50IGVzcDZfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBlcnI7Ci0JaW50IGhkcl9sZW47CiAJc3RydWN0IGlwdjZoZHIgKnRvcF9pcGg7CiAJc3RydWN0IGlwdjZfZXNwX2hkciAqZXNwaDsKIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOwogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBlc3BfZGF0YSAqZXNwOwogCXN0cnVjdCBza19idWZmICp0cmFpbGVyOwogCWludCBibGtzaXplOwogCWludCBjbGVuOwogCWludCBhbGVuOwogCWludCBuZnJhZ3M7Ci0KLQllc3AgPSB4LT5kYXRhOwotCWhkcl9sZW4gPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhICsKLQkJICBzaXplb2YoKmVzcGgpICsgZXNwLT5jb25mLml2bGVuOworCXU4ICp0YWlsOworCXN0cnVjdCBlc3BfZGF0YSAqZXNwID0geC0+ZGF0YTsKKwlpbnQgaGRyX2xlbiA9IChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJICAgICAgIHNpemVvZigqZXNwaCkgKyBlc3AtPmNvbmYuaXZsZW4pOwogCiAJLyogU3RyaXAgSVArRVNQIGhlYWRlci4gKi8KIAlfX3NrYl9wdWxsKHNrYiwgaGRyX2xlbik7CkBAIC04MSwxOSArNzksMjAgQEAKIAl9CiAKIAkvKiBGaWxsIHBhZGRpbmcuLi4gKi8KKwl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKTsKIAlkbyB7CiAJCWludCBpOwogCQlmb3IgKGk9MDsgaTxjbGVuLXNrYi0+bGVuIC0gMjsgaSsrKQotCQkJKih1OCopKHRyYWlsZXItPnRhaWwgKyBpKSA9IGkrMTsKKwkJCXRhaWxbaV0gPSBpICsgMTsKIAl9IHdoaWxlICgwKTsKLQkqKHU4KikodHJhaWxlci0+dGFpbCArIGNsZW4tc2tiLT5sZW4gLSAyKSA9IChjbGVuIC0gc2tiLT5sZW4pLTI7CisJdGFpbFtjbGVuLXNrYi0+bGVuIC0gMl0gPSAoY2xlbiAtIHNrYi0+bGVuKSAtIDI7CiAJcHNrYl9wdXQoc2tiLCB0cmFpbGVyLCBjbGVuIC0gc2tiLT5sZW4pOwogCiAJdG9wX2lwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKV9fc2tiX3B1c2goc2tiLCBoZHJfbGVuKTsKLQllc3BoID0gKHN0cnVjdCBpcHY2X2VzcF9oZHIgKilza2ItPmgucmF3OworCWVzcGggPSAoc3RydWN0IGlwdjZfZXNwX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJdG9wX2lwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGFsZW4gLSBzaXplb2YoKnRvcF9pcGgpKTsKLQkqKHU4KikodHJhaWxlci0+dGFpbCAtIDEpID0gKnNrYi0+bmgucmF3OwotCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fRVNQOworCSooc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKSAtIDEpID0gKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCSpza2JfbmV0d29ya19oZWFkZXIoc2tiKSA9IElQUFJPVE9fRVNQOwogCiAJZXNwaC0+c3BpID0geC0+aWQuc3BpOwogCWVzcGgtPnNlcV9ubyA9IGh0b25sKCsreC0+cmVwbGF5Lm9zZXEpOwpAQCAtMTUwLDggKzE0OSw3IEBACiAJaW50IGJsa3NpemUgPSBBTElHTihjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pLCA0KTsKIAlpbnQgYWxlbiA9IGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOwogCWludCBlbGVuID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZfZXNwX2hkcikgLSBlc3AtPmNvbmYuaXZsZW4gLSBhbGVuOwotCi0JaW50IGhkcl9sZW4gPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CisJaW50IGhkcl9sZW4gPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CiAJaW50IG5mcmFnczsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTkxLDcgKzE4OSw3IEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJZXNwaCA9IChzdHJ1Y3QgaXB2Nl9lc3BfaGRyKilza2ItPmRhdGE7Ci0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCiAJLyogR2V0IGl2ZWMuIFRoaXMgY2FuIGJlIHdyb25nLCBjaGVjayBhZ2FpbnN0IGFub3RoZXIgaW1wbHMuICovCiAJaWYgKGVzcC0+Y29uZi5pdmxlbikKQEAgLTIzMSwyOCArMjI5LDMwIEBACiAJCXJldCA9IG5leHRoZHJbMV07CiAJfQogCi0Jc2tiLT5oLnJhdyA9IF9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmVzcGgpICsgZXNwLT5jb25mLml2bGVuKSAtIGhkcl9sZW47Ci0KKwlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCplc3BoKSArIGVzcC0+Y29uZi5pdmxlbik7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgLWhkcl9sZW4pOwogb3V0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1MzIgZXNwNl9nZXRfbWF4X3NpemUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBtdHUpCitzdGF0aWMgdTMyIGVzcDZfZ2V0X210dShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKIHsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CiAJdTMyIGJsa3NpemUgPSBBTElHTihjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShlc3AtPmNvbmYudGZtKSwgNCk7CisJdTMyIGFsaWduID0gbWF4X3QodTMyLCBibGtzaXplLCBlc3AtPmNvbmYucGFkbGVuKTsKKwl1MzIgcmVtOwogCi0JaWYgKHgtPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgewotCQltdHUgPSBBTElHTihtdHUgKyAyLCBibGtzaXplKTsKLQl9IGVsc2UgewotCQkvKiBUaGUgd29yc3QgY2FzZS4gKi8KKwltdHUgLT0geC0+cHJvcHMuaGVhZGVyX2xlbiArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOworCXJlbSA9IG10dSAmIChhbGlnbiAtIDEpOworCW10dSAmPSB+KGFsaWduIC0gMSk7CisKKwlpZiAoeC0+cHJvcHMubW9kZSAhPSBYRlJNX01PREVfVFVOTkVMKSB7CiAJCXUzMiBwYWRzaXplID0gKChibGtzaXplIC0gMSkgJiA3KSArIDE7Ci0JCW10dSA9IEFMSUdOKG10dSArIDIsIHBhZHNpemUpICsgYmxrc2l6ZSAtIHBhZHNpemU7CisJCW10dSAtPSBibGtzaXplIC0gcGFkc2l6ZTsKKwkJbXR1ICs9IG1pbl90KHUzMiwgYmxrc2l6ZSAtIHBhZHNpemUsIHJlbSk7CiAJfQotCWlmIChlc3AtPmNvbmYucGFkbGVuKQotCQltdHUgPSBBTElHTihtdHUsIGVzcC0+Y29uZi5wYWRsZW4pOwogCi0JcmV0dXJuIG10dSArIHgtPnByb3BzLmhlYWRlcl9sZW4gKyBlc3AtPmF1dGguaWN2X3RydW5jX2xlbjsKKwlyZXR1cm4gbXR1IC0gMjsKIH0KIAogc3RhdGljIHZvaWQgZXNwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCkBAIC0zODIsNyArMzgyLDcgQEAKIAkucHJvdG8JICAgICAJPSBJUFBST1RPX0VTUCwKIAkuaW5pdF9zdGF0ZQk9IGVzcDZfaW5pdF9zdGF0ZSwKIAkuZGVzdHJ1Y3Rvcgk9IGVzcDZfZGVzdHJveSwKLQkuZ2V0X21heF9zaXplCT0gZXNwNl9nZXRfbWF4X3NpemUsCisJLmdldF9tdHUJPSBlc3A2X2dldF9tdHUsCiAJLmlucHV0CQk9IGVzcDZfaW5wdXQsCiAJLm91dHB1dAkJPSBlc3A2X291dHB1dCwKIAkuaGRyX29mZnNldAk9IHhmcm02X2ZpbmRfMXN0ZnJhZ29wdCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2V4dGhkcnMuYyBiL25ldC9pcHY2L2V4dGhkcnMuYwppbmRleCBmYjM5NjA0Li42ZDhlNGFjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzLmMKKysrIGIvbmV0L2lwdjYvZXh0aGRycy5jCkBAIC01MCwxMyArNTAsMTQgQEAKIAogaW50IGlwdjZfZmluZF90bHYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgaW50IHR5cGUpCiB7Ci0JaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5oLnJhdzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCWludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpoZHI7CiAJaW50IGxlbjsKIAogCWlmIChvZmZzZXQgKyAyID4gcGFja2V0X2xlbikKIAkJZ290byBiYWQ7Ci0JaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIqKShza2ItPm5oLnJhdyArIG9mZnNldCk7CisJaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCWxlbiA9ICgoaGRyLT5oZHJsZW4gKyAxKSA8PCAzKTsKIAogCWlmIChvZmZzZXQgKyBsZW4gPiBwYWNrZXRfbGVuKQpAQCAtNjYsNyArNjcsNyBAQAogCWxlbiAtPSAyOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJaW50IG9wdHR5cGUgPSBza2ItPm5oLnJhd1tvZmZzZXRdOworCQlpbnQgb3B0dHlwZSA9IG5oW29mZnNldF07CiAJCWludCBvcHRsZW47CiAKIAkJaWYgKG9wdHR5cGUgPT0gdHlwZSkKQEAgLTc3LDcgKzc4LDcgQEAKIAkJCW9wdGxlbiA9IDE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW9wdGxlbiA9IHNrYi0+bmgucmF3W29mZnNldCArIDFdICsgMjsKKwkJCW9wdGxlbiA9IG5oW29mZnNldCArIDFdICsgMjsKIAkJCWlmIChvcHRsZW4gPiBsZW4pCiAJCQkJZ290byBiYWQ7CiAJCQlicmVhazsKQEAgLTExMyw3ICsxMTQsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKIAotCXN3aXRjaCAoKHNrYi0+bmgucmF3W29wdG9mZl0gJiAweEMwKSA+PiA2KSB7CisJc3dpdGNoICgoc2tiX25ldHdvcmtfaGVhZGVyKHNrYilbb3B0b2ZmXSAmIDB4QzApID4+IDYpIHsKIAljYXNlIDA6IC8qIGlnbm9yZSAqLwogCQlyZXR1cm4gMTsKIApAQCAtMTI0LDEyICsxMjUsMTIgQEAKIAkJLyogQWN0dWFsbHksIGl0IGlzIHJlZHVuZGFudCBjaGVjay4gaWNtcF9zZW5kCiAJCSAgIHdpbGwgcmVjaGVjayBpbiBhbnkgY2FzZS4KIAkJICovCi0JCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZza2ItPm5oLmlwdjZoLT5kYWRkcikpCisJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikpCiAJCQlicmVhazsKIAljYXNlIDI6IC8qIHNlbmQgSUNNUCBQQVJNIFBST0IgcmVnYXJkbGVzcyBhbmQgZHJvcCBwYWNrZXQgKi8KIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfVU5LX09QVElPTiwgb3B0b2ZmKTsKIAkJcmV0dXJuIDA7Ci0JfTsKKwl9CiAKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTE0MSwxOSArMTQyLDIwIEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOwogCXN0cnVjdCB0bHZ0eXBlX3Byb2MgKmN1cnI7Ci0JaW50IG9mZiA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKLQlpbnQgbGVuID0gKChza2ItPmgucmF3WzFdKzEpPDwzKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCWludCBvZmYgPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CisJaW50IGxlbiA9IChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpWzFdICsgMSkgPDwgMzsKIAotCWlmICgoc2tiLT5oLnJhdyArIGxlbikgLSBza2ItPmRhdGEgPiBza2JfaGVhZGxlbihza2IpKQorCWlmIChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgbGVuID4gc2tiX2hlYWRsZW4oc2tiKSkKIAkJZ290byBiYWQ7CiAKIAlvZmYgKz0gMjsKIAlsZW4gLT0gMjsKIAogCXdoaWxlIChsZW4gPiAwKSB7Ci0JCWludCBvcHRsZW4gPSBza2ItPm5oLnJhd1tvZmYrMV0rMjsKKwkJaW50IG9wdGxlbiA9IG5oW29mZiArIDFdICsgMjsKIAotCQlzd2l0Y2ggKHNrYi0+bmgucmF3W29mZl0pIHsKKwkJc3dpdGNoIChuaFtvZmZdKSB7CiAJCWNhc2UgSVBWNl9UTFZfUEFEMDoKIAkJCW9wdGxlbiA9IDE7CiAJCQlicmVhazsKQEAgLTE2NSw3ICsxNjcsNyBAQAogCQkJaWYgKG9wdGxlbiA+IGxlbikKIAkJCQlnb3RvIGJhZDsKIAkJCWZvciAoY3Vycj1wcm9jczsgY3Vyci0+dHlwZSA+PSAwOyBjdXJyKyspIHsKLQkJCQlpZiAoY3Vyci0+dHlwZSA9PSBza2ItPm5oLnJhd1tvZmZdKSB7CisJCQkJaWYgKGN1cnItPnR5cGUgPT0gbmhbb2ZmXSkgewogCQkJCQkvKiB0eXBlIHNwZWNpZmljIGxlbmd0aC9hbGlnbm1lbnQKIAkJCQkJICAgY2hlY2tzIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZQogCQkJCQkgICBmdW5jKCkuICovCkBAIC0yMDAsNyArMjAyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnA7CiAJc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKmhhbzsKIAlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5uaC5yYXc7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaW42X2FkZHIgdG1wX2FkZHI7CiAJaW50IHJldDsKIApAQCAtMjExLDcgKzIxMyw3IEBACiAJb3B0LT5kc3RoYW8gPSBvcHQtPmRzdDE7CiAJb3B0LT5kc3QxID0gMDsKIAotCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKShza2ItPm5oLnJhdyArIG9wdG9mZik7CisJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgb3B0b2ZmKTsKIAogCWlmIChoYW8tPmxlbmd0aCAhPSAxNikgewogCQlMSU1JVF9ORVRERUJVRygKQEAgLTI0NCw4ICsyNDYsOSBAQAogCiAJCS8qIHVwZGF0ZSBhbGwgdmFyaWFibGUgdXNpbmcgYmVsb3cgYnkgY29waWVkIHNrYnVmZiAqLwogCQkqc2ticCA9IHNrYiA9IHNrYjI7Ci0JCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKShza2IyLT5uaC5yYXcgKyBvcHRvZmYpOwotCQlpcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYjItPm5oLnJhdzsKKwkJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IyKSArCisJCQkJCQkgIG9wdG9mZik7CisJCWlwdjZoID0gaXB2Nl9oZHIoc2tiMik7CiAJfQogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQpAQCAtMjU1LDcgKzI1OCw3IEBACiAJaXB2Nl9hZGRyX2NvcHkoJmlwdjZoLT5zYWRkciwgJmhhby0+YWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJmhhby0+YWRkciwgJnRtcF9hZGRyKTsKIAotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjID09IDApCisJaWYgKHNrYi0+dHN0YW1wLnR2NjQgPT0gMCkKIAkJX19uZXRfdGltZXN0YW1wKHNrYik7CiAKIAlyZXR1cm4gMTsKQEAgLTI4NSwxNiArMjg4LDE2IEBACiAjZW5kaWYKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKzgpIHx8Ci0JICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSsoKHNrYi0+aC5yYXdbMV0rMSk8PDMpKSkgeworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyA4KSB8fAorCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQkgKChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpWzFdICsgMSkgPDwgMykpKSkgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlvcHQtPmxhc3RvcHQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7Ci0Jb3B0LT5kc3QxID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OworCW9wdC0+bGFzdG9wdCA9IG9wdC0+ZHN0MSA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiAJZHN0YnVmID0gb3B0LT5kc3QxOwogI2VuZGlmCkBAIC0zMDMsNyArMzA2LDcgQEAKIAlpZiAoaXA2X3BhcnNlX3Rsdih0bHZwcm9jZGVzdG9wdF9sc3QsIHNrYnApKSB7CiAJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCXNrYiA9ICpza2JwOwotCQlza2ItPmgucmF3ICs9ICgoc2tiLT5oLnJhd1sxXSsxKTw8Myk7CisJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKVsxXSArIDEpIDw8IDM7CiAJCW9wdCA9IElQNkNCKHNrYik7CiAjaWZkZWYgQ09ORklHX0lQVjZfTUlQNgogCQlvcHQtPm5ob2ZmID0gZHN0YnVmOwpAQCAtMzg0LDE4ICszODcsMjAgQEAKIAogCWluNl9kZXZfcHV0KGlkZXYpOwogCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSs4KSB8fAotCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrKChza2ItPmgucmF3WzFdKzEpPDwzKSkpIHsKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgOCkgfHwKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJICgoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKVsxXSArIDEpIDw8IDMpKSkpIHsKIAkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKSBza2ItPmgucmF3OworCWhkciA9IChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJc3dpdGNoIChoZHItPnR5cGUpIHsKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CisJY2FzZSBJUFY2X1NSQ1JUX1RZUEVfMjoKIAkJYnJlYWs7CiAjZW5kaWYKIAljYXNlIElQVjZfU1JDUlRfVFlQRV8wOgpAQCAtNDA2LDExICs0MTEsMTIgQEAKIAlkZWZhdWx0OgogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCAoJmhkci0+dHlwZSkgLSBza2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgICgmaGRyLT50eXBlKSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZza2ItPm5oLmlwdjZoLT5kYWRkcikgfHwKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpIHx8CiAJICAgIHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpIHsKIAkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwpAQCAtNDM4LDEyICs0NDQsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJb3B0LT5sYXN0b3B0ID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwotCQlvcHQtPnNyY3J0ID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwotCQlza2ItPmgucmF3ICs9IChoZHItPmhkcmxlbiArIDEpIDw8IDM7CisJCW9wdC0+bGFzdG9wdCA9IG9wdC0+c3JjcnQgPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CisJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSAoaGRyLT5oZHJsZW4gKyAxKSA8PCAzOwogCQlvcHQtPmRzdDAgPSBvcHQtPmRzdDE7CiAJCW9wdC0+ZHN0MSA9IDA7Ci0JCW9wdC0+bmhvZmYgPSAoJmhkci0+bmV4dGhkcikgLSBza2ItPm5oLnJhdzsKKwkJb3B0LT5uaG9mZiA9ICgmaGRyLT5uZXh0aGRyKSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTQ1Miw3ICs0NTcsOSBAQAogCQlpZiAoaGRyLT5oZHJsZW4gJiAweDAxKSB7CiAJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Ci0JCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT5oZHJsZW4pIC0gc2tiLT5uaC5yYXcpOworCQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAorCQkJCQkgICgoJmhkci0+aGRybGVuKSAtCisJCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYnJlYWs7CkBAIC00NzksNyArNDg2LDkgQEAKIAlpZiAoaGRyLT5zZWdtZW50c19sZWZ0ID4gbikgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCAoJmhkci0+c2VnbWVudHNfbGVmdCkgLSBza2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgICgoJmhkci0+c2VnbWVudHNfbGVmdCkgLQorCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQ5OCw3ICs1MDcsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJKnNrYnAgPSBza2IgPSBza2IyOwogCQlvcHQgPSBJUDZDQihza2IyKTsKLQkJaGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKSBza2IyLT5oLnJhdzsKKwkJaGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYjIpOwogCX0KIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKQEAgLTUxNCw3ICs1MjMsNyBAQAogI2lmZGVmIENPTkZJR19JUFY2X01JUDYKIAljYXNlIElQVjZfU1JDUlRfVFlQRV8yOgogCQlpZiAoeGZybTZfaW5wdXRfYWRkcihza2IsICh4ZnJtX2FkZHJlc3NfdCAqKWFkZHIsCi0JCQkJICAgICAoeGZybV9hZGRyZXNzX3QgKikmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJICAgICAoeGZybV9hZGRyZXNzX3QgKikmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJICAgICBJUFBST1RPX1JPVVRJTkcpIDwgMCkgewogCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKQEAgLTU0MSwxOSArNTUwLDE5IEBACiAJfQogCiAJaXB2Nl9hZGRyX2NvcHkoJmRhZGRyLCBhZGRyKTsKLQlpcHY2X2FkZHJfY29weShhZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZza2ItPm5oLmlwdjZoLT5kYWRkciwgJmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weShhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZpcHY2X2hkcihza2IpLT5kYWRkciwgJmRhZGRyKTsKIAogCWRzdF9yZWxlYXNlKHhjaGcoJnNrYi0+ZHN0LCBOVUxMKSk7CiAJaXA2X3JvdXRlX2lucHV0KHNrYik7CiAJaWYgKHNrYi0+ZHN0LT5lcnJvcikgewotCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwkJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CiAJCWRzdF9pbnB1dChza2IpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHNrYi0+ZHN0LT5kZXYtPmZsYWdzJklGRl9MT09QQkFDSykgewotCQlpZiAoc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0IDw9IDEpIHsKKwkJaWYgKGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdCA8PSAxKSB7CiAJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9USU1FX0VYQ0VFRCwgSUNNUFY2X0VYQ19IT1BMSU1JVCwKQEAgLTU2MSwxMSArNTcwLDExIEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCQlza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQtLTsKKwkJaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0LS07CiAJCWdvdG8gbG9vcGVkX2JhY2s7CiAJfQogCi0Jc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CiAJZHN0X2lucHV0KHNrYik7CiAJcmV0dXJuIC0xOwogfQpAQCAtNjU2LDEzICs2NjUsMTQgQEAKIHN0YXRpYyBpbnQgaXB2Nl9ob3BfcmEoc3RydWN0IHNrX2J1ZmYgKipza2JwLCBpbnQgb3B0b2ZmKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0JaWYgKHNrYi0+bmgucmF3W29wdG9mZisxXSA9PSAyKSB7CisJaWYgKG5oW29wdG9mZiArIDFdID09IDIpIHsKIAkJSVA2Q0Ioc2tiKS0+cmEgPSBvcHRvZmY7CiAJCXJldHVybiAxOwogCX0KIAlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcHY2X2hvcF9yYTogd3JvbmcgUkEgbGVuZ3RoICVkXG4iLAotCQkgICAgICAgc2tiLT5uaC5yYXdbb3B0b2ZmKzFdKTsKKwkJICAgICAgIG5oW29wdG9mZiArIDFdKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY3MiwyMyArNjgyLDI0IEBACiBzdGF0aWMgaW50IGlwdjZfaG9wX2p1bWJvKHN0cnVjdCBza19idWZmICoqc2ticCwgaW50IG9wdG9mZikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAl1MzIgcGt0X2xlbjsKIAotCWlmIChza2ItPm5oLnJhd1tvcHRvZmYrMV0gIT0gNCB8fCAob3B0b2ZmJjMpICE9IDIpIHsKKwlpZiAobmhbb3B0b2ZmICsgMV0gIT0gNCB8fCAob3B0b2ZmICYgMykgIT0gMikgewogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcHY2X2hvcF9qdW1ibzogd3JvbmcganVtYm8gb3B0IGxlbmd0aC9hbGlnbm1lbnQgJWRcbiIsCi0JCQkgICAgICAgc2tiLT5uaC5yYXdbb3B0b2ZmKzFdKTsKKwkJCSAgICAgICBuaFtvcHRvZmYrMV0pOwogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJZ290byBkcm9wOwogCX0KIAotCXBrdF9sZW4gPSBudG9obCgqKF9fYmUzMiopKHNrYi0+bmgucmF3K29wdG9mZisyKSk7CisJcGt0X2xlbiA9IG50b2hsKCooX19iZTMyICopKG5oICsgb3B0b2ZmICsgMikpOwogCWlmIChwa3RfbGVuIDw9IElQVjZfTUFYUExFTikgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBvcHRvZmYrMik7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pIHsKKwlpZiAoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pIHsKIAkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKTsKIAkJcmV0dXJuIDA7CkBAIC03MjcsMTMgKzczOCwxNCBAQAogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKIAogCS8qCi0JICogc2tiLT5uaC5yYXcgaXMgZXF1YWwgdG8gc2tiLT5kYXRhLCBhbmQKLQkgKiBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcgaXMgYWx3YXlzIGVxdWFsIHRvCisJICogc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgaXMgZXF1YWwgdG8gc2tiLT5kYXRhLCBhbmQKKwkgKiBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikgaXMgYWx3YXlzIGVxdWFsIHRvCiAJICogc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSBieSBkZWZpbml0aW9uIG9mCiAJICogaG9wLWJ5LWhvcCBvcHRpb25zLgogCSAqLwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyA4KSB8fAotCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyAoKHNrYi0+aC5yYXdbMV0gKyAxKSA8PCAzKSkpIHsKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCisJCQkJICgoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKVsxXSArIDEpIDw8IDMpKSkpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC03NDEsNyArNzUzLDcgQEAKIAlvcHQtPmhvcCA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJaWYgKGlwNl9wYXJzZV90bHYodGx2cHJvY2hvcG9wdF9sc3QsIHNrYnApKSB7CiAJCXNrYiA9ICpza2JwOwotCQlza2ItPmgucmF3ICs9IChza2ItPmgucmF3WzFdKzEpPDwzOworCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgKz0gKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzOwogCQlvcHQgPSBJUDZDQihza2IpOwogCQlvcHQtPm5ob2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAkJcmV0dXJuIDE7CkBAIC04MTAsNiArODIyLDggQEAKIAkJaXB2Nl9wdXNoX2V4dGhkcihza2IsIHByb3RvLCBORVhUSERSX0hPUCwgb3B0LT5ob3BvcHQpOwogfQogCitFWFBPUlRfU1lNQk9MKGlwdjZfcHVzaF9uZnJhZ19vcHRzKTsKKwogdm9pZCBpcHY2X3B1c2hfZnJhZ19vcHRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LCB1OCAqcHJvdG8pCiB7CiAJaWYgKG9wdC0+ZHN0MW9wdCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwppbmRleCBlYTMwMzViLi5mYzM4ODJjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKKysrIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIApAQCAtOTUsOCArOTYsMjcgQEAKIAlpZiAodGFibGUpCiAJCXJ0ID0gbG9va3VwKHRhYmxlLCBmbHAsIGZsYWdzKTsKIAotCWlmIChydCAhPSAmaXA2X251bGxfZW50cnkpCisJaWYgKHJ0ICE9ICZpcDZfbnVsbF9lbnRyeSkgeworCQlzdHJ1Y3QgZmliNl9ydWxlICpyID0gKHN0cnVjdCBmaWI2X3J1bGUgKilydWxlOworCisJCS8qCisJCSAqIElmIHdlIG5lZWQgdG8gZmluZCBhIHNvdXJjZSBhZGRyZXNzIGZvciB0aGlzIHRyYWZmaWMsCisJCSAqIHdlIGNoZWNrIHRoZSByZXN1bHQgaWYgaXQgbWVldHMgcmVxdWlyZW1lbnQgb2YgdGhlIHJ1bGUuCisJCSAqLworCQlpZiAoKHJ1bGUtPmZsYWdzICYgRklCX1JVTEVfRklORF9TQUREUikgJiYKKwkJICAgIHItPnNyYy5wbGVuICYmICEoZmxhZ3MgJiBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSKSkgeworCQkJc3RydWN0IGluNl9hZGRyIHNhZGRyOworCQkJaWYgKGlwdjZfZ2V0X3NhZGRyKCZydC0+dS5kc3QsICZmbHAtPmZsNl9kc3QsCisJCQkJCSAgICZzYWRkcikpCisJCQkJZ290byBhZ2FpbjsKKwkJCWlmICghaXB2Nl9wcmVmaXhfZXF1YWwoJnNhZGRyLCAmci0+c3JjLmFkZHIsCisJCQkJCSAgICAgICByLT5zcmMucGxlbikpCisJCQkJZ290byBhZ2FpbjsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmbHAtPmZsNl9zcmMsICZzYWRkcik7CisJCX0KIAkJZ290byBvdXQ7CisJfQorYWdhaW46CiAJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CiAJcnQgPSBOVUxMOwogCWdvdG8gb3V0OwpAQCAtMTE3LDkgKzEzNywxNyBAQAogCSAgICAhaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfZHN0LCAmci0+ZHN0LmFkZHIsIHItPmRzdC5wbGVuKSkKIAkJcmV0dXJuIDA7CiAKKwkvKgorCSAqIElmIEZJQl9SVUxFX0ZJTkRfU0FERFIgaXMgc2V0IGFuZCB3ZSBkbyBub3QgaGF2ZSBhCisJICogc291cmNlIGFkZHJlc3MgZm9yIHRoZSB0cmFmZmljLCB3ZSBkZWZlciBjaGVjayBmb3IKKwkgKiBzb3VyY2UgYWRkcmVzcy4KKwkgKi8KIAlpZiAoci0+c3JjLnBsZW4pIHsKLQkJaWYgKCEoZmxhZ3MgJiBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSKSB8fAotCQkgICAgIWlwdjZfcHJlZml4X2VxdWFsKCZmbC0+Zmw2X3NyYywgJnItPnNyYy5hZGRyLCByLT5zcmMucGxlbikpCisJCWlmIChmbGFncyAmIFJUNl9MT09LVVBfRl9IQVNfU0FERFIpIHsKKwkJCWlmICghaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfc3JjLCAmci0+c3JjLmFkZHIsCisJCQkJCSAgICAgICByLT5zcmMucGxlbikpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoIShyLT5jb21tb24uZmxhZ3MgJiBGSUJfUlVMRV9GSU5EX1NBRERSKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMjE2LDExICsyNDQsNiBAQAogCXJldHVybiAtRU5PQlVGUzsKIH0KIAotaW50IGZpYjZfcnVsZXNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCi17Ci0JcmV0dXJuIGZpYl9ydWxlc19kdW1wKHNrYiwgY2IsIEFGX0lORVQ2KTsKLX0KLQogc3RhdGljIHUzMiBmaWI2X3J1bGVfZGVmYXVsdF9wcmVmKHZvaWQpCiB7CiAJcmV0dXJuIDB4M0ZGRjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCBlZGZlOThiLi5lOWJjY2U5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiBERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpY21wdjZfbWliLCBpY21wdjZfc3RhdGlzdGljcykgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woaWNtcHY2X3N0YXRpc3RpY3MpOwogCiAvKgogICoJVGhlIElDTVAgc29ja2V0KHMpLiBUaGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGZsb3cgY29udHJvbApAQCAtMTI4LDkgKzEyOSw5IEBACiAKIHN0YXRpYyBpbnQgaXNfaW5lbGlnaWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBwdHIgPSAodTgqKShza2ItPm5oLmlwdjZoKzEpIC0gc2tiLT5kYXRhOworCWludCBwdHIgPSAodTggKikoaXB2Nl9oZHIoc2tiKSArIDEpIC0gc2tiLT5kYXRhOwogCWludCBsZW4gPSBza2ItPmxlbiAtIHB0cjsKLQlfX3U4IG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCV9fdTggbmV4dGhkciA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAKIAlpZiAobGVuIDwgMCkKIAkJcmV0dXJuIDE7CkBAIC0yMDUsNyArMjA2LDcgQEAKIHsKIAl1OCBfb3B0dmFsLCAqb3A7CiAKLQlvZmZzZXQgKz0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJb2Zmc2V0ICs9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX29wdHZhbCksICZfb3B0dmFsKTsKIAlpZiAob3AgPT0gTlVMTCkKIAkJcmV0dXJuIDE7CkBAIC0yMjEsNyArMjIyLDcgQEAKIAlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWljbXA2aCA9IChzdHJ1Y3QgaWNtcDZoZHIqKSBza2ItPmgucmF3OworCWljbXA2aCA9IGljbXA2X2hkcihza2IpOwogCW1lbWNweShpY21wNmgsIHRoZHIsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKIAlpY21wNmgtPmljbXA2X2Nrc3VtID0gMDsKIApAQCAtMjc0LDcgKzI3NSw3IEBACiAjaWZkZWYgQ09ORklHX0lQVjZfTUlQNgogc3RhdGljIHZvaWQgbWlwNl9hZGRyX3N3YXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7CiAJc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKmhhbzsKIAlzdHJ1Y3QgaW42X2FkZHIgdG1wOwpAQCAtMjgzLDcgKzI4NCw4IEBACiAJaWYgKG9wdC0+ZHN0aGFvKSB7CiAJCW9mZiA9IGlwdjZfZmluZF90bHYoc2tiLCBvcHQtPmRzdGhhbywgSVBWNl9UTFZfSEFPKTsKIAkJaWYgKGxpa2VseShvZmYgPj0gMCkpIHsKLQkJCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKShza2ItPm5oLnJhdyArIG9mZik7CisJCQloYW8gPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKikKKwkJCQkJKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgb2ZmKTsKIAkJCWlwdjZfYWRkcl9jb3B5KCZ0bXAsICZpcGgtPnNhZGRyKTsKIAkJCWlwdjZfYWRkcl9jb3B5KCZpcGgtPnNhZGRyLCAmaGFvLT5hZGRyKTsKIAkJCWlwdjZfYWRkcl9jb3B5KCZoYW8tPmFkZHIsICZ0bXApOwpAQCAtMzAxLDcgKzMwMyw3IEBACiAJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBOVUxMOwotCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBpcHY2X2hkcihza2IpOwogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnA7CiAJc3RydWN0IGluNl9hZGRyICpzYWRkciA9IE5VTEw7CkBAIC0zMTUsNyArMzE3LDggQEAKIAlpbnQgaGxpbWl0LCB0Y2xhc3M7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoKHU4KiloZHIgPCBza2ItPmhlYWQgfHwgKHU4KikoaGRyKzEpID4gc2tiLT50YWlsKQorCWlmICgodTggKiloZHIgPCBza2ItPmhlYWQgfHwKKwkgICAgKHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2YoKmhkcikpID4gc2tiLT50YWlsKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtNDMwLDcgKzQzMyw3IEBACiAJCXRjbGFzcyA9IDA7CiAKIAltc2cuc2tiID0gc2tiOwotCW1zZy5vZmZzZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwltc2cub2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJbXNnLnR5cGUgPSB0eXBlOwogCiAJbGVuID0gc2tiLT5sZW4gLSBtc2cub2Zmc2V0OwpAQCAtNDY2LDEzICs0NjksMTUgQEAKIAlpY21wdjZfeG1pdF91bmxvY2soKTsKIH0KIAorRVhQT1JUX1NZTUJPTChpY21wdjZfc2VuZCk7CisKIHN0YXRpYyB2b2lkIGljbXB2Nl9lY2hvX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wOwogCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSBOVUxMOwotCXN0cnVjdCBpY21wNmhkciAqaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+aC5yYXc7CisJc3RydWN0IGljbXA2aGRyICppY21waCA9IGljbXA2X2hkcihza2IpOwogCXN0cnVjdCBpY21wNmhkciB0bXBfaGRyOwogCXN0cnVjdCBmbG93aSBmbDsKIAlzdHJ1Y3QgaWNtcHY2X21zZyBtc2c7CkBAIC00ODEsNyArNDg2LDcgQEAKIAlpbnQgaGxpbWl0OwogCWludCB0Y2xhc3M7CiAKLQlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAogCWlmICghaXB2Nl91bmljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCiAJCXNhZGRyID0gTlVMTDsKQEAgLTQ5MSw3ICs0OTYsNyBAQAogCiAJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CiAJZmwucHJvdG8gPSBJUFBST1RPX0lDTVBWNjsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAlpZiAoc2FkZHIpCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCBzYWRkcik7CiAJZmwub2lmID0gc2tiLT5kZXYtPmlmaW5kZXg7CkBAIC01NzksOCArNTg0LDggQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBpbm5lcl9vZmZzZXQrOCkpCiAJCXJldHVybjsKIAotCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOwotCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCXNhZGRyID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOworCWRhZGRyID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJLyogQlVHR0dfRlVUVVJFOiB3ZSBzaG91bGQgdHJ5IHRvIHBhcnNlIGV4dGhkcnMgaW4gdGhpcyBwYWNrZXQuCiAJICAgV2l0aG91dCB0aGlzIHdlIHdpbGwgbm90IGFibGUgZi5lLiB0byBtYWtlIHNvdXJjZSByb3V0ZWQKQEAgLTYyNCw4ICs2MjksOCBAQAogCiAJSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9JTk1TR1MpOwogCi0Jc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJZGFkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAKIAkvKiBQZXJmb3JtIGNoZWNrc3VtLiAqLwogCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKQEAgLTY0Nyw3ICs2NTIsNyBAQAogCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAKLQloZHIgPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+aC5yYXc7CisJaGRyID0gaWNtcDZfaGRyKHNrYik7CiAKIAl0eXBlID0gaGRyLT5pY21wNl90eXBlOwogCkBAIC02NzMsNyArNjc4LDcgQEAKIAkJICovCiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQogCQkJZ290byBkaXNjYXJkX2l0OwotCQloZHIgPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+aC5yYXc7CisJCWhkciA9IGljbXA2X2hkcihza2IpOwogCQlvcmlnX2hkciA9IChzdHJ1Y3QgaXB2NmhkciAqKSAoaGRyICsgMSk7CiAJCXJ0Nl9wbXR1X2Rpc2NvdmVyeSgmb3JpZ19oZHItPmRhZGRyLCAmb3JpZ19oZHItPnNhZGRyLCBkZXYsCiAJCQkJICAgbnRvaGwoaGRyLT5pY21wNl9tdHUpKTsKQEAgLTcyNyw3ICs3MzIsOCBAQAogCQkgKi8KIAogCQlpY21wdjZfbm90aWZ5KHNrYiwgdHlwZSwgaGRyLT5pY21wNl9jb2RlLCBoZHItPmljbXA2X210dSk7Ci0JfTsKKwl9CisKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIApAQCAtODYwLDExICs4NjYsMTMgQEAKIAljYXNlIElDTVBWNl9USU1FX0VYQ0VFRDoKIAkJKmVyciA9IEVIT1NUVU5SRUFDSDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gZmF0YWw7CiB9CiAKK0VYUE9SVF9TWU1CT0woaWNtcHY2X2Vycl9jb252ZXJ0KTsKKwogI2lmZGVmIENPTkZJR19TWVNDVEwKIGN0bF90YWJsZSBpcHY2X2ljbXBfdGFibGVbXSA9IHsKIAl7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggMjY4ZjQ3Ni4uY2EwOGVlOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW50IGluZXQ2X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgaW5ldDZfZHVtcF9maWIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXVuc2lnbmVkIGludCBoLCBzX2g7CiAJdW5zaWduZWQgaW50IGUgPSAwLCBzX2U7CkBAIC0xNDg2LDYgKzE0ODYsOCBAQAogCQkJCQkgICBOVUxMLCBOVUxMKTsKIAogCWZpYjZfdGFibGVzX2luaXQoKTsKKworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVFJPVVRFLCBOVUxMLCBpbmV0Nl9kdW1wX2ZpYik7CiB9CiAKIHZvaWQgZmliNl9nY19jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCmluZGV4IDYxZTdhNmMuLmJlMGVlOGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9pbnB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCkBAIC05NiwxMiArOTYsMTIgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmhkcikpKSkKIAkJZ290byBlcnI7CiAKLQloZHIgPSBza2ItPm5oLmlwdjZoOworCWhkciA9IGlwdjZfaGRyKHNrYik7CiAKIAlpZiAoaGRyLT52ZXJzaW9uICE9IDYpCiAJCWdvdG8gZXJyOwogCi0Jc2tiLT5oLnJhdyA9ICh1OCAqKShoZHIgKyAxKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKCpoZHIpOwogCUlQNkNCKHNrYiktPm5ob2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpOwogCiAJcGt0X2xlbiA9IG50b2hzKGhkci0+cGF5bG9hZF9sZW4pOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJCWdvdG8gZHJvcDsKIAkJfQotCQloZHIgPSBza2ItPm5oLmlwdjZoOworCQloZHIgPSBpcHY2X2hkcihza2IpOwogCX0KIAogCWlmIChoZHItPm5leHRoZHIgPT0gTkVYVEhEUl9IT1ApIHsKQEAgLTE2MCwxMCArMTYwLDEwIEBACiAJcmN1X3JlYWRfbG9jaygpOwogcmVzdWJtaXQ6CiAJaWRldiA9IGlwNl9kc3RfaWRldihza2ItPmRzdCk7Ci0JaWYgKCFwc2tiX3B1bGwoc2tiLCBza2ItPmgucmF3IC0gc2tiLT5kYXRhKSkKKwlpZiAoIXBza2JfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpKQogCQlnb3RvIGRpc2NhcmQ7CiAJbmhvZmYgPSBJUDZDQihza2IpLT5uaG9mZjsKLQluZXh0aGRyID0gc2tiLT5uaC5yYXdbbmhvZmZdOworCW5leHRoZHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKVtuaG9mZl07CiAKIAlyYXdfc2sgPSBza19oZWFkKCZyYXdfdjZfaHRhYmxlW25leHRoZHIgJiAoTUFYX0lORVRfUFJPVE9TIC0gMSldKTsKIAlpZiAocmF3X3NrICYmICFpcHY2X3Jhd19kZWxpdmVyKHNrYiwgbmV4dGhkcikpCkBAIC0xODEsOSArMTgxLDkgQEAKIAkJCSAgIGluZGVmaW5pdGVseS4gKi8KIAkJCW5mX3Jlc2V0KHNrYik7CiAKLQkJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYi0+bmgucmF3LAotCQkJCQkgICBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOwotCQkJaGRyID0gc2tiLT5uaC5pcHY2aDsKKwkJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLAorCQkJCQkgICBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOworCQkJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAkJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZoZHItPmRhZGRyKSAmJgogCQkJICAgICFpcHY2X2Noa19tY2FzdF9hZGRyKHNrYi0+ZGV2LCAmaGRyLT5kYWRkciwKIAkJCSAgICAmaGRyLT5zYWRkcikgJiYKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTk1DQVNUUEtUUyk7CiAKLQloZHIgPSBza2ItPm5oLmlwdjZoOworCWhkciA9IGlwdjZfaGRyKHNrYik7CiAJZGVsaXZlciA9IGxpa2VseSghKHNrYi0+ZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKSkgfHwKIAkgICAgaXB2Nl9jaGtfbWNhc3RfYWRkcihza2ItPmRldiwgJmhkci0+ZGFkZHIsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMzA1NTE2OS4uZjUwODE3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtODgsOCArODgsOCBAQAogLyogZGV2X2xvb3BiYWNrX3htaXQgZm9yIHVzZSB3aXRoIG5ldGZpbHRlci4gKi8KIHN0YXRpYyBpbnQgaXA2X2Rldl9sb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpuZXdza2IpCiB7Ci0JbmV3c2tiLT5tYWMucmF3ID0gbmV3c2tiLT5kYXRhOwotCV9fc2tiX3B1bGwobmV3c2tiLCBuZXdza2ItPm5oLnJhdyAtIG5ld3NrYi0+ZGF0YSk7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIobmV3c2tiKTsKKwlfX3NrYl9wdWxsKG5ld3NrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KG5ld3NrYikpOwogCW5ld3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTE9PUEJBQ0s7CiAJbmV3c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlCVUdfVFJBUChuZXdza2ItPmRzdCk7CkBAIC0xMDcsMTMgKzEwNywxMyBAQAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAlza2ItPmRldiA9IGRldjsKIAotCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZza2ItPm5oLmlwdjZoLT5kYWRkcikpIHsKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpKSB7CiAJCXN0cnVjdCBpcHY2X3BpbmZvKiBucCA9IHNrYi0+c2sgPyBpbmV0Nl9zayhza2ItPnNrKSA6IE5VTEw7CiAJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpOwogCiAJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spICYmICghbnAgfHwgbnAtPm1jX2xvb3ApICYmCi0JCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKGRldiwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJCSZza2ItPm5oLmlwdjZoLT5zYWRkcikpIHsKKwkJICAgIGlwdjZfY2hrX21jYXN0X2FkZHIoZGV2LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSZpcHY2X2hkcihza2IpLT5zYWRkcikpIHsKIAkJCXN0cnVjdCBza19idWZmICpuZXdza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAogCQkJLyogRG8gbm90IGNoZWNrIGZvciBJRkZfQUxMTVVMVEk7IG11bHRpY2FzdCByb3V0aW5nCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCQkJbmV3c2tiLT5kZXYsCiAJCQkJCWlwNl9kZXZfbG9vcGJhY2tfeG1pdCk7CiAKLQkJCWlmIChza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQgPT0gMCkgeworCQkJaWYgKGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdCA9PSAwKSB7CiAJCQkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIDA7CkBAIC0xMzcsOSArMTM3LDE3IEBACiAJcmV0dXJuIE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QT1NUX1JPVVRJTkcsIHNrYixOVUxMLCBza2ItPmRldixpcDZfb3V0cHV0X2ZpbmlzaCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlwNl9za2JfZHN0X210dShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IHNrYi0+c2sgPyBpbmV0Nl9zayhza2ItPnNrKSA6IE5VTEw7CisKKwlyZXR1cm4gKG5wICYmIG5wLT5wbXR1ZGlzYyA9PSBJUFY2X1BNVFVESVNDX1BST0JFKSA/CisJICAgICAgIHNrYi0+ZHN0LT5kZXYtPm10dSA6IGRzdF9tdHUoc2tiLT5kc3QpOworfQorCiBpbnQgaXA2X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICgoc2tiLT5sZW4gPiBkc3RfbXR1KHNrYi0+ZHN0KSAmJiAhc2tiX2lzX2dzbyhza2IpKSB8fAorCWlmICgoc2tiLT5sZW4gPiBpcDZfc2tiX2RzdF9tdHUoc2tiKSAmJiAhc2tiX2lzX2dzbyhza2IpKSB8fAogCQkJCWRzdF9hbGxmcmFnKHNrYi0+ZHN0KSkKIAkJcmV0dXJuIGlwNl9mcmFnbWVudChza2IsIGlwNl9vdXRwdXQyKTsKIAllbHNlCkBAIC0xOTEsNyArMTk5LDkgQEAKIAkJCWlwdjZfcHVzaF9uZnJhZ19vcHRzKHNrYiwgb3B0LCAmcHJvdG8sICZmaXJzdF9ob3ApOwogCX0KIAotCWhkciA9IHNrYi0+bmguaXB2NmggPSAoc3RydWN0IGlwdjZoZHIqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwloZHIgPSBpcHY2X2hkcihza2IpOwogCiAJLyoKIAkgKglGaWxsIGluIHRoZSBJUHY2IGhlYWRlcgpAQCAtMjM5LDYgKzI0OSw4IEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAorRVhQT1JUX1NZTUJPTChpcDZfeG1pdCk7CisKIC8qCiAgKglUbyBhdm9pZCBleHRyYSBwcm9ibGVtcyBORCBwYWNrZXRzIGFyZSBzZW5kIHRocm91Z2ggdGhpcwogICoJcm91dGluZS4gSXQncyBjb2RlIGR1cGxpY2F0aW9uIGJ1dCBJIHJlYWxseSB3YW50IHRvIGF2b2lkCkBAIC0yNTksOCArMjcxLDkgQEAKIAogCXRvdGxlbiA9IGxlbiArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAKLQloZHIgPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotCXNrYi0+bmguaXB2NmggPSBoZHI7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCWhkciA9IGlwdjZfaGRyKHNrYik7CiAKIAkqKF9fYmUzMiopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCk7CiAKQEAgLTMwNSw3ICszMTgsNyBAQAogCiBzdGF0aWMgaW50IGlwNl9mb3J3YXJkX3Byb3h5X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkciA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmhkciA9IGlwdjZfaGRyKHNrYik7CiAJdTggbmV4dGhkciA9IGhkci0+bmV4dGhkcjsKIAlpbnQgb2Zmc2V0OwogCkBAIC0zMTksMTAgKzMzMiwxMSBAQAogCWlmIChuZXh0aGRyID09IElQUFJPVE9fSUNNUFY2KSB7CiAJCXN0cnVjdCBpY21wNmhkciAqaWNtcDY7CiAKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyAxIC0gc2tiLT5kYXRhKSkKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsKKwkJCQkJIG9mZnNldCArIDEgLSBza2ItPmRhdGEpKSkKIAkJCXJldHVybiAwOwogCi0JCWljbXA2ID0gKHN0cnVjdCBpY21wNmhkciAqKShza2ItPm5oLnJhdyArIG9mZnNldCk7CisJCWljbXA2ID0gKHN0cnVjdCBpY21wNmhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIG9mZnNldCk7CiAKIAkJc3dpdGNoIChpY21wNi0+aWNtcDZfdHlwZSkgewogCQljYXNlIE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT046CkBAIC0zNjEsNyArMzc1LDcgQEAKIGludCBpcDZfZm9yd2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OwotCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBpcHY2X2hkcihza2IpOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKIAogCWlmIChpcHY2X2RldmNvbmYuZm9yd2FyZGluZyA9PSAwKQpAQCAtMzcyLDcgKzM4Niw3IEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJc2tiX2ZvcndhcmRfY3N1bShza2IpOwogCiAJLyoKIAkgKglXZSBETyBOT1QgbWFrZSBhbnkgcHJvY2Vzc2luZyBvbgpAQCAtMzg4LDcgKzQwMiw3IEBACiAJICoJdGhhdCBkaWZmZXJlbnQgZnJhZ21lbnRzIHdpbGwgZ28gYWxvbmcgb25lIHBhdGguIC0tQU5LCiAJICovCiAJaWYgKG9wdC0+cmEpIHsKLQkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5yYTsKKwkJdTggKnB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgb3B0LT5yYTsKIAkJaWYgKGlwNl9jYWxsX3JhX2NoYWluKHNrYiwgKHB0clsyXTw8OCkgKyBwdHJbM10pKQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtNDcwLDcgKzQ4NCw3IEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQloZHIgPSBza2ItPm5oLmlwdjZoOworCWhkciA9IGlwdjZfaGRyKHNrYik7CiAKIAkvKiBNYW5nbGluZyBob3BzIG51bWJlciBkZWxheWVkIHRvIHBvaW50IGFmdGVyIHNrYiBDT1cgKi8KIApAQCAtNDk5LDMzICs1MTMsMTggQEAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJdG8tPnRjX2luZGV4ID0gZnJvbS0+dGNfaW5kZXg7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JLyogQ29ubmVjdGlvbiBhc3NvY2lhdGlvbiBpcyBzYW1lIGFzIHByZS1mcmFnIHBhY2tldCAqLwotCW5mX2Nvbm50cmFja19wdXQodG8tPm5mY3QpOwotCXRvLT5uZmN0ID0gZnJvbS0+bmZjdDsKLQluZl9jb25udHJhY2tfZ2V0KHRvLT5uZmN0KTsKLQl0by0+bmZjdGluZm8gPSBmcm9tLT5uZmN0aW5mbzsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCi0JbmZfY29ubnRyYWNrX3B1dF9yZWFzbSh0by0+bmZjdF9yZWFzbSk7Ci0JdG8tPm5mY3RfcmVhc20gPSBmcm9tLT5uZmN0X3JlYXNtOwotCW5mX2Nvbm50cmFja19nZXRfcmVhc20odG8tPm5mY3RfcmVhc20pOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKLQluZl9icmlkZ2VfcHV0KHRvLT5uZl9icmlkZ2UpOwotCXRvLT5uZl9icmlkZ2UgPSBmcm9tLT5uZl9icmlkZ2U7Ci0JbmZfYnJpZGdlX2dldCh0by0+bmZfYnJpZGdlKTsKLSNlbmRpZgotI2VuZGlmCisJbmZfY29weSh0bywgZnJvbSk7CiAJc2tiX2NvcHlfc2VjbWFyayh0bywgZnJvbSk7CiB9CiAKIGludCBpcDZfZmluZF8xc3RmcmFnb3B0KHN0cnVjdCBza19idWZmICpza2IsIHU4ICoqbmV4dGhkcikKIHsKIAl1MTYgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmguaXB2NmggKyAxKTsKLQl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmgucmF3OworCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9CisJCQkJKHN0cnVjdCBpcHY2X29wdF9oZHIgKikoaXB2Nl9oZHIoc2tiKSArIDEpOworCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlpbnQgZm91bmRfcmhkciA9IDA7Ci0JKm5leHRoZHIgPSAmc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwkqbmV4dGhkciA9ICZpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCiAJd2hpbGUgKG9mZnNldCArIDEgPD0gcGFja2V0X2xlbikgewogCkBAIC01NTAsNyArNTQ5LDggQEAKIAogCQlvZmZzZXQgKz0gaXB2Nl9vcHRsZW4oZXh0aGRyKTsKIAkJKm5leHRoZHIgPSAmZXh0aGRyLT5uZXh0aGRyOwotCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKworCQkJCQkJIG9mZnNldCk7CiAJfQogCiAJcmV0dXJuIG9mZnNldDsKQEAgLTU3NCw3ICs1NzQsMjAgQEAKIAlobGVuID0gaXA2X2ZpbmRfMXN0ZnJhZ29wdChza2IsICZwcmV2aGRyKTsKIAluZXh0aGRyID0gKnByZXZoZHI7CiAKLQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCW10dSA9IGlwNl9za2JfZHN0X210dShza2IpOworCisJLyogV2UgbXVzdCBub3QgZnJhZ21lbnQgaWYgdGhlIHNvY2tldCBpcyBzZXQgdG8gZm9yY2UgTVRVIGRpc2NvdmVyeQorCSAqIG9yIGlmIHRoZSBza2IgaXQgbm90IGdlbmVyYXRlZCBieSBhIGxvY2FsIHNvY2tldC4gIChUaGlzIGxhc3QKKwkgKiBjaGVjayBzaG91bGQgYmUgcmVkdW5kYW50LCBidXQgaXQncyBmcmVlLikKKwkgKi8KKwlpZiAoIW5wIHx8IG5wLT5wbXR1ZGlzYyA+PSBJUFY2X1BNVFVESVNDX0RPKSB7CisJCXNrYi0+ZGV2ID0gc2tiLT5kc3QtPmRldjsKKwkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1LCBza2ItPmRldik7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCiAJaWYgKG5wICYmIG5wLT5mcmFnX3NpemUgPCBtdHUpIHsKIAkJaWYgKG5wLT5mcmFnX3NpemUpCiAJCQltdHUgPSBucC0+ZnJhZ19zaXplOwpAQCAtNjE2LDcgKzYyOSw3IEBACiAJCS8qIEJVSUxEIEhFQURFUiAqLwogCiAJCSpwcmV2aGRyID0gTkVYVEhEUl9GUkFHTUVOVDsKLQkJdG1wX2hkciA9IGttZW1kdXAoc2tiLT5uaC5yYXcsIGhsZW4sIEdGUF9BVE9NSUMpOworCQl0bXBfaGRyID0ga21lbWR1cChza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdG1wX2hkcikgewogCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC02MjQsOCArNjM3LDkgQEAKIAogCQlfX3NrYl9wdWxsKHNrYiwgaGxlbik7CiAJCWZoID0gKHN0cnVjdCBmcmFnX2hkciopX19za2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKLQkJc2tiLT5uaC5yYXcgPSBfX3NrYl9wdXNoKHNrYiwgaGxlbik7Ci0JCW1lbWNweShza2ItPm5oLnJhdywgdG1wX2hkciwgaGxlbik7CisJCV9fc2tiX3B1c2goc2tiLCBobGVuKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJCW1lbWNweShza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgdG1wX2hkciwgaGxlbik7CiAKIAkJaXB2Nl9zZWxlY3RfaWRlbnQoc2tiLCBmaCk7CiAJCWZoLT5uZXh0aGRyID0gbmV4dGhkcjsKQEAgLTYzNiw3ICs2NTAsOCBAQAogCQlmaXJzdF9sZW4gPSBza2JfcGFnZWxlbihza2IpOwogCQlza2ItPmRhdGFfbGVuID0gZmlyc3RfbGVuIC0gc2tiX2hlYWRsZW4oc2tiKTsKIAkJc2tiLT5sZW4gPSBmaXJzdF9sZW47Ci0JCXNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoZmlyc3RfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gaHRvbnMoZmlyc3RfbGVuIC0KKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCiAJCWRzdF9ob2xkKCZydC0+dS5kc3QpOwogCkBAIC02NDUsMTAgKzY2MCwxMiBAQAogCQkJICogYmVmb3JlIHByZXZpb3VzIG9uZSB3ZW50IGRvd24uICovCiAJCQlpZiAoZnJhZykgewogCQkJCWZyYWctPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCQkJZnJhZy0+aC5yYXcgPSBmcmFnLT5kYXRhOworCQkJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKGZyYWcpOwogCQkJCWZoID0gKHN0cnVjdCBmcmFnX2hkciopX19za2JfcHVzaChmcmFnLCBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7Ci0JCQkJZnJhZy0+bmgucmF3ID0gX19za2JfcHVzaChmcmFnLCBobGVuKTsKLQkJCQltZW1jcHkoZnJhZy0+bmgucmF3LCB0bXBfaGRyLCBobGVuKTsKKwkJCQlfX3NrYl9wdXNoKGZyYWcsIGhsZW4pOworCQkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihmcmFnKTsKKwkJCQltZW1jcHkoc2tiX25ldHdvcmtfaGVhZGVyKGZyYWcpLCB0bXBfaGRyLAorCQkJCSAgICAgICBobGVuKTsKIAkJCQlvZmZzZXQgKz0gc2tiLT5sZW4gLSBobGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CiAJCQkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOwogCQkJCWZoLT5yZXNlcnZlZCA9IDA7CkBAIC02NTYsNyArNjczLDkgQEAKIAkJCQlpZiAoZnJhZy0+bmV4dCAhPSBOVUxMKQogCQkJCQlmaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVA2X01GKTsKIAkJCQlmaC0+aWRlbnRpZmljYXRpb24gPSBmcmFnX2lkOwotCQkJCWZyYWctPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZyYWctPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJCWlwdjZfaGRyKGZyYWcpLT5wYXlsb2FkX2xlbiA9CisJCQkJCQlodG9ucyhmcmFnLT5sZW4gLQorCQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCQkJaXA2X2NvcHlfbWV0YWRhdGEoZnJhZywgc2tiKTsKIAkJCX0KIApAQCAtNzMzLDkgKzc1MiwxMCBAQAogCQlpcDZfY29weV9tZXRhZGF0YShmcmFnLCBza2IpOwogCQlza2JfcmVzZXJ2ZShmcmFnLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+dS5kc3QuZGV2KSk7CiAJCXNrYl9wdXQoZnJhZywgbGVuICsgaGxlbiArIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKLQkJZnJhZy0+bmgucmF3ID0gZnJhZy0+ZGF0YTsKLQkJZmggPSAoc3RydWN0IGZyYWdfaGRyKikoZnJhZy0+ZGF0YSArIGhsZW4pOwotCQlmcmFnLT5oLnJhdyA9IGZyYWctPmRhdGEgKyBobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihmcmFnKTsKKwkJZmggPSAoc3RydWN0IGZyYWdfaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihmcmFnKSArIGhsZW4pOworCQlmcmFnLT50cmFuc3BvcnRfaGVhZGVyID0gKGZyYWctPm5ldHdvcmtfaGVhZGVyICsgaGxlbiArCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpOwogCiAJCS8qCiAJCSAqCUNoYXJnZSB0aGUgbWVtb3J5IGZvciB0aGUgZnJhZ21lbnQgdG8gYW55IG93bmVyCkBAIC03NDcsNyArNzY3LDcgQEAKIAkJLyoKIAkJICoJQ29weSB0aGUgcGFja2V0IGhlYWRlciBpbnRvIHRoZSBuZXcgYnVmZmVyLgogCQkgKi8KLQkJbWVtY3B5KGZyYWctPm5oLnJhdywgc2tiLT5kYXRhLCBobGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihmcmFnKSwgaGxlbik7CiAKIAkJLyoKIAkJICoJQnVpbGQgZnJhZ21lbnQgaGVhZGVyLgpAQCAtNzYzLDE0ICs3ODMsMTUgQEAKIAkJLyoKIAkJICoJQ29weSBhIGJsb2NrIG9mIHRoZSBJUCBkYXRhZ3JhbS4KIAkJICovCi0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgcHRyLCBmcmFnLT5oLnJhdywgbGVuKSkKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBwdHIsIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIGxlbikpCiAJCQlCVUcoKTsKIAkJbGVmdCAtPSBsZW47CiAKIAkJZmgtPmZyYWdfb2ZmID0gaHRvbnMob2Zmc2V0KTsKIAkJaWYgKGxlZnQgPiAwKQogCQkJZmgtPmZyYWdfb2ZmIHw9IGh0b25zKElQNl9NRik7Ci0JCWZyYWctPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZyYWctPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQlpcHY2X2hkcihmcmFnKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhmcmFnLT5sZW4gLQorCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCiAJCXB0ciArPSBsZW47CiAJCW9mZnNldCArPSBsZW47CkBAIC04NjEsNiArODgyLDQxIEBACiAJCQlnb3RvIG91dF9lcnJfcmVsZWFzZTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAorCQkvKgorCQkgKiBIZXJlIGlmIHRoZSBkc3QgZW50cnkgd2UndmUgbG9va2VkIHVwCisJCSAqIGhhcyBhIG5laWdoYm91ciBlbnRyeSB0aGF0IGlzIGluIHRoZSBJTkNPTVBMRVRFCisJCSAqIHN0YXRlIGFuZCB0aGUgc3JjIGFkZHJlc3MgZnJvbSB0aGUgZmxvdyBpcworCQkgKiBtYXJrZWQgYXMgT1BUSU1JU1RJQywgd2UgcmVsZWFzZSB0aGUgZm91bmQKKwkJICogZHN0IGVudHJ5IGFuZCByZXBsYWNlIGl0IGluc3RlYWQgd2l0aCB0aGUKKwkJICogZHN0IGVudHJ5IG9mIHRoZSBuZXh0aG9wIHJvdXRlcgorCQkgKi8KKwkJaWYgKCEoKCpkc3QpLT5uZWlnaGJvdXItPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKKwkJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwkJCXN0cnVjdCBmbG93aSBmbF9ndzsKKwkJCWludCByZWRpcmVjdDsKKworCQkJaWZwID0gaXB2Nl9nZXRfaWZhZGRyKCZmbC0+Zmw2X3NyYywgKCpkc3QpLT5kZXYsIDEpOworCisJCQlyZWRpcmVjdCA9IChpZnAgJiYgaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpOworCQkJaWYgKGlmcCkKKwkJCQlpbjZfaWZhX3B1dChpZnApOworCisJCQlpZiAocmVkaXJlY3QpIHsKKwkJCQkvKgorCQkJCSAqIFdlIG5lZWQgdG8gZ2V0IHRoZSBkc3QgZW50cnkgZm9yIHRoZQorCQkJCSAqIGRlZmF1bHQgcm91dGVyIGluc3RlYWQKKwkJCQkgKi8KKwkJCQlkc3RfcmVsZWFzZSgqZHN0KTsKKwkJCQltZW1jcHkoJmZsX2d3LCBmbCwgc2l6ZW9mKHN0cnVjdCBmbG93aSkpOworCQkJCW1lbXNldCgmZmxfZ3cuZmw2X2RzdCwgMCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJCSpkc3QgPSBpcDZfcm91dGVfb3V0cHV0KHNrLCAmZmxfZ3cpOworCQkJCWlmICgoZXJyID0gKCpkc3QpLT5lcnJvcikpCisJCQkJCWdvdG8gb3V0X2Vycl9yZWxlYXNlOworCQkJfQorCQl9CisjZW5kaWYKKwogCXJldHVybiAwOwogCiBvdXRfZXJyX3JlbGVhc2U6CkBAIC05MzksMTAgKzk5NSwxMCBAQAogCQlza2JfcHV0KHNrYixmcmFnaGVhZGVybGVuICsgdHJhbnNoZHJsZW4pOwogCiAJCS8qIGluaXRpYWxpemUgbmV0d29yayBoZWFkZXIgcG9pbnRlciAqLwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkJLyogaW5pdGlhbGl6ZSBwcm90b2NvbCBoZWFkZXIgcG9pbnRlciAqLwotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgZnJhZ2hlYWRlcmxlbjsKKwkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlciArIGZyYWdoZWFkZXJsZW47CiAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCQlza2ItPmNzdW0gPSAwOwpAQCAtMTAxNSw3ICsxMDcxLDggQEAKIAkJaW5ldC0+Y29yay5mbCA9ICpmbDsKIAkJbnAtPmNvcmsuaG9wX2xpbWl0ID0gaGxpbWl0OwogCQlucC0+Y29yay50Y2xhc3MgPSB0Y2xhc3M7Ci0JCW10dSA9IGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOworCQltdHUgPSBucC0+cG10dWRpc2MgPT0gSVBWNl9QTVRVRElTQ19QUk9CRSA/CisJCSAgICAgIHJ0LT51LmRzdC5kZXYtPm10dSA6IGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOwogCQlpZiAobnAtPmZyYWdfc2l6ZSA8IG10dSkgewogCQkJaWYgKG5wLT5mcmFnX3NpemUpCiAJCQkJbXR1ID0gbnAtPmZyYWdfc2l6ZTsKQEAgLTExNjIsMTAgKzEyMTksMTAgQEAKIAkJCSAqCUZpbmQgd2hlcmUgdG8gc3RhcnQgcHV0dGluZyBieXRlcwogCQkJICovCiAJCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdsZW4pOwotCQkJc2tiLT5uaC5yYXcgPSBkYXRhICsgZXh0aGRybGVuOworCQkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIGV4dGhkcmxlbik7CiAJCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47Ci0JCQlza2ItPmgucmF3ID0gZGF0YSArIGV4dGhkcmxlbjsKLQorCQkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgKworCQkJCQkJIGZyYWdoZWFkZXJsZW4pOwogCQkJaWYgKGZyYWdnYXApIHsKIAkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKAogCQkJCQlza2JfcHJldiwgbWF4ZnJhZ2xlbiwKQEAgLTEyODgsMTAgKzEzNDUsMTAgQEAKIAl0YWlsX3NrYiA9ICYoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpOwogCiAJLyogbW92ZSBza2ItPmRhdGEgdG8gaXAgaGVhZGVyIGZyb20gZXh0IGhlYWRlciAqLwotCWlmIChza2ItPmRhdGEgPCBza2ItPm5oLnJhdykKLQkJX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlpZiAoc2tiLT5kYXRhIDwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpCisJCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJd2hpbGUgKCh0bXBfc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewotCQlfX3NrYl9wdWxsKHRtcF9za2IsIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7CisJCV9fc2tiX3B1bGwodG1wX3NrYiwgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKIAkJKnRhaWxfc2tiID0gdG1wX3NrYjsKIAkJdGFpbF9za2IgPSAmKHRtcF9za2ItPm5leHQpOwogCQlza2ItPmxlbiArPSB0bXBfc2tiLT5sZW47CkBAIC0xMzAzLDEzICsxMzYwLDE1IEBACiAJfQogCiAJaXB2Nl9hZGRyX2NvcHkoZmluYWxfZHN0LCAmZmwtPmZsNl9kc3QpOwotCV9fc2tiX3B1bGwoc2tiLCBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOwogCWlmIChvcHQgJiYgb3B0LT5vcHRfZmxlbikKIAkJaXB2Nl9wdXNoX2ZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvKTsKIAlpZiAob3B0ICYmIG9wdC0+b3B0X25mbGVuKQogCQlpcHY2X3B1c2hfbmZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvLCAmZmluYWxfZHN0KTsKIAotCXNrYi0+bmguaXB2NmggPSBoZHIgPSAoc3RydWN0IGlwdjZoZHIqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAogCSooX19iZTMyKiloZHIgPSBmbC0+Zmw2X2Zsb3dsYWJlbCB8CiAJCSAgICAgaHRvbmwoMHg2MDAwMDAwMCB8ICgoaW50KW5wLT5jb3JrLnRjbGFzcyA8PCAyMCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IDA4ZDk0NDIuLmEwOTAyZmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTEsMTQgKzEsMTUgQEAKIC8qCi0gKglJUHY2IG92ZXIgSVB2NiB0dW5uZWwgZGV2aWNlCisgKglJUHY2IHR1bm5lbGluZyBkZXZpY2UKICAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uCiAgKgogICoJQXV0aG9yczoKICAqCVZpbGxlIE51b3J2YWxhCQk8dm51b3J2YWxAdGNzLmh1dC5maT4KKyAqCVlhc3V5dWtpIEtvemFrYWkJPGtvemFrYWlAbGludXgtaXB2Ni5vcmc+CiAgKgogICoJJElkJAogICoKICAqICAgICAgQmFzZWQgb246Ci0gKiAgICAgIGxpbnV4L25ldC9pcHY2L3NpdC5jCisgKiAgICAgIGxpbnV4L25ldC9pcHY2L3NpdC5jIGFuZCBsaW51eC9uZXQvaXB2NC9pcGlwLmMKICAqCiAgKiAgICAgIFJGQyAyNDczCiAgKgpAQCAtMjQsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgpAQCAtNDEsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KQEAgLTUxLDcgKzU0LDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KIAogTU9EVUxFX0FVVEhPUigiVmlsbGUgTnVvcnZhbGEiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVB2Ni1pbi1JUHY2IHR1bm5lbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IHR1bm5lbGluZyBkZXZpY2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBJUFY2X1RMVl9URUxfRFNUX1NJWkUgOApAQCAtNjMsNiArNjYsNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgSVBWNl9UQ0xBU1NfTUFTSyAoSVBWNl9GTE9XSU5GT19NQVNLICYgfklQVjZfRkxPV0xBQkVMX01BU0spCisjZGVmaW5lIElQVjZfVENMQVNTX1NISUZUIDIwCiAKICNkZWZpbmUgSEFTSF9TSVpFICAzMgogCkBAIC03MCwxMiArNzQsMTIgQEAKIAkJICAgICAoYWRkciktPnM2X2FkZHIzMlsyXSBeIChhZGRyKS0+czZfYWRkcjMyWzNdKSAmIFwKIAkJICAgIChIQVNIX1NJWkUgLSAxKSkKIAotc3RhdGljIGludCBpcDZpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBpcDZpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgaXA2aXA2X3RubF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlwNl9mYl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcDZfdG5sX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogLyogdGhlIElQdjYgdHVubmVsIGZhbGxiYWNrIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppcDZpcDZfZmJfdG5sX2RldjsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXA2X2ZiX3RubF9kZXY7CiAKIAogLyogbGlzdHMgZm9yIHN0b3JpbmcgdHVubmVscyBpbiB1c2UgKi8KQEAgLTg0LDcgKzg4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqKnRubHNbMl0gPSB7IHRubHNfd2MsIHRubHNfcl9sIH07CiAKIC8qIGxvY2sgZm9yIHRoZSB0dW5uZWwgbGlzdHMgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKGlwNmlwNl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwNl90bmxfbG9jayk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRzdF9lbnRyeSAqaXA2X3RubF9kc3RfY2hlY2soc3RydWN0IGlwNl90bmwgKnQpCiB7CkBAIC0xMTUsNyArMTE5LDcgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2xvb2t1cCAtIGZldGNoIHR1bm5lbCBtYXRjaGluZyB0aGUgZW5kLXBvaW50IGFkZHJlc3NlcworICogaXA2X3RubF9sb29rdXAgLSBmZXRjaCB0dW5uZWwgbWF0Y2hpbmcgdGhlIGVuZC1wb2ludCBhZGRyZXNzZXMKICAqICAgQHJlbW90ZTogdGhlIGFkZHJlc3Mgb2YgdGhlIHR1bm5lbCBleGl0LXBvaW50CiAgKiAgIEBsb2NhbDogdGhlIGFkZHJlc3Mgb2YgdGhlIHR1bm5lbCBlbnRyeS1wb2ludAogICoKQEAgLTEyNiw3ICsxMzAsNyBAQAogICoqLwogCiBzdGF0aWMgc3RydWN0IGlwNl90bmwgKgotaXA2aXA2X3RubF9sb29rdXAoc3RydWN0IGluNl9hZGRyICpyZW1vdGUsIHN0cnVjdCBpbjZfYWRkciAqbG9jYWwpCitpcDZfdG5sX2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSwgc3RydWN0IGluNl9hZGRyICpsb2NhbCkKIHsKIAl1bnNpZ25lZCBoMCA9IEhBU0gocmVtb3RlKTsKIAl1bnNpZ25lZCBoMSA9IEhBU0gobG9jYWwpOwpAQCAtMTQ1LDE4ICsxNDksMTggQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfYnVja2V0IC0gZ2V0IGhlYWQgb2YgbGlzdCBtYXRjaGluZyBnaXZlbiB0dW5uZWwgcGFyYW1ldGVycworICogaXA2X3RubF9idWNrZXQgLSBnZXQgaGVhZCBvZiBsaXN0IG1hdGNoaW5nIGdpdmVuIHR1bm5lbCBwYXJhbWV0ZXJzCiAgKiAgIEBwOiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdHVubmVsIGVuZC1wb2ludHMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgaXA2aXA2X2J1Y2tldCgpIHJldHVybnMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgbWF0Y2hpbmcgdGhlCisgKiAgIGlwNl90bmxfYnVja2V0KCkgcmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBtYXRjaGluZyB0aGUKICAqICAgJnN0cnVjdCBpbjZfYWRkciBlbnRyaWVzIGxhZGRyIGFuZCByYWRkciBpbiBAcC4KICAqCiAgKiBSZXR1cm46IGhlYWQgb2YgSVB2NiB0dW5uZWwgbGlzdAogICoqLwogCiBzdGF0aWMgc3RydWN0IGlwNl90bmwgKioKLWlwNmlwNl9idWNrZXQoc3RydWN0IGlwNl90bmxfcGFybSAqcCkKK2lwNl90bmxfYnVja2V0KHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnApCiB7CiAJc3RydWN0IGluNl9hZGRyICpyZW1vdGUgPSAmcC0+cmFkZHI7CiAJc3RydWN0IGluNl9hZGRyICpsb2NhbCA9ICZwLT5sYWRkcjsKQEAgLTE3MSwzNiArMTc1LDM2IEBACiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9saW5rIC0gYWRkIHR1bm5lbCB0byBoYXNoIHRhYmxlCisgKiBpcDZfdG5sX2xpbmsgLSBhZGQgdHVubmVsIHRvIGhhc2ggdGFibGUKICAqICAgQHQ6IHR1bm5lbCB0byBiZSBhZGRlZAogICoqLwogCiBzdGF0aWMgdm9pZAotaXA2aXA2X3RubF9saW5rKHN0cnVjdCBpcDZfdG5sICp0KQoraXA2X3RubF9saW5rKHN0cnVjdCBpcDZfdG5sICp0KQogewotCXN0cnVjdCBpcDZfdG5sICoqdHAgPSBpcDZpcDZfYnVja2V0KCZ0LT5wYXJtcyk7CisJc3RydWN0IGlwNl90bmwgKip0cCA9IGlwNl90bmxfYnVja2V0KCZ0LT5wYXJtcyk7CiAKIAl0LT5uZXh0ID0gKnRwOwotCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwl3cml0ZV9sb2NrX2JoKCZpcDZfdG5sX2xvY2spOwogCSp0cCA9IHQ7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcDZpcDZfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZpcDZfdG5sX2xvY2spOwogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfdW5saW5rIC0gcmVtb3ZlIHR1bm5lbCBmcm9tIGhhc2ggdGFibGUKKyAqIGlwNl90bmxfdW5saW5rIC0gcmVtb3ZlIHR1bm5lbCBmcm9tIGhhc2ggdGFibGUKICAqICAgQHQ6IHR1bm5lbCB0byBiZSByZW1vdmVkCiAgKiovCiAKIHN0YXRpYyB2b2lkCi1pcDZpcDZfdG5sX3VubGluayhzdHJ1Y3QgaXA2X3RubCAqdCkKK2lwNl90bmxfdW5saW5rKHN0cnVjdCBpcDZfdG5sICp0KQogewogCXN0cnVjdCBpcDZfdG5sICoqdHA7CiAKLQlmb3IgKHRwID0gaXA2aXA2X2J1Y2tldCgmdC0+cGFybXMpOyAqdHA7IHRwID0gJigqdHApLT5uZXh0KSB7CisJZm9yICh0cCA9IGlwNl90bmxfYnVja2V0KCZ0LT5wYXJtcyk7ICp0cDsgdHAgPSAmKCp0cCktPm5leHQpIHsKIAkJaWYgKHQgPT0gKnRwKSB7Ci0JCQl3cml0ZV9sb2NrX2JoKCZpcDZpcDZfbG9jayk7CisJCQl3cml0ZV9sb2NrX2JoKCZpcDZfdG5sX2xvY2spOwogCQkJKnRwID0gdC0+bmV4dDsKLQkJCXdyaXRlX3VubG9ja19iaCgmaXA2aXA2X2xvY2spOworCQkJd3JpdGVfdW5sb2NrX2JoKCZpcDZfdG5sX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yMzcsMTIgKzI0MSwxMiBAQAogCQlpZiAoaSA9PSBJUDZfVE5MX01BWCkKIAkJCWdvdG8gZmFpbGVkOwogCX0KLQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mICgqdCksIG5hbWUsIGlwNmlwNl90bmxfZGV2X3NldHVwKTsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mICgqdCksIG5hbWUsIGlwNl90bmxfZGV2X3NldHVwKTsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCWdvdG8gZmFpbGVkOwogCiAJdCA9IG5ldGRldl9wcml2KGRldik7Ci0JZGV2LT5pbml0ID0gaXA2aXA2X3RubF9kZXZfaW5pdDsKKwlkZXYtPmluaXQgPSBpcDZfdG5sX2Rldl9pbml0OwogCXQtPnBhcm1zID0gKnA7CiAKIAlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpKSA8IDApIHsKQEAgLTI1MCwxOSArMjU0LDE5IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAlkZXZfaG9sZChkZXYpOwotCWlwNmlwNl90bmxfbGluayh0KTsKKwlpcDZfdG5sX2xpbmsodCk7CiAJcmV0dXJuIHQ7CiBmYWlsZWQ6CiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9sb2NhdGUgLSBmaW5kIG9yIGNyZWF0ZSB0dW5uZWwgbWF0Y2hpbmcgZ2l2ZW4gcGFyYW1ldGVycworICogaXA2X3RubF9sb2NhdGUgLSBmaW5kIG9yIGNyZWF0ZSB0dW5uZWwgbWF0Y2hpbmcgZ2l2ZW4gcGFyYW1ldGVycwogICogICBAcDogdHVubmVsIHBhcmFtZXRlcnMKICAqICAgQGNyZWF0ZTogIT0gMCBpZiBhbGxvd2VkIHRvIGNyZWF0ZSBuZXcgdHVubmVsIGlmIG5vIG1hdGNoIGZvdW5kCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIGlwNmlwNl90bmxfbG9jYXRlKCkgZmlyc3QgdHJpZXMgdG8gbG9jYXRlIGFuIGV4aXN0aW5nIHR1bm5lbAorICogICBpcDZfdG5sX2xvY2F0ZSgpIGZpcnN0IHRyaWVzIHRvIGxvY2F0ZSBhbiBleGlzdGluZyB0dW5uZWwKICAqICAgYmFzZWQgb24gQHBhcm1zLiBJZiB0aGlzIGlzIHVuc3VjY2Vzc2Z1bCwgYnV0IEBjcmVhdGUgaXMgc2V0IGEgbmV3CiAgKiAgIHR1bm5lbCBkZXZpY2UgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBmb3IgdXNlLgogICoKQEAgLTI3MCwxMyArMjc0LDEzIEBACiAgKiAgIG1hdGNoaW5nIHR1bm5lbCBvciBOVUxMCiAgKiovCiAKLXN0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqaXA2aXA2X3RubF9sb2NhdGUoc3RydWN0IGlwNl90bmxfcGFybSAqcCwgaW50IGNyZWF0ZSkKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqaXA2X3RubF9sb2NhdGUoc3RydWN0IGlwNl90bmxfcGFybSAqcCwgaW50IGNyZWF0ZSkKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSA9ICZwLT5yYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIgKmxvY2FsID0gJnAtPmxhZGRyOwogCXN0cnVjdCBpcDZfdG5sICp0OwogCi0JZm9yICh0ID0gKmlwNmlwNl9idWNrZXQocCk7IHQ7IHQgPSB0LT5uZXh0KSB7CisJZm9yICh0ID0gKmlwNl90bmxfYnVja2V0KHApOyB0OyB0ID0gdC0+bmV4dCkgewogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKGxvY2FsLCAmdC0+cGFybXMubGFkZHIpICYmCiAJCSAgICBpcHY2X2FkZHJfZXF1YWwocmVtb3RlLCAmdC0+cGFybXMucmFkZHIpKQogCQkJcmV0dXJuIHQ7CkBAIC0yODcsMjQgKzI5MSwyNCBAQAogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfZGV2X3VuaW5pdCAtIHR1bm5lbCBkZXZpY2UgdW5pbml0aWFsaXplcgorICogaXA2X3RubF9kZXZfdW5pbml0IC0gdHVubmVsIGRldmljZSB1bmluaXRpYWxpemVyCiAgKiAgIEBkZXY6IHRoZSBkZXZpY2UgdG8gYmUgZGVzdHJveWVkCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIGlwNmlwNl90bmxfZGV2X3VuaW5pdCgpIHJlbW92ZXMgdHVubmVsIGZyb20gaXRzIGxpc3QKKyAqICAgaXA2X3RubF9kZXZfdW5pbml0KCkgcmVtb3ZlcyB0dW5uZWwgZnJvbSBpdHMgbGlzdAogICoqLwogCiBzdGF0aWMgdm9pZAotaXA2aXA2X3RubF9kZXZfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpcDZfdG5sX2Rldl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KSB7Ci0JCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwlpZiAoZGV2ID09IGlwNl9mYl90bmxfZGV2KSB7CisJCXdyaXRlX2xvY2tfYmgoJmlwNl90bmxfbG9jayk7CiAJCXRubHNfd2NbMF0gPSBOVUxMOwotCQl3cml0ZV91bmxvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpcDZfdG5sX2xvY2spOwogCX0gZWxzZSB7Ci0JCWlwNmlwNl90bmxfdW5saW5rKHQpOworCQlpcDZfdG5sX3VubGluayh0KTsKIAl9CiAJaXA2X3RubF9kc3RfcmVzZXQodCk7CiAJZGV2X3B1dChkZXYpOwpAQCAtMzcyLDE2ICszNzYsMTYgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfZXJyIC0gdHVubmVsIGVycm9yIGhhbmRsZXIKKyAqIGlwNl90bmxfZXJyIC0gdHVubmVsIGVycm9yIGhhbmRsZXIKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgaXA2aXA2X2VycigpIHNob3VsZCBoYW5kbGUgZXJyb3JzIGluIHRoZSB0dW5uZWwgYWNjb3JkaW5nCisgKiAgIGlwNl90bmxfZXJyKCkgc2hvdWxkIGhhbmRsZSBlcnJvcnMgaW4gdGhlIHR1bm5lbCBhY2NvcmRpbmcKICAqICAgdG8gdGhlIHNwZWNpZmljYXRpb25zIGluIFJGQyAyNDczLgogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCSAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCitpcDZfdG5sX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4IGlwcHJvdG8sIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAorCSAgICBpbnQgKnR5cGUsIGludCAqY29kZSwgaW50ICptc2csIF9fYmUzMiAqaW5mbywgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBpcDZfdG5sICp0OwpAQCAtMzk2LDEzICs0MDAsMTYgQEAKIAkgICBpbiB0cm91YmxlIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciBmdXJ0aGVyCiAJICAgcHJvY2Vzc2luZyBvZiB0aGUgZXJyb3IuICovCiAKLQlyZWFkX2xvY2soJmlwNmlwNl9sb2NrKTsKLQlpZiAoKHQgPSBpcDZpcDZfdG5sX2xvb2t1cCgmaXB2NmgtPmRhZGRyLCAmaXB2NmgtPnNhZGRyKSkgPT0gTlVMTCkKKwlyZWFkX2xvY2soJmlwNl90bmxfbG9jayk7CisJaWYgKCh0ID0gaXA2X3RubF9sb29rdXAoJmlwdjZoLT5kYWRkciwgJmlwdjZoLT5zYWRkcikpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKHQtPnBhcm1zLnByb3RvICE9IGlwcHJvdG8gJiYgdC0+cGFybXMucHJvdG8gIT0gMCkKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAwOwogCi0Jc3dpdGNoICh0eXBlKSB7CisJc3dpdGNoICgqdHlwZSkgewogCQlfX3UzMiB0ZWxpOwogCQlzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKnRlbDsKIAkJX191MzIgbXR1OwpAQCAtNDE0LDcgKzQyMSw3IEBACiAJCXJlbF9tc2cgPSAxOwogCQlicmVhazsKIAljYXNlIElDTVBWNl9USU1FX0VYQ0VFRDoKLQkJaWYgKGNvZGUgPT0gSUNNUFY2X0VYQ19IT1BMSU1JVCkgeworCQlpZiAoKCpjb2RlKSA9PSBJQ01QVjZfRVhDX0hPUExJTUlUKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkgICAgICAgIiVzOiBUb28gc21hbGwgaG9wIGxpbWl0IG9yICIKQEAgLTQyNSwxMCArNDMyLDEwIEBACiAJCWJyZWFrOwogCWNhc2UgSUNNUFY2X1BBUkFNUFJPQjoKIAkJdGVsaSA9IDA7Ci0JCWlmIChjb2RlID09IElDTVBWNl9IRFJfRklFTEQpCisJCWlmICgoKmNvZGUpID09IElDTVBWNl9IRFJfRklFTEQpCiAJCQl0ZWxpID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiLT5kYXRhKTsKIAotCQlpZiAodGVsaSAmJiB0ZWxpID09IG50b2hsKGluZm8pIC0gMikgeworCQlpZiAodGVsaSAmJiB0ZWxpID09IG50b2hsKCppbmZvKSAtIDIpIHsKIAkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+ZGF0YVt0ZWxpXTsKIAkJCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKIAkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtNDQ1LDcgKzQ1Miw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKLQkJbXR1ID0gbnRvaGwoaW5mbykgLSBvZmZzZXQ7CisJCW10dSA9IG50b2hsKCppbmZvKSAtIG9mZnNldDsKIAkJaWYgKG10dSA8IElQVjZfTUlOX01UVSkKIAkJCW10dSA9IElQVjZfTUlOX01UVTsKIAkJdC0+ZGV2LT5tdHUgPSBtdHU7CkBAIC00NTgsMjAgKzQ2NSwxNDQgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0JaWYgKHJlbF9tc2cgJiYgIHBza2JfbWF5X3B1bGwoc2tiLCBvZmZzZXQgKyBzaXplb2YgKCppcHY2aCkpKSB7CisKKwkqdHlwZSA9IHJlbF90eXBlOworCSpjb2RlID0gcmVsX2NvZGU7CisJKmluZm8gPSByZWxfaW5mbzsKKwkqbXNnID0gcmVsX21zZzsKKworb3V0OgorCXJlYWRfdW5sb2NrKCZpcDZfdG5sX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2lwNGlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQoreworCWludCByZWxfbXNnID0gMDsKKwlpbnQgcmVsX3R5cGUgPSB0eXBlOworCWludCByZWxfY29kZSA9IGNvZGU7CisJX191MzIgcmVsX2luZm8gPSBpbmZvOworCWludCBlcnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJc3RydWN0IGlwaGRyICplaXBoOworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKworCWVyciA9IGlwNl90bmxfZXJyKHNrYiwgSVBQUk9UT19JUElQLCBvcHQsICZyZWxfdHlwZSwgJnJlbF9jb2RlLAorCQkJICAmcmVsX21zZywgJnJlbF9pbmZvLCBvZmZzZXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHJlbF9tc2cgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHJlbF90eXBlKSB7CisJY2FzZSBJQ01QVjZfREVTVF9VTlJFQUNIOgorCQlpZiAocmVsX2NvZGUgIT0gSUNNUFY2X0FERFJfVU5SRUFDSCkKKwkJCXJldHVybiAwOworCQlyZWxfdHlwZSA9IElDTVBfREVTVF9VTlJFQUNIOworCQlyZWxfY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOworCQlicmVhazsKKwljYXNlIElDTVBWNl9QS1RfVE9PQklHOgorCQlpZiAocmVsX2NvZGUgIT0gMCkKKwkJCXJldHVybiAwOworCQlyZWxfdHlwZSA9IElDTVBfREVTVF9VTlJFQUNIOworCQlyZWxfY29kZSA9IElDTVBfRlJBR19ORUVERUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIG9mZnNldCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IyKQorCQlyZXR1cm4gMDsKKworCWRzdF9yZWxlYXNlKHNrYjItPmRzdCk7CisJc2tiMi0+ZHN0ID0gTlVMTDsKKwlza2JfcHVsbChza2IyLCBvZmZzZXQpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKKwllaXBoID0gaXBfaGRyKHNrYjIpOworCisJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLmZsNF9kc3QgPSBlaXBoLT5zYWRkcjsKKwlmbC5mbDRfdG9zID0gUlRfVE9TKGVpcGgtPnRvcyk7CisJZmwucHJvdG8gPSBJUFBST1RPX0lQSVA7CisJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQorCQlnb3RvIG91dDsKKworCXNrYjItPmRldiA9IHJ0LT51LmRzdC5kZXY7CisKKwkvKiByb3V0ZSAiaW5jb21pbmciIHBhY2tldCAqLworCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSB7CisJCWlwX3J0X3B1dChydCk7CisJCXJ0ID0gTlVMTDsKKwkJZmwuZmw0X2RzdCA9IGVpcGgtPmRhZGRyOworCQlmbC5mbDRfc3JjID0gZWlwaC0+c2FkZHI7CisJCWZsLmZsNF90b3MgPSBlaXBoLT50b3M7CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSB8fAorCQkgICAgcnQtPnUuZHN0LmRldi0+dHlwZSAhPSBBUlBIUkRfVFVOTkVMKSB7CisJCQlpcF9ydF9wdXQocnQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpcF9ydF9wdXQocnQpOworCQlpZiAoaXBfcm91dGVfaW5wdXQoc2tiMiwgZWlwaC0+ZGFkZHIsIGVpcGgtPnNhZGRyLCBlaXBoLT50b3MsCisJCQkJICAgc2tiMi0+ZGV2KSB8fAorCQkgICAgc2tiMi0+ZHN0LT5kZXYtPnR5cGUgIT0gQVJQSFJEX1RVTk5FTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIGNoYW5nZSBtdHUgb24gdGhpcyByb3V0ZSAqLworCWlmIChyZWxfdHlwZSA9PSBJQ01QX0RFU1RfVU5SRUFDSCAmJiByZWxfY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7CisJCWlmIChyZWxfaW5mbyA+IGRzdF9tdHUoc2tiMi0+ZHN0KSkKKwkJCWdvdG8gb3V0OworCisJCXNrYjItPmRzdC0+b3BzLT51cGRhdGVfcG10dShza2IyLT5kc3QsIHJlbF9pbmZvKTsKKwkJcmVsX2luZm8gPSBodG9ubChyZWxfaW5mbyk7CisJfQorCisJaWNtcF9zZW5kKHNrYjIsIHJlbF90eXBlLCByZWxfY29kZSwgcmVsX2luZm8pOworCitvdXQ6CisJa2ZyZWVfc2tiKHNrYjIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpcDZpcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAorCSAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3sKKwlpbnQgcmVsX21zZyA9IDA7CisJaW50IHJlbF90eXBlID0gdHlwZTsKKwlpbnQgcmVsX2NvZGUgPSBjb2RlOworCV9fdTMyIHJlbF9pbmZvID0gaW5mbzsKKwlpbnQgZXJyOworCisJZXJyID0gaXA2X3RubF9lcnIoc2tiLCBJUFBST1RPX0lQVjYsIG9wdCwgJnJlbF90eXBlLCAmcmVsX2NvZGUsCisJCQkgICZyZWxfbXNnLCAmcmVsX2luZm8sIG9mZnNldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAocmVsX21zZyAmJiBwc2tiX21heV9wdWxsKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpIHsKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAogCQlpZiAoIXNrYjIpCi0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAwOwogCiAJCWRzdF9yZWxlYXNlKHNrYjItPmRzdCk7CiAJCXNrYjItPmRzdCA9IE5VTEw7CiAJCXNrYl9wdWxsKHNrYjIsIG9mZnNldCk7Ci0JCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAogCQkvKiBUcnkgdG8gZ3Vlc3MgaW5jb21pbmcgaW50ZXJmYWNlICovCi0JCXJ0ID0gcnQ2X2xvb2t1cCgmc2tiMi0+bmguaXB2NmgtPnNhZGRyLCBOVUxMLCAwLCAwKTsKKwkJcnQgPSBydDZfbG9va3VwKCZpcHY2X2hkcihza2IyKS0+c2FkZHIsIE5VTEwsIDAsIDApOwogCiAJCWlmIChydCAmJiBydC0+cnQ2aV9kZXYpCiAJCQlza2IyLT5kZXYgPSBydC0+cnQ2aV9kZXY7CkBAIC00ODMsMTkgKzYxNCwzNCBAQAogCiAJCWtmcmVlX3NrYihza2IyKTsKIAl9Ci1vdXQ6Ci0JcmVhZF91bmxvY2soJmlwNmlwNl9sb2NrKTsKLQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcDZpcDZfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcHY2aGRyICpvdXRlcl9pcGgsCi0JCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGlwNGlwNl9kc2NwX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3QgaXA2X3RubCAqdCwKKwkJCQkJc3RydWN0IGlwdjZoZHIgKmlwdjZoLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcHY2aGRyICppbm5lcl9pcGggPSBza2ItPm5oLmlwdjZoOworCV9fdTggZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpICYgfklORVRfRUNOX01BU0s7CiAKLQlpZiAoSU5FVF9FQ05faXNfY2UoaXB2Nl9nZXRfZHNmaWVsZChvdXRlcl9pcGgpKSkKLQkJSVA2X0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKKwlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKKwkJaXB2NF9jaGFuZ2VfZHNmaWVsZChpcF9oZHIoc2tiKSwgSU5FVF9FQ05fTUFTSywgZHNmaWVsZCk7CisKKwlpZiAoSU5FVF9FQ05faXNfY2UoZHNmaWVsZCkpCisJCUlQX0VDTl9zZXRfY2UoaXBfaGRyKHNrYikpOwogfQorCitzdGF0aWMgdm9pZCBpcDZpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwNl90bmwgKnQsCisJCQkJCXN0cnVjdCBpcHY2aGRyICppcHY2aCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKKwkJaXB2Nl9jb3B5X2RzY3AoaXB2NmgsIGlwdjZfaGRyKHNrYikpOworCisJaWYgKElORVRfRUNOX2lzX2NlKGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpKSkKKwkJSVA2X0VDTl9zZXRfY2UoaXB2Nl9oZHIoc2tiKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlwNl90bmxfcmN2X2N0bChzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKIAlzdHJ1Y3QgaXA2X3RubF9wYXJtICpwID0gJnQtPnBhcm1zOwpAQCAtNTE5LDUzICs2NjUsNjEgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfcmN2IC0gZGVjYXBzdWxhdGUgSVB2NiBwYWNrZXQgYW5kIHJldHJhbnNtaXQgaXQgbG9jYWxseQorICogaXA2X3RubF9yY3YgLSBkZWNhcHN1bGF0ZSBJUHY2IHBhY2tldCBhbmQgcmV0cmFuc21pdCBpdCBsb2NhbGx5CiAgKiAgIEBza2I6IHJlY2VpdmVkIHNvY2tldCBidWZmZXIKKyAqICAgQHByb3RvY29sOiBldGhlcm5ldCBwcm90b2NvbCBJRAorICogICBAZHNjcF9lY25fZGVjYXBzdWxhdGU6IHRoZSBmdW5jdGlvbiB0byBkZWNhcHN1bGF0ZSBEU0NQIGNvZGUgYW5kIEVDTgogICoKICAqIFJldHVybjogMAogICoqLwogCi1zdGF0aWMgaW50Ci1pcDZpcDZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGlwNl90bmxfcmN2KHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IHByb3RvY29sLAorCQkgICAgICAgX191OCBpcHByb3RvLAorCQkgICAgICAgdm9pZCAoKmRzY3BfZWNuX2RlY2Fwc3VsYXRlKShzdHJ1Y3QgaXA2X3RubCAqdCwKKwkJCQkJCSAgICBzdHJ1Y3QgaXB2NmhkciAqaXB2NmgsCisJCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwdjZoOwogCXN0cnVjdCBpcDZfdG5sICp0OworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CiAKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7CisJcmVhZF9sb2NrKCZpcDZfdG5sX2xvY2spOwogCi0JcmVhZF9sb2NrKCZpcDZpcDZfbG9jayk7CisJaWYgKCh0ID0gaXA2X3RubF9sb29rdXAoJmlwdjZoLT5zYWRkciwgJmlwdjZoLT5kYWRkcikpICE9IE5VTEwpIHsKKwkJaWYgKHQtPnBhcm1zLnByb3RvICE9IGlwcHJvdG8gJiYgdC0+cGFybXMucHJvdG8gIT0gMCkgeworCQkJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KIAotCWlmICgodCA9IGlwNmlwNl90bmxfbG9va3VwKCZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIpKSAhPSBOVUxMKSB7CiAJCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCQlyZWFkX3VubG9jaygmaXA2aXA2X2xvY2spOworCQkJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CiAJCQlnb3RvIGRpc2NhcmQ7CiAJCX0KIAogCQlpZiAoIWlwNl90bmxfcmN2X2N0bCh0KSkgewogCQkJdC0+c3RhdC5yeF9kcm9wcGVkKys7Ci0JCQlyZWFkX3VubG9jaygmaXA2aXA2X2xvY2spOworCQkJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CiAJCQlnb3RvIGRpc2NhcmQ7CiAJCX0KIAkJc2VjcGF0aF9yZXNldChza2IpOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKLQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7Ci0JCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhwcm90b2NvbCk7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0pKTsKIAkJc2tiLT5kZXYgPSB0LT5kZXY7CiAJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAkJc2tiLT5kc3QgPSBOVUxMOwogCQluZl9yZXNldChza2IpOwotCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKLQkJCWlwdjZfY29weV9kc2NwKGlwdjZoLCBza2ItPm5oLmlwdjZoKTsKLQkJaXA2aXA2X2Vjbl9kZWNhcHN1bGF0ZShpcHY2aCwgc2tiKTsKKworCQlkc2NwX2Vjbl9kZWNhcHN1bGF0ZSh0LCBpcHY2aCwgc2tiKTsKKwogCQl0LT5zdGF0LnJ4X3BhY2tldHMrKzsKIAkJdC0+c3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAkJbmV0aWZfcngoc2tiKTsKLQkJcmVhZF91bmxvY2soJmlwNmlwNl9sb2NrKTsKKwkJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CiAJCXJldHVybiAwOwogCX0KLQlyZWFkX3VubG9jaygmaXA2aXA2X2xvY2spOworCXJlYWRfdW5sb2NrKCZpcDZfdG5sX2xvY2spOwogCXJldHVybiAxOwogCiBkaXNjYXJkOgpAQCAtNTczLDYgKzcyNywxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlwNGlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gaXA2X3RubF9yY3Yoc2tiLCBFVEhfUF9JUCwgSVBQUk9UT19JUElQLAorCQkJICAgaXA0aXA2X2RzY3BfZWNuX2RlY2Fwc3VsYXRlKTsKK30KKworc3RhdGljIGludCBpcDZpcDZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGlwNl90bmxfcmN2KHNrYiwgRVRIX1BfSVBWNiwgSVBQUk9UT19JUFY2LAorCQkJICAgaXA2aXA2X2RzY3BfZWNuX2RlY2Fwc3VsYXRlKTsKK30KKwogc3RydWN0IGlwdjZfdGVsX3R4b3B0aW9uIHsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgb3BzOwogCV9fdTggZHN0X29wdFs4XTsKQEAgLTU5Myw3ICs3NTksNyBAQAogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfYWRkcl9jb25mbGljdCAtIGNvbXBhcmUgcGFja2V0IGFkZHJlc3NlcyB0byB0dW5uZWwncyBvd24KKyAqIGlwNl90bmxfYWRkcl9jb25mbGljdCAtIGNvbXBhcmUgcGFja2V0IGFkZHJlc3NlcyB0byB0dW5uZWwncyBvd24KICAqICAgQHQ6IHRoZSBvdXRnb2luZyB0dW5uZWwgZGV2aWNlCiAgKiAgIEBoZHI6IElQdjYgaGVhZGVyIGZyb20gdGhlIGluY29taW5nIHBhY2tldAogICoKQEAgLTYwNyw3ICs3NzMsNyBAQAogICoqLwogCiBzdGF0aWMgaW5saW5lIGludAotaXA2aXA2X3RubF9hZGRyX2NvbmZsaWN0KHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgaXB2NmhkciAqaGRyKQoraXA2X3RubF9hZGRyX2NvbmZsaWN0KHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgaXB2NmhkciAqaGRyKQogewogCXJldHVybiBpcHY2X2FkZHJfZXF1YWwoJnQtPnBhcm1zLnJhZGRyLCAmaGRyLT5zYWRkcik7CiB9CkBAIC02NDEsNzIgKzgwNyw0OSBAQAogCXJldHVybiByZXQ7CiB9CiAvKioKLSAqIGlwNmlwNl90bmxfeG1pdCAtIGVuY2Fwc3VsYXRlIHBhY2tldCBhbmQgc2VuZAorICogaXA2X3RubF94bWl0MiAtIGVuY2Fwc3VsYXRlIHBhY2tldCBhbmQgc2VuZAogICogICBAc2tiOiB0aGUgb3V0Z29pbmcgc29ja2V0IGJ1ZmZlcgogICogICBAZGV2OiB0aGUgb3V0Z29pbmcgdHVubmVsIGRldmljZQorICogICBAZHNmaWVsZDogZHNjcCBjb2RlIGZvciBvdXRlciBoZWFkZXIKKyAqICAgQGZsOiBmbG93IG9mIHR1bm5lbGVkIHBhY2tldAorICogICBAZW5jYXBfbGltaXQ6IGVuY2Fwc3VsYXRpb24gbGltaXQKKyAqICAgQHBtdHU6IFBhdGggTVRVIGlzIHN0b3JlZCBpZiBwYWNrZXQgaXMgdG9vIGJpZwogICoKICAqIERlc2NyaXB0aW9uOgogICogICBCdWlsZCBuZXcgaGVhZGVyIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIHBhY2tldCBiZWZvcmUgc2VuZGluZwogICogICBpdC4KICAqCiAgKiBSZXR1cm46Ci0gKiAgIDAKKyAqICAgMCBvbiBzdWNjZXNzCisgKiAgIC0xIGZhaWwKKyAqICAgJS1FTVNHU0laRSBtZXNzYWdlIHRvbyBiaWcuIHJldHVybiBtdHUgaW4gdGhpcyBjYXNlLgogICoqLwogCi1zdGF0aWMgaW50Ci1pcDZpcDZfdG5sX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaXA2X3RubF94bWl0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgX191OCBkc2ZpZWxkLAorCQkJIHN0cnVjdCBmbG93aSAqZmwsCisJCQkgaW50IGVuY2FwX2xpbWl0LAorCQkJIF9fdTMyICpwbXR1KQogewogCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdC0+c3RhdDsKLQlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBza2ItPm5oLmlwdjZoOwotCWludCBlbmNhcF9saW1pdCA9IC0xOworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IGlwdjZfdGVsX3R4b3B0aW9uIG9wdDsKLQlfX3UxNiBvZmZzZXQ7Ci0Jc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsKIAlpbnQgbXR1OwogCWludCBtYXhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCXU4IHByb3RvOwotCWludCBlcnI7CisJaW50IGVyciA9IC0xOwogCWludCBwa3RfbGVuOwotCWludCBkc2ZpZWxkOwotCi0JaWYgKHQtPnJlY3Vyc2lvbisrKSB7Ci0JCXN0YXRzLT5jb2xsaXNpb25zKys7Ci0JCWdvdG8gdHhfZXJyOwotCX0KLQlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSB8fAotCSAgICAhaXA2X3RubF94bWl0X2N0bCh0KSB8fCBpcDZpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKQotCQlnb3RvIHR4X2VycjsKLQotCWlmICgob2Zmc2V0ID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiLT5uaC5yYXcpKSA+IDApIHsKLQkJc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICp0ZWw7Ci0JCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+bmgucmF3W29mZnNldF07Ci0JCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKLQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKLQkJCQkgICAgSUNNUFY2X0hEUl9GSUVMRCwgb2Zmc2V0ICsgMiwgc2tiLT5kZXYpOwotCQkJZ290byB0eF9lcnI7Ci0JCX0KLQkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKLQl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKLQkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQotCW1lbWNweSgmZmwsICZ0LT5mbCwgc2l6ZW9mIChmbCkpOwotCXByb3RvID0gZmwucHJvdG87Ci0KLQlkc2ZpZWxkID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCk7Ci0JaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpKQotCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfVENMQVNTX01BU0spOwotCWlmICgodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMKSkKLQkJZmwuZmw2X2Zsb3dsYWJlbCB8PSAoKihfX2JlMzIgKikgaXB2NmggJiBJUFY2X0ZMT1dMQUJFTF9NQVNLKTsKIAogCWlmICgoZHN0ID0gaXA2X3RubF9kc3RfY2hlY2sodCkpICE9IE5VTEwpCiAJCWRzdF9ob2xkKGRzdCk7CiAJZWxzZSB7Ci0JCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsKTsKKwkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCBmbCk7CiAKLQkJaWYgKGRzdC0+ZXJyb3IgfHwgeGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKSA8IDApCisJCWlmIChkc3QtPmVycm9yIHx8IHhmcm1fbG9va3VwKCZkc3QsIGZsLCBOVUxMLCAwKSA8IDApCiAJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAJfQogCkBAIC03MzAsNyArODczLDggQEAKIAlpZiAoc2tiLT5kc3QpCiAJCXNrYi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYi0+ZHN0LCBtdHUpOwogCWlmIChza2ItPmxlbiA+IG10dSkgewotCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIGRldik7CisJCSpwbXR1ID0gbXR1OworCQllcnIgPSAtRU1TR1NJWkU7CiAJCWdvdG8gdHhfZXJyX2RzdF9yZWxlYXNlOwogCX0KIApAQCAtNzU0LDIyICs4OTgsMjQgQEAKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoZHN0KTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCisJcHJvdG8gPSBmbC0+cHJvdG87CiAJaWYgKGVuY2FwX2xpbWl0ID49IDApIHsKIAkJaW5pdF90ZWxfdHhvcHQoJm9wdCwgZW5jYXBfbGltaXQpOwogCQlpcHY2X3B1c2hfbmZyYWdfb3B0cyhza2IsICZvcHQub3BzLCAmcHJvdG8sIE5VTEwpOwogCX0KLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0JaXB2NmggPSBza2ItPm5oLmlwdjZoOwotCSooX19iZTMyKilpcHY2aCA9IGZsLmZsNl9mbG93bGFiZWwgfCBodG9ubCgweDYwMDAwMDAwKTsKKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKKwkqKF9fYmUzMiopaXB2NmggPSBmbC0+Zmw2X2Zsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOwogCWRzZmllbGQgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZSgwLCBkc2ZpZWxkKTsKIAlpcHY2X2NoYW5nZV9kc2ZpZWxkKGlwdjZoLCB+SU5FVF9FQ05fTUFTSywgZHNmaWVsZCk7CiAJaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAlpcHY2aC0+aG9wX2xpbWl0ID0gdC0+cGFybXMuaG9wX2xpbWl0OwogCWlwdjZoLT5uZXh0aGRyID0gcHJvdG87Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwdjZoLT5zYWRkciwgJmZsLmZsNl9zcmMpOwotCWlwdjZfYWRkcl9jb3B5KCZpcHY2aC0+ZGFkZHIsICZmbC5mbDZfZHN0KTsKKwlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmZmwtPmZsNl9zcmMpOworCWlwdjZfYWRkcl9jb3B5KCZpcHY2aC0+ZGFkZHIsICZmbC0+Zmw2X2RzdCk7CiAJbmZfcmVzZXQoc2tiKTsKIAlwa3RfbGVuID0gc2tiLT5sZW47CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLApAQCAtNzgzLDEzICs5MjksMTMxIEBACiAJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOwogCX0KIAlpcDZfdG5sX2RzdF9zdG9yZSh0LCBkc3QpOwotCXQtPnJlY3Vyc2lvbi0tOwogCXJldHVybiAwOwogdHhfZXJyX2xpbmtfZmFpbHVyZToKIAlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKIAlkc3RfbGlua19mYWlsdXJlKHNrYik7CiB0eF9lcnJfZHN0X3JlbGVhc2U6CiAJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludAoraXA0aXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcGhkciAgKmlwaCA9IGlwX2hkcihza2IpOworCWludCBlbmNhcF9saW1pdCA9IC0xOworCXN0cnVjdCBmbG93aSBmbDsKKwlfX3U4IGRzZmllbGQ7CisJX191MzIgbXR1OworCWludCBlcnI7CisKKwlpZiAoKHQtPnBhcm1zLnByb3RvICE9IElQUFJPVE9fSVBJUCAmJiB0LT5wYXJtcy5wcm90byAhPSAwKSB8fAorCSAgICAhaXA2X3RubF94bWl0X2N0bCh0KSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKKwkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKKworCW1lbWNweSgmZmwsICZ0LT5mbCwgc2l6ZW9mIChmbCkpOworCWZsLnByb3RvID0gSVBQUk9UT19JUElQOworCisJZHNmaWVsZCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBoKTsKKworCWlmICgodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKSkKKwkJZmwuZmw2X2Zsb3dsYWJlbCB8PSBudG9obCgoKF9fdTMyKWlwaC0+dG9zIDw8IElQVjZfVENMQVNTX1NISUZUKQorCQkJCQkgICYgSVBWNl9UQ0xBU1NfTUFTSyk7CisKKwllcnIgPSBpcDZfdG5sX3htaXQyKHNrYiwgZGV2LCBkc2ZpZWxkLCAmZmwsIGVuY2FwX2xpbWl0LCAmbXR1KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJLyogWFhYOiBzZW5kIElDTVAgZXJyb3IgZXZlbiBpZiBERiBpcyBub3Qgc2V0LiAqLworCQlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELAorCQkJCSAgaHRvbmwobXR1KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lwNmlwNl90bmxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOworCWludCBlbmNhcF9saW1pdCA9IC0xOworCV9fdTE2IG9mZnNldDsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJX191OCBkc2ZpZWxkOworCV9fdTMyIG10dTsKKwlpbnQgZXJyOworCisJaWYgKCh0LT5wYXJtcy5wcm90byAhPSBJUFBST1RPX0lQVjYgJiYgdC0+cGFybXMucHJvdG8gIT0gMCkgfHwKKwkgICAgIWlwNl90bmxfeG1pdF9jdGwodCkgfHwgaXA2X3RubF9hZGRyX2NvbmZsaWN0KHQsIGlwdjZoKSkKKwkJcmV0dXJuIC0xOworCisJb2Zmc2V0ID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOworCWlmIChvZmZzZXQgPiAwKSB7CisJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopJnNrYl9uZXR3b3JrX2hlYWRlcihza2IpW29mZnNldF07CisJCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKKwkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKKwkJCQkgICAgSUNNUFY2X0hEUl9GSUVMRCwgb2Zmc2V0ICsgMiwgc2tiLT5kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWVuY2FwX2xpbWl0ID0gdGVsLT5lbmNhcF9saW1pdCAtIDE7CisJfSBlbHNlIGlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpCisJCWVuY2FwX2xpbWl0ID0gdC0+cGFybXMuZW5jYXBfbGltaXQ7CisKKwltZW1jcHkoJmZsLCAmdC0+ZmwsIHNpemVvZiAoZmwpKTsKKwlmbC5wcm90byA9IElQUFJPVE9fSVBWNjsKKworCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKKwlpZiAoKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUykpCisJCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX19iZTMyICopIGlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7CisJaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpKQorCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfRkxPV0xBQkVMX01BU0spOworCisJZXJyID0gaXA2X3RubF94bWl0Mihza2IsIGRldiwgZHNmaWVsZCwgJmZsLCBlbmNhcF9saW1pdCwgJm10dSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWlmIChlcnIgPT0gLUVNU0dTSVpFKQorCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1LCBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lwNl90bmxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdC0+c3RhdDsKKwlpbnQgcmV0OworCisJaWYgKHQtPnJlY3Vyc2lvbisrKSB7CisJCXQtPnN0YXQuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2VycjsKKwl9CisKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCQlyZXQgPSBpcDRpcDZfdG5sX3htaXQoc2tiLCBkZXYpOworCQlicmVhazsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJCXJldCA9IGlwNmlwNl90bmxfeG1pdChza2IsIGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gdHhfZXJyOworCX0KKworCWlmIChyZXQgPCAwKQorCQlnb3RvIHR4X2VycjsKKworCXQtPnJlY3Vyc2lvbi0tOworCXJldHVybiAwOworCiB0eF9lcnI6CiAJc3RhdHMtPnR4X2Vycm9ycysrOwogCXN0YXRzLT50eF9kcm9wcGVkKys7CkBAIC04MTcsNyArMTA4MSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpcDZpcDZfdG5sX2xpbmtfY29uZmlnKHN0cnVjdCBpcDZfdG5sICp0KQorc3RhdGljIHZvaWQgaXA2X3RubF9saW5rX2NvbmZpZyhzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdC0+ZGV2OwogCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CkBAIC04NzAsMTcgKzExMzQsMTcgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2NoYW5nZSAtIHVwZGF0ZSB0aGUgdHVubmVsIHBhcmFtZXRlcnMKKyAqIGlwNl90bmxfY2hhbmdlIC0gdXBkYXRlIHRoZSB0dW5uZWwgcGFyYW1ldGVycwogICogICBAdDogdHVubmVsIHRvIGJlIGNoYW5nZWQKICAqICAgQHA6IHR1bm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAqICAgQGFjdGl2ZTogIT0gMCBpZiB0dW5uZWwgaXMgcmVhZHkgZm9yIHVzZQogICoKICAqIERlc2NyaXB0aW9uOgotICogICBpcDZpcDZfdG5sX2NoYW5nZSgpIHVwZGF0ZXMgdGhlIHR1bm5lbCBwYXJhbWV0ZXJzCisgKiAgIGlwNl90bmxfY2hhbmdlKCkgdXBkYXRlcyB0aGUgdHVubmVsIHBhcmFtZXRlcnMKICAqKi8KIAogc3RhdGljIGludAotaXA2aXA2X3RubF9jaGFuZ2Uoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnApCitpcDZfdG5sX2NoYW5nZShzdHJ1Y3QgaXA2X3RubCAqdCwgc3RydWN0IGlwNl90bmxfcGFybSAqcCkKIHsKIAlpcHY2X2FkZHJfY29weSgmdC0+cGFybXMubGFkZHIsICZwLT5sYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJnQtPnBhcm1zLnJhZGRyLCAmcC0+cmFkZHIpOwpAQCAtODg5LDE5ICsxMTUzLDIwIEBACiAJdC0+cGFybXMuZW5jYXBfbGltaXQgPSBwLT5lbmNhcF9saW1pdDsKIAl0LT5wYXJtcy5mbG93aW5mbyA9IHAtPmZsb3dpbmZvOwogCXQtPnBhcm1zLmxpbmsgPSBwLT5saW5rOworCXQtPnBhcm1zLnByb3RvID0gcC0+cHJvdG87CiAJaXA2X3RubF9kc3RfcmVzZXQodCk7Ci0JaXA2aXA2X3RubF9saW5rX2NvbmZpZyh0KTsKKwlpcDZfdG5sX2xpbmtfY29uZmlnKHQpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfaW9jdGwgLSBjb25maWd1cmUgaXB2NiB0dW5uZWxzIGZyb20gdXNlcnNwYWNlCisgKiBpcDZfdG5sX2lvY3RsIC0gY29uZmlndXJlIGlwdjYgdHVubmVscyBmcm9tIHVzZXJzcGFjZQogICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCiAgKiAgIEBpZnI6IHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdXNlcnNwYWNlCiAgKiAgIEBjbWQ6IGNvbW1hbmQgdG8gYmUgcGVyZm9ybWVkCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIGlwNmlwNl90bmxfaW9jdGwoKSBpcyB1c2VkIGZvciBtYW5hZ2luZyBJUHY2IHR1bm5lbHMKKyAqICAgaXA2X3RubF9pb2N0bCgpIGlzIHVzZWQgZm9yIG1hbmFnaW5nIElQdjYgdHVubmVscwogICogICBmcm9tIHVzZXJzcGFjZS4KICAqCiAgKiAgIFRoZSBwb3NzaWJsZSBjb21tYW5kcyBhcmUgdGhlIGZvbGxvd2luZzoKQEAgLTkyMyw3ICsxMTg4LDcgQEAKICAqKi8KIAogc3RhdGljIGludAotaXA2aXA2X3RubF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK2lwNl90bmxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGlwNl90bmxfcGFybSBwOwpAQCAtOTMxLDEyICsxMTk2LDEyIEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVFRVTk5FTDoKLQkJaWYgKGRldiA9PSBpcDZpcDZfZmJfdG5sX2RldikgeworCQlpZiAoZGV2ID09IGlwNl9mYl90bmxfZGV2KSB7CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YgKHApKSkgewogCQkJCWVyciA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQl0ID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsIDApOworCQkJdCA9IGlwNl90bmxfbG9jYXRlKCZwLCAwKTsKIAkJfQogCQlpZiAodCA9PSBOVUxMKQogCQkJdCA9IG5ldGRldl9wcml2KGRldik7CkBAIC05NTQsMTAgKzEyMTksMTEgQEAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpCiAJCQlicmVhazsKIAkJZXJyID0gLUVJTlZBTDsKLQkJaWYgKHAucHJvdG8gIT0gSVBQUk9UT19JUFY2KQorCQlpZiAocC5wcm90byAhPSBJUFBST1RPX0lQVjYgJiYgcC5wcm90byAhPSBJUFBST1RPX0lQSVAgJiYKKwkJICAgIHAucHJvdG8gIT0gMCkKIAkJCWJyZWFrOwotCQl0ID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsIGNtZCA9PSBTSU9DQUREVFVOTkVMKTsKLQkJaWYgKGRldiAhPSBpcDZpcDZfZmJfdG5sX2RldiAmJiBjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgeworCQl0ID0gaXA2X3RubF9sb2NhdGUoJnAsIGNtZCA9PSBTSU9DQUREVFVOTkVMKTsKKwkJaWYgKGRldiAhPSBpcDZfZmJfdG5sX2RldiAmJiBjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgewogCQkJaWYgKHQgIT0gTlVMTCkgewogCQkJCWlmICh0LT5kZXYgIT0gZGV2KSB7CiAJCQkJCWVyciA9IC1FRVhJU1Q7CkBAIC05NjYsOSArMTIzMiw5IEBACiAJCQl9IGVsc2UKIAkJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQkJaXA2aXA2X3RubF91bmxpbmsodCk7Ci0JCQllcnIgPSBpcDZpcDZfdG5sX2NoYW5nZSh0LCAmcCk7Ci0JCQlpcDZpcDZfdG5sX2xpbmsodCk7CisJCQlpcDZfdG5sX3VubGluayh0KTsKKwkJCWVyciA9IGlwNl90bmxfY2hhbmdlKHQsICZwKTsKKwkJCWlwNl90bmxfbGluayh0KTsKIAkJCW5ldGRldl9zdGF0ZV9jaGFuZ2UoZGV2KTsKIAkJfQogCQlpZiAodCkgewpAQCAtOTg0LDE1ICsxMjUwLDE1IEBACiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCWJyZWFrOwogCi0JCWlmIChkZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKKwkJaWYgKGRldiA9PSBpcDZfZmJfdG5sX2RldikgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKQogCQkJCWJyZWFrOwogCQkJZXJyID0gLUVOT0VOVDsKLQkJCWlmICgodCA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAwKSkgPT0gTlVMTCkKKwkJCWlmICgodCA9IGlwNl90bmxfbG9jYXRlKCZwLCAwKSkgPT0gTlVMTCkKIAkJCQlicmVhazsKIAkJCWVyciA9IC1FUEVSTTsKLQkJCWlmICh0LT5kZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpCisJCQlpZiAodC0+ZGV2ID09IGlwNl9mYl90bmxfZGV2KQogCQkJCWJyZWFrOwogCQkJZGV2ID0gdC0+ZGV2OwogCQl9CkBAIC0xMDA2LDIwICsxMjcyLDIwIEBACiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9nZXRfc3RhdHMgLSByZXR1cm4gdGhlIHN0YXRzIGZvciB0dW5uZWwgZGV2aWNlCisgKiBpcDZfdG5sX2dldF9zdGF0cyAtIHJldHVybiB0aGUgc3RhdHMgZm9yIHR1bm5lbCBkZXZpY2UKICAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAogICoKICAqIFJldHVybjogc3RhdHMgZm9yIGRldmljZQogICoqLwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotaXA2aXA2X3RubF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2lwNl90bmxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuICYoKChzdHJ1Y3QgaXA2X3RubCAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0KTsKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2NoYW5nZV9tdHUgLSBjaGFuZ2UgbXR1IG1hbnVhbGx5IGZvciB0dW5uZWwgZGV2aWNlCisgKiBpcDZfdG5sX2NoYW5nZV9tdHUgLSBjaGFuZ2UgbXR1IG1hbnVhbGx5IGZvciB0dW5uZWwgZGV2aWNlCiAgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKICAqICAgQG5ld19tdHU6IHRoZSBuZXcgbXR1CiAgKgpAQCAtMTAyOSw3ICsxMjk1LDcgQEAKICAqKi8KIAogc3RhdGljIGludAotaXA2aXA2X3RubF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoraXA2X3RubF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewogCWlmIChuZXdfbXR1IDwgSVBWNl9NSU5fTVRVKSB7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAzOSwyMiArMTMwNSwyMiBAQAogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfZGV2X3NldHVwIC0gc2V0dXAgdmlydHVhbCB0dW5uZWwgZGV2aWNlCisgKiBpcDZfdG5sX2Rldl9zZXR1cCAtIHNldHVwIHZpcnR1YWwgdHVubmVsIGRldmljZQogICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgIEluaXRpYWxpemUgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGRldmljZSBwYXJhbWV0ZXJzCiAgKiovCiAKLXN0YXRpYyB2b2lkIGlwNmlwNl90bmxfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcDZfdG5sX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKLQlkZXYtPnVuaW5pdCA9IGlwNmlwNl90bmxfZGV2X3VuaW5pdDsKKwlkZXYtPnVuaW5pdCA9IGlwNl90bmxfZGV2X3VuaW5pdDsKIAlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlwNmlwNl90bmxfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGlwNmlwNl90bmxfZ2V0X3N0YXRzOwotCWRldi0+ZG9faW9jdGwgPSBpcDZpcDZfdG5sX2lvY3RsOwotCWRldi0+Y2hhbmdlX210dSA9IGlwNmlwNl90bmxfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlwNl90bmxfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IGlwNl90bmxfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSBpcDZfdG5sX2lvY3RsOworCWRldi0+Y2hhbmdlX210dSA9IGlwNl90bmxfY2hhbmdlX210dTsKIAogCWRldi0+dHlwZSA9IEFSUEhSRF9UVU5ORUw2OwogCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gTExfTUFYX0hFQURFUiArIHNpemVvZiAoc3RydWN0IGlwdjZoZHIpOwpAQCAtMTA2NSw1MCArMTMzMSw1NiBAQAogCiAKIC8qKgotICogaXA2aXA2X3RubF9kZXZfaW5pdF9nZW4gLSBnZW5lcmFsIGluaXRpYWxpemVyIGZvciBhbGwgdHVubmVsIGRldmljZXMKKyAqIGlwNl90bmxfZGV2X2luaXRfZ2VuIC0gZ2VuZXJhbCBpbml0aWFsaXplciBmb3IgYWxsIHR1bm5lbCBkZXZpY2VzCiAgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKICAqKi8KIAogc3RhdGljIGlubGluZSB2b2lkCi1pcDZpcDZfdG5sX2Rldl9pbml0X2dlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraXA2X3RubF9kZXZfaW5pdF9nZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7Ci0JdC0+ZmwucHJvdG8gPSBJUFBST1RPX0lQVjY7CiAJdC0+ZGV2ID0gZGV2OwogCXN0cmNweSh0LT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOwogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgYWxsIG5vbiBmYWxsYmFjayB0dW5uZWwgZGV2aWNlcworICogaXA2X3RubF9kZXZfaW5pdCAtIGluaXRpYWxpemVyIGZvciBhbGwgbm9uIGZhbGxiYWNrIHR1bm5lbCBkZXZpY2VzCiAgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKICAqKi8KIAogc3RhdGljIGludAotaXA2aXA2X3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraXA2X3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpcDZpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOwotCWlwNmlwNl90bmxfbGlua19jb25maWcodCk7CisJaXA2X3RubF9kZXZfaW5pdF9nZW4oZGV2KTsKKwlpcDZfdG5sX2xpbmtfY29uZmlnKHQpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGlwNmlwNl9mYl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgZmFsbGJhY2sgdHVubmVsIGRldmljZQorICogaXA2X2ZiX3RubF9kZXZfaW5pdCAtIGluaXRpYWxpemVyIGZvciBmYWxsYmFjayB0dW5uZWwgZGV2aWNlCiAgKiAgIEBkZXY6IGZhbGxiYWNrIGRldmljZQogICoKICAqIFJldHVybjogMAogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCWlwNmlwNl90bmxfZGV2X2luaXRfZ2VuKGRldik7CisJaXA2X3RubF9kZXZfaW5pdF9nZW4oZGV2KTsKKwl0LT5wYXJtcy5wcm90byA9IElQUFJPVE9fSVBWNjsKIAlkZXZfaG9sZChkZXYpOwogCXRubHNfd2NbMF0gPSB0OwogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHhmcm02X3R1bm5lbCBpcDRpcDZfaGFuZGxlciA9IHsKKwkuaGFuZGxlcgk9IGlwNGlwNl9yY3YsCisJLmVycl9oYW5kbGVyCT0gaXA0aXA2X2VyciwKKwkucHJpb3JpdHkJPQkxLAorfTsKKwogc3RhdGljIHN0cnVjdCB4ZnJtNl90dW5uZWwgaXA2aXA2X2hhbmRsZXIgPSB7CiAJLmhhbmRsZXIJPSBpcDZpcDZfcmN2LAogCS5lcnJfaGFuZGxlcgk9IGlwNmlwNl9lcnIsCkBAIC0xMTI1LDMwICsxMzk3LDQwIEBACiB7CiAJaW50ICBlcnI7CiAKLQlpZiAoeGZybTZfdHVubmVsX3JlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlciwgQUZfSU5FVDYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXA2aXA2IGluaXQ6IGNhbid0IHJlZ2lzdGVyIHR1bm5lbFxuIik7Ci0JCXJldHVybiAtRUFHQUlOOworCWlmICh4ZnJtNl90dW5uZWxfcmVnaXN0ZXIoJmlwNGlwNl9oYW5kbGVyLCBBRl9JTkVUKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlwNl90dW5uZWwgaW5pdDogY2FuJ3QgcmVnaXN0ZXIgaXA0aXA2XG4iKTsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CiAJfQotCWlwNmlwNl9mYl90bmxfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgaXA2X3RubCksICJpcDZ0bmwwIiwKLQkJCQkJIGlwNmlwNl90bmxfZGV2X3NldHVwKTsKIAotCWlmICghaXA2aXA2X2ZiX3RubF9kZXYpIHsKKwlpZiAoeGZybTZfdHVubmVsX3JlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlciwgQUZfSU5FVDYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2X3R1bm5lbCBpbml0OiBjYW4ndCByZWdpc3RlciBpcDZpcDZcbiIpOworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIHVucmVnX2lwNGlwNjsKKwl9CisJaXA2X2ZiX3RubF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpcDZfdG5sKSwgImlwNnRubDAiLAorCQkJCSAgICAgIGlwNl90bmxfZGV2X3NldHVwKTsKKworCWlmICghaXA2X2ZiX3RubF9kZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KLQlpcDZpcDZfZmJfdG5sX2Rldi0+aW5pdCA9IGlwNmlwNl9mYl90bmxfZGV2X2luaXQ7CisJaXA2X2ZiX3RubF9kZXYtPmluaXQgPSBpcDZfZmJfdG5sX2Rldl9pbml0OwogCi0JaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoaXA2aXA2X2ZiX3RubF9kZXYpKSkgewotCQlmcmVlX25ldGRldihpcDZpcDZfZmJfdG5sX2Rldik7CisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoaXA2X2ZiX3RubF9kZXYpKSkgeworCQlmcmVlX25ldGRldihpcDZfZmJfdG5sX2Rldik7CiAJCWdvdG8gZmFpbDsKIAl9CiAJcmV0dXJuIDA7CiBmYWlsOgogCXhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlciwgQUZfSU5FVDYpOwordW5yZWdfaXA0aXA2OgorCXhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDRpcDZfaGFuZGxlciwgQUZfSU5FVCk7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGlwNmlwNl9kZXN0cm95X3R1bm5lbHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcDZfdG5sX2Rlc3Ryb3lfdHVubmVscyh2b2lkKQogewogCWludCBoOwogCXN0cnVjdCBpcDZfdG5sICp0OwpAQCAtMTE2OCwxMSArMTQ1MCwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2X3R1bm5lbF9jbGVhbnVwKHZvaWQpCiB7CisJaWYgKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDRpcDZfaGFuZGxlciwgQUZfSU5FVCkpCisJCXByaW50ayhLRVJOX0lORk8gImlwNl90dW5uZWwgY2xvc2U6IGNhbid0IGRlcmVnaXN0ZXIgaXA0aXA2XG4iKTsKKwogCWlmICh4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIsIEFGX0lORVQ2KSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaXA2aXA2IGNsb3NlOiBjYW4ndCBkZXJlZ2lzdGVyIHR1bm5lbFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImlwNl90dW5uZWwgY2xvc2U6IGNhbid0IGRlcmVnaXN0ZXIgaXA2aXA2XG4iKTsKIAogCXJ0bmxfbG9jaygpOwotCWlwNmlwNl9kZXN0cm95X3R1bm5lbHMoKTsKKwlpcDZfdG5sX2Rlc3Ryb3lfdHVubmVscygpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwY29tcDYuYyBiL25ldC9pcHY2L2lwY29tcDYuYwppbmRleCA1NzI0YmE5Li4xZWU1MGI1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcGNvbXA2LmMKKysrIGIvbmV0L2lwdjYvaXBjb21wNi5jCkBAIC03OSw5ICs3OSw5IEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogUmVtb3ZlIGlwY29tcCBoZWFkZXIgYW5kIGRlY29tcHJlc3Mgb3JpZ2luYWwgcGF5bG9hZCAqLwotCWlwaCA9IHNrYi0+bmguaXB2Nmg7CisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlpcGNoID0gKHZvaWQgKilza2ItPmRhdGE7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ICsgc2l6ZW9mKCppcGNoKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKCppcGNoKTsKIAlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCppcGNoKSk7CiAKIAkvKiBkZWNvbXByZXNzaW9uICovCkBAIC0xMTEsNyArMTExLDcgQEAKIAogCXNrYi0+dHJ1ZXNpemUgKz0gZGxlbiAtIHBsZW47CiAJX19za2JfcHV0KHNrYiwgZGxlbiAtIHBsZW4pOwotCW1lbWNweShza2ItPmRhdGEsIHNjcmF0Y2gsIGRsZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2NyYXRjaCwgZGxlbik7CiAJZXJyID0gaXBjaC0+bmV4dGhkcjsKIAogb3V0X3B1dF9jcHU6CkBAIC0xMjQsMTUgKzEyNCwxMyBAQAogewogCWludCBlcnI7CiAJc3RydWN0IGlwdjZoZHIgKnRvcF9pcGg7Ci0JaW50IGhkcl9sZW47CiAJc3RydWN0IGlwdjZfY29tcF9oZHIgKmlwY2g7CiAJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKIAlpbnQgcGxlbiwgZGxlbjsKIAl1OCAqc3RhcnQsICpzY3JhdGNoOwogCXN0cnVjdCBjcnlwdG9fY29tcCAqdGZtOwogCWludCBjcHU7Ci0KLQloZHJfbGVuID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlpbnQgaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAKIAkvKiBjaGVjayB3aGV0aGVyIGRhdGFncmFtIGxlbiBpcyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQgKi8KIAlpZiAoKHNrYi0+bGVuIC0gaGRyX2xlbikgPCBpcGNkLT50aHJlc2hvbGQpIHsKQEAgLTE0NSw3ICsxNDMsNyBAQAogCS8qIGNvbXByZXNzaW9uICovCiAJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKIAlkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKLQlzdGFydCA9IHNrYi0+aC5yYXc7CisJc3RhcnQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwogCXNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wNl9zY3JhdGNoZXMsIGNwdSk7CkBAIC0xNjYsMTAgKzE2NCwxMCBAQAogCXRvcF9pcGgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAogCWlwY2ggPSAoc3RydWN0IGlwdjZfY29tcF9oZHIgKilzdGFydDsKLQlpcGNoLT5uZXh0aGRyID0gKnNrYi0+bmgucmF3OworCWlwY2gtPm5leHRoZHIgPSAqc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJaXBjaC0+ZmxhZ3MgPSAwOwogCWlwY2gtPmNwaSA9IGh0b25zKCh1MTYgKW50b2hsKHgtPmlkLnNwaSkpOwotCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fQ09NUDsKKwkqc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgPSBJUFBST1RPX0NPTVA7CiAKIG91dF9vazoKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwppbmRleCBmNWY5NTgyLi5hYTNkMDdjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCkBAIC0xMDEsMTQgKzEwMSwxNCBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXB2NmgpKSkpCiAJCWdvdG8gb3V0OwogCi0JaXB2NmggPSBza2ItPm5oLmlwdjZoOworCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCppcHY2aCkpOwogCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJb3BzID0gaXB2Nl9nc29fcHVsbF9leHRoZHJzKHNrYiwgaXB2NmgtPm5leHRoZHIpOwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlbmRfY2hlY2spKSB7Ci0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCWVyciA9IG9wcy0+Z3NvX3NlbmRfY2hlY2soc2tiKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xMzcsMTQgKzEzNywxNCBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXB2NmgpKSkpCiAJCWdvdG8gb3V0OwogCi0JaXB2NmggPSBza2ItPm5oLmlwdjZoOworCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCppcHY2aCkpOwogCXNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCW9wcyA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwdjZoLT5uZXh0aGRyKTsKIAlpZiAobGlrZWx5KG9wcyAmJiBvcHMtPmdzb19zZWdtZW50KSkgewotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQlzZWdzID0gb3BzLT5nc29fc2VnbWVudChza2IsIGZlYXR1cmVzKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKHNrYiA9IHNlZ3M7IHNrYjsgc2tiID0gc2tiLT5uZXh0KSB7Ci0JCWlwdjZoID0gc2tiLT5uaC5pcHY2aDsKKwkJaXB2NmggPSBpcHY2X2hkcihza2IpOwogCQlpcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNrYi0+bWFjX2xlbiAtCiAJCQkJCSAgIHNpemVvZigqaXB2NmgpKTsKIAl9CkBAIC02OTQsNyArNjk0LDcgQEAKIAkJcmV0diA9IGlwNl9yYV9jb250cm9sKHNrLCB2YWwsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIElQVjZfTVRVX0RJU0NPVkVSOgotCQlpZiAodmFsPDAgfHwgdmFsPjIpCisJCWlmICh2YWw8MCB8fCB2YWw+MykKIAkJCWdvdG8gZV9pbnZhbDsKIAkJbnAtPnBtdHVkaXNjID0gdmFsOwogCQlyZXR2ID0gMDsKQEAgLTc2MSw2ICs3NjEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXB2Nl9zZXRzb2Nrb3B0KTsKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfaXB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKQEAgLTc5NiwxOCArNzk3LDM3IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBpcHY2X2dldHNvY2tvcHRfc3RpY2t5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsCi0JCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgbGVuKQorCQkJCSAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBsZW4pCiB7CiAJc3RydWN0IGlwdjZfb3B0X2hkciAqaGRyOwogCi0JaWYgKCFvcHQgfHwgIW9wdC0+aG9wb3B0KQorCWlmICghb3B0KQogCQlyZXR1cm4gMDsKLQloZHIgPSBvcHQtPmhvcG9wdDsKKworCXN3aXRjaChvcHRuYW1lKSB7CisJY2FzZSBJUFY2X0hPUE9QVFM6CisJCWhkciA9IG9wdC0+aG9wb3B0OworCQlicmVhazsKKwljYXNlIElQVjZfUlRIRFJEU1RPUFRTOgorCQloZHIgPSBvcHQtPmRzdDBvcHQ7CisJCWJyZWFrOworCWNhc2UgSVBWNl9SVEhEUjoKKwkJaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKilvcHQtPnNyY3J0OworCQlicmVhazsKKwljYXNlIElQVjZfRFNUT1BUUzoKKwkJaGRyID0gb3B0LT5kc3Qxb3B0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwl9CisKKwlpZiAoIWhkcikKKwkJcmV0dXJuIDA7CiAKIAlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgaXB2Nl9vcHRsZW4oaGRyKSk7Ci0JaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGhkciwgaXB2Nl9vcHRsZW4oaGRyKSkpCisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGhkciwgbGVuKSk7CiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBsZW47CisJcmV0dXJuIGlwdjZfb3B0bGVuKGhkcik7CiB9CiAKIHN0YXRpYyBpbnQgZG9faXB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKQEAgLTk0NSw3ICs5NjUsNyBAQAogCiAJCWxvY2tfc29jayhzayk7CiAJCWxlbiA9IGlwdjZfZ2V0c29ja29wdF9zdGlja3koc2ssIG5wLT5vcHQsCi0JCQkJCSAgICAgb3B0dmFsLCBsZW4pOworCQkJCQkgICAgIG9wdG5hbWUsIG9wdHZhbCwgbGVuKTsKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKIAl9CkBAIC0xMDY2LDYgKzEwODYsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXB2Nl9nZXRzb2Nrb3B0KTsKKwogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfaXB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc3ltcy5jIGIvbmV0L2lwdjYvaXB2Nl9zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmUzZDQuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgotI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KLSNpbmNsdWRlIDxuZXQveGZybS5oPgotCi1FWFBPUlRfU1lNQk9MKGljbXB2Nl9zZW5kKTsKLUVYUE9SVF9TWU1CT0woaWNtcHY2X3N0YXRpc3RpY3MpOwotRVhQT1JUX1NZTUJPTChpY21wdjZfZXJyX2NvbnZlcnQpOwotRVhQT1JUX1NZTUJPTChuZGlzY19tY19tYXApOwotRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIpOwotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcik7Ci1FWFBPUlRfU1lNQk9MKGlwNl9yb3V0ZV9vdXRwdXQpOwotRVhQT1JUX1NZTUJPTChpcHY2X3NldHNvY2tvcHQpOwotRVhQT1JUX1NZTUJPTChpcHY2X2dldHNvY2tvcHQpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KTsKLUVYUE9SVF9TWU1CT0woaW5ldDZfdW5yZWdpc3Rlcl9wcm90b3N3KTsKLUVYUE9SVF9TWU1CT0woaW5ldDZfYWRkX3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0woaW5ldDZfZGVsX3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0woaXA2X3htaXQpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9yZWxlYXNlKTsKLUVYUE9SVF9TWU1CT0woaW5ldDZfYmluZCk7Ci1FWFBPUlRfU1lNQk9MKGluZXQ2X2dldG5hbWUpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9pb2N0bCk7Ci1FWFBPUlRfU1lNQk9MKGlwdjZfZ2V0X3NhZGRyKTsKLUVYUE9SVF9TWU1CT0woaXB2Nl9jaGtfYWRkcik7Ci1FWFBPUlRfU1lNQk9MKGluNl9kZXZfZmluaXNoX2Rlc3Ryb3kpOwotI2lmZGVmIENPTkZJR19YRlJNCi1FWFBPUlRfU1lNQk9MKHhmcm02X3Jjdik7Ci1FWFBPUlRfU1lNQk9MKHhmcm02X2lucHV0X2FkZHIpOwotRVhQT1JUX1NZTUJPTCh4ZnJtNl9maW5kXzFzdGZyYWdvcHQpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKHJ0Nl9sb29rdXApOwotRVhQT1JUX1NZTUJPTChpcHY2X3B1c2hfbmZyYWdfb3B0cyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9tY2FzdC5jIGIvbmV0L2lwdjYvbWNhc3QuYwppbmRleCBhOGQ2NjI1Li42YzI3NTg5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9tY2FzdC5jCisrKyBiL25ldC9pcHY2L21jYXN0LmMKQEAgLTk4OCw3ICs5ODgsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKSkKIAkJcmV0dXJuIDA7CiAKLQlwaWMgPSAoc3RydWN0IGljbXA2aGRyICopc2tiLT5oLnJhdzsKKwlwaWMgPSBpY21wNl9oZHIoc2tiKTsKIAogCXN3aXRjaCAocGljLT5pY21wNl90eXBlKSB7CiAJY2FzZSBJQ01QVjZfTUdNX1FVRVJZOgpAQCAtMTE2NywxMSArMTE2NywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGNvbXB1dGUgcGF5bG9hZCBsZW5ndGggZXhjbHVkaW5nIGV4dGVuc2lvbiBoZWFkZXJzICovCi0JbGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQlsZW4gLT0gKGNoYXIgKilza2ItPmgucmF3IC0gKGNoYXIgKilza2ItPm5oLmlwdjZoOworCWxlbiA9IG50b2hzKGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJbGVuIC09IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKIAogCS8qIERyb3AgcXVlcmllcyB3aXRoIG5vdCBsaW5rIGxvY2FsIHNvdXJjZSAqLwotCWlmICghKGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5zYWRkcikmSVBWNl9BRERSX0xJTktMT0NBTCkpCisJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CkBAIC0xMTc5LDcgKzExNzksNyBAQAogCWlmIChpZGV2ID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaGRyID0gKHN0cnVjdCBpY21wNmhkciAqKSBza2ItPmgucmF3OworCWhkciA9IGljbXA2X2hkcihza2IpOwogCWdyb3VwID0gKHN0cnVjdCBpbjZfYWRkciAqKSAoaGRyICsgMSk7CiAJZ3JvdXBfdHlwZSA9IGlwdjZfYWRkcl90eXBlKGdyb3VwKTsKIApAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAkJCWluNl9kZXZfcHV0KGlkZXYpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJbWxoMiA9IChzdHJ1Y3QgbWxkMl9xdWVyeSAqKSBza2ItPmgucmF3OworCQltbGgyID0gKHN0cnVjdCBtbGQyX3F1ZXJ5ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJbWF4X2RlbGF5ID0gKE1MRFYyX01SQyhudG9ocyhtbGgyLT5tcmMpKSpIWikvMTAwMDsKIAkJaWYgKCFtYXhfZGVsYXkpCiAJCQltYXhfZGVsYXkgPSAxOwpAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAkJCQlpbjZfZGV2X3B1dChpZGV2KTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCW1saDIgPSAoc3RydWN0IG1sZDJfcXVlcnkgKikgc2tiLT5oLnJhdzsKKwkJCW1saDIgPSAoc3RydWN0IG1sZDJfcXVlcnkgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQkJbWFyayA9IDE7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTMwMCwxMCArMTMwMCwxMCBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQloZHIgPSAoc3RydWN0IGljbXA2aGRyKikgc2tiLT5oLnJhdzsKKwloZHIgPSBpY21wNl9oZHIoc2tiKTsKIAogCS8qIERyb3AgcmVwb3J0cyB3aXRoIG5vdCBsaW5rIGxvY2FsIHNvdXJjZSAqLwotCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAlpZiAoYWRkcl90eXBlICE9IElQVjZfQUREUl9BTlkgJiYKIAkgICAgIShhZGRyX3R5cGUmSVBWNl9BRERSX0xJTktMT0NBTCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQxMSw3ICsxNDExLDcgQEAKIAogCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CiAKLQlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmKSkgeworCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmYWRkcl9idWYsIElGQV9GX1RFTlRBVElWRSkpIHsKIAkJLyogPGRyYWZ0LWlldGYtbWFnbWEtbWxkLXNvdXJjZS0wNS50eHQ+OgogCQkgKiB1c2UgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyB0aGUgc291cmNlIGFkZHJlc3MKIAkJICogd2hlbiBhIHZhbGlkIGxpbmstbG9jYWwgYWRkcmVzcyBpcyBub3QgYXZhaWxhYmxlLgpAQCAtMTQyMyw4ICsxNDIzLDkgQEAKIAogCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKHJhKSksIHJhLCBzaXplb2YocmEpKTsKIAotCXBtciA9KHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBtcikpOwotCXNrYi0+aC5yYXcgPSAodW5zaWduZWQgY2hhciAqKXBtcjsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBza2ItPmRhdGEpOworCXNrYl9wdXQoc2tiLCBzaXplb2YoKnBtcikpOworCXBtciA9IChzdHJ1Y3QgbWxkMl9yZXBvcnQgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXBtci0+dHlwZSA9IElDTVBWNl9NTEQyX1JFUE9SVDsKIAlwbXItPnJlc3YxID0gMDsKIAlwbXItPmNzdW0gPSAwOwpAQCAtMTQ0MSw3ICsxNDQyLDcgQEAKIAkJdW5zaWduZWQgY2hhciBoYVtNQVhfQUREUl9MRU5dOwogCQlpbnQgZXJyOwogCi0JCW5kaXNjX21jX21hcCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIGhhLCBkZXYsIDEpOworCQluZGlzY19tY19tYXAoJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBoYSwgZGV2LCAxKTsKIAkJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfSVBWNiwgaGEsIE5VTEwsIHNrYi0+bGVuKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWtmcmVlX3NrYihza2IpOwpAQCAtMTQ1OSwyMCArMTQ2MCwyMSBAQAogCiBzdGF0aWMgdm9pZCBtbGRfc2VuZHBhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqcGlwNiA9IHNrYi0+bmguaXB2Nmg7Ci0Jc3RydWN0IG1sZDJfcmVwb3J0ICpwbXIgPSAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiLT5oLnJhdzsKKwlzdHJ1Y3QgaXB2NmhkciAqcGlwNiA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IG1sZDJfcmVwb3J0ICpwbXIgPQorCQkJICAgICAgKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJaW50IHBheWxvYWRfbGVuLCBtbGRsZW47CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAlpbnQgZXJyOwogCiAJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7Ci0JcGF5bG9hZF9sZW4gPSBza2ItPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKXNrYi0+bmguaXB2NmggLQotCQlzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotCW1sZGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+aC5yYXc7CisJcGF5bG9hZF9sZW4gPSAoc2tiLT50YWlsIC0gc2tiLT5uZXR3b3JrX2hlYWRlcikgLSBzaXplb2YoKnBpcDYpOworCW1sZGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKIAlwaXA2LT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKIAogCXBtci0+Y3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmcGlwNi0+c2FkZHIsICZwaXA2LT5kYWRkciwgbWxkbGVuLAotCQlJUFBST1RPX0lDTVBWNiwgY3N1bV9wYXJ0aWFsKHNrYi0+aC5yYXcsIG1sZGxlbiwgMCkpOworCQlJUFBST1RPX0lDTVBWNiwgY3N1bV9wYXJ0aWFsKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJCSAgICAgbWxkbGVuLCAwKSk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKIAkJbWxkX2Rldl9xdWV1ZV94bWl0KTsKIAlpZiAoIWVycikgewpAQCAtMTUwNiw3ICsxNTA4LDcgQEAKIAlwZ3ItPmdyZWNfYXV4d29yZHMgPSAwOwogCXBnci0+Z3JlY19uc3JjcyA9IDA7CiAJcGdyLT5ncmVjX21jYSA9IHBtYy0+bWNhX2FkZHI7CS8qIHN0cnVjdHVyZSBjb3B5ICovCi0JcG1yID0gKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYi0+aC5yYXc7CisJcG1yID0gKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJcG1yLT5uZ3JlYyA9IGh0b25zKG50b2hzKHBtci0+bmdyZWMpKzEpOwogCSpwcGdyID0gcGdyOwogCXJldHVybiBza2I7CkBAIC0xNTM5LDcgKzE1NDEsNyBAQAogCWlmICghKnBzZl9saXN0KQogCQlnb3RvIGVtcHR5X3NvdXJjZTsKIAotCXBtciA9IHNrYiA/IChzdHJ1Y3QgbWxkMl9yZXBvcnQgKilza2ItPmgucmF3IDogTlVMTDsKKwlwbXIgPSBza2IgPyAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSA6IE5VTEw7CiAKIAkvKiBFWCBhbmQgVE9fRVggZ2V0IGEgZnJlc2ggcGFja2V0LCBpZiBuZWVkZWQgKi8KIAlpZiAodHJ1bmNhdGUpIHsKQEAgLTE3OTEsNyArMTc5Myw3IEBACiAKIAlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwogCi0JaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZikpIHsKKwlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmLCBJRkFfRl9URU5UQVRJVkUpKSB7CiAJCS8qIDxkcmFmdC1pZXRmLW1hZ21hLW1sZC1zb3VyY2UtMDUudHh0PjoKIAkJICogdXNlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgdGhlIHNvdXJjZSBhZGRyZXNzCiAJCSAqIHdoZW4gYSB2YWxpZCBsaW5rLWxvY2FsIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZS4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L21pcDYuYyBiL25ldC9pcHY2L21pcDYuYwppbmRleCAwYWZjYWJkLi4xM2I3MTYwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9taXA2LmMKKysrIGIvbmV0L2lwdjYvbWlwNi5jCkBAIC05MCwyMyArOTAsMjYgQEAKIHsKIAlzdHJ1Y3QgaXA2X21oICptaDsKIAotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIDgpIHx8Ci0JICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKChza2ItPmgucmF3WzFdICsgMSkgPDwgMykpKQorCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2JfdHJhbnNwb3J0X29mZnNldChza2IpKSArIDgpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKworCQkJCSAoKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzKSkpKQogCQlyZXR1cm4gLTE7CiAKLQltaCA9IChzdHJ1Y3QgaXA2X21oICopc2tiLT5oLnJhdzsKKwltaCA9IChzdHJ1Y3QgaXA2X21oICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmIChtaC0+aXA2bWhfaGRybGVuIDwgbWlwNl9taF9sZW4obWgtPmlwNm1oX3R5cGUpKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIG1lc3NhZ2UgdG9vIHNob3J0OiAlZCB2cyA+PSVkXG4iLAogCQkJICAgICAgIG1oLT5pcDZtaF9oZHJsZW4sIG1pcDZfbWhfbGVuKG1oLT5pcDZtaF90eXBlKSk7Ci0JCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgmbWgtPmlwNm1oX2hkcmxlbikgLSBza2ItPm5oLnJhdyk7CisJCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgoJm1oLT5pcDZtaF9oZHJsZW4pIC0KKwkJCQkJIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAobWgtPmlwNm1oX3Byb3RvICE9IElQUFJPVE9fTk9ORSkgewogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJtaXA2OiBNSCBpbnZhbGlkIHBheWxvYWQgcHJvdG8gPSAlZFxuIiwKIAkJCSAgICAgICBtaC0+aXA2bWhfcHJvdG8pOwotCQltaXA2X3BhcmFtX3Byb2Ioc2tiLCAwLCAoJm1oLT5pcDZtaF9wcm90bykgLSBza2ItPm5oLnJhdyk7CisJCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgoJm1oLT5pcDZtaF9wcm90bykgLQorCQkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTIyLDEyICsxMjUsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlwNl9yZXBvcnRfcmF0ZV9saW1pdGVyIG1pcDZfcmVwb3J0X3JsID0gewotCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VECisJLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChtaXA2X3JlcG9ydF9ybC5sb2NrKQogfTsKIAogc3RhdGljIGludCBtaXA2X2Rlc3RvcHRfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IGlwdjZfZGVzdG9wdF9oZHIgKmRlc3RvcHQgPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oZHIgKilza2ItPmRhdGE7CiAKIAlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmaXBoLT5zYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKXgtPmNvYWRkcikgJiYKQEAgLTE1MiwxMCArMTU1LDEwIEBACiAJaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOwogCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZigqaXBoKSk7CiAKLQluZXh0aGRyID0gKnNrYi0+bmgucmF3OwotCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fRFNUT1BUUzsKKwluZXh0aGRyID0gKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCSpza2JfbmV0d29ya19oZWFkZXIoc2tiKSA9IElQUFJPVE9fRFNUT1BUUzsKIAotCWRzdG9wdCA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hkciAqKXNrYi0+aC5yYXc7CisJZHN0b3B0ID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlkc3RvcHQtPm5leHRoZHIgPSBuZXh0aGRyOwogCiAJaGFvID0gbWlwNl9wYWRuKChjaGFyICopKGRzdG9wdCArIDEpLApAQCAtMjE1LDIxICsyMTgsMjIgQEAKIAlpZiAobGlrZWx5KG9wdC0+ZHN0aGFvKSkgewogCQlvZmZzZXQgPSBpcHY2X2ZpbmRfdGx2KHNrYiwgb3B0LT5kc3RoYW8sIElQVjZfVExWX0hBTyk7CiAJCWlmIChsaWtlbHkob2Zmc2V0ID49IDApKQotCQkJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKQorCQkJCQkoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvZmZzZXQpOwogCX0KIAogCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnN0YW1wKTsKIAotCWlmICghbWlwNl9yZXBvcnRfcmxfYWxsb3coJnN0YW1wLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkJICBoYW8gPyAmaGFvLT5hZGRyIDogJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCWlmICghbWlwNl9yZXBvcnRfcmxfYWxsb3coJnN0YW1wLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJICBoYW8gPyAmaGFvLT5hZGRyIDogJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkJCSAgb3B0LT5paWYpKQogCQlnb3RvIG91dDsKIAogCW1lbXNldCgmc2VsLCAwLCBzaXplb2Yoc2VsKSk7Ci0JbWVtY3B5KCZzZWwuZGFkZHIsICh4ZnJtX2FkZHJlc3NfdCAqKSZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwltZW1jcHkoJnNlbC5kYWRkciwgKHhmcm1fYWRkcmVzc190ICopJmlwdjZfaGRyKHNrYiktPmRhZGRyLAogCSAgICAgICBzaXplb2Yoc2VsLmRhZGRyKSk7CiAJc2VsLnByZWZpeGxlbl9kID0gMTI4OwotCW1lbWNweSgmc2VsLnNhZGRyLCAoeGZybV9hZGRyZXNzX3QgKikmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJbWVtY3B5KCZzZWwuc2FkZHIsICh4ZnJtX2FkZHJlc3NfdCAqKSZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkgICAgICAgc2l6ZW9mKHNlbC5zYWRkcikpOwogCXNlbC5wcmVmaXhsZW5fcyA9IDEyODsKIAlzZWwuZmFtaWx5ID0gQUZfSU5FVDY7CkBAIC0yNTMsMTEgKzI1NywxMyBAQAogCQkJICAgICAgIHU4ICoqbmV4dGhkcikKIHsKIAl1MTYgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmguaXB2NmggKyAxKTsKLQl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmgucmF3OworCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9CisJCQkJICAgKHN0cnVjdCBpcHY2X29wdF9oZHIgKikoaXB2Nl9oZHIoc2tiKSArIDEpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJdW5zaWduZWQgaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWludCBmb3VuZF9yaGRyID0gMDsKIAotCSpuZXh0aGRyID0gJnNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJKm5leHRoZHIgPSAmaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKIAogCXdoaWxlIChvZmZzZXQgKyAxIDw9IHBhY2tldF9sZW4pIHsKIApAQCAtMjg4LDcgKzI5NCw3IEBACiAKIAkJb2Zmc2V0ICs9IGlwdjZfb3B0bGVuKGV4dGhkcik7CiAJCSpuZXh0aGRyID0gJmV4dGhkci0+bmV4dGhkcjsKLQkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIqKShza2ItPm5oLnJhdyArIG9mZnNldCk7CisJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKG5oICsgb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gb2Zmc2V0OwpAQCAtMzYxLDEwICszNjcsMTAgQEAKIAlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGE7CiAJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKCppcGgpKTsKIAotCW5leHRoZHIgPSAqc2tiLT5uaC5yYXc7Ci0JKnNrYi0+bmgucmF3ID0gSVBQUk9UT19ST1VUSU5HOworCW5leHRoZHIgPSAqc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpID0gSVBQUk9UT19ST1VUSU5HOwogCi0JcnQyID0gKHN0cnVjdCBydDJfaGRyICopc2tiLT5oLnJhdzsKKwlydDIgPSAoc3RydWN0IHJ0Ml9oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXJ0Mi0+cnRfaGRyLm5leHRoZHIgPSBuZXh0aGRyOwogCXJ0Mi0+cnRfaGRyLmhkcmxlbiA9ICh4LT5wcm9wcy5oZWFkZXJfbGVuID4+IDMpIC0gMTsKIAlydDItPnJ0X2hkci50eXBlID0gSVBWNl9TUkNSVF9UWVBFXzI7CkBAIC0zODMsMTEgKzM4OSwxMyBAQAogCQkJICAgICB1OCAqKm5leHRoZHIpCiB7CiAJdTE2IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7Ci0Jc3RydWN0IGlwdjZfb3B0X2hkciAqZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIqKShza2ItPm5oLmlwdjZoICsgMSk7Ci0JdW5zaWduZWQgaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHIgPQorCQkJCSAgIChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKGlwdjZfaGRyKHNrYikgKyAxKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKIAlpbnQgZm91bmRfcmhkciA9IDA7CiAKLQkqbmV4dGhkciA9ICZza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCSpuZXh0aGRyID0gJmlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAKIAl3aGlsZSAob2Zmc2V0ICsgMSA8PSBwYWNrZXRfbGVuKSB7CiAKQEAgLTM5Nyw3ICs0MDUsNyBAQAogCQljYXNlIE5FWFRIRFJfUk9VVElORzoKIAkJCWlmIChvZmZzZXQgKyAzIDw9IHBhY2tldF9sZW4pIHsKIAkJCQlzdHJ1Y3QgaXB2Nl9ydF9oZHIgKnJ0OwotCQkJCXJ0ID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2ItPm5oLnJhdyArIG9mZnNldCk7CisJCQkJcnQgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKG5oICsgb2Zmc2V0KTsKIAkJCQlpZiAocnQtPnR5cGUgIT0gMCkKIAkJCQkJcmV0dXJuIG9mZnNldDsKIAkJCX0KQEAgLTQxNyw3ICs0MjUsNyBAQAogCiAJCW9mZnNldCArPSBpcHY2X29wdGxlbihleHRoZHIpOwogCQkqbmV4dGhkciA9ICZleHRoZHItPm5leHRoZHI7Ci0JCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKShuaCArIG9mZnNldCk7CiAJfQogCiAJcmV0dXJuIG9mZnNldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDEyMWYzMWMuLmQ4YjM2NDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtMzE5LDYgKzMxOSw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK0VYUE9SVF9TWU1CT0wobmRpc2NfbWNfbWFwKTsKKwogc3RhdGljIHUzMiBuZGlzY19oYXNoKGNvbnN0IHZvaWQgKnBrZXksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJY29uc3QgdTMyICpwMzIgPSBwa2V5OwpAQCAtNDI1LDI4ICs0MjcsMTA4IEBACiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhuZGlzY19zb2NrZXQtPnNrLCBmbCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fbmRpc2Nfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkgc3RydWN0IGljbXA2aGRyICppY21wNmgsIHN0cnVjdCBpbjZfYWRkciAqdGFyZ2V0LAorCQkJIGludCBsbGluZm8sIGludCBpY21wNl9taWJfb3V0bmQpCit7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBuZGlzY19zb2NrZXQtPnNrOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGljbXA2aGRyICpoZHI7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlpbnQgbGVuOworCWludCBlcnI7CisJdTggKm9wdDsKKworCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIGljbXA2aC0+aWNtcDZfdHlwZSwgc2FkZHIsIGRhZGRyLAorCQkJZGV2LT5pZmluZGV4KTsKKworCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIG5laWdoLCBkYWRkciwgaXA2X291dHB1dCk7CisJaWYgKCFkc3QpCisJCXJldHVybjsKKworCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgTlVMTCwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybjsKKworCWlmICghZGV2LT5hZGRyX2xlbikKKwkJbGxpbmZvID0gMDsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgKHRhcmdldCA/IHNpemVvZigqdGFyZ2V0KSA6IDApOworCWlmIChsbGluZm8pCisJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKKwkJCQkgIChNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCisJCQkJICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCisJCQkJICAxLCAmZXJyKTsKKwlpZiAoIXNrYikgeworCQlORF9QUklOVEswKEtFUk5fRVJSCisJCQkgICAiSUNNUHY2IE5EOiAlcygpIGZhaWxlZCB0byBhbGxvY2F0ZSBhbiBza2IuXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJaXA2X25kX2hkcihzaywgc2tiLCBkZXYsIHNhZGRyLCBkYWRkciwgSVBQUk9UT19JQ01QVjYsIGxlbik7CisKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPnRhaWw7CisJc2tiX3B1dChza2IsIGxlbik7CisKKwloZHIgPSAoc3RydWN0IGljbXA2aGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwltZW1jcHkoaGRyLCBpY21wNmgsIHNpemVvZigqaGRyKSk7CisKKwlvcHQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcik7CisJaWYgKHRhcmdldCkgeworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopb3B0LCB0YXJnZXQpOworCQlvcHQgKz0gc2l6ZW9mKCp0YXJnZXQpOworCX0KKworCWlmIChsbGluZm8pCisJCW5kaXNjX2ZpbGxfYWRkcl9vcHRpb24ob3B0LCBsbGluZm8sIGRldi0+ZGV2X2FkZHIsCisJCQkJICAgICAgIGRldi0+YWRkcl9sZW4sIGRldi0+dHlwZSk7CisKKwloZHItPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgbGVuLAorCQkJCQkgICBJUFBST1RPX0lDTVBWNiwKKwkJCQkJICAgY3N1bV9wYXJ0aWFsKChfX3U4ICopIGhkciwKKwkJCQkJCQlsZW4sIDApKTsKKworCXNrYi0+ZHN0ID0gZHN0OworCisJaWRldiA9IGluNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKKwlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKworCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOworCWlmICghZXJyKSB7CisJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBpY21wNl9taWJfb3V0bmQpOworCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOworCX0KKworCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKKwkJaW42X2Rldl9wdXQoaWRldik7Cit9CisKIHN0YXRpYyB2b2lkIG5kaXNjX3NlbmRfbmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCiAJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBpbjZfYWRkciAqc29saWNpdGVkX2FkZHIsCiAJCSAgIGludCByb3V0ZXIsIGludCBzb2xpY2l0ZWQsIGludCBvdmVycmlkZSwgaW50IGluY19vcHQpCiB7CiAJc3RydWN0IGluNl9hZGRyIHRtcGFkZHI7CiAJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwotCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7Ci0Jc3RydWN0IGZsb3dpIGZsOwotCXN0cnVjdCBkc3RfZW50cnkqIGRzdDsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBuZGlzY19zb2NrZXQtPnNrOwogCXN0cnVjdCBpbjZfYWRkciAqc3JjX2FkZHI7Ci0Jc3RydWN0IG5kX21zZyAqbXNnOwotCWludCBsZW47Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgZXJyOwotCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwlzdHJ1Y3QgaWNtcDZoZHIgaWNtcDZoID0geworCQkuaWNtcDZfdHlwZSA9IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5ULAorCX07CiAKIAkvKiBmb3IgYW55Y2FzdCBvciBwcm94eSwgc29saWNpdGVkX2FkZHIgIT0gc3JjX2FkZHIgKi8KIAlpZnAgPSBpcHY2X2dldF9pZmFkZHIoc29saWNpdGVkX2FkZHIsIGRldiwgMSk7CiAJaWYgKGlmcCkgewogCQlzcmNfYWRkciA9IHNvbGljaXRlZF9hZGRyOworCQlpZiAoaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpCisJCQlvdmVycmlkZSA9IDA7CiAJCWluNl9pZmFfcHV0KGlmcCk7CiAJfSBlbHNlIHsKIAkJaWYgKGlwdjZfZGV2X2dldF9zYWRkcihkZXYsIGRhZGRyLCAmdG1wYWRkcikpCkBAIC00NTQsMjM3ICs1MzYsNzEgQEAKIAkJc3JjX2FkZHIgPSAmdG1wYWRkcjsKIAl9CiAKLQluZGlzY19mbG93X2luaXQoJmZsLCBORElTQ19ORUlHSEJPVVJfQURWRVJUSVNFTUVOVCwgc3JjX2FkZHIsIGRhZGRyLAotCQkJZGV2LT5pZmluZGV4KTsKKwlpY21wNmguaWNtcDZfcm91dGVyID0gcm91dGVyOworCWljbXA2aC5pY21wNl9zb2xpY2l0ZWQgPSBzb2xpY2l0ZWQ7CisJaWNtcDZoLmljbXA2X292ZXJyaWRlID0gb3ZlcnJpZGU7CiAKLQlkc3QgPSBuZGlzY19kc3RfYWxsb2MoZGV2LCBuZWlnaCwgZGFkZHIsIGlwNl9vdXRwdXQpOwotCWlmICghZHN0KQotCQlyZXR1cm47Ci0KLQllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm47Ci0KLQlpZiAoaW5jX29wdCkgewotCQlpZiAoZGV2LT5hZGRyX2xlbikKLQkJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOwotCQllbHNlCi0JCQlpbmNfb3B0ID0gMDsKLQl9Ci0KLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAotCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKLQkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKLQkJCQkgIDEsICZlcnIpOwotCi0JaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCU5EX1BSSU5USzAoS0VSTl9FUlIKLQkJCSAgICJJQ01QdjYgTkE6ICVzKCkgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIHNrYi5cbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18pOwotCQlkc3RfcmVsZWFzZShkc3QpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlpcDZfbmRfaGRyKHNrLCBza2IsIGRldiwgc3JjX2FkZHIsIGRhZGRyLCBJUFBST1RPX0lDTVBWNiwgbGVuKTsKLQotCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3B1dChza2IsIGxlbik7Ci0Jc2tiLT5oLnJhdyA9ICh1bnNpZ25lZCBjaGFyKiltc2c7Ci0KLQltc2ctPmljbXBoLmljbXA2X3R5cGUgPSBORElTQ19ORUlHSEJPVVJfQURWRVJUSVNFTUVOVDsKLQltc2ctPmljbXBoLmljbXA2X2NvZGUgPSAwOwotCW1zZy0+aWNtcGguaWNtcDZfY2tzdW0gPSAwOwotCi0JbXNnLT5pY21waC5pY21wNl91bnVzZWQgPSAwOwotCW1zZy0+aWNtcGguaWNtcDZfcm91dGVyICAgID0gcm91dGVyOwotCW1zZy0+aWNtcGguaWNtcDZfc29saWNpdGVkID0gc29saWNpdGVkOwotCW1zZy0+aWNtcGguaWNtcDZfb3ZlcnJpZGUgID0gb3ZlcnJpZGU7Ci0KLQkvKiBTZXQgdGhlIHRhcmdldCBhZGRyZXNzLiAqLwotCWlwdjZfYWRkcl9jb3B5KCZtc2ctPnRhcmdldCwgc29saWNpdGVkX2FkZHIpOwotCi0JaWYgKGluY19vcHQpCi0JCW5kaXNjX2ZpbGxfYWRkcl9vcHRpb24obXNnLT5vcHQsIE5EX09QVF9UQVJHRVRfTExfQUREUiwgZGV2LT5kZXZfYWRkciwKLQkJCQkgICAgICAgZGV2LT5hZGRyX2xlbiwgZGV2LT50eXBlKTsKLQotCS8qIGNoZWNrc3VtICovCi0JbXNnLT5pY21waC5pY21wNl9ja3N1bSA9IGNzdW1faXB2Nl9tYWdpYyhzcmNfYWRkciwgZGFkZHIsIGxlbiwKLQkJCQkJCSBJUFBST1RPX0lDTVBWNiwKLQkJCQkJCSBjc3VtX3BhcnRpYWwoKF9fdTggKikgbXNnLAotCQkJCQkJCSAgICAgIGxlbiwgMCkpOwotCi0Jc2tiLT5kc3QgPSBkc3Q7Ci0JaWRldiA9IGluNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKLQllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKLQlpZiAoIWVycikgewotCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE5FSUdIQk9SQURWRVJUSVNFTUVOVFMpOwotCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOwotCX0KLQotCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKLQkJaW42X2Rldl9wdXQoaWRldik7CisJX19uZGlzY19zZW5kKGRldiwgbmVpZ2gsIGRhZGRyLCBzcmNfYWRkciwKKwkJICAgICAmaWNtcDZoLCBzb2xpY2l0ZWRfYWRkciwKKwkJICAgICBpbmNfb3B0ID8gTkRfT1BUX1RBUkdFVF9MTF9BRERSIDogMCwKKwkJICAgICBJQ01QNl9NSUJfT1VUTkVJR0hCT1JBRFZFUlRJU0VNRU5UUyk7CiB9CiAKIHZvaWQgbmRpc2Nfc2VuZF9ucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKIAkJICAgc3RydWN0IGluNl9hZGRyICpzb2xpY2l0LAogCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQogewotCXN0cnVjdCBmbG93aSBmbDsKLQlzdHJ1Y3QgZHN0X2VudHJ5KiBkc3Q7Ci0Jc3RydWN0IGluZXQ2X2RldiAqaWRldjsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBuZGlzY19zb2NrZXQtPnNrOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG5kX21zZyAqbXNnOwogCXN0cnVjdCBpbjZfYWRkciBhZGRyX2J1ZjsKLQlpbnQgbGVuOwotCWludCBlcnI7Ci0JaW50IHNlbmRfbGxpbmZvOworCXN0cnVjdCBpY21wNmhkciBpY21wNmggPSB7CisJCS5pY21wNl90eXBlID0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTiwKKwl9OwogCiAJaWYgKHNhZGRyID09IE5VTEwpIHsKLQkJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZikpCisJCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmYWRkcl9idWYsCisJCQkJICAgKElGQV9GX1RFTlRBVElWRXxJRkFfRl9PUFRJTUlTVElDKSkpCiAJCQlyZXR1cm47CiAJCXNhZGRyID0gJmFkZHJfYnVmOwogCX0KIAotCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04sIHNhZGRyLCBkYWRkciwKLQkJCWRldi0+aWZpbmRleCk7Ci0KLQlkc3QgPSBuZGlzY19kc3RfYWxsb2MoZGV2LCBuZWlnaCwgZGFkZHIsIGlwNl9vdXRwdXQpOwotCWlmICghZHN0KQotCQlyZXR1cm47Ci0KLQllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm47Ci0KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwotCXNlbmRfbGxpbmZvID0gZGV2LT5hZGRyX2xlbiAmJiAhaXB2Nl9hZGRyX2FueShzYWRkcik7Ci0JaWYgKHNlbmRfbGxpbmZvKQotCQlsZW4gKz0gbmRpc2Nfb3B0X2FkZHJfc3BhY2UoZGV2KTsKLQotCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCi0JCQkJICAoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKwotCQkJCSAgIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldikpLAotCQkJCSAgMSwgJmVycik7Ci0JaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCU5EX1BSSU5USzAoS0VSTl9FUlIKLQkJCSAgICJJQ01QdjYgTkE6ICVzKCkgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIHNrYi5cbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18pOwotCQlkc3RfcmVsZWFzZShkc3QpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlpcDZfbmRfaGRyKHNrLCBza2IsIGRldiwgc2FkZHIsIGRhZGRyLCBJUFBST1RPX0lDTVBWNiwgbGVuKTsKLQotCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3B1dChza2IsIGxlbik7Ci0Jc2tiLT5oLnJhdyA9ICh1bnNpZ25lZCBjaGFyKiltc2c7Ci0JbXNnLT5pY21waC5pY21wNl90eXBlID0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTjsKLQltc2ctPmljbXBoLmljbXA2X2NvZGUgPSAwOwotCW1zZy0+aWNtcGguaWNtcDZfY2tzdW0gPSAwOwotCW1zZy0+aWNtcGguaWNtcDZfdW51c2VkID0gMDsKLQotCS8qIFNldCB0aGUgdGFyZ2V0IGFkZHJlc3MuICovCi0JaXB2Nl9hZGRyX2NvcHkoJm1zZy0+dGFyZ2V0LCBzb2xpY2l0KTsKLQotCWlmIChzZW5kX2xsaW5mbykKLQkJbmRpc2NfZmlsbF9hZGRyX29wdGlvbihtc2ctPm9wdCwgTkRfT1BUX1NPVVJDRV9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAotCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOwotCi0JLyogY2hlY2tzdW0gKi8KLQltc2ctPmljbXBoLmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkJCSBkYWRkciwgbGVuLAotCQkJCQkJIElQUFJPVE9fSUNNUFY2LAotCQkJCQkJIGNzdW1fcGFydGlhbCgoX191OCAqKSBtc2csCi0JCQkJCQkJICAgICAgbGVuLCAwKSk7Ci0JLyogc2VuZCBpdCEgKi8KLQlza2ItPmRzdCA9IGRzdDsKLQlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOwotCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwotCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwotCWlmICghZXJyKSB7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTkVJR0hCT1JTT0xJQ0lUUyk7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7Ci0JfQotCi0JaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQotCQlpbjZfZGV2X3B1dChpZGV2KTsKKwlfX25kaXNjX3NlbmQoZGV2LCBuZWlnaCwgZGFkZHIsIHNhZGRyLAorCQkgICAgICZpY21wNmgsIHNvbGljaXQsCisJCSAgICAgIWlwdjZfYWRkcl9hbnkoc2FkZHIpID8gTkRfT1BUX1NPVVJDRV9MTF9BRERSIDogMCwKKwkJICAgICBJQ01QNl9NSUJfT1VUTkVJR0hCT1JTT0xJQ0lUUyk7CiB9CiAKIHZvaWQgbmRpc2Nfc2VuZF9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyKQogewotCXN0cnVjdCBmbG93aSBmbDsKLQlzdHJ1Y3QgZHN0X2VudHJ5KiBkc3Q7Ci0Jc3RydWN0IGluZXQ2X2RldiAqaWRldjsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBuZGlzY19zb2NrZXQtPnNrOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGljbXA2aGRyICpoZHI7Ci0JX191OCAqIG9wdDsKLQlpbnQgbGVuOwotCWludCBlcnI7CisJc3RydWN0IGljbXA2aGRyIGljbXA2aCA9IHsKKwkJLmljbXA2X3R5cGUgPSBORElTQ19ST1VURVJfU09MSUNJVEFUSU9OLAorCX07CisJaW50IHNlbmRfc2xsYW8gPSBkZXYtPmFkZHJfbGVuOwogCi0JbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTiwgc2FkZHIsIGRhZGRyLAotCQkJZGV2LT5pZmluZGV4KTsKLQotCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIE5VTEwsIGRhZGRyLCBpcDZfb3V0cHV0KTsKLQlpZiAoIWRzdCkKLQkJcmV0dXJuOwotCi0JZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuOwotCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcik7Ci0JaWYgKGRldi0+YWRkcl9sZW4pCi0JCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOwotCi0Jc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKLQkJCQkgIChNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCi0JCQkJICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCi0JCQkJICAxLCAmZXJyKTsKLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJTkRfUFJJTlRLMChLRVJOX0VSUgotCQkJICAgIklDTVB2NiBSUzogJXMoKSBmYWlsZWQgdG8gYWxsb2NhdGUgYW4gc2tiLlxuIiwKLQkJCSAgIF9fRlVOQ1RJT05fXyk7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCXJldHVybjsKKyNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAorCS8qCisJICogQWNjb3JkaW5nIHRvIHNlY3Rpb24gMi4yIG9mIFJGQyA0NDI5LCB3ZSBtdXN0IG5vdAorCSAqIHNlbmQgcm91dGVyIHNvbGljaXRhdGlvbnMgd2l0aCBhIHNsbGFvIGZyb20KKwkgKiBvcHRpbWlzdGljIGFkZHJlc3NlcywgYnV0IHdlIG1heSBzZW5kIHRoZSBzb2xpY2l0YXRpb24KKwkgKiBpZiB3ZSBkb24ndCBpbmNsdWRlIHRoZSBzbGxhby4gIFNvIGhlcmUgd2UgY2hlY2sKKwkgKiBpZiBvdXIgYWRkcmVzcyBpcyBvcHRpbWlzdGljLCBhbmQgaWYgc28sIHdlCisJICogc3VwcmVzcyB0aGUgaW5jbHVzaW9uIG9mIHRoZSBzbGxhby4KKwkgKi8KKwlpZiAoc2VuZF9zbGxhbykgeworCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAgPSBpcHY2X2dldF9pZmFkZHIoc2FkZHIsIGRldiwgMSk7CisJCWlmIChpZnApIHsKKwkJCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykgIHsKKwkJCQlzZW5kX3NsbGFvID0gMDsKKwkJCX0KKwkJCWluNl9pZmFfcHV0KGlmcCk7CisJCX0gZWxzZSB7CisJCQlzZW5kX3NsbGFvID0gMDsKKwkJfQogCX0KLQotCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7Ci0JaXA2X25kX2hkcihzaywgc2tiLCBkZXYsIHNhZGRyLCBkYWRkciwgSVBQUk9UT19JQ01QVjYsIGxlbik7Ci0KLQloZHIgPSAoc3RydWN0IGljbXA2aGRyICopc2tiX3B1dChza2IsIGxlbik7Ci0Jc2tiLT5oLnJhdyA9ICh1bnNpZ25lZCBjaGFyKiloZHI7Ci0JaGRyLT5pY21wNl90eXBlID0gTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTjsKLQloZHItPmljbXA2X2NvZGUgPSAwOwotCWhkci0+aWNtcDZfY2tzdW0gPSAwOwotCWhkci0+aWNtcDZfdW51c2VkID0gMDsKLQotCW9wdCA9ICh1OCopIChoZHIgKyAxKTsKLQotCWlmIChkZXYtPmFkZHJfbGVuKQotCQluZGlzY19maWxsX2FkZHJfb3B0aW9uKG9wdCwgTkRfT1BUX1NPVVJDRV9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAotCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOwotCi0JLyogY2hlY2tzdW0gKi8KLQloZHItPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgZGFkZHIsIGxlbiwKLQkJCQkJICAgSVBQUk9UT19JQ01QVjYsCi0JCQkJCSAgIGNzdW1fcGFydGlhbCgoX191OCAqKSBoZHIsIGxlbiwgMCkpOwotCi0JLyogc2VuZCBpdCEgKi8KLQlza2ItPmRzdCA9IGRzdDsKLQlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOwotCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwotCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwotCWlmICghZXJyKSB7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUUk9VVEVSU09MSUNJVFMpOwotCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOwotCX0KLQotCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKLQkJaW42X2Rldl9wdXQoaWRldik7CisjZW5kaWYKKwlfX25kaXNjX3NlbmQoZGV2LCBOVUxMLCBkYWRkciwgc2FkZHIsCisJCSAgICAgJmljbXA2aCwgTlVMTCwKKwkJICAgICBzZW5kX3NsbGFvID8gTkRfT1BUX1NPVVJDRV9MTF9BRERSIDogMCwKKwkJICAgICBJQ01QNl9NSUJfT1VUUk9VVEVSU09MSUNJVFMpOwogfQogCiAKQEAgLTcwOCw4ICs2MjQsOCBAQAogCXN0cnVjdCBpbjZfYWRkciAqdGFyZ2V0ID0gKHN0cnVjdCBpbjZfYWRkciAqKSZuZWlnaC0+cHJpbWFyeV9rZXk7CiAJaW50IHByb2JlcyA9IGF0b21pY19yZWFkKCZuZWlnaC0+cHJvYmVzKTsKIAotCWlmIChza2IgJiYgaXB2Nl9jaGtfYWRkcigmc2tiLT5uaC5pcHY2aC0+c2FkZHIsIGRldiwgMSkpCi0JCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCWlmIChza2IgJiYgaXB2Nl9jaGtfYWRkcigmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIGRldiwgMSkpCisJCXNhZGRyID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOwogCiAJaWYgKChwcm9iZXMgLT0gbmVpZ2gtPnBhcm1zLT51Y2FzdF9wcm9iZXMpIDwgMCkgewogCQlpZiAoIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgewpAQCAtNzMyLDExICs2NDgsMTIgQEAKIAogc3RhdGljIHZvaWQgbmRpc2NfcmVjdl9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuZF9tc2cgKm1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiLT5oLnJhdzsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOwotCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJc3RydWN0IG5kX21zZyAqbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAl1OCAqbGxhZGRyID0gTlVMTDsKLQl1MzIgbmRvcHRsZW4gPSBza2ItPnRhaWwgLSBtc2ctPm9wdDsKKwl1MzIgbmRvcHRsZW4gPSBza2ItPnRhaWwgLSAoc2tiLT50cmFuc3BvcnRfaGVhZGVyICsKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IG5kX21zZywgb3B0KSk7CiAJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CkBAIC03OTYsMjggKzcxMyw0MCBAQAogCWluYyA9IGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZGFkZHIpOwogCiAJaWYgKChpZnAgPSBpcHY2X2dldF9pZmFkZHIoJm1zZy0+dGFyZ2V0LCBkZXYsIDEpKSAhPSBOVUxMKSB7Ci0JCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfVEVOVEFUSVZFKSB7Ci0JCQkvKiBBZGRyZXNzIGlzIHRlbnRhdGl2ZS4gSWYgdGhlIHNvdXJjZQotCQkJICAgaXMgdW5zcGVjaWZpZWQgYWRkcmVzcywgaXQgaXMgc29tZW9uZQotCQkJICAgZG9lcyBEQUQsIG90aGVyd2lzZSB3ZSBpZ25vcmUgc29saWNpdGF0aW9ucwotCQkJICAgdW50aWwgREFEIHRpbWVyIGV4cGlyZXMuCi0JCQkgKi8KLQkJCWlmICghZGFkKQotCQkJCWdvdG8gb3V0OwotCQkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgewotCQkJCXVuc2lnbmVkIGNoYXIgKnNhZHIgPSBza2ItPm1hYy5yYXc7Ci0JCQkJaWYgKCgoc2Fkcls4XSBeIGRldi0+ZGV2X2FkZHJbMF0pICYgMHg3ZikgPT0gMCAmJgotCQkJCSAgICBzYWRyWzldID09IGRldi0+ZGV2X2FkZHJbMV0gJiYKLQkJCQkgICAgc2FkclsxMF0gPT0gZGV2LT5kZXZfYWRkclsyXSAmJgotCQkJCSAgICBzYWRyWzExXSA9PSBkZXYtPmRldl9hZGRyWzNdICYmCi0JCQkJICAgIHNhZHJbMTJdID09IGRldi0+ZGV2X2FkZHJbNF0gJiYKLQkJCQkgICAgc2FkclsxM10gPT0gZGV2LT5kZXZfYWRkcls1XSkgewotCQkJCQkvKiBsb29wZWQtYmFjayB0byB1cyAqLwotCQkJCQlnb3RvIG91dDsKKworCQlpZiAoaWZwLT5mbGFncyAmIChJRkFfRl9URU5UQVRJVkV8SUZBX0ZfT1BUSU1JU1RJQykpIHsKKwkJCWlmIChkYWQpIHsKKwkJCQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKSB7CisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhZHI7CisJCQkJCXNhZHIgPSBza2JfbWFjX2hlYWRlcihza2IpOworCQkJCQlpZiAoKChzYWRyWzhdIF4gZGV2LT5kZXZfYWRkclswXSkgJiAweDdmKSA9PSAwICYmCisJCQkJCSAgICBzYWRyWzldID09IGRldi0+ZGV2X2FkZHJbMV0gJiYKKwkJCQkJICAgIHNhZHJbMTBdID09IGRldi0+ZGV2X2FkZHJbMl0gJiYKKwkJCQkJICAgIHNhZHJbMTFdID09IGRldi0+ZGV2X2FkZHJbM10gJiYKKwkJCQkJICAgIHNhZHJbMTJdID09IGRldi0+ZGV2X2FkZHJbNF0gJiYKKwkJCQkJICAgIHNhZHJbMTNdID09IGRldi0+ZGV2X2FkZHJbNV0pIHsKKwkJCQkJCS8qIGxvb3BlZC1iYWNrIHRvIHVzICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQogCQkJCX0KKworCQkJCS8qCisJCQkJICogV2UgYXJlIGNvbGxpZGluZyB3aXRoIGFub3RoZXIgbm9kZQorCQkJCSAqIHdobyBpcyBkb2luZyBEQUQKKwkJCQkgKiBzbyBmYWlsIG91ciBEQUQgcHJvY2VzcworCQkJCSAqLworCQkJCWFkZHJjb25mX2RhZF9mYWlsdXJlKGlmcCk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyBub3QgYSBkYWQgc29saWNpdGF0aW9uLgorCQkJCSAqIElmIHdlIGFyZSBhbiBvcHRpbWlzdGljIG5vZGUsCisJCQkJICogd2Ugc2hvdWxkIHJlc3BvbmQuCisJCQkJICogT3RoZXJ3aXNlLCB3ZSBzaG91bGQgaWdub3JlIGl0LgorCQkJCSAqLworCQkJCWlmICghKGlmcC0+ZmxhZ3MgJiBJRkFfRl9PUFRJTUlTVElDKSkKKwkJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlhZGRyY29uZl9kYWRfZmFpbHVyZShpZnApOwotCQkJcmV0dXJuOwogCQl9CiAKIAkJaWRldiA9IGlmcC0+aWRldjsKQEAgLTg5OCwxMSArODI3LDEyIEBACiAKIHN0YXRpYyB2b2lkIG5kaXNjX3JlY3ZfbmEoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgbmRfbXNnICptc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYi0+aC5yYXc7Ci0Jc3RydWN0IGluNl9hZGRyICpzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKLQlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCXN0cnVjdCBuZF9tc2cgKm1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOworCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJdTggKmxsYWRkciA9IE5VTEw7Ci0JdTMyIG5kb3B0bGVuID0gc2tiLT50YWlsIC0gbXNnLT5vcHQ7CisJdTMyIG5kb3B0bGVuID0gc2tiLT50YWlsIC0gKHNrYi0+dHJhbnNwb3J0X2hlYWRlciArCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBuZF9tc2csIG9wdCkpOwogCXN0cnVjdCBuZGlzY19vcHRpb25zIG5kb3B0czsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwpAQCAtMTAwMCwxMSArOTMwLDExIEBACiAKIHN0YXRpYyB2b2lkIG5kaXNjX3JlY3ZfcnMoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgcnNfbXNnICpyc19tc2cgPSAoc3RydWN0IHJzX21zZyAqKSBza2ItPmgucmF3OworCXN0cnVjdCByc19tc2cgKnJzX21zZyA9IChzdHJ1Y3QgcnNfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAl1bnNpZ25lZCBsb25nIG5kb3B0bGVuID0gc2tiLT5sZW4gLSBzaXplb2YoKnJzX21zZyk7CiAJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CiAJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOwogCXU4ICpsbGFkZHIgPSBOVUxMOwogCkBAIC0xMDU3LDcgKzk4Nyw3IEBACiAKIHN0YXRpYyB2b2lkIG5kaXNjX3JvdXRlcl9kaXNjb3Zlcnkoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgcmFfbXNnICpyYV9tc2cgPSAoc3RydWN0IHJhX21zZyAqKSBza2ItPmgucmF3OworCXN0cnVjdCByYV9tc2cgKnJhX21zZyA9IChzdHJ1Y3QgcmFfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IE5VTEw7CiAJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gTlVMTDsKQEAgLTEwNjgsOSArOTk4LDkgQEAKIAogCV9fdTggKiBvcHQgPSAoX191OCAqKShyYV9tc2cgKyAxKTsKIAotCW9wdGxlbiA9IChza2ItPnRhaWwgLSBza2ItPmgucmF3KSAtIHNpemVvZihzdHJ1Y3QgcmFfbXNnKTsKKwlvcHRsZW4gPSAoc2tiLT50YWlsIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyKSAtIHNpemVvZihzdHJ1Y3QgcmFfbXNnKTsKIAotCWlmICghKGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5zYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSkgeworCWlmICghKGlwdjZfYWRkcl90eXBlKCZpcHY2X2hkcihza2IpLT5zYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSkgewogCQlORF9QUklOVEsyKEtFUk5fV0FSTklORwogCQkJICAgIklDTVB2NiBSQTogc291cmNlIGFkZHJlc3MgaXMgbm90IGxpbmstbG9jYWwuXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTEzNiw3ICsxMDY2LDcgQEAKIAkJcHJlZiA9IElDTVBWNl9ST1VURVJfUFJFRl9NRURJVU07CiAjZW5kaWYKIAotCXJ0ID0gcnQ2X2dldF9kZmx0X3JvdXRlcigmc2tiLT5uaC5pcHY2aC0+c2FkZHIsIHNrYi0+ZGV2KTsKKwlydCA9IHJ0Nl9nZXRfZGZsdF9yb3V0ZXIoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCBza2ItPmRldik7CiAKIAlpZiAocnQpCiAJCW5laWdoID0gcnQtPnJ0NmlfbmV4dGhvcDsKQEAgLTExNTEsNyArMTA4MSw3IEBACiAJCU5EX1BSSU5USzMoS0VSTl9ERUJVRwogCQkJICAgIklDTVB2NiBSQTogYWRkaW5nIGRlZmF1bHQgcm91dGVyLlxuIik7CiAKLQkJcnQgPSBydDZfYWRkX2RmbHRfcm91dGVyKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgc2tiLT5kZXYsIHByZWYpOworCQlydCA9IHJ0Nl9hZGRfZGZsdF9yb3V0ZXIoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCBza2ItPmRldiwgcHJlZik7CiAJCWlmIChydCA9PSBOVUxMKSB7CiAJCQlORF9QUklOVEswKEtFUk5fRVJSCiAJCQkJICAgIklDTVB2NiBSQTogJXMoKSBmYWlsZWQgdG8gYWRkIGRlZmF1bHQgcm91dGUuXG4iLApAQCAtMTIyMyw3ICsxMTUzLDcgQEAKIAkgKi8KIAogCWlmICghbmVpZ2gpCi0JCW5laWdoID0gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQluZWlnaCA9IF9fbmVpZ2hfbG9va3VwKCZuZF90YmwsICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCQkgICAgICAgc2tiLT5kZXYsIDEpOwogCWlmIChuZWlnaCkgewogCQl1OCAqbGxhZGRyID0gTlVMTDsKQEAgLTEyNTIsNyArMTE4Miw3IEBACiAJCQlpZiAoKChzdHJ1Y3Qgcm91dGVfaW5mbyAqKXApLT5wcmVmaXhfbGVuID4gaW42X2Rldi0+Y25mLmFjY2VwdF9yYV9ydF9pbmZvX21heF9wbGVuKQogCQkJCWNvbnRpbnVlOwogCQkJcnQ2X3JvdXRlX3Jjdihza2ItPmRldiwgKHU4KilwLCAocC0+bmRfb3B0X2xlbikgPDwgMywKLQkJCQkgICAgICAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOworCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkcik7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTEzMTEsMTMgKzEyNDEsMTMgQEAKIAlpbnQgb3B0bGVuOwogCXU4ICpsbGFkZHIgPSBOVUxMOwogCi0JaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CisJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CiAJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCiAJCQkgICAiSUNNUHY2IFJlZGlyZWN0OiBzb3VyY2UgYWRkcmVzcyBpcyBub3QgbGluay1sb2NhbC5cbiIpOwogCQlyZXR1cm47CiAJfQogCi0Jb3B0bGVuID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwlvcHRsZW4gPSBza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CiAJb3B0bGVuIC09IHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgMiAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwogCiAJaWYgKG9wdGxlbiA8IDApIHsKQEAgLTEzMjYsNyArMTI1Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpY21waCA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwlpY21waCA9IGljbXA2X2hkcihza2IpOwogCXRhcmdldCA9IChzdHJ1Y3QgaW42X2FkZHIgKikgKGljbXBoICsgMSk7CiAJZGVzdCA9IHRhcmdldCArIDE7CiAKQEAgLTEzNzYsOCArMTMwNiw4IEBACiAKIAluZWlnaCA9IF9fbmVpZ2hfbG9va3VwKCZuZF90YmwsIHRhcmdldCwgc2tiLT5kZXYsIDEpOwogCWlmIChuZWlnaCkgewotCQlydDZfcmVkaXJlY3QoZGVzdCwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsIG5laWdoLCBsbGFkZHIsCisJCXJ0Nl9yZWRpcmVjdChkZXN0LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkgICAgICZpcHY2X2hkcihza2IpLT5zYWRkciwgbmVpZ2gsIGxsYWRkciwKIAkJCSAgICAgb25fbGluayk7CiAJCW5laWdoX3JlbGVhc2UobmVpZ2gpOwogCX0KQEAgLTE0MDYsMjEgKzEzMzYsMjEgQEAKIAogCWRldiA9IHNrYi0+ZGV2OwogCi0JaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZzYWRkcl9idWYpKSB7CisJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZzYWRkcl9idWYsIElGQV9GX1RFTlRBVElWRSkpIHsKIAkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKIAkJCSAgICJJQ01QdjYgUmVkaXJlY3Q6IG5vIGxpbmstbG9jYWwgYWRkcmVzcyBvbiAlc1xuIiwKIAkJCSAgIGRldi0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIHRhcmdldCkgJiYKKwlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIHRhcmdldCkgJiYKIAkgICAgIShpcHY2X2FkZHJfdHlwZSh0YXJnZXQpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpIHsKIAkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKIAkJCSJJQ01QdjYgUmVkaXJlY3Q6IHRhcmdldCBhZGRyZXNzIGlzIG5vdCBsaW5rLWxvY2FsLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQluZGlzY19mbG93X2luaXQoJmZsLCBORElTQ19SRURJUkVDVCwgJnNhZGRyX2J1ZiwgJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIE5ESVNDX1JFRElSRUNULCAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQlkZXYtPmlmaW5kZXgpOwogCiAJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwpOwpAQCAtMTQ3NSwxMSArMTQwNSwxMiBAQAogCWhsZW4gPSAwOwogCiAJc2tiX3Jlc2VydmUoYnVmZiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7Ci0JaXA2X25kX2hkcihzaywgYnVmZiwgZGV2LCAmc2FkZHJfYnVmLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJaXA2X25kX2hkcihzaywgYnVmZiwgZGV2LCAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCSAgIElQUFJPVE9fSUNNUFY2LCBsZW4pOwogCi0JaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopc2tiX3B1dChidWZmLCBsZW4pOwotCWJ1ZmYtPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKWljbXBoOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihidWZmLCBza2JfdGFpbF9wb2ludGVyKGJ1ZmYpIC0gYnVmZi0+ZGF0YSk7CisJc2tiX3B1dChidWZmLCBsZW4pOworCWljbXBoID0gaWNtcDZfaGRyKGJ1ZmYpOwogCiAJbWVtc2V0KGljbXBoLCAwLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CiAJaWNtcGgtPmljbXA2X3R5cGUgPSBORElTQ19SRURJUkVDVDsKQEAgLTE0OTEsNyArMTQyMiw3IEBACiAJYWRkcnAgPSAoc3RydWN0IGluNl9hZGRyICopKGljbXBoICsgMSk7CiAJaXB2Nl9hZGRyX2NvcHkoYWRkcnAsIHRhcmdldCk7CiAJYWRkcnArKzsKLQlpcHY2X2FkZHJfY29weShhZGRycCwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weShhZGRycCwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAogCW9wdCA9ICh1OCopIChhZGRycCArIDEpOwogCkBAIC0xNTEyLDkgKzE0NDMsOSBAQAogCSoob3B0KyspID0gKHJkX2xlbiA+PiAzKTsKIAlvcHQgKz0gNjsKIAotCW1lbWNweShvcHQsIHNrYi0+bmguaXB2NmgsIHJkX2xlbiAtIDgpOworCW1lbWNweShvcHQsIGlwdjZfaGRyKHNrYiksIHJkX2xlbiAtIDgpOwogCi0JaWNtcGgtPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZzYWRkcl9idWYsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwlpY21waC0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJnNhZGRyX2J1ZiwgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkJCQkgICAgIGxlbiwgSVBQUk9UT19JQ01QVjYsCiAJCQkJCSAgICAgY3N1bV9wYXJ0aWFsKCh1OCAqKSBpY21waCwgbGVuLCAwKSk7CiAKQEAgLTE1NDQsMTQgKzE0NzUsMTQgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2ItPmxlbikpCiAJCXJldHVybiAwOwogCi0JbXNnID0gKHN0cnVjdCBuZF9tc2cgKikgc2tiLT5oLnJhdzsKKwltc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKLQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhLXNrYi0+aC5yYXcpOworCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpKTsKIAotCWlmIChza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQgIT0gMjU1KSB7CisJaWYgKGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdCAhPSAyNTUpIHsKIAkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKIAkJCSAgICJJQ01QdjYgTkRJU0M6IGludmFsaWQgaG9wLWxpbWl0OiAlZFxuIiwKLQkJCSAgIHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCk7CisJCQkgICBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1ODQsNyArMTUxNSw3IEBACiAJY2FzZSBORElTQ19SRURJUkVDVDoKIAkJbmRpc2NfcmVkaXJlY3RfcmN2KHNrYik7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci5jCmluZGV4IDFjNDA1ZGQuLjM4YjE0OTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci5jCkBAIC0xMSw3ICsxMSw3IEBACiAKIGludCBpcDZfcm91dGVfbWVfaGFyZGVyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBmbG93aSBmbCA9IHsKIAkJLm9pZiA9IHNrYi0+c2sgPyBza2ItPnNrLT5za19ib3VuZF9kZXZfaWYgOiAwLApAQCAtNjEsNyArNjEsNyBAQAogCXN0cnVjdCBpcDZfcnRfaW5mbyAqcnRfaW5mbyA9IG5mX2luZm9fcmVyb3V0ZShpbmZvKTsKIAogCWlmIChpbmZvLT5ob29rID09IE5GX0lQNl9MT0NBTF9PVVQpIHsKLQkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCiAJCXJ0X2luZm8tPmRhZGRyID0gaXBoLT5kYWRkcjsKIAkJcnRfaW5mby0+c2FkZHIgPSBpcGgtPnNhZGRyOwpAQCAtNzMsNyArNzMsNyBAQAogCXN0cnVjdCBpcDZfcnRfaW5mbyAqcnRfaW5mbyA9IG5mX2luZm9fcmVyb3V0ZShpbmZvKTsKIAogCWlmIChpbmZvLT5ob29rID09IE5GX0lQNl9MT0NBTF9PVVQpIHsKLQkJc3RydWN0IGlwdjZoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwdjZoOworCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoKnBza2IpOwogCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmaXBoLT5kYWRkciwgJnJ0X2luZm8tPmRhZGRyKSB8fAogCQkgICAgIWlwdjZfYWRkcl9lcXVhbCgmaXBoLT5zYWRkciwgJnJ0X2luZm8tPnNhZGRyKSkKIAkJCXJldHVybiBpcDZfcm91dGVfbWVfaGFyZGVyKCpwc2tiKTsKQEAgLTg0LDcgKzg0LDcgQEAKIF9fc3VtMTYgbmZfaXA2X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAogCQkJICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwNmggPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAlfX3N1bTE2IGNzdW0gPSAwOwogCiAJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCmluZGV4IGZkYjMwYTUuLjAwMDRkYjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKQEAgLTExLDE4ICsxMSw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDIwMDEtMTEtMDY6IEZpcnN0IHRyeS4gV29ya2luZyB3aXRoIGlwX3F1ZXVlLmMgZm9yIElQdjQgYW5kIHRyeWluZwotICogICAgICAgICAgICAgdG8gYWRhcHQgaXQgdG8gSVB2NgotICogICAgICAgICAgICAgSEVBVklMWSBiYXNlZCBpbiBpcHF1ZXVlLmMgYnkgSmFtZXMgTW9ycmlzLiBJdCdzIGp1c3QKLSAqICAgICAgICAgICAgIGEgbGl0dGxlIG1vZGlmaWVkIHZlcnNpb24gb2YgaXQsIHNvIGhlJ3MgbmVhcmx5IHRoZQotICogICAgICAgICAgICAgcmVhbCBjb2RlciBvZiB0aGlzLgotICogICAgICAgICAgICAgRmV3IGNoYW5nZXMgbmVlZGVkLCBtYWlubHkgdGhlIGhhcmRfcm91dGluZyBjb2RlIGFuZAotICogICAgICAgICAgICAgdGhlIG5ldGxpbmsgc29ja2V0IHByb3RvY29sICh3ZSdyZSBORVRMSU5LX0lQNl9GVykuCi0gKiAyMDAyLTA2LTI1OiBDb2RlIGNsZWFudXAuIFtKTTogcG9ydGVkIGNsZWFudXAgb3ZlciBmcm9tIGlwX3F1ZXVlLmNdCi0gKiAyMDA1LTAyLTA0OiBBZGRlZCAvcHJvYyBjb3VudGVyIGZvciBkcm9wcGVkIHBhY2tldHM7IGZpeGVkIHNvCi0gKiAgICAgICAgICAgICBwYWNrZXRzIGFyZW4ndCBkZWxpdmVyZWQgdG8gdXNlciBzcGFjZSBpZiB0aGV5J3JlIGdvaW5nCi0gKiAgICAgICAgICAgICB0byBiZSBkcm9wcGVkLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0xODksMTIgKzE3NywxMyBAQAogc3RhdGljIHN0cnVjdCBza19idWZmICoKIGlwcV9idWlsZF9wYWNrZXRfbWVzc2FnZShzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeSwgaW50ICplcnJwKQogewotCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOworCXNrX2J1ZmZfZGF0YV90IG9sZF90YWlsOwogCXNpemVfdCBzaXplID0gMDsKIAlzaXplX3QgZGF0YV9sZW4gPSAwOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGlwcV9wYWNrZXRfbXNnICpwbXNnOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCB0aW1ldmFsIHR2OwogCiAJcmVhZF9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIApAQCAtMjMyLDE1ICsyMjEsMTYgQEAKIAlpZiAoIXNrYikKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCi0Jb2xkX3RhaWw9IHNrYi0+dGFpbDsKKwlvbGRfdGFpbCA9IHNrYi0+dGFpbDsKIAlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCBJUFFNX1BBQ0tFVCwgc2l6ZSAtIHNpemVvZigqbmxoKSk7CiAJcG1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAltZW1zZXQocG1zZywgMCwgc2l6ZW9mKCpwbXNnKSk7CiAKIAlwbXNnLT5wYWNrZXRfaWQgICAgICAgPSAodW5zaWduZWQgbG9uZyApZW50cnk7CiAJcG1zZy0+ZGF0YV9sZW4gICAgICAgID0gZGF0YV9sZW47Ci0JcG1zZy0+dGltZXN0YW1wX3NlYyAgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl9zZWM7Ci0JcG1zZy0+dGltZXN0YW1wX3VzZWMgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl91c2VjOworCXR2ID0ga3RpbWVfdG9fdGltZXZhbChlbnRyeS0+c2tiLT50c3RhbXApOworCXBtc2ctPnRpbWVzdGFtcF9zZWMgICA9IHR2LnR2X3NlYzsKKwlwbXNnLT50aW1lc3RhbXBfdXNlYyAgPSB0di50dl91c2VjOwogCXBtc2ctPm1hcmsgICAgICAgICAgICA9IGVudHJ5LT5za2ItPm1hcms7CiAJcG1zZy0+aG9vayAgICAgICAgICAgID0gZW50cnktPmluZm8tPmhvb2s7CiAJcG1zZy0+aHdfcHJvdG9jb2wgICAgID0gZW50cnktPnNrYi0+cHJvdG9jb2w7CkBAIC0zNzYsNyArMzY2LDcgQEAKIAl9CiAJaWYgKCFza2JfbWFrZV93cml0YWJsZSgmZS0+c2tiLCB2LT5kYXRhX2xlbikpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShlLT5za2ItPmRhdGEsIHYtPnBheWxvYWQsIHYtPmRhdGFfbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShlLT5za2IsIHYtPnBheWxvYWQsIHYtPmRhdGFfbGVuKTsKIAllLT5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAlyZXR1cm4gMDsKQEAgLTQ4NSw3ICs0NzUsNyBAQAogCWlmIChza2JsZW4gPCBzaXplb2YoKm5saCkpCiAJCXJldHVybjsKIAotCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJbmxtc2dsZW4gPSBubGgtPm5sbXNnX2xlbjsKIAlpZiAobmxtc2dsZW4gPCBzaXplb2YoKm5saCkgfHwgc2tibGVuIDwgbmxtc2dsZW4pCiAJCXJldHVybjsKQEAgLTY2Nyw3ICs2NTcsNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKIAogCW5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJmlwcV9ubF9ub3RpZmllcik7Ci0JaXBxbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19JUDZfRlcsIDAsIGlwcV9yY3Zfc2ssCisJaXBxbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19JUDZfRlcsIDAsIGlwcV9yY3Zfc2ssIE5VTEwsCiAJCQkJICAgICAgVEhJU19NT0RVTEUpOwogCWlmIChpcHFubCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXA2X3F1ZXVlOiBmYWlsZWQgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0XG4iKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDdjNTEyZTEuLjlhYTYyNDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtNywxNSArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE5IEphbiAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJLSBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgYXMgc29vbiBhcyB3ZSBoYXZlIHJ1bGVzIGluc2lkZQotICogCSAgYSB0YWJsZQotICogMDYgSnVuIDIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KLSAqICAgICAgLSBuZXcgZXh0ZW5zaW9uIGhlYWRlciBwYXJzZXIgY29kZQotICogMTUgT2N0IDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKiAJLSBVbmlmaWNhdGlvbiBvZiB7aXAsaXA2fV90YWJsZXMgaW50byB4X3RhYmxlcwotICogCS0gUmVtb3ZlZCB0Y3AgYW5kIHVkcCBjb2RlLCBzaW5jZSBpdCdzIG5vdCBpcHY2IHNwZWNpZmljCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTExNSw3ICsxMDYsNyBAQAogewogCXNpemVfdCBpOwogCXVuc2lnbmVkIGxvbmcgcmV0OwotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcHY2ID0gc2tiLT5uaC5pcHY2aDsKKwljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXB2NiA9IGlwdjZfaGRyKHNrYik7CiAKICNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShpcDZpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCiAKQEAgLTMwMSw3ICsyOTIsNyBAQAogCQkJCWdvdG8gbm9fbWF0Y2g7CiAKIAkJCUFERF9DT1VOVEVSKGUtPmNvdW50ZXJzLAotCQkJCSAgICBudG9ocygoKnBza2IpLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pCisJCQkJICAgIG50b2hzKGlwdjZfaGRyKCpwc2tiKS0+cGF5bG9hZF9sZW4pCiAJCQkJICAgICsgSVBWNl9IRFJfTEVOLAogCQkJCSAgICAxKTsKIApAQCAtMTQ0OCw4ICsxNDM5LDggQEAKIGludCBpcHY2X2ZpbmRfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqb2Zmc2V0LAogCQkgIGludCB0YXJnZXQsIHVuc2lnbmVkIHNob3J0ICpmcmFnb2ZmKQogewotCXVuc2lnbmVkIGludCBzdGFydCA9ICh1OCopKHNrYi0+bmguaXB2NmggKyAxKSAtIHNrYi0+ZGF0YTsKLQl1OCBuZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwl1bnNpZ25lZCBpbnQgc3RhcnQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJdTggbmV4dGhkciA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuIC0gc3RhcnQ7CiAKIAlpZiAoZnJhZ29mZikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCmluZGV4IGNjYmFiNjYuLjQxMTVhNTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwpAQCAtMzIsNyArMzIsNyBAQAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlpcDZoID0gKCpwc2tiKS0+bmguaXB2Nmg7CisJaXA2aCA9IGlwdjZfaGRyKCpwc2tiKTsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewogCQljYXNlIElQNlRfSExfU0VUOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwppbmRleCBhZmFhMDM5Li41YmI5Y2QzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwpAQCAtMzk2LDggKzM5Niw4IEBACiAJCS8qIE1BQyBsb2dnaW5nIGZvciBpbnB1dCBjaGFpbiBvbmx5LiAqLwogCQlwcmludGsoIk1BQz0iKTsKIAkJaWYgKHNrYi0+ZGV2ICYmIChsZW4gPSBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuKSAmJgotCQkgICAgc2tiLT5tYWMucmF3ICE9IHNrYi0+bmgucmF3KSB7Ci0JCQl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OworCQkgICAgc2tiLT5tYWNfaGVhZGVyICE9IHNrYi0+bmV0d29ya19oZWFkZXIpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBza2JfbWFjX2hlYWRlcihza2IpOwogCQkJaW50IGk7CiAKIAkJCWlmIChza2ItPmRldi0+dHlwZSA9PSBBUlBIUkRfU0lUICYmCkBAIC00MTIsNyArNDEyLDggQEAKIAkJCXByaW50aygiICIpOwogCiAJCQlpZiAoc2tiLT5kZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCkgewotCQkJCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+bWFjLnJhdzsKKwkJCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9CisJCQkJCShzdHJ1Y3QgaXBoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwogCQkJCXByaW50aygiVFVOTkVMPSV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSAiLAogCQkJCSAgICAgICBOSVBRVUFEKGlwaC0+c2FkZHIpLAogCQkJCSAgICAgICBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKQEAgLTQyMSw3ICs0MjIsNyBAQAogCQkJcHJpbnRrKCIgIik7CiAJfQogCi0JZHVtcF9wYWNrZXQobG9naW5mbywgc2tiLCAodTgqKXNrYi0+bmguaXB2NmggLSBza2ItPmRhdGEsIDEpOworCWR1bXBfcGFja2V0KGxvZ2luZm8sIHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksIDEpOwogCXByaW50aygiXG4iKTsKIAlzcGluX3VubG9ja19iaCgmbG9nX2xvY2spOwogfQpAQCAtNDg5LDE0ICs0OTAsMTAgQEAKIAlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JaWYgKG5mX2xvZ19yZWdpc3RlcihQRl9JTkVUNiwgJmlwNnRfbG9nZ2VyKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXA2dF9MT0c6IG5vdCBsb2dnaW5nIHZpYSBzeXN0ZW0gY29uc29sZSAiCi0JCSAgICAgICAic2luY2Ugc29tZWJvZHkgZWxzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIFBGX0lORVQ2XG4iKTsKLQkJLyogd2UgY2Fubm90IG1ha2UgbW9kdWxlIGxvYWQgZmFpbCBoZXJlLCBzaW5jZSBvdGhlcndpc2UKLQkJICogaXA2dGFibGVzIHVzZXJzcGFjZSB3b3VsZCBhYm9ydCAqLwotCX0KLQotCXJldHVybiAwOworCXJldCA9IG5mX2xvZ19yZWdpc3RlcihQRl9JTkVUNiwgJmlwNnRfbG9nZ2VyKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVFWElTVCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfbG9nX2Zpbmkodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggNmFiZWU5NC4uY2IzZDI0MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlzdHJ1Y3QgdGNwaGRyIG90Y3BoLCAqdGNwaDsKIAl1bnNpZ25lZCBpbnQgb3RjcGxlbiwgaGhfbGVuOwogCWludCB0Y3Bob2ZmLCBuZWVkc19hY2s7Ci0Jc3RydWN0IGlwdjZoZHIgKm9pcDZoID0gb2xkc2tiLT5uaC5pcHY2aCwgKmlwNmg7CisJc3RydWN0IGlwdjZoZHIgKm9pcDZoID0gaXB2Nl9oZHIob2xkc2tiKSwgKmlwNmg7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKIAl1OCBwcm90bzsKIAlzdHJ1Y3QgZmxvd2kgZmw7CkBAIC0xMjAsOCArMTIwLDkgQEAKIAogCXNrYl9yZXNlcnZlKG5za2IsIGhoX2xlbiArIGRzdC0+aGVhZGVyX2xlbik7CiAKLQlpcDZoID0gbnNrYi0+bmguaXB2NmggPSAoc3RydWN0IGlwdjZoZHIgKikKLQkJCQkJc2tiX3B1dChuc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2JfcHV0KG5za2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihuc2tiKTsKKwlpcDZoID0gaXB2Nl9oZHIobnNrYik7CiAJaXA2aC0+dmVyc2lvbiA9IDY7CiAJaXA2aC0+aG9wX2xpbWl0ID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfSE9QTElNSVQpOwogCWlwNmgtPm5leHRoZHIgPSBJUFBST1RPX1RDUDsKQEAgLTE1NSw4ICsxNTYsOCBAQAogCXRjcGgtPmNoZWNrID0gMDsKIAogCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW0gKi8KLQl0Y3BoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmbnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCSAgICAgICZuc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJdGNwaC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKG5za2IpLT5zYWRkciwKKwkJCQkgICAgICAmaXB2Nl9oZHIobnNrYiktPmRhZGRyLAogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgSVBQUk9UT19UQ1AsCiAJCQkJICAgICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGNwaCwKIAkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgMCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKaW5kZXggOTY3YmVkNy4uMGYzZGQ5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCkBAIC0zMiw4ICszMiw4IEBACiAJdW5zaWduZWQgY2hhciBldWk2NFs4XTsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIShza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkICYmCi0JICAgICAgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEpICYmCisJaWYgKCEoc2tiX21hY19oZWFkZXIoc2tiKSA+PSBza2ItPmhlYWQgJiYKKwkgICAgICAoc2tiX21hY19oZWFkZXIoc2tiKSArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEpICYmCiAJICAgIG9mZnNldCAhPSAwKSB7CiAJCSpob3Rkcm9wID0gMTsKIAkJcmV0dXJuIDA7CkBAIC00Miw3ICs0Miw3IEBACiAJbWVtc2V0KGV1aTY0LCAwLCBzaXplb2YoZXVpNjQpKTsKIAogCWlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJaWYgKHNrYi0+bmguaXB2NmgtPnZlcnNpb24gPT0gMHg2KSB7CisJCWlmIChpcHY2X2hkcihza2IpLT52ZXJzaW9uID09IDB4NikgewogCQkJbWVtY3B5KGV1aTY0LCBldGhfaGRyKHNrYiktPmhfc291cmNlLCAzKTsKIAkJCW1lbWNweShldWk2NCArIDUsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UgKyAzLCAzKTsKIAkJCWV1aTY0WzNdID0gMHhmZjsKQEAgLTUwLDcgKzUwLDcgQEAKIAkJCWV1aTY0WzBdIHw9IDB4MDI7CiAKIAkJCWkgPSAwOwotCQkJd2hpbGUgKChza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyWzgraV0gPT0gZXVpNjRbaV0pCisJCQl3aGlsZSAoKGlwdjZfaGRyKHNrYiktPnNhZGRyLnM2X2FkZHJbOCArIGldID09IGV1aTY0W2ldKQogCQkJICAgICAgICYmIChpIDwgOCkpCiAJCQkJaSsrOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwppbmRleCAzN2M4YTRkLi5kNjA2YzBlNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCkBAIC0yNSw3ICsyNSw3IEBACiAJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcDZ0X2hsX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBza2ItPm5oLmlwdjZoOworCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewogCQljYXNlIElQNlRfSExfRVE6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggNzAwYTExZC4uZmQ2YTA4NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtNDUsNyArNDUsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGlzIGlzbid0IGFuIGV2aWwgcGFja2V0ICovCiAKIAkvKiB0eXBlIG9mIHRoZSAxc3QgZXh0aGRyICovCi0JbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJbmV4dGhkciA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAJLyogcG9pbnRlciB0byB0aGUgMXN0IGV4dGhkciAqLwogCXB0ciA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJLyogYXZhaWxhYmxlIGxlbmd0aCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCmluZGV4IDExMmEyMWQuLjc2ZjBjZjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogI2lmIDAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkgICAgfHwgaXBfaGRybGVuKCpwc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoImlwNnRfaG9vazogaGFwcHkgY3JhY2tpbmcuXG4iKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwppbmRleCAwYzQ2OGQzLi5hOWYxMGUzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCkBAIC03LDggKzcsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBFeHRlbmRlZCB0byBhbGwgZml2ZSBuZXRmaWx0ZXIgaG9va3MgYnkgQnJhZCBDaGFwbWFuICYgSGFyYWxkIFdlbHRlCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CkBAIC0xMzgsNyArMTM2LDcgQEAKICNpZiAwCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJICAgIHx8IGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKCJpcDZ0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CiAJCXJldHVybiBORl9BQ0NFUFQ7CkBAIC0xNDYsMjEgKzE0NCwyMSBAQAogI2VuZGlmCiAKIAkvKiBzYXZlIHNvdXJjZS9kZXN0IGFkZHJlc3MsIG1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KLQltZW1jcHkoJnNhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKLQltZW1jcHkoJmRhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKKwltZW1jcHkoJnNhZGRyLCAmaXB2Nl9oZHIoKnBza2IpLT5zYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisJbWVtY3B5KCZkYWRkciwgJmlwdjZfaGRyKCpwc2tiKS0+ZGFkZHIsIHNpemVvZihkYWRkcikpOwogCW1hcmsgPSAoKnBza2IpLT5tYXJrOwotCWhvcF9saW1pdCA9ICgqcHNrYiktPm5oLmlwdjZoLT5ob3BfbGltaXQ7CisJaG9wX2xpbWl0ID0gaXB2Nl9oZHIoKnBza2IpLT5ob3BfbGltaXQ7CiAKIAkvKiBmbG93bGFiZWwgYW5kIHByaW8gKGluY2x1ZGVzIHZlcnNpb24sIHdoaWNoIHNob3VsZG4ndCBjaGFuZ2UgZWl0aGVyICovCi0JZmxvd2xhYmVsID0gKigodV9pbnQzMl90ICopICgqcHNrYiktPm5oLmlwdjZoKTsKKwlmbG93bGFiZWwgPSAqKCh1X2ludDMyX3QgKilpcHY2X2hkcigqcHNrYikpOwogCiAJcmV0ID0gaXA2dF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X21hbmdsZXIpOwogCiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KLQkJJiYgKG1lbWNtcCgmKCpwc2tiKS0+bmguaXB2NmgtPnNhZGRyLCAmc2FkZHIsIHNpemVvZihzYWRkcikpCi0JCSAgICB8fCBtZW1jbXAoJigqcHNrYiktPm5oLmlwdjZoLT5kYWRkciwgJmRhZGRyLCBzaXplb2YoZGFkZHIpKQorCQkmJiAobWVtY21wKCZpcHY2X2hkcigqcHNrYiktPnNhZGRyLCAmc2FkZHIsIHNpemVvZihzYWRkcikpCisJCSAgICB8fCBtZW1jbXAoJmlwdjZfaGRyKCpwc2tiKS0+ZGFkZHIsICZkYWRkciwgc2l6ZW9mKGRhZGRyKSkKIAkJICAgIHx8ICgqcHNrYiktPm1hcmsgIT0gbWFyawotCQkgICAgfHwgKCpwc2tiKS0+bmguaXB2NmgtPmhvcF9saW1pdCAhPSBob3BfbGltaXQpKQorCQkgICAgfHwgaXB2Nl9oZHIoKnBza2IpLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0KSkKIAkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoKnBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCmluZGV4IGQxMTAyNDUuLjZkMmEwODIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwpAQCAtNywxNyArNyw2IEBACiAgKgogICogQXV0aG9yOgogICoJWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gc3VwcG9ydCBMYXllciAzIHByb3RvY29sIGluZGVwZW5kZW50IGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgkgIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpcF9jb25udHJhY2sgY29kZSB3aGljaAloYWQgdGhlIGZvbGxvd2luZwotICoJICBjb3B5cmlnaHQgaW5mb3JtYXRpb246Ci0gKgkJKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICoJCShDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiAyMyBNYXIgMjAwNDogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gYWRkIGdldF9mZWF0dXJlcygpIHRvIHN1cHBvcnQgdmFyaW91cyBzaXplIG9mIGNvbm50cmFjawotICoJICBzdHJ1Y3R1cmVzLgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTM4LDE2ICsxMjcsMTAgQEAKIGlwdjZfcHJlcGFyZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgKmRhdGFvZmYsCiAJICAgICB1X2ludDhfdCAqcHJvdG9udW0pCiB7Ci0JdW5zaWduZWQgaW50IGV4dG9mZjsKLQl1bnNpZ25lZCBjaGFyIHBudW07Ci0JaW50IHByb3RvZmY7Ci0KLQlleHRvZmYgPSAodTgqKSgoKnBza2IpLT5uaC5pcHY2aCArIDEpIC0gKCpwc2tiKS0+ZGF0YTsKLQlwbnVtID0gKCpwc2tiKS0+bmguaXB2NmgtPm5leHRoZHI7Ci0KLQlwcm90b2ZmID0gbmZfY3RfaXB2Nl9za2lwX2V4dGhkcigqcHNrYiwgZXh0b2ZmLCAmcG51bSwKLQkJCQkJICgqcHNrYiktPmxlbiAtIGV4dG9mZik7Ci0KKwl1bnNpZ25lZCBpbnQgZXh0b2ZmID0gKHU4ICopKGlwdjZfaGRyKCpwc2tiKSArIDEpIC0gKCpwc2tiKS0+ZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHBudW0gPSBpcHY2X2hkcigqcHNrYiktPm5leHRoZHI7CisJaW50IHByb3RvZmYgPSBuZl9jdF9pcHY2X3NraXBfZXh0aGRyKCpwc2tiLCBleHRvZmYsICZwbnVtLAorCQkJCQkgICAgICgqcHNrYiktPmxlbiAtIGV4dG9mZik7CiAJLyoKIAkgKiAocHJvdG9mZiA9PSAoKnBza2IpLT5sZW4pIG1lYW4gdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgaGF2ZSBubyBkYXRhCiAJICogZXhjZXB0IG9mIElQdjYgJiBleHQgaGVhZGVycy4gYnV0IGl0J3MgdHJhY2tlZCBhbnl3YXkuIC0gWUsKQEAgLTE3OSw5ICsxNjIsOCBAQAogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJdW5zaWduZWQgaW50IHJldCwgcHJvdG9mZjsKLQl1bnNpZ25lZCBpbnQgZXh0b2ZmID0gKHU4KikoKCpwc2tiKS0+bmguaXB2NmggKyAxKQotCQkJICAgICAgLSAoKnBza2IpLT5kYXRhOwotCXVuc2lnbmVkIGNoYXIgcG51bSA9ICgqcHNrYiktPm5oLmlwdjZoLT5uZXh0aGRyOworCXVuc2lnbmVkIGludCBleHRvZmYgPSAodTggKikoaXB2Nl9oZHIoKnBza2IpICsgMSkgLSAoKnBza2IpLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgcG51bSA9IGlwdjZfaGRyKCpwc2tiKS0+bmV4dGhkcjsKIAogCiAJLyogVGhpcyBpcyB3aGVyZSB3ZSBjYWxsIHRoZSBoZWxwZXI6IGFzIHRoZSBwYWNrZXQgZ29lcyBvdXQuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwppbmRleCAwNzVkYTRmLi4wYmU3OTBkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKQEAgLTcsMTMgKzcsNiBAQAogICoKICAqIEF1dGhvcjoKICAqCVlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIElDTVB2NiB0cmFja2luZyBzdXBwb3J0LiBEZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIGlwX2Nvbm50cmFjayBjb2RlCi0gKgkgIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9faWNtcC5jIHdoaWNoIGhhZCB0aGUgZm9sbG93aW5nCi0gKgkgIGNvcHlyaWdodCBpbmZvcm1hdGlvbjoKLSAqCQkoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKgkJKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCmluZGV4IDE1YWIxZTMuLjM0N2FiNzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZgkJKmZyYWdtZW50czsKIAlpbnQJCQlsZW47CiAJaW50CQkJbWVhdDsKLQlzdHJ1Y3QgdGltZXZhbAkJc3RhbXA7CisJa3RpbWVfdAkJCXN0YW1wOwogCXVuc2lnbmVkIGludAkJY3N1bTsKIAlfX3U4CQkJbGFzdF9pbjsJLyogaGFzIGZpcnN0L2xhc3Qgc2VnbWVudCBhcnJpdmVkPyAqLwogI2RlZmluZSBDT01QTEVURQkJNApAQCAtMzUzLDkgKzM1Myw3IEBACiAJaXB2Nl9hZGRyX2NvcHkoJmZxLT5zYWRkciwgc3JjKTsKIAlpcHY2X2FkZHJfY29weSgmZnEtPmRhZGRyLCBkc3QpOwogCi0JaW5pdF90aW1lcigmZnEtPnRpbWVyKTsKLQlmcS0+dGltZXIuZnVuY3Rpb24gPSBuZl9jdF9mcmFnNl9leHBpcmU7Ci0JZnEtPnRpbWVyLmRhdGEgPSAobG9uZykgZnE7CisJc2V0dXBfdGltZXIoJmZxLT50aW1lciwgbmZfY3RfZnJhZzZfZXhwaXJlLCAodW5zaWduZWQgbG9uZylmcSk7CiAJc3Bpbl9sb2NrX2luaXQoJmZxLT5sb2NrKTsKIAlhdG9taWNfc2V0KCZmcS0+cmVmY250LCAxKTsKIApAQCAtNDAwLDE5ICszOTgsMjAgQEAKIAl9CiAKIAlvZmZzZXQgPSBudG9ocyhmaGRyLT5mcmFnX29mZikgJiB+MHg3OwotCWVuZCA9IG9mZnNldCArIChudG9ocyhza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgLQotCQkJKCh1OCAqKSAoZmhkciArIDEpIC0gKHU4ICopIChza2ItPm5oLmlwdjZoICsgMSkpKTsKKwllbmQgPSBvZmZzZXQgKyAobnRvaHMoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pIC0KKwkJCSgodTggKikoZmhkciArIDEpIC0gKHU4ICopKGlwdjZfaGRyKHNrYikgKyAxKSkpOwogCiAJaWYgKCh1bnNpZ25lZCBpbnQpZW5kID4gSVBWNl9NQVhQTEVOKSB7CiAJCURFQlVHUCgib2Zmc2V0IGlzIHRvbyBsYXJnZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sCi0JCQkJICAgICBjc3VtX3BhcnRpYWwoc2tiLT5uaC5yYXcsCi0JCQkJCQkgICh1OCopKGZoZHIgKyAxKSAtIHNrYi0+bmgucmF3LAorCQkJCSAgICAgY3N1bV9wYXJ0aWFsKG5oLCAodTggKikoZmhkciArIDEpIC0gbmgsCiAJCQkJCQkgIDApKTsKKwl9CiAKIAkvKiBJcyB0aGlzIHRoZSBmaW5hbCBmcmFnbWVudD8gKi8KIAlpZiAoIShmaGRyLT5mcmFnX29mZiAmIGh0b25zKElQNl9NRikpKSB7CkBAIC01NDIsNyArNTQxLDcgQEAKIAkJZnEtPmZyYWdtZW50cyA9IHNrYjsKIAogCXNrYi0+ZGV2ID0gTlVMTDsKLQlza2JfZ2V0X3RpbWVzdGFtcChza2IsICZmcS0+c3RhbXApOworCWZxLT5zdGFtcCA9IHNrYi0+dHN0YW1wOwogCWZxLT5tZWF0ICs9IHNrYi0+bGVuOwogCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJm5mX2N0X2ZyYWc2X21lbSk7CiAKQEAgLTU4Myw3ICs1ODIsOSBAQAogCUJVR19UUkFQKE5GQ1RfRlJBRzZfQ0IoaGVhZCktPm9mZnNldCA9PSAwKTsKIAogCS8qIFVuZnJhZ21lbnRlZCBwYXJ0IGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IHNlZ21lbnQuICovCi0JcGF5bG9hZF9sZW4gPSAoaGVhZC0+ZGF0YSAtIGhlYWQtPm5oLnJhdykgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCXBheWxvYWRfbGVuID0gKChoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKSAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAJaWYgKHBheWxvYWRfbGVuID4gSVBWNl9NQVhQTEVOKSB7CiAJCURFQlVHUCgicGF5bG9hZCBsZW4gaXMgdG9vIGxhcmdlLlxuIik7CiAJCWdvdG8gb3V0X292ZXJzaXplOwpAQCAtNjI0LDE1ICs2MjUsMTUgQEAKIAogCS8qIFdlIGhhdmUgdG8gcmVtb3ZlIGZyYWdtZW50IGhlYWRlciBmcm9tIGRhdGFncmFtIGFuZCB0byByZWxvY2F0ZQogCSAqIGhlYWRlciBpbiBvcmRlciB0byBjYWxjdWxhdGUgSUNWIGNvcnJlY3RseS4gKi8KLQloZWFkLT5uaC5yYXdbZnEtPm5ob2Zmc2V0XSA9IGhlYWQtPmgucmF3WzBdOworCXNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKVtmcS0+bmhvZmZzZXRdID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoaGVhZClbMF07CiAJbWVtbW92ZShoZWFkLT5oZWFkICsgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkciksIGhlYWQtPmhlYWQsCiAJCShoZWFkLT5kYXRhIC0gaGVhZC0+aGVhZCkgLSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7Ci0JaGVhZC0+bWFjLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKLQloZWFkLT5uaC5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJaGVhZC0+bWFjX2hlYWRlciArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwloZWFkLT5uZXR3b3JrX2hlYWRlciArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKIAogCXNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdCA9IGhlYWQtPm5leHQ7Ci0JaGVhZC0+aC5yYXcgPSBoZWFkLT5kYXRhOwotCXNrYl9wdXNoKGhlYWQsIGhlYWQtPmRhdGEgLSBoZWFkLT5uaC5yYXcpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKGhlYWQpOworCXNrYl9wdXNoKGhlYWQsIGhlYWQtPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoaGVhZCkpOwogCWF0b21pY19zdWIoaGVhZC0+dHJ1ZXNpemUsICZuZl9jdF9mcmFnNl9tZW0pOwogCiAJZm9yIChmcD1oZWFkLT5uZXh0OyBmcDsgZnAgPSBmcC0+bmV4dCkgewpAQCAtNjQ4LDEyICs2NDksMTQgQEAKIAogCWhlYWQtPm5leHQgPSBOVUxMOwogCWhlYWQtPmRldiA9IGRldjsKLQlza2Jfc2V0X3RpbWVzdGFtcChoZWFkLCAmZnEtPnN0YW1wKTsKLQloZWFkLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhwYXlsb2FkX2xlbik7CisJaGVhZC0+dHN0YW1wID0gZnEtPnN0YW1wOworCWlwdjZfaGRyKGhlYWQpLT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKIAogCS8qIFllcywgYW5kIGZvbGQgcmVkdW5kYW50IGNoZWNrc3VtIGJhY2suIDgpICovCiAJaWYgKGhlYWQtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKLQkJaGVhZC0+Y3N1bSA9IGNzdW1fcGFydGlhbChoZWFkLT5uaC5yYXcsIGhlYWQtPmgucmF3LWhlYWQtPm5oLnJhdywgaGVhZC0+Y3N1bSk7CisJCWhlYWQtPmNzdW0gPSBjc3VtX3BhcnRpYWwoc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpLAorCQkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oaGVhZCksCisJCQkJCSAgaGVhZC0+Y3N1bSk7CiAKIAlmcS0+ZnJhZ21lbnRzID0gTlVMTDsKIApAQCAtNzAxLDkgKzcwNCwxMCBAQAogc3RhdGljIGludAogZmluZF9wcmV2X2ZoZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnByZXZoZHJwLCBpbnQgKnByZXZob2ZmLCBpbnQgKmZob2ZmKQogewotCXU4IG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOwotCXU4IHByZXZfbmhvZmYgPSAodTggKikmc2tiLT5uaC5pcHY2aC0+bmV4dGhkciAtIHNrYi0+ZGF0YTsKLQlpbnQgc3RhcnQgPSAodTggKikoc2tiLT5uaC5pcHY2aCsxKSAtIHNrYi0+ZGF0YTsKKwl1OCBuZXh0aGRyID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKKwljb25zdCBpbnQgbmV0b2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJdTggcHJldl9uaG9mZiA9IG5ldG9mZiArIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBuZXh0aGRyKTsKKwlpbnQgc3RhcnQgPSBuZXRvZmYgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCWludCBsZW4gPSBza2ItPmxlbiAtIHN0YXJ0OwogCXU4IHByZXZoZHIgPSBORVhUSERSX0lQVjY7CiAKQEAgLTc1OSw3ICs3NjMsNyBAQAogCXN0cnVjdCBza19idWZmICpyZXRfc2tiID0gTlVMTDsKIAogCS8qIEp1bWJvIHBheWxvYWQgaW5oaWJpdHMgZnJhZy4gaGVhZGVyICovCi0JaWYgKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID09IDApIHsKKwlpZiAoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPT0gMCkgewogCQlERUJVR1AoInBheWxvYWQgbGVuID0gMFxuIik7CiAJCXJldHVybiBza2I7CiAJfQpAQCAtNzgwLDkgKzc4NCw5IEBACiAJCWdvdG8gcmV0X29yaWc7CiAJfQogCi0JY2xvbmUtPmgucmF3ID0gY2xvbmUtPmRhdGEgKyBmaG9mZjsKLQloZHIgPSBjbG9uZS0+bmguaXB2Nmg7Ci0JZmhkciA9IChzdHJ1Y3QgZnJhZ19oZHIgKiljbG9uZS0+aC5yYXc7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKGNsb25lLCBmaG9mZik7CisJaGRyID0gaXB2Nl9oZHIoY2xvbmUpOworCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoY2xvbmUpOwogCiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucygweEZGRjkpKSkgewogCQlERUJVR1AoIkludmFsaWQgZnJhZ21lbnQgb2Zmc2V0XG4iKTsKQEAgLTg2NCw4ICs4NjgsNyBAQAogCW5mX2N0X2ZyYWc2X2hhc2hfcm5kID0gKHUzMikgKChudW1fcGh5c3BhZ2VzIF4gKG51bV9waHlzcGFnZXM+PjcpKSBeCiAJCQkJICAgKGppZmZpZXMgXiAoamlmZmllcyA+PiA2KSkpOwogCi0JaW5pdF90aW1lcigmbmZfY3RfZnJhZzZfc2VjcmV0X3RpbWVyKTsKLQluZl9jdF9mcmFnNl9zZWNyZXRfdGltZXIuZnVuY3Rpb24gPSBuZl9jdF9mcmFnNl9zZWNyZXRfcmVidWlsZDsKKwlzZXR1cF90aW1lcigmbmZfY3RfZnJhZzZfc2VjcmV0X3RpbWVyLCBuZl9jdF9mcmFnNl9zZWNyZXRfcmVidWlsZCwgMCk7CiAJbmZfY3RfZnJhZzZfc2VjcmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzCiAJCQkJCSAgICsgbmZfY3RfZnJhZzZfc2VjcmV0X2ludGVydmFsOwogCWFkZF90aW1lcigmbmZfY3RfZnJhZzZfc2VjcmV0X3RpbWVyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCBmYTNmYjUwLi5hY2IzMDZhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0yMywxMiArMjMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvdHJhbnNwX3Y2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldF9kZXZzbm1wNjsKIAogc3RhdGljIGludCBmb2xkX3Byb3RfaW51c2Uoc3RydWN0IHByb3RvICpwcm90bykKQEAgLTE0MiwyNiArMTQyLDEzIEBACiAJU05NUF9NSUJfU0VOVElORUwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1mb2xkX2ZpZWxkKHZvaWQgKm1pYltdLCBpbnQgb2ZmdCkKLXsKLQl1bnNpZ25lZCBsb25nIHJlcyA9IDA7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1X3B0cihtaWJbMF0sIGkpKSArIG9mZnQpOwotCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1X3B0cihtaWJbMV0sIGkpKSArIG9mZnQpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQKIHNubXA2X3NlcV9zaG93X2l0ZW0oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKiptaWIsIHN0cnVjdCBzbm1wX21pYiAqaXRlbWxpc3QpCiB7CiAJaW50IGk7CiAJZm9yIChpPTA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLAotCQkJCWZvbGRfZmllbGQobWliLCBpdGVtbGlzdFtpXS5lbnRyeSkpOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKG1pYiwgaXRlbWxpc3RbaV0uZW50cnkpKTsKIH0KIAogc3RhdGljIGludCBzbm1wNl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTI3MSw0NyArMjU4LDMgQEAKIAlwcm9jX25ldF9yZW1vdmUoInNubXA2Iik7CiB9CiAKLSNlbHNlCS8qIENPTkZJR19QUk9DX0ZTICovCi0KLQotaW50IHNubXA2X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgc25tcDZfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLwotCi1pbnQgc25tcDZfYWxsb2NfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCi17Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0KLQlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Niwgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCi0JCWdvdG8gZXJyX2lwOwotCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKLQkJZ290byBlcnJfaWNtcDsKLQotCXJldHVybiAwOwotCi1lcnJfaWNtcDoKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2KTsKLWVycl9pcDoKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgc25tcDZfZnJlZV9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKLXsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYpOwotCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOwotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb3RvY29sLmMgYi9uZXQvaXB2Ni9wcm90b2NvbC5jCmluZGV4IGVmNDNiZDUuLmY5MjlmNDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Byb3RvY29sLmMKKysrIGIvbmV0L2lwdjYvcHJvdG9jb2wuYwpAQCAtNjAsNiArNjAsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfYWRkX3Byb3RvY29sKTsKKwogLyoKICAqCVJlbW92ZSBhIHByb3RvY29sIGZyb20gdGhlIGhhc2ggdGFibGVzLgogICovCkBAIC04MywzICs4NSw1IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitFWFBPUlRfU1lNQk9MKGluZXQ2X2RlbF9wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDIwM2UwNjkuLjAwOWExMDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlpbnQgZGVsaXZlcmVkID0gMDsKIAlfX3U4IGhhc2g7CiAKLQlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKIAlkYWRkciA9IHNhZGRyICsgMTsKIAogCWhhc2ggPSBuZXh0aGRyICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOwpAQCAtMzYxLDE3ICszNjEsMTggQEAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPm5oLnJhdywKLQkJCQkgICBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOwotCQlpZiAoIWNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLAorCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CisJCWlmICghY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKIAkJCQkgICAgIHNrYi0+bGVuLCBpbmV0LT5udW0sIHNrYi0+Y3N1bSkpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KLQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQkgICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJICAgICBza2ItPmxlbiwgaW5ldC0+bnVtLCAwKSk7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJCSBza2ItPmxlbiwKKwkJCQkJCQkgaW5ldC0+bnVtLCAwKSk7CiAKIAlpZiAoaW5ldC0+aGRyaW5jbCkgewogCQlpZiAoc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKQEAgLTQyMCw3ICs0MjEsNyBAQAogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKSB7CiAJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCX0gZWxzZSBpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX1RSVU5DKSB7CiAJCWlmIChfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQpAQCAtNDM4LDcgKzQzOSw3IEBACiAJaWYgKHNpbjYpIHsKIAkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJc2luNi0+c2luNl9wb3J0ID0gMDsKLQkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CiAJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOwogCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQpAQCAtNDg4LDcgKzQ4OSw4IEBACiAJCWdvdG8gb3V0OwogCiAJb2Zmc2V0ID0gcnAtPm9mZnNldDsKLQl0b3RhbF9sZW4gPSBpbmV0X3NrKHNrKS0+Y29yay5sZW5ndGggLSAoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCXRvdGFsX2xlbiA9IGluZXRfc2soc2spLT5jb3JrLmxlbmd0aCAtIChza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtCisJCQkJCQlza2ItPmRhdGEpOwogCWlmIChvZmZzZXQgPj0gdG90YWxfbGVuIC0gMSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwpAQCAtNTExLDcgKzUxMyw3IEBACiAJCQlpZiAoY3N1bV9za2IpCiAJCQkJY29udGludWU7CiAKLQkJCWxlbiA9IHNrYi0+bGVuIC0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQkJbGVuID0gc2tiLT5sZW4gLSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQkJaWYgKG9mZnNldCA+PSBsZW4pIHsKIAkJCQlvZmZzZXQgLT0gbGVuOwogCQkJCWNvbnRpbnVlOwpAQCAtNTIzLDcgKzUyNSw3IEBACiAJCXNrYiA9IGNzdW1fc2tiOwogCX0KIAotCW9mZnNldCArPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCW9mZnNldCArPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCAmY3N1bSwgMikpCiAJCUJVRygpOwogCkBAIC01NzUsMTEgKzU3NywxMyBAQAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CiAKLQlza2ItPm5oLmlwdjZoID0gaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CisJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWVyciA9IG1lbWNweV9mcm9taW92ZWNlbmQoKHZvaWQgKilpcGgsIGZyb20sIDAsIGxlbmd0aCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcl9mYXVsdDsKQEAgLTg3OCw3ICs4ODIsNyBAQAogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDMsNyArOTA3LDcgQEAKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQl9OworCX0KIAogCXJldHVybiAwOwogfQpAQCAtOTU3LDcgKzk2MSw4IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAogCQkJCQkgICAgICAgb3B0bGVuKTsKLQl9OworCX0KKwogCXJldHVybiBkb19yYXd2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCkBAIC05NzgsNyArOTgzLDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gY29tcGF0X2lwdjZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCiAJCQkJCSAgICAgIG9wdHZhbCwgb3B0bGVuKTsKLQl9OworCX0KIAlyZXR1cm4gZG9fcmF3djZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KICNlbmRpZgpAQCAtMTAzMSw3ICsxMDM2LDggQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBpcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCiAJCQkJCSAgICAgICBvcHRsZW4pOwotCX07CisJfQorCiAJcmV0dXJuIGRvX3Jhd3Y2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAKQEAgLTEwNTIsNyArMTA1OCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIGNvbXBhdF9pcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLAogCQkJCQkgICAgICBvcHR2YWwsIG9wdGxlbik7Ci0JfTsKKwl9CiAJcmV0dXJuIGRvX3Jhd3Y2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKQEAgLTEwNzMsNyArMTA3OSw3IEBACiAJCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCQkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAkJCWlmIChza2IgIT0gTlVMTCkKLQkJCQlhbW91bnQgPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCQkJCWFtb3VudCA9IHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDcwMzRjNTQuLmRlNzk1YzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlpbnQJCQlsZW47CiAJaW50CQkJbWVhdDsKIAlpbnQJCQlpaWY7Ci0Jc3RydWN0IHRpbWV2YWwJCXN0YW1wOworCWt0aW1lX3QJCQlzdGFtcDsKIAl1bnNpZ25lZCBpbnQJCWNzdW07CiAJX191OAkJCWxhc3RfaW47CS8qIGhhcyBmaXJzdC9sYXN0IHNlZ21lbnQgYXJyaXZlZD8gKi8KICNkZWZpbmUgQ09NUExFVEUJCTQKQEAgLTQzMCwxOSArNDMwLDI0IEBACiAJCWdvdG8gZXJyOwogCiAJb2Zmc2V0ID0gbnRvaHMoZmhkci0+ZnJhZ19vZmYpICYgfjB4NzsKLQllbmQgPSBvZmZzZXQgKyAobnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pIC0KLQkJCSgodTggKikgKGZoZHIgKyAxKSAtICh1OCAqKSAoc2tiLT5uaC5pcHY2aCArIDEpKSk7CisJZW5kID0gb2Zmc2V0ICsgKG50b2hzKGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuKSAtCisJCQkoKHU4ICopKGZoZHIgKyAxKSAtICh1OCAqKShpcHY2X2hkcihza2IpICsgMSkpKTsKIAogCWlmICgodW5zaWduZWQgaW50KWVuZCA+IElQVjZfTUFYUExFTikgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLElDTVBWNl9IRFJfRklFTEQsICh1OCopJmZoZHItPmZyYWdfb2ZmIC0gc2tiLT5uaC5yYXcpOworCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsCisJCQkJICAoKHU4ICopJmZoZHItPmZyYWdfb2ZmIC0KKwkJCQkgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSkpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sCi0JCQkJICAgICBjc3VtX3BhcnRpYWwoc2tiLT5uaC5yYXcsICh1OCopKGZoZHIrMSktc2tiLT5uaC5yYXcsIDApKTsKKwkJCQkgICAgIGNzdW1fcGFydGlhbChuaCwgKHU4ICopKGZoZHIgKyAxKSAtIG5oLAorCQkJCQkJICAwKSk7CisJfQogCiAJLyogSXMgdGhpcyB0aGUgZmluYWwgZnJhZ21lbnQ/ICovCiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucyhJUDZfTUYpKSkgewpAQCAtNTYyLDcgKzU2Nyw3IEBACiAJaWYgKHNrYi0+ZGV2KQogCQlmcS0+aWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJc2tiLT5kZXYgPSBOVUxMOwotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJmZxLT5zdGFtcCk7CisJZnEtPnN0YW1wID0gc2tiLT50c3RhbXA7CiAJZnEtPm1lYXQgKz0gc2tiLT5sZW47CiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmaXA2X2ZyYWdfbWVtKTsKIApAQCAtNjA1LDcgKzYxMCw5IEBACiAJQlVHX1RSQVAoRlJBRzZfQ0IoaGVhZCktPm9mZnNldCA9PSAwKTsKIAogCS8qIFVuZnJhZ21lbnRlZCBwYXJ0IGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IHNlZ21lbnQuICovCi0JcGF5bG9hZF9sZW4gPSAoaGVhZC0+ZGF0YSAtIGhlYWQtPm5oLnJhdykgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCXBheWxvYWRfbGVuID0gKChoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKSAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAJaWYgKHBheWxvYWRfbGVuID4gSVBWNl9NQVhQTEVOKQogCQlnb3RvIG91dF9vdmVyc2l6ZTsKIApAQCAtNjM5LDE1ICs2NDYsMTUgQEAKIAkvKiBXZSBoYXZlIHRvIHJlbW92ZSBmcmFnbWVudCBoZWFkZXIgZnJvbSBkYXRhZ3JhbSBhbmQgdG8gcmVsb2NhdGUKIAkgKiBoZWFkZXIgaW4gb3JkZXIgdG8gY2FsY3VsYXRlIElDViBjb3JyZWN0bHkuICovCiAJbmhvZmYgPSBmcS0+bmhvZmZzZXQ7Ci0JaGVhZC0+bmgucmF3W25ob2ZmXSA9IGhlYWQtPmgucmF3WzBdOworCXNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKVtuaG9mZl0gPSBza2JfdHJhbnNwb3J0X2hlYWRlcihoZWFkKVswXTsKIAltZW1tb3ZlKGhlYWQtPmhlYWQgKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSwgaGVhZC0+aGVhZCwKIAkJKGhlYWQtPmRhdGEgLSBoZWFkLT5oZWFkKSAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKLQloZWFkLT5tYWMucmF3ICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOwotCWhlYWQtPm5oLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwloZWFkLT5tYWNfaGVhZGVyICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCWhlYWQtPm5ldHdvcmtfaGVhZGVyICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOwogCiAJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKLQloZWFkLT5oLnJhdyA9IGhlYWQtPmRhdGE7Ci0Jc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIGhlYWQtPm5oLnJhdyk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoaGVhZCk7CisJc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSk7CiAJYXRvbWljX3N1YihoZWFkLT50cnVlc2l6ZSwgJmlwNl9mcmFnX21lbSk7CiAKIAlmb3IgKGZwPWhlYWQtPm5leHQ7IGZwOyBmcCA9IGZwLT5uZXh0KSB7CkBAIC02NjMsMTUgKzY3MCwxNyBAQAogCiAJaGVhZC0+bmV4dCA9IE5VTEw7CiAJaGVhZC0+ZGV2ID0gZGV2OwotCXNrYl9zZXRfdGltZXN0YW1wKGhlYWQsICZmcS0+c3RhbXApOwotCWhlYWQtPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKKwloZWFkLT50c3RhbXAgPSBmcS0+c3RhbXA7CisJaXB2Nl9oZHIoaGVhZCktPnBheWxvYWRfbGVuID0gaHRvbnMocGF5bG9hZF9sZW4pOwogCUlQNkNCKGhlYWQpLT5uaG9mZiA9IG5ob2ZmOwogCiAJKnNrYl9pbiA9IGhlYWQ7CiAKIAkvKiBZZXMsIGFuZCBmb2xkIHJlZHVuZGFudCBjaGVja3N1bSBiYWNrLiA4KSAqLwogCWlmIChoZWFkLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCi0JCWhlYWQtPmNzdW0gPSBjc3VtX3BhcnRpYWwoaGVhZC0+bmgucmF3LCBoZWFkLT5oLnJhdy1oZWFkLT5uaC5yYXcsIGhlYWQtPmNzdW0pOworCQloZWFkLT5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSwKKwkJCQkJICBza2JfbmV0d29ya19oZWFkZXJfbGVuKGhlYWQpLAorCQkJCQkgIGhlYWQtPmNzdW0pOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCUlQNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTU9LUyk7CkBAIC02OTksMzMgKzcwOCwzNCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgZnJhZ19oZHIgKmZoZHI7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxOwotCXN0cnVjdCBpcHY2aGRyICpoZHI7Ci0KLQloZHIgPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBpcHY2X2hkcihza2IpOwogCiAJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKTsKIAogCS8qIEp1bWJvIHBheWxvYWQgaW5oaWJpdHMgZnJhZy4gaGVhZGVyICovCiAJaWYgKGhkci0+cGF5bG9hZF9sZW49PTApIHsKIAkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Ci0JCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgc2tiLT5oLnJhdy1za2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKStzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSkpIHsKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKSkpIHsKIAkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Ci0JCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgc2tiLT5oLnJhdy1za2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQloZHIgPSBza2ItPm5oLmlwdjZoOwotCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopc2tiLT5oLnJhdzsKKwloZHIgPSBpcHY2X2hkcihza2IpOworCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmICghKGZoZHItPmZyYWdfb2ZmICYgaHRvbnMoMHhGRkY5KSkpIHsKIAkJLyogSXQgaXMgbm90IGEgZnJhZ21lbnRlZCBmcmFtZSAqLwotCQlza2ItPmgucmF3ICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOwogCi0JCUlQNkNCKHNrYiktPm5ob2ZmID0gKHU4KilmaGRyIC0gc2tiLT5uaC5yYXc7CisJCUlQNkNCKHNrYiktPm5ob2ZmID0gKHU4ICopZmhkciAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IGFlYmI0ZTIuLmI0NmFkNTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtNTc1LDYgKzU3NSw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK0VYUE9SVF9TWU1CT0wocnQ2X2xvb2t1cCk7CisKIC8qIGlwNl9pbnNfcnQgaXMgY2FsbGVkIHdpdGggRlJFRSB0YWJsZS0+dGI2X2xvY2suCiAgICBJdCB0YWtlcyBuZXcgcm91dGUgZW50cnksIHRoZSBhZGRpdGlvbiBmYWlscyBieSBhbnkgcmVhc29uIHRoZQogICAgcm91dGUgaXMgZnJlZWQuIEluIGFueSBjYXNlLCBpZiBjYWxsZXIgZG9lcyBub3QgaG9sZCBpdCwgaXQgbWF5CkBAIC03MjQsNyArNzI2LDcgQEAKIAogdm9pZCBpcDZfcm91dGVfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwogCXN0cnVjdCBmbG93aSBmbCA9IHsKIAkJLmlpZiA9IHNrYi0+ZGV2LT5pZmluZGV4LApAQCAtODI5LDYgKzgzMSw3IEBACiAJcmV0dXJuIGZpYjZfcnVsZV9sb29rdXAoZmwsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX291dHB1dCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXA2X3JvdXRlX291dHB1dCk7CiAKIC8qCiAgKglEZXN0aW5hdGlvbiBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9ucwpAQCAtMTc1Nyw3ICsxNzYwLDcgQEAKIAkJcnRubF91bmxvY2soKTsKIAogCQlyZXR1cm4gZXJyOwotCX07CisJfQogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0xNzcyLDcgKzE3NzUsNyBAQAogCWludCB0eXBlOwogCXN3aXRjaCAoaXBzdGF0c19taWJfbm9yb3V0ZXMpIHsKIAljYXNlIElQU1RBVFNfTUlCX0lOTk9ST1VURVM6Ci0JCXR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQl0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkgewogCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQkJYnJlYWs7CkBAIC0yMDEyLDcgKzIwMTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0Nl9ydG1fZGVscm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgaW5ldDZfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGZpYjZfY29uZmlnIGNmZzsKIAlpbnQgZXJyOwpAQCAtMjAyNCw3ICsyMDI3LDcgQEAKIAlyZXR1cm4gaXA2X3JvdXRlX2RlbCgmY2ZnKTsKIH0KIAotaW50IGluZXQ2X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0Nl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZmliNl9jb25maWcgY2ZnOwogCWludCBlcnI7CkBAIC0yMTYxLDcgKzIxNjQsNyBAQAogCQkgICAgIHByZWZpeCwgTkxNX0ZfTVVMVEkpOwogfQogCi1pbnQgaW5ldDZfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGluZXQ2X3J0bV9nZXRyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBubGF0dHIgKnRiW1JUQV9NQVgrMV07CiAJc3RydWN0IHJ0Nl9pbmZvICpydDsKQEAgLTIyMTUsNyArMjIxOCw3IEBACiAJLyogUmVzZXJ2ZSByb29tIGZvciBkdW1teSBoZWFkZXJzLCB0aGlzIHNrYiBjYW4gcGFzcwogCSAgIHRocm91Z2ggZ29vZCBjaHVuayBvZiByb3V0aW5nIGVuZ2luZS4KIAkgKi8KLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcmVzZXJ2ZShza2IsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAogCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyopIGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsKTsKQEAgLTI0ODYsOCArMjQ4OSw5IEBACiAKIHZvaWQgX19pbml0IGlwNl9yb3V0ZV9pbml0KHZvaWQpCiB7CisjaWZkZWYgCUNPTkZJR19QUk9DX0ZTCiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwotCisjZW5kaWYKIAlpcDZfZHN0X29wcy5rbWVtX2NhY2hlcCA9CiAJCWttZW1fY2FjaGVfY3JlYXRlKCJpcDZfZHN0X2NhY2hlIiwgc2l6ZW9mKHN0cnVjdCBydDZfaW5mbyksIDAsCiAJCQkJICBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CkBAIC0yNTA1LDYgKzI1MDksMTAgQEAKICNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKIAlmaWI2X3J1bGVzX2luaXQoKTsKICNlbmRpZgorCisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fTkVXUk9VVEUsIGluZXQ2X3J0bV9uZXdyb3V0ZSwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fREVMUk9VVEUsIGluZXQ2X3J0bV9kZWxyb3V0ZSwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUUk9VVEUsIGluZXQ2X3J0bV9nZXRyb3V0ZSwgTlVMTCk7CiB9CiAKIHZvaWQgaXA2X3JvdXRlX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggMDhkNmVkMy4uMWVmYTk1YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTk5LDEwICs5OSwxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKiBpcGlwNl9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqX19pcGlwNl9idWNrZXQoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcykKIHsKLQlfX2JlMzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCV9fYmUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwlfX2JlMzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOwogCXVuc2lnbmVkIGggPSAwOwogCWludCBwcmlvID0gMDsKIApAQCAtMTE3LDYgKzExNywxMSBAQAogCXJldHVybiAmdHVubmVsc1twcmlvXVtoXTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdHVubmVsICoqaXBpcDZfYnVja2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJcmV0dXJuIF9faXBpcDZfYnVja2V0KCZ0LT5wYXJtcyk7Cit9CisKIHN0YXRpYyB2b2lkIGlwaXA2X3R1bm5lbF91bmxpbmsoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKIAlzdHJ1Y3QgaXBfdHVubmVsICoqdHA7CkBAIC0xNDcsMTkgKzE1Miw5IEBACiAJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBoID0gMDsKLQlpbnQgcHJpbyA9IDA7CiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIAotCWlmIChyZW1vdGUpIHsKLQkJcHJpbyB8PSAyOwotCQloIF49IEhBU0gocmVtb3RlKTsKLQl9Ci0JaWYgKGxvY2FsKSB7Ci0JCXByaW8gfD0gMTsKLQkJaCBePSBIQVNIKGxvY2FsKTsKLQl9Ci0JZm9yICh0cCA9ICZ0dW5uZWxzW3ByaW9dW2hdOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgeworCWZvciAodHAgPSBfX2lwaXA2X2J1Y2tldChwYXJtcyk7ICh0ID0gKnRwKSAhPSBOVUxMOyB0cCA9ICZ0LT5uZXh0KSB7CiAJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYgcmVtb3RlID09IHQtPnBhcm1zLmlwaC5kYWRkcikKIAkJCXJldHVybiB0OwogCX0KQEAgLTIyNCw4ICsyMTksOCBAQAogICAgSUNNUCBpbiB0aGUgcmVhbCBJbnRlcm5ldCBpcyBhYnNvbHV0ZWx5IGluZmVhc2libGUuCiAgKi8KIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKLQlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBpcF90dW5uZWwgKnQ7CiAJaW50IGVycjsKIApAQCAtMjgwLDggKzI3NSw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlpbnQgaGxlbiA9IGlwaC0+aWhsPDwyOwogCXN0cnVjdCBpcHY2aGRyICppcGg2OwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJaW50IHJlbF90eXBlID0gMDsKIAlpbnQgcmVsX2NvZGUgPSAwOwogCWludCByZWxfaW5mbyA9IDA7CkBAIC0yOTYsMTQgKzI5MSwxNCBAQAogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKLQkJaWYgKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSA8IGhsZW4pCisJCWlmIChpY21wX2hkcihza2IpLT51bi5nYXRld2F5IDwgaGxlbikKIAkJCXJldHVybjsKIAogCQkvKiBTby4uLiBUaGlzIGd1eSBmb3VuZCBzb21ldGhpbmcgc3RyYW5nZSBJTlNJREUgZW5jYXBzdWxhdGVkCiAJCSAgIHBhY2tldC4gV2VsbCwgaGUgaXMgZm9vbCwgYnV0IHdoYXQgY2FuIHdlIGRvID8KIAkJICovCiAJCXJlbF90eXBlID0gSUNNUFY2X1BBUkFNUFJPQjsKLQkJcmVsX2luZm8gPSBza2ItPmguaWNtcGgtPnVuLmdhdGV3YXkgLSBobGVuOworCQlyZWxfaW5mbyA9IGljbXBfaGRyKHNrYiktPnVuLmdhdGV3YXkgLSBobGVuOwogCQlicmVhazsKIAogCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CkBAIC0zNDAsNyArMzM1LDcgQEAKIAlkc3RfcmVsZWFzZShza2IyLT5kc3QpOwogCXNrYjItPmRzdCA9IE5VTEw7CiAJc2tiX3B1bGwoc2tiMiwgc2tiLT5kYXRhIC0gKHU4KilpcGg2KTsKLQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAogCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KIAlydDZpID0gcnQ2X2xvb2t1cCgmaXBoNi0+c2FkZHIsIE5VTEwsIE5VTEwsIDApOwpAQCAtMzY2LDcgKzM2MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcGhkciAqaXBoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChJTkVUX0VDTl9pc19jZShpcGgtPnRvcykpCi0JCUlQNl9FQ05fc2V0X2NlKHNrYi0+bmguaXB2NmgpOworCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIH0KIAogc3RhdGljIGludCBpcGlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTM3NywxMyArMzcyLDEzIEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCiAJCWdvdG8gb3V0OwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAlyZWFkX2xvY2soJmlwaXA2X2xvY2spOwogCWlmICgodHVubmVsID0gaXBpcDZfdHVubmVsX2xvb2t1cChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyKSkgIT0gTlVMTCkgewogCQlzZWNwYXRoX3Jlc2V0KHNrYik7Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3OwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCUlQQ0Ioc2tiKS0+ZmxhZ3MgPSAwOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKQEAgLTQzMCw3ICs0MjUsNyBAQAogCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnR1bm5lbC0+c3RhdDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwotCXN0cnVjdCBpcHY2aGRyICppcGg2ID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoNiA9IGlwdjZfaGRyKHNrYik7CiAJdTggICAgIHRvcyA9IHR1bm5lbC0+cGFybXMuaXBoLnRvczsKIAlzdHJ1Y3QgcnRhYmxlICpydDsgICAgIAkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KQEAgLTQ2OCw3ICs0NjMsNyBAQAogCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CiAKIAkJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7Ci0JCQlhZGRyNiA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwkJCWFkZHI2ID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwogCQkJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoYWRkcjYpOwogCQl9CiAKQEAgLTU1MCwxMSArNTQ1LDEyIEBACiAJCQlza2Jfc2V0X293bmVyX3cobmV3X3NrYiwgc2tiLT5zayk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJaXBoNiA9IHNrYi0+bmguaXB2Nmg7CisJCWlwaDYgPSBpcHY2X2hkcihza2IpOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAlJUENCKHNrYiktPmZsYWdzID0gMDsKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CkBAIC01NjQsNyArNTYwLDcgQEAKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwogCi0JaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoIAkJCT0JaXBfaGRyKHNrYik7CiAJaXBoLT52ZXJzaW9uCQk9CTQ7CiAJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7CiAJaWYgKG10dSA+IElQVjZfTUlOX01UVSkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDkyZjk5OTIuLmUyZjI1ZWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMTE1LDEwICsxMTUsMTAgQEAKIAogc3RhdGljIF9fdTMyIHRjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcHY2aC0+ZGFkZHIuczZfYWRkcjMyLAotCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAotCQkJCQkgICAgc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkgICAgc2tiLT5oLnRoLT5zb3VyY2UpOworCXJldHVybiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKGlwdjZfaGRyKHNrYiktPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgIGlwdjZfaGRyKHNrYiktPnNhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgIHRjcF9oZHIoc2tiKS0+ZGVzdCwKKwkJCQkJICAgIHRjcF9oZHIoc2tiKS0+c291cmNlKTsKIH0KIAogc3RhdGljIGludCB0Y3BfdjZfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCkBAIC00ODYsNyArNDg2LDkgQEAKIAkJCXN0cnVjdCBza19idWZmICpwa3RvcHRzID0gdHJlcS0+cGt0b3B0czsKIAkJCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqcnhvcHQgPSBJUDZDQihwa3RvcHRzKTsKIAkJCWlmIChyeG9wdC0+c3JjcnQpCi0JCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssIChzdHJ1Y3QgaXB2Nl9ydF9oZHIqKShwa3RvcHRzLT5uaC5yYXcgKyByeG9wdC0+c3JjcnQpKTsKKwkJCQlvcHQgPSBpcHY2X2ludmVydF9ydGhkcihzaywKKwkJCSAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIocGt0b3B0cykgKworCQkJCQkJIHJ4b3B0LT5zcmNydCkpOwogCQl9CiAKIAkJaWYgKG9wdCAmJiBvcHQtPnNyY3J0KSB7CkBAIC01MDcsNyArNTA5LDcgQEAKIAogCXNrYiA9IHRjcF9tYWtlX3N5bmFjayhzaywgZHN0LCByZXEpOwogCWlmIChza2IpIHsKLQkJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJCXRoLT5jaGVjayA9IHRjcF92Nl9jaGVjayh0aCwgc2tiLT5sZW4sCiAJCQkJCSAmdHJlcS0+bG9jX2FkZHIsICZ0cmVxLT5ybXRfYWRkciwKQEAgLTgzNSw4ICs4MzcsOCBAQAogewogCV9fdTggKmhhc2hfbG9jYXRpb24gPSBOVUxMOwogCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqaGFzaF9leHBlY3RlZDsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IHNrYi0+bmguaXB2Nmg7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCWludCBsZW5ndGggPSAodGgtPmRvZmYgPDwgMikgLSBzaXplb2YgKCp0aCk7CiAJaW50IGdlbmhhc2g7CiAJdTggKnB0cjsKQEAgLTk0NCwxMCArOTQ2LDExIEBACiBzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdGgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmbnAtPnNhZGRyLCAmbnAtPmRhZGRyLCBsZW4sIElQUFJPVE9fVENQLCAgMCk7CisJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJfSBlbHNlIHsKIAkJdGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsIGxlbiwgSVBQUk9UT19UQ1AsCkBAIC05NjQsMTIgKzk2NywxMyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqdGgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JdGggPSBza2ItPmgudGg7CisJaXB2NmggPSBpcHY2X2hkcihza2IpOworCXRoID0gdGNwX2hkcihza2IpOwogCiAJdGgtPmNoZWNrID0gMDsKIAl0aC0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIsIHNrYi0+bGVuLAogCQkJCSAgICAgSVBQUk9UT19UQ1AsIDApOworCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CkBAIC05NzcsNyArOTgxLDcgQEAKIAogc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoLCAqdDE7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYiksICp0MTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKIAlzdHJ1Y3QgZmxvd2kgZmw7CiAJaW50IHRvdF9sZW4gPSBzaXplb2YoKnRoKTsKQEAgLTk5Myw3ICs5OTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIAlpZiAoc2spCi0JCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlrZXkgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAllbHNlCiAJCWtleSA9IE5VTEw7CiAKQEAgLTEwMzcsMjAgKzEwNDEsMTggQEAKIAkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAogCQkJICAgICAgIChUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwKIAkJCSAgICAgICBUQ1BPTEVOX01ENVNJRyk7Ci0JCXRjcF92Nl9kb19jYWxjX21kNV9oYXNoKChfX3U4Kikmb3B0WzFdLAotCQkJCQlrZXksCi0JCQkJCSZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQl0MSwgSVBQUk9UT19UQ1AsCi0JCQkJCXRvdF9sZW4pOworCQl0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKSZvcHRbMV0sIGtleSwKKwkJCQkJJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCXQxLCBJUFBST1RPX1RDUCwgdG90X2xlbik7CiAJfQogI2VuZGlmCiAKIAlidWZmLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdDEsIHNpemVvZigqdDEpLCAwKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCiAJdDEtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZmbC5mbDZfc3JjLCAmZmwuZmw2X2RzdCwKIAkJCQkgICAgc2l6ZW9mKCp0MSksIElQUFJPVE9fVENQLApAQCAtMTA3OSw3ICsxMDgxLDcgQEAKIHN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX2FjayhzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnR3LAogCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cykKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aCwgKnQxOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpLCAqdDE7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJc3RydWN0IGZsb3dpIGZsOwogCWludCB0b3RfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwpAQCAtMTA5MSw3ICsxMDkzLDcgQEAKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiAJaWYgKCF0dyAmJiBza2ItPnNrKSB7Ci0JCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrYi0+c2ssICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrYi0+c2ssICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJfSBlbHNlIGlmICh0dyAmJiB0dy0+dHdfbWQ1X2tleWxlbikgewogCQl0d19rZXkua2V5ID0gdHctPnR3X21kNV9rZXk7CiAJCXR3X2tleS5rZXlsZW4gPSB0dy0+dHdfbWQ1X2tleWxlbjsKQEAgLTExNDAsMjAgKzExNDIsMTggQEAKIAlpZiAoa2V5KSB7CiAJCSp0b3B0KysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfCAoVENQT1BUX05PUCA8PCAxNikgfAogCQkJCShUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwgVENQT0xFTl9NRDVTSUcpOwotCQl0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKXRvcHQsCi0JCQkJCWtleSwKLQkJCQkJJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJCQkmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCXQxLCBJUFBST1RPX1RDUCwKLQkJCQkJdG90X2xlbik7CisJCXRjcF92Nl9kb19jYWxjX21kNV9oYXNoKChfX3U4ICopdG9wdCwga2V5LAorCQkJCQkmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJdDEsIElQUFJPVE9fVENQLCB0b3RfbGVuKTsKIAl9CiAjZW5kaWYKIAogCWJ1ZmYtPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0MSwgdG90X2xlbiwgMCk7CiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAogCXQxLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwuZmw2X3NyYywgJmZsLmZsNl9kc3QsCiAJCQkJICAgIHRvdF9sZW4sIElQUFJPVE9fVENQLApAQCAtMTE5NywxOCArMTE5NywxOCBAQAogc3RhdGljIHN0cnVjdCBzb2NrICp0Y3BfdjZfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKLQljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwogCiAJLyogRmluZCBwb3NzaWJsZSBjb25uZWN0aW9uIHJlcXVlc3RzLiAqLwogCXJlcSA9IGluZXQ2X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwgdGgtPnNvdXJjZSwKLQkJCQkgICAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCBpbmV0Nl9paWYoc2tiKSk7CisJCQkJICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCSAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgaW5ldDZfaWlmKHNrYikpOwogCWlmIChyZXEpCiAJCXJldHVybiB0Y3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSwgcHJldik7CiAKLQluc2sgPSBfX2luZXQ2X2xvb2t1cF9lc3RhYmxpc2hlZCgmdGNwX2hhc2hpbmZvLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCSB0aC0+c291cmNlLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJbnNrID0gX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQoJnRjcF9oYXNoaW5mbywgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkgdGgtPnNvdXJjZSwgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAogCQkJCQkgbnRvaHModGgtPmRlc3QpLCBpbmV0Nl9paWYoc2tiKSk7CiAKIAlpZiAobnNrKSB7CkBAIC0xMjc1LDkgKzEyNzUsOSBAQAogCXRjcF9vcGVucmVxX2luaXQocmVxLCAmdG1wX29wdCwgc2tiKTsKIAogCXRyZXEgPSBpbmV0Nl9yc2socmVxKTsKLQlpcHY2X2FkZHJfY29weSgmdHJlcS0+cm10X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJnRyZXEtPmxvY19hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCVRDUF9FQ05fY3JlYXRlX3JlcXVlc3QocmVxLCBza2ItPmgudGgpOworCWlwdjZfYWRkcl9jb3B5KCZ0cmVxLT5ybXRfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmdHJlcS0+bG9jX2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CisJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CiAJdHJlcS0+cGt0b3B0cyA9IE5VTEw7CiAJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBza2IpIHx8CiAJICAgIG5wLT5yeG9wdC5iaXRzLnJ4aW5mbyB8fCBucC0+cnhvcHQuYml0cy5yeG9pbmZvIHx8CkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogCQluZXducC0+cGt0b3B0aW9ucyAgPSBOVUxMOwogCQluZXducC0+b3B0CSAgID0gTlVMTDsKIAkJbmV3bnAtPm1jYXN0X29pZiAgID0gaW5ldDZfaWlmKHNrYik7Ci0JCW5ld25wLT5tY2FzdF9ob3BzICA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJbmV3bnAtPm1jYXN0X2hvcHMgID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCiAJCS8qCiAJCSAqIE5vIG5lZWQgdG8gY2hhcmdlIHRoaXMgc29jayB0byB0aGUgcmVsZXZhbnQgSVB2NiByZWZjbnQgZGVidWcgc29ja3MgY291bnQKQEAgLTEzODksNyArMTM4OSw5IEBACiAJICAgIG9wdCA9PSBOVUxMICYmIHRyZXEtPnBrdG9wdHMpIHsKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpyeG9wdCA9IElQNkNCKHRyZXEtPnBrdG9wdHMpOwogCQlpZiAocnhvcHQtPnNyY3J0KQotCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssIChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikodHJlcS0+cGt0b3B0cy0+bmgucmF3ICsgcnhvcHQtPnNyY3J0KSk7CisJCQlvcHQgPSBpcHY2X2ludmVydF9ydGhkcihzaywKKwkJICAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIodHJlcS0+cGt0b3B0cykgKworCQkJCQkgIHJ4b3B0LT5zcmNydCkpOwogCX0KIAogCWlmIChkc3QgPT0gTlVMTCkgewpAQCAtMTQ2OSw3ICsxNDcxLDcgQEAKIAl9CiAJbmV3bnAtPm9wdAkgID0gTlVMTDsKIAluZXducC0+bWNhc3Rfb2lmICA9IGluZXQ2X2lpZihza2IpOwotCW5ld25wLT5tY2FzdF9ob3BzID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCW5ld25wLT5tY2FzdF9ob3BzID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCiAJLyogQ2xvbmUgbmF0aXZlIElQdjYgb3B0aW9ucyBmcm9tIGxpc3RlbmluZyBzb2NrZXQgKGlmIGFueSkKIApAQCAtMTUyOCwxNSArMTUzMCwxNiBAQAogc3RhdGljIF9fc3VtMTYgdGNwX3Y2X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJaWYgKCF0Y3BfdjZfY2hlY2soc2tiLT5oLnRoLHNrYi0+bGVuLCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkgICZza2ItPm5oLmlwdjZoLT5kYWRkcixza2ItPmNzdW0pKSB7CisJCWlmICghdGNwX3Y2X2NoZWNrKHRjcF9oZHIoc2tiKSwgc2tiLT5sZW4sICZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkgICZpcHY2X2hkcihza2IpLT5kYWRkciwgc2tiLT5jc3VtKSkgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCSAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAwKSk7CisJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayh0Y3BfaGRyKHNrYiksIHNrYi0+bGVuLAorCQkJCQkgICAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMCkpOwogCiAJaWYgKHNrYi0+bGVuIDw9IDc2KSB7CiAJCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwpAQCAtMTYwMCw3ICsxNjAzLDcgQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKSB7IC8qIEZhc3QgcGF0aCAqLwogCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkKKwkJaWYgKHRjcF9yY3ZfZXN0YWJsaXNoZWQoc2ssIHNrYiwgdGNwX2hkcihza2IpLCBza2ItPmxlbikpCiAJCQlnb3RvIHJlc2V0OwogCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCQlpZiAob3B0X3NrYikKQEAgLTE2MDgsNyArMTYxMSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChza2ItPmxlbiA8IChza2ItPmgudGgtPmRvZmY8PDIpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChza2ItPmxlbiA8IHRjcF9oZHJsZW4oc2tiKSB8fCB0Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJZ290byBjc3VtX2VycjsKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewpAQCAtMTYzMSw3ICsxNjM0LDcgQEAKIAl9CiAKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCWlmICh0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgc2tiLT5oLnRoLCBza2ItPmxlbikpCisJaWYgKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCB0Y3BfaGRyKHNrYiksIHNrYi0+bGVuKSkKIAkJZ290byByZXNldDsKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCWlmIChvcHRfc2tiKQpAQCAtMTY2NCw3ICsxNjY3LDcgQEAKIAkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aW5mbyB8fCBucC0+cnhvcHQuYml0cy5yeG9pbmZvKQogCQkJbnAtPm1jYXN0X29pZiA9IGluZXQ2X2lpZihvcHRfc2tiKTsKIAkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSB8fCBucC0+cnhvcHQuYml0cy5yeG9obGltKQotCQkJbnAtPm1jYXN0X2hvcHMgPSBvcHRfc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCQkJbnAtPm1jYXN0X2hvcHMgPSBpcHY2X2hkcihvcHRfc2tiKS0+aG9wX2xpbWl0OwogCQlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIG9wdF9za2IpKSB7CiAJCQlza2Jfc2V0X293bmVyX3Iob3B0X3NrYiwgc2spOwogCQkJb3B0X3NrYiA9IHhjaGcoJm5wLT5wa3RvcHRpb25zLCBvcHRfc2tiKTsKQEAgLTE2OTcsMjggKzE3MDAsMjcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAKLQl0aCA9IHNrYi0+aC50aDsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAogCWlmICh0aC0+ZG9mZiA8IHNpemVvZihzdHJ1Y3QgdGNwaGRyKS80KQogCQlnb3RvIGJhZF9wYWNrZXQ7CiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgdGgtPmRvZmYqNCkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWlmICgoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKLQkgICAgIHRjcF92Nl9jaGVja3N1bV9pbml0KHNrYikpKQorCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiB0Y3BfdjZfY2hlY2tzdW1faW5pdChza2IpKQogCQlnb3RvIGJhZF9wYWNrZXQ7CiAKLQl0aCA9IHNrYi0+aC50aDsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IG50b2hsKHRoLT5zZXEpOwogCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IChUQ1BfU0tCX0NCKHNrYiktPnNlcSArIHRoLT5zeW4gKyB0aC0+ZmluICsKIAkJCQkgICAgc2tiLT5sZW4gLSB0aC0+ZG9mZio0KTsKIAlUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgPSBudG9obCh0aC0+YWNrX3NlcSk7CiAJVENQX1NLQl9DQihza2IpLT53aGVuID0gMDsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gaXB2Nl9nZXRfZHNmaWVsZChza2ItPm5oLmlwdjZoKTsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2X2hkcihza2IpKTsKIAlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IDA7CiAKLQlzayA9IF9faW5ldDZfbG9va3VwKCZ0Y3BfaGFzaGluZm8sICZza2ItPm5oLmlwdjZoLT5zYWRkciwgdGgtPnNvdXJjZSwKLQkJCSAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIG50b2hzKHRoLT5kZXN0KSwKKwlzayA9IF9faW5ldDZfbG9va3VwKCZ0Y3BfaGFzaGluZm8sICZpcHY2X2hkcihza2IpLT5zYWRkciwgdGgtPnNvdXJjZSwKKwkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIG50b2hzKHRoLT5kZXN0KSwKIAkJCSAgICBpbmV0Nl9paWYoc2tiKSk7CiAKIAlpZiAoIXNrKQpAQCAtMTc5OCw3ICsxODAwLDcgQEAKIAkJc3RydWN0IHNvY2sgKnNrMjsKIAogCQlzazIgPSBpbmV0Nl9sb29rdXBfbGlzdGVuZXIoJnRjcF9oYXNoaW5mbywKLQkJCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCQkJICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKIAkJCQkJICAgIG50b2hzKHRoLT5kZXN0KSwgaW5ldDZfaWlmKHNrYikpOwogCQlpZiAoc2syICE9IE5VTEwpIHsKIAkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3ID0gaW5ldF90d3NrKHNrKTsKQEAgLTE5NDUsNiArMTk0Nyw3IEBACiAJcmV0dXJuIGluZXQ2X2Rlc3Ryb3lfc29jayhzayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyogUHJvYyBmaWxlc3lzdGVtIFRDUHY2IHNvY2sgbGlzdCBkdW1waW5nLiAqLwogc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE2KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAogCQkJIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBpbnQgaSwgaW50IHVpZCkKQEAgLTIwNjEsNyArMjA2NCw2IEBACiAJCSAgIGF0b21pY19yZWFkKCZ0dy0+dHdfcmVmY250KSwgdHcpOwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgdGNwNl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnN0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBmNTkwZGI1Li5iMDgzYzA5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtOTMsMTAgKzkzLDEwIEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCXNjb3JlKys7CiAJCQl9Ci0JCQlpZihzY29yZSA9PSA0KSB7CisJCQlpZiAoc2NvcmUgPT0gNCkgewogCQkJCXJlc3VsdCA9IHNrOwogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmKHNjb3JlID4gYmFkbmVzcykgeworCQkJfSBlbHNlIGlmIChzY29yZSA+IGJhZG5lc3MpIHsKIAkJCQlyZXN1bHQgPSBzazsKIAkJCQliYWRuZXNzID0gc2NvcmU7CiAJCQl9CkBAIC0xMjAsOCArMTIwLDkgQEAKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc2l6ZV90IGNvcGllZDsKLQlpbnQgZXJyLCBjb3B5X29ubHksIGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKKwl1bnNpZ25lZCBpbnQgdWxlbiwgY29waWVkOworCWludCBlcnI7CisJaW50IGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKIAogCWlmIChhZGRyX2xlbikKIAkJKmFkZHJfbGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKQEAgLTEzNCwyNCArMTM1LDI1IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCi0JY29waWVkID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaWYgKGNvcGllZCA+IGxlbikgewotCQljb3BpZWQgPSBsZW47CisJdWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWNvcGllZCA9IGxlbjsKKwlpZiAoY29waWVkID4gdWxlbikKKwkJY29waWVkID0gdWxlbjsKKwllbHNlIGlmIChjb3BpZWQgPCB1bGVuKQogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7Ci0JfQogCiAJLyoKLQkgKiAJRGVjaWRlIHdoZXRoZXIgdG8gY2hlY2tzdW0gYW5kL29yIGNvcHkgZGF0YS4KKwkgKiBJZiBjaGVja3N1bSBpcyBuZWVkZWQgYXQgYWxsLCB0cnkgdG8gZG8gaXQgd2hpbGUgY29weWluZyB0aGUKKwkgKiBkYXRhLiAgSWYgdGhlIGRhdGEgaXMgdHJ1bmNhdGVkLCBvciBpZiB3ZSBvbmx5IHdhbnQgYSBwYXJ0aWFsCisJICogY292ZXJhZ2UgY2hlY2tzdW0gKFVEUC1MaXRlKSwgZG8gaXQgYmVmb3JlIHRoZSBjb3B5LgogCSAqLwotCWNvcHlfb25seSA9IChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpOwogCi0JaWYgKGlzX3VkcGxpdGUgIHx8ICAoIWNvcHlfb25seSAgJiYgIG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykpIHsKLQkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChjb3BpZWQgPCB1bGVuIHx8IFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpIHsKKwkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9jb3B5X2VycjsKLQkJY29weV9vbmx5ID0gMTsKIAl9CiAKLQlpZiAoY29weV9vbmx5KQorCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQogCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKIAkJCQkJICAgICAgbXNnLT5tc2dfaW92LCBjb3BpZWQgICAgICAgKTsKIAllbHNlIHsKQEAgLTE3MCwxNSArMTcyLDE2IEBACiAKIAkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIG1zZy0+bXNnX25hbWU7CiAJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCXNpbjYtPnNpbjZfcG9ydCA9IHNrYi0+aC51aC0+c291cmNlOworCQlzaW42LT5zaW42X3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKIAkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CiAJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOwogCiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJCWlwdjZfYWRkcl9zZXQoJnNpbjYtPnNpbjZfYWRkciwgMCwgMCwKLQkJCQkgICAgICBodG9ubCgweGZmZmYpLCBza2ItPm5oLmlwaC0+c2FkZHIpOworCQkJCSAgICAgIGh0b25sKDB4ZmZmZiksIGlwX2hkcihza2IpLT5zYWRkcik7CiAJCWVsc2UgewotCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsCisJCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkcik7CiAJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQogCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBJUDZDQihza2IpLT5paWY7CiAJCX0KQEAgLTE5NCw3ICsxOTcsNyBAQAogCiAJZXJyID0gY29waWVkOwogCWlmIChmbGFncyAmIE1TR19UUlVOQykKLQkJZXJyID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJCWVyciA9IHVsZW47CiAKIG91dF9mcmVlOgogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwpAQCAtMjc5LDggKzI4MiwxMCBAQAogCQl9CiAJfQogCi0JaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKLQkJZ290byBkcm9wOworCWlmIChzay0+c2tfZmlsdGVyKSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCQlnb3RvIGRyb3A7CisJfQogCiAJaWYgKChyYyA9IHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpKSA8IDApIHsKIAkJLyogTm90ZSB0aGF0IGFuIEVOT01FTSBlcnJvciBpcyBjaGFyZ2VkIHR3aWNlICovCkBAIC0zMjUsNyArMzMwLDcgQEAKIAkJCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmbnAtPnJjdl9zYWRkciwgbG9jX2FkZHIpKQogCQkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQorCQkJaWYgKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCQkJcmV0dXJuIHM7CiAJCX0KQEAgLTM0MSw3ICszNDYsNyBAQAogCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2ssICpzazI7Ci0JY29uc3Qgc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJY29uc3Qgc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJaW50IGRpZjsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CkBAIC0zNjYsOSArMzcxLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVkcDZfY3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQotCitzdGF0aWMgaW5saW5lIGludCB1ZHA2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCQkgaW50IHByb3RvKQogeworCWludCBlcnI7CisKKwlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwlVRFBfU0tCX0NCKHNrYiktPmNzY292ID0gc2tiLT5sZW47CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKSB7CisJCWVyciA9IHVkcGxpdGVfY2hlY2tzdW1faW5pdChza2IsIHVoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJaWYgKHVoLT5jaGVjayA9PSAwKSB7CiAJCS8qIFJGQyAyNDYwIHNlY3Rpb24gOC4xIHNheXMgdGhhdCB3ZSBTSE9VTEQgbG9nCiAJCSAgIHRoaXMgZXJyb3IuIFdlbGwsIGl0IGlzIHJlYXNvbmFibGUuCkBAIC0zNzcsMjEgKzM5MywyMCBAQAogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCi0JICAgICFjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtICAgICAgICAgICAgICkpCisJICAgICFjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkgICAgIHNrYi0+bGVuLCBwcm90bywgc2tiLT5jc3VtKSkKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCQkJICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJCQkgc2tiLT5sZW4sIElQUFJPVE9fVURQLAotCQkJCQkJCSAwKSk7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJCSBza2ItPmxlbiwgcHJvdG8sIDApKTsKIAotCXJldHVybiAoVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDApOworCXJldHVybiAwOwogfQogCiBpbnQgX191ZHA2X2xpYl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLAotCQkgICBpbnQgaXNfdWRwbGl0ZSkKKwkJICAgaW50IHByb3RvKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3Qgc29jayAqc2s7CkBAIC00MDMsMTUgKzQxOCwxNiBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCiAJCWdvdG8gc2hvcnRfcGFja2V0OwogCi0Jc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7Ci0JdWggPSBza2ItPmgudWg7CisJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJZGFkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CisJdWggPSB1ZHBfaGRyKHNrYik7CiAKIAl1bGVuID0gbnRvaHModWgtPmxlbik7CiAJaWYgKHVsZW4gPiBza2ItPmxlbikKIAkJZ290byBzaG9ydF9wYWNrZXQ7CiAKLQlpZighIGlzX3VkcGxpdGUgKSB7CQkvKiBVRFAgdmFsaWRhdGVzIHVsZW4uICovCisJaWYgKHByb3RvID09IElQUFJPVE9fVURQKSB7CisJCS8qIFVEUCB2YWxpZGF0ZXMgdWxlbi4gKi8KIAogCQkvKiBDaGVjayBmb3IganVtYm8gcGF5bG9hZCAqLwogCQlpZiAodWxlbiA9PSAwKQpAQCAtNDIzLDE5ICs0MzksMTUgQEAKIAkJaWYgKHVsZW4gPCBza2ItPmxlbikgewogCQkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQogCQkJCWdvdG8gc2hvcnRfcGFja2V0OwotCQkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JCQlkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKLQkJCXVoID0gc2tiLT5oLnVoOworCQkJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJCQlkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKKwkJCXVoID0gdWRwX2hkcihza2IpOwogCQl9Ci0KLQkJaWYgKHVkcDZfY3N1bV9pbml0KHNrYiwgdWgpKQotCQkJZ290byBkaXNjYXJkOwotCi0JfSBlbHNlIAl7CQkJLyogVURQLUxpdGUgdmFsaWRhdGVzIGNzY292LiAqLwotCQlpZiAodWRwbGl0ZTZfY3N1bV9pbml0KHNrYiwgdWgpKQotCQkJZ290byBkaXNjYXJkOwogCX0KIAorCWlmICh1ZHA2X2NzdW1faW5pdChza2IsIHVoLCBwcm90bykpCisJCWdvdG8gZGlzY2FyZDsKKwogCS8qCiAJICoJTXVsdGljYXN0IHJlY2VpdmUgY29kZQogCSAqLwpAQCAtNDU3LDMzICs0NjksMzQgQEAKIAogCQlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQkJZ290byBkaXNjYXJkOwotCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIGlzX3VkcGxpdGUpOworCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIHByb3RvID09IElQUFJPVE9fVURQTElURSk7CiAKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBJQ01QVjZfUE9SVF9VTlJFQUNILCAwLCBkZXYpOwogCiAJCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAogCS8qIGRlbGl2ZXIgKi8KIAogCXVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJc29ja19wdXQoc2spOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIAogc2hvcnRfcGFja2V0OgogCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUCVzdjY6IHNob3J0IHBhY2tldDogJWQvJXVcbiIsCi0JCSAgICAgICBpc191ZHBsaXRlPyAiLUxpdGUiIDogIiIsICB1bGVuLCBza2ItPmxlbik7CisJCSAgICAgICBwcm90byA9PSBJUFBST1RPX1VEUExJVEUgPyAiLUxpdGUiIDogIiIsCisJCSAgICAgICB1bGVuLCBza2ItPmxlbik7CiAKIGRpc2NhcmQ6Ci0JVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CisJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKTsKIAlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewotCXJldHVybiBfX3VkcDZfbGliX3Jjdihwc2tiLCB1ZHBfaGFzaCwgMCk7CisJcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcF9oYXNoLCBJUFBST1RPX1VEUCk7CiB9CiAKIC8qCkBAIC01MjEsNyArNTM0LDcgQEAKIAkvKgogCSAqIENyZWF0ZSBhIFVEUCBoZWFkZXIKIAkgKi8KLQl1aCA9IHNrYi0+aC51aDsKKwl1aCA9IHVkcF9oZHIoc2tiKTsKIAl1aC0+c291cmNlID0gZmwtPmZsX2lwX3Nwb3J0OwogCXVoLT5kZXN0ID0gZmwtPmZsX2lwX2Rwb3J0OwogCXVoLT5sZW4gPSBodG9ucyh1cC0+bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcGxpdGUuYyBiL25ldC9pcHY2L3VkcGxpdGUuYwppbmRleCA2MjlmOTcxLi5mNTQwMTZhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0YXRpYyBpbnQgdWRwbGl0ZXY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCiB7Ci0JcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcGxpdGVfaGFzaCwgMSk7CisJcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcGxpdGVfaGFzaCwgSVBQUk9UT19VRFBMSVRFKTsKIH0KIAogc3RhdGljIHZvaWQgdWRwbGl0ZXY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYyBiL25ldC9pcHY2L3hmcm02X2lucHV0LmMKaW5kZXggMzFmNjUxZi4uZDdlZDhhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC0yOCwxNCArMjgsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbmhvZmY7CiAKIAluaG9mZiA9IElQNkNCKHNrYiktPm5ob2ZmOwotCW5leHRoZHIgPSBza2ItPm5oLnJhd1tuaG9mZl07CisJbmV4dGhkciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpW25ob2ZmXTsKIAogCXNlcSA9IDA7CiAJaWYgKCFzcGkgJiYgKGVyciA9IHhmcm1fcGFyc2Vfc3BpKHNrYiwgbmV4dGhkciwgJnNwaSwgJnNlcSkpICE9IDApCiAJCWdvdG8gZHJvcDsKIAogCWRvIHsKLQkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCiAJCWlmICh4ZnJtX25yID09IFhGUk1fTUFYX0RFUFRIKQogCQkJZ290byBkcm9wOwpAQCAtNTgsNyArNTgsNyBAQAogCQlpZiAobmV4dGhkciA8PSAwKQogCQkJZ290byBkcm9wX3VubG9jazsKIAotCQlza2ItPm5oLnJhd1tuaG9mZl0gPSBuZXh0aGRyOworCQlza2JfbmV0d29ya19oZWFkZXIoc2tiKVtuaG9mZl0gPSBuZXh0aGRyOwogCiAJCWlmICh4LT5wcm9wcy5yZXBsYXlfd2luZG93KQogCQkJeGZybV9yZXBsYXlfYWR2YW5jZSh4LCBzZXEpOwpAQCAtMTEyLDggKzExMiw4IEBACiAJCXJldHVybiAtMTsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJCU5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCWlwNl9yY3ZfZmluaXNoKTsKQEAgLTE0MCwxOSArMTQwLDE5IEBACiAJcmV0dXJuIHhmcm02X3Jjdl9zcGkoKnBza2IsIDApOwogfQogCitFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdik7CisKIGludCB4ZnJtNl9pbnB1dF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKIAkJICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHU4IHByb3RvKQogewogCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gTlVMTDsKIAlpbnQgd2lsZGNhcmQgPSAwOwotCXN0cnVjdCBpbjZfYWRkciBhbnk7CiAJeGZybV9hZGRyZXNzX3QgKnhhbnk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm1fdmVjX29uZSA9IE5VTEw7CiAJaW50IG5oID0gMDsKIAlpbnQgaSA9IDA7CiAKLQlpcHY2X2FkZHJfc2V0KCZhbnksIDAsIDAsIDAsIDApOwotCXhhbnkgPSAoeGZybV9hZGRyZXNzX3QgKikmYW55OworCXhhbnkgPSAoeGZybV9hZGRyZXNzX3QgKikmaW42YWRkcl9hbnk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXhmcm1fYWRkcmVzc190ICpkc3QsICpzcmM7CkBAIC0yNDcsMyArMjQ3LDUgQEAKIAkJeGZybV9zdGF0ZV9wdXQoeGZybV92ZWNfb25lKTsKIAlyZXR1cm4gLTE7CiB9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfaW5wdXRfYWRkcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX2JlZXQuYyBiL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCmluZGV4IGVkY2ZmZmEuLjJlNjFkNmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCisrKyBiL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCkBAIC0zOCwxNyArMzgsMTggQEAKIAlpbnQgaGRyX2xlbjsKIAogCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7Ci0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCiAJaGRyX2xlbiA9IGlwNl9maW5kXzFzdGZyYWdvcHQoc2tiLCAmcHJldmhkcik7Ci0Jc2tiLT5uaC5yYXcgPSBwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwKKwkJCSAgICAgICAocHJldmhkciAtIHgtPnByb3BzLmhlYWRlcl9sZW4pIC0gc2tiLT5kYXRhKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoZHJfbGVuKTsKIAltZW1tb3ZlKHNrYi0+ZGF0YSwgaXBoLCBoZHJfbGVuKTsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwotCXRvcF9pcGggPSBza2ItPm5oLmlwdjZoOwotCXNrYi0+bmgucmF3ID0gJnRvcF9pcGgtPm5leHRoZHI7Ci0Jc2tiLT5oLmlwdjZoID0gdG9wX2lwaCArIDE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9wX2lwaCA9IGlwdjZfaGRyKHNrYik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlciArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAlpcHY2X2FkZHJfY29weSgmdG9wX2lwaC0+c2FkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikmeC0+cHJvcHMuc2FkZHIpOwogCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5kYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5pZC5kYWRkcik7CkBAIC01OSw2ICs2MCw3IEBACiBzdGF0aWMgaW50IHhmcm02X2JlZXRfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwNmg7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX21hYzsKIAlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKQEAgLTY2LDEzICs2OCwxNCBAQAogCQlnb3RvIG91dDsKIAogCXNrYl9wdXNoKHNrYiwgc2l6ZSk7Ci0JbWVtbW92ZShza2ItPmRhdGEsIHNrYi0+bmgucmF3LCBzaXplKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIHNpemUpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0Jc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCi0JCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOworCW9sZF9tYWMgPSBza2JfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1za2ItPm1hY19sZW4pOworCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSwgb2xkX21hYywgc2tiLT5tYWNfbGVuKTsKIAotCWlwNmggPSBza2ItPm5oLmlwdjZoOworCWlwNmggPSBpcHY2X2hkcihza2IpOwogCWlwNmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplKTsKIAlpcHY2X2FkZHJfY29weSgmaXA2aC0+ZGFkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikgJngtPnNlbC5kYWRkci5hNik7CiAJaXB2Nl9hZGRyX2NvcHkoJmlwNmgtPnNhZGRyLCAoc3RydWN0IGluNl9hZGRyICopICZ4LT5zZWwuc2FkZHIuYTYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfbW9kZV9yby5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV9yby5jCmluZGV4IDYwMzFjMTYuLjZhZDZkN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfcm8uYworKysgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3JvLmMKQEAgLTUwLDExICs1MCwxMiBAQAogCWludCBoZHJfbGVuOwogCiAJc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuKTsKLQlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAKIAloZHJfbGVuID0geC0+dHlwZS0+aGRyX29mZnNldCh4LCBza2IsICZwcmV2aGRyKTsKLQlza2ItPm5oLnJhdyA9IHByZXZoZHIgLSB4LT5wcm9wcy5oZWFkZXJfbGVuOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLAorCQkJICAgICAgIChwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbikgLSBza2ItPmRhdGEpOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIGhkcl9sZW4pOwogCW1lbW1vdmUoc2tiLT5kYXRhLCBpcGgsIGhkcl9sZW4pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfbW9kZV90cmFuc3BvcnQuYyBiL25ldC9pcHY2L3hmcm02X21vZGVfdHJhbnNwb3J0LmMKaW5kZXggM2E0YjM5Yi4uYzAyNmJmZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfbW9kZV90cmFuc3BvcnQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3RyYW5zcG9ydC5jCkBAIC0zMiwxMSArMzIsMTIgQEAKIAlpbnQgaGRyX2xlbjsKIAogCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7Ci0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCiAJaGRyX2xlbiA9IHgtPnR5cGUtPmhkcl9vZmZzZXQoeCwgc2tiLCAmcHJldmhkcik7Ci0Jc2tiLT5uaC5yYXcgPSBwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwKKwkJCSAgICAgICAocHJldmhkciAtIHgtPnByb3BzLmhlYWRlcl9sZW4pIC0gc2tiLT5kYXRhKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoZHJfbGVuKTsKIAltZW1tb3ZlKHNrYi0+ZGF0YSwgaXBoLCBoZHJfbGVuKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxLDEzICs1MiwxNiBAQAogICovCiBzdGF0aWMgaW50IHhmcm02X3RyYW5zcG9ydF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgaWhsID0gc2tiLT5kYXRhIC0gc2tiLT5oLnJhdzsKKwlpbnQgaWhsID0gc2tiLT5kYXRhIC0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAotCWlmIChza2ItPmgucmF3ICE9IHNrYi0+bmgucmF3KQotCQlza2ItPm5oLnJhdyA9IG1lbW1vdmUoc2tiLT5oLnJhdywgc2tiLT5uaC5yYXcsIGlobCk7Ci0Jc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGlobCAtCisJaWYgKHNrYi0+dHJhbnNwb3J0X2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CisJCW1lbW1vdmUoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCXNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpaGwpOworCQlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCX0KKwlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuICsgaWhsIC0KIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV90dW5uZWwuYwppbmRleCAwYmM4NjZjLi5hNmMwY2RmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMKQEAgLTE4LDggKzE4LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcHY2aGRyICpvdXRlcl9pcGggPSBza2ItPm5oLmlwdjZoOwotCXN0cnVjdCBpcHY2aGRyICppbm5lcl9pcGggPSBza2ItPmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKm91dGVyX2lwaCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IGlwdjZoZHIgKmlubmVyX2lwaCA9IGlwaXB2Nl9oZHIoc2tiKTsKIAogCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKG91dGVyX2lwaCkpKQogCQlJUDZfRUNOX3NldF9jZShpbm5lcl9pcGgpOwpAQCAtMjcsOCArMjcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXA2aXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKElORVRfRUNOX2lzX2NlKGlwdjZfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcHY2aCkpKQotCQkJSVBfRUNOX3NldF9jZShza2ItPmguaXBpcGgpOworCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpKSkKKwkJCUlQX0VDTl9zZXRfY2UoaXBpcF9oZHIoc2tiKSk7CiB9CiAKIC8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KQEAgLTUxLDEyICs1MSwxMiBAQAogCWludCBkc2ZpZWxkOwogCiAJc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuKTsKLQlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKLQl0b3BfaXBoID0gc2tiLT5uaC5pcHY2aDsKLQlza2ItPm5oLnJhdyA9ICZ0b3BfaXBoLT5uZXh0aGRyOwotCXNrYi0+aC5pcHY2aCA9IHRvcF9pcGggKyAxOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXRvcF9pcGggPSBpcHY2X2hkcihza2IpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXNrYi0+bmV0d29ya19oZWFkZXIgICArPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAl0b3BfaXBoLT52ZXJzaW9uID0gNjsKIAlpZiAoeGRzdC0+cm91dGUtPm9wcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CkBAIC04Niw5ICs4NiwxMSBAQAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX21hYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0JaWYgKHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXSAhPSBJUFBST1RPX0lQVjYKLQkgICAgJiYgc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBJUCkKKwlpZiAobmhbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBWNiAmJgorCSAgICBuaFtJUDZDQihza2IpLT5uaG9mZl0gIT0gSVBQUk9UT19JUElQKQogCQlnb3RvIG91dDsKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJZ290byBvdXQ7CkBAIC05Nyw5ICs5OSwxMCBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdID09IElQUFJPVE9fSVBWNikgeworCW5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaWYgKG5oW0lQNkNCKHNrYiktPm5ob2ZmXSA9PSBJUFBST1RPX0lQVjYpIHsKIAkJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQotCQkJaXB2Nl9jb3B5X2RzY3Aoc2tiLT5uaC5pcHY2aCwgc2tiLT5oLmlwdjZoKTsKKwkJCWlwdjZfY29weV9kc2NwKGlwdjZfaGRyKHNrYiksIGlwaXB2Nl9oZHIoc2tiKSk7CiAJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCiAJCQlpcGlwNl9lY25fZGVjYXBzdWxhdGUoc2tiKTsKIAl9IGVsc2UgewpAQCAtMTA3LDkgKzExMCwxMCBAQAogCQkJaXA2aXBfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJfQotCXNrYi0+bWFjLnJhdyA9IG1lbW1vdmUoc2tiLT5kYXRhIC0gc2tiLT5tYWNfbGVuLAotCQkJICAgICAgIHNrYi0+bWFjLnJhdywgc2tiLT5tYWNfbGVuKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlvbGRfbWFjID0gc2tiX21hY19oZWFkZXIoc2tiKTsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtc2tiLT5tYWNfbGVuKTsKKwltZW1tb3ZlKHNrYl9tYWNfaGVhZGVyKHNrYiksIG9sZF9tYWMsIHNrYi0+bWFjX2xlbik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZXJyID0gMDsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwppbmRleCBkNmQ3ODZiLi41NjM2NGE1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwpAQCAtMjMsNiArMjMsOCBAQAogCXJldHVybiBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgcHJldmhkcik7CiB9CiAKK0VYUE9SVF9TWU1CT0woeGZybTZfZmluZF8xc3RmcmFnb3B0KTsKKwogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfY2hlY2tfc2l6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBtdHUsIHJldCA9IDA7CkBAIC03NiwxMSArNzgsMTEgQEAKIAkJeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOwogCQl4LT5jdXJsZnQucGFja2V0cysrOwogCQlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04pCi0JCQl4LT5sYXN0dXNlZCA9ICh1NjQpeHRpbWUudHZfc2VjOworCQkJeC0+bGFzdHVzZWQgPSBnZXRfc2Vjb25kcygpOwogCiAJCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKIAotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkJaWYgKCEoc2tiLT5kc3QgPSBkc3RfcG9wKGRzdCkpKSB7CiAJCQllcnIgPSAtRUhPU1RVTlJFQUNIOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCBkOGE1ODViLi4xZmFhMmVhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMjQwLDcgKzI0MCw4IEBACiAJCWlmICghYWZpbmZvKSB7CiAJCQlkc3QgPSAqZHN0X3A7CiAJCQlnb3RvIGVycm9yOwotCQl9OworCQl9CisKIAkJZHN0X3ByZXYtPm91dHB1dCA9IGFmaW5mby0+b3V0cHV0OwogCQl4ZnJtX3N0YXRlX3B1dF9hZmluZm8oYWZpbmZvKTsKIAkJLyogU2hlaXQuLi4gSSByZW1lbWJlciBJIGRpZCB0aGlzIHJpZ2h0LiBBcHBhcmVudGx5LApAQCAtMjcwLDE3ICsyNzEsMTkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX2RlY29kZV9zZXNzaW9uNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQogewotCXUxNiBvZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkciA9IHNrYi0+bmguaXB2Nmg7CisJdTE2IG9mZnNldCA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHI7Ci0JdTggbmV4dGhkciA9IHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCXU4IG5leHRoZHIgPSBuaFtJUDZDQihza2IpLT5uaG9mZl07CiAKIAltZW1zZXQoZmwsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2kpKTsKIAlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsICZoZHItPmRhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9zcmMsICZoZHItPnNhZGRyKTsKIAotCXdoaWxlIChwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyAxIC0gc2tiLT5kYXRhKSkgewotCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwl3aGlsZSAocHNrYl9tYXlfcHVsbChza2IsIG5oICsgb2Zmc2V0ICsgMSAtIHNrYi0+ZGF0YSkpIHsKKwkJbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCiAJCXN3aXRjaCAobmV4dGhkcikgewogCQljYXNlIE5FWFRIRFJfUk9VVElORzoKQEAgLTI4OCw3ICsyOTEsNyBAQAogCQljYXNlIE5FWFRIRFJfREVTVDoKIAkJCW9mZnNldCArPSBpcHY2X29wdGxlbihleHRoZHIpOwogCQkJbmV4dGhkciA9IGV4dGhkci0+bmV4dGhkcjsKLQkJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUFBST1RPX1VEUDoKQEAgLTI5Niw3ICsyOTksNyBAQAogCQljYXNlIElQUFJPVE9fVENQOgogCQljYXNlIElQUFJPVE9fU0NUUDoKIAkJY2FzZSBJUFBST1RPX0RDQ1A6Ci0JCQlpZiAocHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bmgucmF3ICsgb2Zmc2V0ICsgNCAtIHNrYi0+ZGF0YSkpIHsKKwkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgbmggKyBvZmZzZXQgKyA0IC0gc2tiLT5kYXRhKSkgewogCQkJCV9fYmUxNiAqcG9ydHMgPSAoX19iZTE2ICopZXh0aGRyOwogCiAJCQkJZmwtPmZsX2lwX3Nwb3J0ID0gcG9ydHNbMF07CkBAIC0zMDYsNyArMzA5LDcgQEAKIAkJCXJldHVybjsKIAogCQljYXNlIElQUFJPVE9fSUNNUFY2OgotCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBza2ItPm5oLnJhdyArIG9mZnNldCArIDIgLSBza2ItPmRhdGEpKSB7CisJCQlpZiAocHNrYl9tYXlfcHVsbChza2IsIG5oICsgb2Zmc2V0ICsgMiAtIHNrYi0+ZGF0YSkpIHsKIAkJCQl1OCAqaWNtcCA9ICh1OCAqKWV4dGhkcjsKIAogCQkJCWZsLT5mbF9pY21wX3R5cGUgPSBpY21wWzBdOwpAQCAtMzE3LDcgKzMyMCw3IEBACiAKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiAJCWNhc2UgSVBQUk9UT19NSDoKLQkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyAzIC0gc2tiLT5kYXRhKSkgeworCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBuaCArIG9mZnNldCArIDMgLSBza2ItPmRhdGEpKSB7CiAJCQkJc3RydWN0IGlwNl9taCAqbWg7CiAJCQkJbWggPSAoc3RydWN0IGlwNl9taCAqKWV4dGhkcjsKIApAQCAtMzM1LDcgKzMzOCw3IEBACiAJCQlmbC0+ZmxfaXBzZWNfc3BpID0gMDsKIAkJCWZsLT5wcm90byA9IG5leHRoZHI7CiAJCQlyZXR1cm47Ci0JCX07CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggOTNjNDIyMy4uNTM4NDk5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCiBzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlfX2JlMzIgc3BpOwogCiAJc3BpID0geGZybTZfdHVubmVsX3NwaV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+c2FkZHIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lweC9hZl9pcHguYyBiL25ldC9pcHgvYWZfaXB4LmMKaW5kZXggY2FjMzVhNy4uMzkyZjhiYyAxMDA2NDQKLS0tIGEvbmV0L2lweC9hZl9pcHguYworKysgYi9uZXQvaXB4L2FmX2lweC5jCkBAIC01NzYsNyArNTc2LDkgQEAKIAlza2IyID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYjIpIHsKIAkJc2tiX3Jlc2VydmUoc2tiMiwgb3V0X29mZnNldCk7Ci0JCXNrYjItPm5oLnJhdyA9IHNrYjItPmgucmF3ID0gc2tiX3B1dChza2IyLCBza2ItPmxlbik7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiMik7CisJCXNrYl9wdXQoc2tiMiwgc2tiLT5sZW4pOwogCQltZW1jcHkoaXB4X2hkcihza2IyKSwgaXB4X2hkcihza2IpLCBza2ItPmxlbik7CiAJCW1lbWNweShza2IyLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKIAl9CkBAIC0xODA3LDggKzE4MDksOCBAQAogCQkJCSAgICAgY29waWVkKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2ZyZWU7Ci0JaWYgKHNrYi0+dHN0YW1wLm9mZl9zZWMpCi0JCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnNrLT5za19zdGFtcCk7CisJaWYgKHNrYi0+dHN0YW1wLnR2NjQpCisJCXNrLT5za19zdGFtcCA9IHNrYi0+dHN0YW1wOwogCiAJbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZigqc2lweCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHgvaXB4X3JvdXRlLmMgYi9uZXQvaXB4L2lweF9yb3V0ZS5jCmluZGV4IDhlMWNhZDkuLmUxNmMxMTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvaXB4X3JvdXRlLmMKKysrIGIvbmV0L2lweC9pcHhfcm91dGUuYwpAQCAtMjAzLDcgKzIwMyw5IEBACiAJc2tiLT5zayA9IHNrOwogCiAJLyogRmlsbCBpbiBJUFggaGVhZGVyICovCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB4aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHhoZHIpKTsKIAlpcHggPSBpcHhfaGRyKHNrYik7CiAJaXB4LT5pcHhfcGt0c2l6ZSA9IGh0b25zKGxlbiArIHNpemVvZihzdHJ1Y3QgaXB4aGRyKSk7CiAJSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmwgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCmluZGV4IDBlYjdkNTkuLjA2Yzk3YzYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2FmX2lyZGEuYworKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTg5LDcgKzg5LDYgQEAKIAogCXNlbGYgPSBpbnN0YW5jZTsKIAlzayA9IGluc3RhbmNlOwotCUlSREFfQVNTRVJUKHNrICE9IE5VTEwsIHJldHVybiAtMTspOwogCiAJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogCWlmIChlcnIpIHsKQEAgLTEzMSwxNCArMTMwLDEyIEBACiAJfQogCiAJLyogUHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBpcmRhX3JlbGVhc2UoKSBhbmQgaXJkYV9zaHV0ZG93bigpICovCisJYmhfbG9ja19zb2NrKHNrKTsKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7Ci0JCWxvY2tfc29jayhzayk7CiAJCXNrLT5za19zdGF0ZSAgICAgPSBUQ1BfQ0xPU0U7Ci0JCXNrLT5za19lcnIgICAgICAgPSBFQ09OTlJFU0VUOwogCQlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKIAogCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKIAogCQkvKiBDbG9zZSBvdXIgVFNBUC4KIAkJICogSWYgd2UgbGVhdmUgaXQgb3BlbiwgSXJMTVAgcHV0IGl0IGJhY2sgaW50byB0aGUgbGlzdCBvZgpAQCAtMTU4LDYgKzE1NSw3IEBACiAJCQlzZWxmLT50c2FwID0gTlVMTDsKIAkJfQogCX0KKwliaF91bmxvY2tfc29jayhzayk7CiAKIAkvKiBOb3RlIDogb25jZSB3ZSBhcmUgdGhlcmUsIHRoZXJlIGlzIG5vdCBtdWNoIHlvdSB3YW50IHRvIGRvCiAJICogd2l0aCB0aGUgc29ja2V0IGFueW1vcmUsIGFwYXJ0IGZyb20gY2xvc2luZyBpdC4KQEAgLTIyMCw3ICsyMTgsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKLQl9OworCX0KIAogCUlSREFfREVCVUcoMiwgIiVzKCksIG1heF9kYXRhX3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywKIAkJICAgc2VsZi0+bWF4X2RhdGFfc2l6ZSk7CkBAIC0yODMsNyArMjgxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUoc2VsZi0+dHNhcCk7Ci0JfTsKKwl9CiAKIAlJUkRBX0RFQlVHKDIsICIlcygpLCBtYXhfZGF0YV9zaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSAgIHNlbGYtPm1heF9kYXRhX3NpemUpOwpAQCAtMzA2LDggKzMwNCw2IEBACiAKIAlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKLQogCXNrYiA9IGFsbG9jX3NrYihUVFBfTUFYX0hFQURFUiArIFRUUF9TQVJfSEVBREVSLAogCQkJR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CkBAIC0zMzcsNyArMzMzLDcgQEAKIAogCXNlbGYgPSBpbnN0YW5jZTsKIAlzayA9IGluc3RhbmNlOwotCUlSREFfQVNTRVJUKHNrICE9IE5VTEwsIHJldHVybjspOworCUJVR19PTihzayA9PSBOVUxMKTsKIAogCXN3aXRjaCAoZmxvdykgewogCWNhc2UgRkxPV19TVE9QOgpAQCAtNDQ5LDcgKzQ0NSw3IEBACiAJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKIAogCXNlbGYgPSAoc3RydWN0IGlyZGFfc29jayAqKSBwcml2OwotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJQlVHX09OKHNlbGYgPT0gTlVMTCk7CiAKIAkvKiBOb3RoaW5nIGZvciB0aGUgY2FsbGVyICovCiAJc2VsZi0+Y2FjaGVsb2cgPSBOVUxMOwpAQCAtNTQ2LDggKzU0Miw2IEBACiB7CiAJSVJEQV9ERUJVRygyLCAiJXMoJXAsICVzKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmLCBuYW1lKTsKIAotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7Ci0KIAlpZiAoc2VsZi0+aXJpYXApIHsKIAkJSVJEQV9XQVJOSU5HKCIlcygpOiBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fKTsKQEAgLTYzNSw4ICs2MjksNiBAQAogCiAJSVJEQV9ERUJVRygyLCAiJXMoKSwgbmFtZT0lc1xuIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKIAotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7Ci0KIAkvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nCiAJICogTm90ZSA6IHdlIGhhdmUgdG8gdXNlIGlybG1wX2dldF9kaXNjb3ZlcmllcygpLCBhcyBvcHBvc2VkCiAJICogdG8gcGxheSB3aXRoIHRoZSBjYWNoZWxvZyBkaXJlY3RseSwgYmVjYXVzZSB3aGlsZSB3ZSBhcmUKQEAgLTc4NCw4ICs3NzYsNiBAQAogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKIAlpbnQgZXJyOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKIAogCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2lyZGEpKQpAQCAtODQxLDggKzgzMSw2IEBACiAKIAlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCWVyciA9IGlyZGFfY3JlYXRlKG5ld3NvY2ssIHNrLT5za19wcm90b2NvbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTg3Myw0NCArODYxLDI4IEBACiAJICogY2FsbGluZyB1cywgdGhlIGRhdGEgaXMgd2FpdGluZyBmb3IgdXMgOy0pCiAJICogSmVhbiBJSQogCSAqLwotCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCWludCByZXQgPSAwOwotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0cSwgY3VycmVudCk7CisJd2hpbGUgKDEpIHsKKwkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKHNrYikKKwkJCWJyZWFrOwogCiAJCS8qIE5vbiBibG9ja2luZyBvcGVyYXRpb24gKi8KIAkJaWYgKGZsYWdzICYgT19OT05CTE9DSykKIAkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CiAKLQkJLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgY3V0J24ncGFzdGUgb2YgdGhlCi0JCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIG1hY3JvLgotCQkgKiBXZSBkb24ndCB1cyB0aGUgbWFjcm8gYmVjYXVzZSB0aGUgY29uZGl0aW9uIGhhcwotCQkgKiBzaWRlIGVmZmVjdHMgOiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lCi0JCSAqIHNrYiBnZXQgZGVxdWV1ZWQgLSBKZWFuIElJICovCi0JCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXRxKTsKLQkJZm9yICg7OykgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCQlpZiAoc2tiICE9IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7Ci0JCWlmKHJldCkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqKHNrLT5za19zbGVlcCksCisJCQkJCXNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAluZXdzayA9IG5ld3NvY2stPnNrOworCWlmIChuZXdzayA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwogCW5ld3NrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKIAogCW5ldyA9IGlyZGFfc2sobmV3c2spOwotCUlSREFfQVNTRVJUKG5ldyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAogCS8qIE5vdyBhdHRhY2ggdXAgdGhlIG5ldyBzb2NrZXQgKi8KIAluZXctPnRzYXAgPSBpcnR0cF9kdXAoc2VsZi0+dHNhcCwgbmV3KTsKQEAgLTEwNjEsNyArMTAzMyw4IEBACiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgewogCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwotCQlyZXR1cm4gc29ja19lcnJvcihzayk7CS8qIEFsd2F5cyBzZXQgYXQgdGhpcyBwb2ludCAqLworCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwkJcmV0dXJuIGVycj8gZXJyIDogLUVDT05OUkVTRVQ7CiAJfQogCiAJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CkBAIC0xMTcxLDggKzExNDQsNiBAQAogewogCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKIAotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7Ci0KIAkvKiBVbnJlZ2lzdGVyIHdpdGggSXJMTVAgKi8KIAlpcmxtcF91bnJlZ2lzdGVyX2NsaWVudChzZWxmLT5ja2V5KTsKIAlpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2VsZi0+c2tleSk7CkBAIC0xMjc0LDcgKzEyNDUsNiBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICphc21wdHI7CiAJaW50IGVycjsKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lemRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKQEAgLTEyOTIsNyArMTI2Miw2IEBACiAJCXJldHVybiAtRU5PVENPTk47CiAKIAlzZWxmID0gaXJkYV9zayhzayk7Ci0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAogCS8qIENoZWNrIGlmIElyVFRQIGlzIHdhbnRzIHVzIHRvIHNsb3cgZG93biAqLwogCkBAIC0xMzE3LDkgKzEyODYsOSBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDE2KTsKLQotCWFzbXB0ciA9IHNrYi0+aC5yYXcgPSBza2JfcHV0KHNrYiwgbGVuKTsKLQllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKGFzbXB0ciwgbXNnLT5tc2dfaW92LCBsZW4pOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBtc2ctPm1zZ19pb3YsIGxlbik7CiAJaWYgKGVycikgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIGVycjsKQEAgLTEzNTUsMTYgKzEzMjQsMTYgQEAKIAogCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCUlSREFfQVNTRVJUKCFzb2NrX2Vycm9yKHNrKSwgcmV0dXJuIC0xOyk7CisJaWYgKChlcnIgPSBzb2NrX2Vycm9yKHNrKSkgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzICYgfk1TR19ET05UV0FJVCwKIAkJCQlmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAJaWYgKCFza2IpCiAJCXJldHVybiBlcnI7CiAKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOwotCWNvcGllZCAgICAgPSBza2ItPmxlbjsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWNvcGllZCA9IHNrYi0+bGVuOwogCiAJaWYgKGNvcGllZCA+IHNpemUpIHsKIAkJSVJEQV9ERUJVRygyLCAiJXMoKSwgUmVjZWl2ZWQgdHJ1bmNhdGVkIGZyYW1lICglemQgPCAlemQpIVxuIiwKQEAgLTE0MDMsMTMgKzEzNzIsMTMgQEAKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CiAJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKIAlzaXplX3QgY29waWVkID0gMDsKLQlpbnQgdGFyZ2V0ID0gMTsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0cSwgY3VycmVudCk7CisJaW50IHRhcmdldCwgZXJyOworCWxvbmcgdGltZW87CiAKIAlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQlJUkRBX0FTU0VSVCghc29ja19lcnJvcihzayksIHJldHVybiAtMTspOworCWlmICgoZXJyID0gc29ja19lcnJvcihzaykpIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWlmIChzb2NrLT5mbGFncyAmIF9fU09fQUNDRVBUQ09OKQogCQlyZXR1cm4oLUVJTlZBTCk7CkBAIC0xNDE3LDggKzEzODYsOCBAQAogCWlmIChmbGFncyAmIE1TR19PT0IpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChmbGFncyAmIE1TR19XQUlUQUxMKQotCQl0YXJnZXQgPSBzaXplOworCXRhcmdldCA9IHNvY2tfcmN2bG93YXQoc2ssIGZsYWdzICYgTVNHX1dBSVRBTEwsIHNpemUpOworCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgbm9ibG9jayk7CiAKIAltc2ctPm1zZ19uYW1lbGVuID0gMDsKIApAQCAtMTQyNiwxOSArMTM5NSwxNCBAQAogCQlpbnQgY2h1bms7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCi0JCWlmIChza2I9PU5VTEwpIHsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJCWludCByZXQgPSAwOwogCiAJCQlpZiAoY29waWVkID49IHRhcmdldCkKIAkJCQlicmVhazsKIAotCQkJLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgY3V0J24ncGFzdGUgb2YgdGhlCi0JCQkgKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSBtYWNyby4KLQkJCSAqIFdlIGRvbid0IHVzIHRoZSBtYWNybyBiZWNhdXNlIHRoZSB0ZXN0IGNvbmRpdGlvbgotCQkJICogaXMgbWVzc3kuIC0gSmVhbiBJSSAqLwotCQkJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwotCQkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAogCQkJLyoKIAkJCSAqCVBPU0lYIDEwMDMuMWcgbWFuZGF0ZXMgdGhpcyBvcmRlci4KQEAgLTE0NTEsMTcgKzE0MTUsMTcgQEAKIAkJCWVsc2UgaWYgKG5vYmxvY2spCiAJCQkJcmV0ID0gLUVBR0FJTjsKIAkJCWVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlyZXQgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQkJZWxzZSBpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCQlyZXQgPSAtRU5PVENPTk47CiAJCQllbHNlIGlmIChza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpID09IE5VTEwpCiAJCQkJLyogV2FpdCBwcm9jZXNzIHVudGlsIGRhdGEgYXJyaXZlcyAqLwogCQkJCXNjaGVkdWxlKCk7CiAKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOwotCQkJY2xlYXJfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAotCQkJaWYocmV0KQotCQkJCXJldHVybihyZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKIAkJCQlicmVhazsKIApAQCAtMTUzMCw3ICsxNDk0LDYgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqYXNtcHRyOwogCWludCBlcnI7CiAKIAlJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JXpkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CkBAIC0xNTQ3LDcgKzE1MTAsNiBAQAogCQlyZXR1cm4gLUVOT1RDT05OOwogCiAJc2VsZiA9IGlyZGFfc2soc2spOwotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKIAkvKgogCSAqIENoZWNrIHRoYXQgd2UgZG9uJ3Qgc2VuZCBvdXQgdG9vIGJpZyBmcmFtZXMuIFRoaXMgaXMgYW4gdW5yZWxpYWJsZQpAQCAtMTU2NiwxMCArMTUyOCwxMSBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIGFwcGVuZGluZyB1c2VyIGRhdGFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOwotCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJc2tiX3B1dChza2IsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBtc2ctPm1zZ19pb3YsIGxlbik7CiAJaWYgKGVycikgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIGVycjsKQEAgLTE2MDIsNyArMTU2NSw2IEBACiAJX191OCBwaWQgPSAwOwogCWludCBib3VuZCA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICphc21wdHI7CiAJaW50IGVycjsKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lemRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKQEAgLTE2MTYsNyArMTU3OCw2IEBACiAJfQogCiAJc2VsZiA9IGlyZGFfc2soc2spOwotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKIAkvKiBDaGVjayBpZiBhbiBhZGRyZXNzIHdhcyBzcGVjaWZpZWQgd2l0aCBzZW5kdG8uIEplYW4gSUkgKi8KIAlpZiAobXNnLT5tc2dfbmFtZSkgewpAQCAtMTY2MiwxMCArMTYyMywxMSBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIGFwcGVuZGluZyB1c2VyIGRhdGFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOwotCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJc2tiX3B1dChza2IsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBtc2ctPm1zZ19pb3YsIGxlbik7CiAJaWYgKGVycikgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIGVycjsKQEAgLTE2ODksOCArMTY1MSw2IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCUlSREFfREVCVUcoMSwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKIAogCXNrLT5za19zdGF0ZSAgICAgICA9IFRDUF9DTE9TRTsKQEAgLTE4NjMsOCArMTgyMyw2IEBACiAJc3RydWN0IGlhc19hdHRyaWIgKglpYXNfYXR0cjsJLyogQXR0cmlidXRlIGluIElBUyBvYmplY3QgKi8KIAlpbnQgb3B0OwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKIAogCWlmIChsZXZlbCAhPSBTT0xfSVJMTVApCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMKaW5kZXggMDFkN2M5Yy4uZTVlNDc5MiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9wYXJhbS5jCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fcGFyYW0uYwpAQCAtMTMzLDggKzEzMyw4IEBACiAJICogSW5zZXJ0aW5nIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgbXVjaAogCSAqIHJvb20gd2Ugd2lsbCBuZWVkLiBCdXQgdGhpcyBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgT0sKIAkgKi8KLQljb3VudCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIHBpLCBza2ItPnRhaWwsIHNrYl90YWlscm9vbShza2IpLAotCQkJCSAgJmlyY29tbV9wYXJhbV9pbmZvKTsKKwljb3VudCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIHBpLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCQkJICBza2JfdGFpbHJvb20oc2tiKSwgJmlyY29tbV9wYXJhbV9pbmZvKTsKIAlpZiAoY291bnQgPCAwKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgbm8gcm9vbSBmb3IgcGFyYW1ldGVyIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCmluZGV4IGU3MTc4MDEuLjdiNWRlZjEgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKKysrIGIvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiBkb25nbGVfdCAqaXJkYV9kZXZpY2VfZG9uZ2xlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGRvbmdsZV9yZWcgKnJlZzsKLQlkb25nbGVfdCAqZG9uZ2xlID0gTlVMTDsKKwlkb25nbGVfdCAqZG9uZ2xlID0ga3phbGxvYyhzaXplb2YoZG9uZ2xlX3QpLCBHRlBfS0VSTkVMKTsKIAogCW1pZ2h0X3NsZWVwKCk7CiAKQEAgLTM5NywxOSArMzk3LDE0IEBACiAJaWYgKCFyZWcgfHwgIXRyeV9tb2R1bGVfZ2V0KHJlZy0+b3duZXIpICkgewogCQlJUkRBX0VSUk9SKCJJckRBOiBVbmFibGUgdG8gZmluZCByZXF1ZXN0ZWQgZG9uZ2xlIHR5cGUgJXhcbiIsCiAJCQkgICB0eXBlKTsKLQkJZ290byBvdXQ7CisJCWtmcmVlKGRvbmdsZSk7CisJCWRvbmdsZSA9IE5VTEw7CiAJfQotCi0JLyogQWxsb2NhdGUgZG9uZ2xlIGluZm8gZm9yIHRoaXMgaW5zdGFuY2UgKi8KLQlkb25nbGUgPSBremFsbG9jKHNpemVvZihkb25nbGVfdCksIEdGUF9LRVJORUwpOwotCWlmICghZG9uZ2xlKQotCQlnb3RvIG91dDsKLQotCS8qIEJpbmQgdGhlIHJlZ2lzdHJhdGlvbiBpbmZvIHRvIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSAqLwotCWRvbmdsZS0+aXNzdWUgPSByZWc7Ci0JZG9uZ2xlLT5kZXYgPSBkZXY7Ci0KLSBvdXQ6CisJaWYgKGRvbmdsZSkgeworCQkvKiBCaW5kIHRoZSByZWdpc3RyYXRpb24gaW5mbyB0byB0aGlzIHBhcnRpY3VsYXIgaW5zdGFuY2UgKi8KKwkJZG9uZ2xlLT5pc3N1ZSA9IHJlZzsKKwkJZG9uZ2xlLT5kZXYgPSBkZXY7CisJfQogCXNwaW5fdW5sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CiAJcmV0dXJuIGRvbmdsZTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKaW5kZXggZmNmOWQ2NS4uZWQ2OTc3MyAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKQEAgLTEwMzksNyArMTAzOSw3IEBACiAJfQogCiAJLyogSW5zZXJ0IGF0IGVuZCBvZiBzay1idWZmZXIgKi8KLQlmcmFtZSA9IHNrYi0+dGFpbDsKKwlmcmFtZSA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCS8qIE1ha2Ugc3BhY2UgZm9yIGRhdGEgKi8KIAlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCAocGFyYW1fbGVuK3ZhbHVlX2xlbiszKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYwppbmRleCA2NzJhYjNmLi5jNDIxNTIxIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYwpAQCAtMjM0LDggKzIzNCw3IEBACiAJICogbWlnaHQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBsb3cgbGV2ZWwgSXJEQSBuZXR3b3JrCiAJICogZGV2aWNlIGRyaXZlcgogCSAqLwotCXNrYi0+ZGV2ID0gc2VsZi0+ZGV2OwotCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7IC8qIFJlbW92ZSBldGggaGVhZGVyICovCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2VsZi0+ZGV2KTsgLyogUmVtb3ZlIGV0aCBoZWFkZXIgKi8KIAogCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFwX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCmluZGV4IDdiNjQzM2YuLjBiMDIwNzMgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKKysrIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwpAQCAtNTkwLDcgKzU5MCw3IEBACiAJCWlmICghc2VsZi0+ZGlzY292ZXJ5X2xvZykgewogCQkJSVJEQV9XQVJOSU5HKCIlczogZGlzY292ZXJ5IGxvZyBpcyBnb25lISAiCiAJCQkJICAgICAibWF5YmUgdGhlIGRpc2NvdmVyeSB0aW1lb3V0IGhhcyBiZWVuIHNldCIKLQkJCQkgICAgICIgdG8gc2hvcnQ/XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCSAgICAgIiB0b28gc2hvcnQ/XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJYnJlYWs7CiAJCX0KIAkJaGFzaGJpbl9pbnNlcnQoc2VsZi0+ZGlzY292ZXJ5X2xvZywKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMgYi9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jCmluZGV4IDBiMDQ2MDMuLjNjNWE2OGUgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKKysrIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwpAQCAtOTMsNyArOTMsOSBAQAogewogCS8qIFNvbWUgY29tbW9uIGluaXQgc3R1ZmYgKi8KIAlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgPSBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAlza2ItPnByaW9yaXR5ID0gVENfUFJJT19CRVNURUZGT1JUOwogCkBAIC00MTEsNyArNDEzLDcgQEAKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKSkgewotCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG9vIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDgyLDcgKzQ4NCw3IEBACiAJY2hhciAqdGV4dDsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgeGlkX2ZyYW1lKSkpIHsKLQkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvbyBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTUyNiw3ICs1MjgsNyBAQAogCQkvKiBDaGVjayBpZiB0aGluZ3MgYXJlIHNhbmUgYXQgdGhpcyBwb2ludC4uLiAqLwogCQlpZigoZGlzY292ZXJ5X2luZm8gPT0gTlVMTCkgfHwKIAkJICAgIXBza2JfbWF5X3B1bGwoc2tiLCAzKSkgewotCQkJSVJEQV9FUlJPUigiJXM6IGRpc2NvdmVyeSBmcmFtZSB0byBzaG9ydCFcbiIsCisJCQlJUkRBX0VSUk9SKCIlczogZGlzY292ZXJ5IGZyYW1lIHRvbyBzaG9ydCFcbiIsCiAJCQkJICAgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTE3MSw3ICsxMTczLDcgQEAKIAlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybjspOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgNCkpIHsKLQkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvbyBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyNjAsNyArMTI2Miw3IEBACiAJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqZnJhbWUpKSkgewotCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG9vIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIAlmcmFtZSA9IChzdHJ1Y3QgdGVzdF9mcmFtZSAqKSBza2ItPmRhdGE7CkBAIC0xMjY4LDcgKzEyNzAsNyBAQAogCS8qIEJyb2FkY2FzdCBmcmFtZXMgbXVzdCBjYXJyeSBzYWRkciBhbmQgZGFkZHIgZmllbGRzICovCiAJaWYgKGluZm8tPmNhZGRyID09IENCUk9BRENBU1QpIHsKIAkJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB0ZXN0X2ZyYW1lKSkgewotCQkJSVJEQV9ERUJVRygwLCAiJXMoKSB0ZXN0IGZyYW1lIHRvIHNob3J0IVxuIiwKKwkJCUlSREFfREVCVUcoMCwgIiVzKCkgdGVzdCBmcmFtZSB0b28gc2hvcnQhXG4iLAogCQkJCSAgIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEzMzQsNyArMTMzNiw3IEBACiAKIAkvKiBDaGVjayBpZiBmcmFtZSBpcyBsYXJnZSBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkgewotCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG9vIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJxdWV1ZS5jIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCmluZGV4IDkyNjYyMzMuLmQwNThiNDYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lycXVldWUuYworKysgYi9uZXQvaXJkYS9pcnF1ZXVlLmMKQEAgLTM4NCw2ICszODQsOSBAQAogICogICAgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHN0cnVjdHVyZSBpZiBpdCdzIGNvbXBsZXguIElmIG5vdCB0aGUgdXNlciBjYW4KICAqICAgIGp1c3Qgc3VwcGx5IGtmcmVlLCB3aGljaCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoZSBqb2IuCiAgKi8KKyNpZmRlZiBDT05GSUdfTE9DS0RFUAorc3RhdGljIGludCBoYXNoYmluX2xvY2tfZGVwdGggPSAwOworI2VuZGlmCiBpbnQgaGFzaGJpbl9kZWxldGUoIGhhc2hiaW5fdCogaGFzaGJpbiwgRlJFRV9GVU5DIGZyZWVfZnVuYykKIHsKIAlpcmRhX3F1ZXVlX3QqIHF1ZXVlOwpAQCAtMzk1LDcgKzM5OCw4IEBACiAKIAkvKiBTeW5jaHJvbml6ZSAqLwogCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncywKKwkJCQkJIGhhc2hiaW5fbG9ja19kZXB0aCsrKTsKIAl9CiAKIAkvKgpAQCAtNDE5LDYgKzQyMyw5IEBACiAJLyogUmVsZWFzZSBsb2NrICovCiAJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworI2lmZGVmIENPTkZJR19MT0NLREVQCisJCWhhc2hiaW5fbG9ja19kZXB0aC0tOworI2VuZGlmCiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lydHRwLmMgYi9uZXQvaXJkYS9pcnR0cC5jCmluZGV4IGRhM2YyYmMuLjcwNjllNGEgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lydHRwLmMKKysrIGIvbmV0L2lyZGEvaXJ0dHAuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJICogIENvcHkgYWxsIGZyYWdtZW50cyB0byBhIG5ldyBidWZmZXIKIAkgKi8KIAl3aGlsZSAoKGZyYWcgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfZnJhZ21lbnRzKSkgIT0gTlVMTCkgewotCQltZW1jcHkoc2tiLT5kYXRhK24sIGZyYWctPmRhdGEsIGZyYWctPmxlbik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIG4sIGZyYWctPmRhdGEsIGZyYWctPmxlbik7CiAJCW4gKz0gZnJhZy0+bGVuOwogCiAJCWRldl9rZnJlZV9za2IoZnJhZyk7CkBAIC0zMTQsOCArMzE0LDggQEAKIAkJc2tiX3Jlc2VydmUoZnJhZywgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKIAogCQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc2tiIGludG8gdGhpcyBmcmFnbWVudC4gKi8KLQkJbWVtY3B5KHNrYl9wdXQoZnJhZywgc2VsZi0+bWF4X3NlZ19zaXplKSwgc2tiLT5kYXRhLAotCQkgICAgICAgc2VsZi0+bWF4X3NlZ19zaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoZnJhZywgc2VsZi0+bWF4X3NlZ19zaXplKSwKKwkJCSAgICAgIHNlbGYtPm1heF9zZWdfc2l6ZSk7CiAKIAkJLyogSW5zZXJ0IFRUUCBoZWFkZXIsIHdpdGggdGhlIG1vcmUgYml0IHNldCAqLwogCQlmcmFtZSA9IHNrYl9wdXNoKGZyYWcsIFRUUF9IRUFERVIpOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJfQogCiAJaWYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSB7Ci0JCUlSREFfREVCVUcoMSwgIiVzKCksIFVEYXRhIGlzIHRvIGxhcmdlIGZvciBJckxBUCFcbiIsCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVEYXRhIGlzIHRvbyBsYXJnZSBmb3IgSXJMQVAhXG4iLAogCQkJICAgX19GVU5DVElPTl9fKTsKIAkJZ290byBlcnI7CiAJfQpAQCAtNTk4LDcgKzU5OCw3IEBACiAJICogIGluc2lkZSBhbiBJckxBUCBmcmFtZQogCSAqLwogCWlmICgoc2VsZi0+dHhfbWF4X3NkdV9zaXplID09IDApICYmIChza2ItPmxlbiA+IHNlbGYtPm1heF9zZWdfc2l6ZSkpIHsKLQkJSVJEQV9FUlJPUigiJXM6IFNBUiBkaXNhYmxlZCwgYW5kIGRhdGEgaXMgdG8gbGFyZ2UgZm9yIElyTEFQIVxuIiwKKwkJSVJEQV9FUlJPUigiJXM6IFNBUiBkaXNhYmxlZCwgYW5kIGRhdGEgaXMgdG9vIGxhcmdlIGZvciBJckxBUCFcbiIsCiAJCQkgICBfX0ZVTkNUSU9OX18pOwogCQlyZXQgPSAtRU1TR1NJWkU7CiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvcGFyYW1ldGVycy5jIGIvbmV0L2lyZGEvcGFyYW1ldGVycy5jCmluZGV4IDc1YTcyZDIuLjI2MjdkYWQgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL3BhcmFtZXRlcnMuYworKysgYi9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCX0KIAkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIGluc2VydGlvbiAqLwogCWlmIChsZW4gPCAoMitwLnBsKSkgewotCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG8gc2hvcnQgZm9yIGluc2VydGlvbiFcbiIsCisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0b28gc2hvcnQgZm9yIGluc2VydGlvbiFcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMTYsNyArMjE2LDcgQEAKIAogCS8qIENoZWNrIGlmIGJ1ZmZlciBpcyBsb25nIGVub3VnaCBmb3IgcGFyc2luZyAqLwogCWlmIChsZW4gPCAoMitwLnBsKSkgewotCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG8gc2hvcnQgZm9yIHBhcnNpbmchICIKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvbyBzaG9ydCBmb3IgcGFyc2luZyEgIgogCQkJICAgICAiTmVlZCAlZCBieXRlcywgYnV0IGxlbiBpcyBvbmx5ICVkXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwsIGxlbik7CiAJCXJldHVybiAtMTsKQEAgLTMwNCw3ICszMDQsNyBAQAogCiAJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBwYXJzaW5nICovCiAJaWYgKGxlbiA8ICgyK3AucGwpKSB7Ci0JCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgcGFyc2luZyEgIgorCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG9vIHNob3J0IGZvciBwYXJzaW5nISAiCiAJCQkgICAgICJOZWVkICVkIGJ5dGVzLCBidXQgbGVuIGlzIG9ubHkgJWRcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCwgbGVuKTsKIAkJcmV0dXJuIC0xOwpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIAkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KIAlpZiAobGVuIDwgKDIrcC5wbCkpIHsKLQkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvIHNob3J0IGZvciBwYXJzaW5nISAiCisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0b28gc2hvcnQgZm9yIHBhcnNpbmchICIKIAkJCSAgICAgIk5lZWQgJWQgYnl0ZXMsIGJ1dCBsZW4gaXMgb25seSAlZFxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fLCBwLnBsLCBsZW4pOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9xb3MuYyBiL25ldC9pcmRhL3Fvcy5jCmluZGV4IDM0OTAxMmMuLmFlYjE4Y2YgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL3Fvcy5jCisrKyBiL25ldC9pcmRhL3Fvcy5jCkBAIC00NjksNDkgKzQ2OSw0OSBAQAogCWludCByZXQ7CiAKIAkvKiBJbnNlcnQgZGF0YSByYXRlICovCi0JcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfQkFVRF9SQVRFLCBza2ItPnRhaWwsCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfQkFVRF9SQVRFLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlza2JfcHV0KHNrYiwgcmV0KTsKIAogCS8qIEluc2VydCBtYXggdHVybmFyb3VuZCB0aW1lICovCi0JcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfTUFYX1RVUk5fVElNRSwgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX01BWF9UVVJOX1RJTUUsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXNrYl9wdXQoc2tiLCByZXQpOwogCiAJLyogSW5zZXJ0IGRhdGEgc2l6ZSAqLwotCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0RBVEFfU0laRSwgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0RBVEFfU0laRSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAogCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAJc2tiX3B1dChza2IsIHJldCk7CiAKIAkvKiBJbnNlcnQgd2luZG93IHNpemUgKi8KLQlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9XSU5ET1dfU0laRSwgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX1dJTkRPV19TSVpFLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlza2JfcHV0KHNrYiwgcmV0KTsKIAogCS8qIEluc2VydCBhZGRpdGlvbmFsIEJPRnMgKi8KLQlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9BRERfQk9GUywgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0FERF9CT0ZTLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlza2JfcHV0KHNrYiwgcmV0KTsKIAogCS8qIEluc2VydCBtaW5pbXVtIHR1cm5hcm91bmQgdGltZSAqLwotCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX01JTl9UVVJOX1RJTUUsIHNrYi0+dGFpbCwKKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9NSU5fVFVSTl9USU1FLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlza2JfcHV0KHNrYiwgcmV0KTsKIAogCS8qIEluc2VydCBsaW5rIGRpc2Nvbm5lY3QvdGhyZXNob2xkIHRpbWUgKi8KLQlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9MSU5LX0RJU0MsIHNrYi0+dGFpbCwKKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9MSU5LX0RJU0MsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvd3JhcHBlci5jIGIvbmV0L2lyZGEvd3JhcHBlci5jCmluZGV4IDVhYmZiNzEuLmE3YTdmMTkgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL3dyYXBwZXIuYworKysgYi9uZXQvaXJkYS93cmFwcGVyLmMKQEAgLTIzOSw3ICsyMzksOCBAQAogCiAJaWYoZG9jb3B5KSB7CiAJCS8qIENvcHkgZGF0YSB3aXRob3V0IENSQyAobGVuZ2h0IGFscmVhZHkgY2hlY2tlZCkgKi8KLQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgcnhfYnVmZi0+ZGF0YSwgcnhfYnVmZi0+bGVuIC0gMik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKG5ld3NrYiwgcnhfYnVmZi0+ZGF0YSwKKwkJCQkJcnhfYnVmZi0+bGVuIC0gMik7CiAJCS8qIERlbGl2ZXIgdGhpcyBza2IgKi8KIAkJZGF0YXNrYiA9IG5ld3NrYjsKIAl9IGVsc2UgewpAQCAtMjU2LDcgKzI1Nyw3IEBACiAKIAkvKiBGZWVkIGl0IHRvIElyTEFQIGxheWVyICovCiAJZGF0YXNrYi0+ZGV2ID0gZGV2OwotCWRhdGFza2ItPm1hYy5yYXcgID0gZGF0YXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihkYXRhc2tiKTsKIAlkYXRhc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCiAJbmV0aWZfcngoZGF0YXNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggYWNjOTQyMS4uZTg0YzkyNCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJZGVmYXVsdDoKIAkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOwogCQlicmVhazsKLQl9OworCX0KIAogCXJlbGVhc2Vfc29jayhzayk7CiAJaXVjdl9zb2NrX2tpbGwoc2spOwpAQCAtOTUzLDggKzk1Myw4IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNrYi0+bGVuID0gbXNnLT5sZW5ndGg7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9pdWN2LmMgYi9uZXQvaXVjdi9pdWN2LmMKaW5kZXggMWIxMGQ1Ny4uNjBmMjkzOCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtNTE5LDcgKzUxOSw2IEBACiAJa2ZyZWUoaXVjdl9wYXRoX3RhYmxlKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBfX2NwdWluaXQgaXVjdl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewpAQCAtNTY1LDcgKzU2NCw2IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGl1Y3ZfY3B1X25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gaXVjdl9jcHVfbm90aWZ5LAogfTsKLSNlbmRpZgogCiAvKioKICAqIGl1Y3Zfc2V2ZXJfcGF0aGlkCmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCAzNDUwMTkzLi5hOTk0NDQxIDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTM3OSw3ICszNzksNyBAQAogCQkgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNjY3LDcgKzM2NjcsNyBAQAogCQljb3BpZWQgPSBsZW47CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19pbnB1dC5jIGIvbmV0L2xsYy9sbGNfaW5wdXQuYwppbmRleCBiM2Y2NWQxLi4wOTllZDhmIDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19pbnB1dC5jCisrKyBiL25ldC9sbGMvbGxjX2lucHV0LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGxsY19sZW4pKSkKIAkJcmV0dXJuIDA7CiAKLQlza2ItPmgucmF3ICs9IGxsY19sZW47CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IGxsY19sZW47CiAJc2tiX3B1bGwoc2tiLCBsbGNfbGVuKTsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDJfMikpIHsKIAkJX19iZTE2IHBkdWxlbiA9IGV0aF9oZHIoc2tiKS0+aF9wcm90bzsKZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX291dHB1dC5jIGIvbmV0L2xsYy9sbGNfb3V0cHV0LmMKaW5kZXggZjQyOTFmMy4uNzU0ZjRmZSAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfb3V0cHV0LmMKKysrIGIvbmV0L2xsYy9sbGNfb3V0cHV0LmMKQEAgLTQxLDcgKzQxLDggQEAKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCQlzdHJ1Y3QgdHJoX2hkciAqdHJoOwogCi0JCXNrYi0+bWFjLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCp0cmgpKTsKKwkJc2tiX3B1c2goc2tiLCBzaXplb2YoKnRyaCkpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQl0cmggPSB0cl9oZHIoc2tiKTsKIAkJdHJoLT5hYyA9IEFDOwogCQl0cmgtPmZjID0gTExDX0ZSQU1FOwpAQCAtNTIsNyArNTMsNyBAQAogCQlpZiAoZGEpIHsKIAkJCW1lbWNweSh0cmgtPmRhZGRyLCBkYSwgZGV2LT5hZGRyX2xlbik7CiAJCQl0cl9zb3VyY2Vfcm91dGUoc2tiLCB0cmgsIGRldik7Ci0JCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTYyLDcgKzYzLDggQEAKIAkJdW5zaWduZWQgc2hvcnQgbGVuID0gc2tiLT5sZW47CiAJCXN0cnVjdCBldGhoZHIgKmV0aDsKIAotCQlza2ItPm1hYy5yYXcgPSBza2JfcHVzaChza2IsIHNpemVvZigqZXRoKSk7CisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpldGgpKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJZXRoID0gZXRoX2hkcihza2IpOwogCQlldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4pOwogCQltZW1jcHkoZXRoLT5oX2Rlc3QsIGRhLCBFVEhfQUxFTik7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19zYXAuYyBiL25ldC9sbGMvbGxjX3NhcC5jCmluZGV4IDI2MTVkYzguLjI1MjUxNjUgMTAwNjQ0Ci0tLSBhL25ldC9sbGMvbGxjX3NhcC5jCisrKyBiL25ldC9sbGMvbGxjX3NhcC5jCkBAIC0zNiwxMSArMzYsMTIgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDEyOCwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoc2tiKSB7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYl9yZXNlcnZlKHNrYiwgNTApOwotCQlza2ItPm5oLnJhdyAgID0gc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CiAJCXNrYi0+ZGV2ICAgICAgPSBkZXY7Ci0JCXNrYi0+bWFjLnJhdyAgPSBza2ItPmhlYWQ7CiAJCWlmIChzayAhPSBOVUxMKQogCQkJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCA1NDY5OGFmLi5jNTU4ZjMyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCkBAIC0yNSw2ICsyNSw3IEBACiAJICBhbmQgaXMgYWxzbyBzY2hlZHVsZWQgdG8gcmVwbGFjZSB0aGUgb2xkIHN5c2xvZy1iYXNlZCBpcHRfTE9HCiAJICBhbmQgaXA2dF9MT0cgbW9kdWxlcy4KIAorIyBSZW5hbWUgdGhpcyB0byBORl9DT05OVFJBQ0sgaW4gYSAyLjYuMjUKIGNvbmZpZyBORl9DT05OVFJBQ0tfRU5BQkxFRAogCXRyaXN0YXRlICJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IgogCWhlbHAKQEAgLTM5LDQyICs0MCw5IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jaG9pY2UKLQlwcm9tcHQgIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfRU5BQkxFRAotCi1jb25maWcgTkZfQ09OTlRSQUNLX1NVUFBPUlQKLQlib29sICJMYXllciAzIEluZGVwZW5kZW50IENvbm5lY3Rpb24gdHJhY2tpbmciCi0JaGVscAotCSAgTGF5ZXIgMyBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nIGlzIGV4cGVyaW1lbnRhbCBzY2hlbWUKLQkgIHdoaWNoIGdlbmVyYWxpemUgaXBfY29ubnRyYWNrIHRvIHN1cHBvcnQgb3RoZXIgbGF5ZXIgMyBwcm90b2NvbHMuCi0KLQkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKLQkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bwotCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKLQkgIGJlbG93KS4KLQotY29uZmlnIElQX05GX0NPTk5UUkFDS19TVVBQT1JUCi0JYm9vbCAiTGF5ZXIgMyBEZXBlbmRlbnQgQ29ubmVjdGlvbiB0cmFja2luZyAoT0JTT0xFVEUpIgotCWhlbHAKLQkgIFRoZSBvbGQsIExheWVyIDMgZGVwZW5kZW50IGlwX2Nvbm50cmFjayBzdWJzeXN0ZW0gb2YgbmV0ZmlsdGVyLgotCi0JICBUaGlzIGlzIHJlcXVpcmVkIHRvIGRvIE1hc3F1ZXJhZGluZyBvciBvdGhlciBraW5kcyBvZiBOZXR3b3JrCi0JICBBZGRyZXNzIFRyYW5zbGF0aW9uIChleGNlcHQgZm9yIEZhc3QgTkFUKS4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8KLQkgIGVuaGFuY2UgcGFja2V0IGZpbHRlcmluZyAoc2VlIGBDb25uZWN0aW9uIHN0YXRlIG1hdGNoIHN1cHBvcnQnCi0JICBiZWxvdykuCi0KLWVuZGNob2ljZQotCiBjb25maWcgTkZfQ09OTlRSQUNLCiAJdHJpc3RhdGUKLQlkZWZhdWx0IG0gaWYgTkZfQ09OTlRSQUNLX1NVUFBPUlQgJiYgTkZfQ09OTlRSQUNLX0VOQUJMRUQ9bQotCWRlZmF1bHQgeSBpZiBORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD15Ci0KLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0sKLQl0cmlzdGF0ZQotCWRlZmF1bHQgbSBpZiBJUF9ORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD1tCi0JZGVmYXVsdCB5IGlmIElQX05GX0NPTk5UUkFDS19TVVBQT1JUICYmIE5GX0NPTk5UUkFDS19FTkFCTEVEPXkKKwlkZWZhdWx0IE5GX0NPTk5UUkFDS19FTkFCTEVECiAKIGNvbmZpZyBORl9DVF9BQ0NUCiAJYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCkBAIC0zMDMsOSArMjcxLDggQEAKIAl0cmlzdGF0ZSAgJyJDT05OTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFIHx8IElQNl9ORl9NQU5HTEUKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKLQlzZWxlY3QgSVBfTkZfQ09OTlRSQUNLX01BUksgaWYgSVBfTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLIGlmIE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCisJc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBDT05OTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3Mgb25lIHRvIG1hbmlwdWxhdGUKIAkgIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUuICBTaW1pbGFyIHRvIHRoZSBNQVJLIHRhcmdldCwgYnV0CkBAIC0zNjYsNyArMzMzLDcgQEAKIAl0cmlzdGF0ZSAgJyJOT1RSQUNLIiB0YXJnZXQgc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBJUF9ORl9SQVcgfHwgSVA2X05GX1JBVwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJaGVscAogCSAgVGhlIE5PVFJBQ0sgdGFyZ2V0IGFsbG93cyBhIHNlbGVjdCBydWxlIHRvIHNwZWNpZnkKIAkgIHdoaWNoIHBhY2tldHMgKm5vdCogdG8gZW50ZXIgdGhlIGNvbm50cmFjay9OQVQKQEAgLTM4Nyw5ICszNTQsNyBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSwogCXRyaXN0YXRlICciQ09OTlNFQ01BUksiIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgXAotCQkgICAoKE5GX0NPTk5UUkFDSyAmJiBORl9DT05OVFJBQ0tfU0VDTUFSSykgfHwgXAotCQkgICAgKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfU0VDTUFSSykpCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfQ09OTlRSQUNLX1NFQ01BUksKIAloZWxwCiAJICBUaGUgQ09OTlNFQ01BUksgdGFyZ2V0IGNvcGllcyBzZWN1cml0eSBtYXJraW5ncyBmcm9tIHBhY2tldHMKIAkgIHRvIGNvbm5lY3Rpb25zLCBhbmQgcmVzdG9yZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBjb25uZWN0aW9ucwpAQCAtNDM3LDkgKzQwMiw4IEBACiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUwogCXRyaXN0YXRlICAnImNvbm5ieXRlcyIgcGVyLWNvbm5lY3Rpb24gY291bnRlciBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKLQlzZWxlY3QgSVBfTkZfQ1RfQUNDVCBpZiBJUF9ORl9DT05OVFJBQ0sKLQlzZWxlY3QgTkZfQ1RfQUNDVCBpZiBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSworCXNlbGVjdCBORl9DVF9BQ0NUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQogCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgpAQCAtNDUwLDkgKzQxNCw4IEBACiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLCiAJdHJpc3RhdGUgICciY29ubm1hcmsiIGNvbm5lY3Rpb24gbWFyayBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKLQlzZWxlY3QgSVBfTkZfQ09OTlRSQUNLX01BUksgaWYgSVBfTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLIGlmIE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCisJc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25ubWFyaycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlCiAJICBjb25uZWN0aW9uIG1hcmsgdmFsdWUgcHJldmlvdXNseSBzZXQgZm9yIHRoZSBzZXNzaW9uIGJ5IGBDT05OTUFSSycuIApAQCAtNDY0LDcgKzQyNyw3IEBACiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSwogCXRyaXN0YXRlICciY29ubnRyYWNrIiBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJaGVscAogCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCiAKQEAgLTUwOCw3ICs0NzEsNyBAQAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIKIAl0cmlzdGF0ZSAnImhlbHBlciIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAloZWxwCiAJICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKIAkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cApAQCAtNjMyLDcgKzU5NSw3IEBACiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1NUQVRFCiAJdHJpc3RhdGUgJyJzdGF0ZSIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAloZWxwCiAJICBDb25uZWN0aW9uIHN0YXRlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGVpcgogCSAgcmVsYXRpb25zaGlwIHRvIGEgdHJhY2tlZCBjb25uZWN0aW9uIChpZS4gcHJldmlvdXMgcGFja2V0cykuICBUaGlzCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCmluZGV4IGMzZWJkYmQuLmE4NDQ3OGUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCkBAIC01LDEwICs1LDYgQEAKICAqIHdheS4KICAqCiAgKiBSdXN0eSBSdXNzZWxsIChDKTIwMDAgLS0gVGhpcyBjb2RlIGlzIEdQTC4KLSAqCi0gKiBGZWJydWFyeSAyMDAwOiBNb2RpZmllZCBieSBKYW1lcyBNb3JyaXMgdG8gaGF2ZSAxIHF1ZXVlIHBlciBwcm90b2NvbC4KLSAqIDE1LU1hci0yMDAwOiAgIEFkZGVkIE5GX1JFUEVBVCAtLVJSLgotICogMDgtTWF5LTIwMDM6CSAgSW50ZXJuYWwgbG9nZ2luZyBpbnRlcmZhY2UgYWRkZWQgYnkgSm96c2VmIEthZGxlY3Npay4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgpAQCAtMjQ0LDYgKzI0MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3Byb3RvX2NzdW1fcmVwbGFjZTQpOwogCisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogLyogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZSwgYnV0IGxvY2FsbHkgZ2VuZXJhdGVkIGVycm9ycyBuZWVkIGl0IGlmIGNvbm5lY3Rpb24KICAgIHRyYWNraW5nIGluIHVzZTogd2l0aG91dCB0aGlzLCBjb25uZWN0aW9uIG1heSBub3QgYmUgaW4gaGFzaCB0YWJsZSwgYW5kIGhlbmNlCiAgICBtYW51ZmFjdHVyZWQgSUNNUCBvciBSU1QgcGFja2V0cyB3aWxsIG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggaXQuICovCkBAIC0yNjQsNiArMjYxLDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX2N0X2F0dGFjaCk7CiAKK3ZvaWQgKCpuZl9jdF9kZXN0cm95KShzdHJ1Y3QgbmZfY29ubnRyYWNrICopOworRVhQT1JUX1NZTUJPTChuZl9jdF9kZXN0cm95KTsKKwordm9pZCBuZl9jb25udHJhY2tfZGVzdHJveShzdHJ1Y3QgbmZfY29ubnRyYWNrICpuZmN0KQoreworCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgbmZfY29ubnRyYWNrICopOworCisJcmN1X3JlYWRfbG9jaygpOworCWRlc3Ryb3kgPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZGVzdHJveSk7CisJQlVHX09OKGRlc3Ryb3kgPT0gTlVMTCk7CisJZGVzdHJveShuZmN0KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2Rlc3Ryb3kpOworI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0sgKi8KKwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0X25ldGZpbHRlcjsKIEVYUE9SVF9TWU1CT0wocHJvY19uZXRfbmV0ZmlsdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCBiM2E3MGViLi5lMTMyYzhhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC05LDI0ICs5LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMjMgQXByIDIwMDE6IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgktIG5ldyBBUEkgYW5kIGhhbmRsaW5nIG9mIGNvbm50cmFjay9uYXQgaGVscGVycwotICoJLSBub3cgY2FwYWJsZSBvZiBtdWx0aXBsZSBleHBlY3RhdGlvbnMgZm9yIG9uZSBtYXN0ZXIKLSAqIDE2IEp1bCAyMDAyOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICoJLSBhZGQgdXNhZ2UvcmVmZXJlbmNlIGNvdW50cyB0byBpcF9jb25udHJhY2tfZXhwZWN0Ci0gKgktIGV4cG9ydCBpcF9jb25udHJhY2tbX2V4cGVjdF1fe2ZpbmRfZ2V0LHB1dH0gZnVuY3Rpb25zCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZ2VuZXJhbGl6ZSBMMyBwcm90b2NvbCBkZW5lbmRlbnQgcGFydC4KLSAqIDIzIE1hciAyMDA0OiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBhZGQgc3VwcG9ydCB2YXJpb3VzIHNpemUgb2YgY29ubnRyYWNrIHN0cnVjdHVyZXMuCi0gKiAyNiBKYW4gMjAwNjogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKiAJLSByZXN0cnVjdHVyZSBuZl9jb25uIChpbnRyb2R1Y2UgbmZfY29ubl9oZWxwKQotICogCS0gcmVkZXNpZ24gJ2ZlYXR1cmVzJyBob3cgdGhleSB3ZXJlIG9yaWdpbmFsbHkgaW50ZW5kZWQKLSAqIDI2IEZlYiAyMDA2OiBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AZXVyb2Rldi5uZXQ+Ci0gKiAJLSBhZGQgc3VwcG9ydCBmb3IgTDMgcHJvdG9jb2wgbW9kdWxlIGxvYWQgb24gZGVtYW5kLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTI4LDEwICsxMTAsMTEgQEAKIAkJCQkgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgcm5kKQogewogCXVuc2lnbmVkIGludCBhLCBiOwotCWEgPSBqaGFzaCgodm9pZCAqKXR1cGxlLT5zcmMudTMuYWxsLCBzaXplb2YodHVwbGUtPnNyYy51My5hbGwpLAotCQkgICgodHVwbGUtPnNyYy5sM251bSkgPDwgMTYpIHwgdHVwbGUtPmRzdC5wcm90b251bSk7Ci0JYiA9IGpoYXNoKCh2b2lkICopdHVwbGUtPmRzdC51My5hbGwsIHNpemVvZih0dXBsZS0+ZHN0LnUzLmFsbCksCi0JCQkodHVwbGUtPnNyYy51LmFsbCA8PCAxNikgfCB0dXBsZS0+ZHN0LnUuYWxsKTsKKworCWEgPSBqaGFzaDIodHVwbGUtPnNyYy51My5hbGwsIEFSUkFZX1NJWkUodHVwbGUtPnNyYy51My5hbGwpLAorCQkgICAodHVwbGUtPnNyYy5sM251bSA8PCAxNikgfCB0dXBsZS0+ZHN0LnByb3RvbnVtKTsKKwliID0gamhhc2gyKHR1cGxlLT5kc3QudTMuYWxsLCBBUlJBWV9TSVpFKHR1cGxlLT5kc3QudTMuYWxsKSwKKwkJICAgKHR1cGxlLT5zcmMudS5hbGwgPDwgMTYpIHwgdHVwbGUtPmRzdC51LmFsbCk7CiAKIAlyZXR1cm4gamhhc2hfMndvcmRzKGEsIGIsIHJuZCkgJSBzaXplOwogfQpAQCAtNjMzLDEzICs2MTYsMTEgQEAKIAltZW1zZXQoY29ubnRyYWNrLCAwLCBuZl9jdF9jYWNoZVtmZWF0dXJlc10uc2l6ZSk7CiAJY29ubnRyYWNrLT5mZWF0dXJlcyA9IGZlYXR1cmVzOwogCWF0b21pY19zZXQoJmNvbm50cmFjay0+Y3RfZ2VuZXJhbC51c2UsIDEpOwotCWNvbm50cmFjay0+Y3RfZ2VuZXJhbC5kZXN0cm95ID0gZGVzdHJveV9jb25udHJhY2s7CiAJY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSA9ICpvcmlnOwogCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUgPSAqcmVwbDsKIAkvKiBEb24ndCBzZXQgdGltZXIgeWV0OiB3YWl0IGZvciBjb25maXJtYXRpb24gKi8KLQlpbml0X3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQpOwotCWNvbm50cmFjay0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY29ubnRyYWNrOwotCWNvbm50cmFjay0+dGltZW91dC5mdW5jdGlvbiA9IGRlYXRoX2J5X3RpbWVvdXQ7CisJc2V0dXBfdGltZXIoJmNvbm50cmFjay0+dGltZW91dCwgZGVhdGhfYnlfdGltZW91dCwKKwkJICAgICh1bnNpZ25lZCBsb25nKWNvbm50cmFjayk7CiAJcmVhZF91bmxvY2tfYmgoJm5mX2N0X2NhY2hlX2xvY2spOwogCiAJcmV0dXJuIGNvbm50cmFjazsKQEAgLTc2OCw3ICs3NDksNyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAKLQlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsICh1bnNpZ25lZCBpbnQpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKSwKKwlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAogCQkJICAgICBkYXRhb2ZmLCBsM251bSwgcHJvdG9udW0sICZ0dXBsZSwgbDNwcm90bywKIAkJCSAgICAgbDRwcm90bykpIHsKIAkJREVCVUdQKCJyZXNvbHZlX25vcm1hbF9jdDogQ2FuJ3QgZ2V0IHR1cGxlXG4iKTsKQEAgLTk2MCw3ICs5NDEsNyBAQAogCWlmIChkb19hY2N0KSB7CiAJCWN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMrKzsKIAkJY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMgKz0KLQkJCXNrYi0+bGVuIC0gKHVuc2lnbmVkIGludCkoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCQkJc2tiLT5sZW4gLSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAogCQlpZiAoKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMgJiAweDgwMDAwMDAwKQogCQkgICAgfHwgKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICYgMHg4MDAwMDAwMCkpCkBAIC0xMTQwLDYgKzExMjEsOCBAQAogCXdoaWxlIChhdG9taWNfcmVhZCgmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsLnVzZSkgPiAxKQogCQlzY2hlZHVsZSgpOwogCisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2Rlc3Ryb3ksIE5VTEwpOworCiAJZm9yIChpID0gMDsgaSA8IE5GX0NUX0ZfTlVNOyBpKyspIHsKIAkJaWYgKG5mX2N0X2NhY2hlW2ldLnVzZSA9PSAwKQogCQkJY29udGludWU7CkBAIC0xMTUyLDE0ICsxMTM1LDcgQEAKIAlmcmVlX2Nvbm50cmFja19oYXNoKG5mX2Nvbm50cmFja19oYXNoLCBuZl9jb25udHJhY2tfdm1hbGxvYywKIAkJCSAgICBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOwogCi0JbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7Ci0KLQkvKiBmcmVlIGwzcHJvdG8gcHJvdG9jb2wgdGFibGVzICovCi0JZm9yIChpID0gMDsgaSA8IFBGX01BWDsgaSsrKQotCQlpZiAobmZfY3RfcHJvdG9zW2ldKSB7Ci0JCQlrZnJlZShuZl9jdF9wcm90b3NbaV0pOwotCQkJbmZfY3RfcHJvdG9zW2ldID0gTlVMTDsKLQkJfQorCW5mX2Nvbm50cmFja19wcm90b19maW5pKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICphbGxvY19oYXNodGFibGUoaW50IHNpemUsIGludCAqdm1hbGxvY2VkKQpAQCAtMTIzNyw3ICsxMjEzLDYgQEAKIAogaW50IF9faW5pdCBuZl9jb25udHJhY2tfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAKIAkvKiBJZGVhIGZyb20gdGNwLmM6IHVzZSAxLzE2Mzg0IG9mIG1lbW9yeS4gIE9uIGkzODY6IDMyTUIKQEAgLTEyNzksMTggKzEyNTQsMTMgQEAKIAkJZ290byBlcnJfZnJlZV9jb25udHJhY2tfc2xhYjsKIAl9CiAKLQlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7CisJcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9leHBlY3Rfc2xhYjsKIAotCS8qIERvbid0IE5FRUQgbG9jayBoZXJlLCBidXQgZ29vZCBmb3JtIGFueXdheS4gKi8KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IEFGX01BWDsgaSsrKQotCQluZl9jdF9sM3Byb3Rvc1tpXSA9ICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCiAJLyogRm9yIHVzZSBieSBSRUpFQ1QgdGFyZ2V0ICovCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X2F0dGFjaCwgX19uZl9jb25udHJhY2tfYXR0YWNoKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfZGVzdHJveSwgZGVzdHJveV9jb25udHJhY2spOwogCiAJLyogU2V0IHVwIGZha2UgY29ubnRyYWNrOgogCSAgICAtIHRvIG5ldmVyIGJlIGRlbGV0ZWQsIG5vdCBpbiBhbnkgaGFzaGVzICovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCmluZGV4IDFhMjIzZTAuLjZiZDQyMWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC05MSwzICs5MSwyNiBAQAogCX0KIH0KIAoraW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKTsKKworaW50IG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKTsKKworaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKTsKKworaW50IG5mX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggY2U3MGE2Zi4uYzMxYWYyOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTI5MCw5ICsyOTAsNyBAQAogCW1hc3Rlcl9oZWxwLT5leHBlY3RpbmcrKzsKIAlsaXN0X2FkZCgmZXhwLT5saXN0LCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKIAotCWluaXRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0JZXhwLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylleHA7Ci0JZXhwLT50aW1lb3V0LmZ1bmN0aW9uID0gZXhwZWN0YXRpb25fdGltZWRfb3V0OworCXNldHVwX3RpbWVyKCZleHAtPnRpbWVvdXQsIGV4cGVjdGF0aW9uX3RpbWVkX291dCwgKHVuc2lnbmVkIGxvbmcpZXhwKTsKIAlleHAtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBtYXN0ZXJfaGVscC0+aGVscGVyLT50aW1lb3V0ICogSFo7CiAJYWRkX3RpbWVyKCZleHAtPnRpbWVvdXQpOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDMwODlkZmMuLmExODY3OTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC03LDEyICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGVuYWJsZSB3b3JraW5nIHdpdGggTGF5ZXIgMyBwcm90b2NvbCBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLgotICoJLSB0cmFjayBFUFJUIGFuZCBFUFNWIGNvbW1hbmRzIHdpdGggSVB2NiBhZGRyZXNzLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jCmluZGV4IGJiMjZhNjUuLjEwOTM0NzggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkJc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKCpwc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OwogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKIAlfX2JlMzIgbWFzayA9IDA7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggNDhmMDUzMS4uYWExYTk3ZWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKQEAgLTYsOSArNiw2IEBACiAgKiAoQykgMjAwMyBieSBQYXRyaWNrIE1jaGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KICAqIChDKSAyMDA1LTIwMDYgYnkgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PgogICoKLSAqIEkndmUgcmV3b3JrZWQgdGhpcyBzdHVmZiB0byB1c2UgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGNvbm50cmFjawotICogc3RydWN0dXJlcy4gNS40NCBhbS4gSSBuZWVkIG1vcmUgdGVhLiAtLXBhYmxvIDA1LzA3LzExLgotICoKICAqIEluaXRpYWwgY29ubmVjdGlvbiB0cmFja2luZyB2aWEgbmV0bGluayBkZXZlbG9wbWVudCBmdW5kZWQgYW5kCiAgKiBnZW5lcmFsbHkgbWFkZSBwb3NzaWJsZSBieSBOZXR3b3JrIFJvYm90cywgSW5jLiAod3d3Lm5ldHdvcmtyb2JvdHMuY29tKQogICoKQEAgLTE2LDggKzEzLDYgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCiAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotICoKLSAqIERlcml2ZWQgZnJvbSBpcF9jb25udHJhY2tfbmV0bGluay5jOiBQb3J0IGJ5IFBhYmxvIE5laXJhIEF5dXNvICgwNS8xMS8xNCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzMsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgpAQCAtMjY4LDkgKzI2NCw3IEBACiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKIAlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0KLQliID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlldmVudCB8PSBORk5MX1NVQlNZU19DVE5FVExJTksgPDwgODsKIAlubGggICAgPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKQEAgLTMwMywxMiArMjk3LDEyIEBACiAJICAgIGN0bmV0bGlua19kdW1wX3VzZShza2IsIGN0KSA8IDApCiAJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogbmxtc2dfZmFpbHVyZToKIG5mYXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMzIyLDcgKzMxNiw3IEBACiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopcHRyOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgaW50IHR5cGU7Ci0JdW5zaWduZWQgY2hhciAqYjsKKwlza19idWZmX2RhdGFfdCBiOwogCXVuc2lnbmVkIGludCBmbGFncyA9IDAsIGdyb3VwOwogCiAJLyogaWdub3JlIG91ciBmYWtlIGNvbm50cmFjayBlbnRyeSAqLwpAQCAtNjYyLDcgKzY1Niw3IEBACiAKIHN0YXRpYyBpbnQKIGN0bmV0bGlua19kZWxfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CkBAIC03MTAsNyArNzA0LDcgQEAKIAogc3RhdGljIGludAogY3RuZXRsaW5rX2dldF9jb25udHJhY2soc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKKwkJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKQEAgLTcyMSwyMiArNzE1LDEyIEBACiAJaW50IGVyciA9IDA7CiAKIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKLQkJdTMyIHJsZW47Ci0KICNpZm5kZWYgQ09ORklHX05GX0NUX0FDQ1QKIAkJaWYgKE5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKSA9PSBJUENUTkxfTVNHX0NUX0dFVF9DVFJaRVJPKQogCQkJcmV0dXJuIC1FTk9UU1VQUDsKICNlbmRpZgotCQlpZiAoKCplcnJwID0gbmV0bGlua19kdW1wX3N0YXJ0KGN0bmwsIHNrYiwgbmxoLAotCQkJCQkJY3RuZXRsaW5rX2R1bXBfdGFibGUsCi0JCQkJCQljdG5ldGxpbmtfZG9uZSkpICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwotCQlpZiAocmxlbiA+IHNrYi0+bGVuKQotCQkJcmxlbiA9IHNrYi0+bGVuOwotCQlza2JfcHVsbChza2IsIHJsZW4pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwgY3RuZXRsaW5rX2R1bXBfdGFibGUsCisJCQkJCSAgY3RuZXRsaW5rX2RvbmUpOwogCX0KIAogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKQEAgLTEwMTAsNyArOTk0LDcgQEAKIAogc3RhdGljIGludAogY3RuZXRsaW5rX25ld19jb25udHJhY2soc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKKwkJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIG90dXBsZSwgcnR1cGxlOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaCA9IE5VTEw7CkBAIC0xMTUyLDkgKzExMzYsNyBAQAogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7Ci0JdW5zaWduZWQgY2hhciAqYjsKLQotCWIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCWV2ZW50IHw9IE5GTkxfU1VCU1lTX0NUTkVUTElOS19FWFAgPDwgODsKIAlubGggICAgPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKQEAgLTExNjgsMTIgKzExNTAsMTIgQEAKIAlpZiAoY3RuZXRsaW5rX2V4cF9kdW1wX2V4cGVjdChza2IsIGV4cCkgPCAwKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBuZmF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTExODYsNyArMTE2OCw3IEBACiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqKXB0cjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGludCB0eXBlOwotCXVuc2lnbmVkIGNoYXIgKmI7CisJc2tfYnVmZl9kYXRhX3QgYjsKIAlpbnQgZmxhZ3MgPSAwOwogCiAJaWYgKGV2ZW50cyAmIElQRVhQX05FVykgewpAQCAtMTI2Myw3ICsxMjQ1LDcgQEAKIAogc3RhdGljIGludAogY3RuZXRsaW5rX2dldF9leHBlY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCisJCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQogewogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKQEAgLTEyNzYsMTcgKzEyNTgsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewotCQl1MzIgcmxlbjsKLQotCQlpZiAoKCplcnJwID0gbmV0bGlua19kdW1wX3N0YXJ0KGN0bmwsIHNrYiwgbmxoLAotCQkJCQkJY3RuZXRsaW5rX2V4cF9kdW1wX3RhYmxlLAotCQkJCQkJY3RuZXRsaW5rX2RvbmUpKSAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJsZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7Ci0JCWlmIChybGVuID4gc2tiLT5sZW4pCi0JCQlybGVuID0gc2tiLT5sZW47Ci0JCXNrYl9wdWxsKHNrYiwgcmxlbik7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGN0bmwsIHNrYiwgbmxoLAorCQkJCQkgIGN0bmV0bGlua19leHBfZHVtcF90YWJsZSwKKwkJCQkJICBjdG5ldGxpbmtfZG9uZSk7CiAJfQogCiAJaWYgKGNkYVtDVEFfRVhQRUNUX01BU1RFUi0xXSkKQEAgLTEzMzMsNyArMTMwNyw3IEBACiAKIHN0YXRpYyBpbnQKIGN0bmV0bGlua19kZWxfZXhwZWN0KHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSwgaW50ICplcnJwKQorCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqdG1wOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CkBAIC0xNDY3LDcgKzE0NDEsNyBAQAogCiBzdGF0aWMgaW50CiBjdG5ldGxpbmtfbmV3X2V4cGVjdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKKwkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKaW5kZXggNDU2MTU1Zi4uNmQ5NDcwNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCkBAIC0yOCwxMyArMjgsMTMgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipuZl9jdF9wcm90b3NbUEZfTUFYXSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKm5mX2N0X3Byb3Rvc1tQRl9NQVhdIF9fcmVhZF9tb3N0bHk7CiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKm5mX2N0X2wzcHJvdG9zW0FGX01BWF0gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2wzcHJvdG9zKTsKIAotI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBERUZJTkVfTVVURVgobmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgobmZfY3RfcHJvdG9fbXV0ZXgpOwogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludAogbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICoqaGVhZGVyLCBzdHJ1Y3QgY3RsX3RhYmxlICpwYXRoLAogCQkgICAgICBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgdW5zaWduZWQgaW50ICp1c2VycykKQEAgLTE2NCwxMyArMTY0LDExIEBACiAJaW50IGVyciA9IDA7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKIAlpZiAobDNwcm90by0+Y3RsX3RhYmxlICE9IE5VTEwpIHsKIAkJZXJyID0gbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKCZsM3Byb3RvLT5jdGxfdGFibGVfaGVhZGVyLAogCQkJCQkgICAgbDNwcm90by0+Y3RsX3RhYmxlX3BhdGgsCiAJCQkJCSAgICBsM3Byb3RvLT5jdGxfdGFibGUsIE5VTEwpOwogCX0KLQltdXRleF91bmxvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CiAjZW5kaWYKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTc4LDExICsxNzYsOSBAQAogc3RhdGljIHZvaWQgbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCiB7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CiAJaWYgKGwzcHJvdG8tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKIAkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJmwzcHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCiAJCQkJCWwzcHJvdG8tPmN0bF90YWJsZSwgTlVMTCk7Ci0JbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogI2VuZGlmCiB9CiAKQEAgLTE5MCwyNyArMTg2LDIzIEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAocHJvdG8tPmwzcHJvdG8gPj0gQUZfTUFYKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChwcm90by0+bDNwcm90byA+PSBBRl9NQVgpCisJCXJldHVybiAtRUJVU1k7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOwogCWlmIChuZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10gIT0gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10sIHByb3RvKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAogCXJldCA9IG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXJfc3lzY3RsKHByb3RvKTsKIAlpZiAocmV0IDwgMCkKLQkJbmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3Rlcihwcm90byk7Ci0JcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSwgcHJvdG8pOwogCiBvdXRfdW5sb2NrOgotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotb3V0OgorCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDNwcm90b19yZWdpc3Rlcik7CkBAIC0yMTksMTQgKzIxMSwxNCBAQAogewogCUJVR19PTihwcm90by0+bDNwcm90byA+PSBBRl9NQVgpOwogCi0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKIAlCVUdfT04obmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dICE9IHByb3RvKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dLAogCQkJICAgJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMpOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCXN5bmNocm9uaXplX3JjdSgpOwotCiAJbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChwcm90byk7CisJbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19tdXRleCk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLwogCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2wzcHJvdG8sIHByb3RvKTsKQEAgLTIzOCw3ICsyMzAsNiBAQAogCWludCBlcnIgPSAwOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CiAJaWYgKGw0cHJvdG8tPmN0bF90YWJsZSAhPSBOVUxMKSB7CiAJCWVyciA9IG5mX2N0X3JlZ2lzdGVyX3N5c2N0bChsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyLAogCQkJCQkgICAgbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwKQEAgLTI2MCw3ICsyNTEsNiBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAlyZXR1cm4gZXJyOwogfQpAQCAtMjY4LDcgKzI1OCw2IEBACiBzdGF0aWMgdm9pZCBuZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKIHsKICNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKIAlpZiAobDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciAhPSBOVUxMICYmCiAJICAgICpsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyICE9IE5VTEwpCiAJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCkBAIC0yNzksNyArMjY4LDYgQEAKIAkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJmw0cHJvdG8tPmN0bF9jb21wYXRfdGFibGVfaGVhZGVyLAogCQkJCQlsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlLCBOVUxMKTsKICNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCi0JbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIH0KIApAQCAtMjg5LDY4ICsyNzcsNDEgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChsNHByb3RvLT5sM3Byb3RvID49IFBGX01BWCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAobDRwcm90by0+bDNwcm90byA+PSBQRl9NQVgpCisJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAobDRwcm90byA9PSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYykKLQkJcmV0dXJuIG5mX2N0X2w0cHJvdG9fcmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOwotCi1yZXRyeToKLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSkgewotCQlpZiAobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dCi0JCQkJIT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCX0gZWxzZSB7CisJbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOworCWlmICghbmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dKSB7CiAJCS8qIGwzcHJvdG8gbWF5IGJlIGxvYWRlZCBsYXR0ZXIuICovCiAJCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKnByb3RvX2FycmF5OwogCQlpbnQgaTsKIAotCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCQlwcm90b19hcnJheSA9IChzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKiopCi0JCQkJa21hbGxvYyhNQVhfTkZfQ1RfUFJPVE8gKgotCQkJCQkgc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKSwKLQkJCQkJR0ZQX0tFUk5FTCk7CisJCXByb3RvX2FycmF5ID0ga21hbGxvYyhNQVhfTkZfQ1RfUFJPVE8gKgorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKiksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmIChwcm90b19hcnJheSA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KKwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05GX0NUX1BST1RPOyBpKyspCiAJCQlwcm90b19hcnJheVtpXSA9ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljOwotCi0JCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSkgewotCQkJLyogYmFkIHRpbWluZywgYnV0IG5vIHByb2JsZW0gKi8KLQkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQkJa2ZyZWUocHJvdG9fYXJyYXkpOwotCQl9IGVsc2UgewotCQkJbmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dID0gcHJvdG9fYXJyYXk7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJfQotCi0JCS8qCi0JCSAqIEp1c3Qgb25jZSBiZWNhdXNlIGFycmF5IGlzIG5ldmVyIGZyZWVkIHVudGlsIHVubG9hZGluZwotCQkgKiBuZl9jb25udHJhY2sua28KLQkJICovCi0JCWdvdG8gcmV0cnk7CisJCW5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSA9IHByb3RvX2FycmF5OworCX0gZWxzZSBpZiAobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dICE9CisJCQkJCSZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10sIGw0cHJvdG8pOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCiAJcmV0ID0gbmZfY3RfbDRwcm90b19yZWdpc3Rlcl9zeXNjdGwobDRwcm90byk7CiAJaWYgKHJldCA8IDApCi0JCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIobDRwcm90byk7Ci0JcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXSwKKwkJCSAgIGw0cHJvdG8pOwogCiBvdXRfdW5sb2NrOgotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotb3V0OgorCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3Rlcik7CkBAIC0zNTksMjEgKzMyMCw0MiBAQAogewogCUJVR19PTihsNHByb3RvLT5sM3Byb3RvID49IFBGX01BWCk7CiAKLQlpZiAobDRwcm90byA9PSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYykgewotCQluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOwotCQlyZXR1cm47Ci0JfQotCi0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKIAlCVUdfT04obmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dICE9IGw0cHJvdG8pOwogCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10sCiAJCQkgICAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0KIAluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOworCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOworCisJc3luY2hyb25pemVfcmN1KCk7CiAKIAkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KIAluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9sNHByb3RvLCBsNHByb3RvKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIpOworCitpbnQgbmZfY29ubnRyYWNrX3Byb3RvX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJZXJyID0gbmZfY3RfbDRwcm90b19yZWdpc3Rlcl9zeXNjdGwoJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFGX01BWDsgaSsrKQorCQlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfbDNwcm90b3NbaV0sCisJCQkJICAgJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMpOworCXJldHVybiAwOworfQorCit2b2lkIG5mX2Nvbm50cmFja19wcm90b19maW5pKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKCZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKTsKKworCS8qIGZyZWUgbDNwcm90byBwcm90b2NvbCB0YWJsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUEZfTUFYOyBpKyspCisJCWtmcmVlKG5mX2N0X3Byb3Rvc1tpXSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKaW5kZXggN2MwNjk5My4uNmZhZjFiZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwpAQCAtNCwxMSArNCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE2IERlYyAyMDAzOiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBlbmFibGUgd29ya2luZyB3aXRoIEwzIHByb3RvY29sIGluZGVwZW5kZW50IGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKaW5kZXggM2M4MDU1OC4uMGQzMjU0YiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYwpAQCAtNywxNSArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE3IE9jdCAyMDA0OiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBlbmFibGUgd29ya2luZyB3aXRoIEwzIHByb3RvY29sIGluZGVwZW5kZW50IGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L2lwX2Nvbm50cmFja19zY3RwLmMKLSAqLwotCi0vKgotICogQWRkZWQgc3VwcG9ydCBmb3IgcHJvYyBtYW5pcHVsYXRpb24gb2YgdGltZW91dHMuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDE1M2Q2NjEuLmNjZGQ1ZDIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC00LDI0ICs0LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PjoKLSAqCS0gUmVhbCBzdGF0ZWZ1bCBjb25uZWN0aW9uIHRyYWNraW5nCi0gKgktIE1vZGlmaWVkIHN0YXRlIHRyYW5zaXRpb25zIHRhYmxlCi0gKgktIFdpbmRvdyBzY2FsaW5nIHN1cHBvcnQgYWRkZWQKLSAqCS0gU0FDSyBzdXBwb3J0IGFkZGVkCi0gKgotICogV2lsbHkgVGFycmVhdToKLSAqCS0gU3RhdGUgdGFibGUgYnVnZml4ZXMKLSAqCS0gTW9yZSByb2J1c3Qgc3RhdGUgY2hhbmdlcwotICoJLSBUdW5pbmcgdGltZXIgcGFyYW1ldGVycwotICoKLSAqIDI3IE9jdCAyMDA0OiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBnZW5lbGl6ZWQgTGF5ZXIgMyBwcm90b2NvbCBwYXJ0LgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCi0gKgotICogdmVyc2lvbiAyLjIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ3MCwxMSArNDUyLDEwIEBACiAKIAkvKiBGYXN0IHBhdGggZm9yIHRpbWVzdGFtcC1vbmx5IG9wdGlvbiAqLwogCWlmIChsZW5ndGggPT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRCo0Ci0JICAgICYmICooX19iZTMyICopcHRyID09Ci0JCV9fY29uc3RhbnRfaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpCi0JCQkJIHwgKFRDUE9QVF9OT1AgPDwgMTYpCi0JCQkJIHwgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkKLQkJCQkgfCBUQ1BPTEVOX1RJTUVTVEFNUCkpCisJICAgICYmICooX19iZTMyICopcHRyID09IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KQorCQkJCSAgICAgICB8IChUQ1BPUFRfTk9QIDw8IDE2KQorCQkJCSAgICAgICB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpCisJCQkJICAgICAgIHwgVENQT0xFTl9USU1FU1RBTVApKQogCQlyZXR1cm47CiAKIAl3aGlsZSAobGVuZ3RoID4gMCkgewpAQCAtNzY1LDI2ICs3NDYsMTggQEAKICNkZWZpbmUJVEhfRUNFCTB4NDAKICNkZWZpbmUJVEhfQ1dSCTB4ODAKIAotLyogdGFibGUgb2YgdmFsaWQgZmxhZyBjb21iaW5hdGlvbnMgLSBFQ0UgYW5kIENXUiBhcmUgYWx3YXlzIHZhbGlkICovCi1zdGF0aWMgdTggdGNwX3ZhbGlkX2ZsYWdzWyhUSF9GSU58VEhfU1lOfFRIX1JTVHxUSF9QVVNIfFRIX0FDS3xUSF9VUkcpICsgMV0gPQorLyogdGFibGUgb2YgdmFsaWQgZmxhZyBjb21iaW5hdGlvbnMgLSBQVVNILCBFQ0UgYW5kIENXUiBhcmUgYWx3YXlzIHZhbGlkICovCitzdGF0aWMgdTggdGNwX3ZhbGlkX2ZsYWdzWyhUSF9GSU58VEhfU1lOfFRIX1JTVHxUSF9BQ0t8VEhfVVJHKSArIDFdID0KIHsKIAlbVEhfU1lOXQkJCT0gMSwKLQlbVEhfU1lOfFRIX1BVU0hdCQk9IDEsCiAJW1RIX1NZTnxUSF9VUkddCQkJPSAxLAotCVtUSF9TWU58VEhfUFVTSHxUSF9VUkddCQk9IDEsCiAJW1RIX1NZTnxUSF9BQ0tdCQkJPSAxLAotCVtUSF9TWU58VEhfQUNLfFRIX1BVU0hdCQk9IDEsCiAJW1RIX1JTVF0JCQk9IDEsCiAJW1RIX1JTVHxUSF9BQ0tdCQkJPSAxLAotCVtUSF9SU1R8VEhfQUNLfFRIX1BVU0hdCQk9IDEsCiAJW1RIX0ZJTnxUSF9BQ0tdCQkJPSAxLAotCVtUSF9BQ0tdCQkJPSAxLAotCVtUSF9BQ0t8VEhfUFVTSF0JCT0gMSwKLQlbVEhfQUNLfFRIX1VSR10JCQk9IDEsCi0JW1RIX0FDS3xUSF9VUkd8VEhfUFVTSF0JCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAogCVtUSF9GSU58VEhfQUNLfFRIX1VSR10JCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9VUkd8VEhfUFVTSF0JPSAxLAorCVtUSF9BQ0tdCQkJPSAxLAorCVtUSF9BQ0t8VEhfVVJHXQkJCT0gMSwKIH07CiAKIC8qIFByb3RlY3QgY29ubnRyYWNrIGFnYWlzdCBicm9rZW4gcGFja2V0cy4gQ29kZSB0YWtlbiBmcm9tIGlwdF91bmNsZWFuLmMuICAqLwpAQCAtODMxLDcgKzgwNCw3IEBACiAJfQogCiAJLyogQ2hlY2sgVENQIGZsYWdzLiAqLwotCXRjcGZsYWdzID0gKCgodV9pbnQ4X3QgKil0aClbMTNdICYgfihUSF9FQ0V8VEhfQ1dSKSk7CisJdGNwZmxhZ3MgPSAoKCh1X2ludDhfdCAqKXRoKVsxM10gJiB+KFRIX0VDRXxUSF9DV1J8VEhfUFVTSCkpOwogCWlmICghdGNwX3ZhbGlkX2ZsYWdzW3RjcGZsYWdzXSkgewogCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLApAQCAtMTExMCwxMSArMTA4MywyNiBAQAogCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zOworCXN0cnVjdCBuZl9jdF90Y3BfZmxhZ3MgdG1wID0ge307CiAKIAlyZWFkX2xvY2tfYmgoJnRjcF9sb2NrKTsKIAluZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfUFJPVE9JTkZPX1RDUCk7CiAJTkZBX1BVVChza2IsIENUQV9QUk9UT0lORk9fVENQX1NUQVRFLCBzaXplb2YodV9pbnQ4X3QpLAogCQkmY3QtPnByb3RvLnRjcC5zdGF0ZSk7CisKKwlORkFfUFVUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX09SSUdJTkFMLCBzaXplb2YodV9pbnQ4X3QpLAorCQkmY3QtPnByb3RvLnRjcC5zZWVuWzBdLnRkX3NjYWxlKTsKKworCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFksIHNpemVvZih1X2ludDhfdCksCisJCSZjdC0+cHJvdG8udGNwLnNlZW5bMV0udGRfc2NhbGUpOworCisJdG1wLmZsYWdzID0gY3QtPnByb3RvLnRjcC5zZWVuWzBdLmZsYWdzOworCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19PUklHSU5BTCwKKwkJc2l6ZW9mKHN0cnVjdCBuZl9jdF90Y3BfZmxhZ3MpLCAmdG1wKTsKKworCXRtcC5mbGFncyA9IGN0LT5wcm90by50Y3Auc2VlblsxXS5mbGFnczsKKwlORkFfUFVUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFksCisJCXNpemVvZihzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzKSwgJnRtcCk7CiAJcmVhZF91bmxvY2tfYmgoJnRjcF9sb2NrKTsKIAogCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwpAQCAtMTEyNyw3ICsxMTE1LDExIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzaXplX3QgY3RhX21pbl90Y3BbQ1RBX1BST1RPSU5GT19UQ1BfTUFYXSA9IHsKLQlbQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUtMV0JPSBzaXplb2YodV9pbnQ4X3QpLAorCVtDVEFfUFJPVE9JTkZPX1RDUF9TVEFURS0xXQkgICAgICA9IHNpemVvZih1X2ludDhfdCksCisJW0NUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTC0xXSA9IHNpemVvZih1X2ludDhfdCksCisJW0NUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9SRVBMWS0xXSAgICA9IHNpemVvZih1X2ludDhfdCksCisJW0NUQV9QUk9UT0lORk9fVENQX0ZMQUdTX09SSUdJTkFMLTFdICA9IHNpemVvZihzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzKSwKKwlbQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFktMV0gICAgID0gc2l6ZW9mKHN0cnVjdCBuZl9jdF90Y3BfZmxhZ3MpCiB9OwogCiBzdGF0aWMgaW50IG5mYXR0cl90b190Y3Aoc3RydWN0IG5mYXR0ciAqY2RhW10sIHN0cnVjdCBuZl9jb25uICpjdCkKQEAgLTExNTEsNiArMTE0MywzMCBAQAogCXdyaXRlX2xvY2tfYmgoJnRjcF9sb2NrKTsKIAljdC0+cHJvdG8udGNwLnN0YXRlID0KIAkJKih1X2ludDhfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT0lORk9fVENQX1NUQVRFLTFdKTsKKworCWlmICh0YltDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19PUklHSU5BTC0xXSkgeworCQlzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzICphdHRyID0KKwkJCU5GQV9EQVRBKHRiW0NUQV9QUk9UT0lORk9fVENQX0ZMQUdTX09SSUdJTkFMLTFdKTsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzBdLmZsYWdzICY9IH5hdHRyLT5tYXNrOworCQljdC0+cHJvdG8udGNwLnNlZW5bMF0uZmxhZ3MgfD0gYXR0ci0+ZmxhZ3MgJiBhdHRyLT5tYXNrOworCX0KKworCWlmICh0YltDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19SRVBMWS0xXSkgeworCQlzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzICphdHRyID0KKwkJCU5GQV9EQVRBKHRiW0NUQV9QUk9UT0lORk9fVENQX0ZMQUdTX1JFUExZLTFdKTsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzICY9IH5hdHRyLT5tYXNrOworCQljdC0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgfD0gYXR0ci0+ZmxhZ3MgJiBhdHRyLT5tYXNrOworCX0KKworCWlmICh0YltDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfT1JJR0lOQUwtMV0gJiYKKwkgICAgdGJbQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX1JFUExZLTFdICYmCisJICAgIGN0LT5wcm90by50Y3Auc2VlblswXS5mbGFncyAmIElQX0NUX1RDUF9GTEFHX1dJTkRPV19TQ0FMRSAmJgorCSAgICBjdC0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEUpIHsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzBdLnRkX3NjYWxlID0gKih1X2ludDhfdCAqKQorCQkJTkZBX0RBVEEodGJbQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX09SSUdJTkFMLTFdKTsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzFdLnRkX3NjYWxlID0gKih1X2ludDhfdCAqKQorCQkJTkZBX0RBVEEodGJbQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX1JFUExZLTFdKTsKKwl9CiAJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKaW5kZXggYTVlNTcyNi4uMzYyMGVjYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKQEAgLTQsMTEgKzQsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZW5hYmxlIHdvcmtpbmcgd2l0aCBMYXllciAzIHByb3RvY29sIGluZGVwZW5kZW50IGNvbm5lY3Rpb24gdHJhY2tpbmcuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCBiODU4NjM2Li40NWJhZWIwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0xLDIwICsxLDkgQEAKLS8qIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgdGhlIHN0YW5kYWxvbmUKLSAgIG5mX2Nvbm50cmFjayBtb2R1bGUuCi0KLSAgIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIuCi0qLwotCiAvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCiAgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZ2VuZXJhbGl6ZSBMMyBwcm90b2NvbCBkZXBlbmRlbnQgcGFydC4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCmluZGV4IGJmMjNlNDguLjg3OTdlNjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAoQykgMjAwMSBieSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPiwKICAqIChDKSAyMDAyLTIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIChDKSAyMDA1IGJ5IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KKyAqIChDKSAyMDA1LDIwMDcgYnkgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CiAgKgogICogSW5pdGlhbCBuZXRmaWx0ZXIgbWVzc2FnZXMgdmlhIG5ldGxpbmsgZGV2ZWxvcG1lbnQgZnVuZGVkIGFuZAogICogZ2VuZXJhbGx5IG1hZGUgcG9zc2libGUgYnkgTmV0d29yayBSb2JvdHMsIEluYy4gKHd3dy5uZXR3b3Jrcm9ib3RzLmNvbSkKQEAgLTI4LDEwICsyOCw5IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KIApAQCAtNDEsMzIgKzQwLDM0IEBACiAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbmZ2ZXJzaW9uW10gPSAiMC4zMCI7CiAKLSNpZiAwCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCVwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzKCVkKTolcygpOiAiIGZvcm1hdCwgX19GSUxFX18sIFwKLQkJCV9fTElORV9fLCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc29jayAqbmZubCA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gKnN1YnN5c190YWJsZVtORk5MX1NVQlNZU19DT1VOVF07Ci1ERUNMQVJFX01VVEVYKG5mbmxfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgobmZubF9tdXRleCk7CiAKLXZvaWQgbmZubF9sb2NrKHZvaWQpCitzdGF0aWMgdm9pZCBuZm5sX2xvY2sodm9pZCkKIHsKLQluZm5sX3NobG9jaygpOworCW11dGV4X2xvY2soJm5mbmxfbXV0ZXgpOwogfQogCi12b2lkIG5mbmxfdW5sb2NrKHZvaWQpCitzdGF0aWMgaW50IG5mbmxfdHJ5bG9jayh2b2lkKQogewotCW5mbmxfc2h1bmxvY2soKTsKKwlyZXR1cm4gIW11dGV4X3RyeWxvY2soJm5mbmxfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBfX25mbmxfdW5sb2NrKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZuZm5sX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgbmZubF91bmxvY2sodm9pZCkKK3sKKwltdXRleF91bmxvY2soJm5mbmxfbXV0ZXgpOworCWlmIChuZm5sLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pCisJCW5mbmwtPnNrX2RhdGFfcmVhZHkobmZubCwgMCk7CiB9CiAKIGludCBuZm5ldGxpbmtfc3Vic3lzX3JlZ2lzdGVyKHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtICpuKQogewotCURFQlVHUCgicmVnaXN0ZXJpbmcgc3Vic3lzdGVtIElEICV1XG4iLCBuLT5zdWJzeXNfaWQpOwotCiAJbmZubF9sb2NrKCk7CiAJaWYgKHN1YnN5c190YWJsZVtuLT5zdWJzeXNfaWRdKSB7CiAJCW5mbmxfdW5sb2NrKCk7CkBAIC03NywyNCArNzgsMjMgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3N1YnN5c19yZWdpc3Rlcik7CiAKIGludCBuZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gKm4pCiB7Ci0JREVCVUdQKCJ1bnJlZ2lzdGVyaW5nIHN1YnN5c3RlbSBJRCAldVxuIiwgbi0+c3Vic3lzX2lkKTsKLQogCW5mbmxfbG9jaygpOwogCXN1YnN5c190YWJsZVtuLT5zdWJzeXNfaWRdID0gTlVMTDsKIAluZm5sX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtICpuZm5ldGxpbmtfZ2V0X3N1YnN5cyh1X2ludDE2X3QgdHlwZSkKIHsKIAl1X2ludDhfdCBzdWJzeXNfaWQgPSBORk5MX1NVQlNZU19JRCh0eXBlKTsKIAotCWlmIChzdWJzeXNfaWQgPj0gTkZOTF9TVUJTWVNfQ09VTlQKLQkgICAgfHwgc3Vic3lzX3RhYmxlW3N1YnN5c19pZF0gPT0gTlVMTCkKKwlpZiAoc3Vic3lzX2lkID49IE5GTkxfU1VCU1lTX0NPVU5UKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBzdWJzeXNfdGFibGVbc3Vic3lzX2lkXTsKQEAgLTEwNSwxMCArMTA1LDggQEAKIHsKIAl1X2ludDhfdCBjYl9pZCA9IE5GTkxfTVNHX1RZUEUodHlwZSk7CiAKLQlpZiAoY2JfaWQgPj0gc3MtPmNiX2NvdW50KSB7Ci0JCURFQlVHUCgibXNndHlwZSAldSA+PSAldSwgcmV0dXJuaW5nXG4iLCB0eXBlLCBzcy0+Y2JfY291bnQpOworCWlmIChjYl9pZCA+PSBzcy0+Y2JfY291bnQpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiAmc3MtPmNiW2NiX2lkXTsKIH0KQEAgLTEyNSw2ICsxMjMsNyBAQAogCW1lbWNweShORkFfREFUQShuZmEpLCBkYXRhLCBhdHRybGVuKTsKIAltZW1zZXQoTkZBX0RBVEEobmZhKSArIGF0dHJsZW4sIDAsIE5GQV9BTElHTihzaXplKSAtIHNpemUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZmFfZmlsbCk7CiAKIHZvaWQgbmZhdHRyX3BhcnNlKHN0cnVjdCBuZmF0dHIgKnRiW10sIGludCBtYXhhdHRyLCBzdHJ1Y3QgbmZhdHRyICpuZmEsIGludCBsZW4pCiB7CkBAIC0xMzcsNiArMTM2LDcgQEAKIAkJbmZhID0gTkZBX05FWFQobmZhLCBsZW4pOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mYXR0cl9wYXJzZSk7CiAKIC8qKgogICogbmZuZXRsaW5rX2NoZWNrX2F0dHJpYnV0ZXMgLSBjaGVjayBhbmQgcGFyc2UgbmZuZXRsaW5rIGF0dHJpYnV0ZXMKQEAgLTE1MCwzNyArMTUwLDE1IEBACiBuZm5ldGxpbmtfY2hlY2tfYXR0cmlidXRlcyhzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqc3Vic3lzLAogCQkJICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQogewotCWludCBtaW5fbGVuOwotCXVfaW50MTZfdCBhdHRyX2NvdW50OworCWludCBtaW5fbGVuID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwogCXVfaW50OF90IGNiX2lkID0gTkZOTF9NU0dfVFlQRShubGgtPm5sbXNnX3R5cGUpOwotCi0JaWYgKHVubGlrZWx5KGNiX2lkID49IHN1YnN5cy0+Y2JfY291bnQpKSB7Ci0JCURFQlVHUCgibXNndHlwZSAldSA+PSAldSwgcmV0dXJuaW5nXG4iLAotCQkJY2JfaWQsIHN1YnN5cy0+Y2JfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltaW5fbGVuID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwotCWlmICh1bmxpa2VseShubGgtPm5sbXNnX2xlbiA8IG1pbl9sZW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWF0dHJfY291bnQgPSBzdWJzeXMtPmNiW2NiX2lkXS5hdHRyX2NvdW50OwotCW1lbXNldChjZGEsIDAsIHNpemVvZihzdHJ1Y3QgbmZhdHRyICopICogYXR0cl9jb3VudCk7CisJdV9pbnQxNl90IGF0dHJfY291bnQgPSBzdWJzeXMtPmNiW2NiX2lkXS5hdHRyX2NvdW50OwogCiAJLyogY2hlY2sgYXR0cmlidXRlIGxlbmd0aHMuICovCiAJaWYgKGxpa2VseShubGgtPm5sbXNnX2xlbiA+IG1pbl9sZW4pKSB7CiAJCXN0cnVjdCBuZmF0dHIgKmF0dHIgPSBORk1fTkZBKE5MTVNHX0RBVEEobmxoKSk7CiAJCWludCBhdHRybGVuID0gbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19BTElHTihtaW5fbGVuKTsKLQotCQl3aGlsZSAoTkZBX09LKGF0dHIsIGF0dHJsZW4pKSB7Ci0JCQl1bnNpZ25lZCBmbGF2b3IgPSBORkFfVFlQRShhdHRyKTsKLQkJCWlmIChmbGF2b3IpIHsKLQkJCQlpZiAoZmxhdm9yID4gYXR0cl9jb3VudCkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJY2RhW2ZsYXZvciAtIDFdID0gYXR0cjsKLQkJCX0KLQkJCWF0dHIgPSBORkFfTkVYVChhdHRyLCBhdHRybGVuKTsKLQkJfQorCQluZmF0dHJfcGFyc2UoY2RhLCBhdHRyX2NvdW50LCBhdHRyLCBhdHRybGVuKTsKIAl9CiAKIAkvKiBpbXBsaWNpdDogaWYgbmxtc2dfbGVuID09IG1pbl9sZW4sIHdlIHJldHVybiAwLCBhbmQgYW4gZW1wdHkKQEAgLTIwOCw2MiArMTg2LDQ2IEBACiAKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3NlbmQpOwogCiBpbnQgbmZuZXRsaW5rX3VuaWNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHBpZCwgaW50IGZsYWdzKQogewogCXJldHVybiBuZXRsaW5rX3VuaWNhc3QobmZubCwgc2tiLCBwaWQsIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mbmV0bGlua191bmljYXN0KTsKIAogLyogUHJvY2VzcyBvbmUgY29tcGxldGUgbmZuZXRsaW5rIG1lc3NhZ2UuICovCi1zdGF0aWMgaW50IG5mbmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCitzdGF0aWMgaW50IG5mbmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCXN0cnVjdCBuZm5sX2NhbGxiYWNrICpuYzsKIAlzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqc3M7Ci0JaW50IHR5cGUsIGVyciA9IDA7CisJaW50IHR5cGUsIGVycjsKIAotCURFQlVHUCgiZW50ZXJlZDsgc3Vic3lzPSV1LCBtc2d0eXBlPSV1XG4iLAotCQkgTkZOTF9TVUJTWVNfSUQobmxoLT5ubG1zZ190eXBlKSwKLQkJIE5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKSk7Ci0KLQlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpIHsKLQkJREVCVUdQKCJtaXNzaW5nIENBUF9ORVRfQURNSU5cbiIpOwotCQkqZXJycCA9IC1FUEVSTTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIE9ubHkgcmVxdWVzdHMgYXJlIGhhbmRsZWQgYnkga2VybmVsIG5vdy4gKi8KLQlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVRVUVTVCkpIHsKLQkJREVCVUdQKCJyZWNlaXZlZCBub24tcmVxdWVzdCBtZXNzYWdlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCS8qIEFsbCB0aGUgbWVzc2FnZXMgbXVzdCBhdCBsZWFzdCBjb250YWluIG5mZ2VubXNnICovCi0JaWYgKG5saC0+bmxtc2dfbGVuIDwgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpKSB7Ci0JCURFQlVHUCgicmVjZWl2ZWQgbWVzc2FnZSB3YXMgdG9vIHNob3J0XG4iKTsKKwlpZiAobmxoLT5ubG1zZ19sZW4gPCBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkpCiAJCXJldHVybiAwOwotCX0KIAogCXR5cGUgPSBubGgtPm5sbXNnX3R5cGU7CiAJc3MgPSBuZm5ldGxpbmtfZ2V0X3N1YnN5cyh0eXBlKTsKIAlpZiAoIXNzKSB7CiAjaWZkZWYgQ09ORklHX0tNT0QKLQkJLyogZG9uJ3QgY2FsbCBuZm5sX3NodW5sb2NrLCBzaW5jZSBpdCB3b3VsZCByZWVudGVyCisJCS8qIGRvbid0IGNhbGwgbmZubF91bmxvY2ssIHNpbmNlIGl0IHdvdWxkIHJlZW50ZXIKIAkJICogd2l0aCBmdXJ0aGVyIHBhY2tldCBwcm9jZXNzaW5nICovCi0JCXVwKCZuZm5sX3NlbSk7CisJCV9fbmZubF91bmxvY2soKTsKIAkJcmVxdWVzdF9tb2R1bGUoIm5mbmV0bGluay1zdWJzeXMtJWQiLCBORk5MX1NVQlNZU19JRCh0eXBlKSk7Ci0JCW5mbmxfc2hsb2NrKCk7CisJCW5mbmxfbG9jaygpOwogCQlzcyA9IG5mbmV0bGlua19nZXRfc3Vic3lzKHR5cGUpOwogCQlpZiAoIXNzKQogI2VuZGlmCi0JCQlnb3RvIGVycl9pbnZhbDsKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW5jID0gbmZuZXRsaW5rX2ZpbmRfY2xpZW50KHR5cGUsIHNzKTsKLQlpZiAoIW5jKSB7Ci0JCURFQlVHUCgidW5hYmxlIHRvIGZpbmQgY2xpZW50IGZvciB0eXBlICVkXG4iLCB0eXBlKTsKLQkJZ290byBlcnJfaW52YWw7Ci0JfQorCWlmICghbmMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJewogCQl1X2ludDE2X3QgYXR0cl9jb3VudCA9CkBAIC0yNzQsNzMgKzIzNiwyMSBAQAogCiAJCWVyciA9IG5mbmV0bGlua19jaGVja19hdHRyaWJ1dGVzKHNzLCBubGgsIGNkYSk7CiAJCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJfaW52YWw7Ci0KLQkJREVCVUdQKCJjYWxsaW5nIGhhbmRsZXJcbiIpOwotCQllcnIgPSBuYy0+Y2FsbChuZm5sLCBza2IsIG5saCwgY2RhLCBlcnJwKTsKLQkJKmVycnAgPSBlcnI7Ci0JCXJldHVybiBlcnI7CisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gbmMtPmNhbGwobmZubCwgc2tiLCBubGgsIGNkYSk7CiAJfQotCi1lcnJfaW52YWw6Ci0JREVCVUdQKCJyZXR1cm5pbmcgLUVJTlZBTFxuIik7Ci0JKmVycnAgPSAtRUlOVkFMOwotCXJldHVybiAtMTsKLX0KLQotLyogUHJvY2VzcyBvbmUgcGFja2V0IG9mIG1lc3NhZ2VzLiAqLwotc3RhdGljIGlubGluZSBpbnQgbmZuZXRsaW5rX3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCi0Jd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCXUzMiBybGVuOwotCi0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7Ci0JCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpCi0JCSAgICB8fCBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKQotCQkJcmV0dXJuIDA7Ci0JCXJsZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7Ci0JCWlmIChybGVuID4gc2tiLT5sZW4pCi0JCQlybGVuID0gc2tiLT5sZW47Ci0JCWlmIChuZm5ldGxpbmtfcmN2X21zZyhza2IsIG5saCwgJmVycikpIHsKLQkJCWlmICghZXJyKQotCQkJCXJldHVybiAtMTsKLQkJCW5ldGxpbmtfYWNrKHNrYiwgbmxoLCBlcnIpOwotCQl9IGVsc2UKLQkJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQUNLKQotCQkJCW5ldGxpbmtfYWNrKHNrYiwgbmxoLCAwKTsKLQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKLQl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbmZuZXRsaW5rX3JjdihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pCiB7CisJdW5zaWduZWQgaW50IHFsZW4gPSAwOworCiAJZG8gewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCWlmIChuZm5sX3NobG9ja19ub3dhaXQoKSkKKwkJaWYgKG5mbmxfdHJ5bG9jaygpKQogCQkJcmV0dXJuOwotCi0JCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgewotCQkJaWYgKG5mbmV0bGlua19yY3Zfc2tiKHNrYikpIHsKLQkJCQlpZiAoc2tiLT5sZW4pCi0JCQkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwKLQkJCQkJCSAgICAgICBza2IpOwotCQkJCWVsc2UKLQkJCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJfQotCi0JCS8qIGRvbid0IGNhbGwgbmZubF9zaHVubG9jaywgc2luY2UgaXQgd291bGQgcmVlbnRlcgotCQkgKiB3aXRoIGZ1cnRoZXIgcGFja2V0IHByb2Nlc3NpbmcgKi8KLQkJdXAoJm5mbmxfc2VtKTsKLQl9IHdoaWxlKG5mbmwgJiYgbmZubC0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuKTsKKwkJbmV0bGlua19ydW5fcXVldWUoc2ssICZxbGVuLCBuZm5ldGxpbmtfcmN2X21zZyk7CisJCV9fbmZubF91bmxvY2soKTsKKwl9IHdoaWxlIChxbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG5mbmV0bGlua19leGl0KHZvaWQpCkBAIC0zNTUsNyArMjY1LDcgQEAKIAlwcmludGsoIk5ldGZpbHRlciBtZXNzYWdlcyB2aWEgTkVUTElOSyB2JXMuXG4iLCBuZnZlcnNpb24pOwogCiAJbmZubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX05FVEZJTFRFUiwgTkZOTEdSUF9NQVgsCi0JCQkJICAgICBuZm5ldGxpbmtfcmN2LCBUSElTX01PRFVMRSk7CisJCQkJICAgICBuZm5ldGxpbmtfcmN2LCBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKCFuZm5sKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGluaXRpYWxpemUgbmZuZXRsaW5rIVxuIik7CiAJCXJldHVybiAtMTsKQEAgLTM2NiwxMCArMjc2LDMgQEAKIAogbW9kdWxlX2luaXQobmZuZXRsaW5rX2luaXQpOwogbW9kdWxlX2V4aXQobmZuZXRsaW5rX2V4aXQpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfc3Vic3lzX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfc2VuZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfdW5pY2FzdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZmF0dHJfcGFyc2UpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19uZmFfZmlsbCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCmluZGV4IDVjYjMwZWIuLmUzMmUzMGUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCkBAIC0xMCwxMSArMTAsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAyMDA2LTAxLTI2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICogCS0gQWRkIG9wdGlvbmFsIGxvY2FsIGFuZCBnbG9iYWwgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVjdCBsb3N0Ci0gKiAJICBldmVudHMgZnJvbSB1c2Vyc3BhY2UKLSAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTE2MywxMCArMTU4LDcgQEAKIAkvKiBuZWVkcyB0byBiZSB0d28sIHNpbmNlIHdlIF9wdXQoKSBhZnRlciBjcmVhdGlvbiAqLwogCWF0b21pY19zZXQoJmluc3QtPnVzZSwgMik7CiAKLQlpbml0X3RpbWVyKCZpbnN0LT50aW1lcik7Ci0JaW5zdC0+dGltZXIuZnVuY3Rpb24gPSBuZnVsbmxfdGltZXI7Ci0JaW5zdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3Q7Ci0JLyogZG9uJ3Qgc3RhcnQgdGltZXIgeWV0LiAocmUpc3RhcnQgaXQgIHdpdGggZXZlcnkgcGFja2V0ICovCisJc2V0dXBfdGltZXIoJmluc3QtPnRpbWVyLCBuZnVsbmxfdGltZXIsICh1bnNpZ25lZCBsb25nKWluc3QpOwogCiAJaW5zdC0+cGVlcl9waWQgPSBwaWQ7CiAJaW5zdC0+Z3JvdXBfbnVtID0gZ3JvdXBfbnVtOwpAQCAtMjAwLDIwICsxOTIsMTQgQEAKIHN0YXRpYyBpbnQgX19uZnVsbmxfc2VuZChzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0KTsKIAogc3RhdGljIHZvaWQKLV9pbnN0YW5jZV9kZXN0cm95MihzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0LCBpbnQgbG9jaykKK19faW5zdGFuY2VfZGVzdHJveShzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0KQogewogCS8qIGZpcnN0IHB1bGwgaXQgb3V0IG9mIHRoZSBnbG9iYWwgbGlzdCAqLwotCWlmIChsb2NrKQotCQl3cml0ZV9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7Ci0KIAlVREVCVUcoInJlbW92aW5nIGluc3RhbmNlICVwIChxdWV1ZW51bT0ldSkgZnJvbSBoYXNoXG4iLAogCQlpbnN0LCBpbnN0LT5ncm91cF9udW0pOwogCiAJaGxpc3RfZGVsKCZpbnN0LT5obGlzdCk7CiAKLQlpZiAobG9jaykKLQkJd3JpdGVfdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7Ci0KIAkvKiB0aGVuIGZsdXNoIGFsbCBwZW5kaW5nIHBhY2tldHMgZnJvbSBza2IgKi8KIAogCXNwaW5fbG9ja19iaCgmaW5zdC0+bG9jayk7CkBAIC0yMzUsMTUgKzIyMSwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLV9faW5zdGFuY2VfZGVzdHJveShzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0KQotewotCV9pbnN0YW5jZV9kZXN0cm95MihpbnN0LCAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCiBpbnN0YW5jZV9kZXN0cm95KHN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3QpCiB7Ci0JX2luc3RhbmNlX2Rlc3Ryb3kyKGluc3QsIDEpOworCXdyaXRlX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwlfX2luc3RhbmNlX2Rlc3Ryb3koaW5zdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTM2NSw5ICszNDcsNiBAQAogewogCWludCBzdGF0dXM7CiAKLQlpZiAoIWluc3QtPnNrYikKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoaW5zdC0+cWxlbiA+IDEpCiAJCWluc3QtPmxhc3RubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19ET05FOwogCkBAIC0zOTEsNyArMzcwLDggQEAKIAlVREVCVUcoInRpbWVyIGZ1bmN0aW9uIGNhbGxlZCwgZmx1c2hpbmcgYnVmZmVyXG4iKTsKIAogCXNwaW5fbG9ja19iaCgmaW5zdC0+bG9jayk7Ci0JX19uZnVsbmxfc2VuZChpbnN0KTsKKwlpZiAoaW5zdC0+c2tiKQorCQlfX25mdWxubF9zZW5kKGluc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZpbnN0LT5sb2NrKTsKIAlpbnN0YW5jZV9wdXQoaW5zdCk7CiB9CkBAIC00MDksMTUgKzM4OSwxNCBAQAogCQkJY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmxpLAogCQkJY29uc3QgY2hhciAqcHJlZml4LCB1bnNpZ25lZCBpbnQgcGxlbikKIHsKLQl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKIAlzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfaGRyIHBtc2c7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKIAlfX2JlMzIgdG1wX3VpbnQ7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWwgPSBpbnN0LT5za2ItPnRhaWw7CiAKIAlVREVCVUcoImVudGVyZWRcbiIpOwogCi0Jb2xkX3RhaWwgPSBpbnN0LT5za2ItPnRhaWw7CiAJbmxoID0gTkxNU0dfUFVUKGluc3QtPnNrYiwgMCwgMCwKIAkJCU5GTkxfU1VCU1lTX1VMT0cgPDwgOCB8IE5GVUxOTF9NU0dfUEFDS0VULAogCQkJc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwpAQCAtNTA5LDExICs0ODgsMTEgQEAKIAkJTkZBX1BVVChpbnN0LT5za2IsIE5GVUxBX0hXQUREUiwgc2l6ZW9mKHBodyksICZwaHcpOwogCX0KIAotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjKSB7CisJaWYgKHNrYi0+dHN0YW1wLnR2NjQpIHsKIAkJc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X3RpbWVzdGFtcCB0czsKLQotCQl0cy5zZWMgPSBjcHVfdG9fYmU2NChza2ItPnRzdGFtcC5vZmZfc2VjKTsKLQkJdHMudXNlYyA9IGNwdV90b19iZTY0KHNrYi0+dHN0YW1wLm9mZl91c2VjKTsKKwkJc3RydWN0IHRpbWV2YWwgdHYgPSBrdGltZV90b190aW1ldmFsKHNrYi0+dHN0YW1wKTsKKwkJdHMuc2VjID0gY3B1X3RvX2JlNjQodHYudHZfc2VjKTsKKwkJdHMudXNlYyA9IGNwdV90b19iZTY0KHR2LnR2X3VzZWMpOwogCiAJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9USU1FU1RBTVAsIHNpemVvZih0cyksICZ0cyk7CiAJfQpAQCAtNTk2LDcgKzU3NSw2IEBACiAJc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdDsKIAljb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqbGk7CiAJdW5zaWduZWQgaW50IHF0aHJlc2hvbGQ7Ci0JdW5zaWduZWQgaW50IG5sYnVmc2l6OwogCXVuc2lnbmVkIGludCBwbGVuOwogCiAJaWYgKGxpX3VzZXIgJiYgbGlfdXNlci0+dHlwZSA9PSBORl9MT0dfVFlQRV9VTE9HKQpAQCAtNjA2LDEyICs1ODQsNyBAQAogCiAJaW5zdCA9IGluc3RhbmNlX2xvb2t1cF9nZXQobGktPnUudWxvZy5ncm91cCk7CiAJaWYgKCFpbnN0KQotCQlpbnN0ID0gaW5zdGFuY2VfbG9va3VwX2dldCgwKTsKLQlpZiAoIWluc3QpIHsKLQkJUFJJTlRSKCJuZm5ldGxpbmtfbG9nOiB0cnlpbmcgdG8gbG9nIHBhY2tldCwgIgotCQkJImJ1dCBubyBpbnN0YW5jZSBmb3IgZ3JvdXAgJXVcbiIsIGxpLT51LnVsb2cuZ3JvdXApOwogCQlyZXR1cm47Ci0JfQogCiAJcGxlbiA9IDA7CiAJaWYgKHByZWZpeCkKQEAgLTY2NywyNCArNjQwLDExIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2tfYmgoJmluc3QtPmxvY2spOwotCQlpbnN0YW5jZV9wdXQoaW5zdCk7Ci0JCXJldHVybjsKKwkJZ290byB1bmxvY2tfYW5kX3JlbGVhc2U7CiAJfQogCi0JaWYgKHNpemUgPiBpbnN0LT5ubGJ1ZnNpeikKLQkJbmxidWZzaXogPSBzaXplOwotCWVsc2UKLQkJbmxidWZzaXogPSBpbnN0LT5ubGJ1ZnNpejsKLQotCWlmICghaW5zdC0+c2tiKSB7Ci0JCWlmICghKGluc3QtPnNrYiA9IG5mdWxubF9hbGxvY19za2IobmxidWZzaXosIHNpemUpKSkgewotCQkJVURFQlVHKCJlcnJvciBpbiBuZnVsbmxfYWxsb2Nfc2tiKCV1LCAldSlcbiIsCi0JCQkJaW5zdC0+bmxidWZzaXosIHNpemUpOwotCQkJZ290byBhbGxvY19mYWlsdXJlOwotCQl9Ci0JfSBlbHNlIGlmIChpbnN0LT5xbGVuID49IHF0aHJlc2hvbGQgfHwKLQkJICAgc2l6ZSA+IHNrYl90YWlscm9vbShpbnN0LT5za2IpKSB7CisJaWYgKGluc3QtPnFsZW4gPj0gcXRocmVzaG9sZCB8fAorCSAgICAoaW5zdC0+c2tiICYmIHNpemUgPiBza2JfdGFpbHJvb20oaW5zdC0+c2tiKSkpIHsKIAkJLyogZWl0aGVyIHRoZSBxdWV1ZSBsZW4gaXMgdG9vIGhpZ2ggb3Igd2UgZG9uJ3QgaGF2ZQogCQkgKiBlbm91Z2ggcm9vbSBpbiB0aGUgc2tiIGxlZnQuIGZsdXNoIHRvIHVzZXJzcGFjZS4gKi8KIAkJVURFQlVHKCJmbHVzaGluZyBvbGQgc2tiXG4iKTsKQEAgLTY5MywxMiArNjUzLDEyIEBACiAJCWlmIChkZWxfdGltZXIoJmluc3QtPnRpbWVyKSkKIAkJCWluc3RhbmNlX3B1dChpbnN0KTsKIAkJX19uZnVsbmxfc2VuZChpbnN0KTsKKwl9CiAKLQkJaWYgKCEoaW5zdC0+c2tiID0gbmZ1bG5sX2FsbG9jX3NrYihubGJ1ZnNpeiwgc2l6ZSkpKSB7Ci0JCQlVREVCVUcoImVycm9yIGluIG5mdWxubF9hbGxvY19za2IoJXUsICV1KVxuIiwKLQkJCQlpbnN0LT5ubGJ1ZnNpeiwgc2l6ZSk7CisJaWYgKCFpbnN0LT5za2IpIHsKKwkJaW5zdC0+c2tiID0gbmZ1bG5sX2FsbG9jX3NrYihpbnN0LT5ubGJ1ZnNpeiwgc2l6ZSk7CisJCWlmICghaW5zdC0+c2tiKQogCQkJZ290byBhbGxvY19mYWlsdXJlOwotCQl9CiAJfQogCiAJVURFQlVHKCJxbGVuICVkLCBxdGhyZXNob2xkICVkXG4iLCBpbnN0LT5xbGVuLCBxdGhyZXNob2xkKTsKQEAgLTc2MCw3ICs3MjAsNyBAQAogCiBzdGF0aWMgaW50CiBuZnVsbmxfcmVjdl91bnN1cHAoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKm5mcWFbXSwgaW50ICplcnJwKQorCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10pCiB7CiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KQEAgLTc5OCw3ICs3NTgsNyBAQAogCiBzdGF0aWMgaW50CiBuZnVsbmxfcmVjdl9jb25maWcoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnVsYVtdLCBpbnQgKmVycnApCisJCSAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnVsYVtdKQogewogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2cgPSBOTE1TR19EQVRBKG5saCk7CiAJdV9pbnQxNl90IGdyb3VwX251bSA9IG50b2hzKG5mbXNnLT5yZXNfaWQpOwpAQCAtODMwLDEzICs3OTAsMTMgQEAKIAkJCQkJICAgICAgIE5FVExJTktfQ0Ioc2tiKS5waWQpOwogCQkJaWYgKCFpbnN0KSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIG91dF9wdXQ7CisJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBORlVMTkxfQ0ZHX0NNRF9VTkJJTkQ6CiAJCQlpZiAoIWluc3QpIHsKIAkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gb3V0X3B1dDsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJaWYgKGluc3QtPnBlZXJfcGlkICE9IE5FVExJTktfQ0Ioc2tiKS5waWQpIHsKQEAgLTg0NSw3ICs4MDUsNyBAQAogCQkJfQogCiAJCQlpbnN0YW5jZV9kZXN0cm95KGluc3QpOwotCQkJYnJlYWs7CisJCQlnb3RvIG91dDsKIAkJY2FzZSBORlVMTkxfQ0ZHX0NNRF9QRl9CSU5EOgogCQkJVURFQlVHKCJyZWdpc3RlcmluZyBsb2cgaGFuZGxlciBmb3IgcGY9JXVcbiIsIHBmKTsKIAkJCXJldCA9IG5mX2xvZ19yZWdpc3RlcihwZiwgJm5mdWxubF9sb2dnZXIpOwpAQCAtODY5LDcgKzgyOSw3IEBACiAJCQkJImdyb3VwPSV1IHBpZD0ldSA9PkVOT0VOVFxuIiwKIAkJCQlncm91cF9udW0sIE5FVExJTktfQ0Ioc2tiKS5waWQpOwogCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gb3V0X3B1dDsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJaWYgKGluc3QtPnBlZXJfcGlkICE9IE5FVExJTktfQ0Ioc2tiKS5waWQpIHsKQEAgLTkzOSwxMCArODk5LDggQEAKIAl1bnNpZ25lZCBpbnQgYnVja2V0OwogfTsKIAotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpnZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCitzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmdldF9maXJzdChzdHJ1Y3QgaXRlcl9zdGF0ZSAqc3QpCiB7Ci0Jc3RydWN0IGl0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCiAJaWYgKCFzdCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTk1MywxMCArOTExLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpnZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGhsaXN0X25vZGUgKmgpCitzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmdldF9uZXh0KHN0cnVjdCBpdGVyX3N0YXRlICpzdCwgc3RydWN0IGhsaXN0X25vZGUgKmgpCiB7Ci0Jc3RydWN0IGl0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCiAJaCA9IGgtPm5leHQ7CiAJd2hpbGUgKCFoKSB7CiAJCWlmICgrK3N0LT5idWNrZXQgPj0gSU5TVEFOQ0VfQlVDS0VUUykKQEAgLTk2NywxMyArOTIzLDEzIEBACiAJcmV0dXJuIGg7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3N0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZ2V0X2lkeChzdHJ1Y3QgaXRlcl9zdGF0ZSAqc3QsIGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKmhlYWQ7Ci0JaGVhZCA9IGdldF9maXJzdChzZXEpOworCWhlYWQgPSBnZXRfZmlyc3Qoc3QpOwogCiAJaWYgKGhlYWQpCi0JCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBnZXRfbmV4dChzZXEsIGhlYWQpKSkKKwkJd2hpbGUgKHBvcyAmJiAoaGVhZCA9IGdldF9uZXh0KHN0LCBoZWFkKSkpCiAJCQlwb3MtLTsKIAlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7CiB9CkBAIC05ODEsMTMgKzkzNywxMyBAQAogc3RhdGljIHZvaWQgKnNlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7CiAJcmVhZF9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7Ci0JcmV0dXJuIGdldF9pZHgoc2VxLCAqcG9zKTsKKwlyZXR1cm4gZ2V0X2lkeChzZXEtPnByaXZhdGUsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAkoKnBvcykrKzsKLQlyZXR1cm4gZ2V0X25leHQocywgdik7CisJcmV0dXJuIGdldF9uZXh0KHMtPnByaXZhdGUsIHYpOwogfQogCiBzdGF0aWMgdm9pZCBzZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYwppbmRleCBkOWNlNGE3Li43YTk3YmVjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogbmZxbmxfYnVpbGRfcGFja2V0X21lc3NhZ2Uoc3RydWN0IG5mcW5sX2luc3RhbmNlICpxdWV1ZSwKIAkJCSAgIHN0cnVjdCBuZnFubF9xdWV1ZV9lbnRyeSAqZW50cnksIGludCAqZXJycCkKIHsKLQl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKKwlza19idWZmX2RhdGFfdCBvbGRfdGFpbDsKIAlzaXplX3Qgc2l6ZTsKIAlzaXplX3QgZGF0YV9sZW4gPSAwOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlpZiAoIXNrYikKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCi0Jb2xkX3RhaWw9IHNrYi0+dGFpbDsKKwlvbGRfdGFpbCA9IHNrYi0+dGFpbDsKIAlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLAogCQkJTkZOTF9TVUJTWVNfUVVFVUUgPDwgOCB8IE5GUU5MX01TR19QQUNLRVQsCiAJCQlzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CkBAIC00OTUsMTEgKzQ5NSwxMSBAQAogCQlORkFfUFVUKHNrYiwgTkZRQV9IV0FERFIsIHNpemVvZihwaHcpLCAmcGh3KTsKIAl9CiAKLQlpZiAoZW50c2tiLT50c3RhbXAub2ZmX3NlYykgeworCWlmIChlbnRza2ItPnRzdGFtcC50djY0KSB7CiAJCXN0cnVjdCBuZnFubF9tc2dfcGFja2V0X3RpbWVzdGFtcCB0czsKLQotCQl0cy5zZWMgPSBjcHVfdG9fYmU2NChlbnRza2ItPnRzdGFtcC5vZmZfc2VjKTsKLQkJdHMudXNlYyA9IGNwdV90b19iZTY0KGVudHNrYi0+dHN0YW1wLm9mZl91c2VjKTsKKwkJc3RydWN0IHRpbWV2YWwgdHYgPSBrdGltZV90b190aW1ldmFsKGVudHNrYi0+dHN0YW1wKTsKKwkJdHMuc2VjID0gY3B1X3RvX2JlNjQodHYudHZfc2VjKTsKKwkJdHMudXNlYyA9IGNwdV90b19iZTY0KHR2LnR2X3VzZWMpOwogCiAJCU5GQV9QVVQoc2tiLCBORlFBX1RJTUVTVEFNUCwgc2l6ZW9mKHRzKSwgJnRzKTsKIAl9CkBAIC02NDgsNyArNjQ4LDcgQEAKIAl9CiAJaWYgKCFza2JfbWFrZV93cml0YWJsZSgmZS0+c2tiLCBkYXRhX2xlbikpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShlLT5za2ItPmRhdGEsIGRhdGEsIGRhdGFfbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShlLT5za2IsIGRhdGEsIGRhdGFfbGVuKTsKIAllLT5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJcmV0dXJuIDA7CiB9CkBAIC03ODMsNyArNzgzLDcgQEAKIAogc3RhdGljIGludAogbmZxbmxfcmVjdl92ZXJkaWN0KHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZxYVtdLCBpbnQgKmVycnApCisJCSAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10pCiB7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAl1X2ludDE2X3QgcXVldWVfbnVtID0gbnRvaHMobmZtc2ctPnJlc19pZCk7CkBAIC04NDgsNyArODQ4LDcgQEAKIAogc3RhdGljIGludAogbmZxbmxfcmVjdl91bnN1cHAoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKm5mcWFbXSwgaW50ICplcnJwKQorCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10pCiB7CiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KQEAgLTg2NSw3ICs4NjUsNyBAQAogCiBzdGF0aWMgaW50CiBuZnFubF9yZWN2X2NvbmZpZyhzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZxYVtdLCBpbnQgKmVycnApCisJCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKm5mcWFbXSkKIHsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gTkxNU0dfREFUQShubGgpOwogCXVfaW50MTZfdCBxdWV1ZV9udW0gPSBudG9ocyhuZm1zZy0+cmVzX2lkKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCBlYzYwN2E0Li4wZWIyNTA0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC01Niw4ICs1Niw4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqeHRfcHJlZml4W05QUk9UT10gPSB7Ci0JW0FGX0lORVRdIAk9ICJpcCIsCi0JW0FGX0lORVQ2XSAJPSAiaXA2IiwKKwlbQUZfSU5FVF0JPSAiaXAiLAorCVtBRl9JTkVUNl0JPSAiaXA2IiwKIAlbTkZfQVJQXQk9ICJhcnAiLAogfTsKIApAQCAtNjUxLDEyICs2NTEsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoeHRfdW5yZWdpc3Rlcl90YWJsZSk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGNoYXIgKnh0X3Byb3RvX3ByZWZpeFtOUFJPVE9dID0gewotCVtBRl9JTkVUXQk9ICJpcCIsCi0JW0FGX0lORVQ2XQk9ICJpcDYiLAotCVtORl9BUlBdCT0gImFycCIsCi19OwotCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqeHRfZ2V0X2lkeChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gbGlzdC0+bmV4dDsKQEAgLTc5OCw3ICs3OTIsNyBAQAogCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOwogCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShidWYsIDA0NDAsICZ4dF9maWxlX29wcyk7CiAJaWYgKCFwcm9jKQpAQCAtODA2LDE0ICs4MDAsMTQgQEAKIAlwcm9jLT5kYXRhID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZiB8IChUQUJMRSA8PCAxNikpOwogCiAKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CiAJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKGJ1ZiwgMDQ0MCwgJnh0X2ZpbGVfb3BzKTsKIAlpZiAoIXByb2MpCiAJCWdvdG8gb3V0X3JlbW92ZV90YWJsZXM7CiAJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoTUFUQ0ggPDwgMTYpKTsKIAotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKIAlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOwogCWlmICghcHJvYykKQEAgLTgyNSwxMiArODE5LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogb3V0X3JlbW92ZV9tYXRjaGVzOgotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKIAlwcm9jX25ldF9yZW1vdmUoYnVmKTsKIAogb3V0X3JlbW92ZV90YWJsZXM6Ci0Jc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOwogCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CiAJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CiBvdXQ6CkBAIC04NDQsMTUgKzgzOCwxNSBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJY2hhciBidWZbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CiAKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKIAlwcm9jX25ldF9yZW1vdmUoYnVmKTsKIAotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKIAlwcm9jX25ldF9yZW1vdmUoYnVmKTsKIAotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKIAlwcm9jX25ldF9yZW1vdmUoYnVmKTsKICNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwppbmRleCA3OTVjMDU4Li5iMDNjZTAwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCkBAIC0zMCwxMCArMzAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgotI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCkBAIC00NCw0MCArNDEsMzMgQEAKICAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisJc3RydWN0IG5mX2Nvbm4gKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVfaW50MzJfdCBkaWZmOwogCXVfaW50MzJfdCBtYXJrOwogCXVfaW50MzJfdCBuZXdtYXJrOwotCXVfaW50MzJfdCBjdGluZm87Ci0JdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyaygqcHNrYiwgJmN0aW5mbyk7CiAKLQlpZiAoY3RtYXJrKSB7CisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOworCWlmIChjdCkgewogCQlzd2l0Y2gobWFya2luZm8tPm1vZGUpIHsKIAkJY2FzZSBYVF9DT05OTUFSS19TRVQ6Ci0JCQluZXdtYXJrID0gKCpjdG1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwgbWFya2luZm8tPm1hcms7Ci0JCQlpZiAobmV3bWFyayAhPSAqY3RtYXJrKSB7Ci0JCQkJKmN0bWFyayA9IG5ld21hcms7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotCQkJCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssICpwc2tiKTsKLSNlbHNlCisJCQluZXdtYXJrID0gKGN0LT5tYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8IG1hcmtpbmZvLT5tYXJrOworCQkJaWYgKG5ld21hcmsgIT0gY3QtPm1hcmspIHsKKwkJCQljdC0+bWFyayA9IG5ld21hcms7CiAJCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgKnBza2IpOwotI2VuZGlmCiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBYVF9DT05OTUFSS19TQVZFOgotCQkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8CisJCQluZXdtYXJrID0gKGN0LT5tYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8CiAJCQkJICAoKCpwc2tiKS0+bWFyayAmIG1hcmtpbmZvLT5tYXNrKTsKLQkJCWlmICgqY3RtYXJrICE9IG5ld21hcmspIHsKLQkJCQkqY3RtYXJrID0gbmV3bWFyazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0JCQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgKnBza2IpOwotI2Vsc2UKKwkJCWlmIChjdC0+bWFyayAhPSBuZXdtYXJrKSB7CisJCQkJY3QtPm1hcmsgPSBuZXdtYXJrOwogCQkJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssICpwc2tiKTsKLSNlbmRpZgogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTk1BUktfUkVTVE9SRToKIAkJCW1hcmsgPSAoKnBza2IpLT5tYXJrOwotCQkJZGlmZiA9ICgqY3RtYXJrIF4gbWFyaykgJiBtYXJraW5mby0+bWFzazsKKwkJCWRpZmYgPSAoY3QtPm1hcmsgXiBtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOwogCQkJKCpwc2tiKS0+bWFyayA9IG1hcmsgXiBkaWZmOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYwppbmRleCAxYWIwZGI2Li44MWMwYzU4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KIAogI2RlZmluZSBQRlggIkNPTk5TRUNNQVJLOiAiCiAKQEAgLTM2LDEyICszNiwxMiBAQAogc3RhdGljIHZvaWQgc2VjbWFya19zYXZlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHNrYi0+c2VjbWFyaykgewotCQl1MzIgKmNvbm5zZWNtYXJrOworCQlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCi0JCWNvbm5zZWNtYXJrID0gbmZfY3RfZ2V0X3NlY21hcmsoc2tiLCAmY3RpbmZvKTsKLQkJaWYgKGNvbm5zZWNtYXJrICYmICEqY29ubnNlY21hcmspCi0JCQkqY29ubnNlY21hcmsgPSBza2ItPnNlY21hcms7CisJCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJCWlmIChjdCAmJiAhY3QtPnNlY21hcmspCisJCQljdC0+c2VjbWFyayA9IHNrYi0+c2VjbWFyazsKIAl9CiB9CiAKQEAgLTUyLDEyICs1MiwxMiBAQAogc3RhdGljIHZvaWQgc2VjbWFya19yZXN0b3JlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKCFza2ItPnNlY21hcmspIHsKLQkJdTMyICpjb25uc2VjbWFyazsKKwkJc3RydWN0IG5mX2Nvbm4gKmN0OwogCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAotCQljb25uc2VjbWFyayA9IG5mX2N0X2dldF9zZWNtYXJrKHNrYiwgJmN0aW5mbyk7Ci0JCWlmIChjb25uc2VjbWFyayAmJiAqY29ubnNlY21hcmspCi0JCQlza2ItPnNlY21hcmsgPSAqY29ubnNlY21hcms7CisJCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJCWlmIChjdCAmJiBjdC0+c2VjbWFyaykKKwkJCXNrYi0+c2VjbWFyayA9IGN0LT5zZWNtYXJrOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9EU0NQLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0RTQ1AuYwppbmRleCBhN2NjNzVhLi45ZjJmMjIwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0RTQ1AuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0RTQ1AuYwpAQCAtOCw4ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFNlZSBSRkMyNDc0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBEU0NQIGZpZWxkIHdpdGhpbiB0aGUgSVAgSGVhZGVyLgotICoKLSAqIHh0X0RTQ1AuYyx2IDEuOCAyMDAyLzA4LzA2IDE4OjQxOjU3IGxhZm9yZ2UgRXhwCiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNSwxMyArMzMsMTMgQEAKIAkJCSAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewogCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmRpbmZvID0gdGFyZ2luZm87Ci0JdV9pbnQ4X3QgZHNjcCA9IGlwdjRfZ2V0X2RzZmllbGQoKCpwc2tiKS0+bmguaXBoKSA+PiBYVF9EU0NQX1NISUZUOworCXVfaW50OF90IGRzY3AgPSBpcHY0X2dldF9kc2ZpZWxkKGlwX2hkcigqcHNrYikpID4+IFhUX0RTQ1BfU0hJRlQ7CiAKIAlpZiAoZHNjcCAhPSBkaW5mby0+ZHNjcCkgewogCQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJCXJldHVybiBORl9EUk9QOwogCi0JCWlwdjRfY2hhbmdlX2RzZmllbGQoKCpwc2tiKS0+bmguaXBoLCAoX191OCkoflhUX0RTQ1BfTUFTSyksCisJCWlwdjRfY2hhbmdlX2RzZmllbGQoaXBfaGRyKCpwc2tiKSwgKF9fdTgpKH5YVF9EU0NQX01BU0spLAogCQkJCSAgICBkaW5mby0+ZHNjcCA8PCBYVF9EU0NQX1NISUZUKTsKIAogCX0KQEAgLTU2LDEzICs1NCwxMyBAQAogCQkJICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewogCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmRpbmZvID0gdGFyZ2luZm87Ci0JdV9pbnQ4X3QgZHNjcCA9IGlwdjZfZ2V0X2RzZmllbGQoKCpwc2tiKS0+bmguaXB2NmgpID4+IFhUX0RTQ1BfU0hJRlQ7CisJdV9pbnQ4X3QgZHNjcCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2Nl9oZHIoKnBza2IpKSA+PiBYVF9EU0NQX1NISUZUOwogCiAJaWYgKGRzY3AgIT0gZGluZm8tPmRzY3ApIHsKIAkJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJCXJldHVybiBORl9EUk9QOwogCi0JCWlwdjZfY2hhbmdlX2RzZmllbGQoKCpwc2tiKS0+bmguaXB2NmgsIChfX3U4KSh+WFRfRFNDUF9NQVNLKSwKKwkJaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2X2hkcigqcHNrYiksIChfX3U4KSh+WFRfRFNDUF9NQVNLKSwKIAkJCQkgICAgZGluZm8tPmRzY3AgPDwgWFRfRFNDUF9TSElGVCk7CiAJfQogCXJldHVybiBYVF9DT05USU5VRTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jIGIvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKaW5kZXggYjg3NGEyMC4uNTA4NWZiMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoImlwdF9OT1RSQUNLIik7CkBAIC0yNiw3ICsyNiw3IEBACiAJICAgSWYgdGhlcmUgaXMgYSByZWFsIGN0IGVudHJ5IGNvcnJlc3BvbmRpZyB0byB0aGlzIHBhY2tldCwKIAkgICBpdCdsbCBoYW5nIGFyb3VuIHRpbGwgdGltaW5nIG91dC4gV2UgZG9uJ3QgZGVhbCB3aXRoIGl0CiAJICAgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEpLICovCi0JbmZfY3RfdW50cmFjaygqcHNrYik7CisJKCpwc2tiKS0+bmZjdCA9ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7CiAJKCpwc2tiKS0+bmZjdGluZm8gPSBJUF9DVF9ORVc7CiAJbmZfY29ubnRyYWNrX2dldCgoKnBza2IpLT5uZmN0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKaW5kZXggZGI3ZTM4Yy4uMTVmZThmNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybiAtMTsKIAogCXRjcGxlbiA9ICgqcHNrYiktPmxlbiAtIHRjcGhvZmY7Ci0JdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCgqcHNrYiktPm5oLnJhdyArIHRjcGhvZmYpOworCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoKnBza2IpICsgdGNwaG9mZik7CiAKIAkvKiBTaW5jZSBpdCBwYXNzZWQgZmxhZ3MgdGVzdCBpbiB0Y3AgbWF0Y2gsIHdlIGtub3cgaXQgaXMgaXMKIAkgICBub3QgYSBmcmFnbWVudCwgYW5kIGhhcyBkYXRhID49IHRjcCBoZWFkZXIgbGVuZ3RoLiAgU1lOCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJCXJldHVybiAtMTsKIAkJa2ZyZWVfc2tiKCpwc2tiKTsKIAkJKnBza2IgPSBuZXdza2I7Ci0JCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bob2ZmKTsKKwkJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcigqcHNrYikgKyB0Y3Bob2ZmKTsKIAl9CiAKIAlza2JfcHV0KCgqcHNrYiksIFRDUE9MRU5fTVNTKTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQkgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAJX19iZTE2IG5ld2xlbjsKIAlpbnQgcmV0OwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAJaWYgKHJldCA+IDApIHsKLQkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoKnBza2IpOwogCQluZXdsZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pICsgcmV0KTsKIAkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaXBoLT50b3RfbGVuLCBuZXdsZW4pOwogCQlpcGgtPnRvdF9sZW4gPSBuZXdsZW47CkBAIC0xNzEsNyArMTcxLDcgQEAKIAkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKCpwc2tiKS0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoKnBza2IpOwogCXU4IG5leHRoZHI7CiAJaW50IHRjcGhvZmY7CiAJaW50IHJldDsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gTkZfRFJPUDsKIAlpZiAocmV0ID4gMCkgewotCQlpcHY2aCA9ICgqcHNrYiktPm5oLmlwdjZoOworCQlpcHY2aCA9IGlwdjZfaGRyKCpwc2tiKTsKIAkJaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMobnRvaHMoaXB2NmgtPnBheWxvYWRfbGVuKSArIHJldCk7CiAJfQogCXJldHVybiBYVF9DT05USU5VRTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCmluZGV4IDVlMzJkZmEuLjgwNGFmZTUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwpAQCAtMSwyMCArMSwxMSBAQAogLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGJ5dGUgY291bnRlci4KICAqIEdQTCAoQykgMjAwMiBNYXJ0aW4gRGV2ZXJhIChkZXZpa0BjZGkuY3opLgotICoKLSAqIDIwMDQtMDctMjAgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKiAJLSByZWltcGxlbWVudGVkIHRvIHVzZSBwZXItY29ubmVjdGlvbiBhY2NvdW50aW5nIGNvdW50ZXJzCi0gKiAJLSBhZGQgZnVuY3Rpb25hbGl0eSB0byBtYXRjaCBudW1iZXIgb2YgcGFja2V0cwotICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggYXZlcmFnZSBwYWNrZXQgc2l6ZQotICogCS0gYWRkIHN1cHBvcnQgdG8gbWF0Y2ggZGlyZWN0aW9ucyBzZXBlcmF0ZWx5Ci0gKiAyMDA1LTEwLTE2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICogCS0gUG9ydCB0byB4X3RhYmxlcwotICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgpAQCAtMjQsMjIgKzE1LDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIG1hdGNoaW5nIG51bWJlciBvZiBwa3RzL2J5dGVzIHBlciBjb25uZWN0aW9uIik7CiBNT0RVTEVfQUxJQVMoImlwdF9jb25uYnl0ZXMiKTsKIAotLyogNjRiaXQgZGl2aXNvciwgZGl2aWRlbmQgYW5kIHJlc3VsdC4gZHluYW1pYyBwcmVjaXNpb24gKi8KLXN0YXRpYyB1X2ludDY0X3QgZGl2NjRfNjQodV9pbnQ2NF90IGRpdmlkZW5kLCB1X2ludDY0X3QgZGl2aXNvcikKLXsKLQl1X2ludDMyX3QgZCA9IGRpdmlzb3I7Ci0KLQlpZiAoZGl2aXNvciA+IDB4ZmZmZmZmZmZVTEwpIHsKLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gZmxzKGRpdmlzb3IgPj4gMzIpOwotCi0JCWQgPSBkaXZpc29yID4+IHNoaWZ0OwotCQlkaXZpZGVuZCA+Pj0gc2hpZnQ7Ci0JfQotCi0JZG9fZGl2KGRpdmlkZW5kLCBkKTsKLQlyZXR1cm4gZGl2aWRlbmQ7Ci19Ci0KIHN0YXRpYyBpbnQKIG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCkBAIC01MSwxMyArMjYsMTcgQEAKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1X2ludDY0X3Qgd2hhdCA9IDA7CS8qIGluaXRpYWxpemUgdG8gbWFrZSBnY2MgaGFwcHkgKi8KIAl1X2ludDY0X3QgYnl0ZXMgPSAwOwogCXVfaW50NjRfdCBwa3RzID0gMDsKIAljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2NvdW50ZXIgKmNvdW50ZXJzOwogCi0JaWYgKCEoY291bnRlcnMgPSBuZl9jdF9nZXRfY291bnRlcnMoc2tiKSkpCi0JCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJaWYgKCFjdCkKKwkJcmV0dXJuIDA7CisJY291bnRlcnMgPSBjdC0+Y291bnRlcnM7CiAKIAlzd2l0Y2ggKHNpbmZvLT53aGF0KSB7CiAJY2FzZSBYVF9DT05OQllURVNfUEtUUzoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwppbmRleCAzNmMyZGVmLi5lMTgwMzI1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCkBAIC0yMSwxNiArMjEsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIGNvbm5tYXJrIG1hdGNoIG1vZHVsZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJpcHRfY29ubm1hcmsiKTsKIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtNDIsMTIgKzQxLDE0IEBACiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQzMl90IGN0aW5mbzsKLQljb25zdCB1X2ludDMyX3QgKmN0bWFyayA9IG5mX2N0X2dldF9tYXJrKHNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdG1hcmspCisJc3RydWN0IG5mX2Nvbm4gKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCisJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKKwlpZiAoIWN0KQogCQlyZXR1cm4gMDsKIAotCXJldHVybiAoKCgqY3RtYXJrKSAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OworCXJldHVybiAoKChjdC0+bWFyaykgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKaW5kZXggMjg4NWMzNy4uZjRlYThmZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0xMCwxMjEgKzEwLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdHVwbGUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIG1vZHVsZSIpOwogTU9EVUxFX0FMSUFTKCJpcHRfY29ubnRyYWNrIik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOwotCi0jZGVmaW5lIEZXSU5WKGJvb2wsIGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQlpZiAoY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKLQllbHNlIGlmIChjdCkKLQkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7Ci0JZWxzZQotCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOwotCi0JaWYgKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFURSkgewotCQlpZiAoY3QpIHsKLQkJCWlmICh0ZXN0X2JpdChJUFNfU1JDX05BVF9CSVQsICZjdC0+c3RhdHVzKSkKLQkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKLQkJCWlmICh0ZXN0X2JpdChJUFNfRFNUX05BVF9CSVQsICZjdC0+c3RhdHVzKSkKLQkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfRE5BVDsKLQkJfQotCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwKLQkJCSAgWFRfQ09OTlRSQUNLX1NUQVRFKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmIChjdCA9PSBOVUxMKSB7Ci0JCWlmIChzaW5mby0+ZmxhZ3MgJiB+WFRfQ09OTlRSQUNLX1NUQVRFKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUFJPVE8gJiYKLQkgICAgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPQotCQkgIHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwKLQkJICBYVF9DT05OVFJBQ0tfUFJPVE8pKQotCQlyZXR1cm4gMDsKLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQyAmJgotCSAgICBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCAmCi0JCSAgIHNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9Ci0JCSAgc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uc3JjLmlwLAotCQkgIFhUX0NPTk5UUkFDS19PUklHU1JDKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdEU1QgJiYKLQkgICAgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAgJgotCQkgICBzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPQotCQkgIHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5pcCwKLQkJICBYVF9DT05OVFJBQ0tfT1JJR0RTVCkpCi0JCXJldHVybiAwOwotCi0JaWYgKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMU1JDICYmCi0JICAgIEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwICYKLQkJICAgc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0KLQkJICBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsCi0JCSAgWFRfQ09OTlRSQUNLX1JFUExTUkMpKQotCQlyZXR1cm4gMDsKLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCAmJgotCSAgICBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCAmCi0JCSAgIHNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9Ci0JCSAgc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uZHN0LmlwLAotCQkgIFhUX0NPTk5UUkFDS19SRVBMRFNUKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRVUyAmJgotCSAgICBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLAotCQkgIFhUX0NPTk5UUkFDS19TVEFUVVMpKQotCQlyZXR1cm4gMDsKLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfRVhQSVJFUykgewotCQl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkgPwotCQkJCQkoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMDsKLQotCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJgotCQkJICAgIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwKLQkJCSAgWFRfQ09OTlRSQUNLX0VYUElSRVMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi0jZWxzZSAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLICovCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtMjIwLDggKzExNCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfTkZfSVBfQ09OTlRSQUNLICovCi0KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAogCSAgIGNvbnN0IHZvaWQgKmlwLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9kc2NwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYwppbmRleCAyNmM3ZjRhLi41NmIyNDdlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYwpAQCAtMSw3ICsxLDUgQEAKIC8qIElQIHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiB0aGUgSVB2NC9JUHY2IERTQ1AgZmllbGQKICAqCi0gKiB4dF9kc2NwLmMsdiAxLjMgMjAwMi8wOC8wNSAxOTowMDoyMSBsYWZvcmdlIEV4cAotICoKICAqIChDKSAyMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zNCw3ICszMiw3IEBACiAJCSBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2RzY3BfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDhfdCBkc2NwID0gaXB2NF9nZXRfZHNmaWVsZChza2ItPm5oLmlwaCkgPj4gWFRfRFNDUF9TSElGVDsKKwl1X2ludDhfdCBkc2NwID0gaXB2NF9nZXRfZHNmaWVsZChpcF9oZHIoc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKIAogCXJldHVybiAoZHNjcCA9PSBpbmZvLT5kc2NwKSBeICEhaW5mby0+aW52ZXJ0OwogfQpAQCAtNDksNyArNDcsNyBAQAogCQkgIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgeHRfZHNjcF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50OF90IGRzY3AgPSBpcHY2X2dldF9kc2ZpZWxkKHNrYi0+bmguaXB2NmgpID4+IFhUX0RTQ1BfU0hJRlQ7CisJdV9pbnQ4X3QgZHNjcCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2Nl9oZHIoc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKIAogCXJldHVybiAoZHNjcCA9PSBpbmZvLT5kc2NwKSBeICEhaW5mby0+aW52ZXJ0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKaW5kZXggOWYzN2Q1OS4uZDMwNDNmYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCkBAIC0yMTYsMTAgKzIxNiw4IEBACiAJaGluZm8tPnBkZS0+cHJvY19mb3BzID0gJmRsX2ZpbGVfb3BzOwogCWhpbmZvLT5wZGUtPmRhdGEgPSBoaW5mbzsKIAotCWluaXRfdGltZXIoJmhpbmZvLT50aW1lcik7CisJc2V0dXBfdGltZXIoJmhpbmZvLT50aW1lciwgaHRhYmxlX2djLCAodW5zaWduZWQgbG9uZyApaGluZm8pOwogCWhpbmZvLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5nY19pbnRlcnZhbCk7Ci0JaGluZm8tPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApaGluZm87Ci0JaGluZm8tPnRpbWVyLmZ1bmN0aW9uID0gaHRhYmxlX2djOwogCWFkZF90aW1lcigmaGluZm8tPnRpbWVyKTsKIAogCXNwaW5fbG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOwpAQCAtMzgwLDIyICszNzgsMjIgQEAKIAlzd2l0Y2ggKGhpbmZvLT5mYW1pbHkpIHsKIAljYXNlIEFGX0lORVQ6CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9ESVApCi0JCQlkc3QtPmFkZHIuaXAuZHN0ID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCQkJZHN0LT5hZGRyLmlwLmRzdCA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAkJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9IQVNIX1NJUCkKLQkJCWRzdC0+YWRkci5pcC5zcmMgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCQlkc3QtPmFkZHIuaXAuc3JjID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCiAJCWlmICghKGhpbmZvLT5jZmcubW9kZSAmCiAJCSAgICAgIChYVF9IQVNITElNSVRfSEFTSF9EUFQgfCBYVF9IQVNITElNSVRfSEFTSF9TUFQpKSkKIAkJCXJldHVybiAwOwotCQluZXh0aGRyID0gc2tiLT5uaC5pcGgtPnByb3RvY29sOworCQluZXh0aGRyID0gaXBfaGRyKHNrYiktPnByb3RvY29sOwogCQlicmVhazsKICNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCiAJY2FzZSBBRl9JTkVUNjoKIAkJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9IQVNIX0RJUCkKLQkJCW1lbWNweSgmZHN0LT5hZGRyLmlwNi5kc3QsICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCW1lbWNweSgmZHN0LT5hZGRyLmlwNi5kc3QsICZpcHY2X2hkcihza2IpLT5kYWRkciwKIAkJCSAgICAgICBzaXplb2YoZHN0LT5hZGRyLmlwNi5kc3QpKTsKIAkJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9IQVNIX1NJUCkKLQkJCW1lbWNweSgmZHN0LT5hZGRyLmlwNi5zcmMsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCW1lbWNweSgmZHN0LT5hZGRyLmlwNi5zcmMsICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCSAgICAgICBzaXplb2YoZHN0LT5hZGRyLmlwNi5zcmMpKTsKIAogCQlpZiAoIShoaW5mby0+Y2ZnLm1vZGUgJgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKaW5kZXggNDA3ZDFkNS4uYzEzOWIyZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCkBAIC01LDI2ICs1LDE2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICAgMTkgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46Ci0gKiAgIAkJIC0gUG9ydCB0byBuZXduYXQgaW5mcmFzdHJ1Y3R1cmUKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2Vsc2UKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtMzgsNTUgKzI4LDYgQEAKICNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OwotCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdCkgewotCQlERUJVR1AoInh0X2hlbHBlcjogRWVrISBpbnZhbGlkIGNvbm50cmFjaz9cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghY3QtPm1hc3RlcikgewotCQlERUJVR1AoInh0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpZiAoIWN0LT5tYXN0ZXItPmhlbHBlcikgewotCQlERUJVR1AoInh0X2hlbHBlcjogbWFzdGVyIGN0ICVwIGhhcyBubyBoZWxwZXJcbiIsCi0JCQlleHAtPmV4cGVjdGFudCk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlERUJVR1AoIm1hc3RlcidzIG5hbWUgPSAlcyAsIGluZm8tPm5hbWUgPSAlc1xuIiwKLQkJY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lLCBpbmZvLT5uYW1lKTsKLQotCWlmIChpbmZvLT5uYW1lWzBdID09ICdcMCcpCi0JCXJldCBePSAxOwotCWVsc2UKLQkJcmV0IF49ICFzdHJuY21wKGN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSwgaW5mby0+bmFtZSwKLQkJCQlzdHJsZW4oY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lKSk7Ci1vdXRfdW5sb2NrOgotCXJlYWRfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDSyAqLwotCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtMTM0LDcgKzc1LDYgQEAKIAlyZWFkX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCXJldHVybiByZXQ7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCiAJCSBjb25zdCB2b2lkICppbmYsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jIGIvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYwppbmRleCAzMmZiOTk4Li43NzI4OGM1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXBoLT50b3RfbGVuKTsKKwl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoaXBfaGRyKHNrYiktPnRvdF9sZW4pOwogCiAJcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OwogfQpAQCAtNDcsNyArNDcsOCBAQAogICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJY29uc3QgdV9pbnQxNl90IHBrdGxlbiA9IChudG9ocyhpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbikgKworCQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAKIAlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKaW5kZXggNmZkODM0Ny4uNTcxYTcyYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYwpAQCAtMSwxMCArMSwzIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIGNvbnRyb2wgdGhlIHJhdGUKLSAqCi0gKiAyIFNlcHRlbWJlciAxOTk5OiBDaGFuZ2VkIGZyb20gdGhlIHRhcmdldCBSQVRFIHRvIHRoZSBtYXRjaAotICogICAgICAgICAgICAgICAgICAgYGxpbWl0JywgcmVtb3ZlZCBsb2dnaW5nLiAgRGlkIEkgbWVudGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICBBbGV4ZXkgaXMgYSBmdWNraW5nIGdlbml1cz8KLSAqICAgICAgICAgICAgICAgICAgIFJ1c3R5IFJ1c3NlbGwgKHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdSkuICAqLwotCiAvKiAoQykgMTk5OSBK6XL0bWUgZGUgVml2aWUgPGRldml2aWVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KICAqIChDKSAxOTk5IEhlcnbpIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogICoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jCmluZGV4IGQ0MzBkOTAuLjFkM2ExZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tYWMuYwpAQCAtMzcsOCArMzcsOCBAQAogICAgIGNvbnN0IHN0cnVjdCB4dF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogICAgIC8qIElzIG1hYyBwb2ludGVyIHZhbGlkPyAqLwotICAgIHJldHVybiAoc2tiLT5tYWMucmF3ID49IHNrYi0+aGVhZAotCSAgICAmJiAoc2tiLT5tYWMucmF3ICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YQorICAgIHJldHVybiAoc2tiX21hY19oZWFkZXIoc2tiKSA+PSBza2ItPmhlYWQgJiYKKwkgICAgKHNrYl9tYWNfaGVhZGVyKHNrYikgKyBFVEhfSExFTikgPD0gc2tiLT5kYXRhCiAJICAgIC8qIElmIHNvLCBjb21wYXJlLi4uICovCiAJICAgICYmICgoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfc291cmNlLCBpbmZvLT5zcmNhZGRyKSkKIAkJXiBpbmZvLT5pbnZlcnQpKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKaW5kZXggMTZlN2IwOC4uZTE0MDlmYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAljb25zdCBzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0xPT1BCQUNLKQotCQl0eXBlID0gKE1VTFRJQ0FTVChza2ItPm5oLmlwaC0+ZGFkZHIpCisJCXR5cGUgPSAoTVVMVElDQVNUKGlwX2hkcihza2IpLT5kYWRkcikKIAkJCT8gUEFDS0VUX01VTFRJQ0FTVAogCQkJOiBQQUNLRVRfQlJPQURDQVNUKTsKIAllbHNlCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKaW5kZXggOTdmZmMyZi4uYzIwMTdmOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYwpAQCAtMSw3ICsxLDUgQEAKIC8qIElQIHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSByb3V0aW5nIHJlYWxtCiAgKgotICogJElkOiBpcHRfcmVhbG0uYyx2IDEuMyAyMDA0LzAzLzA1IDEzOjI1OjQwIGxhZm9yZ2UgRXhwICQKLSAqCiAgKiAoQykgMjAwMyBieSBTYW1wc2EgUmFudGEgPHNhbXBzYUBuZXRzb25pYy5maT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCmluZGV4IGRmMzdiOTEuLjE0OTI5NGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKQEAgLTEwLDcgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmg+CiAKQEAgLTM2LDcgKzM2LDcgQEAKIAogCWlmIChuZl9jdF9pc191bnRyYWNrZWQoc2tiKSkKIAkJc3RhdGViaXQgPSBYVF9TVEFURV9VTlRSQUNLRUQ7Ci0JZWxzZSBpZiAoIW5mX2N0X2dldF9jdGluZm8oc2tiLCAmY3RpbmZvKSkKKwllbHNlIGlmICghbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbykpCiAJCXN0YXRlYml0ID0gWFRfU1RBVEVfSU5WQUxJRDsKIAllbHNlCiAJCXN0YXRlYml0ID0gWFRfU1RBVEVfQklUKGN0aW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggYzQ4YjBmNDkuLjQyZDJmYjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9zY20uaD4KQEAgLTc2LDcgKzc3LDggQEAKIAl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwogCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrCSpjYjsKLQlzcGlubG9ja190CQljYl9sb2NrOworCXN0cnVjdCBtdXRleAkJKmNiX211dGV4OworCXN0cnVjdCBtdXRleAkJY2JfZGVmX211dGV4OwogCXZvaWQJCQkoKmRhdGFfcmVhZHkpKHN0cnVjdCBzb2NrICpzaywgaW50IGJ5dGVzKTsKIAlzdHJ1Y3QgbW9kdWxlCQkqbW9kdWxlOwogfTsKQEAgLTEwOCw2ICsxMTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgKmxpc3RlbmVyczsKIAl1bnNpZ25lZCBpbnQgbmxfbm9ucm9vdDsKIAl1bnNpZ25lZCBpbnQgZ3JvdXBzOworCXN0cnVjdCBtdXRleCAqY2JfbXV0ZXg7CiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlOwogCWludCByZWdpc3RlcmVkOwogfTsKQEAgLTExOCw2ICsxMjEsNyBAQAogCiBzdGF0aWMgaW50IG5ldGxpbmtfZHVtcChzdHJ1Y3Qgc29jayAqc2spOwogc3RhdGljIHZvaWQgbmV0bGlua19kZXN0cm95X2NhbGxiYWNrKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CitzdGF0aWMgdm9pZCBuZXRsaW5rX3F1ZXVlX3NraXAoc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhubF90YWJsZV9sb2NrKTsKIHN0YXRpYyBhdG9taWNfdCBubF90YWJsZV91c2VycyA9IEFUT01JQ19JTklUKDApOwpAQCAtMzcwLDcgKzM3NCw4IEBACiAJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBuZXRsaW5rX3NvY2spLAogfTsKIAotc3RhdGljIGludCBfX25ldGxpbmtfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3N0YXRpYyBpbnQgX19uZXRsaW5rX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXV0ZXggKmNiX211dGV4LAorCQkJICAgIGludCBwcm90b2NvbCkKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrOwpAQCAtMzg0LDcgKzM4OSwxMiBAQAogCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKIAogCW5sayA9IG5sa19zayhzayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm5say0+Y2JfbG9jayk7CisJaWYgKGNiX211dGV4KQorCQlubGstPmNiX211dGV4ID0gY2JfbXV0ZXg7CisJZWxzZSB7CisJCW5say0+Y2JfbXV0ZXggPSAmbmxrLT5jYl9kZWZfbXV0ZXg7CisJCW11dGV4X2luaXQobmxrLT5jYl9tdXRleCk7CisJfQogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5say0+d2FpdCk7CiAKIAlzay0+c2tfZGVzdHJ1Y3QgPSBuZXRsaW5rX3NvY2tfZGVzdHJ1Y3Q7CkBAIC0zOTUsOCArNDA1LDggQEAKIHN0YXRpYyBpbnQgbmV0bGlua19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7CisJc3RydWN0IG11dGV4ICpjYl9tdXRleDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7Ci0JdW5zaWduZWQgaW50IGdyb3VwczsKIAlpbnQgZXJyID0gMDsKIAogCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CkBAIC00MTgsMTAgKzQyOCwxMCBAQAogCWlmIChubF90YWJsZVtwcm90b2NvbF0ucmVnaXN0ZXJlZCAmJgogCSAgICB0cnlfbW9kdWxlX2dldChubF90YWJsZVtwcm90b2NvbF0ubW9kdWxlKSkKIAkJbW9kdWxlID0gbmxfdGFibGVbcHJvdG9jb2xdLm1vZHVsZTsKLQlncm91cHMgPSBubF90YWJsZVtwcm90b2NvbF0uZ3JvdXBzOworCWNiX211dGV4ID0gbmxfdGFibGVbcHJvdG9jb2xdLmNiX211dGV4OwogCW5ldGxpbmtfdW5sb2NrX3RhYmxlKCk7CiAKLQlpZiAoKGVyciA9IF9fbmV0bGlua19jcmVhdGUoc29jaywgcHJvdG9jb2wpKSA8IDApCisJaWYgKChlcnIgPSBfX25ldGxpbmtfY3JlYXRlKHNvY2ssIGNiX211dGV4LCBwcm90b2NvbCkpIDwgMCkKIAkJZ290byBvdXRfbW9kdWxlOwogCiAJbmxrID0gbmxrX3NrKHNvY2stPnNrKTsKQEAgLTQ0NiwxNCArNDU2LDE0IEBACiAJc29ja19vcnBoYW4oc2spOwogCW5sayA9IG5sa19zayhzayk7CiAKLQlzcGluX2xvY2soJm5say0+Y2JfbG9jayk7CisJbXV0ZXhfbG9jayhubGstPmNiX211dGV4KTsKIAlpZiAobmxrLT5jYikgewogCQlpZiAobmxrLT5jYi0+ZG9uZSkKIAkJCW5say0+Y2ItPmRvbmUobmxrLT5jYik7CiAJCW5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhubGstPmNiKTsKIAkJbmxrLT5jYiA9IE5VTEw7CiAJfQotCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X3VubG9jayhubGstPmNiX211dGV4KTsKIAogCS8qIE9LLiBTb2NrZXQgaXMgdW5saW5rZWQsIGFuZCwgdGhlcmVmb3JlLAogCSAgIG5vIG5ldyBwYWNrZXRzIHdpbGwgYXJyaXZlICovCkBAIC0xMjE1LDcgKzEyMjUsNyBAQAogCQljb3BpZWQgPSBsZW47CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCiAJaWYgKG1zZy0+bXNnX25hbWUpIHsKQEAgLTEyNDIsNiArMTI1Miw5IEBACiAKIAlzY21fcmVjdihzb2NrLCBtc2csIHNpb2NiLT5zY20sIGZsYWdzKTsKIAorCWlmIChmbGFncyAmIE1TR19UUlVOQykKKwkJY29waWVkID0gc2tiLT5sZW47CisKIG91dDoKIAluZXRsaW5rX3Jjdl93YWtlKHNrKTsKIAlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7CkBAIC0xMjY1LDcgKzEyNzgsNyBAQAogc3RydWN0IHNvY2sgKgogbmV0bGlua19rZXJuZWxfY3JlYXRlKGludCB1bml0LCB1bnNpZ25lZCBpbnQgZ3JvdXBzLAogCQkgICAgICB2b2lkICgqaW5wdXQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiksCi0JCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKKwkJICAgICAgc3RydWN0IG11dGV4ICpjYl9tdXRleCwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtMTI4MCw3ICsxMjkzLDcgQEAKIAlpZiAoc29ja19jcmVhdGVfbGl0ZShQRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCB1bml0LCAmc29jaykpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKF9fbmV0bGlua19jcmVhdGUoc29jaywgdW5pdCkgPCAwKQorCWlmIChfX25ldGxpbmtfY3JlYXRlKHNvY2ssIGNiX211dGV4LCB1bml0KSA8IDApCiAJCWdvdG8gb3V0X3NvY2tfcmVsZWFzZTsKIAogCWlmIChncm91cHMgPCAzMikKQEAgLTEzMDQsNiArMTMxNyw3IEBACiAJbmV0bGlua190YWJsZV9ncmFiKCk7CiAJbmxfdGFibGVbdW5pdF0uZ3JvdXBzID0gZ3JvdXBzOwogCW5sX3RhYmxlW3VuaXRdLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKKwlubF90YWJsZVt1bml0XS5jYl9tdXRleCA9IGNiX211dGV4OwogCW5sX3RhYmxlW3VuaXRdLm1vZHVsZSA9IG1vZHVsZTsKIAlubF90YWJsZVt1bml0XS5yZWdpc3RlcmVkID0gMTsKIAluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOwpAQCAtMTM0Niw3ICsxMzYwLDcgQEAKIAlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKLQlzcGluX2xvY2soJm5say0+Y2JfbG9jayk7CisJbXV0ZXhfbG9jayhubGstPmNiX211dGV4KTsKIAogCWNiID0gbmxrLT5jYjsKIAlpZiAoY2IgPT0gTlVMTCkgewpAQCAtMTM1Nyw3ICsxMzcxLDcgQEAKIAlsZW4gPSBjYi0+ZHVtcChza2IsIGNiKTsKIAogCWlmIChsZW4gPiAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCQltdXRleF91bmxvY2sobmxrLT5jYl9tdXRleCk7CiAJCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIGxlbik7CiAJCXJldHVybiAwOwpAQCAtMTM3NSwxMyArMTM4OSwxMyBAQAogCWlmIChjYi0+ZG9uZSkKIAkJY2ItPmRvbmUoY2IpOwogCW5say0+Y2IgPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X3VubG9jayhubGstPmNiX211dGV4KTsKIAogCW5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhjYik7CiAJcmV0dXJuIDA7CiAKIGVycm91dF9za2I6Ci0Jc3Bpbl91bmxvY2soJm5say0+Y2JfbG9jayk7CisJbXV0ZXhfdW5sb2NrKG5say0+Y2JfbXV0ZXgpOwogCWtmcmVlX3NrYihza2IpOwogZXJyb3V0OgogCXJldHVybiBlcnI7CkBAIC0xNDEzLDE5ICsxNDI3LDI0IEBACiAJfQogCW5sayA9IG5sa19zayhzayk7CiAJLyogQSBkdW1wIG9yIGRlc3RydWN0aW9uIGlzIGluIHByb2dyZXNzLi4uICovCi0Jc3Bpbl9sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X2xvY2sobmxrLT5jYl9tdXRleCk7CiAJaWYgKG5say0+Y2IgfHwgc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7Ci0JCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCQltdXRleF91bmxvY2sobmxrLT5jYl9tdXRleCk7CiAJCW5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhjYik7CiAJCXNvY2tfcHV0KHNrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJbmxrLT5jYiA9IGNiOwotCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X3VubG9jayhubGstPmNiX211dGV4KTsKIAogCW5ldGxpbmtfZHVtcChzayk7CiAJc29ja19wdXQoc2spOwotCXJldHVybiAwOworCisJLyogV2Ugc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYSBkdW1wLCBieSByZXR1cm5pbmcgLUVJTlRSIHdlCisJICogc2lnbmFsIHRoZSBxdWV1ZSBtYW5nZW1lbnQgdG8gaW50ZXJydXB0IHByb2Nlc3Npbmcgb2YKKwkgKiBhbnkgbmV0bGluayBtZXNzYWdlcyBzbyB1c2Vyc3BhY2UgZ2V0cyBhIGNoYW5jZSB0byByZWFkCisJICogdGhlIHJlc3VsdHMuICovCisJcmV0dXJuIC1FSU5UUjsKIH0KIAogdm9pZCBuZXRsaW5rX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50IGVycikKQEAgLTE0NjIsMjcgKzE0ODEsMzUgQEAKIH0KIAogc3RhdGljIGludCBuZXRsaW5rX3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqY2IpKHN0cnVjdCBza19idWZmICosCi0JCQkJCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqLCBpbnQgKikpCisJCQkJCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqKSkKIHsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlpbnQgZXJyOwogCiAJd2hpbGUgKHNrYi0+bGVuID49IG5sbXNnX3RvdGFsX3NpemUoMCkpIHsKLQkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKSBza2ItPmRhdGE7CisJCW5saCA9IG5sbXNnX2hkcihza2IpOworCQllcnIgPSAwOwogCiAJCWlmIChubGgtPm5sbXNnX2xlbiA8IE5MTVNHX0hEUkxFTiB8fCBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKGNiKHNrYiwgbmxoLCAmZXJyKSA8IDApIHsKLQkJCS8qIE5vdCBhbiBlcnJvciwgYnV0IHdlIGhhdmUgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcKLQkJCSAqIGhlcmUuIE5vdGU6IHRoYXQgaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBwdWxsCi0JCQkgKiBtZXNzYWdlIGZyb20gc2tiLCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBsYXRlci4KLQkJCSAqLwotCQkJaWYgKGVyciA9PSAwKQotCQkJCXJldHVybiAtMTsKKwkJLyogT25seSByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieSB0aGUga2VybmVsICovCisJCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVFVRVNUKSkKKwkJCWdvdG8gc2tpcDsKKworCQkvKiBTa2lwIGNvbnRyb2wgbWVzc2FnZXMgKi8KKwkJaWYgKG5saC0+bmxtc2dfdHlwZSA8IE5MTVNHX01JTl9UWVBFKQorCQkJZ290byBza2lwOworCisJCWVyciA9IGNiKHNrYiwgbmxoKTsKKwkJaWYgKGVyciA9PSAtRUlOVFIpIHsKKwkJCS8qIE5vdCBhbiBlcnJvciwgYnV0IHdlIGludGVycnVwdCBwcm9jZXNzaW5nICovCisJCQluZXRsaW5rX3F1ZXVlX3NraXAobmxoLCBza2IpOworCQkJcmV0dXJuIGVycjsKKwkJfQorc2tpcDoKKwkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BQ0sgfHwgZXJyKQogCQkJbmV0bGlua19hY2soc2tiLCBubGgsIGVycik7Ci0JCX0gZWxzZSBpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0FDSykKLQkJCW5ldGxpbmtfYWNrKHNrYiwgbmxoLCAwKTsKIAogCQluZXRsaW5rX3F1ZXVlX3NraXAobmxoLCBza2IpOwogCX0KQEAgLTE1MDQsOSArMTUzMSwxNCBAQAogICoKICAqIHFsZW4gbXVzdCBiZSBpbml0aWFsaXplZCB0byAwIGJlZm9yZSB0aGUgaW5pdGlhbCBlbnRyeSwgYWZ0ZXJ3YXJkcwogICogdGhlIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCBxbGVuIHJlYWNoZXMgMC4KKyAqCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IHJldHVybiAtRUlOVFIgdG8gc2lnbmFsIHRoYXQgcHJvY2Vzc2luZworICogb2YgbmV0bGluayBtZXNzYWdlcyBzaGFsbCBiZSBpbnRlcnJ1cHRlZC4gSW4gdGhpcyBjYXNlIHRoZSBtZXNzYWdlCisgKiBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgTk9UIGJlIHJlcXVldWVkIG9udG8gdGhlIHJlY2VpdmUKKyAqIHF1ZXVlLgogICovCiB2b2lkIG5ldGxpbmtfcnVuX3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50ICpxbGVuLAotCQkgICAgICAgaW50ICgqY2IpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBubG1zZ2hkciAqLCBpbnQgKikpCisJCSAgICAgICBpbnQgKCpjYikoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5sbXNnaGRyICopKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE1MzcsNyArMTU2OSw3IEBACiAgKiBQdWxscyB0aGUgZ2l2ZW4gbmV0bGluayBtZXNzYWdlIG9mZiB0aGUgc29ja2V0IGJ1ZmZlciBzbyB0aGUgbmV4dAogICogY2FsbCB0byBuZXRsaW5rX3F1ZXVlX3J1bigpIHdpbGwgbm90IHJlY29uc2lkZXIgdGhlIG1lc3NhZ2UuCiAgKi8KLXZvaWQgbmV0bGlua19xdWV1ZV9za2lwKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgbmV0bGlua19xdWV1ZV9za2lwKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBtc2dsZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7CiAKQEAgLTE4MjAsMTIgKzE4NTIsMTAgQEAKIAogRVhQT1JUX1NZTUJPTChuZXRsaW5rX2Fjayk7CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfcnVuX3F1ZXVlKTsKLUVYUE9SVF9TWU1CT0wobmV0bGlua19xdWV1ZV9za2lwKTsKIEVYUE9SVF9TWU1CT0wobmV0bGlua19icm9hZGNhc3QpOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX2R1bXBfc3RhcnQpOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX2tlcm5lbF9jcmVhdGUpOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX3JlZ2lzdGVyX25vdGlmaWVyKTsKLUVYUE9SVF9TWU1CT0wobmV0bGlua19zZXRfZXJyKTsKIEVYUE9SVF9TWU1CT0wobmV0bGlua19zZXRfbm9ucm9vdCk7CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfdW5pY2FzdCk7CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfdW5yZWdpc3Rlcl9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hdHRyLmMgYi9uZXQvbmV0bGluay9hdHRyLmMKaW5kZXggMDA0MTM5NS4uZGY1ZjgyMCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYXR0ci5jCisrKyBiL25ldC9uZXRsaW5rL2F0dHIuYwpAQCAtNjcsNiArNjcsMTEgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgTkxBX0JJTkFSWToKKwkJaWYgKHB0LT5sZW4gJiYgYXR0cmxlbiA+IHB0LT5sZW4pCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlpZiAocHQtPmxlbikKIAkJCW1pbmxlbiA9IHB0LT5sZW47CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IGMyOTk2NzkuLjZlMzEyMzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC0yOTUsNjYgKzI5NSw0NiBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgaW50IGdlbmxfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCSAgICAgICBpbnQgKmVycnApCitzdGF0aWMgaW50IGdlbmxfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKIAlzdHJ1Y3QgZ2VubF9vcHMgKm9wczsKIAlzdHJ1Y3QgZ2VubF9mYW1pbHkgKmZhbWlseTsKIAlzdHJ1Y3QgZ2VubF9pbmZvIGluZm87CiAJc3RydWN0IGdlbmxtc2doZHIgKmhkciA9IG5sbXNnX2RhdGEobmxoKTsKLQlpbnQgaGRybGVuLCBlcnIgPSAtRUlOVkFMOwotCi0JaWYgKCEobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUVVFU1QpKQotCQlnb3RvIGlnbm9yZTsKLQotCWlmIChubGgtPm5sbXNnX3R5cGUgPCBOTE1TR19NSU5fVFlQRSkKLQkJZ290byBpZ25vcmU7CisJaW50IGhkcmxlbiwgZXJyOwogCiAJZmFtaWx5ID0gZ2VubF9mYW1pbHlfZmluZF9ieWlkKG5saC0+bmxtc2dfdHlwZSk7Ci0JaWYgKGZhbWlseSA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwlpZiAoZmFtaWx5ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOwogCiAJaGRybGVuID0gR0VOTF9IRFJMRU4gKyBmYW1pbHktPmhkcnNpemU7CiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgbmxtc2dfbXNnX3NpemUoaGRybGVuKSkKLQkJZ290byBlcnJvdXQ7CisJCXJldHVybiAtRUlOVkFMOwogCiAJb3BzID0gZ2VubF9nZXRfY21kKGhkci0+Y21kLCBmYW1pbHkpOwotCWlmIChvcHMgPT0gTlVMTCkgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCWlmIChvcHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKChvcHMtPmZsYWdzICYgR0VOTF9BRE1JTl9QRVJNKSAmJiBzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwlpZiAoKG9wcy0+ZmxhZ3MgJiBHRU5MX0FETUlOX1BFUk0pICYmCisJICAgIHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7Ci0JCWlmIChvcHMtPmR1bXBpdCA9PSBOVUxMKSB7Ci0JCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJCWdvdG8gZXJyb3V0OwotCQl9CisJCWlmIChvcHMtPmR1bXBpdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCSplcnJwID0gZXJyID0gbmV0bGlua19kdW1wX3N0YXJ0KGdlbmxfc29jaywgc2tiLCBubGgsCi0JCQkJCQkgb3BzLT5kdW1waXQsIG9wcy0+ZG9uZSk7Ci0JCWlmIChlcnIgPT0gMCkKLQkJCXNrYl9wdWxsKHNrYiwgbWluKE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKSwKLQkJCQkJICBza2ItPmxlbikpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoZ2VubF9zb2NrLCBza2IsIG5saCwKKwkJCQkJICBvcHMtPmR1bXBpdCwgb3BzLT5kb25lKTsKIAl9CiAKLQlpZiAob3BzLT5kb2l0ID09IE5VTEwpIHsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwlpZiAob3BzLT5kb2l0ID09IE5VTEwpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChmYW1pbHktPmF0dHJidWYpIHsKIAkJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBoZHJsZW4sIGZhbWlseS0+YXR0cmJ1ZiwgZmFtaWx5LT5tYXhhdHRyLAogCQkJCSAgb3BzLT5wb2xpY3kpOwogCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3V0OworCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlpbmZvLnNuZF9zZXEgPSBubGgtPm5sbXNnX3NlcTsKQEAgLTM2NCwxNSArMzQ0LDcgQEAKIAlpbmZvLnVzZXJoZHIgPSBubG1zZ19kYXRhKG5saCkgKyBHRU5MX0hEUkxFTjsKIAlpbmZvLmF0dHJzID0gZmFtaWx5LT5hdHRyYnVmOwogCi0JKmVycnAgPSBlcnIgPSBvcHMtPmRvaXQoc2tiLCAmaW5mbyk7Ci0JcmV0dXJuIGVycjsKLQotaWdub3JlOgotCXJldHVybiAwOwotCi1lcnJvdXQ6Ci0JKmVycnAgPSBlcnI7Ci0JcmV0dXJuIC0xOworCXJldHVybiBvcHMtPmRvaXQoc2tiLCAmaW5mbyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbmxfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKQEAgLTU4Niw3ICs1NTgsNyBAQAogCiAJbmV0bGlua19zZXRfbm9ucm9vdChORVRMSU5LX0dFTkVSSUMsIE5MX05PTlJPT1RfUkVDVik7CiAJZ2VubF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfR0VORVJJQywgR0VOTF9NQVhfSUQsCi0JCQkJCSAgZ2VubF9yY3YsIFRISVNfTU9EVUxFKTsKKwkJCQkJICBnZW5sX3JjdiwgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmIChnZW5sX3NvY2sgPT0gTlVMTCkKIAkJcGFuaWMoIkdFTkw6IENhbm5vdCBpbml0aWFsaXplIGdlbmVyaWMgbmV0bGlua1xuIik7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCmluZGV4IGJmOTgzN2QuLjVkNGEyNmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKKysrIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpAQCAtNjI1LDQyICs2MjUsNDIgQEAKIAlheDI1X2FkZHJlc3MgKnNvdXJjZSA9IE5VTEw7CiAJYXgyNV91aWRfYXNzb2MgKnVzZXI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gMDsKIAogCWxvY2tfc29jayhzayk7CiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgewogCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIDA7CS8qIENvbm5lY3QgY29tcGxldGVkIGR1cmluZyBhIEVSRVNUQVJUU1lTIGV2ZW50ICovCisJCWdvdG8gb3V0X3JlbGVhc2U7CS8qIENvbm5lY3QgY29tcGxldGVkIGR1cmluZyBhIEVSRVNUQVJUU1lTIGV2ZW50ICovCiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgewogCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwotCQlyZWxlYXNlX3NvY2soc2spOwotCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgewotCQlyZWxlYXNlX3NvY2soc2spOwotCQlyZXR1cm4gLUVJU0NPTk47CS8qIE5vIHJlY29ubmVjdCBvbiBhIHNlcXBhY2tldCBzb2NrZXQgKi8KKwkJZXJyID0gLUVJU0NPTk47CS8qIE5vIHJlY29ubmVjdCBvbiBhIHNlcXBhY2tldCBzb2NrZXQgKi8KKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlzay0+c2tfc3RhdGUgICA9IFRDUF9DTE9TRTsKIAlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwogCiAJaWYgKGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSkgJiYgYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUpKSB7Ci0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAlpZiAoYWRkci0+c2F4MjVfZmFtaWx5ICE9IEFGX05FVFJPTSkgewotCQlyZWxlYXNlX3NvY2soc2spOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSB7CS8qIE11c3QgYmluZCBmaXJzdCAtIGF1dG9iaW5kaW5nIGluIHRoaXMgbWF5IG9yIG1heSBub3Qgd29yayAqLwogCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKIAogCQlpZiAoKGRldiA9IG5yX2Rldl9maXJzdCgpKSA9PSBOVUxMKSB7Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKwkJCWVyciA9IC1FTkVUVU5SRUFDSDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAkJc291cmNlID0gKGF4MjVfYWRkcmVzcyAqKWRldi0+ZGV2X2FkZHI7CiAKQEAgLTY3MSw4ICs2NzEsOCBAQAogCQl9IGVsc2UgewogCQkJaWYgKGF4MjVfdWlkX3BvbGljeSAmJiAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewogCQkJCWRldl9wdXQoZGV2KTsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRVBFUk07CisJCQkJZXJyID0gLUVQRVJNOworCQkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCQl9CiAJCQluci0+dXNlcl9hZGRyICAgPSAqc291cmNlOwogCQl9CkBAIC03MDcsOCArNzA3LDggQEAKIAogCS8qIE5vdyB0aGUgbG9vcCAqLwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEICYmIChmbGFncyAmIE9fTk9OQkxPQ0spKSB7Ci0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCXJldHVybiAtRUlOUFJPR1JFU1M7CisJCWVyciA9IC1FSU5QUk9HUkVTUzsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAkvKgpAQCAtNzE2LDQ2ICs3MTYsNDYgQEAKIAkgKiBjbG9zZWQuCiAJICovCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCQlERUZJTkVfV0FJVCh3YWl0KTsKIAotCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAkJZm9yICg7OykgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LAorCQkJICAgICAgICAgICAgICAgIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCkKIAkJCQlicmVhazsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOwogCQkJCXNjaGVkdWxlKCk7CiAJCQkJbG9ja19zb2NrKHNrKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKIAkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOwkvKiBBbHdheXMgc2V0IGF0IHRoaXMgcG9pbnQgKi8KKwkJZXJyID0gc29ja19lcnJvcihzayk7CS8qIEFsd2F5cyBzZXQgYXQgdGhpcyBwb2ludCAqLworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCitvdXRfcmVsZWFzZToKIAlyZWxlYXNlX3NvY2soc2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBucl9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNvY2sgKm5ld3NrOworCURFRklORV9XQUlUKHdhaXQpOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyID0gMDsKIApAQCAtNzY1LDQyICs3NjUsNDAgQEAKIAlsb2NrX3NvY2soc2spOwogCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCS8qCiAJICoJVGhlIHdyaXRlIHF1ZXVlIHRoaXMgdGltZSBpcyBob2xkaW5nIHNvY2tldHMgcmVhZHkgdG8gdXNlCiAJICoJaG9va2VkIGludG8gdGhlIFNBQk0gd2Ugc2F2ZWQKIAkgKi8KLQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAlmb3IgKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQlpZiAoc2tiKQogCQkJYnJlYWs7CiAKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXJlbGVhc2Vfc29jayhzayk7CiAJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQkJZXJyID0gLUVXT1VMREJMT0NLOworCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKSB7CisJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQlzY2hlZHVsZSgpOwogCQkJbG9ja19zb2NrKHNrKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZXJyID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKIAl9Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVsZWFzZTsKIAogCW5ld3NrID0gc2tiLT5zazsKIAluZXdzay0+c2tfc29ja2V0ID0gbmV3c29jazsKQEAgLTgxMSw4ICs4MDksOSBAQAogCXNrX2FjY2VwdHFfcmVtb3ZlZChzayk7CiAJbmV3c29jay0+c2sgPSBuZXdzazsKIAotb3V0Ogorb3V0X3JlbGVhc2U6CiAJcmVsZWFzZV9zb2NrKHNrKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTg3OCw3ICs4NzcsNyBAQAogCWlmIChmcmFtZXR5cGUgPT0gTlJfUFJPVE9FWFQgJiYKIAkgICAgY2lyY3VpdF9pbmRleCA9PSBOUl9QUk9UT19JUCAmJiBjaXJjdWl0X2lkID09IE5SX1BST1RPX0lQKSB7CiAJCXNrYl9wdWxsKHNrYiwgTlJfTkVUV09SS19MRU4gKyBOUl9UUkFOU1BPUlRfTEVOKTsKLQkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCQlyZXR1cm4gbnJfcnhfaXAoc2tiLCBkZXYpOwogCX0KQEAgLTkwNCw3ICs5MDMsNyBAQAogCX0KIAogCWlmIChzayAhPSBOVUxMKSB7Ci0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAkJaWYgKGZyYW1ldHlwZSA9PSBOUl9DT05OQUNLICYmIHNrYi0+bGVuID09IDIyKQogCQkJbnJfc2soc2spLT5icHFleHQgPSAxOwpAQCAtMTA3NCw2ICsxMDczLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlza2JfcmVzZXJ2ZShza2IsIHNpemUgLSBsZW4pOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAkvKgogCSAqCVB1c2ggZG93biB0aGUgTkVUL1JPTSBoZWFkZXIKQEAgLTEwOTQsMTQgKzEwOTQsMTIgQEAKIAkvKgogCSAqCVB1dCB0aGUgZGF0YSBvbiB0aGUgZW5kCiAJICovCisJc2tiX3B1dChza2IsIGxlbik7CiAKLQlza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7Ci0KLQlhc21wdHIgPSBza2ItPmgucmF3OwogCVNPQ0tfREVCVUcoc2ssICJORVQvUk9NOiBBcHBlbmRpbmcgdXNlciBkYXRhXG4iKTsKIAogCS8qIFVzZXIgZGF0YSBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBORVQvUk9NIHRyYW5zcG9ydCBoZWFkZXIgKi8KLQlpZiAobWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKSkgeworCWlmIChtZW1jcHlfZnJvbWlvdmVjKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG1zZy0+bXNnX2lvdiwgbGVuKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJZXJyID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CkBAIC0xMTQ5LDcgKzExNDcsNyBAQAogCQlyZXR1cm4gZXI7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWNvcGllZCAgICAgPSBza2ItPmxlbjsKIAogCWlmIChjb3BpZWQgPiBzaXplKSB7CkBAIC0xMTYxLDcgKzExNTksOCBAQAogCiAJaWYgKHNheCAhPSBOVUxMKSB7CiAJCXNheC0+c2F4MjVfZmFtaWx5ID0gQUZfTkVUUk9NOwotCQltZW1jcHkoc2F4LT5zYXgyNV9jYWxsLmF4MjVfY2FsbCwgc2tiLT5kYXRhICsgNywgQVgyNV9BRERSX0xFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgNywgc2F4LT5zYXgyNV9jYWxsLmF4MjVfY2FsbCwKKwkJCSAgICAgIEFYMjVfQUREUl9MRU4pOwogCX0KIAogCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2YoKnNheCk7CkBAIC0xMjA5LDYgKzEyMDgsMTIgQEAKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIHJldDsKIAorCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQlsb2NrX3NvY2soc2spOworCQlyZXQgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiByZXQ7CisKIAljYXNlIFNJT0NHSUZBRERSOgogCWNhc2UgU0lPQ1NJRkFERFI6CiAJY2FzZSBTSU9DR0lGRFNUQUREUjoKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfZGV2LmMgYi9uZXQvbmV0cm9tL25yX2Rldi5jCmluZGV4IDlhOTdlZDYuLmM3YjVkOTMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfZGV2LmMKKysrIGIvbmV0L25ldHJvbS9ucl9kZXYuYwpAQCAtNTYsOCArNTYsOCBAQAogCiAJLyogU3Bvb2YgaW5jb21pbmcgZGV2aWNlICovCiAJc2tiLT5kZXYgICAgICA9IGRldjsKLQlza2ItPm1hYy5yYXcgID0gc2tiLT5uaC5yYXc7Ci0Jc2tiLT5uaC5yYXcgICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAogCW5ldGlmX3J4KHNrYik7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2luLmMgYi9uZXQvbmV0cm9tL25yX2luLmMKaW5kZXggNTU2MGFjYi4uNjgxNzY0OCAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9pbi5jCisrKyBiL25ldC9uZXRyb20vbnJfaW4uYwpAQCAtNTEsMTAgKzUxLDEyIEBACiAJCWlmICgoc2tibiA9IGFsbG9jX3NrYihuci0+ZnJhZ2xlbiwgR0ZQX0FUT01JQykpID09IE5VTEwpCiAJCQlyZXR1cm4gMTsKIAotCQlza2JuLT5oLnJhdyA9IHNrYm4tPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYm4pOwogCiAJCXdoaWxlICgoc2tibyA9IHNrYl9kZXF1ZXVlKCZuci0+ZnJhZ19xdWV1ZSkpICE9IE5VTEwpIHsKLQkJCW1lbWNweShza2JfcHV0KHNrYm4sIHNrYm8tPmxlbiksIHNrYm8tPmRhdGEsIHNrYm8tPmxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYm8sCisJCQkJCQkgIHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwKKwkJCQkJCSAgc2tiby0+bGVuKTsKIAkJCWtmcmVlX3NrYihza2JvKTsKIAkJfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMgYi9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMKaW5kZXggZTg1NmFlMS4uZjMyNGQ1ZCAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9sb29wYmFjay5jCisrKyBiL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYwpAQCAtMzQsOCArMzQsOCBAQAogCXN0cnVjdCBza19idWZmICpza2JuOwogCiAJaWYgKChza2JuID0gYWxsb2Nfc2tiKHNrYi0+bGVuLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkgewotCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlza2JuLT5oLnJhdyA9IHNrYm4tPmRhdGE7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIHNrYi0+bGVuKSwgc2tiLT5sZW4pOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2JuKTsKIAogCQlza2JfcXVldWVfdGFpbCgmbG9vcGJhY2tfcXVldWUsIHNrYm4pOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX291dC5jIGIvbmV0L25ldHJvbS9ucl9vdXQuYwppbmRleCAwY2JmYjYxLi5lM2U2YzQ0IDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX291dC5jCisrKyBiL25ldC9uZXRyb20vbnJfb3V0LmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogCWlmIChza2ItPmxlbiAtIE5SX1RSQU5TUE9SVF9MRU4gPiBOUl9NQVhfUEFDS0VUX1NJWkUpIHsKIAkJLyogU2F2ZSBhIGNvcHkgb2YgdGhlIFRyYW5zcG9ydCBIZWFkZXIgKi8KLQkJbWVtY3B5KHRyYW5zcG9ydCwgc2tiLT5kYXRhLCBOUl9UUkFOU1BPUlRfTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRyYW5zcG9ydCwgTlJfVFJBTlNQT1JUX0xFTik7CiAJCXNrYl9wdWxsKHNrYiwgTlJfVFJBTlNQT1JUX0xFTik7CiAKIAkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKQEAgLTU0LDEzICs1NCwxMyBAQAogCQkJbGVuID0gKE5SX01BWF9QQUNLRVRfU0laRSA+IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogTlJfTUFYX1BBQ0tFVF9TSVpFOwogCiAJCQkvKiBDb3B5IHRoZSB1c2VyIGRhdGEgKi8KLQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIGxlbiksIGxlbik7CiAJCQlza2JfcHVsbChza2IsIGxlbik7CiAKIAkJCS8qIER1cGxpY2F0ZSB0aGUgVHJhbnNwb3J0IEhlYWRlciAqLwogCQkJc2tiX3B1c2goc2tibiwgTlJfVFJBTlNQT1JUX0xFTik7Ci0JCQltZW1jcHkoc2tibi0+ZGF0YSwgdHJhbnNwb3J0LCBOUl9UUkFOU1BPUlRfTEVOKTsKLQorCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tibiwgdHJhbnNwb3J0LAorCQkJCQkJTlJfVFJBTlNQT1JUX0xFTik7CiAJCQlpZiAoc2tiLT5sZW4gPiAwKQogCQkJCXNrYm4tPmRhdGFbNF0gfD0gTlJfTU9SRV9GTEFHOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3N1YnIuYyBiL25ldC9uZXRyb20vbnJfc3Vici5jCmluZGV4IDA3YjY5NGQuLjA0ZTdkMGQyIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX3N1YnIuYworKysgYi9uZXQvbmV0cm9tL25yX3N1YnIuYwpAQCAtMjI2LDEzICsyMjYsMTMgQEAKIAogCWRwdHIgPSBza2JfcHV0KHNrYm4sIE5SX05FVFdPUktfTEVOICsgTlJfVFJBTlNQT1JUX0xFTik7CiAKLQltZW1jcHkoZHB0ciwgc2tiLT5kYXRhICsgNywgQVgyNV9BRERSX0xFTik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCA3LCBkcHRyLCBBWDI1X0FERFJfTEVOKTsKIAlkcHRyWzZdICY9IH5BWDI1X0NCSVQ7CiAJZHB0cls2XSAmPSB+QVgyNV9FQklUOwogCWRwdHJbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKIAlkcHRyICs9IEFYMjVfQUREUl9MRU47CiAKLQltZW1jcHkoZHB0ciwgc2tiLT5kYXRhICsgMCwgQVgyNV9BRERSX0xFTik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRwdHIsIEFYMjVfQUREUl9MRU4pOwogCWRwdHJbNl0gJj0gfkFYMjVfQ0JJVDsKIAlkcHRyWzZdIHw9IEFYMjVfRUJJVDsKIAlkcHRyWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwppbmRleCAyOGQ0N2U4Li4wMmU0MDFjIDEwMDY0NAotLS0gYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTExNCwyMiArMTE0LDIyIEBACiAtLS0tLS0tLS0tLQogCiBJbmNvbWluZywgZGV2LT5oYXJkX2hlYWRlciE9TlVMTAotICAgbWFjLnJhdyAtPiBsbCBoZWFkZXIKLSAgIGRhdGEgICAgLT4gZGF0YQorICAgbWFjX2hlYWRlciAtPiBsbCBoZWFkZXIKKyAgIGRhdGEgICAgICAgLT4gZGF0YQogCiBPdXRnb2luZywgZGV2LT5oYXJkX2hlYWRlciE9TlVMTAotICAgbWFjLnJhdyAtPiBsbCBoZWFkZXIKLSAgIGRhdGEgICAgLT4gbGwgaGVhZGVyCisgICBtYWNfaGVhZGVyIC0+IGxsIGhlYWRlcgorICAgZGF0YSAgICAgICAtPiBsbCBoZWFkZXIKIAogSW5jb21pbmcsIGRldi0+aGFyZF9oZWFkZXI9PU5VTEwKLSAgIG1hYy5yYXcgLT4gVU5LTk9XTiBwb3NpdGlvbi4gSXQgaXMgdmVyeSBsaWtlbHksIHRoYXQgaXQgcG9pbnRzIHRvIGxsIGhlYWRlci4KLQkgICAgICBQUFAgbWFrZXMgaXQsIHRoYXQgaXMgd3JvbmcsIGJlY2F1c2UgaW50cm9kdWNlIGFzc3ltZXRyeQotCSAgICAgIGJldHdlZW4gcnggYW5kIHR4IHBhdGhzLgotICAgZGF0YSAgICAtPiBkYXRhCisgICBtYWNfaGVhZGVyIC0+IFVOS05PV04gcG9zaXRpb24uIEl0IGlzIHZlcnkgbGlrZWx5LCB0aGF0IGl0IHBvaW50cyB0byBsbAorCQkgaGVhZGVyLiAgUFBQIG1ha2VzIGl0LCB0aGF0IGlzIHdyb25nLCBiZWNhdXNlIGludHJvZHVjZQorICAgICAgICAgICAgICAgICBhc3N5bWV0cnkgYmV0d2VlbiByeCBhbmQgdHggcGF0aHMuCisgICBkYXRhICAgICAgIC0+IGRhdGEKIAogT3V0Z29pbmcsIGRldi0+aGFyZF9oZWFkZXI9PU5VTEwKLSAgIG1hYy5yYXcgLT4gZGF0YS4gbGwgaGVhZGVyIGlzIHN0aWxsIG5vdCBidWlsdCEKLSAgIGRhdGEgICAgLT4gZGF0YQorICAgbWFjX2hlYWRlciAtPiBkYXRhLiBsbCBoZWFkZXIgaXMgc3RpbGwgbm90IGJ1aWx0IQorICAgZGF0YSAgICAgICAtPiBkYXRhCiAKIFJlc3VtZQogICBJZiBkZXYtPmhhcmRfaGVhZGVyPT1OVUxMIHdlIGFyZSB1bmxpa2VseSB0byByZXN0b3JlIHNlbnNpYmxlIGxsIGhlYWRlci4KQEAgLTEzOSwxMiArMTM5LDEyIEBACiAtLS0tLS0tLS0tLS0KIAogZGV2LT5oYXJkX2hlYWRlciAhPSBOVUxMCi0gICBtYWMucmF3IC0+IGxsIGhlYWRlcgotICAgZGF0YSAgICAtPiBsbCBoZWFkZXIKKyAgIG1hY19oZWFkZXIgLT4gbGwgaGVhZGVyCisgICBkYXRhICAgICAgIC0+IGxsIGhlYWRlcgogCiBkZXYtPmhhcmRfaGVhZGVyID09IE5VTEwgKGxsIGhlYWRlciBpcyBhZGRlZCBieSBkZXZpY2UsIHdlIGNhbm5vdCBjb250cm9sIGl0KQotICAgbWFjLnJhdyAtPiBkYXRhCi0gICBkYXRhIC0+IGRhdGEKKyAgIG1hY19oZWFkZXIgLT4gZGF0YQorICAgZGF0YSAgICAgICAtPiBkYXRhCiAKICAgIFdlIHNob3VsZCBzZXQgbmgucmF3IG9uIG91dHB1dCB0byBjb3JyZWN0IHBvc2lzdGlvbiwKICAgIHBhY2tldCBjbGFzc2lmaWVyIGRlcGVuZHMgb24gaXQuCkBAIC0yMDEsNyArMjAxLDggQEAKIAlzdHJ1Y3QgcGFja2V0X3R5cGUJcHJvdF9ob29rOwogCXNwaW5sb2NrX3QJCWJpbmRfbG9jazsKIAl1bnNpZ25lZCBpbnQJCXJ1bm5pbmc6MSwJLyogcHJvdF9ob29rIGlzIGF0dGFjaGVkKi8KLQkJCQlhdXhkYXRhOjE7CisJCQkJYXV4ZGF0YToxLAorCQkJCW9yaWdkZXY6MTsKIAlpbnQJCQlpZmluZGV4OwkvKiBib3VuZCBkZXZpY2UJCSovCiAJX19iZTE2CQkJbnVtOwogI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCkBAIC0yODQsNyArMjg1LDcgQEAKIAkgKglJbmNvbWluZyBwYWNrZXRzIGhhdmUgbGwgaGVhZGVyIHB1bGxlZCwKIAkgKglwdXNoIGl0IGJhY2suCiAJICoKLQkgKglGb3Igb3V0Z29pbmcgb25lcyBza2ItPmRhdGEgPT0gc2tiLT5tYWMucmF3CisJICoJRm9yIG91dGdvaW5nIG9uZXMgc2tiLT5kYXRhID09IHNrYl9tYWNfaGVhZGVyKHNrYikKIAkgKglzbyB0aGF0IHRoaXMgcHJvY2VkdXJlIGlzIG5vb3AuCiAJICovCiAKQEAgLTMwMyw3ICszMDQsNyBAQAogCiAJc3BrdCA9ICZQQUNLRVRfU0tCX0NCKHNrYiktPnNhLnBrdDsKIAotCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhLXNrYi0+bWFjLnJhdyk7CisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKIAogCS8qCiAJICoJVGhlIFNPQ0tfUEFDS0VUIHNvY2tldCByZWNlaXZlcyBfYWxsXyBmcmFtZXMuCkBAIC00MDEsMTQgKzQwMiwxNCBAQAogCSAqIG5vdGFibGUgb25lIGhlcmUuIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBhdCB0aGUgZHJpdmVyIGxldmVsLgogCSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkvKiBUcnkgdG8gYWxpZ24gZGF0YSBwYXJ0IGNvcnJlY3RseSAqLwogCWlmIChkZXYtPmhhcmRfaGVhZGVyKSB7CiAJCXNrYi0+ZGF0YSAtPSBkZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAkJc2tiLT50YWlsIC09IGRldi0+aGFyZF9oZWFkZXJfbGVuOwogCQlpZiAobGVuIDwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pCi0JCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCX0KIAogCS8qIFJldHVybnMgLUVGQVVMVCBvbiBlcnJvciAqLwpAQCAtNDg4LDEwICs0ODksMTAgQEAKIAkJICAgbmV2ZXIgZGVsaXZlcmVkIHRvIHVzZXIuCiAJCSAqLwogCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19ER1JBTSkKLQkJCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5tYWMucmF3KTsKKwkJCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKSk7CiAJCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CiAJCQkvKiBTcGVjaWFsIGNhc2U6IG91dGdvaW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgYXQgaGVhZCAqLwotCQkJc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQlza2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAkJfQogCX0KIApAQCAtNTI4LDcgKzUyOSwxMCBAQAogCXNsbC0+c2xsX2hhdHlwZSA9IGRldi0+dHlwZTsKIAlzbGwtPnNsbF9wcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CiAJc2xsLT5zbGxfcGt0dHlwZSA9IHNrYi0+cGt0X3R5cGU7Ci0Jc2xsLT5zbGxfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwlpZiAodW5saWtlbHkocG8tPm9yaWdkZXYpICYmIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0hPU1QpCisJCXNsbC0+c2xsX2lmaW5kZXggPSBvcmlnX2Rldi0+aWZpbmRleDsKKwllbHNlCisJCXNsbC0+c2xsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJc2xsLT5zbGxfaGFsZW4gPSAwOwogCiAJaWYgKGRldi0+aGFyZF9oZWFkZXJfcGFyc2UpCkBAIC01ODIsNiArNTg2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IFRQX1NUQVRVU19MT1NJTkd8VFBfU1RBVFVTX1VTRVI7CiAJdW5zaWduZWQgc2hvcnQgbWFjb2ZmLCBuZXRvZmY7CiAJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gTlVMTDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKIAogCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSykKIAkJZ290byBkcm9wOwpAQCAtNTkxLDEwICs1OTYsMTAgQEAKIAogCWlmIChkZXYtPmhhcmRfaGVhZGVyKSB7CiAJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX0RHUkFNKQotCQkJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm1hYy5yYXcpOworCQkJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKIAkJZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1VUR09JTkcpIHsKIAkJCS8qIFNwZWNpYWwgY2FzZTogb3V0Z29pbmcgcGFja2V0cyBoYXZlIGxsIGhlYWRlciBhdCBoZWFkICovCi0JCQlza2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCQl9CiAJfQogCkBAIC02MTIsNyArNjE3LDcgQEAKIAlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkgewogCQltYWNvZmYgPSBuZXRvZmYgPSBUUEFDS0VUX0FMSUdOKFRQQUNLRVRfSERSTEVOKSArIDE2OwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIG1hY2xlbiA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCQl1bnNpZ25lZCBtYWNsZW4gPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAkJbmV0b2ZmID0gVFBBQ0tFVF9BTElHTihUUEFDS0VUX0hEUkxFTiArIChtYWNsZW4gPCAxNiA/IDE2IDogbWFjbGVuKSk7CiAJCW1hY29mZiA9IG5ldG9mZiAtIG1hY2xlbjsKIAl9CkBAIC02NTYsMTIgKzY2MSwxMyBAQAogCWgtPnRwX3NuYXBsZW4gPSBzbmFwbGVuOwogCWgtPnRwX21hYyA9IG1hY29mZjsKIAloLT50cF9uZXQgPSBuZXRvZmY7Ci0JaWYgKHNrYi0+dHN0YW1wLm9mZl9zZWMgPT0gMCkgeworCWlmIChza2ItPnRzdGFtcC50djY0ID09IDApIHsKIAkJX19uZXRfdGltZXN0YW1wKHNrYik7CiAJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7CiAJfQotCWgtPnRwX3NlYyA9IHNrYi0+dHN0YW1wLm9mZl9zZWM7Ci0JaC0+dHBfdXNlYyA9IHNrYi0+dHN0YW1wLm9mZl91c2VjOworCXR2ID0ga3RpbWVfdG9fdGltZXZhbChza2ItPnRzdGFtcCk7CisJaC0+dHBfc2VjID0gdHYudHZfc2VjOworCWgtPnRwX3VzZWMgPSB0di50dl91c2VjOwogCiAJc2xsID0gKHN0cnVjdCBzb2NrYWRkcl9sbCopKCh1OCopaCArIFRQQUNLRVRfQUxJR04oc2l6ZW9mKCpoKSkpOwogCXNsbC0+c2xsX2hhbGVuID0gMDsKQEAgLTY3MSw3ICs2NzcsMTAgQEAKIAlzbGwtPnNsbF9oYXR5cGUgPSBkZXYtPnR5cGU7CiAJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXNsbC0+c2xsX3BrdHR5cGUgPSBza2ItPnBrdF90eXBlOwotCXNsbC0+c2xsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJaWYgKHVubGlrZWx5KHBvLT5vcmlnZGV2KSAmJiBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9IT1NUKQorCQlzbGwtPnNsbF9pZmluZGV4ID0gb3JpZ19kZXYtPmlmaW5kZXg7CisJZWxzZQorCQlzbGwtPnNsbF9pZmluZGV4ID0gZGV2LT5pZmluZGV4OwogCiAJaC0+dHBfc3RhdHVzID0gc3RhdHVzOwogCXNtcF9tYigpOwpAQCAtNzY2LDE0ICs3NzUsMTQgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWlmIChkZXYtPmhhcmRfaGVhZGVyKSB7CiAJCWludCByZXM7CiAJCWVyciA9IC1FSU5WQUw7CiAJCXJlcyA9IGRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIG50b2hzKHByb3RvKSwgYWRkciwgTlVMTCwgbGVuKTsKIAkJaWYgKHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkgewotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCQkJc2tiLT5sZW4gPSAwOwogCQl9IGVsc2UgaWYgKHJlcyA8IDApCiAJCQlnb3RvIG91dF9mcmVlOwpAQCAtMTE0Myw3ICsxMTUyLDcgQEAKIAkJYXV4LnRwX2xlbiA9IFBBQ0tFVF9TS0JfQ0Ioc2tiKS0+b3JpZ2xlbjsKIAkJYXV4LnRwX3NuYXBsZW4gPSBza2ItPmxlbjsKIAkJYXV4LnRwX21hYyA9IDA7Ci0JCWF1eC50cF9uZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJYXV4LnRwX25ldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCiAJCXB1dF9jbXNnKG1zZywgU09MX1BBQ0tFVCwgUEFDS0VUX0FVWERBVEEsIHNpemVvZihhdXgpLCAmYXV4KTsKIAl9CkBAIC0xNDExLDYgKzE0MjAsMTggQEAKIAkJcG8tPmF1eGRhdGEgPSAhIXZhbDsKIAkJcmV0dXJuIDA7CiAJfQorCWNhc2UgUEFDS0VUX09SSUdERVY6CisJeworCQlpbnQgdmFsOworCisJCWlmIChvcHRsZW4gPCBzaXplb2YodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgb3B0dmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwby0+b3JpZ2RldiA9ICEhdmFsOworCQlyZXR1cm4gMDsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC0xNDU0LDYgKzE0NzUsMTMgQEAKIAogCQlkYXRhID0gJnZhbDsKIAkJYnJlYWs7CisJY2FzZSBQQUNLRVRfT1JJR0RFVjoKKwkJaWYgKGxlbiA+IHNpemVvZihpbnQpKQorCQkJbGVuID0gc2l6ZW9mKGludCk7CisJCXZhbCA9IHBvLT5vcmlnZGV2OworCisJCWRhdGEgPSAmdmFsOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KQEAgLTE1NDMsNiArMTU3MSw4IEBACiAJCX0KIAkJY2FzZSBTSU9DR1NUQU1QOgogCQkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZyk7CisJCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcG5zKHNrLCAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWFyZyk7CiAKICNpZmRlZiBDT05GSUdfSU5FVAogCQljYXNlIFNJT0NBRERSVDoKZGlmZiAtLWdpdCBhL25ldC9yb3NlL2FmX3Jvc2UuYyBiL25ldC9yb3NlL2FmX3Jvc2UuYwppbmRleCBmOTJkNTMxLi5kNDc2YzQzIDEwMDY0NAotLS0gYS9uZXQvcm9zZS9hZl9yb3NlLmMKKysrIGIvbmV0L3Jvc2UvYWZfcm9zZS5jCkBAIC04MTIsMjYgKzgxMiwyNiBAQAogCSAqIGNsb3NlZC4KIAkgKi8KIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9TWU5fU0VOVCkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJCURFRklORV9XQUlUKHdhaXQpOwogCi0JCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwogCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsCisJCQkgICAgICAgICAgICAgICAgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX1NZTl9TRU5UKQogCQkJCWJyZWFrOwotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQkJc2NoZWR1bGUoKTsKIAkJCQlsb2NrX3NvY2soc2spOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKIAkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CkBAIC04NTYsMTAgKzg1Niw5IEBACiAKIHN0YXRpYyBpbnQgcm9zZV9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNvY2sgKm5ld3NrOworCURFRklORV9XQUlUKHdhaXQpOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyID0gMDsKIApAQCAtODY5LDQyICs4NjgsNDEgQEAKIAlsb2NrX3NvY2soc2spOwogCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCS8qCiAJICoJVGhlIHdyaXRlIHF1ZXVlIHRoaXMgdGltZSBpcyBob2xkaW5nIHNvY2tldHMgcmVhZHkgdG8gdXNlCiAJICoJaG9va2VkIGludG8gdGhlIFNBQk0gd2Ugc2F2ZWQKIAkgKi8KLQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAlmb3IgKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJCWlmIChza2IpCiAJCQlicmVhazsKIAotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJaWYgKGZsYWdzICYgT19OT05CTE9DSykgewotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCQllcnIgPSAtRVdPVUxEQkxPQ0s7CisJCQlicmVhazsKIAkJfQotCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlsb2NrX3NvY2soc2spOwogCQkJY29udGludWU7CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCWJyZWFrOwogCX0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJbmV3c2sgPSBza2ItPnNrOwogCW5ld3NrLT5za19zb2NrZXQgPSBuZXdzb2NrOwpAQCAtOTE2LDcgKzkxNCw3IEBACiAJc2stPnNrX2Fja19iYWNrbG9nLS07CiAJbmV3c29jay0+c2sgPSBuZXdzazsKIAotb3V0Ogorb3V0X3JlbGVhc2U6CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMTA1LDkgKzExMDMsMTAgQEAKIAkgKi8KIAlTT0NLX0RFQlVHKHNrLCAiUk9TRTogQXBwZW5kaW5nIHVzZXIgZGF0YVxuIik7CiAKLQlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKIAotCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBtc2ctPm1zZ19pb3YsIGxlbik7CiAJaWYgKGVycikgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIGVycjsKQEAgLTExNTUsNyArMTE1NCw3IEBACiAJCWludCBsZzsKIAogCQkvKiBTYXZlIGEgY29weSBvZiB0aGUgSGVhZGVyICovCi0JCW1lbWNweShoZWFkZXIsIHNrYi0+ZGF0YSwgUk9TRV9NSU5fTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGhlYWRlciwgUk9TRV9NSU5fTEVOKTsKIAkJc2tiX3B1bGwoc2tiLCBST1NFX01JTl9MRU4pOwogCiAJCWZyb250bGVuID0gc2tiX2hlYWRyb29tKHNrYik7CkBAIC0xMTc1LDEyICsxMTc0LDEyIEBACiAJCQlsZyA9IChST1NFX1BBQ0xFTiA+IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogUk9TRV9QQUNMRU47CiAKIAkJCS8qIENvcHkgdGhlIHVzZXIgZGF0YSAqLwotCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgbGcpLCBza2ItPmRhdGEsIGxnKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIGxnKSwgbGcpOwogCQkJc2tiX3B1bGwoc2tiLCBsZyk7CiAKIAkJCS8qIER1cGxpY2F0ZSB0aGUgSGVhZGVyICovCiAJCQlza2JfcHVzaChza2JuLCBST1NFX01JTl9MRU4pOwotCQkJbWVtY3B5KHNrYm4tPmRhdGEsIGhlYWRlciwgUk9TRV9NSU5fTEVOKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYm4sIGhlYWRlciwgUk9TRV9NSU5fTEVOKTsKIAogCQkJaWYgKHNrYi0+bGVuID4gMCkKIAkJCQlza2JuLT5kYXRhWzJdIHw9IE1fQklUOwpAQCAtMTIzNCw3ICsxMjMzLDcgQEAKIAkJKmFzbXB0ciA9IHFiaXQ7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWNvcGllZCAgICAgPSBza2ItPmxlbjsKIAogCWlmIChjb3BpZWQgPiBzaXplKSB7CkBAIC0xMjk2LDYgKzEyOTUsOSBAQAogCWNhc2UgU0lPQ0dTVEFNUDoKIAkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKSBhcmdwKTsKIAorCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopIGFyZ3ApOworCiAJY2FzZSBTSU9DR0lGQUREUjoKIAljYXNlIFNJT0NTSUZBRERSOgogCWNhc2UgU0lPQ0dJRkRTVEFERFI6CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX2xvb3BiYWNrLmMgYi9uZXQvcm9zZS9yb3NlX2xvb3BiYWNrLmMKaW5kZXggM2U0MWJkOS4uY2QwMTY0MiAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9sb29wYmFjay5jCisrKyBiL25ldC9yb3NlL3Jvc2VfbG9vcGJhY2suYwpAQCAtNzcsNyArNzcsNyBAQAogCQlkZXN0ICAgICAgPSAocm9zZV9hZGRyZXNzICopKHNrYi0+ZGF0YSArIDQpOwogCQlsY2lfbyAgICAgPSAweEZGRiAtIGxjaV9pOwogCi0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAkJc2sgPSByb3NlX2ZpbmRfc29ja2V0KGxjaV9vLCAmcm9zZV9sb29wYmFja19uZWlnaCk7CiAJCWlmIChzaykgewpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCmluZGV4IGExMjMzZTEuLjFmOWFlZmQgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYworKysgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKQEAgLTkwNiw3ICs5MDYsNyBAQAogCQkJfQogCQl9CiAJCWVsc2UgewotCQkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCQlyZXMgPSByb3NlX3Byb2Nlc3NfcnhfZnJhbWUoc2ssIHNrYik7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL0tjb25maWcgYi9uZXQvcnhycGMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzIzODBlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorIworIyBSeFJQQyBzZXNzaW9uIHNvY2tldHMKKyMKKworY29uZmlnIEFGX1JYUlBDCisJdHJpc3RhdGUgIlJ4UlBDIHNlc3Npb24gc29ja2V0cyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFJ4UlBDIHNlc3Npb24gc29ja2V0cyAoanVzdAorCSAgdGhlIHRyYW5zcG9ydCBwYXJ0LCBub3QgdGhlIHByZXNlbnRhdGlvbiBwYXJ0OiAodW4pbWFyc2hhbGxpbmcgaXMKKwkgIGxlZnQgdG8gdGhlIGFwcGxpY2F0aW9uKS4KKworCSAgVGhlc2UgYXJlIHVzZWQgZm9yIEFGUyBrZXJuZWwgZmlsZXN5c3RlbSBhbmQgdXNlcnNwYWNlIHV0aWxpdGllcy4KKworCSAgVGhpcyBtb2R1bGUgYXQgdGhlIG1vbWVudCBvbmx5IHN1cHBvcnRzIGNsaWVudCBvcGVyYXRpb25zIGFuZCBpcworCSAgY3VycmVudGx5IGluY29tcGxldGUuCisKKwkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgorCisKK2NvbmZpZyBBRl9SWFJQQ19ERUJVRworCWJvb2wgIlJ4UlBDIGR5bmFtaWMgZGVidWdnaW5nIgorCWRlcGVuZHMgb24gQUZfUlhSUEMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIG1ha2UgcnVudGltZSBjb250cm9sbGFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIGFwcGVhci4KKworCSAgU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQuCisKKworY29uZmlnIFJYS0FECisJdHJpc3RhdGUgIlJ4UlBDIEtlcmJlcm9zIHNlY3VyaXR5IgorCWRlcGVuZHMgb24gQUZfUlhSUEMgJiYgS0VZUworCWhlbHAKKwkgIFByb3ZpZGUga2VyYmVyb3MgNCBhbmQgQUZTIGthc2VydmVyIHNlY3VyaXR5IGhhbmRsaW5nIGZvciBBRl9SWFJQQworCSAgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBrZXkgcmV0ZW50aW9uIHNlcnZpY2UuCisKKwkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL01ha2VmaWxlIGIvbmV0L3J4cnBjL01ha2VmaWxlCmluZGV4IDZlZmNiNmYuLmM0Njg2N2MgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9NYWtlZmlsZQorKysgYi9uZXQvcnhycGMvTWFrZWZpbGUKQEAgLTEsMjUgKzEsMjkgQEAKICMKLSMgTWFrZWZpbGUgZm9yIExpbnV4IGtlcm5lbCBSeCBSUEMKKyMgTWFrZWZpbGUgZm9yIExpbnV4IGtlcm5lbCBSeFJQQwogIwogCi0jQ0ZMQUdTICs9IC1maW5zdHJ1bWVudC1mdW5jdGlvbnMKLQotcnhycGMtb2JqcyA6PSBcCi0JY2FsbC5vIFwKLQljb25uZWN0aW9uLm8gXAotCWtyeGlvZC5vIFwKLQlrcnhzZWNkLm8gXAotCWtyeHRpbW9kLm8gXAotCW1haW4ubyBcCi0JcGVlci5vIFwKLQlyeHJwY19zeW1zLm8gXAotCXRyYW5zcG9ydC5vCithZi1yeHJwYy1vYmpzIDo9IFwKKwlhZl9yeHJwYy5vIFwKKwlhci1hY2NlcHQubyBcCisJYXItYWNrLm8gXAorCWFyLWNhbGwubyBcCisJYXItY29ubmVjdGlvbi5vIFwKKwlhci1jb25uZXZlbnQubyBcCisJYXItZXJyb3IubyBcCisJYXItaW5wdXQubyBcCisJYXIta2V5Lm8gXAorCWFyLWxvY2FsLm8gXAorCWFyLW91dHB1dC5vIFwKKwlhci1wZWVyLm8gXAorCWFyLXJlY3Ztc2cubyBcCisJYXItc2VjdXJpdHkubyBcCisJYXItc2tidWZmLm8gXAorCWFyLXRyYW5zcG9ydC5vCiAKIGlmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCi1yeHJwYy1vYmpzICs9IHByb2MubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX1NZU0NUTCkseSkKLXJ4cnBjLW9ianMgKz0gc3lzY3RsLm8KK2FmLXJ4cnBjLW9ianMgKz0gYXItcHJvYy5vCiBlbmRpZgogCi1vYmotJChDT05GSUdfUlhSUEMpIDo9IHJ4cnBjLm8KK29iai0kKENPTkZJR19BRl9SWFJQQykgKz0gYWYtcnhycGMubworCitvYmotJChDT05GSUdfUlhLQUQpICs9IHJ4a2FkLm8KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hZl9yeHJwYy5jIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1N2RmOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCkBAIC0wLDAgKzEsODc5IEBACisvKiBBRl9SWFJQQyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiUnhSUEMgbmV0d29yayBwcm90b2NvbCIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX1JYUlBDKTsKKwordW5zaWduZWQgcnhycGNfZGVidWc7IC8vID0gUlhSUENfREVCVUdfS1BST1RPOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCByeHJwY19kZWJ1ZywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyeHJwY19kZWJ1ZywgIlJ4UlBDIGRlYnVnZ2luZyBtYXNrIik7CisKK3N0YXRpYyBpbnQgc3lzY3RsX3J4cnBjX21heF9xbGVuIF9fcmVhZF9tb3N0bHkgPSAxMDsKKworc3RhdGljIHN0cnVjdCBwcm90byByeHJwY19wcm90bzsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHJ4cnBjX3JwY19vcHM7CisKKy8qIGxvY2FsIGVwb2NoIGZvciBkZXRlY3RpbmcgbG9jYWwtZW5kIHJlc2V0ICovCitfX2JlMzIgcnhycGNfZXBvY2g7CisKKy8qIGN1cnJlbnQgZGVidWdnaW5nIElEICovCithdG9taWNfdCByeHJwY19kZWJ1Z19pZDsKKworLyogY291bnQgb2Ygc2ticyBjdXJyZW50bHkgaW4gdXNlICovCithdG9taWNfdCByeHJwY19uX3NrYnM7CisKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX3NvY2tfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc29jayAqKTsKKworLyoKKyAqIHNlZSBpZiBhbiBSeFJQQyBzb2NrZXQgaXMgY3VycmVudGx5IHdyaXRhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ4cnBjX3dyaXRhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8IChzaXplX3QpIHNrLT5za19zbmRidWY7Cit9CisKKy8qCisgKiB3YWl0IGZvciB3cml0ZSBidWZmZXJhZ2UgdG8gYmVjb21lIGF2YWlsYWJsZQorICovCitzdGF0aWMgdm9pZCByeHJwY193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJX2VudGVyKCIlcCIsIHNrKTsKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpZiAocnhycGNfd3JpdGFibGUoc2spKSB7CisJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisJCXNrX3dha2VfYXN5bmMoc2ssIDIsIFBPTExfT1VUKTsKKwl9CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworLyoKKyAqIHZhbGlkYXRlIGFuIFJ4UlBDIGFkZHJlc3MKKyAqLworc3RhdGljIGludCByeHJwY192YWxpZGF0ZV9hZGRyZXNzKHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAorCQkJCSAgaW50IGxlbikKK3sKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yeHJwYykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNyeC0+c3J4X2ZhbWlseSAhPSBBRl9SWFJQQykKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlpZiAoc3J4LT50cmFuc3BvcnRfdHlwZSAhPSBTT0NLX0RHUkFNKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCWxlbiAtPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMsIHRyYW5zcG9ydCk7CisJaWYgKHNyeC0+dHJhbnNwb3J0X2xlbiA8IHNpemVvZihzYV9mYW1pbHlfdCkgfHwKKwkgICAgc3J4LT50cmFuc3BvcnRfbGVuID4gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzcngtPnRyYW5zcG9ydC5mYW1pbHkgIT0gcngtPnByb3RvKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCXN3aXRjaCAoc3J4LT50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlfZGVidWcoIklORVQ6ICV4IEAgJXUuJXUuJXUuJXUiLAorCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKKwkJICAgICAgIE5JUFFVQUQoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSk7CisJCWlmIChzcngtPnRyYW5zcG9ydF9sZW4gPiA4KQorCQkJbWVtc2V0KCh2b2lkICopJnNyeC0+dHJhbnNwb3J0ICsgOCwgMCwKKwkJCSAgICAgICBzcngtPnRyYW5zcG9ydF9sZW4gLSA4KTsKKwkJYnJlYWs7CisKKwljYXNlIEFGX0lORVQ2OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYmluZCBhIGxvY2FsIGFkZHJlc3MgdG8gYW4gUnhSUEMgc29ja2V0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBzYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKSwgKnByeDsKKwlfX2JlMTYgc2VydmljZV9pZDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcCwlcCwlZCIsIHJ4LCBzYWRkciwgbGVuKTsKKworCXJldCA9IHJ4cnBjX3ZhbGlkYXRlX2FkZHJlc3MocngsIHNyeCwgbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfVU5DT05ORUNURUQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJbWVtY3B5KCZyeC0+c3J4LCBzcngsIHNpemVvZihyeC0+c3J4KSk7CisKKwkvKiBmaW5kIGEgbG9jYWwgdHJhbnNwb3J0IGVuZHBvaW50IGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKwlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CisJaWYgKElTX0VSUihsb2NhbCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsb2NhbCk7CisJCWdvdG8gZXJyb3JfdW5sb2NrOworCX0KKworCXJ4LT5sb2NhbCA9IGxvY2FsOworCWlmIChzcngtPnNyeF9zZXJ2aWNlKSB7CisJCXNlcnZpY2VfaWQgPSBodG9ucyhzcngtPnNyeF9zZXJ2aWNlKTsKKwkJd3JpdGVfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKKwkJCWlmIChwcngtPnNlcnZpY2VfaWQgPT0gc2VydmljZV9pZCkKKwkJCQlnb3RvIHNlcnZpY2VfaW5fdXNlOworCQl9CisKKwkJcngtPnNlcnZpY2VfaWQgPSBzZXJ2aWNlX2lkOworCQlsaXN0X2FkZF90YWlsKCZyeC0+bGlzdGVuX2xpbmssICZsb2NhbC0+c2VydmljZXMpOworCQl3cml0ZV91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKworCQlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19TRVJWRVJfQk9VTkQ7CisJfSBlbHNlIHsKKwkJcngtPnNrLnNrX3N0YXRlID0gUlhSUENfQ0xJRU5UX0JPVU5EOworCX0KKworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworc2VydmljZV9pbl91c2U6CisJcmV0ID0gLUVBRERSSU5VU0U7CisJd3JpdGVfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CitlcnJvcl91bmxvY2s6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNldCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgY2FsbHMgcGVybWl0dGVkIG9uIGEgbGlzdGVuaW5nIHNvY2tldAorICovCitzdGF0aWMgaW50IHJ4cnBjX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJaW50IHJldDsKKworCV9lbnRlcigiJXAsJWQiLCByeCwgYmFja2xvZyk7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisKKwlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgeworCWNhc2UgUlhSUENfVU5DT05ORUNURUQ6CisJCXJldCA9IC1FQUREUk5PVEFWQUlMOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NMSUVOVF9CT1VORDoKKwljYXNlIFJYUlBDX0NMSUVOVF9DT05ORUNURUQ6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVCVVNZOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NFUlZFUl9CT1VORDoKKwkJQVNTRVJUKHJ4LT5sb2NhbCAhPSBOVUxMKTsKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkc7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZmluZCBhIHRyYW5zcG9ydCBieSBhZGRyZXNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19uYW1lX3RvX3RyYW5zcG9ydChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCQkJCSAgICAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncywKKwkJCQkJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcnggPSAoc3RydWN0IHNvY2thZGRyX3J4cnBjICopIGFkZHI7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnM7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc29jay0+c2spOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCisJX2VudGVyKCIlcCwlcCwlZCwlZCIsIHJ4LCBhZGRyLCBhZGRyX2xlbiwgZmxhZ3MpOworCisJQVNTRVJUKHJ4LT5sb2NhbCAhPSBOVUxMKTsKKwlBU1NFUlQocngtPnNrLnNrX3N0YXRlID4gUlhSUENfVU5DT05ORUNURUQpOworCisJaWYgKHJ4LT5zcngudHJhbnNwb3J0X3R5cGUgIT0gc3J4LT50cmFuc3BvcnRfdHlwZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTT0NLVE5PU1VQUE9SVCk7CisJaWYgKHJ4LT5zcngudHJhbnNwb3J0LmZhbWlseSAhPSBzcngtPnRyYW5zcG9ydC5mYW1pbHkpCisJCXJldHVybiBFUlJfUFRSKC1FQUZOT1NVUFBPUlQpOworCisJLyogZmluZCBhIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgZnJvbSB0aGUgbG9jYWwgb25lICovCisJcGVlciA9IHJ4cnBjX2dldF9wZWVyKHNyeCwgZ2ZwKTsKKwlpZiAoSVNfRVJSKHBlZXIpKQorCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHBlZXIpKTsKKworCS8qIGZpbmQgYSB0cmFuc3BvcnQgKi8KKwl0cmFucyA9IHJ4cnBjX2dldF90cmFuc3BvcnQocngtPmxvY2FsLCBwZWVyLCBnZnApOworCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCV9sZWF2ZSgiID0gJXAiLCB0cmFucyk7CisJcmV0dXJuIHRyYW5zOworfQorCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9iZWdpbl9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBiZWdpbiBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRvIG1ha2UgdGhlIGNhbGwKKyAqIEBzcng6IFRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyIHRvIGNvbnRhY3QgKGRlZmF1bHRzIHRvIHNvY2tldCBzZXR0aW5nKQorICogQGtleTogVGhlIHNlY3VyaXR5IGNvbnRleHQgdG8gdXNlIChkZWZhdWx0cyB0byBzb2NrZXQgc2V0dGluZykKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSBJRCB0byB1c2UKKyAqCisgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGJlZ2luIGEgY2FsbCBvbiB0aGUgbm9taW5hdGVkIHNvY2tldC4gIFRoaXMganVzdAorICogc2V0cyB1cCBhbGwgdGhlIGludGVybmFsIHRyYWNraW5nIHN0cnVjdHVyZXMgYW5kIGFsbG9jYXRlcyBjb25uZWN0aW9uIGFuZAorICogY2FsbCBJRHMgYXMgYXBwcm9wcmlhdGUuICBUaGUgY2FsbCB0byBiZSB1c2VkIGlzIHJldHVybmVkLgorICoKKyAqIFRoZSBkZWZhdWx0IHNvY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBzZWN1cml0eSBtYXkgYmUgb3ZlcnJpZGRlbiBieQorICogc3VwcGx5aW5nIEBzcnggYW5kIEBrZXkuCisgKi8KK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYmVnaW5fY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJCQkJICAgc3RydWN0IGtleSAqa2V5LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKKwlfX2JlMTYgc2VydmljZV9pZDsKKworCV9lbnRlcigiLCwleCwlbHgiLCBrZXlfc2VyaWFsKGtleSksIHVzZXJfY2FsbF9JRCk7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisKKwlpZiAoc3J4KSB7CisJCXRyYW5zID0gcnhycGNfbmFtZV90b190cmFuc3BvcnQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBzcngsCisJCQkJCQlzaXplb2YoKnNyeCksIDAsIGdmcCk7CisJCWlmIChJU19FUlIodHJhbnMpKSB7CisJCQljYWxsID0gRVJSX1BUUihQVFJfRVJSKHRyYW5zKSk7CisJCQl0cmFucyA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCXRyYW5zID0gcngtPnRyYW5zOworCQlpZiAoIXRyYW5zKSB7CisJCQljYWxsID0gRVJSX1BUUigtRU5PVENPTk4pOworCQkJZ290byBvdXQ7CisJCX0KKwkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwl9CisKKwlzZXJ2aWNlX2lkID0gcngtPnNlcnZpY2VfaWQ7CisJaWYgKHNyeCkKKwkJc2VydmljZV9pZCA9IGh0b25zKHNyeC0+c3J4X3NlcnZpY2UpOworCisJaWYgKCFrZXkpCisJCWtleSA9IHJ4LT5rZXk7CisJaWYgKGtleSAmJiAha2V5LT5wYXlsb2FkLmRhdGEpCisJCWtleSA9IE5VTEw7IC8qIGEgbm8tc2VjdXJpdHkga2V5ICovCisKKwlidW5kbGUgPSByeHJwY19nZXRfYnVuZGxlKHJ4LCB0cmFucywga2V5LCBzZXJ2aWNlX2lkLCBnZnApOworCWlmIChJU19FUlIoYnVuZGxlKSkgeworCQljYWxsID0gRVJSX1BUUihQVFJfRVJSKGJ1bmRsZSkpOworCQlnb3RvIG91dDsKKwl9CisKKwljYWxsID0gcnhycGNfZ2V0X2NsaWVudF9jYWxsKHJ4LCB0cmFucywgYnVuZGxlLCB1c2VyX2NhbGxfSUQsIHRydWUsCisJCQkJICAgICBnZnApOworCXJ4cnBjX3B1dF9idW5kbGUodHJhbnMsIGJ1bmRsZSk7CitvdXQ6CisJcnhycGNfcHV0X3RyYW5zcG9ydCh0cmFucyk7CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfYmVnaW5fY2FsbCk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2VuZF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBlbmQgYSBjYWxsIGl0IHdhcyB1c2luZworICogQGNhbGw6IFRoZSBjYWxsIHRvIGVuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gZW5kIGEgY2FsbCBpdCB3YXMgdXNpbmcuICBUaGUgY2FsbCBtdXN0IGJlCisgKiBjb21wbGV0ZSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgKHRoZSBjYWxsIHNob3VsZCBiZSBhYm9ydGVkIGlmIG5lY2Vzc2FyeSkuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJWR7JWR9IiwgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCXJ4cnBjX3JlbW92ZV91c2VyX0lEKGNhbGwtPnNvY2tldCwgY2FsbCk7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2VuZF9jYWxsKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfaW50ZXJjZXB0X3J4X21lc3NhZ2VzIC0gSW50ZXJjZXB0IHJlY2VpdmVkIFJ4UlBDIG1lc3NhZ2VzCisgKiBAc29jazogVGhlIHNvY2tldCB0byBpbnRlcmNlcHQgcmVjZWl2ZWQgbWVzc2FnZXMgb24KKyAqIEBpbnRlcmNlcHRvcjogVGhlIGZ1bmN0aW9uIHRvIHBhc3MgdGhlIG1lc3NhZ2VzIHRvCisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBpbnRlcmNlcHQgbWVzc2FnZXMgaGVhZGluZyBmb3IgdGhlIFJ4IHF1ZXVlIG9uIGFuCisgKiBSeFJQQyBzb2NrZXQuICBUaGV5IGdldCBwYXNzZWQgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbnN0ZWFkLgorICogQGludGVyY2VwdG9yIHNob3VsZCBmcmVlIHRoZSBzb2NrZXQgYnVmZmVycyBpdCBpcyBnaXZlbi4gIEBpbnRlcmNlcHRvciBpcworICogY2FsbGVkIHdpdGggdGhlIHNvY2tldCByZWNlaXZlIHF1ZXVlIHNwaW5sb2NrIGhlbGQgYW5kIHNvZnRpcnFzIGRpc2FibGVkIC0KKyAqIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlcyB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQlyeHJwY19pbnRlcmNlcHRvcl90IGludGVyY2VwdG9yKQoreworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKKworCV9lbnRlcigiIik7CisJcngtPmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyk7CisKKy8qCisgKiBjb25uZWN0IGFuIFJ4UlBDIHNvY2tldAorICogLSB0aGlzIGp1c3QgdGFyZ2V0cyBpdCBhdCBhIHNwZWNpZmljIGRlc3RpbmF0aW9uOyBubyBhY3R1YWwgY29ubmVjdGlvbgorICogICBuZWdvdGlhdGlvbiB0YWtlcyBwbGFjZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJIGludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWw7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwLCVwLCVkLCVkIiwgcngsIGFkZHIsIGFkZHJfbGVuLCBmbGFncyk7CisKKwlyZXQgPSByeHJwY192YWxpZGF0ZV9hZGRyZXNzKHJ4LCBzcngsIGFkZHJfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtiYWQgYWRkcl0iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCXN3aXRjaCAocngtPnNrLnNrX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19VTkNPTk5FQ1RFRDoKKwkJLyogZmluZCBhIGxvY2FsIHRyYW5zcG9ydCBlbmRwb2ludCBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5ICovCisJCUFTU0VSVENNUChyeC0+bG9jYWwsID09LCBOVUxMKTsKKwkJcngtPnNyeC5zcnhfZmFtaWx5ID0gQUZfUlhSUEM7CisJCXJ4LT5zcnguc3J4X3NlcnZpY2UgPSAwOworCQlyeC0+c3J4LnRyYW5zcG9ydF90eXBlID0gc3J4LT50cmFuc3BvcnRfdHlwZTsKKwkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KTsKKwkJcngtPnNyeC50cmFuc3BvcnQuZmFtaWx5ID0gc3J4LT50cmFuc3BvcnQuZmFtaWx5OworCQlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CisJCWlmIChJU19FUlIobG9jYWwpKSB7CisJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQlyZXR1cm4gUFRSX0VSUihsb2NhbCk7CisJCX0KKwkJcngtPmxvY2FsID0gbG9jYWw7CisJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX0NMSUVOVF9CT1VORDsKKwljYXNlIFJYUlBDX0NMSUVOVF9CT1VORDoKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEOgorCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCXJldHVybiAtRUlTQ09OTjsKKwlkZWZhdWx0OgorCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCXJldHVybiAtRUJVU1k7IC8qIHNlcnZlciBzb2NrZXRzIGNhbid0IGNvbm5lY3QgYXMgd2VsbCAqLworCX0KKworCXRyYW5zID0gcnhycGNfbmFtZV90b190cmFuc3BvcnQoc29jaywgYWRkciwgYWRkcl9sZW4sIGZsYWdzLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUih0cmFucykpOworCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CisJfQorCisJcngtPnRyYW5zID0gdHJhbnM7CisJcngtPnNlcnZpY2VfaWQgPSBodG9ucyhzcngtPnNyeF9zZXJ2aWNlKTsKKwlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEOworCisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJldHVybiAwOworfQorCisvKgorICogc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhbiBSeFJQQyBzb2NrZXQKKyAqIC0gaW4gYSBjbGllbnQgdGhpcyBkb2VzIGEgbnVtYmVyIG9mIHRoaW5nczoKKyAqICAgLSBmaW5kcy9zZXRzIHVwIGEgY29ubmVjdGlvbiBmb3IgdGhlIHNlY3VyaXR5IHNwZWNpZmllZCAoaWYgYW55KQorICogICAtIGluaXRpYXRlcyBhIGNhbGwgKElEIGluIGNvbnRyb2wgZGF0YSkKKyAqICAgLSBlbmRzIHRoZSByZXF1ZXN0IHBoYXNlIG9mIGEgY2FsbCAoaWYgTVNHX01PUkUgaXMgbm90IHNldCkKKyAqICAgLSBzZW5kcyBhIGNhbGwgZGF0YSBwYWNrZXQKKyAqICAgLSBtYXkgc2VuZCBhbiBhYm9ydCAoYWJvcnQgY29kZSBpbiBjb250cm9sIGRhdGEpCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJaW50IHJldDsKKworCV9lbnRlcigiLHslZH0sLCV6dSIsIHJ4LT5zay5za19zdGF0ZSwgbGVuKTsKKworCWlmIChtLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobS0+bXNnX25hbWUpIHsKKwkJcmV0ID0gcnhycGNfdmFsaWRhdGVfYWRkcmVzcyhyeCwgbS0+bXNnX25hbWUsIG0tPm1zZ19uYW1lbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCV9sZWF2ZSgiID0gJWQgW2JhZCBhZGRyXSIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJdHJhbnMgPSBOVUxMOworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWlmIChtLT5tc2dfbmFtZSkgeworCQlyZXQgPSAtRUlTQ09OTjsKKwkJdHJhbnMgPSByeHJwY19uYW1lX3RvX3RyYW5zcG9ydChzb2NrLCBtLT5tc2dfbmFtZSwKKwkJCQkJCW0tPm1zZ19uYW1lbGVuLCAwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKElTX0VSUih0cmFucykpIHsKKwkJCXJldCA9IFBUUl9FUlIodHJhbnMpOworCQkJdHJhbnMgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQl0cmFucyA9IHJ4LT50cmFuczsKKwkJaWYgKHRyYW5zKQorCQkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwl9CisKKwlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgeworCWNhc2UgUlhSUENfU0VSVkVSX0xJU1RFTklORzoKKwkJaWYgKCFtLT5tc2dfbmFtZSkgeworCQkJcmV0ID0gcnhycGNfc2VydmVyX3NlbmRtc2coaW9jYiwgcngsIG0sIGxlbik7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUlhSUENfU0VSVkVSX0JPVU5EOgorCWNhc2UgUlhSUENfQ0xJRU5UX0JPVU5EOgorCQlpZiAoIW0tPm1zZ19uYW1lKSB7CisJCQlyZXQgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCWNhc2UgUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRDoKKwkJcmV0ID0gcnhycGNfY2xpZW50X3NlbmRtc2coaW9jYiwgcngsIHRyYW5zLCBtLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PVENPTk47CisJCWJyZWFrOworCX0KKworb3V0OgorCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlpZiAodHJhbnMpCisJCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzZXQgUnhSUEMgc29ja2V0IG9wdGlvbnMKKyAqLworc3RhdGljIGludCByeHJwY19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJdW5zaWduZWQgbWluX3NlY19sZXZlbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIsJWQsJWQsLCVkIiwgbGV2ZWwsIG9wdG5hbWUsIG9wdGxlbik7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlpZiAobGV2ZWwgPT0gU09MX1JYUlBDKSB7CisJCXN3aXRjaCAob3B0bmFtZSkgeworCQljYXNlIFJYUlBDX0VYQ0xVU0lWRV9DT05ORUNUSU9OOgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWlmIChvcHRsZW4gIT0gMCkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gLUVJU0NPTk47CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1VOQ09OTkVDVEVEKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzZXRfYml0KFJYUlBDX1NPQ0tfRVhDTFVTSVZFX0NPTk4sICZyeC0+ZmxhZ3MpOworCQkJZ290byBzdWNjZXNzOworCisJCWNhc2UgUlhSUENfU0VDVVJJVFlfS0VZOgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWlmIChyeC0+a2V5KQorCQkJCWdvdG8gZXJyb3I7CisJCQlyZXQgPSAtRUlTQ09OTjsKKwkJCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfVU5DT05ORUNURUQpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IHJ4cnBjX3JlcXVlc3Rfa2V5KHJ4LCBvcHR2YWwsIG9wdGxlbik7CisJCQlnb3RvIGVycm9yOworCisJCWNhc2UgUlhSUENfU0VDVVJJVFlfS0VZUklORzoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAocngtPmtleSkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gLUVJU0NPTk47CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1VOQ09OTkVDVEVEKQorCQkJCWdvdG8gZXJyb3I7CisJCQlyZXQgPSByeHJwY19zZXJ2ZXJfa2V5cmluZyhyeCwgb3B0dmFsLCBvcHRsZW4pOworCQkJZ290byBlcnJvcjsKKworCQljYXNlIFJYUlBDX01JTl9TRUNVUklUWV9MRVZFTDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAob3B0bGVuICE9IHNpemVvZih1bnNpZ25lZCkpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IC1FSVNDT05OOworCQkJaWYgKHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19VTkNPTk5FQ1RFRCkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gZ2V0X3VzZXIobWluX3NlY19sZXZlbCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIF9fdXNlciAqKSBvcHR2YWwpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAobWluX3NlY19sZXZlbCA+IFJYUlBDX1NFQ1VSSVRZX01BWCkKKwkJCQlnb3RvIGVycm9yOworCQkJcngtPm1pbl9zZWNfbGV2ZWwgPSBtaW5fc2VjX2xldmVsOworCQkJZ290byBzdWNjZXNzOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworc3VjY2VzczoKKwlyZXQgPSAwOworZXJyb3I6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBwZXJtaXQgYW4gUnhSUEMgc29ja2V0IHRvIGJlIHBvbGxlZAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCXBvbGxfd2FpdChmaWxlLCBzay0+c2tfc2xlZXAsIHdhaXQpOworCW1hc2sgPSAwOworCisJLyogdGhlIHNvY2tldCBpcyByZWFkYWJsZSBpZiB0aGVyZSBhcmUgYW55IG1lc3NhZ2VzIHdhaXRpbmcgb24gdGhlIFJ4CisJICogcXVldWUgKi8KKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkvKiB0aGUgc29ja2V0IGlzIHdyaXRhYmxlIGlmIHRoZXJlIGlzIHNwYWNlIHRvIGFkZCBuZXcgZGF0YSB0byB0aGUKKwkgKiBzb2NrZXQ7IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGFueSBwYXJ0aWN1bGFyIGNhbGwgaW4gcHJvZ3Jlc3MKKwkgKiBvbiB0aGUgc29ja2V0IG1heSBoYXZlIHNwYWNlIGluIHRoZSBUeCBBQ0sgd2luZG93ICovCisJaWYgKHJ4cnBjX3dyaXRhYmxlKHNrKSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKgorICogY3JlYXRlIGFuIFJ4UlBDIHNvY2tldAorICovCitzdGF0aWMgaW50IHJ4cnBjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OworCXN0cnVjdCBzb2NrICpzazsKKworCV9lbnRlcigiJXAsJWQiLCBzb2NrLCBwcm90b2NvbCk7CisKKwkvKiB3ZSBzdXBwb3J0IHRyYW5zcG9ydCBwcm90b2NvbCBVRFAgb25seSAqLworCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJc29jay0+b3BzID0gJnJ4cnBjX3JwY19vcHM7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCXNrID0gc2tfYWxsb2MoUEZfUlhSUEMsIEdGUF9LRVJORUwsICZyeHJwY19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc2stPnNrX3N0YXRlCQk9IFJYUlBDX1VOQ09OTkVDVEVEOworCXNrLT5za193cml0ZV9zcGFjZQk9IHJ4cnBjX3dyaXRlX3NwYWNlOworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cJPSBzeXNjdGxfcnhycGNfbWF4X3FsZW47CisJc2stPnNrX2Rlc3RydWN0CQk9IHJ4cnBjX3NvY2tfZGVzdHJ1Y3RvcjsKKworCXJ4ID0gcnhycGNfc2soc2spOworCXJ4LT5wcm90byA9IHByb3RvY29sOworCXJ4LT5jYWxscyA9IFJCX1JPT1Q7CisKKwlJTklUX0xJU1RfSEVBRCgmcngtPmxpc3Rlbl9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnNlY3VyZXEpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+YWNjZXB0cSk7CisJcndsb2NrX2luaXQoJnJ4LT5jYWxsX2xvY2spOworCW1lbXNldCgmcngtPnNyeCwgMCwgc2l6ZW9mKHJ4LT5zcngpKTsKKworCV9sZWF2ZSgiID0gMCBbJXBdIiwgcngpOworCXJldHVybiAwOworfQorCisvKgorICogUnhSUEMgc29ja2V0IGRlc3RydWN0b3IKKyAqLworc3RhdGljIHZvaWQgcnhycGNfc29ja19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKK3sKKwlfZW50ZXIoIiVwIiwgc2spOworCisJcnhycGNfcHVyZ2VfcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCUJVR19UUkFQKCFhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKwlCVUdfVFJBUChza191bmhhc2hlZChzaykpOworCUJVR19UUkFQKCFzay0+c2tfc29ja2V0KTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXByaW50aygiQXR0ZW1wdCB0byByZWxlYXNlIGFsaXZlIHJ4cnBjIHNvY2tldDogJXBcbiIsIHNrKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIHJlbGVhc2UgYW4gUnhSUEMgc29ja2V0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisKKwlfZW50ZXIoIiVweyVkLCVkfSIsIHNrLCBzay0+c2tfc3RhdGUsIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisKKwkvKiBkZWNsYXJlIHRoZSBzb2NrZXQgY2xvc2VkIGZvciBidXNpbmVzcyAqLworCXNvY2tfb3JwaGFuKHNrKTsKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlzay0+c2tfc3RhdGUgPSBSWFJQQ19DTE9TRTsKKwlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisKKwlBU1NFUlRDTVAocngtPmxpc3Rlbl9saW5rLm5leHQsICE9LCBMSVNUX1BPSVNPTjEpOworCisJaWYgKCFsaXN0X2VtcHR5KCZyeC0+bGlzdGVuX2xpbmspKSB7CisJCXdyaXRlX2xvY2tfYmgoJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJCWxpc3RfZGVsKCZyeC0+bGlzdGVuX2xpbmspOworCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJfQorCisJLyogdHJ5IHRvIGZsdXNoIG91dCB0aGlzIHNvY2tldCAqLworCXJ4cnBjX3JlbGVhc2VfY2FsbHNfb25fc29ja2V0KHJ4KTsKKwlmbHVzaF93b3JrcXVldWUocnhycGNfd29ya3F1ZXVlKTsKKwlyeHJwY19wdXJnZV9xdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJaWYgKHJ4LT5jb25uKSB7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHJ4LT5jb25uKTsKKwkJcngtPmNvbm4gPSBOVUxMOworCX0KKworCWlmIChyeC0+YnVuZGxlKSB7CisJCXJ4cnBjX3B1dF9idW5kbGUocngtPnRyYW5zLCByeC0+YnVuZGxlKTsKKwkJcngtPmJ1bmRsZSA9IE5VTEw7CisJfQorCWlmIChyeC0+dHJhbnMpIHsKKwkJcnhycGNfcHV0X3RyYW5zcG9ydChyeC0+dHJhbnMpOworCQlyeC0+dHJhbnMgPSBOVUxMOworCX0KKwlpZiAocngtPmxvY2FsKSB7CisJCXJ4cnBjX3B1dF9sb2NhbChyeC0+bG9jYWwpOworCQlyeC0+bG9jYWwgPSBOVUxMOworCX0KKworCWtleV9wdXQocngtPmtleSk7CisJcngtPmtleSA9IE5VTEw7CisJa2V5X3B1dChyeC0+c2VjdXJpdGllcyk7CisJcngtPnNlY3VyaXRpZXMgPSBOVUxMOworCXNvY2tfcHV0KHNrKTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogcmVsZWFzZSBhbiBSeFJQQyBCU0Qgc29ja2V0IG9uIGNsb3NlKCkgb3IgZXF1aXZhbGVudAorICovCitzdGF0aWMgaW50IHJ4cnBjX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCV9lbnRlcigiJXB7JXB9Iiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlzb2NrLT5zayA9IE5VTEw7CisKKwlyZXR1cm4gcnhycGNfcmVsZWFzZV9zb2NrKHNrKTsKK30KKworLyoKKyAqIFJ4UlBDIG5ldHdvcmsgcHJvdG9jb2wKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcnhycGNfcnBjX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX1VOSVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gcnhycGNfcmVsZWFzZSwKKwkuYmluZAkJPSByeHJwY19iaW5kLAorCS5jb25uZWN0CT0gcnhycGNfY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lCT0gc29ja19ub19nZXRuYW1lLAorCS5wb2xsCQk9IHJ4cnBjX3BvbGwsCisJLmlvY3RsCQk9IHNvY2tfbm9faW9jdGwsCisJLmxpc3RlbgkJPSByeHJwY19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHJ4cnBjX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBzb2NrX25vX2dldHNvY2tvcHQsCisJLnNlbmRtc2cJPSByeHJwY19zZW5kbXNnLAorCS5yZWN2bXNnCT0gcnhycGNfcmVjdm1zZywKKwkubW1hcAkJPSBzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlCT0gc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gcnhycGNfcHJvdG8gPSB7CisJLm5hbWUJCT0gIlJYUlBDIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCByeHJwY19zb2NrKSwKKwkubWF4X2hlYWRlcgk9IHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSByeHJwY19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9SWFJQQywKKwkuY3JlYXRlID0gcnhycGNfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIGluaXRpYWxpc2UgYW5kIHJlZ2lzdGVyIHRoZSBSeFJQQyBwcm90b2NvbAorICovCitzdGF0aWMgaW50IF9faW5pdCBhZl9yeHJwY19pbml0KHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmR1bW15X3NrYjsKKwlpbnQgcmV0ID0gLTE7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCByeHJwY19za2JfcHJpdikgPiBzaXplb2YoZHVtbXlfc2tiLT5jYikpOworCisJcnhycGNfZXBvY2ggPSBodG9ubCh4dGltZS50dl9zZWMpOworCisJcmV0ID0gLUVOT01FTTsKKwlyeHJwY19jYWxsX2phciA9IGttZW1fY2FjaGVfY3JlYXRlKAorCQkicnhycGNfY2FsbF9qYXIiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX2NhbGwpLCAwLAorCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmICghcnhycGNfY2FsbF9qYXIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJSeFJQQzogRmFpbGVkIHRvIGFsbG9jYXRlIGNhbGwgamFyXG4iKTsKKwkJZ290byBlcnJvcl9jYWxsX2phcjsKKwl9CisKKwlyeHJwY193b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJrcnhycGNkIik7CisJaWYgKCFyeHJwY193b3JrcXVldWUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJSeFJQQzogRmFpbGVkIHRvIGFsbG9jYXRlIHdvcmsgcXVldWVcbiIpOworCQlnb3RvIGVycm9yX3dvcmtfcXVldWU7CisJfQorCisJcmV0ID0gcHJvdG9fcmVnaXN0ZXIoJnJ4cnBjX3Byb3RvLCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJSeFJQQzogQ2Fubm90IHJlZ2lzdGVyIHByb3RvY29sXG4iKTsKKwkJZ290byBlcnJvcl9wcm90bzsKKwl9CisKKwlyZXQgPSBzb2NrX3JlZ2lzdGVyKCZyeHJwY19mYW1pbHlfb3BzKTsKKwlpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIlJ4UlBDOiBDYW5ub3QgcmVnaXN0ZXIgc29ja2V0IGZhbWlseVxuIik7CisJCWdvdG8gZXJyb3Jfc29jazsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9rZXlfdHlwZSgma2V5X3R5cGVfcnhycGMpOworCWlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiUnhSUEM6IENhbm5vdCByZWdpc3RlciBjbGllbnQga2V5IHR5cGVcbiIpOworCQlnb3RvIGVycm9yX2tleV90eXBlOworCX0KKworCXJldCA9IHJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV9yeHJwY19zKTsKKwlpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIlJ4UlBDOiBDYW5ub3QgcmVnaXN0ZXIgc2VydmVyIGtleSB0eXBlXG4iKTsKKwkJZ290byBlcnJvcl9rZXlfdHlwZV9zOworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19uZXRfZm9wc19jcmVhdGUoInJ4cnBjX2NhbGxzIiwgMCwgJnJ4cnBjX2NhbGxfc2VxX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJyeHJwY19jb25ucyIsIDAsICZyeHJwY19jb25uZWN0aW9uX3NlcV9mb3BzKTsKKyNlbmRpZgorCXJldHVybiAwOworCitlcnJvcl9rZXlfdHlwZV9zOgorCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjKTsKK2Vycm9yX2tleV90eXBlOgorCXNvY2tfdW5yZWdpc3RlcihQRl9SWFJQQyk7CitlcnJvcl9zb2NrOgorCXByb3RvX3VucmVnaXN0ZXIoJnJ4cnBjX3Byb3RvKTsKK2Vycm9yX3Byb3RvOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHJ4cnBjX3dvcmtxdWV1ZSk7CitlcnJvcl93b3JrX3F1ZXVlOgorCWttZW1fY2FjaGVfZGVzdHJveShyeHJwY19jYWxsX2phcik7CitlcnJvcl9jYWxsX2phcjoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdW5yZWdpc3RlciB0aGUgUnhSUEMgcHJvdG9jb2wKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFmX3J4cnBjX2V4aXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjX3MpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUlhSUEMpOworCXByb3RvX3VucmVnaXN0ZXIoJnJ4cnBjX3Byb3RvKTsKKwlyeHJwY19kZXN0cm95X2FsbF9jYWxscygpOworCXJ4cnBjX2Rlc3Ryb3lfYWxsX2Nvbm5lY3Rpb25zKCk7CisJcnhycGNfZGVzdHJveV9hbGxfdHJhbnNwb3J0cygpOworCXJ4cnBjX2Rlc3Ryb3lfYWxsX3BlZXJzKCk7CisJcnhycGNfZGVzdHJveV9hbGxfbG9jYWxzKCk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnJ4cnBjX25fc2ticyksID09LCAwKTsKKworCV9kZWJ1ZygiZmx1c2ggc2NoZWR1bGVkIHdvcmsiKTsKKwlmbHVzaF93b3JrcXVldWUocnhycGNfd29ya3F1ZXVlKTsKKwlwcm9jX25ldF9yZW1vdmUoInJ4cnBjX2Nvbm5zIik7CisJcHJvY19uZXRfcmVtb3ZlKCJyeHJwY19jYWxscyIpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHJ4cnBjX3dvcmtxdWV1ZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHJ4cnBjX2NhbGxfamFyKTsKKwlfbGVhdmUoIiIpOworfQorCittb2R1bGVfaW5pdChhZl9yeHJwY19pbml0KTsKK21vZHVsZV9leGl0KGFmX3J4cnBjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWFjY2VwdC5jIGIvbmV0L3J4cnBjL2FyLWFjY2VwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTg3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItYWNjZXB0LmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIGluY29taW5nIGNhbGwgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogZ2VuZXJhdGUgYSBjb25uZWN0aW9uLWxldmVsIGFib3J0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYnVzeShzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlzaXplX3QgbGVuOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVkLCwiLCBsb2NhbC0+ZGVidWdfaWQpOworCisJbXNnLm1zZ19uYW1lCT0gJnNyeC0+dHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4JPSBzaXplb2Yoc3J4LT50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncwk9IDA7CisKKwloZHItPnNlcQk9IDA7CisJaGRyLT50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQlVTWTsKKwloZHItPmZsYWdzCT0gMDsKKwloZHItPnVzZXJTdGF0dXMJPSAwOworCWhkci0+X3JzdmQJPSAwOworCisJaW92WzBdLmlvdl9iYXNlCT0gaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKCpoZHIpOworCisJbGVuID0gaW92WzBdLmlvdl9sZW47CisKKwloZHItPnNlcmlhbCA9IGh0b25sKDEpOworCV9wcm90bygiVHggQlVTWSAlJSV1IiwgbnRvaGwoaGRyLT5zZXJpYWwpKTsKKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9IC1FQUdBSU4gW3NlbmRtc2cgZmFpbGVkOiAlZF0iLCByZXQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsIHRoYXQgbmVlZHMgcGVlciwgdHJhbnNwb3J0IGFuZC9vciBjb25uZWN0aW9uIHNldHRpbmcKKyAqIHVwCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICBzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqbnNwOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBza19idWZmICpub3RpZmljYXRpb247CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogZ2V0IGEgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyIGFwcCAqLworCW5vdGlmaWNhdGlvbiA9IGFsbG9jX3NrYigwLCBHRlBfTk9GUyk7CisJcnhycGNfbmV3X3NrYihub3RpZmljYXRpb24pOworCW5vdGlmaWNhdGlvbi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX05FV19DQUxMOworCisJcGVlciA9IHJ4cnBjX2dldF9wZWVyKHNyeCwgR0ZQX05PSU8pOworCWlmIChJU19FUlIocGVlcikpIHsKKwkJX2RlYnVnKCJubyBwZWVyIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl0cmFucyA9IHJ4cnBjX2dldF90cmFuc3BvcnQobG9jYWwsIHBlZXIsIEdGUF9OT0lPKTsKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKwlpZiAoIXRyYW5zKSB7CisJCV9kZWJ1Zygibm8gdHJhbnMiKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCWNvbm4gPSByeHJwY19pbmNvbWluZ19jb25uZWN0aW9uKHRyYW5zLCAmc3AtPmhkciwgR0ZQX05PSU8pOworCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCWlmIChJU19FUlIoY29ubikpIHsKKwkJX2RlYnVnKCJubyBjb25uIik7CisJCXJldCA9IFBUUl9FUlIoY29ubik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY2FsbCA9IHJ4cnBjX2luY29taW5nX2NhbGwocngsIGNvbm4sICZzcC0+aGRyLCBHRlBfTk9JTyk7CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJaWYgKElTX0VSUihjYWxsKSkgeworCQlfZGVidWcoIm5vIGNhbGwiKTsKKwkJcmV0ID0gUFRSX0VSUihjYWxsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBhdHRhY2ggdGhlIGNhbGwgdG8gdGhlIHNvY2tldCAqLworCXJlYWRfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCisJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfSU5JVF9BQ0NFUFQsICZjYWxsLT5mbGFncykpIHsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkJc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKHNwLT5oZHIuc2VjdXJpdHlJbmRleCA+IDAgJiYKKwkJICAgIGNhbGwtPmNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVkVSX1VOU0VDVVJFRCkgeworCQkJX2RlYnVnKCJhd2FpdCBjb25uIHNlYyIpOworCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+c2VjdXJlcSk7CisJCQljYWxsLT5jb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSX0NIQUxMRU5HSU5HOworCQkJYXRvbWljX2luYygmY2FsbC0+Y29ubi0+dXNhZ2UpOworCQkJc2V0X2JpdChSWFJQQ19DT05OX0NIQUxMRU5HRSwgJmNhbGwtPmNvbm4tPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jb25uKGNhbGwtPmNvbm4pOworCQl9IGVsc2UgeworCQkJX2RlYnVnKCJjb25uIHJlYWR5Iik7CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFjY2VwdF9saW5rLCAmcngtPmFjY2VwdHEpOworCQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCQluc3AgPSByeHJwY19za2Iobm90aWZpY2F0aW9uKTsKKwkJCW5zcC0+Y2FsbCA9IGNhbGw7CisKKwkJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCA+PSwgMyk7CisKKwkJCV9kZWJ1Zygibm90aWZ5Iik7CisJCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBub3RpZmljYXRpb24sIHRydWUsCisJCQkJCQkgIGZhbHNlKTsKKwkJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJCW5vdGlmaWNhdGlvbiA9IE5VTEw7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlCVUcoKTsKKwkJfQorCQlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+c3RhdGVfbG9jayk7CisKKwkJX2RlYnVnKCJxdWV1ZWQiKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCV9kZWJ1ZygicHJvY2VzcyIpOworCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKKworCV9kZWJ1ZygiZG9uZSIpOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworaW52YWxpZF9zZXJ2aWNlOgorCV9kZWJ1ZygiaW52YWxpZCIpOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFLCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpIHsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlyZXQgPSAtRUNPTk5SRUZVU0VEOworZXJyb3I6CisJcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWNjZXB0IGluY29taW5nIGNhbGxzIHRoYXQgbmVlZCBwZWVyLCB0cmFuc3BvcnQgYW5kL29yIGNvbm5lY3Rpb24gc2V0dGluZyB1cAorICogLSB0aGUgcGFja2V0cyB3ZSBnZXQgYXJlIGFsbCBpbmNvbWluZyBjbGllbnQgREFUQSBwYWNrZXRzIHRoYXQgaGF2ZSBzZXEgPT0gMQorICovCit2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfbG9jYWwsIGFjY2VwdG9yKTsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OworCXN0cnVjdCBza19idWZmICpza2I7CisJX19iZTE2IHNlcnZpY2VfaWQ7CisJaW50IHJldDsKKworCV9lbnRlcigiJWQiLCBsb2NhbC0+ZGVidWdfaWQpOworCisJcmVhZF9sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSkgPiAwKQorCQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCWVsc2UKKwkJbG9jYWwgPSBOVUxMOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoIWxvY2FsKSB7CisJCV9sZWF2ZSgiIFtsb2NhbCBkZWFkXSIpOworCQlyZXR1cm47CisJfQorCitwcm9jZXNzX25leHRfcGFja2V0OgorCXNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKKwlpZiAoIXNrYikgeworCQlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCQlfbGVhdmUoIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlfbmV0KCJpbmNvbWluZyBjYWxsIHNrYiAlcCIsIHNrYik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogZGV0ZXJtaW5lIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCW1lbXNldCgmc3J4LCAwLCBzaXplb2Yoc3J4KSk7CisJc3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwlzcngudHJhbnNwb3J0LmZhbWlseSA9IGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseTsKKwlzcngudHJhbnNwb3J0X3R5cGUgPSBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlOworCXN3aXRjaCAoc3J4LnRyYW5zcG9ydC5mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0ID0gdWRwX2hkcihza2IpLT5zb3VyY2U7CisJCXNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBidXN5OworCX0KKworCS8qIGdldCB0aGUgc29ja2V0IHByb3ZpZGluZyB0aGUgc2VydmljZSAqLworCXNlcnZpY2VfaWQgPSBzcC0+aGRyLnNlcnZpY2VJZDsKKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgeworCQlpZiAocngtPnNlcnZpY2VfaWQgPT0gc2VydmljZV9pZCAmJgorCQkgICAgcngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX0NMT1NFKQorCQkJZ290byBmb3VuZF9zZXJ2aWNlOworCX0KKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCitmb3VuZF9zZXJ2aWNlOgorCV9kZWJ1ZygiZm91bmQgc2VydmljZSAlaGQiLCBudG9ocyhyeC0+c2VydmljZV9pZCkpOworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoJnJ4LT5zaykpCisJCWdvdG8gYmFja2xvZ19mdWxsOworCXNrX2FjY2VwdHFfYWRkZWQoJnJ4LT5zayk7CisJc29ja19ob2xkKCZyeC0+c2spOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisKKwlyZXQgPSByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbChsb2NhbCwgcngsIHNrYiwgJnNyeCk7CisJaWYgKHJldCA8IDApCisJCXNrX2FjY2VwdHFfcmVtb3ZlZCgmcngtPnNrKTsKKwlzb2NrX3B1dCgmcngtPnNrKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVDT05OUkVTRVQ6IC8qIG9sZCBjYWxscyBhcmUgaWdub3JlZCAqLworCWNhc2UgLUVDT05OQUJPUlRFRDogLyogYWJvcnRlZCBjYWxscyBhcmUgcmVhYm9ydGVkIG9yIGlnbm9yZWQgKi8KKwljYXNlIDA6CisJCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKwljYXNlIC1FQ09OTlJFRlVTRUQ6CisJCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCWNhc2UgLUVCVVNZOgorCQlnb3RvIGJ1c3k7CisJY2FzZSAtRUtFWVJFSkVDVEVEOgorCQlnb3RvIHNlY3VyaXR5X21pc21hdGNoOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworYmFja2xvZ19mdWxsOgorCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CitidXN5OgorCXJ4cnBjX2J1c3kobG9jYWwsICZzcngsICZzcC0+aGRyKTsKKwlyeHJwY19mcmVlX3NrYihza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKworaW52YWxpZF9zZXJ2aWNlOgorCXNrYi0+cHJpb3JpdHkgPSBSWF9JTlZBTElEX09QRVJBVElPTjsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKworCS8qIGNhbid0IGNoYW5nZSBjb25uZWN0aW9uIHNlY3VyaXR5IHR5cGUgbWlkLWZsb3cgKi8KK3NlY3VyaXR5X21pc21hdGNoOgorCXNrYi0+cHJpb3JpdHkgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKK30KKworLyoKKyAqIGhhbmRsZSBhY2NlcHRhbmNlIG9mIGEgY2FsbCBieSB1c2Vyc3BhY2UKKyAqIC0gYXNzaWduIHRoZSB1c2VyIGNhbGwgSUQgdG8gdGhlIGNhbGwgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwcDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIsJWx4IiwgdXNlcl9jYWxsX0lEKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcmV0ID0gLUVOT0RBVEE7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKKwkJZ290byBvdXQ7CisKKwkvKiBjaGVjayB0aGUgdXNlciBJRCBpc24ndCBhbHJlYWR5IGluIHVzZSAqLworCXJldCA9IC1FQkFEU0xUOworCXBwID0gJnJ4LT5jYWxscy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCisJCWlmICh1c2VyX2NhbGxfSUQgPCBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4gY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBkZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkICovCisJY2FsbCA9IGxpc3RfZW50cnkocngtPmFjY2VwdHEubmV4dCwgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJcmV0ID0gLUVDT05OQUJPUlRFRDsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKKwkJcmV0ID0gY2FsbC0+Y29ubi0+ZXJyb3I7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJY2FzZSBSWFJQQ19DQUxMX0RFQUQ6CisJCXJldCA9IC1FVElNRTsKKwkJZ290byBvdXRfZGlzY2FyZDsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiBmb3JtYWxpc2UgdGhlIGFjY2VwdGFuY2UgKi8KKwljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJcmJfbGlua19ub2RlKCZjYWxsLT5zb2NrX25vZGUsIHBhcmVudCwgcHApOworCXJiX2luc2VydF9jb2xvcigmY2FsbC0+c29ja19ub2RlLCAmcngtPmNhbGxzKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpCisJCUJVRygpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKQorCQlCVUcoKTsKKwlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gJXB7JWR9IiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOworCXJldHVybiBjYWxsOworCisJLyogaWYgdGhlIGNhbGwgaXMgYWxyZWFkeSBkeWluZyBvciBkZWFkLCB0aGVuIHdlIGxlYXZlIHRoZSBzb2NrZXQncyByZWYKKwkgKiBvbiBpdCB0byBiZSByZWxlYXNlZCBieSByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgpIGFzIGluZHVjZWQgYnkKKwkgKiByeHJwY19yZWxlYXNlX2NhbGwoKSAqLworb3V0X3JlbGVhc2U6CisJX2RlYnVnKCJyZWxlYXNlICVwIiwgY2FsbCk7CisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CitvdXRfZGlzY2FyZDoKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCV9kZWJ1ZygiZGlzY2FyZCAlcCIsIGNhbGwpOworb3V0OgorCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoKKyAqIGhhbmRsZSByZWplY3RhbmNlIG9mIGEgY2FsbCBieSB1c2Vyc3BhY2UKKyAqIC0gcmVqZWN0IHRoZSBjYWxsIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUKKyAqLworaW50IHJ4cnBjX3JlamVjdF9jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcmV0ID0gLUVOT0RBVEE7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKKwkJZ290byBvdXQ7CisKKwkvKiBkZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkICovCisJY2FsbCA9IGxpc3RfZW50cnkocngtPmFjY2VwdHEubmV4dCwgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgorCQlyZXQgPSAtRUNPTk5BQk9SVEVEOworCQlnb3RvIG91dF9yZWxlYXNlOworCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgorCQlyZXQgPSBjYWxsLT5jb25uLT5lcnJvcjsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfREVBRDoKKwkJcmV0ID0gLUVUSU1FOworCQlnb3RvIG91dF9kaXNjYXJkOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIGlmIHRoZSBjYWxsIGlzIGFscmVhZHkgZHlpbmcgb3IgZGVhZCwgdGhlbiB3ZSBsZWF2ZSB0aGUgc29ja2V0J3MgcmVmCisJICogb24gaXQgdG8gYmUgcmVsZWFzZWQgYnkgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQoKSBhcyBpbmR1Y2VkIGJ5CisJICogcnhycGNfcmVsZWFzZV9jYWxsKCkgKi8KK291dF9yZWxlYXNlOgorCV9kZWJ1ZygicmVsZWFzZSAlcCIsIGNhbGwpOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworb3V0X2Rpc2NhcmQ6CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlfZGVidWcoImRpc2NhcmQgJXAiLCBjYWxsKTsKK291dDoKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbAorICogQHNvY2s6IFRoZSBzb2NrZXQgb24gd2hpY2ggdGhlIGltcGVuZGluZyBjYWxsIGlzIHdhaXRpbmcKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSB0YWcgdG8gYXR0YWNoIHRvIHRoZSBjYWxsCisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbCwgYXNzdW1pbmcgdGhlIGluY29taW5nCisgKiBjYWxsIGlzIHN0aWxsIHZhbGlkLgorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKworCV9lbnRlcigiLCVseCIsIHVzZXJfY2FsbF9JRCk7CisJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSwgdXNlcl9jYWxsX0lEKTsKKwlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CisJcmV0dXJuIGNhbGw7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsCisgKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZworICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVqZWN0IGFuIGluY29taW5nIGNhbGwgd2l0aCBhIEJVU1kgbWVzc2FnZSwKKyAqIGFzc3VtaW5nIHRoZSBpbmNvbWluZyBjYWxsIGlzIHN0aWxsIHZhbGlkLgorICovCitpbnQgcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisJcmV0ID0gcnhycGNfcmVqZWN0X2NhbGwocnhycGNfc2soc29jay0+c2spKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbCk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItYWNrLmMgYi9uZXQvcnhycGMvYXItYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwN2E5MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1hY2suYwpAQCAtMCwwICsxLDEyNTAgQEAKKy8qIE1hbmFnZW1lbnQgb2YgVHggd2luZG93LCBUeCByZXNlbmQsIEFDS3MgYW5kIG91dC1vZi1zZXF1ZW5jZSByZWNlcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgdW5zaWduZWQgcnhycGNfYWNrX2RlZmVyID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2Fja3NbXSA9IHsKKwkiLS0tIiwgIlJFUSIsICJEVVAiLCAiT09TIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLCAiSURMIiwKKwkiLT8tIgorfTsKKworc3RhdGljIGNvbnN0IHM4IHJ4cnBjX2Fja19wcmlvcml0eVtdID0geworCVswXQkJCQk9IDAsCisJW1JYUlBDX0FDS19ERUxBWV0JCT0gMSwKKwlbUlhSUENfQUNLX1JFUVVFU1RFRF0JCT0gMiwKKwlbUlhSUENfQUNLX0lETEVdCQk9IDMsCisJW1JYUlBDX0FDS19QSU5HX1JFU1BPTlNFXQk9IDQsCisJW1JYUlBDX0FDS19EVVBMSUNBVEVdCQk9IDUsCisJW1JYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0VdCT0gNiwKKwlbUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XXQk9IDcsCisJW1JYUlBDX0FDS19OT1NQQUNFXQkJPSA4LAorfTsKKworLyoKKyAqIHByb3Bvc2UgYW4gQUNLIGJlIHNlbnQKKyAqLwordm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1aW50OF90IGFja19yZWFzb24sCisJCQkgX19iZTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUpCit7CisJdW5zaWduZWQgbG9uZyBleHBpcnk7CisJczggcHJpb3IgPSByeHJwY19hY2tfcHJpb3JpdHlbYWNrX3JlYXNvbl07CisKKwlBU1NFUlRDTVAocHJpb3IsID4sIDApOworCisJX2VudGVyKCJ7JWR9LCVzLCUlJXgsJXUiLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfYWNrc1thY2tfcmVhc29uXSwgbnRvaGwoc2VyaWFsKSwKKwkgICAgICAgaW1tZWRpYXRlKTsKKworCWlmIChwcmlvciA8IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJaWYgKGltbWVkaWF0ZSkKKwkJCWdvdG8gY2FuY2VsX3RpbWVyOworCQlyZXR1cm47CisJfQorCisJLyogdXBkYXRlIERFTEFZLCBJRExFLCBSRVFVRVNURUQgYW5kIFBJTkdfUkVTUE9OU0UgQUNLIHNlcmlhbAorCSAqIG51bWJlcnMgKi8KKwlpZiAocHJpb3IgPT0gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgeworCQlpZiAocHJpb3IgPD0gNCkKKwkJCWNhbGwtPmFja3Jfc2VyaWFsID0gc2VyaWFsOworCQlpZiAoaW1tZWRpYXRlKQorCQkJZ290byBjYW5jZWxfdGltZXI7CisJCXJldHVybjsKKwl9CisKKwljYWxsLT5hY2tyX3JlYXNvbiA9IGFja19yZWFzb247CisJY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7CisKKwlzd2l0Y2ggKGFja19yZWFzb24pIHsKKwljYXNlIFJYUlBDX0FDS19ERUxBWToKKwkJX2RlYnVnKCJydW4gZGVsYXkgdGltZXIiKTsKKwkJY2FsbC0+YWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfYWNrX3RpbWVvdXQgKiBIWjsKKwkJYWRkX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIpOworCQlyZXR1cm47CisKKwljYXNlIFJYUlBDX0FDS19JRExFOgorCQlpZiAoIWltbWVkaWF0ZSkgeworCQkJX2RlYnVnKCJydW4gZGVmZXIgdGltZXIiKTsKKwkJCWV4cGlyeSA9IDE7CisJCQlnb3RvIHJ1bl90aW1lcjsKKwkJfQorCQlnb3RvIGNhbmNlbF90aW1lcjsKKworCWNhc2UgUlhSUENfQUNLX1JFUVVFU1RFRDoKKwkJaWYgKCFyeHJwY19hY2tfZGVmZXIpCisJCQlnb3RvIGNhbmNlbF90aW1lcjsKKwkJaWYgKCFpbW1lZGlhdGUgfHwgc2VyaWFsID09IGNwdV90b19iZTMyKDEpKSB7CisJCQlfZGVidWcoInJ1biBkZWZlciB0aW1lciIpOworCQkJZXhwaXJ5ID0gcnhycGNfYWNrX2RlZmVyOworCQkJZ290byBydW5fdGltZXI7CisJCX0KKworCWRlZmF1bHQ6CisJCV9kZWJ1ZygiaW1tZWRpYXRlIEFDSyIpOworCQlnb3RvIGNhbmNlbF90aW1lcjsKKwl9CisKK3J1bl90aW1lcjoKKwlleHBpcnkgKz0gamlmZmllczsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmNhbGwtPmFja190aW1lcikgfHwKKwkgICAgdGltZV9hZnRlcihjYWxsLT5hY2tfdGltZXIuZXhwaXJlcywgZXhwaXJ5KSkKKwkJbW9kX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsIGV4cGlyeSk7CisJcmV0dXJuOworCitjYW5jZWxfdGltZXI6CisJX2RlYnVnKCJjYW5jZWwgdGltZXIgJSUldSIsIG50b2hsKHNlcmlhbCkpOworCXRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBwcm9wb3NlIGFuIEFDSyBiZSBzZW50LCBsb2NraW5nIHRoZSBjYWxsIHN0cnVjdHVyZQorICovCit2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1aW50OF90IGFja19yZWFzb24sCisJCSAgICAgICBfX2JlMzIgc2VyaWFsLCBib29sIGltbWVkaWF0ZSkKK3sKKwlzOCBwcmlvciA9IHJ4cnBjX2Fja19wcmlvcml0eVthY2tfcmVhc29uXTsKKworCWlmIChwcmlvciA+IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2tfcmVhc29uLCBzZXJpYWwsIGltbWVkaWF0ZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBzZXQgdGhlIHJlc2VuZCB0aW1lcgorICovCitzdGF0aWMgdm9pZCByeHJwY19zZXRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCByZXNlbmQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVzZW5kX2F0KQoreworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJlc2VuZCA9IDA7CisKKwlpZiAocmVzZW5kICYgMSkgeworCQlfZGVidWcoIlNFVCBSRVNFTkQiKTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX1JFU0VORCwgJmNhbGwtPmV2ZW50cyk7CisJfQorCisJaWYgKHJlc2VuZCAmIDIpIHsKKwkJX2RlYnVnKCJNT0RJRlkgUkVTRU5EIFRJTUVSIik7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCQltb2RfdGltZXIoJmNhbGwtPnJlc2VuZF90aW1lciwgcmVzZW5kX2F0KTsKKwl9IGVsc2UgeworCQlfZGVidWcoIktJTEwgUkVTRU5EIFRJTUVSIik7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCX0KKwlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiByZXNlbmQgcGFja2V0cworICovCitzdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfaGVhZGVyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnR4YjsKKwl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OworCWludCBsb29wLCBzdG9wOworCXU4IHJlc2VuZDsKKworCV9lbnRlcigieyVkLCVkLCVkLCVkfSwiLAorCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPmFja3NfdW5hY2tlZCwKKwkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKworCXN0b3AgPSAwOworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKworCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdGFpbDsKKwkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkIHx8IHN0b3A7CisJICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCisJICAgICApIHsKKwkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQlpZiAoKnBfdHhiICYgMSkKKwkJCWNvbnRpbnVlOworCisJCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAqcF90eGI7CisJCXNwID0gcnhycGNfc2tiKHR4Yik7CisKKwkJaWYgKHNwLT5uZWVkX3Jlc2VuZCkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMDsKKworCQkJLyogZWFjaCBUeCBwYWNrZXQgaGFzIGEgbmV3IHNlcmlhbCBudW1iZXIgKi8KKwkJCXNwLT5oZHIuc2VyaWFsID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisKKwkJCWhkciA9IChzdHJ1Y3QgcnhycGNfaGVhZGVyICopIHR4Yi0+aGVhZDsKKwkJCWhkci0+c2VyaWFsID0gc3AtPmhkci5zZXJpYWw7CisKKwkJCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyVkIH0iLAorCQkJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKwkJCWlmIChyeHJwY19zZW5kX3BhY2tldChjYWxsLT5jb25uLT50cmFucywgdHhiKSA8IDApIHsKKwkJCQlzdG9wID0gMDsKKwkJCQlzcC0+cmVzZW5kX2F0ID0gamlmZmllcyArIDM7CisJCQl9IGVsc2UgeworCQkJCXNwLT5yZXNlbmRfYXQgPQorCQkJCQlqaWZmaWVzICsgcnhycGNfcmVzZW5kX3RpbWVvdXQgKiBIWjsKKwkJCX0KKwkJfQorCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQorCQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCX0gZWxzZSB7CisJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OworCQkJcmVzZW5kIHw9IDI7CisJCX0KKwl9CisKKwlyeHJwY19zZXRfcmVzZW5kKGNhbGwsIHJlc2VuZCwgcmVzZW5kX2F0KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVyKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnR4YjsKKwl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OworCWludCBsb29wOworCXU4IHJlc2VuZDsKKworCV9lbnRlcigiJWQsJWQsJWQiLAorCSAgICAgICBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3NfdW5hY2tlZCwgY2FsbC0+YWNrc19oZWFkKTsKKworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKworCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdW5hY2tlZDsKKwkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkOworCSAgICAgbG9vcCA9IChsb29wICsgMSkgJiAgKGNhbGwtPmFja3Nfd2luc3ogLSAxKQorCSAgICAgKSB7CisJCXBfdHhiID0gY2FsbC0+YWNrc193aW5kb3cgKyBsb29wOworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJdHhiID0gKHN0cnVjdCBza19idWZmICopICgqcF90eGIgJiB+MSk7CisJCXNwID0gcnhycGNfc2tiKHR4Yik7CisKKwkJQVNTRVJUKCEoKnBfdHhiICYgMSkpOworCisJCWlmIChzcC0+bmVlZF9yZXNlbmQpIHsKKwkJCTsKKwkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQorCQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCX0gZWxzZSB7CisJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OworCQkJcmVzZW5kIHw9IDI7CisJCX0KKwl9CisKKwlyeHJwY19zZXRfcmVzZW5kKGNhbGwsIHJlc2VuZCwgcmVzZW5kX2F0KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJvY2VzcyBzb2Z0IEFDS3Mgb2Ygb3VyIHRyYW5zbWl0dGVkIHBhY2tldHMKKyAqIC0gdGhlc2UgaW5kaWNhdGUgcGFja2V0cyB0aGUgcGVlciBoYXMgb3IgaGFzIG5vdCByZWNlaXZlZCwgYnV0IGhhc24ndCB5ZXQKKyAqICAgZ2l2ZW4gdG8gdGhlIGNvbnN1bWVyLCBhbmQgc28gY2FuIHN0aWxsIGJlIGRpc2NhcmRlZCBhbmQgcmUtcmVxdWVzdGVkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY2Vzc19zb2Z0X0FDS3Moc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IHJ4cnBjX2Fja3BhY2tldCAqYWNrLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhiOworCXVuc2lnbmVkIGxvbmcgKnBfdHhiLCByZXNlbmRfYXQ7CisJaW50IGxvb3A7CisJdTggc2Fja3NbUlhSUENfTUFYQUNLU10sIHJlc2VuZDsKKworCV9lbnRlcigieyVkLCVkfSx7JWR9LCIsCisJICAgICAgIGNhbGwtPmFja3NfaGFyZCwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opLAorCSAgICAgICBhY2stPm5BY2tzKTsKKworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgc2Fja3MsIGFjay0+bkFja3MpIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgYWNrLT5uQWNrczsgbG9vcCsrKSB7CisJCXBfdHhiID0gY2FsbC0+YWNrc193aW5kb3c7CisJCXBfdHhiICs9IChjYWxsLT5hY2tzX3RhaWwgKyBsb29wKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKKwkJc3AgPSByeHJwY19za2IodHhiKTsKKworCQlzd2l0Y2ggKHNhY2tzW2xvb3BdKSB7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfQUNLOgorCQkJc3AtPm5lZWRfcmVzZW5kID0gMDsKKwkJCSpwX3R4YiB8PSAxOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKKwkJCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCQkqcF90eGIgJj0gfjE7CisJCQlyZXNlbmQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlfZGVidWcoIlVuc3VwcG9ydGVkIEFDSyB0eXBlICVkIiwgc2Fja3NbbG9vcF0pOworCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCX0KKworCXNtcF9tYigpOworCWNhbGwtPmFja3NfdW5hY2tlZCA9IChjYWxsLT5hY2tzX3RhaWwgKyBsb29wKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisKKwkvKiBhbnl0aGluZyBub3QgZXhwbGljaXRseSBBQ0snZCBpcyBpbXBsaWNpdGx5IE5BQ0snZCwgYnV0IG1heSBqdXN0IG5vdAorCSAqIGhhdmUgYmVlbiByZWNlaXZlZCBvciBwcm9jZXNzZWQgeWV0IGJ5IHRoZSBmYXIgZW5kICovCisJZm9yIChsb29wID0gY2FsbC0+YWNrc191bmFja2VkOworCSAgICAgbG9vcCAhPSBjYWxsLT5hY2tzX2hlYWQ7CisJICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCisJICAgICApIHsKKwkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKKwkJc3AgPSByeHJwY19za2IodHhiKTsKKworCQlpZiAoKnBfdHhiICYgMSkgeworCQkJLyogcGFja2V0IG11c3QgaGF2ZSBiZWVuIGRpc2NhcmRlZCAqLworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCSpwX3R4YiAmPSB+MTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHNwLT5uZWVkX3Jlc2VuZCkgeworCQkJOworCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7CisJCQlzcC0+bmVlZF9yZXNlbmQgPSAxOworCQkJcmVzZW5kIHw9IDE7CisJCX0gZWxzZSBpZiAocmVzZW5kICYgMikgeworCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCisJCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKKwkJfSBlbHNlIHsKKwkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCQlyZXNlbmQgfD0gMjsKKwkJfQorCX0KKworCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitwcm90b2NvbF9lcnJvcjoKKwlfbGVhdmUoIiA9IC1FUFJPVE8iKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIGRpc2NhcmQgaGFyZC1BQ0snZCBwYWNrZXRzIGZyb20gdGhlIFR4IHdpbmRvdworICovCitzdGF0aWMgdm9pZCByeHJwY19yb3RhdGVfdHhfd2luZG93KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgaGFyZCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXVuc2lnbmVkIGxvbmcgX3NrYjsKKwlpbnQgdGFpbCA9IGNhbGwtPmFja3NfdGFpbCwgb2xkX3RhaWw7CisJaW50IHdpbiA9IENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgdGFpbCwgY2FsbC0+YWNrc193aW5zeik7CisKKwlfZW50ZXIoInsldSwldX0sJXUiLCBjYWxsLT5hY2tzX2hhcmQsIHdpbiwgaGFyZCk7CisKKwlBU1NFUlRDTVAoaGFyZCAtIGNhbGwtPmFja3NfaGFyZCwgPD0sIHdpbik7CisKKwl3aGlsZSAoY2FsbC0+YWNrc19oYXJkIDwgaGFyZCkgeworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJX3NrYiA9IGNhbGwtPmFja3Nfd2luZG93W3RhaWxdICYgfjE7CisJCXNwID0gcnhycGNfc2tiKChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiKTsKKwkJcnhycGNfZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopIF9za2IpOworCQlvbGRfdGFpbCA9IHRhaWw7CisJCXRhaWwgPSAodGFpbCArIDEpICYgKGNhbGwtPmFja3Nfd2luc3ogLSAxKTsKKwkJY2FsbC0+YWNrc190YWlsID0gdGFpbDsKKwkJaWYgKGNhbGwtPmFja3NfdW5hY2tlZCA9PSBvbGRfdGFpbCkKKwkJCWNhbGwtPmFja3NfdW5hY2tlZCA9IHRhaWw7CisJCWNhbGwtPmFja3NfaGFyZCsrOworCX0KKworCXdha2VfdXAoJmNhbGwtPnR4X3dhaXRxKTsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBUeCB3aW5kb3cgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZQorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhcl90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJcnhycGNfcm90YXRlX3R4X3dpbmRvdyhjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+c2VxdWVuY2UpKTsKK30KKworLyoKKyAqIGRyYWluIHRoZSBvdXQgb2Ygc2VxdWVuY2UgcmVjZWl2ZWQgcGFja2V0IHF1ZXVlIGludG8gdGhlIHBhY2tldCBSeCBxdWV1ZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCB0ZXJtaW5hbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJWR9IiwgY2FsbC0+cnhfZGF0YV9wb3N0LCBjYWxsLT5yeF9maXJzdF9vb3MpOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCXJldCA9IC1FQ09OTlJFU0VUOworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKQorCQlnb3RvIHNvY2tldF91bmF2YWlsYWJsZTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpOworCWlmIChza2IpIHsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCQlfZGVidWcoImRyYWluIE9PUyBwYWNrZXQgJWQgWyVkXSIsCisJCSAgICAgICBudG9obChzcC0+aGRyLnNlcSksIGNhbGwtPnJ4X2ZpcnN0X29vcyk7CisKKwkJaWYgKG50b2hsKHNwLT5oZHIuc2VxKSAhPSBjYWxsLT5yeF9maXJzdF9vb3MpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZjYWxsLT5yeF9vb3NfcXVldWUsIHNrYik7CisJCQljYWxsLT5yeF9maXJzdF9vb3MgPSBudG9obChyeHJwY19za2Ioc2tiKS0+aGRyLnNlcSk7CisJCQlfZGVidWcoInJlcXVldWUgJXAgeyV1fSIsIHNrYiwgY2FsbC0+cnhfZmlyc3Rfb29zKTsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0RBVEE7CisJCQl0ZXJtaW5hbCA9ICgoc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSAmJgorCQkJCSEoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpKTsKKwkJCXJldCA9IHJ4cnBjX3F1ZXVlX3Jjdl9za2IoY2FsbCwgc2tiLCB0cnVlLCB0ZXJtaW5hbCk7CisJCQlCVUdfT04ocmV0IDwgMCk7CisJCQlfZGVidWcoImRyYWluICMldSIsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7CisJCQljYWxsLT5yeF9kYXRhX3Bvc3QrKzsKKworCQkJLyogZmluZCBvdXQgd2hhdCB0aGUgbmV4dCBwYWNrZXQgaXMgKi8KKwkJCXNrYiA9IHNrYl9wZWVrKCZjYWxsLT5yeF9vb3NfcXVldWUpOworCQkJaWYgKHNrYikKKwkJCQljYWxsLT5yeF9maXJzdF9vb3MgPQorCQkJCQludG9obChyeHJwY19za2Ioc2tiKS0+aGRyLnNlcSk7CisJCQllbHNlCisJCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKKwkJCV9kZWJ1ZygicGVlayAlcCB7JXV9Iiwgc2tiLCBjYWxsLT5yeF9maXJzdF9vb3MpOworCQl9CisJfQorCisJcmV0ID0gMDsKK3NvY2tldF91bmF2YWlsYWJsZToKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGluc2VydCBhbiBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0IGludG8gdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnNlcnRfb29zX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqcHNwOworCXN0cnVjdCBza19idWZmICpwOworCXUzMiBzZXE7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCXNlcSA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKwlfZW50ZXIoIiwseyV1fSIsIHNlcSk7CisKKwlza2ItPmRlc3RydWN0b3IgPSByeHJwY19wYWNrZXRfZGVzdHJ1Y3RvcjsKKwlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBOVUxMKTsKKwlzcC0+Y2FsbCA9IGNhbGw7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkvKiBpbnNlcnQgaW50byB0aGUgYnVmZmVyIGluIHNlcXVlbmNlIG9yZGVyICovCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCXNrYl9xdWV1ZV93YWxrKCZjYWxsLT5yeF9vb3NfcXVldWUsIHApIHsKKwkJcHNwID0gcnhycGNfc2tiKHApOworCQlpZiAobnRvaGwocHNwLT5oZHIuc2VxKSA+IHNlcSkgeworCQkJX2RlYnVnKCJpbnNlcnQgb29zICMldSBiZWZvcmUgIyV1IiwKKwkJCSAgICAgICBzZXEsIG50b2hsKHBzcC0+aGRyLnNlcSkpOworCQkJc2tiX2luc2VydChwLCBza2IsICZjYWxsLT5yeF9vb3NfcXVldWUpOworCQkJZ290byBpbnNlcnRlZDsKKwkJfQorCX0KKworCV9kZWJ1ZygiYXBwZW5kIG9vcyAjJXUiLCBzZXEpOworCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9vb3NfcXVldWUsIHNrYik7CitpbnNlcnRlZDoKKworCS8qIHdlIG1pZ2h0IG5vdyBoYXZlIGEgbmV3IGZyb250IHRvIHRoZSBxdWV1ZSAqLworCWlmIChjYWxsLT5yeF9maXJzdF9vb3MgPT0gMCB8fCBzZXEgPCBjYWxsLT5yeF9maXJzdF9vb3MpCisJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IHNlcTsKKworCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICBjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKSB7CisJCV9kZWJ1ZygiZHJhaW4gcnggb29zIG5vdyIpOworCQlzZXRfYml0KFJYUlBDX0NBTExfRFJBSU5fUlhfT09TLCAmY2FsbC0+ZXZlbnRzKTsKKwl9CisJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCV9sZWF2ZSgiIFtzdG9yZWQgIyV1XSIsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Cit9CisKKy8qCisgKiBjbGVhciB0aGUgVHggd2luZG93IG9uIGZpbmFsIEFDSyByZWNlcHRpb24KKyAqLworc3RhdGljIHZvaWQgcnhycGNfemFwX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBfc2tiLCAqYWNrc193aW5kb3c7CisJdWludDhfdCB3aW5zeiA9IGNhbGwtPmFja3Nfd2luc3o7CisJaW50IHRhaWw7CisKKwlhY2tzX3dpbmRvdyA9IGNhbGwtPmFja3Nfd2luZG93OworCWNhbGwtPmFja3Nfd2luZG93ID0gTlVMTDsKKworCXdoaWxlIChDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwgd2luc3opID4gMCkgeworCQl0YWlsID0gY2FsbC0+YWNrc190YWlsOworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJX3NrYiA9IGFja3Nfd2luZG93W3RhaWxdICYgfjE7CisJCXNtcF9tYigpOworCQljYWxsLT5hY2tzX3RhaWwgPSAoY2FsbC0+YWNrc190YWlsICsgMSkgJiAod2luc3ogLSAxKTsKKworCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgX3NrYjsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJX2RlYnVnKCIrKysgY2xlYXIgVHggJXUiLCBudG9obChzcC0+aGRyLnNlcSkpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCX0KKworCWtmcmVlKGFja3Nfd2luZG93KTsKK30KKworLyoKKyAqIHByb2Nlc3MgcGFja2V0cyBpbiB0aGUgcmVjZXB0aW9uIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY2Vzc19yeF9xdWV1ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgIHUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IHJ4cnBjX2Fja3BhY2tldCBhY2s7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWJvb2wgcG9zdF9BQ0s7CisJaW50IGxhdGVzdDsKKwl1MzIgaGFyZCwgdHg7CisKKwlfZW50ZXIoIiIpOworCitwcm9jZXNzX2Z1cnRoZXI6CisJc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlfbmV0KCJkZWZlcnJlZCBza2IgJXAiLCBza2IpOworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCV9kZWJ1ZygicHJvY2VzcyAlcyBbc3QgJWRdIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdLCBjYWxsLT5zdGF0ZSk7CisKKwlwb3N0X0FDSyA9IGZhbHNlOworCisJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwkJLyogZGF0YSBwYWNrZXRzIHRoYXQgd2luZCB1cCBoZXJlIGhhdmUgYmVlbiByZWNlaXZlZCBvdXQgb2YKKwkJICogb3JkZXIsIG5lZWQgc2VjdXJpdHkgcHJvY2Vzc2luZyBvciBhcmUganVtYm8gcGFja2V0cyAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKKwkJX3Byb3RvKCJPT1NRIERBVEEgJSUldSB7ICMldSB9IiwKKwkJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCQkvKiBzZWN1cmVkIHBhY2tldHMgbXVzdCBiZSB2ZXJpZmllZCBhbmQgcG9zc2libHkgZGVjcnlwdGVkICovCisJCWlmIChyeHJwY192ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwkJcnhycGNfaW5zZXJ0X29vc19wYWNrZXQoY2FsbCwgc2tiKTsKKwkJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisKKwkJLyogcGFydGlhbCBBQ0sgdG8gcHJvY2VzcyAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZhY2ssIHNpemVvZihhY2spKSA8IDApIHsKKwkJCV9kZWJ1ZygiZXh0cmFjdGlvbiBmYWlsdXJlIik7CisJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCQl9CisJCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2YoYWNrKSkpCisJCQlCVUcoKTsKKworCQlsYXRlc3QgPSBudG9obChzcC0+aGRyLnNlcmlhbCk7CisJCWhhcmQgPSBudG9obChhY2suZmlyc3RQYWNrZXQpOworCQl0eCA9IGF0b21pY19yZWFkKCZjYWxsLT5zZXF1ZW5jZSk7CisKKwkJX3Byb3RvKCJSeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJCSAgICAgICBsYXRlc3QsCisJCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCisJCSAgICAgICBoYXJkLAorCQkgICAgICAgbnRvaGwoYWNrLnByZXZpb3VzUGFja2V0KSwKKwkJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAorCQkgICAgICAgcnhycGNfYWNrc1thY2sucmVhc29uXSwKKwkJICAgICAgIGFjay5uQWNrcyk7CisKKwkJaWYgKGFjay5yZWFzb24gPT0gUlhSUENfQUNLX1BJTkcpIHsKKwkJCV9wcm90bygiUnggQUNLICUlJXUgUElORyBSZXF1ZXN0IiwgbGF0ZXN0KTsKKwkJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFLAorCQkJCQkgIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKKwkJfQorCisJCS8qIGRpc2NhcmQgYW55IG91dC1vZi1vcmRlciBvciBkdXBsaWNhdGUgQUNLcyAqLworCQlpZiAobGF0ZXN0IC0gY2FsbC0+YWNrc19sYXRlc3QgPD0gMCkgeworCQkJX2RlYnVnKCJkaXNjYXJkIEFDSyAlZCA8PSAlZCIsCisJCQkgICAgICAgbGF0ZXN0LCBjYWxsLT5hY2tzX2xhdGVzdCk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJY2FsbC0+YWNrc19sYXRlc3QgPSBsYXRlc3Q7CisKKwkJaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFkgJiYKKwkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkgJiYKKwkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDSykKKwkJCWdvdG8gZGlzY2FyZDsKKworCQlfZGVidWcoIlR4PSVkIEg9JXUgUz0lZCIsIHR4LCBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPnN0YXRlKTsKKworCQlpZiAoaGFyZCA+IDApIHsKKwkJCWlmIChoYXJkIC0gMSA+IHR4KSB7CisJCQkJX2RlYnVnKCJoYXJkLUFDSydkIHBhY2tldCAlZCBub3QgdHJhbnNtaXR0ZWQiCisJCQkJICAgICAgICIgKCVkIHRvcCkiLAorCQkJCSAgICAgICBoYXJkIC0gMSwgdHgpOworCQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCQl9CisKKwkJCWlmICgoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFkgfHwKKwkJCSAgICAgY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLKSAmJgorCQkJICAgIGhhcmQgPiB0eCkKKwkJCQlnb3RvIGFsbF9hY2tlZDsKKworCQkJc21wX3JtYigpOworCQkJcnhycGNfcm90YXRlX3R4X3dpbmRvdyhjYWxsLCBoYXJkIC0gMSk7CisJCX0KKworCQlpZiAoYWNrLm5BY2tzID4gMCkgeworCQkJaWYgKGhhcmQgLSAxICsgYWNrLm5BY2tzID4gdHgpIHsKKwkJCQlfZGVidWcoInNvZnQtQUNLJ2QgcGFja2V0ICVkKyVkIG5vdCIKKwkJCQkgICAgICAgIiB0cmFuc21pdHRlZCAoJWQgdG9wKSIsCisJCQkJICAgICAgIGhhcmQgLSAxLCBhY2subkFja3MsIHR4KTsKKwkJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCQkJfQorCisJCQlpZiAocnhycGNfcHJvY2Vzc19zb2Z0X0FDS3MoY2FsbCwgJmFjaywgc2tiKSA8IDApCisJCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCQlnb3RvIGRpc2NhcmQ7CisKKwkJLyogY29tcGxldGUgQUNLIHRvIHByb2Nlc3MgKi8KKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDS0FMTDoKKwkJZ290byBhbGxfYWNrZWQ7CisKKwkJLyogYWJvcnQgYW5kIGJ1c3kgYXJlIGhhbmRsZWQgZWxzZXdoZXJlICovCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9CVVNZOgorCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6CisJCUJVRygpOworCisJCS8qIGNvbm5lY3Rpb24gbGV2ZWwgZXZlbnRzIC0gYWxzbyBoYW5kbGVkIGVsc2V3aGVyZSAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOgorCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfUkVTUE9OU0U6CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9ERUJVRzoKKwkJQlVHKCk7CisJfQorCisJLyogaWYgd2UndmUgaGFkIGEgaGFyZCBBQ0sgdGhhdCBjb3ZlcnMgYWxsIHRoZSBwYWNrZXRzIHdlJ3ZlIHNlbnQsIHRoZW4KKwkgKiB0aGF0IGVuZHMgdGhhdCBwaGFzZSBvZiB0aGUgb3BlcmF0aW9uICovCithbGxfYWNrZWQ6CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJX2RlYnVnKCJhY2sgYWxsICVkIiwgY2FsbC0+c3RhdGUpOworCisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s6CisJCV9kZWJ1Zygic3J2IGNvbXBsZXRlIik7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DT01QTEVURTsKKwkJcG9zdF9BQ0sgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKKwkJZ290byBwcm90b2NvbF9lcnJvcl91bmxvY2s7IC8qIGNhbid0IG9jY3VyIHlldCAqLworCWRlZmF1bHQ6CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWdvdG8gZGlzY2FyZDsgLyogYXNzdW1lIHBhY2tldCBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHBoYXNlICovCisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCS8qIGlmIGFsbCB0aGUgcGFja2V0cyB3ZSBzZW50IGFyZSBoYXJkLUFDSydkLCB0aGVuIHdlIGNhbiBkaXNjYXJkCisJICogd2hhdGV2ZXIgd2UndmUgZ290IGxlZnQgKi8KKwlfZGVidWcoImNsZWFyIFR4ICVkIiwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKworCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKKworCWlmIChjYWxsLT5hY2tzX3dpbmRvdykKKwkJcnhycGNfemFwX3R4X3dpbmRvdyhjYWxsKTsKKworCWlmIChwb3N0X0FDSykgeworCQkvKiBwb3N0IHRoZSBmaW5hbCBBQ0sgbWVzc2FnZSBmb3IgdXNlcnNwYWNlIHRvIHBpY2sgdXAgKi8KKwkJX2RlYnVnKCJwb3N0IEFDSyIpOworCQlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s7CisJCXNwLT5jYWxsID0gY2FsbDsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWlmIChyeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgdHJ1ZSkgPCAwKQorCQkJQlVHKCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisJfQorCitkaXNjYXJkOgorCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisKK3Byb3RvY29sX2Vycm9yX3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworcHJvdG9jb2xfZXJyb3I6CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlfbGVhdmUoIiA9IC1FUFJPVE8iKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIHBvc3QgYSBtZXNzYWdlIHRvIHRoZSBzb2NrZXQgUnggcXVldWUgZm9yIHJlY3Ztc2coKSB0byBwaWNrIHVwCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcG9zdF9tZXNzYWdlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgbWFyaywgdTMyIGVycm9yLAorCQkJICAgICAgYm9vbCBmYXRhbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCVseH0sJXUsJXUsJWQiLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+ZmxhZ3MsIG1hcmssIGVycm9yLCBmYXRhbCk7CisKKwkvKiByZW1vdmUgdGltZXJzIGFuZCB0aGluZ3MgZm9yIGZhdGFsIG1lc3NhZ2VzICovCisJaWYgKGZhdGFsKSB7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKKwl9CisKKwlpZiAobWFyayAhPSBSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCAmJgorCSAgICAhdGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9sZWF2ZSgiW25vIHVzZXJpZF0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKSkgeworCQlza2IgPSBhbGxvY19za2IoMCwgR0ZQX05PRlMpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJ4cnBjX25ld19za2Ioc2tiKTsKKworCQlza2ItPm1hcmsgPSBtYXJrOworCisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCW1lbXNldChzcCwgMCwgc2l6ZW9mKCpzcCkpOworCQlzcC0+ZXJyb3IgPSBlcnJvcjsKKwkJc3AtPmNhbGwgPSBjYWxsOworCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgZmF0YWwpOworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJQlVHKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoYW5kbGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIG9mIGluY29taW5nIGNhbGwgcGFja2V0cyBhbmQgQUNLIC8gYWJvcnQKKyAqIGdlbmVyYXRpb24KKyAqLwordm9pZCByeHJwY19wcm9jZXNzX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19jYWxsLCBwcm9jZXNzb3IpOworCXN0cnVjdCByeHJwY19hY2twYWNrZXQgYWNrOworCXN0cnVjdCByeHJwY19hY2tpbmZvIGFja2luZm87CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzVdOworCXVuc2lnbmVkIGxvbmcgYml0czsKKwlfX2JlMzIgZGF0YTsKKwlzaXplX3QgbGVuOworCWludCBnZW5iaXQsIGxvb3AsIG5iaXQsIGlvYywgcmV0OworCXUzMiBhYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CisJdTggKmFja3MgPSBOVUxMOworCisJLy9wcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCV9lbnRlcigieyVkLCVzLCVseH0gWyVsdV0iLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLCBjYWxsLT5ldmVudHMsCisJICAgICAgIChqaWZmaWVzIC0gY2FsbC0+Y3JlYXRpb25famlmKSAvIChIWiAvIDEwKSk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoIlhYWFhYWFhYWFhYWFggUlVOTklORyBPTiBNVUxUSVBMRSBDUFVTIFhYWFhYWFhYWFhYWFgiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHNlbmQgYSBtZXNzYWdlLCBzbyBzZXQKKwkgKiBvbmUgdXAgaW4gYWR2YW5jZSAqLworCW1zZy5tc2dfbmFtZQk9ICZjYWxsLT5jb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLmVwb2NoCT0gY2FsbC0+Y29ubi0+ZXBvY2g7CisJaGRyLmNpZAkJPSBjYWxsLT5jaWQ7CisJaGRyLmNhbGxOdW1iZXIJPSBjYWxsLT5jYWxsX2lkOworCWhkci5zZXEJCT0gMDsKKwloZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzsKKwloZHIuZmxhZ3MJPSBjYWxsLT5jb25uLT5vdXRfY2xpZW50ZmxhZzsKKwloZHIudXNlclN0YXR1cwk9IDA7CisJaGRyLnNlY3VyaXR5SW5kZXggPSBjYWxsLT5jb25uLT5zZWN1cml0eV9peDsKKwloZHIuX3JzdmQJPSAwOworCWhkci5zZXJ2aWNlSWQJPSBjYWxsLT5jb25uLT5zZXJ2aWNlX2lkOworCisJbWVtc2V0KGlvdiwgMCwgc2l6ZW9mKGlvdikpOworCWlvdlswXS5pb3ZfYmFzZQk9ICZoZHI7CisJaW92WzBdLmlvdl9sZW4JPSBzaXplb2YoaGRyKTsKKworCS8qIGRlYWwgd2l0aCBldmVudHMgb2YgYSBmaW5hbCBuYXR1cmUgKi8KKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkgeworCQlyeHJwY19yZWxlYXNlX2NhbGwoY2FsbCk7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfRVJST1IsICZjYWxsLT5ldmVudHMpKSB7CisJCWludCBlcnJvcjsKKworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisKKwkJZXJyb3IgPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bmV0X2Vycm9yOworCQlfZGVidWcoInBvc3QgbmV0IGVycm9yICVkIiwgZXJyb3IpOworCisJCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgUlhSUENfU0tCX01BUktfTkVUX0VSUk9SLAorCQkJCSAgICAgICBlcnJvciwgdHJ1ZSkgPCAwKQorCQkJZ290byBub19tZW07CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JDVkRfRVJST1IsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKwl9CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgeworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID4sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JFSkVDVF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCisJCV9kZWJ1ZygicG9zdCBjb25uIGFib3J0Iik7CisKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgY2FsbC0+Y29ubi0+ZXJyb3IsIHRydWUpIDwgMCkKKwkJCWdvdG8gbm9fbWVtOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZ290byBraWxsX0FDS3M7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKSB7CisJCWhkci50eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQlVTWTsKKwkJZ2VuYml0ID0gUlhSUENfQ0FMTF9SRUpFQ1RfQlVTWTsKKwkJZ290byBzZW5kX21lc3NhZ2U7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7CisJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPiwgUlhSUENfQ0FMTF9DT01QTEVURSk7CisKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgRUNPTk5BQk9SVEVELCB0cnVlKSA8IDApCisJCQlnb3RvIG5vX21lbTsKKwkJaGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKKwkJZGF0YSA9IGh0b25sKGNhbGwtPmFib3J0X2NvZGUpOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmZGF0YTsKKwkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoZGF0YSk7CisJCWdlbmJpdCA9IFJYUlBDX0NBTExfQUJPUlQ7CisJCWdvdG8gc2VuZF9tZXNzYWdlOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJaGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0tBTEw7CisJCWdlbmJpdCA9IFJYUlBDX0NBTExfQUNLX0ZJTkFMOworCQlnb3RvIHNlbmRfbWVzc2FnZTsKKwl9CisKKwlpZiAoY2FsbC0+ZXZlbnRzICYgKCgxIDw8IFJYUlBDX0NBTExfUkNWRF9CVVNZKSB8CisJCQkgICAgKDEgPDwgUlhSUENfQ0FMTF9SQ1ZEX0FCT1JUKSkKKwkgICAgKSB7CisJCXUzMiBtYXJrOworCisJCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpKQorCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVDsKKwkJZWxzZQorCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX0JVU1k7CisKKwkJX2RlYnVnKCJwb3N0IGFib3J0L2J1c3kiKTsKKwkJcnhycGNfY2xlYXJfdHhfd2luZG93KGNhbGwpOworCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIG1hcmssIEVDT05OQUJPUlRFRCwgdHJ1ZSkgPCAwKQorCQkJZ290byBub19tZW07CisKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkNWRF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCWdvdG8ga2lsbF9BQ0tzOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJkbyBpbXBsaWNpdCBhY2thbGwiKTsKKwkJcnhycGNfY2xlYXJfdHhfd2luZG93KGNhbGwpOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpKSB7CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9DQUxMX1RJTUVPVVQ7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwkJX2RlYnVnKCJwb3N0IHRpbWVvdXQiKTsKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgRVRJTUUsIHRydWUpIDwgMCkKKwkJCWdvdG8gbm9fbWVtOworCisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKwl9CisKKwkvKiBkZWFsIHdpdGggYXNzb3J0ZWQgaW5ib3VuZCBtZXNzYWdlcyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJc3dpdGNoIChyeHJwY19wcm9jZXNzX3J4X3F1ZXVlKGNhbGwsICZhYm9ydF9jb2RlKSkgeworCQljYXNlIDA6CisJCWNhc2UgLUVBR0FJTjoKKwkJCWJyZWFrOworCQljYXNlIC1FTk9NRU06CisJCQlnb3RvIG5vX21lbTsKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCWNhc2UgLUVLRVlSRUpFQ1RFRDoKKwkJY2FzZSAtRVBST1RPOgorCQkJcnhycGNfYWJvcnRfY2FsbChjYWxsLCBhYm9ydF9jb2RlKTsKKwkJCWdvdG8ga2lsbF9BQ0tzOworCQl9CisJfQorCisJLyogaGFuZGxlIHJlc2VuZGluZyAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19yZXNlbmRfdGltZXIoY2FsbCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX1JFU0VORCwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3Jlc2VuZChjYWxsKTsKKworCS8qIGNvbnNpZGVyIHNlbmRpbmcgYW4gb3JkaW5hcnkgQUNLICovCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfQUNLLCAmY2FsbC0+ZXZlbnRzKSkgeworCQlfX2JlMzIgcGFkOworCisJCV9kZWJ1Zygic2VuZCBBQ0s6IHdpbmRvdzogJWQgLSAlZCB7ICVseCB9IiwKKwkJICAgICAgIGNhbGwtPnJ4X2RhdGFfZWF0ZW4sIGNhbGwtPmFja3Jfd2luX3RvcCwKKwkJICAgICAgIGNhbGwtPmFja3Jfd2luZG93WzBdKTsKKworCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+YWNrcl9yZWFzb24gIT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpIHsKKwkJCS8qIEFDSyBieSBzZW5kaW5nIHJlcGx5IERBVEEgcGFja2V0IGluIHRoaXMgc3RhdGUgKi8KKwkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cyk7CisJCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CisJCX0KKworCQlnZW5iaXQgPSBSWFJQQ19DQUxMX0FDSzsKKworCQlhY2tzID0ga3phbGxvYyhjYWxsLT5hY2tyX3dpbl90b3AgLSBjYWxsLT5yeF9kYXRhX2VhdGVuLAorCQkJICAgICAgIEdGUF9OT0ZTKTsKKwkJaWYgKCFhY2tzKQorCQkJZ290byBub19tZW07CisKKwkJLy9oZHIuZmxhZ3MJPSBSWFJQQ19TTE9XX1NUQVJUX09LOworCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyg4KTsKKwkJYWNrLm1heFNrZXcJPSAwOworCQlhY2suc2VyaWFsCT0gMDsKKwkJYWNrLnJlYXNvbgk9IDA7CisKKwkJYWNraW5mby5yeE1UVQk9IGh0b25sKDU2OTIpOworLy8JCWFja2luZm8ucnhNVFUJPSBodG9ubChjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bWF4ZGF0YSk7CisJCWFja2luZm8ubWF4TVRVCT0gaHRvbmwoY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPm1heGRhdGEpOworCQlhY2tpbmZvLnJ3aW5kCT0gaHRvbmwoMzIpOworCQlhY2tpbmZvLmp1bWJvX21heCA9IGh0b25sKDQpOworCisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWFjay5yZWFzb24gPSBjYWxsLT5hY2tyX3JlYXNvbjsKKwkJYWNrLnNlcmlhbCA9IGNhbGwtPmFja3Jfc2VyaWFsOworCQlhY2sucHJldmlvdXNQYWNrZXQgPSBjYWxsLT5hY2tyX3ByZXZfc2VxOworCQlhY2suZmlyc3RQYWNrZXQgPSBodG9ubChjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7CisKKwkJYWNrLm5BY2tzID0gMDsKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX0FDS1JfV0lORE9XX0FTWjsgbG9vcCsrKSB7CisJCQluYml0ID0gbG9vcCAqIEJJVFNfUEVSX0xPTkc7CisJCQlmb3IgKGJpdHMgPSBjYWxsLT5hY2tyX3dpbmRvd1tsb29wXTsgYml0czsgYml0cyA+Pj0gMQorCQkJICAgICApIHsKKwkJCQlfZGVidWcoIi0gbD0lZCBuPSVkIGI9JWx4IiwgbG9vcCwgbmJpdCwgYml0cyk7CisJCQkJaWYgKGJpdHMgJiAxKSB7CisJCQkJCWFja3NbbmJpdF0gPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7CisJCQkJCWFjay5uQWNrcyA9IG5iaXQgKyAxOworCQkJCX0KKwkJCQluYml0Kys7CisJCQl9CisJCX0KKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJcGFkID0gMDsKKworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmYWNrOworCQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihhY2spOworCQlpb3ZbMl0uaW92X2Jhc2UgPSBhY2tzOworCQlpb3ZbMl0uaW92X2xlbgk9IGFjay5uQWNrczsKKwkJaW92WzNdLmlvdl9iYXNlID0gJnBhZDsKKwkJaW92WzNdLmlvdl9sZW4JPSAzOworCQlpb3ZbNF0uaW92X2Jhc2UgPSAmYWNraW5mbzsKKwkJaW92WzRdLmlvdl9sZW4JPSBzaXplb2YoYWNraW5mbyk7CisKKwkJc3dpdGNoIChhY2sucmVhc29uKSB7CisJCWNhc2UgUlhSUENfQUNLX1JFUVVFU1RFRDoKKwkJY2FzZSBSWFJQQ19BQ0tfRFVQTElDQVRFOgorCQljYXNlIFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U6CisJCWNhc2UgUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XOgorCQljYXNlIFJYUlBDX0FDS19OT1NQQUNFOgorCQljYXNlIFJYUlBDX0FDS19QSU5HOgorCQljYXNlIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFOgorCQkJZ290byBzZW5kX0FDS193aXRoX3NrZXc7CisJCWNhc2UgUlhSUENfQUNLX0RFTEFZOgorCQljYXNlIFJYUlBDX0FDS19JRExFOgorCQkJZ290byBzZW5kX0FDSzsKKwkJfQorCX0KKworCS8qIGhhbmRsZSBjb21wbGV0aW9uIG9mIHNlY3VyaXR5IG5lZ290aWF0aW9ucyBvbiBhbiBpbmNvbWluZworCSAqIGNvbm5lY3Rpb24gKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfU0VDVVJFRCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJzZWN1cmVkIik7CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HKSB7CisJCQlfZGVidWcoInNlY3VyaW5nIik7CisJCQl3cml0ZV9sb2NrKCZjYWxsLT5jb25uLT5sb2NrKTsKKwkJCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKSB7CisJCQkJX2RlYnVnKCJub3QgcmVsZWFzZWQiKTsKKwkJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwkJCQlsaXN0X21vdmVfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssCisJCQkJCSAgICAgICAmY2FsbC0+c29ja2V0LT5hY2NlcHRxKTsKKwkJCX0KKwkJCXdyaXRlX3VubG9jaygmY2FsbC0+Y29ubi0+bG9jayk7CisJCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJCQlzZXRfYml0KFJYUlBDX0NBTExfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpOworCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQl9CisKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpKQorCQkJZ290byBtYXliZV9yZXNjaGVkdWxlOworCX0KKworCS8qIHBvc3QgYSBub3RpZmljYXRpb24gb2YgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIHRoZSBhcHAgKi8KKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9QT1NUX0FDQ0VQVCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJwb3N0IGFjY2VwdCIpOworCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAorCQkJCSAgICAgICAwLCBmYWxzZSkgPCAwKQorCQkJZ290byBub19tZW07CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BPU1RfQUNDRVBULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZ290byBtYXliZV9yZXNjaGVkdWxlOworCX0KKworCS8qIGhhbmRsZSBpbmNvbWluZyBjYWxsIGFjY2VwdGFuY2UgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKSB7CisJCV9kZWJ1ZygiYWNjZXB0ZWQiKTsKKwkJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfcG9zdCwgPT0sIDApOworCQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOworCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKQorCQkJc2V0X2JpdChSWFJQQ19DQUxMX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7CisJCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl9CisKKwkvKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUngKKwkgKiBxdWV1ZSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKSB7CisJCXdoaWxlIChjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKQorCQkJaWYgKHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShjYWxsKSA8IDApCisJCQkJYnJlYWs7CisJCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKKwl9CisKKwkvKiBvdGhlciBldmVudHMgbWF5IGhhdmUgYmVlbiByYWlzZWQgc2luY2Ugd2Ugc3RhcnRlZCBjaGVja2luZyAqLworCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKKworc2VuZF9BQ0tfd2l0aF9za2V3OgorCWFjay5tYXhTa2V3ID0gaHRvbnMoYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCkgLQorCQkJICAgIG50b2hsKGFjay5zZXJpYWwpKTsKK3NlbmRfQUNLOgorCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJICAgICAgIG50b2hsKGhkci5zZXJpYWwpLAorCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCisJICAgICAgIG50b2hsKGFjay5maXJzdFBhY2tldCksCisJICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCisJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAorCSAgICAgICByeHJwY19hY2tzW2Fjay5yZWFzb25dLAorCSAgICAgICBhY2subkFja3MpOworCisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7CisJaWYgKGFjay5uQWNrcyA+IDApCisJCXNldF9iaXQoUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSywgJmNhbGwtPmZsYWdzKTsKKwlnb3RvIHNlbmRfbWVzc2FnZV8yOworCitzZW5kX21lc3NhZ2U6CisJX2RlYnVnKCJzZW5kIG1lc3NhZ2UiKTsKKworCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCAlcyAlJSV1IiwgcnhycGNfcGt0c1toZHIudHlwZV0sIG50b2hsKGhkci5zZXJpYWwpKTsKK3NlbmRfbWVzc2FnZV8yOgorCisJbGVuID0gaW92WzBdLmlvdl9sZW47CisJaW9jID0gMTsKKwlpZiAoaW92WzRdLmlvdl9sZW4pIHsKKwkJaW9jID0gNTsKKwkJbGVuICs9IGlvdls0XS5pb3ZfbGVuOworCQlsZW4gKz0gaW92WzNdLmlvdl9sZW47CisJCWxlbiArPSBpb3ZbMl0uaW92X2xlbjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0gZWxzZSBpZiAoaW92WzNdLmlvdl9sZW4pIHsKKwkJaW9jID0gNDsKKwkJbGVuICs9IGlvdlszXS5pb3ZfbGVuOworCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47CisJCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKKwl9IGVsc2UgaWYgKGlvdlsyXS5pb3ZfbGVuKSB7CisJCWlvYyA9IDM7CisJCWxlbiArPSBpb3ZbMl0uaW92X2xlbjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0gZWxzZSBpZiAoaW92WzFdLmlvdl9sZW4pIHsKKwkJaW9jID0gMjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0KKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNhbGwtPmNvbm4tPnRyYW5zLT5sb2NhbC0+c29ja2V0LAorCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGdlbmJpdCkgeworCWNhc2UgUlhSUENfQ0FMTF9BQk9SVDoKKwkJY2xlYXJfYml0KGdlbmJpdCwgJmNhbGwtPmV2ZW50cyk7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKworCWNhc2UgUlhSUENfQ0FMTF9BQ0tfRklOQUw6CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NPTVBMRVRFOworCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGtpbGxfQUNLczsKKworCWRlZmF1bHQ6CisJCWNsZWFyX2JpdChnZW5iaXQsICZjYWxsLT5ldmVudHMpOworCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6CisJCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCQlfZGVidWcoInN0YXJ0IEFDSyB0aW1lciIpOworCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLAorCQkJCQkgIGNhbGwtPmFja3Jfc2VyaWFsLCBmYWxzZSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CisJfQorCitraWxsX0FDS3M6CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cyk7CisKK21heWJlX3Jlc2NoZWR1bGU6CisJaWYgKGNhbGwtPmV2ZW50cyB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworCS8qIGRvbid0IGxlYXZlIGFib3J0ZWQgY29ubmVjdGlvbnMgb24gdGhlIGFjY2VwdCBxdWV1ZSAqLworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJICAgICFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwkJX2RlYnVnKCJYIHVubGlua2luZyBvbmNlLXBlbmRpbmcgY2FsbCAlcCB7IGU9JWx4IGY9JWx4IGM9JXggfSIsCisJCSAgICAgICBjYWxsLCBjYWxsLT5ldmVudHMsIGNhbGwtPmZsYWdzLAorCQkgICAgICAgbnRvaGwoY2FsbC0+Y29ubi0+Y2lkKSk7CisKKwkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworZXJyb3I6CisJY2xlYXJfYml0KFJYUlBDX0NBTExfUFJPQ19CVVNZLCAmY2FsbC0+ZmxhZ3MpOworCWtmcmVlKGFja3MpOworCisJLyogYmVjYXVzZSB3ZSBkb24ndCB3YW50IHR3byBDUFVzIGJvdGggcHJvY2Vzc2luZyB0aGUgd29yayBpdGVtIGZvciBvbmUKKwkgKiBjYWxsIGF0IHRoZSBzYW1lIHRpbWUsIHdlIHVzZSBhIGZsYWcgdG8gbm90ZSB3aGVuIGl0J3MgYnVzeTsgaG93ZXZlcgorCSAqIHRoaXMgbWVhbnMgdGhlcmUncyBhIHJhY2UgYmV0d2VlbiBjbGVhcmluZyB0aGUgZmxhZyBhbmQgc2V0dGluZyB0aGUKKwkgKiB3b3JrIHBlbmRpbmcgYml0IGFuZCB0aGUgd29yayBpdGVtIGJlaW5nIHByb2Nlc3NlZCBhZ2FpbiAqLworCWlmIChjYWxsLT5ldmVudHMgJiYgIXdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgeworCQlfZGVidWcoImp1bXBzdGFydCAleCIsIG50b2hsKGNhbGwtPmNvbm4tPmNpZCkpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCitub19tZW06CisJX2RlYnVnKCJvdXQgb2YgbWVtb3J5Iik7CisJZ290byBtYXliZV9yZXNjaGVkdWxlOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNhbGwuYyBiL25ldC9yeHJwYy9hci1jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1jYWxsLmMKQEAgLTAsMCArMSw4MDQgQEAKKy8qIFJ4UlBDIGluZGl2aWR1YWwgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RydWN0IGttZW1fY2FjaGUgKnJ4cnBjX2NhbGxfamFyOworTElTVF9IRUFEKHJ4cnBjX2NhbGxzKTsKK0RFRklORV9SV0xPQ0socnhycGNfY2FsbF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCByeHJwY19jYWxsX21heF9saWZldGltZSA9IDYwOworc3RhdGljIHVuc2lnbmVkIHJ4cnBjX2RlYWRfY2FsbF90aW1lb3V0ID0gMjsKKworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCByeHJwY19jYWxsX2xpZmVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOworc3RhdGljIHZvaWQgcnhycGNfYWNrX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCk7CisKKy8qCisgKiBhbGxvY2F0ZSBhIG5ldyBjYWxsCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisKKwljYWxsID0ga21lbV9jYWNoZV96YWxsb2MocnhycGNfY2FsbF9qYXIsIGdmcCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gTlVMTDsKKworCWNhbGwtPmFja3Nfd2luc3ogPSAxNjsKKwljYWxsLT5hY2tzX3dpbmRvdyA9IGttYWxsb2MoY2FsbC0+YWNrc193aW5zeiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkgICAgZ2ZwKTsKKwlpZiAoIWNhbGwtPmFja3Nfd2luZG93KSB7CisJCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNldHVwX3RpbWVyKCZjYWxsLT5saWZldGltZXIsICZyeHJwY19jYWxsX2xpZmVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+ZGVhZHNwYW4sICZyeHJwY19kZWFkX2NhbGxfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+YWNrX3RpbWVyLCAmcnhycGNfYWNrX3RpbWVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+cmVzZW5kX3RpbWVyLCAmcnhycGNfcmVzZW5kX3RpbWVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlJTklUX1dPUksoJmNhbGwtPmRlc3Ryb3llciwgJnJ4cnBjX2Rlc3Ryb3lfY2FsbCk7CisJSU5JVF9XT1JLKCZjYWxsLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2NhbGwpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhbGwtPnJ4X29vc19xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+dHhfd2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZjYWxsLT5sb2NrKTsKKwlyd2xvY2tfaW5pdCgmY2FsbC0+c3RhdGVfbG9jayk7CisJYXRvbWljX3NldCgmY2FsbC0+dXNhZ2UsIDEpOworCWNhbGwtPmRlYnVnX2lkID0gYXRvbWljX2luY19yZXR1cm4oJnJ4cnBjX2RlYnVnX2lkKTsKKwljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDsKKworCW1lbXNldCgmY2FsbC0+c29ja19ub2RlLCAweGVkLCBzaXplb2YoY2FsbC0+c29ja19ub2RlKSk7CisKKwljYWxsLT5yeF9kYXRhX2V4cGVjdCA9IDE7CisJY2FsbC0+cnhfZGF0YV9lYXRlbiA9IDA7CisJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKKwljYWxsLT5hY2tyX3dpbl90b3AgPSBjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSArIFJYUlBDX01BWEFDS1M7CisJY2FsbC0+Y3JlYXRpb25famlmID0gamlmZmllczsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGNsaWVudCBjYWxsIGFuZCBhdHRlbXB0IHRvIHRvIGdldCBhIGNvbm5lY3Rpb24gc2xvdCBmb3IgaXQKKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19hbGxvY19jbGllbnRfY2FsbCgKKwlzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGUsCisJZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKHJ4ICE9IE5VTEwpOworCUFTU0VSVCh0cmFucyAhPSBOVUxMKTsKKwlBU1NFUlQoYnVuZGxlICE9IE5VTEwpOworCisJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc29ja19ob2xkKCZyeC0+c2spOworCWNhbGwtPnNvY2tldCA9IHJ4OworCWNhbGwtPnJ4X2RhdGFfcG9zdCA9IDE7CisKKwlyZXQgPSByeHJwY19jb25uZWN0X2NhbGwocngsIHRyYW5zLCBidW5kbGUsIGNhbGwsIGdmcCk7CisJaWYgKHJldCA8IDApIHsKKwkJa21lbV9jYWNoZV9mcmVlKHJ4cnBjX2NhbGxfamFyLCBjYWxsKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlzcGluX2xvY2soJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5sb2NrKTsKKwlsaXN0X2FkZCgmY2FsbC0+ZXJyb3JfbGluaywgJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5lcnJvcl90YXJnZXRzKTsKKwlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPmxvY2spOworCisJY2FsbC0+bGlmZXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfY2FsbF9tYXhfbGlmZXRpbWUgKiBIWjsKKwlhZGRfdGltZXIoJmNhbGwtPmxpZmV0aW1lcik7CisKKwlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CisJcmV0dXJuIGNhbGw7Cit9CisKKy8qCisgKiBzZXQgdXAgYSBjYWxsIGZvciB0aGUgZ2l2ZW4gZGF0YQorICogLSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IHdpdGggSVJRcyBlbmFibGVkCisgKi8KK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19nZXRfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkJCSBzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKmJ1bmRsZSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAorCQkJCQkgaW50IGNyZWF0ZSwKKwkJCQkJIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKmNhbmRpZGF0ZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKnBhcmVudCwgKipwcDsKKworCV9lbnRlcigiJXAsJWQsJWQsJWx4LCVkIiwKKwkgICAgICAgcngsIHRyYW5zID8gdHJhbnMtPmRlYnVnX2lkIDogLTEsIGJ1bmRsZSA/IGJ1bmRsZS0+ZGVidWdfaWQgOiAtMSwKKwkgICAgICAgdXNlcl9jYWxsX0lELCBjcmVhdGUpOworCisJLyogc2VhcmNoIHRoZSBleHRhbnQgY2FsbHMgZmlyc3QgZm9yIG9uZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZAorCSAqIHVzZXIgSUQgKi8KKwlyZWFkX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcCA9IHJ4LT5jYWxscy5yYl9ub2RlOworCXdoaWxlIChwKSB7CisJCWNhbGwgPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY2FsbCwgc29ja19ub2RlKTsKKworCQlpZiAodXNlcl9jYWxsX0lEIDwgY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHVzZXJfY2FsbF9JRCA+IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBmb3VuZF9leHRhbnRfY2FsbDsKKwl9CisKKwlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisKKwlpZiAoIWNyZWF0ZSB8fCAhdHJhbnMpCisJCXJldHVybiBFUlJfUFRSKC1FQkFEU0xUKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2xpZW50X2NhbGwocngsIHRyYW5zLCBidW5kbGUsIGdmcCk7CisJaWYgKElTX0VSUihjYW5kaWRhdGUpKSB7CisJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUihjYW5kaWRhdGUpKTsKKwkJcmV0dXJuIGNhbmRpZGF0ZTsKKwl9CisKKwljYW5kaWRhdGUtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKKwlfX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FuZGlkYXRlLT5mbGFncyk7CisKKwl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXBwID0gJnJ4LT5jYWxscy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCisJCWlmICh1c2VyX2NhbGxfSUQgPCBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4gY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kX2V4dGFudF9zZWNvbmQ7CisJfQorCisJLyogc2Vjb25kIHNlYXJjaCBhbHNvIGZhaWxlZDsgYWRkIHRoZSBuZXcgY2FsbCAqLworCWNhbGwgPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlfbmV0KCJDQUxMIG5ldyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKKworCV9sZWF2ZSgiID0gJXAgW25ld10iLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKKworCS8qIHdlIGZvdW5kIHRoZSBjYWxsIGluIHRoZSBsaXN0IGltbWVkaWF0ZWx5ICovCitmb3VuZF9leHRhbnRfY2FsbDoKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJX2xlYXZlKCIgPSAlcCBbZXh0YW50ICVkXSIsIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCXJldHVybiBjYWxsOworCisJLyogd2UgZm91bmQgdGhlIGNhbGwgb24gdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggdGhlIGxpc3QgKi8KK2ZvdW5kX2V4dGFudF9zZWNvbmQ6CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlyeHJwY19wdXRfY2FsbChjYW5kaWRhdGUpOworCV9sZWF2ZSgiID0gJXAgW3NlY29uZCAlZF0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIHNldCB1cCBhbiBpbmNvbWluZyBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyLAorCQkJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsICpjYW5kaWRhdGU7CisJc3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50OworCV9fYmUzMiBjYWxsX2lkOworCisJX2VudGVyKCIsJWQsLCV4IiwgY29ubi0+ZGVidWdfaWQsIGdmcCk7CisKKwlBU1NFUlQocnggIT0gTlVMTCk7CisKKwljYW5kaWRhdGUgPSByeHJwY19hbGxvY19jYWxsKGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpCisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisKKwljYW5kaWRhdGUtPnNvY2tldCA9IHJ4OworCWNhbmRpZGF0ZS0+Y29ubiA9IGNvbm47CisJY2FuZGlkYXRlLT5jaWQgPSBoZHItPmNpZDsKKwljYW5kaWRhdGUtPmNhbGxfaWQgPSBoZHItPmNhbGxOdW1iZXI7CisJY2FuZGlkYXRlLT5jaGFubmVsID0gbnRvaGwoaGRyLT5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7CisJY2FuZGlkYXRlLT5yeF9kYXRhX3Bvc3QgPSAwOworCWNhbmRpZGF0ZS0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc7CisJaWYgKGNvbm4tPnNlY3VyaXR5X2l4ID4gMCkKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HOworCisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwkvKiBzZXQgdGhlIGNoYW5uZWwgZm9yIHRoaXMgY2FsbCAqLworCWNhbGwgPSBjb25uLT5jaGFubmVsc1tjYW5kaWRhdGUtPmNoYW5uZWxdOworCV9kZWJ1ZygiY2hhbm5lbFsldV0gaXMgJXAiLCBjYW5kaWRhdGUtPmNoYW5uZWwsIGNhbGwpOworCWlmIChjYWxsICYmIGNhbGwtPmNhbGxfaWQgPT0gaGRyLT5jYWxsTnVtYmVyKSB7CisJCS8qIGFscmVhZHkgc2V0OyBtdXN0J3ZlIGJlZW4gYSBkdXBsaWNhdGUgcGFja2V0ICovCisJCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKKwkJQVNTRVJUQ01QKGNhbGwtPmNvbm4sID09LCBjb25uKTsKKworCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cykpCisJCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6CisJCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCQlnb3RvIGFib3J0ZWRfY2FsbDsKKwkJZGVmYXVsdDoKKwkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJZ290byBleHRhbnRfY2FsbDsKKwkJfQorCX0KKworCWlmIChjYWxsKSB7CisJCS8qIGl0IHNlZW1zIHRoZSBjaGFubmVsIGlzIHN0aWxsIGluIHVzZSBmcm9tIHRoZSBwcmV2aW91cyBjYWxsCisJCSAqIC0gZGl0Y2ggdGhlIG9sZCBiaW5kaW5nIGlmIGl0cyBjYWxsIGlzIG5vdyBjb21wbGV0ZSAqLworCQlfZGVidWcoIkNBTEw6ICV1IHsgJXMgfSIsCisJCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdKTsKKworCQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwkJCV9sZWF2ZSgiID0gLUVCVVNZIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOworCQl9CisJfQorCisJLyogY2hlY2sgdGhlIGNhbGwgbnVtYmVyIGlzbid0IGR1cGxpY2F0ZSAqLworCV9kZWJ1ZygiY2hlY2sgZHVwIik7CisJY2FsbF9pZCA9IGhkci0+Y2FsbE51bWJlcjsKKwlwID0gJmNvbm4tPmNhbGxzLnJiX25vZGU7CisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBjb25uX25vZGUpOworCisJCWlmIChjYWxsX2lkIDwgY2FsbC0+Y2FsbF9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY2FsbF9pZCA+IGNhbGwtPmNhbGxfaWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIG9sZF9jYWxsOworCX0KKworCS8qIG1ha2UgdGhlIGNhbGwgYXZhaWxhYmxlICovCisJX2RlYnVnKCJuZXcgY2FsbCIpOworCWNhbGwgPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyYl9saW5rX25vZGUoJmNhbGwtPmNvbm5fbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPmNvbm5fbm9kZSwgJmNvbm4tPmNhbGxzKTsKKwljb25uLT5jaGFubmVsc1tjYWxsLT5jaGFubmVsXSA9IGNhbGw7CisJc29ja19ob2xkKCZyeC0+c2spOworCWF0b21pY19pbmMoJmNvbm4tPnVzYWdlKTsKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCisJc3Bpbl9sb2NrKCZjb25uLT50cmFucy0+cGVlci0+bG9jayk7CisJbGlzdF9hZGQoJmNhbGwtPmVycm9yX2xpbmssICZjb25uLT50cmFucy0+cGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnRyYW5zLT5wZWVyLT5sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlfbmV0KCJDQUxMIGluY29taW5nICVkIG9uIENPTk4gJWQiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+Y29ubi0+ZGVidWdfaWQpOworCisJY2FsbC0+bGlmZXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfY2FsbF9tYXhfbGlmZXRpbWUgKiBIWjsKKwlhZGRfdGltZXIoJmNhbGwtPmxpZmV0aW1lcik7CisJX2xlYXZlKCIgPSAlcCB7JWR9IFtuZXddIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOworCXJldHVybiBjYWxsOworCitleHRhbnRfY2FsbDoKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwlfbGVhdmUoIiA9ICVwIHslZH0gW2V4dGFudF0iLCBjYWxsLCBjYWxsID8gY2FsbC0+ZGVidWdfaWQgOiAtMSk7CisJcmV0dXJuIGNhbGw7CisKK2Fib3J0ZWRfY2FsbDoKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwlfbGVhdmUoIiA9IC1FQ09OTkFCT1JURUQiKTsKKwlyZXR1cm4gRVJSX1BUUigtRUNPTk5BQk9SVEVEKTsKKworb2xkX2NhbGw6CisJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7CisJX2xlYXZlKCIgPSAtRUNPTk5SRVNFVCBbb2xkXSIpOworCXJldHVybiBFUlJfUFRSKC1FQ09OTlJFU0VUKTsKK30KKworLyoKKyAqIGZpbmQgYW4gZXh0YW50IHNlcnZlciBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2ZpbmRfc2VydmVyX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByYl9ub2RlICpwOworCisJX2VudGVyKCIlcCwlbHgiLCByeCwgdXNlcl9jYWxsX0lEKTsKKworCS8qIHNlYXJjaCB0aGUgZXh0YW50IGNhbGxzIGZvciBvbmUgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdXNlcgorCSAqIElEICovCisJcmVhZF9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXAgPSByeC0+Y2FsbHMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbm9kZSk7CisKKwkJaWYgKHVzZXJfY2FsbF9JRCA8IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmICh1c2VyX2NhbGxfSUQgPiBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2NhbGw7CisJfQorCisJcmVhZF91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gTlVMTCIpOworCXJldHVybiBOVUxMOworCisJLyogd2UgZm91bmQgdGhlIGNhbGwgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9jYWxsOgorCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIFslZF0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIGRldGFjaCBhIGNhbGwgZnJvbSBhIHNvY2tldCBhbmQgc2V0IHVwIGZvciByZWxlYXNlCisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSBjYWxsLT5zb2NrZXQ7CisKKwlfZW50ZXIoInslZCwlZCwlZCwlZH0iLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKKwkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPmFja3Jfbm90X2lkbGUpLAorCSAgICAgICBjYWxsLT5yeF9maXJzdF9vb3MpOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKQorCQlCVUcoKTsKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkvKiBkaXNzb2NpYXRlIGZyb20gdGhlIHNvY2tldAorCSAqIC0gdGhlIHNvY2tldCdzIHJlZiBvbiB0aGUgY2FsbCBpcyBwYXNzZWQgdG8gdGhlIGRlYXRoIHRpbWVyCisJICovCisJX2RlYnVnKCJSRUxFQVNFIENBTEwgJXAgKCVkIENPTk4gJXApIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQsIGNvbm4pOworCisJd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwkJX2RlYnVnKCJ1bmxpbmtpbmcgb25jZS1wZW5kaW5nIGNhbGwgJXAgeyBlPSVseCBmPSVseCB9IiwKKwkJICAgICAgIGNhbGwsIGNhbGwtPmV2ZW50cywgY2FsbC0+ZmxhZ3MpOworCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKKwkJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCX0gZWxzZSBpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZyeC0+Y2FsbHMpOworCQltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhkZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOworCisJLyogZnJlZSB1cCB0aGUgY2hhbm5lbCBmb3IgcmV1c2UgKi8KKwlzcGluX2xvY2soJmNvbm4tPnRyYW5zLT5jbGllbnRfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisJd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPT0gY2FsbCkKKwkJY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPSBOVUxMOworCisJaWYgKGNvbm4tPm91dF9jbGllbnRmbGFnICYmIGNvbm4tPmJ1bmRsZSkgeworCQljb25uLT5hdmFpbF9jYWxscysrOworCQlzd2l0Y2ggKGNvbm4tPmF2YWlsX2NhbGxzKSB7CisJCWNhc2UgMToKKwkJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5idW5kbGVfbGluaywKKwkJCQkgICAgICAgJmNvbm4tPmJ1bmRsZS0+YXZhaWxfY29ubnMpOworCQljYXNlIDIgLi4uIFJYUlBDX01BWENBTExTIC0gMToKKwkJCUFTU0VSVChjb25uLT5jaGFubmVsc1swXSA9PSBOVUxMIHx8CisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMV0gPT0gTlVMTCB8fAorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzJdID09IE5VTEwgfHwKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1szXSA9PSBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX01BWENBTExTOgorCQkJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmJ1bmRsZV9saW5rLAorCQkJCSAgICAgICAmY29ubi0+YnVuZGxlLT51bnVzZWRfY29ubnMpOworCQkJQVNTRVJUKGNvbm4tPmNoYW5uZWxzWzBdID09IE5VTEwgJiYKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMICYmCisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMl0gPT0gTlVMTCAmJgorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzNdID09IE5VTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlJ4UlBDOiBjb25uLT5hdmFpbF9jYWxscz0lZFxuIiwKKwkJCSAgICAgICBjb25uLT5hdmFpbF9jYWxscyk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZjb25uLT50cmFucy0+Y2xpZW50X2xvY2spOworCisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0spIHsKKwkJX2RlYnVnKCIrKysgQUJPUlRJTkcgU1RBVEUgJWQgKysrXG4iLCBjYWxsLT5zdGF0ZSk7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7CisJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCS8qIGNsZWFuIHVwIHRoZSBSeCBxdWV1ZSAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkgfHwKKwkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkgeworCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCV9kZWJ1ZygicHVyZ2UgUnggcXVldWVzIik7CisKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSB8fAorCQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpKSkgeworCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJCWlmIChzcC0+Y2FsbCkgeworCQkJCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOworCQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQkJCXNwLT5jYWxsID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJCV9kZWJ1ZygiLSB6YXAgJXMgJSUldSAjJXUiLAorCQkJICAgICAgIHJ4cnBjX3BrdHNbc3AtPmhkci50eXBlXSwKKwkJCSAgICAgICBudG9obChzcC0+aGRyLnNlcmlhbCksCisJCQkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpKTsKKwkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsICE9LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKwl9CisKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+bGlmZXRpbWVyKTsKKwljYWxsLT5kZWFkc3Bhbi5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX2RlYWRfY2FsbF90aW1lb3V0ICogSFo7CisJYWRkX3RpbWVyKCZjYWxsLT5kZWFkc3Bhbik7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaGFuZGxlIGEgZGVhZCBjYWxsIGJlaW5nIHJlYWR5IGZvciByZWFwaW5nCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfREVBRDsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworfQorCisvKgorICogbWFyayBhIGNhbGwgYXMgdG8gYmUgcmVsZWFzZWQsIGFib3J0aW5nIGl0IGlmIGl0J3Mgc3RpbGwgaW4gcHJvZ3Jlc3MKKyAqIC0gY2FsbGVkIHdpdGggc29mdGlycXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCWJvb2wgc2NoZWQ7CisKKwl3cml0ZV9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0RFQUQpIHsKKwkJc2NoZWQgPSBmYWxzZTsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJX2RlYnVnKCJhYm9ydCBjYWxsICVwIiwgY2FsbCk7CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOworCQkJY2FsbC0+YWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkKKwkJCQlzY2hlZCA9IHRydWU7CisJCX0KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCisJCQlzY2hlZCA9IHRydWU7CisJCWlmIChzY2hlZCkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiByZWxlYXNlIGFsbCB0aGUgY2FsbHMgYXNzb2NpYXRlZCB3aXRoIGEgc29ja2V0CisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByYl9ub2RlICpwOworCisJX2VudGVyKCIlcCIsIHJ4KTsKKworCXJlYWRfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisKKwkvKiBtYXJrIGFsbCB0aGUgY2FsbHMgYXMgbm8gbG9uZ2VyIHdhbnRpbmcgaW5jb21pbmcgcGFja2V0cyAqLworCWZvciAocCA9IHJiX2ZpcnN0KCZyeC0+Y2FsbHMpOyBwOyBwID0gcmJfbmV4dChwKSkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbm9kZSk7CisJCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl9CisKKwkvKiBraWxsIHRoZSBub3QteWV0LWFjY2VwdGVkIGluY29taW5nIGNhbGxzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmcngtPnNlY3VyZXEsIGFjY2VwdF9saW5rKSB7CisJCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZyeC0+YWNjZXB0cSwgYWNjZXB0X2xpbmspIHsKKwkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcmVsZWFzZSBhIGNhbGwKKyAqLwordm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCUFTU0VSVChjYWxsICE9IE5VTEwpOworCisJX2VudGVyKCIlcHt1PSVkfSIsIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksID4sIDApOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhbGwtPnVzYWdlKSkgeworCQlfZGVidWcoImNhbGwgJWQgZGVhZCIsIGNhbGwtPmRlYnVnX2lkKTsKKwkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9ERUFEKTsKKwkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKKwl9CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGNsZWFuIHVwIGEgY2FsbAorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhbnVwX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCisJQVNTRVJUKGNhbGwtPnNvY2tldCk7CisKKwltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhjZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOworCisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmxpZmV0aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmRlYWRzcGFuKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKKworCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKTsKKwlBU1NFUlRDTVAoY2FsbC0+ZXZlbnRzLCA9PSwgMCk7CisJaWYgKHdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgeworCQlfZGVidWcoImRlZmVyIGRlc3Ryb3kiKTsKKwkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYWxsLT5jb25uKSB7CisJCXNwaW5fbG9jaygmY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPmxvY2spOworCQlsaXN0X2RlbCgmY2FsbC0+ZXJyb3JfbGluayk7CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bG9jayk7CisKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+Y29ubi0+bG9jayk7CisJCXJiX2VyYXNlKCZjYWxsLT5jb25uX25vZGUsICZjYWxsLT5jb25uLT5jYWxscyk7CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+Y29ubi0+bG9jayk7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGwtPmNvbm4pOworCX0KKworCWlmIChjYWxsLT5hY2tzX3dpbmRvdykgeworCQlfZGVidWcoImtpbGwgVHggd2luZG93ICVkIiwKKwkJICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLAorCQkJCWNhbGwtPmFja3Nfd2luc3opKTsKKwkJc21wX21iKCk7CisJCXdoaWxlIChDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCQljYWxsLT5hY2tzX3dpbnN6KSA+IDApIHsKKwkJCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJCQl1bnNpZ25lZCBsb25nIF9za2I7CisKKwkJCV9za2IgPSBjYWxsLT5hY2tzX3dpbmRvd1tjYWxsLT5hY2tzX3RhaWxdICYgfjE7CisJCQlzcCA9IHJ4cnBjX3NrYigoc3RydWN0IHNrX2J1ZmYgKikgX3NrYik7CisJCQlfZGVidWcoIisrKyBjbGVhciBUeCAldSIsIG50b2hsKHNwLT5oZHIuc2VxKSk7CisJCQlyeHJwY19mcmVlX3NrYigoc3RydWN0IHNrX2J1ZmYgKikgX3NrYik7CisJCQljYWxsLT5hY2tzX3RhaWwgPQorCQkJCShjYWxsLT5hY2tzX3RhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisJCX0KKworCQlrZnJlZShjYWxsLT5hY2tzX3dpbmRvdyk7CisJfQorCisJcnhycGNfZnJlZV9za2IoY2FsbC0+dHhfcGVuZGluZyk7CisKKwlyeHJwY19wdXJnZV9xdWV1ZSgmY2FsbC0+cnhfcXVldWUpOworCUFTU0VSVChza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X29vc19xdWV1ZSkpOworCXNvY2tfcHV0KCZjYWxsLT5zb2NrZXQtPnNrKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbGwpOworfQorCisvKgorICogZGVzdHJveSBhIGNhbGwKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgZGVzdHJveWVyKTsKKworCV9lbnRlcigiJXB7JWQsJWQsJXB9IiwKKwkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwgY2FsbC0+Y2hhbm5lbCwgY2FsbC0+Y29ubik7CisKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0RFQUQpOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlyeHJwY19jbGVhbnVwX2NhbGwoY2FsbCk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY2FsbCByZWNvcmRzIGZyb20gYSB0cmFuc3BvcnQgZW5kcG9pbnQgcmF0aGVyCisgKiB0aGFuIHdhaXRpbmcgZm9yIHRoZW0gdG8gdGltZSBvdXQKKyAqLwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2FsbHModm9pZCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKworCV9lbnRlcigiIik7CisJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfY2FsbHMpKSB7CisJCWNhbGwgPSBsaXN0X2VudHJ5KHJ4cnBjX2NhbGxzLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBsaW5rKTsKKwkJX2RlYnVnKCJaYXBwaW5nIGNhbGwgJXAiLCBjYWxsKTsKKworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKKworCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpIHsKKwkJY2FzZSAwOgorCQkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9ERUFEKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmRlYWRzcGFuKSAhPSAwICYmCisJCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9ERUFEKQorCQkJCXJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKCh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwkJCWlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0RFQUQpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlJYUlBDOiIKKwkJCSAgICAgICAiIENhbGwgJXAgc3RpbGwgaW4gdXNlICglZCwlZCwlcywlbHgsJWx4KSFcbiIsCisJCQkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmY2FsbC0+YWNrcl9ub3RfaWRsZSksCisJCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLAorCQkJICAgICAgIGNhbGwtPmZsYWdzLCBjYWxsLT5ldmVudHMpOworCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X3F1ZXVlKSkKKwkJCQlwcmludGsoS0VSTl9FUlIiUlhSUEM6IFJ4IHF1ZXVlIG9jY3VwaWVkXG4iKTsKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9vb3NfcXVldWUpKQorCQkJCXByaW50ayhLRVJOX0VSUiJSWFJQQzogT09TIHF1ZXVlIG9jY3VwaWVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQljb25kX3Jlc2NoZWQoKTsKKwkJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGhhbmRsZSBjYWxsIGxpZmV0aW1lIGJlaW5nIGV4Y2VlZGVkCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcmV0dXJuOworCisJX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlzZXRfYml0KFJYUlBDX0NBTExfTElGRV9USU1FUiwgJmNhbGwtPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGhhbmRsZSByZXNlbmQgdGltZXIgZXhwaXJ5CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKKworCV9lbnRlcigieyVkfSIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQorCQlyZXR1cm47CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworfQorCisvKgorICogaGFuZGxlIEFDSyB0aW1lciBleHBpcnkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWNrX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopIF9jYWxsOworCisJX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJldHVybjsKKworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNvbm5lY3Rpb24uYyBiL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjYjNlMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKQEAgLTAsMCArMSw5MTEgQEAKKy8qIFJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbiBoYW5kbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK0xJU1RfSEVBRChyeHJwY19jb25uZWN0aW9ucyk7CitERUZJTkVfUldMT0NLKHJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByeHJwY19jb25uZWN0aW9uX3RpbWVvdXQgPSAxMCAqIDYwOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgcnhycGNfY29ubmVjdGlvbl9yZWFwZXIpOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKnJ4cnBjX2FsbG9jX2J1bmRsZShnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CisKKwlfZW50ZXIoIiIpOworCisJYnVuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlKSwgZ2ZwKTsKKwlpZiAoYnVuZGxlKSB7CisJCUlOSVRfTElTVF9IRUFEKCZidW5kbGUtPnVudXNlZF9jb25ucyk7CisJCUlOSVRfTElTVF9IRUFEKCZidW5kbGUtPmF2YWlsX2Nvbm5zKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJ1bmRsZS0+YnVzeV9jb25ucyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ1bmRsZS0+Y2hhbndhaXQpOworCQlhdG9taWNfc2V0KCZidW5kbGUtPnVzYWdlLCAxKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgYnVuZGxlKTsKKwlyZXR1cm4gYnVuZGxlOworfQorCisvKgorICogY29tcGFyZSBidW5kbGUgcGFyYW1ldGVycyB3aXRoIHdoYXQgd2UncmUgbG9va2luZyBmb3IKKyAqIC0gcmV0dXJuIC12ZSwgMCBvciArdmUKKyAqLworc3RhdGljIGlubGluZQoraW50IHJ4cnBjX2NtcF9idW5kbGUoY29uc3Qgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGUsCisJCSAgICAgc3RydWN0IGtleSAqa2V5LCBfX2JlMTYgc2VydmljZV9pZCkKK3sKKwlyZXR1cm4gKGJ1bmRsZS0+c2VydmljZV9pZCAtIHNlcnZpY2VfaWQpID86CisJCSgodW5zaWduZWQgbG9uZykgYnVuZGxlLT5rZXkgLSAodW5zaWduZWQgbG9uZykga2V5KTsKK30KKworLyoKKyAqIGdldCBidW5kbGUgb2YgY2xpZW50IGNvbm5lY3Rpb25zIHRoYXQgYSBjbGllbnQgc29ja2V0IGNhbiBtYWtlIHVzZSBvZgorICovCitzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKnJ4cnBjX2dldF9idW5kbGUoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCQkJICAgc3RydWN0IGtleSAqa2V5LAorCQkJCQkgICBfX2JlMTYgc2VydmljZV9pZCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlLCAqY2FuZGlkYXRlOworCXN0cnVjdCByYl9ub2RlICpwLCAqcGFyZW50LCAqKnBwOworCisJX2VudGVyKCIlcHsleH0sJXgsJWh4LCIsCisJICAgICAgIHJ4LCBrZXlfc2VyaWFsKGtleSksIHRyYW5zLT5kZWJ1Z19pZCwgbnRvaGwoc2VydmljZV9pZCkpOworCisJaWYgKHJ4LT50cmFucyA9PSB0cmFucyAmJiByeC0+YnVuZGxlKSB7CisJCWF0b21pY19pbmMoJnJ4LT5idW5kbGUtPnVzYWdlKTsKKwkJcmV0dXJuIHJ4LT5idW5kbGU7CisJfQorCisJLyogc2VhcmNoIHRoZSBleHRhbnQgYnVuZGxlcyBmaXJzdCBmb3Igb25lIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCisJICogdXNlciBJRCAqLworCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKworCXAgPSB0cmFucy0+YnVuZGxlcy5yYl9ub2RlOworCXdoaWxlIChwKSB7CisJCWJ1bmRsZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSwgbm9kZSk7CisKKwkJaWYgKHJ4cnBjX2NtcF9idW5kbGUoYnVuZGxlLCBrZXksIHNlcnZpY2VfaWQpIDwgMCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChyeHJwY19jbXBfYnVuZGxlKGJ1bmRsZSwga2V5LCBzZXJ2aWNlX2lkKSA+IDApCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2J1bmRsZTsKKwl9CisKKwlzcGluX3VubG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfYnVuZGxlKGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWNhbmRpZGF0ZS0+a2V5ID0ga2V5X2dldChrZXkpOworCWNhbmRpZGF0ZS0+c2VydmljZV9pZCA9IHNlcnZpY2VfaWQ7CisKKwlzcGluX2xvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwlwcCA9ICZ0cmFucy0+YnVuZGxlcy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWJ1bmRsZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlLCBub2RlKTsKKworCQlpZiAocnhycGNfY21wX2J1bmRsZShidW5kbGUsIGtleSwgc2VydmljZV9pZCkgPCAwKQorCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHJ4cnBjX2NtcF9idW5kbGUoYnVuZGxlLCBrZXksIHNlcnZpY2VfaWQpID4gMCkKKwkJCXBwID0gJigqcHApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBmb3VuZF9leHRhbnRfc2Vjb25kOworCX0KKworCS8qIHNlY29uZCBzZWFyY2ggYWxzbyBmYWlsZWQ7IGFkZCB0aGUgbmV3IGJ1bmRsZSAqLworCWJ1bmRsZSA9IGNhbmRpZGF0ZTsKKwljYW5kaWRhdGUgPSBOVUxMOworCisJcmJfbGlua19ub2RlKCZidW5kbGUtPm5vZGUsIHBhcmVudCwgcHApOworCXJiX2luc2VydF9jb2xvcigmYnVuZGxlLT5ub2RlLCAmdHJhbnMtPmJ1bmRsZXMpOworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCV9uZXQoIkJVTkRMRSBuZXcgb24gdHJhbnMgJWQiLCB0cmFucy0+ZGVidWdfaWQpOworCWlmICghcngtPmJ1bmRsZSAmJiByeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCkgeworCQlhdG9taWNfaW5jKCZidW5kbGUtPnVzYWdlKTsKKwkJcngtPmJ1bmRsZSA9IGJ1bmRsZTsKKwl9CisJX2xlYXZlKCIgPSAlcCBbbmV3XSIsIGJ1bmRsZSk7CisJcmV0dXJuIGJ1bmRsZTsKKworCS8qIHdlIGZvdW5kIHRoZSBidW5kbGUgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9idW5kbGU6CisJYXRvbWljX2luYygmYnVuZGxlLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisJX25ldCgiQlVORExFIG9sZCBvbiB0cmFucyAlZCIsIHRyYW5zLT5kZWJ1Z19pZCk7CisJaWYgKCFyeC0+YnVuZGxlICYmIHJ4LT5zay5za19zdGF0ZSA9PSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEKSB7CisJCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCQlyeC0+YnVuZGxlID0gYnVuZGxlOworCX0KKwlfbGVhdmUoIiA9ICVwIFtleHRhbnQgJWRdIiwgYnVuZGxlLCBhdG9taWNfcmVhZCgmYnVuZGxlLT51c2FnZSkpOworCXJldHVybiBidW5kbGU7CisKKwkvKiB3ZSBmb3VuZCB0aGUgYnVuZGxlIG9uIHRoZSBzZWNvbmQgdGltZSB0aHJvdWdoIHRoZSBsaXN0ICovCitmb3VuZF9leHRhbnRfc2Vjb25kOgorCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJX25ldCgiQlVORExFIG9sZDIgb24gdHJhbnMgJWQiLCB0cmFucy0+ZGVidWdfaWQpOworCWlmICghcngtPmJ1bmRsZSAmJiByeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCkgeworCQlhdG9taWNfaW5jKCZidW5kbGUtPnVzYWdlKTsKKwkJcngtPmJ1bmRsZSA9IGJ1bmRsZTsKKwl9CisJX2xlYXZlKCIgPSAlcCBbc2Vjb25kICVkXSIsIGJ1bmRsZSwgYXRvbWljX3JlYWQoJmJ1bmRsZS0+dXNhZ2UpKTsKKwlyZXR1cm4gYnVuZGxlOworfQorCisvKgorICogcmVsZWFzZSBhIGJ1bmRsZQorICovCit2b2lkIHJ4cnBjX3B1dF9idW5kbGUoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlKQoreworCV9lbnRlcigiJXAsJXB7JWR9Iix0cmFucywgYnVuZGxlLCBhdG9taWNfcmVhZCgmYnVuZGxlLT51c2FnZSkpOworCisJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmJ1bmRsZS0+dXNhZ2UsICZ0cmFucy0+Y2xpZW50X2xvY2spKSB7CisJCV9kZWJ1ZygiRGVzdHJveSBidW5kbGUiKTsKKwkJcmJfZXJhc2UoJmJ1bmRsZS0+bm9kZSwgJnRyYW5zLT5idW5kbGVzKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisJCUFTU0VSVChsaXN0X2VtcHR5KCZidW5kbGUtPnVudXNlZF9jb25ucykpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYnVuZGxlLT5hdmFpbF9jb25ucykpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYnVuZGxlLT5idXN5X2Nvbm5zKSk7CisJCUFTU0VSVENNUChidW5kbGUtPm51bV9jb25ucywgPT0sIDApOworCQlrZXlfcHV0KGJ1bmRsZS0+a2V5KTsKKwkJa2ZyZWUoYnVuZGxlKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogYWxsb2NhdGUgYSBuZXcgY29ubmVjdGlvbgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2FsbG9jX2Nvbm5lY3Rpb24oZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCisJX2VudGVyKCIiKTsKKworCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiksIGdmcCk7CisJaWYgKGNvbm4pIHsKKwkJSU5JVF9XT1JLKCZjb25uLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2Nvbm5lY3Rpb24pOworCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+YnVuZGxlX2xpbmspOworCQljb25uLT5jYWxscyA9IFJCX1JPT1Q7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPnJ4X3F1ZXVlKTsKKwkJcndsb2NrX2luaXQoJmNvbm4tPmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmY29ubi0+c3RhdGVfbG9jayk7CisJCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKKwkJY29ubi0+ZGVidWdfaWQgPSBhdG9taWNfaW5jX3JldHVybigmcnhycGNfZGVidWdfaWQpOworCQljb25uLT5hdmFpbF9jYWxscyA9IFJYUlBDX01BWENBTExTOworCQljb25uLT5zaXplX2FsaWduID0gNDsKKwkJY29ubi0+aGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcik7CisJfQorCisJX2xlYXZlKCIgPSAlcHslZH0iLCBjb25uLCBjb25uLT5kZWJ1Z19pZCk7CisJcmV0dXJuIGNvbm47Cit9CisKKy8qCisgKiBhc3NpZ24gYSBjb25uZWN0aW9uIElEIHRvIGEgY29ubmVjdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSB0cmFuc3BvcnQncworICogY29ubmVjdGlvbiBsb29rdXAgdHJlZQorICogLSBjYWxsZWQgd2l0aCB0cmFuc3BvcnQgY2xpZW50IGxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCByeHJwY19hc3NpZ25fY29ubmVjdGlvbl9pZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqeGNvbm47CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCV9fYmUzMiBlcG9jaDsKKwl1MzIgcmVhbF9jb25uX2lkOworCisJX2VudGVyKCIiKTsKKworCWVwb2NoID0gY29ubi0+ZXBvY2g7CisKKwl3cml0ZV9sb2NrX2JoKCZjb25uLT50cmFucy0+Y29ubl9sb2NrKTsKKworCWNvbm4tPnRyYW5zLT5jb25uX2lkY291bnRlciArPSBSWFJQQ19DSURfSU5DOworCWlmIChjb25uLT50cmFucy0+Y29ubl9pZGNvdW50ZXIgPCBSWFJQQ19DSURfSU5DKQorCQljb25uLT50cmFucy0+Y29ubl9pZGNvdW50ZXIgPSBSWFJQQ19DSURfSU5DOworCXJlYWxfY29ubl9pZCA9IGNvbm4tPnRyYW5zLT5jb25uX2lkY291bnRlcjsKKworYXR0ZW1wdF9pbnNlcnRpb246CisJcGFyZW50ID0gTlVMTDsKKwlwID0gJmNvbm4tPnRyYW5zLT5jbGllbnRfY29ubnMucmJfbm9kZTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJeGNvbm4gPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlpZiAoZXBvY2ggPCB4Y29ubi0+ZXBvY2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGVwb2NoID4geGNvbm4tPmVwb2NoKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAocmVhbF9jb25uX2lkIDwgeGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmVhbF9jb25uX2lkID4geGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gaWRfZXhpc3RzOworCX0KKworCS8qIHdlJ3ZlIGZvdW5kIGEgc3VpdGFibGUgaG9sZSAtIGFycmFuZ2UgZm9yIHRoaXMgY29ubmVjdGlvbiB0byBvY2N1cHkKKwkgKiBpdCAqLworCXJiX2xpbmtfbm9kZSgmY29ubi0+bm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNvbm4tPm5vZGUsICZjb25uLT50cmFucy0+Y2xpZW50X2Nvbm5zKTsKKworCWNvbm4tPnJlYWxfY29ubl9pZCA9IHJlYWxfY29ubl9pZDsKKwljb25uLT5jaWQgPSBodG9ubChyZWFsX2Nvbm5faWQpOworCXdyaXRlX3VubG9ja19iaCgmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJX2xlYXZlKCIgW0NPTk5JRCAleCBDSUQgJXhdIiwgcmVhbF9jb25uX2lkLCBudG9obChjb25uLT5jaWQpKTsKKwlyZXR1cm47CisKKwkvKiB3ZSBmb3VuZCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgcHJvcG9zZWQgSUQgLSB3YWxrIHRoZSB0cmVlIGZyb20gdGhhdAorCSAqIHBvaW50IGxvb2tpbmcgZm9yIHRoZSBuZXh0IHVudXNlZCBJRCAqLworaWRfZXhpc3RzOgorCWZvciAoOzspIHsKKwkJcmVhbF9jb25uX2lkICs9IFJYUlBDX0NJRF9JTkM7CisJCWlmIChyZWFsX2Nvbm5faWQgPCBSWFJQQ19DSURfSU5DKSB7CisJCQlyZWFsX2Nvbm5faWQgPSBSWFJQQ19DSURfSU5DOworCQkJY29ubi0+dHJhbnMtPmNvbm5faWRjb3VudGVyID0gcmVhbF9jb25uX2lkOworCQkJZ290byBhdHRlbXB0X2luc2VydGlvbjsKKwkJfQorCisJCXBhcmVudCA9IHJiX25leHQocGFyZW50KTsKKwkJaWYgKCFwYXJlbnQpCisJCQlnb3RvIGF0dGVtcHRfaW5zZXJ0aW9uOworCisJCXhjb25uID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbm9kZSk7CisJCWlmIChlcG9jaCA8IHhjb25uLT5lcG9jaCB8fAorCQkgICAgcmVhbF9jb25uX2lkIDwgeGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCWdvdG8gYXR0ZW1wdF9pbnNlcnRpb247CisJfQorfQorCisvKgorICogYWRkIGEgY2FsbCB0byBhIGNvbm5lY3Rpb24ncyBjYWxsLWJ5LUlEIHRyZWUKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWRkX2NhbGxfSURfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqeGNhbGw7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCV9fYmUzMiBjYWxsX2lkOworCisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwljYWxsX2lkID0gY2FsbC0+Y2FsbF9pZDsKKwlwID0gJmNvbm4tPmNhbGxzLnJiX25vZGU7CisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXhjYWxsID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY2FsbCwgY29ubl9ub2RlKTsKKworCQlpZiAoY2FsbF9pZCA8IHhjYWxsLT5jYWxsX2lkKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChjYWxsX2lkID4geGNhbGwtPmNhbGxfaWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwlyYl9saW5rX25vZGUoJmNhbGwtPmNvbm5fbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPmNvbm5fbm9kZSwgJmNvbm4tPmNhbGxzKTsKKworCXdyaXRlX3VubG9ja19iaCgmY29ubi0+bG9jayk7Cit9CisKKy8qCisgKiBjb25uZWN0IGEgY2FsbCBvbiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbgorICovCitzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3RfZXhjbHVzaXZlKHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCQkgICBfX2JlMTYgc2VydmljZV9pZCwKKwkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IGNoYW4sIHJldDsKKworCV9lbnRlcigiIik7CisKKwljb25uID0gcngtPmNvbm47CisJaWYgKCFjb25uKSB7CisJCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgY29ubmVjdGlvbgorCQkgKiBhbmQgdGhlbiByZWRvIHRoZSBjaGVjayAqLworCQljb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCQlpZiAoSVNfRVJSKGNvbm4pKSB7CisJCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY29ubikpOworCQkJcmV0dXJuIFBUUl9FUlIoY29ubik7CisJCX0KKworCQljb25uLT50cmFucyA9IHRyYW5zOworCQljb25uLT5idW5kbGUgPSBOVUxMOworCQljb25uLT5zZXJ2aWNlX2lkID0gc2VydmljZV9pZDsKKwkJY29ubi0+ZXBvY2ggPSByeHJwY19lcG9jaDsKKwkJY29ubi0+aW5fY2xpZW50ZmxhZyA9IDA7CisJCWNvbm4tPm91dF9jbGllbnRmbGFnID0gUlhSUENfQ0xJRU5UX0lOSVRJQVRFRDsKKwkJY29ubi0+Y2lkID0gMDsKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVDsKKwkJY29ubi0+YXZhaWxfY2FsbHMgPSBSWFJQQ19NQVhDQUxMUyAtIDE7CisJCWNvbm4tPnNlY3VyaXR5X2xldmVsID0gcngtPm1pbl9zZWNfbGV2ZWw7CisJCWNvbm4tPmtleSA9IGtleV9nZXQocngtPmtleSk7CisKKwkJcmV0ID0gcnhycGNfaW5pdF9jbGllbnRfY29ubl9zZWN1cml0eShjb25uKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWtleV9wdXQoY29ubi0+a2V5KTsKKwkJCWtmcmVlKGNvbm4pOworCQkJX2xlYXZlKCIgPSAlZCBba2V5XSIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJd3JpdGVfbG9ja19iaCgmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCisJCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKworCQlfbmV0KCJDT05ORUNUIEVYQ0wgbmV3ICVkIG9uIFRSQU5TICVkIiwKKwkJICAgICBjb25uLT5kZWJ1Z19pZCwgY29ubi0+dHJhbnMtPmRlYnVnX2lkKTsKKworCQlyeHJwY19hc3NpZ25fY29ubmVjdGlvbl9pZChjb25uKTsKKwkJcngtPmNvbm4gPSBjb25uOworCX0KKworCS8qIHdlJ3ZlIGdvdCBhIGNvbm5lY3Rpb24gd2l0aCBhIGZyZWUgY2hhbm5lbCBhbmQgd2UgY2FuIG5vdyBhdHRhY2ggdGhlCisJICogY2FsbCB0byBpdAorCSAqIC0gd2UncmUgaG9sZGluZyB0aGUgdHJhbnNwb3J0J3MgY2xpZW50IGxvY2sKKwkgKiAtIHdlJ3JlIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24gdGhlIGNvbm5lY3Rpb24KKwkgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUlhSUENfTUFYQ0FMTFM7IGNoYW4rKykKKwkJaWYgKCFjb25uLT5jaGFubmVsc1tjaGFuXSkKKwkJCWdvdG8gZm91bmRfY2hhbm5lbDsKKwlnb3RvIG5vX2ZyZWVfY2hhbm5lbHM7CisKK2ZvdW5kX2NoYW5uZWw6CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCWNvbm4tPmNoYW5uZWxzW2NoYW5dID0gY2FsbDsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5jaGFubmVsID0gY2hhbjsKKwljYWxsLT5jaWQgPSBjb25uLT5jaWQgfCBodG9ubChjaGFuKTsKKwljYWxsLT5jYWxsX2lkID0gaHRvbmwoKytjb25uLT5jYWxsX2NvdW50ZXIpOworCisJX25ldCgiQ09OTkVDVCBjbGllbnQgb24gY29ubiAlZCBjaGFuICVkIGFzIGNhbGwgJXgiLAorCSAgICAgY29ubi0+ZGVidWdfaWQsIGNoYW4sIG50b2hsKGNhbGwtPmNhbGxfaWQpKTsKKworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCisJcnhycGNfYWRkX2NhbGxfSURfdG9fY29ubihjb25uLCBjYWxsKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworbm9fZnJlZV9jaGFubmVsczoKKwlzcGluX3VubG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwlfbGVhdmUoIiA9IC1FTk9TUiIpOworCXJldHVybiAtRU5PU1I7Cit9CisKKy8qCisgKiBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYSBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCSAgICAgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJICAgICAgIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlLAorCQkgICAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpjYW5kaWRhdGU7CisJaW50IGNoYW4sIHJldDsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVwLCVseCwiLCByeCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19TT0NLX0VYQ0xVU0lWRV9DT05OLCAmcngtPmZsYWdzKSkKKwkJcmV0dXJuIHJ4cnBjX2Nvbm5lY3RfZXhjbHVzaXZlKHJ4LCB0cmFucywgYnVuZGxlLT5zZXJ2aWNlX2lkLAorCQkJCQkgICAgICAgY2FsbCwgZ2ZwKTsKKworCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCS8qIHNlZSBpZiB0aGUgYnVuZGxlIGhhcyBhIGNhbGwgc2xvdCBhdmFpbGFibGUgKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZidW5kbGUtPmF2YWlsX2Nvbm5zKSkgeworCQkJX2RlYnVnKCJhdmFpbCIpOworCQkJY29ubiA9IGxpc3RfZW50cnkoYnVuZGxlLT5hdmFpbF9jb25ucy5uZXh0LAorCQkJCQkgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLAorCQkJCQkgIGJ1bmRsZV9saW5rKTsKKwkJCWlmICgtLWNvbm4tPmF2YWlsX2NhbGxzID09IDApCisJCQkJbGlzdF9tb3ZlKCZjb25uLT5idW5kbGVfbGluaywKKwkJCQkJICAmYnVuZGxlLT5idXN5X2Nvbm5zKTsKKwkJCUFTU0VSVENNUChjb25uLT5hdmFpbF9jYWxscywgPCwgUlhSUENfTUFYQ0FMTFMpOworCQkJQVNTRVJUKGNvbm4tPmNoYW5uZWxzWzBdID09IE5VTEwgfHwKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMIHx8CisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMl0gPT0gTlVMTCB8fAorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzNdID09IE5VTEwpOworCQkJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJmJ1bmRsZS0+dW51c2VkX2Nvbm5zKSkgeworCQkJX2RlYnVnKCJ1bnVzZWQiKTsKKwkJCWNvbm4gPSBsaXN0X2VudHJ5KGJ1bmRsZS0+dW51c2VkX2Nvbm5zLm5leHQsCisJCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCisJCQkJCSAgYnVuZGxlX2xpbmspOworCQkJQVNTRVJUQ01QKGNvbm4tPmF2YWlsX2NhbGxzLCA9PSwgUlhSUENfTUFYQ0FMTFMpOworCQkJY29ubi0+YXZhaWxfY2FsbHMgPSBSWFJQQ19NQVhDQUxMUyAtIDE7CisJCQlBU1NFUlQoY29ubi0+Y2hhbm5lbHNbMF0gPT0gTlVMTCAmJgorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzFdID09IE5VTEwgJiYKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1syXSA9PSBOVUxMICYmCisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbM10gPT0gTlVMTCk7CisJCQlhdG9taWNfaW5jKCZjb25uLT51c2FnZSk7CisJCQlsaXN0X21vdmUoJmNvbm4tPmJ1bmRsZV9saW5rLCAmYnVuZGxlLT5hdmFpbF9jb25ucyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgY29ubmVjdGlvbiAqLworCQlfZGVidWcoImdldCBuZXcgY29ubiBbJWRdIiwgYnVuZGxlLT5udW1fY29ubnMpOworCisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gaW50ZXJydXB0ZWQ7CisKKwkJaWYgKGJ1bmRsZS0+bnVtX2Nvbm5zID49IDIwKSB7CisJCQlfZGVidWcoInRvbyBtYW55IGNvbm5zIik7CisKKwkJCWlmICghKGdmcCAmIF9fR0ZQX1dBSVQpKSB7CisJCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWFkZF93YWl0X3F1ZXVlKCZidW5kbGUtPmNoYW53YWl0LCAmbXlzZWxmKTsKKwkJCWZvciAoOzspIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWlmIChidW5kbGUtPm51bV9jb25ucyA8IDIwIHx8CisJCQkJICAgICFsaXN0X2VtcHR5KCZidW5kbGUtPnVudXNlZF9jb25ucykgfHwKKwkJCQkgICAgIWxpc3RfZW1wdHkoJmJ1bmRsZS0+YXZhaWxfY29ubnMpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWdvdG8gaW50ZXJydXB0ZWRfZGVxdWV1ZTsKKwkJCQlzY2hlZHVsZSgpOworCQkJfQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmJ1bmRsZS0+Y2hhbndhaXQsICZteXNlbGYpOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJc3Bpbl9sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBub3QgeWV0IHByZXNlbnQgLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHRoZW4KKwkJICogcmVkbyB0aGUgY2hlY2sgKi8KKwkJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCQlpZiAoSVNfRVJSKGNhbmRpZGF0ZSkpIHsKKwkJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUihjYW5kaWRhdGUpKTsKKwkJCXJldHVybiBQVFJfRVJSKGNhbmRpZGF0ZSk7CisJCX0KKworCQljYW5kaWRhdGUtPnRyYW5zID0gdHJhbnM7CisJCWNhbmRpZGF0ZS0+YnVuZGxlID0gYnVuZGxlOworCQljYW5kaWRhdGUtPnNlcnZpY2VfaWQgPSBidW5kbGUtPnNlcnZpY2VfaWQ7CisJCWNhbmRpZGF0ZS0+ZXBvY2ggPSByeHJwY19lcG9jaDsKKwkJY2FuZGlkYXRlLT5pbl9jbGllbnRmbGFnID0gMDsKKwkJY2FuZGlkYXRlLT5vdXRfY2xpZW50ZmxhZyA9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJCWNhbmRpZGF0ZS0+Y2lkID0gMDsKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UOworCQljYW5kaWRhdGUtPmF2YWlsX2NhbGxzID0gUlhSUENfTUFYQ0FMTFM7CisJCWNhbmRpZGF0ZS0+c2VjdXJpdHlfbGV2ZWwgPSByeC0+bWluX3NlY19sZXZlbDsKKwkJY2FuZGlkYXRlLT5rZXkgPSBrZXlfZ2V0KGJ1bmRsZS0+a2V5KTsKKworCQlyZXQgPSByeHJwY19pbml0X2NsaWVudF9jb25uX3NlY3VyaXR5KGNhbmRpZGF0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlrZXlfcHV0KGNhbmRpZGF0ZS0+a2V5KTsKKwkJCWtmcmVlKGNhbmRpZGF0ZSk7CisJCQlfbGVhdmUoIiA9ICVkIFtrZXldIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZjYW5kaWRhdGUtPmxpbmssICZyeHJwY19jb25uZWN0aW9ucyk7CisJCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKworCQlzcGluX2xvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwkJbGlzdF9hZGQoJmNhbmRpZGF0ZS0+YnVuZGxlX2xpbmssICZidW5kbGUtPnVudXNlZF9jb25ucyk7CisJCWJ1bmRsZS0+bnVtX2Nvbm5zKys7CisJCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCQlhdG9taWNfaW5jKCZ0cmFucy0+dXNhZ2UpOworCisJCV9uZXQoIkNPTk5FQ1QgbmV3ICVkIG9uIFRSQU5TICVkIiwKKwkJICAgICBjYW5kaWRhdGUtPmRlYnVnX2lkLCBjYW5kaWRhdGUtPnRyYW5zLT5kZWJ1Z19pZCk7CisKKwkJcnhycGNfYXNzaWduX2Nvbm5lY3Rpb25faWQoY2FuZGlkYXRlKTsKKwkJaWYgKGNhbmRpZGF0ZS0+c2VjdXJpdHkpCisJCQljYW5kaWRhdGUtPnNlY3VyaXR5LT5wcmltZV9wYWNrZXRfc2VjdXJpdHkoY2FuZGlkYXRlKTsKKworCQkvKiBsZWF2ZSB0aGUgY2FuZGlkYXRlIGx1cmtpbmcgaW4gem9tYmllIG1vZGUgYXR0YWNoZWQgdG8gdGhlCisJCSAqIGJ1bmRsZSB1bnRpbCB3ZSdyZSByZWFkeSBmb3IgaXQgKi8KKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY2FuZGlkYXRlKTsKKwkJY2FuZGlkYXRlID0gTlVMTDsKKwl9CisKKwkvKiB3ZSd2ZSBnb3QgYSBjb25uZWN0aW9uIHdpdGggYSBmcmVlIGNoYW5uZWwgYW5kIHdlIGNhbiBub3cgYXR0YWNoIHRoZQorCSAqIGNhbGwgdG8gaXQKKwkgKiAtIHdlJ3JlIGhvbGRpbmcgdGhlIHRyYW5zcG9ydCdzIGNsaWVudCBsb2NrCisJICogLSB3ZSdyZSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoZSBjb25uZWN0aW9uCisJICogLSB3ZSdyZSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoZSBidW5kbGUKKwkgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUlhSUENfTUFYQ0FMTFM7IGNoYW4rKykKKwkJaWYgKCFjb25uLT5jaGFubmVsc1tjaGFuXSkKKwkJCWdvdG8gZm91bmRfY2hhbm5lbDsKKwlBU1NFUlQoY29ubi0+Y2hhbm5lbHNbMF0gPT0gTlVMTCB8fAorCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMIHx8CisJICAgICAgIGNvbm4tPmNoYW5uZWxzWzJdID09IE5VTEwgfHwKKwkgICAgICAgY29ubi0+Y2hhbm5lbHNbM10gPT0gTlVMTCk7CisJQlVHKCk7CisKK2ZvdW5kX2NoYW5uZWw6CisJY29ubi0+Y2hhbm5lbHNbY2hhbl0gPSBjYWxsOworCWNhbGwtPmNvbm4gPSBjb25uOworCWNhbGwtPmNoYW5uZWwgPSBjaGFuOworCWNhbGwtPmNpZCA9IGNvbm4tPmNpZCB8IGh0b25sKGNoYW4pOworCWNhbGwtPmNhbGxfaWQgPSBodG9ubCgrK2Nvbm4tPmNhbGxfY291bnRlcik7CisKKwlfbmV0KCJDT05ORUNUIGNsaWVudCBvbiBjb25uICVkIGNoYW4gJWQgYXMgY2FsbCAleCIsCisJICAgICBjb25uLT5kZWJ1Z19pZCwgY2hhbiwgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOworCisJQVNTRVJUQ01QKGNvbm4tPmF2YWlsX2NhbGxzLCA8LCBSWFJQQ19NQVhDQUxMUyk7CisJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwlyeHJwY19hZGRfY2FsbF9JRF90b19jb25uKGNvbm4sIGNhbGwpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK2ludGVycnVwdGVkX2RlcXVldWU6CisJcmVtb3ZlX3dhaXRfcXVldWUoJmJ1bmRsZS0+Y2hhbndhaXQsICZteXNlbGYpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK2ludGVycnVwdGVkOgorCV9sZWF2ZSgiID0gLUVSRVNUQVJUU1lTIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KKworLyoKKyAqIGdldCBhIHJlY29yZCBvZiBhbiBpbmNvbWluZyBjb25uZWN0aW9uCisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICoKK3J4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkgIHN0cnVjdCByeHJwY19oZWFkZXIgKmhkciwKKwkJCSAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCAqY2FuZGlkYXRlID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKipwcDsKKwljb25zdCBjaGFyICpuZXcgPSAib2xkIjsKKwlfX2JlMzIgZXBvY2g7CisJdTMyIGNvbm5faWQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKGhkci0+ZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKTsKKworCWVwb2NoID0gaGRyLT5lcG9jaDsKKwljb25uX2lkID0gbnRvaGwoaGRyLT5jaWQpICYgUlhSUENfQ0lETUFTSzsKKworCS8qIHNlYXJjaCB0aGUgY29ubmVjdGlvbiBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCXAgPSB0cmFucy0+c2VydmVyX2Nvbm5zLnJiX25vZGU7CisJd2hpbGUgKHApIHsKKwkJY29ubiA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlfZGVidWcoIm1heWJlICV4IiwgY29ubi0+cmVhbF9jb25uX2lkKTsKKworCQlpZiAoZXBvY2ggPCBjb25uLT5lcG9jaCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChlcG9jaCA+IGNvbm4tPmVwb2NoKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlIGlmIChjb25uX2lkIDwgY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNvbm5faWQgPiBjb25uLT5yZWFsX2Nvbm5faWQpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm5lY3Rpb247CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCWlmICghY2FuZGlkYXRlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwljYW5kaWRhdGUtPnRyYW5zID0gdHJhbnM7CisJY2FuZGlkYXRlLT5lcG9jaCA9IGhkci0+ZXBvY2g7CisJY2FuZGlkYXRlLT5jaWQgPSBoZHItPmNpZCAmIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoUlhSUENfQ0lETUFTSyk7CisJY2FuZGlkYXRlLT5zZXJ2aWNlX2lkID0gaGRyLT5zZXJ2aWNlSWQ7CisJY2FuZGlkYXRlLT5zZWN1cml0eV9peCA9IGhkci0+c2VjdXJpdHlJbmRleDsKKwljYW5kaWRhdGUtPmluX2NsaWVudGZsYWcgPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCWNhbmRpZGF0ZS0+b3V0X2NsaWVudGZsYWcgPSAwOworCWNhbmRpZGF0ZS0+cmVhbF9jb25uX2lkID0gY29ubl9pZDsKKwljYW5kaWRhdGUtPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWRVI7CisJaWYgKGNhbmRpZGF0ZS0+c2VydmljZV9pZCkKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSX1VOU0VDVVJFRDsKKworCXdyaXRlX2xvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCisJcHAgPSAmdHJhbnMtPnNlcnZlcl9jb25ucy5yYl9ub2RlOworCXAgPSBOVUxMOworCXdoaWxlICgqcHApIHsKKwkJcCA9ICpwcDsKKwkJY29ubiA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlpZiAoZXBvY2ggPCBjb25uLT5lcG9jaCkKKwkJCXBwID0gJigqcHApLT5yYl9sZWZ0OworCQllbHNlIGlmIChlcG9jaCA+IGNvbm4tPmVwb2NoKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlIGlmIChjb25uX2lkIDwgY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNvbm5faWQgPiBjb25uLT5yZWFsX2Nvbm5faWQpCisJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X3NlY29uZDsKKwl9CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdCAqLworCWNvbm4gPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyYl9saW5rX25vZGUoJmNvbm4tPm5vZGUsIHAsIHBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNvbm4tPm5vZGUsICZ0cmFucy0+c2VydmVyX2Nvbm5zKTsKKwlhdG9taWNfaW5jKCZjb25uLT50cmFucy0+dXNhZ2UpOworCisJd3JpdGVfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwluZXcgPSAibmV3IjsKKworc3VjY2VzczoKKwlfbmV0KCJDT05ORUNUSU9OICVzICVkIHsleH0iLCBuZXcsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5yZWFsX2Nvbm5faWQpOworCisJX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBjb25uLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpKTsKKwlyZXR1cm4gY29ubjsKKworCS8qIHdlIGZvdW5kIHRoZSBjb25uZWN0aW9uIGluIHRoZSBsaXN0IGltbWVkaWF0ZWx5ICovCitmb3VuZF9leHRhbnRfY29ubmVjdGlvbjoKKwlpZiAoaGRyLT5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KSB7CisJCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwkJZ290byBzZWN1cml0eV9taXNtYXRjaDsKKwl9CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCB0aGUgY29ubmVjdGlvbiBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwlpZiAoaGRyLT5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KSB7CisJCXdyaXRlX3VubG9ja19iaCgmdHJhbnMtPmNvbm5fbG9jayk7CisJCWdvdG8gc2VjdXJpdHlfbWlzbWF0Y2g7CisJfQorCWF0b21pY19pbmMoJmNvbm4tPnVzYWdlKTsKKwl3cml0ZV91bmxvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworCitzZWN1cml0eV9taXNtYXRjaDoKKwlrZnJlZShjYW5kaWRhdGUpOworCV9sZWF2ZSgiID0gLUVLRVlSRUpFQ1RFRCIpOworCXJldHVybiBFUlJfUFRSKC1FS0VZUkVKRUNURUQpOworfQorCisvKgorICogZmluZCBhIGNvbm5lY3Rpb24gYmFzZWQgb24gdHJhbnNwb3J0IGFuZCBSeFJQQyBjb25uZWN0aW9uIElEIGZvciBhbiBpbmNvbWluZworICogcGFja2V0CisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19maW5kX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfaGVhZGVyICpoZHIpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IHJiX25vZGUgKnA7CisJX19iZTMyIGVwb2NoOworCXUzMiBjb25uX2lkOworCisJX2VudGVyKCIseyV4LCV4fSIsIG50b2hsKGhkci0+Y2lkKSwgaGRyLT5mbGFncyk7CisKKwlyZWFkX2xvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCisJY29ubl9pZCA9IG50b2hsKGhkci0+Y2lkKSAmIFJYUlBDX0NJRE1BU0s7CisJZXBvY2ggPSBoZHItPmVwb2NoOworCisJaWYgKGhkci0+ZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKQorCQlwID0gdHJhbnMtPnNlcnZlcl9jb25ucy5yYl9ub2RlOworCWVsc2UKKwkJcCA9IHRyYW5zLT5jbGllbnRfY29ubnMucmJfbm9kZTsKKworCXdoaWxlIChwKSB7CisJCWNvbm4gPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbm9kZSk7CisKKwkJX2RlYnVnKCJtYXliZSAleCIsIGNvbm4tPnJlYWxfY29ubl9pZCk7CisKKwkJaWYgKGVwb2NoIDwgY29ubi0+ZXBvY2gpCisJCQlwID0gcC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZXBvY2ggPiBjb25uLT5lcG9jaCkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAoY29ubl9pZCA8IGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChjb25uX2lkID4gY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlfbGVhdmUoIiA9IE5VTEwiKTsKKwlyZXR1cm4gTlVMTDsKKworZm91bmQ6CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIiwgY29ubik7CisJcmV0dXJuIGNvbm47Cit9CisKKy8qCisgKiByZWxlYXNlIGEgdmlydHVhbCBjb25uZWN0aW9uCisgKi8KK3ZvaWQgcnhycGNfcHV0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJX2VudGVyKCIlcHt1PSVkLGQ9JWR9IiwKKwkgICAgICAgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgY29ubi0+ZGVidWdfaWQpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksID4sIDApOworCisJY29ubi0+cHV0X3RpbWUgPSB4dGltZS50dl9zZWM7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNvbm4tPnVzYWdlKSkgeworCQlfZGVidWcoInpvbWJpZSIpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlc3Ryb3kgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCV9lbnRlcigiJXB7JWR9IiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPT0sIDApOworCisJX25ldCgiREVTVFJPWSBDT05OICVkIiwgY29ubi0+ZGVidWdfaWQpOworCisJaWYgKGNvbm4tPmJ1bmRsZSkKKwkJcnhycGNfcHV0X2J1bmRsZShjb25uLT50cmFucywgY29ubi0+YnVuZGxlKTsKKworCUFTU0VSVChSQl9FTVBUWV9ST09UKCZjb25uLT5jYWxscykpOworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjb25uLT5yeF9xdWV1ZSk7CisKKwlyeHJwY19jbGVhcl9jb25uX3NlY3VyaXR5KGNvbm4pOworCXJ4cnBjX3B1dF90cmFuc3BvcnQoY29ubi0+dHJhbnMpOworCWtmcmVlKGNvbm4pOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiByZWFwIGRlYWQgY29ubmVjdGlvbnMKKyAqLwordm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpfcDsKKwl1bnNpZ25lZCBsb25nIG5vdywgZWFybGllc3QsIHJlYXBfdGltZTsKKworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IHh0aW1lLnR2X3NlYzsKKwllYXJsaWVzdCA9IFVMT05HX01BWDsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm4sIF9wLCAmcnhycGNfY29ubmVjdGlvbnMsIGxpbmspIHsKKwkJX2RlYnVnKCJyZWFwIENPTk4gJWQgeyB1PSVkLHQ9JWxkIH0iLAorCQkgICAgICAgY29ubi0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksCisJCSAgICAgICAobG9uZykgbm93IC0gKGxvbmcpIGNvbm4tPnB1dF90aW1lKTsKKworCQlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPiAwKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmY29ubi0+dHJhbnMtPmNsaWVudF9sb2NrKTsKKwkJd3JpdGVfbG9jaygmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJCXJlYXBfdGltZSA9IGNvbm4tPnB1dF90aW1lICsgcnhycGNfY29ubmVjdGlvbl90aW1lb3V0OworCisJCWlmIChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpID4gMCkgeworCQkJOworCQl9IGVsc2UgaWYgKHJlYXBfdGltZSA8PSBub3cpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5saW5rLCAmZ3JhdmV5YXJkKTsKKwkJCWlmIChjb25uLT5vdXRfY2xpZW50ZmxhZykKKwkJCQlyYl9lcmFzZSgmY29ubi0+bm9kZSwKKwkJCQkJICZjb25uLT50cmFucy0+Y2xpZW50X2Nvbm5zKTsKKwkJCWVsc2UKKwkJCQlyYl9lcmFzZSgmY29ubi0+bm9kZSwKKwkJCQkJICZjb25uLT50cmFucy0+c2VydmVyX2Nvbm5zKTsKKwkJCWlmIChjb25uLT5idW5kbGUpIHsKKwkJCQlsaXN0X2RlbF9pbml0KCZjb25uLT5idW5kbGVfbGluayk7CisJCQkJY29ubi0+YnVuZGxlLT5udW1fY29ubnMtLTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKHJlYXBfdGltZSA8IGVhcmxpZXN0KSB7CisJCQllYXJsaWVzdCA9IHJlYXBfdGltZTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjb25uLT50cmFucy0+Y2xpZW50X2xvY2spOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwlpZiAoZWFybGllc3QgIT0gVUxPTkdfTUFYKSB7CisJCV9kZWJ1ZygicmVzY2hlZHVsZSByZWFwZXIgJWxkIiwgKGxvbmcpIGVhcmxpZXN0IC0gbm93KTsKKwkJQVNTRVJUQ01QKGVhcmxpZXN0LCA+LCBub3cpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwKKwkJCQkJIChlYXJsaWVzdCAtIG5vdykgKiBIWik7CisJfQorCisJLyogdGhlbiBkZXN0cm95IGFsbCB0aG9zZSBwdWxsZWQgb3V0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZncmF2ZXlhcmQpKSB7CisJCWNvbm4gPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwKKwkJCQkgIGxpbmspOworCQlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKKworCQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPT0sIDApOworCQlyeHJwY19kZXN0cm95X2Nvbm5lY3Rpb24oY29ubik7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY29ubmVjdGlvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZW0KKyAqIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2Nvbm5lY3Rpb25zKHZvaWQpCit7CisJX2VudGVyKCIiKTsKKworCXJ4cnBjX2Nvbm5lY3Rpb25fdGltZW91dCA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwKTsKKwlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CisKKwlfbGVhdmUoIiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNvbm5ldmVudC5jIGIvbmV0L3J4cnBjL2FyLWNvbm5ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGE0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItY29ubmV2ZW50LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIGNvbm5lY3Rpb24tbGV2ZWwgZXZlbnQgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogcGFzcyBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQgb250byBhbGwgY2FsbHMgb24gdGhhdCBjb25uZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Fib3J0X2NhbGxzKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBpbnQgc3RhdGUsCisJCQkgICAgICB1MzIgYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKworCV9lbnRlcigieyVkfSwleCIsIGNvbm4tPmRlYnVnX2lkLCBhYm9ydF9jb2RlKTsKKworCXJlYWRfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwlmb3IgKHAgPSByYl9maXJzdCgmY29ubi0+Y2FsbHMpOyBwOyBwID0gcmJfbmV4dChwKSkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIGNvbm5fbm9kZSk7CisJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY2FsbC0+c3RhdGUgPSBzdGF0ZTsKKwkJCWNhbGwtPmFib3J0X2NvZGUgPSBhYm9ydF9jb2RlOworCQkJaWYgKHN0YXRlID09IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEKQorCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJCWVsc2UKKwkJCQlzZXRfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQl9CisJCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJfQorCisJcmVhZF91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQKKyAqLworc3RhdGljIGludCByeHJwY19hYm9ydF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgdTMyIGVycm9yLCB1MzIgYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgcnhycGNfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJX19iZTMyIHdvcmQ7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlZCwsJXUsJXUiLCBjb25uLT5kZWJ1Z19pZCwgZXJyb3IsIGFib3J0X2NvZGUpOworCisJLyogZ2VuZXJhdGUgYSBjb25uZWN0aW9uLWxldmVsIGFib3J0ICovCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwlpZiAoY29ubi0+c3RhdGUgPCBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpIHsKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDsKKwkJY29ubi0+ZXJyb3IgPSBlcnJvcjsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnN0YXRlX2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwkJX2xlYXZlKCIgPSAwIFthbHJlYWR5IGRlYWRdIik7CisJCXJldHVybiAwOworCX0KKworCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlKTsKKworCW1zZy5tc2dfbmFtZQk9ICZjb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLmVwb2NoCT0gY29ubi0+ZXBvY2g7CisJaGRyLmNpZAkJPSBjb25uLT5jaWQ7CisJaGRyLmNhbGxOdW1iZXIJPSAwOworCWhkci5zZXEJCT0gMDsKKwloZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCWhkci5mbGFncwk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCWhkci51c2VyU3RhdHVzCT0gMDsKKwloZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWhkci5fcnN2ZAk9IDA7CisJaGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwl3b3JkID0gaHRvbmwoYWJvcnRfY29kZSk7CisKKwlpb3ZbMF0uaW92X2Jhc2UJPSAmaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKGhkcik7CisJaW92WzFdLmlvdl9iYXNlCT0gJndvcmQ7CisJaW92WzFdLmlvdl9sZW4JPSBzaXplb2Yod29yZCk7CisKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOworCisJaGRyLnNlcmlhbCA9IGh0b25sKGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpKTsKKwlfcHJvdG8oIlR4IENPTk4gQUJPUlQgJSUldSB7ICVkIH0iLCBudG9obChoZHIuc2VyaWFsKSwgYWJvcnRfY29kZSk7CisKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT50cmFucy0+bG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAyLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1Zygic2VuZG1zZyBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtYXJrIGEgY2FsbCBhcyBiZWluZyBvbiBhIG5vdy1zZWN1cmVkIGNoYW5uZWwKKyAqIC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZAorICovCit2b2lkIHJ4cnBjX2NhbGxfaXNfc2VjdXJlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJXAiLCBjYWxsKTsKKwlpZiAoY2FsbCkgeworCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1NFQ1VSRUQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCX0KK30KKworLyoKKyAqIGNvbm5lY3Rpb24tbGV2ZWwgUnggcGFja2V0IHByb2Nlc3NvcgorICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB1MzIgKl9hYm9ydF9jb2RlKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlfX2JlMzIgdG1wOworCXUzMiBzZXJpYWw7CisJaW50IGxvb3AsIHJldDsKKworCWlmIChjb25uLT5zdGF0ZSA+PSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpCisJCXJldHVybiAtRUNPTk5BQk9SVEVEOworCisJc2VyaWFsID0gbnRvaGwoc3AtPmhkci5zZXJpYWwpOworCisJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZ0bXAsIHNpemVvZih0bXApKSA8IDApCisJCQlyZXR1cm4gLUVQUk9UTzsKKwkJX3Byb3RvKCJSeCBBQk9SVCAlJSV1IHsgYWM9JWQgfSIsIHNlcmlhbCwgbnRvaGwodG1wKSk7CisKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQ7CisJCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCwKKwkJCQkgIG50b2hsKHRtcCkpOworCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOgorCQlpZiAoY29ubi0+c2VjdXJpdHkpCisJCQlyZXR1cm4gY29ubi0+c2VjdXJpdHktPnJlc3BvbmRfdG9fY2hhbGxlbmdlKAorCQkJCWNvbm4sIHNrYiwgX2Fib3J0X2NvZGUpOworCQlyZXR1cm4gLUVQUk9UTzsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfUkVTUE9OU0U6CisJCWlmICghY29ubi0+c2VjdXJpdHkpCisJCQlyZXR1cm4gLUVQUk9UTzsKKworCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+dmVyaWZ5X3Jlc3BvbnNlKGNvbm4sIHNrYiwgX2Fib3J0X2NvZGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gY29ubi0+c2VjdXJpdHktPmluaXRfY29ubmVjdGlvbl9zZWN1cml0eShjb25uKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWNvbm4tPnNlY3VyaXR5LT5wcmltZV9wYWNrZXRfc2VjdXJpdHkoY29ubik7CisJCXJlYWRfbG9ja19iaCgmY29ubi0+bG9jayk7CisJCXNwaW5fbG9jaygmY29ubi0+c3RhdGVfbG9jayk7CisKKwkJaWYgKGNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVkVSX0NIQUxMRU5HSU5HKSB7CisJCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSOworCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX01BWENBTExTOyBsb29wKyspCisJCQkJcnhycGNfY2FsbF9pc19zZWN1cmUoY29ubi0+Y2hhbm5lbHNbbG9vcF0pOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOworCQlyZWFkX3VubG9ja19iaCgmY29ubi0+bG9jayk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorfQorCisvKgorICogc2V0IHVwIHNlY3VyaXR5IGFuZCBpc3N1ZSBhIGNoYWxsZW5nZQorICovCitzdGF0aWMgdm9pZCByeHJwY19zZWN1cmVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwl1MzIgYWJvcnRfY29kZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJQVNTRVJUKGNvbm4tPnNlY3VyaXR5X2l4ICE9IDApOworCisJaWYgKCFjb25uLT5rZXkpIHsKKwkJX2RlYnVnKCJzZXQgdXAgc2VjdXJpdHkiKTsKKwkJcmV0ID0gcnhycGNfaW5pdF9zZXJ2ZXJfY29ubl9zZWN1cml0eShjb25uKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVOT0VOVDoKKwkJCWFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisJCQlnb3RvIGFib3J0OworCQlkZWZhdWx0OgorCQkJYWJvcnRfY29kZSA9IFJYS0FETk9BVVRIOworCQkJZ290byBhYm9ydDsKKwkJfQorCX0KKworCUFTU0VSVChjb25uLT5zZWN1cml0eSAhPSBOVUxMKTsKKworCWlmIChjb25uLT5zZWN1cml0eS0+aXNzdWVfY2hhbGxlbmdlKGNvbm4pIDwgMCkgeworCQlhYm9ydF9jb2RlID0gUlhfQ0FMTF9ERUFEOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFib3J0OworCX0KKworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCithYm9ydDoKKwlfZGVidWcoImFib3J0ICVkLCAlZCIsIHJldCwgYWJvcnRfY29kZSk7CisJcnhycGNfYWJvcnRfY29ubmVjdGlvbihjb25uLCAtcmV0LCBhYm9ydF9jb2RlKTsKKwlfbGVhdmUoIiBbYWJvcnRlZF0iKTsKK30KKworLyoKKyAqIGNvbm5lY3Rpb24tbGV2ZWwgZXZlbnQgcHJvY2Vzc29yCisgKi8KK3ZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgcHJvY2Vzc29yKTsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0NIQUxMRU5HRSwgJmNvbm4tPmV2ZW50cykpIHsKKwkJcnhycGNfc2VjdXJlX2Nvbm5lY3Rpb24oY29ubik7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCX0KKworCS8qIGdvIHRocm91Z2ggdGhlIGNvbm4tbGV2ZWwgZXZlbnQgcGFja2V0cywgcmVsZWFzaW5nIHRoZSByZWYgb24gdGhpcworCSAqIGNvbm5lY3Rpb24gdGhhdCBlYWNoIG9uZSBoYXMgd2hlbiB3ZSd2ZSBmaW5pc2hlZCB3aXRoIGl0ICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+cnhfcXVldWUpKSkgeworCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCXJldCA9IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoY29ubiwgc2tiLCAmYWJvcnRfY29kZSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgLUVQUk9UTzoKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCWNhc2UgLUVLRVlSRUpFQ1RFRDoKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCWNhc2UgLUVBR0FJTjoKKwkJCWdvdG8gcmVxdWV1ZV9hbmRfbGVhdmU7CisJCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJZGVmYXVsdDoKKwkJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKK3JlcXVldWVfYW5kX2xlYXZlOgorCXNrYl9xdWV1ZV9oZWFkKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKKwlnb3RvIG91dDsKKworcHJvdG9jb2xfZXJyb3I6CisJaWYgKHJ4cnBjX2Fib3J0X2Nvbm5lY3Rpb24oY29ubiwgLXJldCwgYWJvcnRfY29kZSkgPCAwKQorCQlnb3RvIHJlcXVldWVfYW5kX2xlYXZlOworCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJX2xlYXZlKCIgW0VQUk9UT10iKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIHB1dCBhIHBhY2tldCB1cCBmb3IgdHJhbnNwb3J0LWxldmVsIGFib3J0CisgKi8KK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUNIRUNLX1NMQUJfT0tBWSgmbG9jYWwtPnVzYWdlKTsKKworCWlmICghYXRvbWljX2luY19ub3RfemVybygmbG9jYWwtPnVzYWdlKSkgeworCQlwcmludGsoInJlc3VycmVjdGVkIG9uIHJlamVjdFxuIik7CisJCUJVRygpOworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cmVqZWN0X3F1ZXVlLCBza2IpOworCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5yZWplY3Rlcik7Cit9CisKKy8qCisgKiByZWplY3QgcGFja2V0cyB0aHJvdWdoIHRoZSBsb2NhbCBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwl9IHNhOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwlzaXplX3Qgc2l6ZTsKKwlfX2JlMzIgY29kZTsKKworCWxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19sb2NhbCwgcmVqZWN0ZXIpOworCXJ4cnBjX2dldF9sb2NhbChsb2NhbCk7CisKKwlfZW50ZXIoIiVkIiwgbG9jYWwtPmRlYnVnX2lkKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9ICZoZHI7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2YoaGRyKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSAmY29kZTsKKwlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihjb2RlKTsKKwlzaXplID0gc2l6ZW9mKGhkcikgKyBzaXplb2YoY29kZSk7CisKKwltc2cubXNnX25hbWUgPSAmc2E7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2Euc2FfZmFtaWx5ID0gbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5OworCXN3aXRjaCAoc2Euc2Euc2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQltc2cubXNnX25hbWVsZW4gPSBzaXplb2Yoc2Euc2luKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwloZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpKSB7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCXN3aXRjaCAoc2Euc2Euc2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXNhLnNpbi5zaW5fcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCQkJc2Euc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwkJCWNvZGUgPSBodG9ubChza2ItPnByaW9yaXR5KTsKKworCQkJaGRyLmVwb2NoID0gc3AtPmhkci5lcG9jaDsKKwkJCWhkci5jaWQgPSBzcC0+aGRyLmNpZDsKKwkJCWhkci5jYWxsTnVtYmVyID0gc3AtPmhkci5jYWxsTnVtYmVyOworCQkJaGRyLnNlcnZpY2VJZCA9IHNwLT5oZHIuc2VydmljZUlkOworCQkJaGRyLmZsYWdzID0gc3AtPmhkci5mbGFnczsKKwkJCWhkci5mbGFncyBePSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCQkJaGRyLmZsYWdzICY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisKKwkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCX0KKworCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJX2xlYXZlKCIiKTsKK30KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1lcnJvci5jIGIvbmV0L3J4cnBjL2FyLWVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1lcnJvci5jCkBAIC0wLDAgKzEsMjUzIEBACisvKiBFcnJvciBtZXNzYWdlIGhhbmRsaW5nIChJQ01QKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKKy8qCisgKiBoYW5kbGUgYW4gZXJyb3IgcmVjZWl2ZWQgb24gdGhlIGxvY2FsIGVuZHBvaW50CisgKi8KK3ZvaWQgcnhycGNfVURQX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsID0gc2stPnNrX3VzZXJfZGF0YTsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fYmUzMiBhZGRyOworCV9fYmUxNiBwb3J0OworCisJX2VudGVyKCIlcHslZH0iLCBzaywgbG9jYWwtPmRlYnVnX2lkKTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfZXJyb3JfcXVldWUpOworCWlmICghc2tiKSB7CisJCV9sZWF2ZSgiVURQIHNvY2tldCBlcnJxdWV1ZSBlbXB0eSIpOworCQlyZXR1cm47CisJfQorCisJcnhycGNfbmV3X3NrYihza2IpOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJYWRkciA9ICooX19iZTMyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgc2Vyci0+YWRkcl9vZmZzZXQpOworCXBvcnQgPSBzZXJyLT5wb3J0OworCisJX25ldCgiUnggVURQIEVycm9yIGZyb20gIk5JUFFVQURfRk1UIjolaHUiLAorCSAgICAgTklQUVVBRChhZGRyKSwgbnRvaHMocG9ydCkpOworCV9kZWJ1ZygiTXNnIGw6JWQgZDolZCIsIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKKworCXBlZXIgPSByeHJwY19maW5kX3BlZXIobG9jYWwsIGFkZHIsIHBvcnQpOworCWlmIChJU19FUlIocGVlcikpIHsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJX2xlYXZlKCIgW25vIHBlZXJdIik7CisJCXJldHVybjsKKwl9CisKKwl0cmFucyA9IHJ4cnBjX2ZpbmRfdHJhbnNwb3J0KGxvY2FsLCBwZWVyKTsKKwlpZiAoIXRyYW5zKSB7CisJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlfbGVhdmUoIiBbbm8gdHJhbnNdIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2Vyci0+ZWUuZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9JQ01QICYmCisJICAgIHNlcnItPmVlLmVlX3R5cGUgPT0gSUNNUF9ERVNUX1VOUkVBQ0ggJiYKKwkgICAgc2Vyci0+ZWUuZWVfY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVECisJICAgICkgeworCQl1MzIgbXR1ID0gc2Vyci0+ZWUuZWVfaW5mbzsKKworCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEZyYWdtZW50YXRpb24gTmVlZGVkICglZCkiLCBtdHUpOworCisJCS8qIHdpbmQgZG93biB0aGUgbG9jYWwgaW50ZXJmYWNlIE1UVSAqLworCQlpZiAobXR1ID4gMCAmJiBwZWVyLT5pZl9tdHUgPT0gNjU1MzUgJiYgbXR1IDwgcGVlci0+aWZfbXR1KSB7CisJCQlwZWVyLT5pZl9tdHUgPSBtdHU7CisJCQlfbmV0KCJJL0YgTVRVICV1IiwgbXR1KTsKKwkJfQorCisJCS8qIGlwX3J0X2ZyYWdfbmVlZGVkKCkgbWF5IGhhdmUgZWF0ZW4gdGhlIGluZm8gKi8KKwkJaWYgKG10dSA9PSAwKQorCQkJbXR1ID0gbnRvaHMoaWNtcF9oZHIoc2tiKS0+dW4uZnJhZy5tdHUpOworCisJCWlmIChtdHUgPT0gMCkgeworCQkJLyogdGhleSBkaWRuJ3QgZ2l2ZSB1cyBhIHNpemUsIGVzdGltYXRlIG9uZSAqLworCQkJaWYgKG10dSA+IDE1MDApIHsKKwkJCQltdHUgPj49IDE7CisJCQkJaWYgKG10dSA8IDE1MDApCisJCQkJCW10dSA9IDE1MDA7CisJCQl9IGVsc2UgeworCQkJCW10dSAtPSAxMDA7CisJCQkJaWYgKG10dSA8IHBlZXItPmhkcnNpemUpCisJCQkJCW10dSA9IHBlZXItPmhkcnNpemUgKyA0OworCQkJfQorCQl9CisKKwkJaWYgKG10dSA8IHBlZXItPm10dSkgeworCQkJcGVlci0+bXR1ID0gbXR1OworCQkJcGVlci0+bWF4ZGF0YSA9IHBlZXItPm10dSAtIHBlZXItPmhkcnNpemU7CisJCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsCisJCQkgICAgIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7CisJCX0KKwl9CisKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKworCS8qIHBhc3MgdGhlIHRyYW5zcG9ydCByZWYgdG8gZXJyb3JfaGFuZGxlciB0byByZWxlYXNlICovCisJc2tiX3F1ZXVlX3RhaWwoJnRyYW5zLT5lcnJvcl9xdWV1ZSwgc2tiKTsKKwlyeHJwY19xdWV1ZV93b3JrKCZ0cmFucy0+ZXJyb3JfaGFuZGxlcik7CisKKwkvKiByZXNldCBhbmQgcmVnZW5lcmF0ZSBzb2NrZXQgZXJyb3IgKi8KKwlzcGluX2xvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwlzay0+c2tfZXJyID0gMDsKKwlza2IgPSBza2JfcGVlaygmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKwlpZiAoc2tiKSB7CisJCXNrLT5za19lcnIgPSBTS0JfRVhUX0VSUihza2IpLT5lZS5lZV9lcnJubzsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZGVhbCB3aXRoIFVEUCBlcnJvciBtZXNzYWdlcworICovCit2b2lkIHJ4cnBjX1VEUF9lcnJvcl9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc29ja19leHRlbmRlZF9lcnIgKmVlOworCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCwgZXJyb3JfaGFuZGxlcik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbG9jYWwsIGVycjsKKworCV9lbnRlcigiIik7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmdHJhbnMtPmVycm9yX3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJZWUgPSAmc2Vyci0+ZWU7CisKKwlfbmV0KCJSeCBFcnJvciBvPSVkIHQ9JWQgYz0lZCBlPSVkIiwKKwkgICAgIGVlLT5lZV9vcmlnaW4sIGVlLT5lZV90eXBlLCBlZS0+ZWVfY29kZSwgZWUtPmVlX2Vycm5vKTsKKworCWVyciA9IGVlLT5lZV9lcnJubzsKKworCXN3aXRjaCAoZWUtPmVlX29yaWdpbikgeworCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6CisJCWxvY2FsID0gMDsKKwkJc3dpdGNoIChlZS0+ZWVfdHlwZSkgeworCQljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQkJc3dpdGNoIChlZS0+ZWVfY29kZSkgeworCQkJY2FzZSBJQ01QX05FVF9VTlJFQUNIOgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgTmV0d29yayBVbnJlYWNoYWJsZSIpOworCQkJCWVyciA9IEVORVRVTlJFQUNIOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ01QX0hPU1RfVU5SRUFDSDoKKwkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEhvc3QgVW5yZWFjaGFibGUiKTsKKwkJCQllcnIgPSBFSE9TVFVOUkVBQ0g7CisJCQkJYnJlYWs7CisJCQljYXNlIElDTVBfUE9SVF9VTlJFQUNIOgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgUG9ydCBVbnJlYWNoYWJsZSIpOworCQkJCWVyciA9IEVDT05OUkVGVVNFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNNUF9GUkFHX05FRURFRDoKKwkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEZyYWdtZW50YXRpb24gTmVlZGVkICglZCkiLAorCQkJCSAgICAgZWUtPmVlX2luZm8pOworCQkJCWVyciA9IDA7IC8qIGRlYWx0IHdpdGggZWxzZXdoZXJlICovCisJCQkJYnJlYWs7CisJCQljYXNlIElDTVBfTkVUX1VOS05PV046CisJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIE5ldHdvcmsiKTsKKwkJCQllcnIgPSBFTkVUVU5SRUFDSDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNNUF9IT1NUX1VOS05PV046CisJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIEhvc3QiKTsKKwkJCQllcnIgPSBFSE9TVFVOUkVBQ0g7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgRGVzdFVucmVhY2ggY29kZT0ldSIsCisJCQkJICAgICBlZS0+ZWVfY29kZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgVFRMIEV4Y2VlZGVkIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJX3Byb3RvKCJSeCBSZWNlaXZlZCBJQ01QIGVycm9yIHsgdHlwZT0ldSBjb2RlPSV1IH0iLAorCQkJICAgICAgIGVlLT5lZV90eXBlLCBlZS0+ZWVfY29kZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09fRUVfT1JJR0lOX0xPQ0FMOgorCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGxvY2FsIGVycm9yIHsgZXJyb3I9JWQgfSIsCisJCSAgICAgICBlZS0+ZWVfZXJybm8pOworCQlsb2NhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTT19FRV9PUklHSU5fTk9ORToKKwljYXNlIFNPX0VFX09SSUdJTl9JQ01QNjoKKwlkZWZhdWx0OgorCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGVycm9yIHJlcG9ydCB7IG9yaWc9JXUgfSIsCisJCSAgICAgICBlZS0+ZWVfb3JpZ2luKTsKKwkJbG9jYWwgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiB0ZXJtaW5hdGUgYWxsIHRoZSBhZmZlY3RlZCBjYWxscyBpZiB0aGVyZSdzIGFuIHVucmVjb3ZlcmFibGUKKwkgKiBlcnJvciAqLworCWlmIChlcnIpIHsKKwkJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsICpfbjsKKworCQlfZGVidWcoIklTU1VFIEVSUk9SICVkIiwgZXJyKTsKKworCQlzcGluX2xvY2tfYmgoJnRyYW5zLT5wZWVyLT5sb2NrKTsKKwkJdHJhbnMtPnBlZXItPm5ldF9lcnJvciA9IGVycjsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2FsbCwgX24sICZ0cmFucy0+cGVlci0+ZXJyb3JfdGFyZ2V0cywKKwkJCQkJIGVycm9yX2xpbmspIHsKKwkJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJCSAgICBjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikgeworCQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOworCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0VSUk9SLCAmY2FsbC0+ZXZlbnRzKTsKKwkJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQkJfQorCQkJd3JpdGVfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmVycm9yX2xpbmspOworCQl9CisKKwkJc3Bpbl91bmxvY2tfYmgoJnRyYW5zLT5wZWVyLT5sb2NrKTsKKwl9CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHJhbnMtPmVycm9yX3F1ZXVlKSkKKwkJcnhycGNfcXVldWVfd29yaygmdHJhbnMtPmVycm9yX2hhbmRsZXIpOworCisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlfbGVhdmUoIiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWlucHV0LmMgYi9uZXQvcnhycGMvYXItaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL2FyLWlucHV0LmMKQEAgLTAsMCArMSw3OTcgQEAKKy8qIFJ4UlBDIHBhY2tldCByZWNlcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCit1bnNpZ25lZCBsb25nIHJ4cnBjX2Fja190aW1lb3V0ID0gMTsKKworY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0geworCSI/MDAiLAorCSJEQVRBIiwgIkFDSyIsICJCVVNZIiwgIkFCT1JUIiwgIkFDS0FMTCIsICJDSEFMTCIsICJSRVNQIiwgIkRFQlVHIiwKKwkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgorfTsKKworLyoKKyAqIHF1ZXVlIGEgcGFja2V0IGZvciByZWN2bXNnIHRvIHBhc3MgdG8gdXNlcnNwYWNlCisgKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIGEgbG9jayBvbiBjYWxsLT5sb2NrCisgKiAtIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKHNrX2ZpbHRlcigpIGRpc2FibGVzIEJIJ3MpCisgKiAtIGVhdHMgdGhlIHBhY2tldCB3aGV0aGVyIHN1Y2Nlc3NmdWwgb3Igbm90CisgKiAtIHRoZXJlIG11c3QgYmUganVzdCBvbmUgcmVmZXJlbmNlIHRvIHRoZSBwYWNrZXQsIHdoaWNoIHRoZSBjYWxsZXIgcGFzc2VzIHRvCisgKiAgIHRoaXMgZnVuY3Rpb24KKyAqLworaW50IHJ4cnBjX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlib29sIGZvcmNlLCBib29sIHRlcm1pbmFsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gY2FsbC0+c29ja2V0OworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgc2tiX2xlbiwgcmV0OworCisJX2VudGVyKCIsLCVkLCVkIiwgZm9yY2UsIHRlcm1pbmFsKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisJQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgY2FsbCk7CisKKwkvKiBpZiB3ZSd2ZSBhbHJlYWR5IHBvc3RlZCB0aGUgdGVybWluYWwgbWVzc2FnZSBmb3IgYSBjYWxsLCB0aGVuIHdlCisJICogZG9uJ3QgcG9zdCBhbnkgbW9yZSAqLworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoImFscmVhZHkgdGVybWluYXRlZCIpOworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID49LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKwkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKKwkJc3AtPmNhbGwgPSBOVUxMOworCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2sgPSAmcngtPnNrOworCisJaWYgKCFmb3JjZSkgeworCQkvKiBjYXN0IHNrYi0+cmN2YnVmIHRvIHVuc2lnbmVkLi4uICBJdCdzIHBvaW50bGVzcywgYnV0CisJCSAqIHJlZHVjZXMgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLVcKKwkJICogLS1BTksgKi8KKy8vCQlyZXQgPSAtRU5PQlVGUzsKKy8vCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUgPj0KKy8vCQkgICAgKHVuc2lnbmVkKSBzay0+c2tfcmN2YnVmKQorLy8JCQlnb3RvIG91dDsKKworCQlyZXQgPSBza19maWx0ZXIoc2ssIHNrYik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgIGNhbGwtPnNvY2tldC0+c2suc2tfc3RhdGUgIT0gUlhSUENfQ0xPU0UpIHsKKwkJc2tiLT5kZXN0cnVjdG9yID0gcnhycGNfcGFja2V0X2Rlc3RydWN0b3I7CisJCXNrYi0+ZGV2ID0gTlVMTDsKKwkJc2tiLT5zayA9IHNrOworCQlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7CisKKwkJaWYgKHRlcm1pbmFsKSB7CisJCQlfZGVidWcoIjw8PDwgVEVSTUlOQUwgTUVTU0FHRSA+Pj4+Iik7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpOworCQl9CisKKwkJLyogYWxsb3cgaW50ZXJjZXB0aW9uIGJ5IGEga2VybmVsIHNlcnZpY2UgKi8KKwkJaWYgKHJ4LT5pbnRlcmNlcHRvcikgeworCQkJcngtPmludGVyY2VwdG9yKHNrLCBjYWxsLT51c2VyX2NhbGxfSUQsIHNrYik7CisJCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCX0gZWxzZSB7CisKKwkJCS8qIENhY2hlIHRoZSBTS0IgbGVuZ3RoIGJlZm9yZSB3ZSB0YWNrIGl0IG9udG8gdGhlCisJCQkgKiByZWNlaXZlIHF1ZXVlLiAgT25jZSBpdCBpcyBhZGRlZCBpdCBubyBsb25nZXIKKwkJCSAqIGJlbG9uZ3MgdG8gdXMgYW5kIG1heSBiZSBmcmVlZCBieSBvdGhlciB0aHJlYWRzIG9mCisJCQkgKiBjb250cm9sIHB1bGxpbmcgcGFja2V0cyBmcm9tIHRoZSBxdWV1ZSAqLworCQkJc2tiX2xlbiA9IHNrYi0+bGVuOworCisJCQlfbmV0KCJwb3N0IHNrYiAlcCIsIHNrYik7CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYl9sZW4pOworCQl9CisJCXNrYiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCX0KKwlyZXQgPSAwOworCitvdXQ6CisJLyogcmVsZWFzZSB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmIChza2IpIHsKKwkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKKwkJc3AtPmNhbGwgPSBOVUxMOworCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcHJvY2VzcyBhIERBVEEgcGFja2V0LCBwb3N0aW5nIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCisgKiAtIGVhdHMgdGhlIHBhY2tldCBpZiBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCWJvb2wgdGVybWluYWw7CisJaW50IHJldCwgYWNrYml0LCBhY2s7CisKKwlfZW50ZXIoInsldSwldX0sLHsldX0iLCBjYWxsLT5yeF9kYXRhX3Bvc3QsIGNhbGwtPnJ4X2ZpcnN0X29vcywgc2VxKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisJQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgTlVMTCk7CisKKwlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCisJaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJZ290byBkaXNjYXJkOworCisJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfZXhwZWN0LCA+PSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7CisKKwlpZiAoc2VxIDwgY2FsbC0+cnhfZGF0YV9wb3N0KSB7CisJCV9kZWJ1ZygiZHVwICMldSBbLSV1XSIsIHNlcSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKKwkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gZGlzY2FyZF9hbmRfYWNrOworCX0KKworCS8qIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIHBhY2tldCBpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCisJYWNrYml0ID0gc2VxIC0gKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKKwlBU1NFUlRDTVAoYWNrYml0LCA+PSwgMCk7CisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KSkgeworCQlfZGVidWcoImR1cCBvb3MgIyV1IFsldSwldV0iLAorCQkgICAgICAgc2VxLCBjYWxsLT5yeF9kYXRhX2VhdGVuLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOworCQlhY2sgPSBSWFJQQ19BQ0tfRFVQTElDQVRFOworCQlnb3RvIGRpc2NhcmRfYW5kX2FjazsKKwl9CisKKwlpZiAoc2VxID49IGNhbGwtPmFja3Jfd2luX3RvcCkgeworCQlfZGVidWcoImV4Y2VlZCAjJXUgWyV1XSIsIHNlcSwgY2FsbC0+YWNrcl93aW5fdG9wKTsKKwkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7CisJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJZ290byBkaXNjYXJkX2FuZF9hY2s7CisJfQorCisJaWYgKHNlcSA9PSBjYWxsLT5yeF9kYXRhX2V4cGVjdCkgeworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FWFBFQ1RfT09TLCAmY2FsbC0+ZmxhZ3MpOworCQljYWxsLT5yeF9kYXRhX2V4cGVjdCsrOworCX0gZWxzZSBpZiAoc2VxID4gY2FsbC0+cnhfZGF0YV9leHBlY3QpIHsKKwkJX2RlYnVnKCJvb3MgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfZXhwZWN0KTsKKwkJY2FsbC0+cnhfZGF0YV9leHBlY3QgPSBzZXEgKyAxOworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUEVDVF9PT1MsICZjYWxsLT5mbGFncykpIHsKKwkJCWFjayA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7CisJCQlnb3RvIGVucXVldWVfYW5kX2FjazsKKwkJfQorCQlnb3RvIGVucXVldWVfcGFja2V0OworCX0KKworCWlmIChzZXEgIT0gY2FsbC0+cnhfZGF0YV9wb3N0KSB7CisJCV9kZWJ1ZygiYWhlYWQgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7CisJCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkNWRF9MQVNULCAmY2FsbC0+ZmxhZ3MpKQorCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJLyogaWYgdGhlIHBhY2tldCBuZWVkIHNlY3VyaXR5IHRoaW5ncyBkb2luZyB0byBpdCwgdGhlbiBpdCBnb2VzIGRvd24KKwkgKiB0aGUgc2xvdyBwYXRoICovCisJaWYgKGNhbGwtPmNvbm4tPnNlY3VyaXR5KQorCQlnb3RvIGVucXVldWVfcGFja2V0OworCisJc3AtPmNhbGwgPSBjYWxsOworCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXRlcm1pbmFsID0gKChzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpICYmCisJCSAgICAhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSk7CisJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIGZhbHNlLCB0ZXJtaW5hbCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PQlVGUykgeworCQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7CisJCQlhY2sgPSBSWFJQQ19BQ0tfTk9TUEFDRTsKKwkJCWdvdG8gZGlzY2FyZF9hbmRfYWNrOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXNrYiA9IE5VTEw7CisKKwlfZGVidWcoInBvc3QgIyV1Iiwgc2VxKTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA9PSwgc2VxKTsKKwljYWxsLT5yeF9kYXRhX3Bvc3QrKzsKKworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpCisJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0xBU1QsICZjYWxsLT5mbGFncyk7CisKKwkvKiBpZiB3ZSd2ZSByZWFjaGVkIGFuIG91dCBvZiBzZXF1ZW5jZSBwYWNrZXQgdGhlbiB3ZSBuZWVkIHRvIGRyYWluCisJICogdGhhdCBxdWV1ZSBpbnRvIHRoZSBzb2NrZXQgUnggcXVldWUgbm93ICovCisJaWYgKGNhbGwtPnJ4X2RhdGFfcG9zdCA9PSBjYWxsLT5yeF9maXJzdF9vb3MpIHsKKwkJX2RlYnVnKCJkcmFpbiByeCBvb3Mgbm93Iik7CisJCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRFJBSU5fUlhfT09TLCAmY2FsbC0+ZXZlbnRzKSkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJYXRvbWljX2luYygmY2FsbC0+YWNrcl9ub3RfaWRsZSk7CisJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLCBzcC0+aGRyLnNlcmlhbCwgZmFsc2UpOworCV9sZWF2ZSgiID0gMCBbcG9zdGVkXSIpOworCXJldHVybiAwOworCitwcm90b2NvbF9lcnJvcjoKKwlyZXQgPSAtRUJBRE1TRzsKK291dDoKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworZGlzY2FyZF9hbmRfYWNrOgorCV9kZWJ1ZygiZGlzY2FyZCBhbmQgQUNLIHBhY2tldCAlcCIsIHNrYik7CisJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2ssIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKK2Rpc2NhcmQ6CisJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJX2xlYXZlKCIgPSAwIFtkaXNjYXJkZWRdIik7CisJcmV0dXJuIDA7CisKK2VucXVldWVfYW5kX2FjazoKKwlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFjaywgc3AtPmhkci5zZXJpYWwsIHRydWUpOworZW5xdWV1ZV9wYWNrZXQ6CisJX25ldCgiZGVmZXIgc2tiICVwIiwgc2tiKTsKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOworCWF0b21pY19pbmMoJmNhbGwtPmFja3Jfbm90X2lkbGUpOworCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlfbGVhdmUoIiA9IDAgW3F1ZXVlZF0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFzc3VtZSBhbiBpbXBsaWNpdCBBQ0tBTEwgb2YgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZSBvZiBhIGNsaWVudCBzb2NrZXQgdXBvbgorICogcmVjZXB0aW9uIG9mIHRoZSBmaXJzdCByZXBseSBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYXNzdW1lX2ltcGxpY2l0X2Fja2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIHNlcmlhbCkKK3sKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk7CisJCWNhbGwtPmFja3NfbGF0ZXN0ID0gc2VyaWFsOworCisJCV9kZWJ1ZygiaW1wbGljaXQgQUNLQUxMICUlJXUiLCBjYWxsLT5hY2tzX2xhdGVzdCk7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTCwgJmNhbGwtPmV2ZW50cyk7CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKSA+PSAwKSB7CisJCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKTsKKwkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgbm9taW5hdGVkIGNhbGwgdG8gZGVhbCB3aXRoCisgKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAorICovCit2b2lkIHJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCV9fYmUzMiBfYWJvcnRfY29kZTsKKwl1MzIgc2VyaWFsLCBoaV9zZXJpYWwsIHNlcSwgYWJvcnRfY29kZTsKKworCV9lbnRlcigiJXAsJXAiLCBjYWxsLCBza2IpOworCisJQVNTRVJUKCFpcnFzX2Rpc2FibGVkKCkpOworCisjaWYgMCAvLyBJTkpFQ1QgUlggRVJST1IKKwlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpIHsKKwkJc3RhdGljIGludCBza2lwID0gMDsKKwkJaWYgKCsrc2tpcCA9PSAzKSB7CisJCQlwcmludGsoIkRST1BQRUQgM1JEIFBBQ0tFVCEhISEhISEhISEhISFcbiIpOworCQkJc2tpcCA9IDA7CisJCQlnb3RvIGZyZWVfcGFja2V0OworCQl9CisJfQorI2VuZGlmCisKKwkvKiB0cmFjayB0aGUgbGF0ZXN0IHNlcmlhbCBudW1iZXIgb24gdGhpcyBjb25uZWN0aW9uIGZvciBBQ0sgcGFja2V0CisJICogaW5mb3JtYXRpb24gKi8KKwlzZXJpYWwgPSBudG9obChzcC0+aGRyLnNlcmlhbCk7CisJaGlfc2VyaWFsID0gYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCk7CisJd2hpbGUgKHNlcmlhbCA+IGhpX3NlcmlhbCkKKwkJaGlfc2VyaWFsID0gYXRvbWljX2NtcHhjaGcoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCwgaGlfc2VyaWFsLAorCQkJCQkgICBzZXJpYWwpOworCisJLyogcmVxdWVzdCBBQ0sgZ2VuZXJhdGlvbiBmb3IgYW55IEFDSyBvciBEQVRBIHBhY2tldCB0aGF0IHJlcXVlc3RzCisJICogaXQgKi8KKwlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7CisJCV9wcm90bygiQUNLIFJlcXVlc3RlZCBvbiAlJSV1Iiwgc2VyaWFsKTsKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1JFUVVFU1RFRCwgc3AtPmhkci5zZXJpYWwsCisJCQkJICAhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19NT1JFX1BBQ0tFVFMpKTsKKwl9CisKKwlzd2l0Y2ggKHNwLT5oZHIudHlwZSkgeworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6CisJCV9kZWJ1ZygiYWJvcnQiKTsKKworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZfYWJvcnRfY29kZSwKKwkJCQkgIHNpemVvZihfYWJvcnRfY29kZSkpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwkJYWJvcnRfY29kZSA9IG50b2hsKF9hYm9ydF9jb2RlKTsKKwkJX3Byb3RvKCJSeCBBQk9SVCAlJSV1IHsgJXggfSIsIHNlcmlhbCwgYWJvcnRfY29kZSk7CisKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOworCQkJY2FsbC0+YWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQl9CisJCWdvdG8gZnJlZV9wYWNrZXRfdW5sb2NrOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9CVVNZOgorCQlfcHJvdG8oIlJ4IEJVU1kgJSUldSIsIHNlcmlhbCk7CisKKwkJaWYgKGNhbGwtPmNvbm4tPm91dF9jbGllbnRmbGFnKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQlVTWTsKKwkJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0JVU1ksICZjYWxsLT5ldmVudHMpOworCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9CVVNZOgorCQkJZ290byBmcmVlX3BhY2tldF91bmxvY2s7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHByb3RvY29sX2Vycm9yX2xvY2tlZDsKKwkJfQorCisJZGVmYXVsdDoKKwkJX3Byb3RvKCJSeCAlcyAlJSV1IiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdLCBzZXJpYWwpOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCQlzZXEgPSBudG9obChzcC0+aGRyLnNlcSk7CisKKwkJX3Byb3RvKCJSeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNlcmlhbCwgc2VxKTsKKworCQlpZiAoc2VxID09IDApCisJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJCWNhbGwtPmFja3JfcHJldl9zZXEgPSBzcC0+aGRyLnNlcTsKKworCQkvKiByZWNlaXZlZCBkYXRhIGltcGxpY2l0bHkgQUNLcyBhbGwgb2YgdGhlIHJlcXVlc3QgcGFja2V0cyB3ZQorCQkgKiBzZW50IHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50ICovCisJCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkKKwkJCXJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoY2FsbCwgc2VyaWFsKTsKKworCQlzd2l0Y2ggKHJ4cnBjX2Zhc3RfcHJvY2Vzc19kYXRhKGNhbGwsIHNrYiwgc2VxKSkgeworCQljYXNlIDA6CisJCQlza2IgPSBOVUxMOworCQkJZ290byBkb25lOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKworCQkJLyogZGF0YSBwYWNrZXQgcmVjZWl2ZWQgYmV5b25kIHRoZSBsYXN0IHBhY2tldCAqLworCQljYXNlIC1FQkFETVNHOgorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCS8qIEFDSyBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gcHJvY2VzcyBjb250ZXh0ICovCisJCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkgeworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOworCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGZyZWVfcGFja2V0OworCX0KKworcHJvdG9jb2xfZXJyb3I6CisJX2RlYnVnKCJwcm90b2NvbCBlcnJvciIpOworCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworcHJvdG9jb2xfZXJyb3JfbG9ja2VkOgorCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7CisJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9CitmcmVlX3BhY2tldF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK2ZyZWVfcGFja2V0OgorCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Citkb25lOgorCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBzcGxpdCB1cCBhIGp1bWJvIGRhdGEgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3Byb2Nlc3NfanVtYm9fcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqanVtYm8pCit7CisJc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlciBqaGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnBhcnQ7CisKKwlfZW50ZXIoIix7JXUsJXV9IiwganVtYm8tPmRhdGFfbGVuLCBqdW1iby0+bGVuKTsKKworCXNwID0gcnhycGNfc2tiKGp1bWJvKTsKKworCWRvIHsKKwkJc3AtPmhkci5mbGFncyAmPSB+UlhSUENfSlVNQk9fUEFDS0VUOworCisJCS8qIG1ha2UgYSBjbG9uZSB0byByZXByZXNlbnQgdGhlIGZpcnN0IHN1YnBhY2tldCBpbiB3aGF0J3MgbGVmdAorCQkgKiBvZiB0aGUganVtYm8gcGFja2V0ICovCisJCXBhcnQgPSBza2JfY2xvbmUoanVtYm8sIEdGUF9BVE9NSUMpOworCQlpZiAoIXBhcnQpIHsKKwkJCS8qIHNpbXBseSBkaXRjaCB0aGUgdGFpbCBpbiB0aGUgZXZlbnQgb2YgRU5PTUVNICovCisJCQlwc2tiX3RyaW0oanVtYm8sIFJYUlBDX0pVTUJPX0RBVEFMRU4pOworCQkJYnJlYWs7CisJCX0KKwkJcnhycGNfbmV3X3NrYihwYXJ0KTsKKworCQlwc2tiX3RyaW0ocGFydCwgUlhSUENfSlVNQk9fREFUQUxFTik7CisKKwkJaWYgKCFwc2tiX3B1bGwoanVtYm8sIFJYUlBDX0pVTUJPX0RBVEFMRU4pKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCQlpZiAoc2tiX2NvcHlfYml0cyhqdW1ibywgMCwgJmpoZHIsIHNpemVvZihqaGRyKSkgPCAwKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJaWYgKCFwc2tiX3B1bGwoanVtYm8sIHNpemVvZihqaGRyKSkpCisJCQlCVUcoKTsKKworCQlzcC0+aGRyLnNlcQk9IGh0b25sKG50b2hsKHNwLT5oZHIuc2VxKSArIDEpOworCQlzcC0+aGRyLnNlcmlhbAk9IGh0b25sKG50b2hsKHNwLT5oZHIuc2VyaWFsKSArIDEpOworCQlzcC0+aGRyLmZsYWdzCT0gamhkci5mbGFnczsKKwkJc3AtPmhkci5fcnN2ZAk9IGpoZHIuX3JzdmQ7CisKKwkJX3Byb3RvKCJSeCBEQVRBIEp1bWJvICUlJXUiLCBudG9obChzcC0+aGRyLnNlcmlhbCkgLSAxKTsKKworCQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIHBhcnQpOworCQlwYXJ0ID0gTlVMTDsKKworCX0gd2hpbGUgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpOworCisJcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChjYWxsLCBqdW1ibyk7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKK3Byb3RvY29sX2Vycm9yOgorCV9kZWJ1ZygicHJvdG9jb2wgZXJyb3IiKTsKKwlyeHJwY19mcmVlX3NrYihwYXJ0KTsKKwlyeHJwY19mcmVlX3NrYihqdW1ibyk7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJY2FsbC0+YWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOworCQlzZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbC9zb2NrZXQgdG8gZGVhbCB3aXRoCisgKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAorICovCitzdGF0aWMgdm9pZCByeHJwY19wb3N0X3BhY2tldF90b19jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwlfX2JlMzIgY2FsbF9pZDsKKworCV9lbnRlcigiJXAsJXAiLCBjb25uLCBza2IpOworCisJcmVhZF9sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkvKiBsb29rIGF0IGV4dGFudCBjYWxscyBieSBjaGFubmVsIG51bWJlciBmaXJzdCAqLworCWNhbGwgPSBjb25uLT5jaGFubmVsc1tudG9obChzcC0+aGRyLmNpZCkgJiBSWFJQQ19DSEFOTkVMTUFTS107CisJaWYgKCFjYWxsIHx8IGNhbGwtPmNhbGxfaWQgIT0gc3AtPmhkci5jYWxsTnVtYmVyKQorCQlnb3RvIGNhbGxfbm90X2V4dGFudDsKKworCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKKwlBU1NFUlRDTVAoY2FsbC0+Y29ubiwgPT0sIGNvbm4pOworCisJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKKwljYXNlIFJYUlBDX0NBTExfREVBRDoKKwkJZ290byBmcmVlX3VubG9jazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCisJaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCisJICAgIHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpCisJCXJ4cnBjX3Byb2Nlc3NfanVtYm9fcGFja2V0KGNhbGwsIHNrYik7CisJZWxzZQorCQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIHNrYik7CisKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlnb3RvIGRvbmU7CisKK2NhbGxfbm90X2V4dGFudDoKKwkvKiBzZWFyY2ggdGhlIGNvbXBsZXRlZCBjYWxscyBpbiBjYXNlIHdoYXQgd2UncmUgZGVhbGluZyB3aXRoIGlzCisJICogdGhlcmUgKi8KKwlfZGVidWcoImNhbGwgbm90IGV4dGFudCIpOworCisJY2FsbF9pZCA9IHNwLT5oZHIuY2FsbE51bWJlcjsKKwlwID0gY29ubi0+Y2FsbHMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIGNvbm5fbm9kZSk7CisKKwkJaWYgKGNhbGxfaWQgPCBjYWxsLT5jYWxsX2lkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNhbGxfaWQgPiBjYWxsLT5jYWxsX2lkKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kX2NvbXBsZXRlZF9jYWxsOworCX0KKworZGVhZF9jYWxsOgorCS8qIGl0J3MgYSBlaXRoZXIgYSByZWFsbHkgb2xkIGNhbGwgdGhhdCB3ZSBubyBsb25nZXIgcmVtZW1iZXIgb3IgaXRzIGEKKwkgKiBuZXcgaW5jb21pbmcgY2FsbCAqLworCXJlYWRfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgorCSAgICBzcC0+aGRyLnNlcSA9PSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpKSB7CisJCV9kZWJ1ZygiaW5jb21pbmcgY2FsbCIpOworCQlza2JfcXVldWVfdGFpbCgmY29ubi0+dHJhbnMtPmxvY2FsLT5hY2NlcHRfcXVldWUsIHNrYik7CisJCXJ4cnBjX3F1ZXVlX3dvcmsoJmNvbm4tPnRyYW5zLT5sb2NhbC0+YWNjZXB0b3IpOworCQlnb3RvIGRvbmU7CisJfQorCisJX2RlYnVnKCJkZWFkIGNhbGwiKTsKKwlza2ItPnByaW9yaXR5ID0gUlhfQ0FMTF9ERUFEOworCXJ4cnBjX3JlamVjdF9wYWNrZXQoY29ubi0+dHJhbnMtPmxvY2FsLCBza2IpOworCWdvdG8gZG9uZTsKKworCS8qIHJlc2VuZCBsYXN0IHBhY2tldCBvZiBhIGNvbXBsZXRlZCBjYWxsCisJICogLSBjbGllbnQgY2FsbHMgbWF5IGhhdmUgYmVlbiBhYm9ydGVkIG9yIEFDSydkCisJICogLSBzZXJ2ZXIgY2FsbHMgbWF5IGhhdmUgYmVlbiBhYm9ydGVkCisJICovCitmb3VuZF9jb21wbGV0ZWRfY2FsbDoKKwlfZGVidWcoImNvbXBsZXRlZCBjYWxsIik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA9PSAwKQorCQlnb3RvIGRlYWRfY2FsbDsKKworCS8qIHN5bmNocm9uaXNlIGFueSBzdGF0ZSBjaGFuZ2VzICovCisJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0ssCisJCSAgICBjYWxsLT5zdGF0ZSwgPj0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEIHx8CisJICAgIGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCB8fAorCSAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0RFQUQpIHsKKwkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGRlYWRfY2FsbDsKKwl9CisKKwlpZiAoY2FsbC0+Y29ubi0+aW5fY2xpZW50ZmxhZykgeworCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWdvdG8gZGVhZF9jYWxsOyAvKiBjb21wbGV0ZSBzZXJ2ZXIgY2FsbCAqLworCX0KKworCV9kZWJ1ZygiZmluYWwgYWNrIGFnYWluIik7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJc2V0X2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cyk7CisJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKworZnJlZV91bmxvY2s6CisJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCXJlYWRfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwlyeHJwY19mcmVlX3NrYihza2IpOworZG9uZToKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcG9zdCBjb25uZWN0aW9uLWxldmVsIGV2ZW50cyB0byB0aGUgY29ubmVjdGlvbgorICogLSB0aGlzIGluY2x1ZGVzIGNoYWxsZW5nZXMsIHJlc3BvbnNlcyBhbmQgc29tZSBhYm9ydHMKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9lbnRlcigiJXAsJXAiLCBjb25uLCBza2IpOworCisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKKwlyeHJwY19xdWV1ZV9jb25uKGNvbm4pOworfQorCisvKgorICogaGFuZGxlIGRhdGEgcmVjZWl2ZWQgb24gdGhlIGxvY2FsIGVuZHBvaW50CisgKiAtIG1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqLwordm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwLCAlZCIsIHNrLCBjb3VudCk7CisKKwlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7CisKKwlyZWFkX2xvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCWxvY2FsID0gc2stPnNrX3VzZXJfZGF0YTsKKwlpZiAobG9jYWwgJiYgYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSkgPiAwKQorCQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCWVsc2UKKwkJbG9jYWwgPSBOVUxMOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoIWxvY2FsKSB7CisJCV9sZWF2ZSgiIFtsb2NhbCBkZWFkXSIpOworCQlyZXR1cm47CisJfQorCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIDAsIDEsICZyZXQpOworCWlmICghc2tiKSB7CisJCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldHVybjsKKwkJX2RlYnVnKCJVRFAgc29ja2V0IGVycm9yICVkIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJ4cnBjX25ld19za2Ioc2tiKTsKKworCV9uZXQoInJlY3Ygc2tiICVwIiwgc2tiKTsKKworCS8qIHdlJ2xsIHByb2JhYmx5IG5lZWQgdG8gY2hlY2tzdW0gaXQgKGRpZG4ndCBjYWxsIHNvY2tfcmVjdm1zZykgKi8KKwlpZiAoc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJcnhycGNfcHV0X2xvY2FsKGxvY2FsKTsKKwkJX2xlYXZlKCIgW0NTVU0gZmFpbGVkXSIpOworCQlyZXR1cm47CisJfQorCisJLyogdGhlIHNvY2tldCBidWZmZXIgd2UgaGF2ZSBpcyBvd25lZCBieSBVRFAsIHdpdGggVURQJ3MgZGF0YSBhbGwgb3ZlcgorCSAqIGl0LCBidXQgd2UgcmVhbGx5IHdhbnQgb3VyIG93biAqLworCXNrYl9vcnBoYW4oc2tiKTsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCW1lbXNldChzcCwgMCwgc2l6ZW9mKCpzcCkpOworCisJX25ldCgiUnggVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAorCSAgICAgbnRvaGwoaXBfaGRyKHNrYiktPnNhZGRyKSwgbnRvaHModWRwX2hkcihza2IpLT5zb3VyY2UpKTsKKworCS8qIGRpZyBvdXQgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gZGV0YWlscyAqLworCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAmc3AtPmhkciwKKwkJCSAgc2l6ZW9mKHNwLT5oZHIpKSA8IDApCisJCWdvdG8gYmFkX21lc3NhZ2U7CisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2Yoc3AtPmhkcikpKQorCQlCVUcoKTsKKworCV9uZXQoIlJ4IFJ4UlBDICVzIGVwPSV4IGNhbGw9JXg6JXgiLAorCSAgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgPyAiVG9TZXJ2ZXIiIDogIlRvQ2xpZW50IiwKKwkgICAgIG50b2hsKHNwLT5oZHIuZXBvY2gpLAorCSAgICAgbnRvaGwoc3AtPmhkci5jaWQpLAorCSAgICAgbnRvaGwoc3AtPmhkci5jYWxsTnVtYmVyKSk7CisKKwlpZiAoc3AtPmhkci50eXBlID09IDAgfHwgc3AtPmhkci50eXBlID49IFJYUlBDX05fUEFDS0VUX1RZUEVTKSB7CisJCV9wcm90bygiUnggQmFkIFBhY2tldCBUeXBlICV1Iiwgc3AtPmhkci50eXBlKTsKKwkJZ290byBiYWRfbWVzc2FnZTsKKwl9CisKKwlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKKwkgICAgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwIHx8IHNwLT5oZHIuc2VxID09IDApKQorCQlnb3RvIGJhZF9tZXNzYWdlOworCisJcGVlciA9IHJ4cnBjX2ZpbmRfcGVlcihsb2NhbCwgaXBfaGRyKHNrYiktPnNhZGRyLCB1ZHBfaGRyKHNrYiktPnNvdXJjZSk7CisJaWYgKElTX0VSUihwZWVyKSkKKwkJZ290byBjYW50X3JvdXRlX2NhbGw7CisKKwl0cmFucyA9IHJ4cnBjX2ZpbmRfdHJhbnNwb3J0KGxvY2FsLCBwZWVyKTsKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKwlpZiAoIXRyYW5zKQorCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKKworCWNvbm4gPSByeHJwY19maW5kX2Nvbm5lY3Rpb24odHJhbnMsICZzcC0+aGRyKTsKKwlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlpZiAoIWNvbm4pCisJCWdvdG8gY2FudF9yb3V0ZV9jYWxsOworCisJX2RlYnVnKCJDT05OICVwIHslZH0iLCBjb25uLCBjb25uLT5kZWJ1Z19pZCk7CisKKwlpZiAoc3AtPmhkci5jYWxsTnVtYmVyID09IDApCisJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwllbHNlCisJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2NhbGwoY29ubiwgc2tiKTsKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCXJldHVybjsKKworY2FudF9yb3V0ZV9jYWxsOgorCV9kZWJ1ZygiY2FuJ3Qgcm91dGUgY2FsbCIpOworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgorCSAgICBzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQSkgeworCQlpZiAoc3AtPmhkci5zZXEgPT0gX19jb25zdGFudF9jcHVfdG9fYmUzMigxKSkgeworCQkJX2RlYnVnKCJmaXJzdCBwYWNrZXQiKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+YWNjZXB0X3F1ZXVlLCBza2IpOworCQkJcnhycGNfcXVldWVfd29yaygmbG9jYWwtPmFjY2VwdG9yKTsKKwkJCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJCQlfbGVhdmUoIiBbaW5jb21pbmddIik7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiLT5wcmlvcml0eSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCX0gZWxzZSB7CisJCXNrYi0+cHJpb3JpdHkgPSBSWF9DQUxMX0RFQUQ7CisJfQorCisJX2RlYnVnKCJyZWplY3QiKTsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJX2xlYXZlKCIgW25vIGNhbGxdIik7CisJcmV0dXJuOworCitiYWRfbWVzc2FnZToKKwlza2ItPnByaW9yaXR5ID0gUlhfUFJPVE9DT0xfRVJST1I7CisJcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKKwlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCV9sZWF2ZSgiIFtiYWRtc2ddIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItaW50ZXJuYWwuaCBiL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaApAQCAtMCwwICsxLDgwOCBAQAorLyogQUZfUlhSUEMgaW50ZXJuYWwgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgorCisjaWYgMAorI2RlZmluZSBDSEVDS19TTEFCX09LQVkoWCkJCQkJICAgICBcCisJQlVHX09OKGF0b21pY19yZWFkKChYKSkgPj4gKHNpemVvZihhdG9taWNfdCkgLSAyKSA9PSBcCisJICAgICAgIChQT0lTT05fRlJFRSA8PCA4IHwgUE9JU09OX0ZSRUUpKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfU0xBQl9PS0FZKFgpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBGQ1JZUFRfQlNJWkUgOAorc3RydWN0IHJ4cnBjX2NyeXB0IHsKKwl1bmlvbiB7CisJCXU4CXhbRkNSWVBUX0JTSVpFXTsKKwkJdTMyCW5bMl07CisJfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisjZGVmaW5lIHJ4cnBjX3F1ZXVlX3dvcmsoV1MpCXF1ZXVlX3dvcmsocnhycGNfd29ya3F1ZXVlLCAoV1MpKQorI2RlZmluZSByeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoV1MsRCkJXAorCXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsIChXUyksIChEKSkKKworI2RlZmluZSByeHJwY19xdWV1ZV9jYWxsKENBTEwpCXJ4cnBjX3F1ZXVlX3dvcmsoJihDQUxMKS0+cHJvY2Vzc29yKQorI2RlZmluZSByeHJwY19xdWV1ZV9jb25uKENPTk4pCXJ4cnBjX3F1ZXVlX3dvcmsoJihDT05OKS0+cHJvY2Vzc29yKQorCisvKgorICogc2tfc3RhdGUgZm9yIFJ4UlBDIHNvY2tldHMKKyAqLworZW51bSB7CisJUlhSUENfVU5DT05ORUNURUQgPSAwLAorCVJYUlBDX0NMSUVOVF9CT1VORCwJCS8qIGNsaWVudCBsb2NhbCBhZGRyZXNzIGJvdW5kICovCisJUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCwJCS8qIGNsaWVudCBpcyBjb25uZWN0ZWQgKi8KKwlSWFJQQ19TRVJWRVJfQk9VTkQsCQkvKiBzZXJ2ZXIgbG9jYWwgYWRkcmVzcyBib3VuZCAqLworCVJYUlBDX1NFUlZFUl9MSVNURU5JTkcsCQkvKiBzZXJ2ZXIgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyAqLworCVJYUlBDX0NMT1NFLAkJCS8qIHNvY2tldCBpcyBiZWluZyBjbG9zZWQgKi8KK307CisKKy8qCisgKiBSeFJQQyBzb2NrZXQgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgcnhycGNfc29jayB7CisJLyogV0FSTklORzogc2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KKwlzdHJ1Y3Qgc29jawkJc2s7CisJcnhycGNfaW50ZXJjZXB0b3JfdAlpbnRlcmNlcHRvcjsJLyoga2VybmVsIHNlcnZpY2UgUnggaW50ZXJjZXB0b3IgZnVuY3Rpb24gKi8KKwlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogbG9jYWwgZW5kcG9pbnQgKi8KKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIHRyYW5zcG9ydCBoYW5kbGVyICovCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CS8qIHZpcnR1YWwgY29ubmVjdGlvbiBidW5kbGUgKi8KKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubjsJCS8qIGV4Y2x1c2l2ZSB2aXJ0dWFsIGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Rlbl9saW5rOwkvKiBsaW5rIGluIHRoZSBsb2NhbCBlbmRwb2ludCdzIGxpc3RlbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlzZWN1cmVxOwkvKiBjYWxscyBhd2FpdGluZyBjb25uZWN0aW9uIHNlY3VyaXR5IGNsZWFyYW5jZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYWNjZXB0cTsJLyogY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBzb2NrZXQgKi8KKwlzdHJ1Y3Qga2V5CQkqc2VjdXJpdGllczsJLyogbGlzdCBvZiBzZXJ2ZXIgc2VjdXJpdHkgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2FsbHM7CQkvKiBvdXRzdGFuZGluZyBjYWxscyBvbiB0aGlzIHNvY2tldCAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworI2RlZmluZSBSWFJQQ19TT0NLX0VYQ0xVU0lWRV9DT05OCTEJLyogZXhjbHVzaXZlIGNvbm5lY3Rpb24gZm9yIGEgY2xpZW50IHNvY2tldCAqLworCXJ3bG9ja190CQljYWxsX2xvY2s7CS8qIGxvY2sgZm9yIGNhbGxzICovCisJdTMyCQkJbWluX3NlY19sZXZlbDsJLyogbWluaW11bSBzZWN1cml0eSBsZXZlbCAqLworI2RlZmluZSBSWFJQQ19TRUNVUklUWV9NQVgJUlhSUENfU0VDVVJJVFlfRU5DUllQVAorCXN0cnVjdCBzb2NrYWRkcl9yeHJwYwlzcng7CQkvKiBsb2NhbCBhZGRyZXNzICovCisJc2FfZmFtaWx5X3QJCXByb3RvOwkJLyogcHJvdG9jb2wgY3JlYXRlZCB3aXRoICovCisJX19iZTE2CQkJc2VydmljZV9pZDsJLyogc2VydmljZSBJRCBvZiBsb2NhbC9yZW1vdGUgc2VydmljZSAqLworfTsKKworI2RlZmluZSByeHJwY19zayhfX3NrKSBjb250YWluZXJfb2YoKF9fc2spLCBzdHJ1Y3QgcnhycGNfc29jaywgc2spCisKKy8qCisgKiBSeFJQQyBzb2NrZXQgYnVmZmVyIHByaXZhdGUgdmFyaWFibGVzCisgKiAtIG1heCA0OCBieXRlcyAoc3RydWN0IHNrX2J1ZmY6OmNiKQorICovCitzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgeworCXN0cnVjdCByeHJwY19jYWxsCSpjYWxsOwkJLyogY2FsbCB3aXRoIHdoaWNoIGFzc29jaWF0ZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZXNlbmRfYXQ7CS8qIHRpbWUgaW4gamlmZmllcyBhdCB3aGljaCB0byByZXNlbmQgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIGJ1ZmZlciBvZiBuZXh0IHJlYWQgKi8KKwkJaW50CQlyZW1haW47CQkvKiBhbW91bnQgb2Ygc3BhY2UgcmVtYWluaW5nIGZvciBuZXh0IHdyaXRlICovCisJCXUzMgkJZXJyb3I7CQkvKiBuZXR3b3JrIGVycm9yIGNvZGUgKi8KKwkJYm9vbAkJbmVlZF9yZXNlbmQ7CS8qIFQgaWYgbmVlZHMgcmVzZW5kaW5nICovCisJfTsKKworCXN0cnVjdCByeHJwY19oZWFkZXIJaGRyOwkJLyogUnhSUEMgcGFja2V0IGhlYWRlciBmcm9tIHRoaXMgcGFja2V0ICovCit9OworCisjZGVmaW5lIHJ4cnBjX3NrYihfX3NrYikgKChzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKikgJihfX3NrYiktPmNiKQorCitlbnVtIHJ4cnBjX2NvbW1hbmQgeworCVJYUlBDX0NNRF9TRU5EX0RBVEEsCQkvKiBzZW5kIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX0NNRF9TRU5EX0FCT1JULAkJLyogcmVxdWVzdCBhYm9ydCBnZW5lcmF0aW9uICovCisJUlhSUENfQ01EX0FDQ0VQVCwJCS8qIFtzZXJ2ZXJdIGFjY2VwdCBpbmNvbWluZyBjYWxsICovCisJUlhSUENfQ01EX1JFSkVDVF9CVVNZLAkJLyogW3NlcnZlcl0gcmVqZWN0IGEgY2FsbCBhcyBidXN5ICovCit9OworCisvKgorICogUnhSUEMgc2VjdXJpdHkgbW9kdWxlIGludGVyZmFjZQorICovCitzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgeworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsJCS8qIHByb3ZpZGluZyBtb2R1bGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIG1hc3RlciBsaXN0ICovCisJY29uc3QgY2hhcgkJKm5hbWU7CQkvKiBuYW1lIG9mIHRoaXMgc2VydmljZSAqLworCXU4CQkJc2VjdXJpdHlfaW5kZXg7CS8qIHNlY3VyaXR5IHR5cGUgcHJvdmlkZWQgKi8KKworCS8qIGluaXRpYWxpc2UgYSBjb25uZWN0aW9uJ3Mgc2VjdXJpdHkgKi8KKwlpbnQgKCppbml0X2Nvbm5lY3Rpb25fc2VjdXJpdHkpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworCisJLyogcHJpbWUgYSBjb25uZWN0aW9uJ3MgcGFja2V0IHNlY3VyaXR5ICovCisJdm9pZCAoKnByaW1lX3BhY2tldF9zZWN1cml0eSkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CisKKwkvKiBpbXBvc2Ugc2VjdXJpdHkgb24gYSBwYWNrZXQgKi8KKwlpbnQgKCpzZWN1cmVfcGFja2V0KShjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICBzaXplX3QsCisJCQkgICAgIHZvaWQgKik7CisKKwkvKiB2ZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0ICovCisJaW50ICgqdmVyaWZ5X3BhY2tldCkoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICAgdTMyICopOworCisJLyogaXNzdWUgYSBjaGFsbGVuZ2UgKi8KKwlpbnQgKCppc3N1ZV9jaGFsbGVuZ2UpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworCisJLyogcmVzcG9uZCB0byBhIGNoYWxsZW5nZSAqLworCWludCAoKnJlc3BvbmRfdG9fY2hhbGxlbmdlKShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJCSAgICB1MzIgKik7CisKKwkvKiB2ZXJpZnkgYSByZXNwb25zZSAqLworCWludCAoKnZlcmlmeV9yZXNwb25zZSkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICAgIHUzMiAqKTsKKworCS8qIGNsZWFyIGNvbm5lY3Rpb24gc2VjdXJpdHkgKi8KKwl2b2lkICgqY2xlYXIpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworfTsKKworLyoKKyAqIFJ4UlBDIGxvY2FsIHRyYW5zcG9ydCBlbmRwb2ludCBkZWZpbml0aW9uCisgKiAtIG1hdGNoZWQgYnkgbG9jYWwgcG9ydCwgYWRkcmVzcyBhbmQgcHJvdG9jb2wgdHlwZQorICovCitzdHJ1Y3QgcnhycGNfbG9jYWwgeworCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGVzdHJveWVyOwkvKiBlbmRwb2ludCBkZXN0cm95ZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJYWNjZXB0b3I7CS8qIGluY29taW5nIGNhbGwgcHJvY2Vzc29yICovCisJc3RydWN0IHdvcmtfc3RydWN0CXJlamVjdGVyOwkvKiBwYWNrZXQgcmVqZWN0IHdyaXRlciAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2VydmljZXM7CS8qIHNlcnZpY2VzIGxpc3RlbmluZyBvbiB0aGlzIGVuZHBvaW50ICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBlbmRwb2ludCBsaXN0ICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZQlkZWZyYWdfc2VtOwkvKiBjb250cm9sIHJlLWVuYWJsZW1lbnQgb2YgSVAgREYgYml0ICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlhY2NlcHRfcXVldWU7CS8qIGluY29taW5nIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJlamVjdF9xdWV1ZTsJLyogcGFja2V0cyBhd2FpdGluZyByZWplY3Rpb24gKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlyd2xvY2tfdAkJc2VydmljZXNfbG9jazsJLyogbG9jayBmb3Igc2VydmljZXMgbGlzdCAqLworCWF0b21pY190CQl1c2FnZTsKKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl2b2xhdGlsZSBjaGFyCQllcnJvcl9yY3ZkOwkvKiBUIGlmIHJlY2VpdmVkIElDTVAgZXJyb3Igb3V0c3RhbmRpbmcgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMJc3J4OwkJLyogbG9jYWwgYWRkcmVzcyAqLworfTsKKworLyoKKyAqIFJ4UlBDIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgZGVmaW5pdGlvbgorICogLSBtYXRjaGVkIGJ5IHJlbW90ZSBwb3J0LCBhZGRyZXNzIGFuZCBwcm90b2NvbCB0eXBlCisgKiAtIGhvbGRzIHRoZSBjb25uZWN0aW9uIElEIGNvdW50ZXIgZm9yIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgeworCXN0cnVjdCB3b3JrX3N0cnVjdAlkZXN0cm95ZXI7CS8qIHBlZXIgZGVzdHJveWVyICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgcGVlciBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAllcnJvcl90YXJnZXRzOwkvKiB0YXJnZXRzIGZvciBuZXQgZXJyb3IgZGlzdHJpYnV0aW9uICovCisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJYXRvbWljX3QJCXVzYWdlOworCXVuc2lnbmVkCQlpZl9tdHU7CQkvKiBpbnRlcmZhY2UgTVRVIGZvciB0aGlzIHBlZXIgKi8KKwl1bnNpZ25lZAkJbXR1OwkJLyogbmV0d29yayBNVFUgZm9yIHRoaXMgcGVlciAqLworCXVuc2lnbmVkCQltYXhkYXRhOwkvKiBkYXRhIHNpemUgKE1UVSAtIGhkcnNpemUpICovCisJdW5zaWduZWQgc2hvcnQJCWhkcnNpemU7CS8qIGhlYWRlciBzaXplIChJUCArIFVEUCArIFJ4UlBDKSAqLworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCWludAkJCW5ldF9lcnJvcjsJLyogbmV0d29yayBlcnJvciBkaXN0cmlidXRlZCAqLworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYwlzcng7CQkvKiByZW1vdGUgYWRkcmVzcyAqLworCisJLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KKyNkZWZpbmUgUlhSUENfUlRUX0NBQ0hFX1NJWkUgMzIKKwlzdXNlY29uZHNfdAkJcnR0OwkJLyogY3VycmVudCBSVFQgZXN0aW1hdGUgKGluIHVTKSAqLworCXVuc2lnbmVkCQlydHRfcG9pbnQ7CS8qIG5leHQgZW50cnkgYXQgd2hpY2ggdG8gaW5zZXJ0ICovCisJdW5zaWduZWQJCXJ0dF91c2FnZTsJLyogYW1vdW50IG9mIGNhY2hlIGFjdHVhbGx5IHVzZWQgKi8KKwlzdXNlY29uZHNfdAkJcnR0X2NhY2hlW1JYUlBDX1JUVF9DQUNIRV9TSVpFXTsgLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KK307CisKKy8qCisgKiBSeFJQQyBwb2ludC10by1wb2ludCB0cmFuc3BvcnQgLyBjb25uZWN0aW9uIG1hbmFnZXIgZGVmaW5pdGlvbgorICogLSBoYW5kbGVzIGEgYnVuZGxlIG9mIGNvbm5lY3Rpb25zIGJldHdlZW4gdHdvIGVuZHBvaW50cworICogLSBtYXRjaGVkIGJ5IHsgbG9jYWwsIHBlZXIgfQorICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0IHsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogbG9jYWwgdHJhbnNwb3J0IGVuZHBvaW50ICovCisJc3RydWN0IHJ4cnBjX3BlZXIJKnBlZXI7CQkvKiByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50ICovCisJc3RydWN0IHdvcmtfc3RydWN0CWVycm9yX2hhbmRsZXI7CS8qIG5ldHdvcmsgZXJyb3IgZGlzdHJpYnV0b3IgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJYnVuZGxlczsJLyogY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlcyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCByYl9yb290CQljbGllbnRfY29ubnM7CS8qIGNsaWVudCBjb25uZWN0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCByYl9yb290CQlzZXJ2ZXJfY29ubnM7CS8qIHNlcnZlciBjb25uZWN0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gbWFzdGVyIHNlc3Npb24gbGlzdCAqLworCXN0cnVjdCBza19idWZmX2hlYWQJZXJyb3JfcXVldWU7CS8qIGVycm9yIHBhY2tldHMgYXdhaXRpbmcgcHJvY2Vzc2luZyAqLworCXRpbWVfdAkJCXB1dF90aW1lOwkvKiB0aW1lIGF0IHdoaWNoIHRvIHJlYXAgKi8KKwlzcGlubG9ja190CQljbGllbnRfbG9jazsJLyogY2xpZW50IGNvbm5lY3Rpb24gYWxsb2NhdGlvbiBsb2NrICovCisJcndsb2NrX3QJCWNvbm5fbG9jazsJLyogbG9jayBmb3IgYWN0aXZlL2RlYWQgY29ubmVjdGlvbnMgKi8KKwlhdG9taWNfdAkJdXNhZ2U7CisJaW50CQkJZGVidWdfaWQ7CS8qIGRlYnVnIElEIGZvciBwcmludGtzICovCisJdW5zaWduZWQgaW50CQljb25uX2lkY291bnRlcjsJLyogY29ubmVjdGlvbiBJRCBjb3VudGVyIChjbGllbnQpICovCit9OworCisvKgorICogUnhSUEMgY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlCisgKiAtIG1hdGNoZWQgYnkgeyB0cmFuc3BvcnQsIHNlcnZpY2VfaWQsIGtleSB9CisgKi8KK3N0cnVjdCByeHJwY19jb25uX2J1bmRsZSB7CisJc3RydWN0IHJiX25vZGUJCW5vZGU7CQkvKiBub2RlIGluIHRyYW5zcG9ydCdzIGxvb2t1cCB0cmVlICovCisJc3RydWN0IGxpc3RfaGVhZAl1bnVzZWRfY29ubnM7CS8qIHVudXNlZCBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYXZhaWxfY29ubnM7CS8qIGF2YWlsYWJsZSBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYnVzeV9jb25uczsJLyogYnVzeSBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBidW5kbGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAljaGFud2FpdDsJLyogd2FpdCBmb3IgY2hhbm5lbCB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJYXRvbWljX3QJCXVzYWdlOworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCXVuc2lnbmVkIHNob3J0CQludW1fY29ubnM7CS8qIG51bWJlciBvZiBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCV9fYmUxNgkJCXNlcnZpY2VfaWQ7CS8qIHNlcnZpY2UgSUQgKi8KKwl1aW50OF90CQkJc2VjdXJpdHlfaXg7CS8qIHNlY3VyaXR5IHR5cGUgKi8KK307CisKKy8qCisgKiBSeFJQQyBjb25uZWN0aW9uIGRlZmluaXRpb24KKyAqIC0gbWF0Y2hlZCBieSB7IHRyYW5zcG9ydCwgc2VydmljZV9pZCwgY29ubl9pZCwgZGlyZWN0aW9uLCBrZXkgfQorICogLSBlYWNoIGNvbm5lY3Rpb24gY2FuIG9ubHkgaGFuZGxlIGZvdXIgc2ltdWx0YW5lb3VzIGNhbGxzCisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIHRyYW5zcG9ydCBzZXNzaW9uICovCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CS8qIGNvbm5lY3Rpb24gYnVuZGxlIChjbGllbnQpICovCisJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogY29ubmVjdGlvbiBldmVudCBwcm9jZXNzb3IgKi8KKwlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsJCS8qIG5vZGUgaW4gdHJhbnNwb3J0J3MgbG9va3VwIHRyZWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIG1hc3RlciBjb25uZWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ1bmRsZV9saW5rOwkvKiBsaW5rIGluIGJ1bmRsZSAqLworCXN0cnVjdCByYl9yb290CQljYWxsczsJCS8qIGNhbGxzIG9uIHRoaXMgY29ubmVjdGlvbiAqLworCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIGNvbm4tbGV2ZWwgcGFja2V0cyAqLworCXN0cnVjdCByeHJwY19jYWxsCSpjaGFubmVsc1tSWFJQQ19NQVhDQUxMU107IC8qIGNoYW5uZWxzIChhY3RpdmUgY2FsbHMpICovCisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5CSpzZWN1cml0eTsJLyogYXBwbGllZCBzZWN1cml0eSBtb2R1bGUgKi8KKwlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogc2VjdXJpdHkgZm9yIHRoaXMgY29ubmVjdGlvbiAoY2xpZW50KSAqLworCXN0cnVjdCBrZXkJCSpzZXJ2ZXJfa2V5OwkvKiBzZWN1cml0eSBmb3IgdGhpcyBzZXJ2aWNlICovCisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIJKmNpcGhlcjsJLyogZW5jcnlwdGlvbiBoYW5kbGUgKi8KKwlzdHJ1Y3QgcnhycGNfY3J5cHQJY3N1bV9pdjsJLyogcGFja2V0IGNoZWNrc3VtIGJhc2UgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudHM7CisjZGVmaW5lIFJYUlBDX0NPTk5fQ0hBTExFTkdFCTAJCS8qIHNlbmQgY2hhbGxlbmdlIHBhY2tldCAqLworCXRpbWVfdAkJCXB1dF90aW1lOwkvKiB0aW1lIGF0IHdoaWNoIHRvIHJlYXAgKi8KKwlyd2xvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJc3BpbmxvY2tfdAkJc3RhdGVfbG9jazsJLyogc3RhdGUtY2hhbmdlIGxvY2sgKi8KKwlhdG9taWNfdAkJdXNhZ2U7CisJdTMyCQkJcmVhbF9jb25uX2lkOwkvKiBjb25uZWN0aW9uIElEIChob3N0LWVuZGlhbikgKi8KKwllbnVtIHsJCQkJCS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLworCQlSWFJQQ19DT05OX1VOVVNFRCwJCS8qIC0gY29ubmVjdGlvbiBub3QgeWV0IGF0dGVtcHRlZCAqLworCQlSWFJQQ19DT05OX0NMSUVOVCwJCS8qIC0gY2xpZW50IGNvbm5lY3Rpb24gKi8KKwkJUlhSUENfQ09OTl9TRVJWRVJfVU5TRUNVUkVELAkvKiAtIHNlcnZlciB1bnNlY3VyZWQgY29ubmVjdGlvbiAqLworCQlSWFJQQ19DT05OX1NFUlZFUl9DSEFMTEVOR0lORywJLyogLSBzZXJ2ZXIgY2hhbGxlbmdpbmcgZm9yIHNlY3VyaXR5ICovCisJCVJYUlBDX0NPTk5fU0VSVkVSLAkJLyogLSBzZXJ2ZXIgc2VjdXJlZCBjb25uZWN0aW9uICovCisJCVJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCwJLyogLSBjb25uIGFib3J0ZWQgYnkgcGVlciAqLworCQlSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRCwJLyogLSBjb25uIGFib3J0ZWQgbG9jYWxseSAqLworCQlSWFJQQ19DT05OX05FVFdPUktfRVJST1IsCS8qIC0gY29ubiB0ZXJtaW5hdGVkIGJ5IG5ldHdvcmsgZXJyb3IgKi8KKwl9IHN0YXRlOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgY29kZSBmb3IgbG9jYWwgYWJvcnQgKi8KKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl1bnNpZ25lZAkJY2FsbF9jb3VudGVyOwkvKiBjYWxsIElEIGNvdW50ZXIgKi8KKwlhdG9taWNfdAkJc2VyaWFsOwkJLyogcGFja2V0IHNlcmlhbCBudW1iZXIgY291bnRlciAqLworCWF0b21pY190CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLworCXU4CQkJYXZhaWxfY2FsbHM7CS8qIG51bWJlciBvZiBjYWxscyBhdmFpbGFibGUgKi8KKwl1OAkJCXNpemVfYWxpZ247CS8qIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKGZvciBzZWN1cml0eSkgKi8KKwl1OAkJCWhlYWRlcl9zaXplOwkvKiByeHJwYyArIHNlY3VyaXR5IGhlYWRlciBzaXplICovCisJdTgJCQlzZWN1cml0eV9zaXplOwkvKiBzZWN1cml0eSBoZWFkZXIgc2l6ZSAqLworCXUzMgkJCXNlY3VyaXR5X2xldmVsOwkvKiBzZWN1cml0eSBsZXZlbCBuZWdvdGlhdGVkICovCisJdTMyCQkJc2VjdXJpdHlfbm9uY2U7CS8qIHJlc3BvbnNlIHJlLXVzZSBwcmV2ZW50ZXIgKi8KKworCS8qIHRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbiBuZXQgb3JkZXIgKi8KKwlfX2JlMzIJCQllcG9jaDsJCS8qIGVwb2NoIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCV9fYmUzMgkJCWNpZDsJCS8qIGNvbm5lY3Rpb24gSUQgKi8KKwlfX2JlMTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCisJdTgJCQlzZWN1cml0eV9peDsJLyogc2VjdXJpdHkgdHlwZSAqLworCXU4CQkJaW5fY2xpZW50ZmxhZzsJLyogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBpZiB3ZSBhcmUgc2VydmVyICovCisJdTgJCQlvdXRfY2xpZW50ZmxhZzsJLyogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBpZiB3ZSBhcmUgY2xpZW50ICovCit9OworCisvKgorICogUnhSUEMgY2FsbCBkZWZpbml0aW9uCisgKiAtIG1hdGNoZWQgYnkgeyBjb25uZWN0aW9uLCBjYWxsX2lkIH0KKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgeworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiBjYXJyeWluZyBjYWxsICovCisJc3RydWN0IHJ4cnBjX3NvY2sJKnNvY2tldDsJLyogc29ja2V0IHJlc3BvbnNpYmxlICovCisJc3RydWN0IHRpbWVyX2xpc3QJbGlmZXRpbWVyOwkvKiBsaWZldGltZSByZW1haW5pbmcgb24gY2FsbCAqLworCXN0cnVjdCB0aW1lcl9saXN0CWRlYWRzcGFuOwkvKiByZWFwIHRpbWVyIGZvciByZS1BQ0snaW5nLCBldGMgICovCisJc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwkvKiBBQ0sgZ2VuZXJhdGlvbiB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0CXJlc2VuZF90aW1lcjsJLyogVHggcmVzZW5kIHRpbWVyICovCisJc3RydWN0IHdvcmtfc3RydWN0CWRlc3Ryb3llcjsJLyogY2FsbCBkZXN0cm95ZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBwYWNrZXQgcHJvY2Vzc29yIGFuZCBBQ0sgZ2VuZXJhdG9yICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgY2FsbCBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAllcnJvcl9saW5rOwkvKiBsaW5rIGluIGVycm9yIGRpc3RyaWJ1dGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRfbGluazsJLyogY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLworCXN0cnVjdCByYl9ub2RlCQlzb2NrX25vZGU7CS8qIG5vZGUgaW4gc29ja2V0IGNhbGwgdHJlZSAqLworCXN0cnVjdCByYl9ub2RlCQljb25uX25vZGU7CS8qIG5vZGUgaW4gY29ubmVjdGlvbiBjYWxsIHRyZWUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJ4X3F1ZXVlOwkvKiByZWNlaXZlZCBwYWNrZXRzICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9vb3NfcXVldWU7CS8qIHBhY2tldHMgcmVjZWl2ZWQgb3V0IG9mIHNlcXVlbmNlICovCisJc3RydWN0IHNrX2J1ZmYJCSp0eF9wZW5kaW5nOwkvKiBUeCBzb2NrZXQgYnVmZmVyIGJlaW5nIGZpbGxlZCAqLworCXdhaXRfcXVldWVfaGVhZF90CXR4X3dhaXRxOwkvKiB3YWl0IGZvciBUeCB3aW5kb3cgc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkIGxvbmcJCXVzZXJfY2FsbF9JRDsJLyogdXNlci1kZWZpbmVkIGNhbGwgSUQgKi8KKwl1bnNpZ25lZCBsb25nCQljcmVhdGlvbl9qaWY7CS8qIHRpbWUgb2YgY2FsbCBjcmVhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworI2RlZmluZSBSWFJQQ19DQUxMX1JFTEVBU0VECTAJLyogY2FsbCBoYXMgYmVlbiByZWxlYXNlZCAtIG5vIG1vcmUgbWVzc2FnZSB0byB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9URVJNSU5BTF9NU0cJMQkvKiBjYWxsIGhhcyBnaXZlbiB0aGUgc29ja2V0IGl0cyBmaW5hbCBtZXNzYWdlICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkNWRF9MQVNUCTIJLyogYWxsIHBhY2tldHMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9SVU5fUlRJTUVSCTMJLyogVHggcmVzZW5kIHRpbWVyIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSwk0CS8qIHNlbnQgc29tZSBzb2Z0IEFDS3MgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9QUk9DX0JVU1kJNQkvKiB0aGUgcHJvY2Vzc29yIGlzIGJ1c3kgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9JTklUX0FDQ0VQVAk2CS8qIGFjY2VwdGFuY2Ugd2FzIGluaXRpYXRlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0hBU19VU0VSSUQJNwkvKiBoYXMgYSB1c2VyIElEIGF0dGFjaGVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfRVhQRUNUX09PUwk4CS8qIGV4cGVjdCBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcJCWV2ZW50czsKKyNkZWZpbmUgUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTAkwCS8qIEFDS0FMTCBvciByZXBseSByZWNlaXZlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JDVkRfQlVTWQkxCS8qIGJ1c3kgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkNWRF9BQk9SVAkyCS8qIGFib3J0IHBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JDVkRfRVJST1IJMwkvKiBuZXR3b3JrIGVycm9yIHJlY2VpdmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfQUNLX0ZJTkFMCTQJLyogbmVlZCB0byBnZW5lcmF0ZSBmaW5hbCBBQ0sgKGFuZCByZWxlYXNlIGNhbGwpICovCisjZGVmaW5lIFJYUlBDX0NBTExfQUNLCQk1CS8qIG5lZWQgdG8gZ2VuZXJhdGUgQUNLICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkVKRUNUX0JVU1kJNgkvKiBuZWVkIHRvIGdlbmVyYXRlIGJ1c3kgbWVzc2FnZSAqLworI2RlZmluZSBSWFJQQ19DQUxMX0FCT1JUCTcJLyogbmVlZCB0byBnZW5lcmF0ZSBhYm9ydCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0NPTk5fQUJPUlQJOAkvKiBsb2NhbCBjb25uZWN0aW9uIGFib3J0IGdlbmVyYXRlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JFU0VORF9USU1FUgk5CS8qIFR4IHJlc2VuZCB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkVTRU5ECTEwCS8qIFR4IHJlc2VuZCByZXF1aXJlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0RSQUlOX1JYX09PUwkxMQkvKiBkcmFpbiB0aGUgUnggb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCisjZGVmaW5lIFJYUlBDX0NBTExfTElGRV9USU1FUgkxMgkvKiBjYWxsJ3MgbGlmZXRpbWVyIHJhbiBvdXQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9BQ0NFUFRFRAkxMwkvKiBpbmNvbWluZyBjYWxsIGFjY2VwdGVkIGJ5IHVzZXJzcGFjZSBhcHAgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9TRUNVUkVECTE0CS8qIGluY29taW5nIGNhbGwncyBjb25uZWN0aW9uIGlzIG5vdyBzZWN1cmUgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9QT1NUX0FDQ0VQVAkxNQkvKiBuZWVkIHRvIHBvc3QgYW4gImFjY2VwdD8iIG1lc3NhZ2UgdG8gdGhlIGFwcCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JFTEVBU0UJMTYJLyogbmVlZCB0byByZWxlYXNlIHRoZSBjYWxsJ3MgcmVzb3VyY2VzICovCisKKwlzcGlubG9ja190CQlsb2NrOworCXJ3bG9ja190CQlzdGF0ZV9sb2NrOwkvKiBsb2NrIGZvciBzdGF0ZSB0cmFuc2l0aW9uICovCisJYXRvbWljX3QJCXVzYWdlOworCWF0b21pY190CQlzZXF1ZW5jZTsJLyogVHggZGF0YSBwYWNrZXQgc2VxdWVuY2UgY291bnRlciAqLworCXUzMgkJCWFib3J0X2NvZGU7CS8qIGxvY2FsL3JlbW90ZSBhYm9ydCBjb2RlICovCisJZW51bSB7CQkJCQkvKiBjdXJyZW50IHN0YXRlIG9mIGNhbGwgKi8KKwkJUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNULAkvKiAtIGNsaWVudCBzZW5kaW5nIHJlcXVlc3QgcGhhc2UgKi8KKwkJUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFksCS8qIC0gY2xpZW50IGF3YWl0aW5nIHJlcGx5ICovCisJCVJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFksCS8qIC0gY2xpZW50IHJlY2VpdmluZyByZXBseSBwaGFzZSAqLworCQlSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0ssCS8qIC0gY2xpZW50IHNlbmRpbmcgZmluYWwgQUNLIHBoYXNlICovCisJCVJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HLAkvKiAtIHNlcnZlciBzZWN1cmluZyByZXF1ZXN0IGNvbm5lY3Rpb24gKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HLAkvKiAtIHNlcnZlciBhY2NlcHRpbmcgcmVxdWVzdCAqLworCQlSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1QsCS8qIC0gc2VydmVyIHJlY2VpdmluZyByZXF1ZXN0ICovCisJCVJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNULAkvKiAtIHNlcnZlciBwZW5kaW5nIEFDSyBvZiByZXF1ZXN0ICovCisJCVJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFksCS8qIC0gc2VydmVyIHNlbmRpbmcgcmVwbHkgKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLLAkvKiAtIHNlcnZlciBhd2FpdGluZyBmaW5hbCBBQ0sgKi8KKwkJUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZWQgKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQlVTWSwJCS8qIC0gY2FsbCByZWplY3RlZCBieSBidXN5IHNlcnZlciAqLworCQlSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQsCS8qIC0gY2FsbCBhYm9ydGVkIGJ5IHBlZXIgKi8KKwkJUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQsCS8qIC0gY2FsbCBhYm9ydGVkIGxvY2FsbHkgb24gZXJyb3Igb3IgY2xvc2UgKi8KKwkJUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SLAkvKiAtIGNhbGwgdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCisJCVJYUlBDX0NBTExfREVBRCwJCS8qIC0gY2FsbCBpcyBkZWFkICovCisJfSBzdGF0ZTsKKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl1OAkJCWNoYW5uZWw7CS8qIGNvbm5lY3Rpb24gY2hhbm5lbCBvY2N1cGllZCBieSB0aGlzIGNhbGwgKi8KKworCS8qIHRyYW5zbWlzc2lvbi1waGFzZSBBQ0sgbWFuYWdlbWVudCAqLworCXVpbnQ4X3QJCQlhY2tzX2hlYWQ7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBmaXJzdCBlbnRyeSAqLworCXVpbnQ4X3QJCQlhY2tzX3RhaWw7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBsYXN0IGVudHJ5ICovCisJdWludDhfdAkJCWFja3Nfd2luc3o7CS8qIHNpemUgb2YgdW4tQUNLJ2Qgd2luZG93ICovCisJdWludDhfdAkJCWFja3NfdW5hY2tlZDsJLyogbG93ZXN0IHVuYWNrZWQgcGFja2V0IGluIGxhc3QgQUNLIHJlY2VpdmVkICovCisJaW50CQkJYWNrc19sYXRlc3Q7CS8qIHNlcmlhbCBudW1iZXIgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLworCXJ4cnBjX3NlcV90CQlhY2tzX2hhcmQ7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KKwl1bnNpZ25lZCBsb25nCQkqYWNrc193aW5kb3c7CS8qIHNlbnQgcGFja2V0IHdpbmRvdworCQkJCQkJICogLSBlbGVtZW50cyBhcmUgcG9pbnRlcnMgd2l0aCBMU0Igc2V0IGlmIEFDSydkCisJCQkJCQkgKi8KKworCS8qIHJlY2VpdmUtcGhhc2UgQUNLIG1hbmFnZW1lbnQgKi8KKwlyeHJwY19zZXFfdAkJcnhfZGF0YV9leHBlY3Q7CS8qIG5leHQgZGF0YSBzZXEgSUQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgKi8KKwlyeHJwY19zZXFfdAkJcnhfZGF0YV9wb3N0OwkvKiBuZXh0IGRhdGEgc2VxIElEIGV4cGVjdGVkIHRvIGJlIHBvc3RlZCAqLworCXJ4cnBjX3NlcV90CQlyeF9kYXRhX3JlY3Y7CS8qIGxhc3QgZGF0YSBzZXEgSUQgZW5jb3VudGVyZWQgYnkgcmVjdm1zZyAqLworCXJ4cnBjX3NlcV90CQlyeF9kYXRhX2VhdGVuOwkvKiBsYXN0IGRhdGEgc2VxIElEIGNvbnN1bWVkIGJ5IHJlY3Ztc2cgKi8KKwlyeHJwY19zZXFfdAkJcnhfZmlyc3Rfb29zOwkvKiBmaXJzdCBwYWNrZXQgaW4gcnhfb29zX3F1ZXVlIChvciAwKSAqLworCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93IChyeF9kYXRhX2VhdGVuIGlzIGJvdHRvbSkgKi8KKwlyeHJwY19zZXFfbmV0X3QJCWFja3JfcHJldl9zZXE7CS8qIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLworCXVpbnQ4X3QJCQlhY2tyX3JlYXNvbjsJLyogcmVhc29uIHRvIEFDSyAqLworCV9fYmUzMgkJCWFja3Jfc2VyaWFsOwkvKiBzZXJpYWwgb2YgcGFja2V0IGJlaW5nIEFDSydkICovCisJYXRvbWljX3QJCWFja3Jfbm90X2lkbGU7CS8qIG51bWJlciBvZiBwYWNrZXRzIGluIFJ4IHF1ZXVlICovCisKKwkvKiByZWNlaXZlZCBwYWNrZXQgcmVjb3JkcywgMSBiaXQgcGVyIHJlY29yZCAqLworI2RlZmluZSBSWFJQQ19BQ0tSX1dJTkRPV19BU1ogRElWX1JPVU5EX1VQKFJYUlBDX01BWEFDS1MsIEJJVFNfUEVSX0xPTkcpCisJdW5zaWduZWQgbG9uZwkJYWNrcl93aW5kb3dbUlhSUENfQUNLUl9XSU5ET1dfQVNaICsgMV07CisKKwkvKiB0aGUgZm9sbG93aW5nIHNob3VsZCBhbGwgYmUgaW4gbmV0IG9yZGVyICovCisJX19iZTMyCQkJY2lkOwkJLyogY29ubmVjdGlvbiBJRCArIGNoYW5uZWwgaW5kZXggICovCisJX19iZTMyCQkJY2FsbF9pZDsJLyogY2FsbCBJRCBvbiBjb25uZWN0aW9uICAqLworfTsKKworLyoKKyAqIFJ4UlBDIGtleSBmb3IgS2VyYmVyb3MgKHR5cGUtMiBzZWN1cml0eSkKKyAqLworc3RydWN0IHJ4a2FkX2tleSB7CisJdTE2CXNlY3VyaXR5X2luZGV4OwkJLyogUnhSUEMgaGVhZGVyIHNlY3VyaXR5IGluZGV4ICovCisJdTE2CXRpY2tldF9sZW47CQkvKiBsZW5ndGggb2YgdGlja2V0W10gKi8KKwl1MzIJZXhwaXJ5OwkJCS8qIHRpbWUgYXQgd2hpY2ggZXhwaXJlcyAqLworCXUzMglrdm5vOwkJCS8qIGtleSB2ZXJzaW9uIG51bWJlciAqLworCXU4CXNlc3Npb25fa2V5WzhdOwkJLyogREVTIHNlc3Npb24ga2V5ICovCisJdTgJdGlja2V0WzBdOwkJLyogdGhlIGVuY3J5cHRlZCB0aWNrZXQgKi8KK307CisKK3N0cnVjdCByeHJwY19rZXlfcGF5bG9hZCB7CisJc3RydWN0IHJ4a2FkX2tleSBrOworfTsKKworLyoKKyAqIGxvY2FsbHkgYWJvcnQgYW4gUnhSUEMgY2FsbAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfYWJvcnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCit7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGFmX3J4cnBjLmMKKyAqLworZXh0ZXJuIGF0b21pY190IHJ4cnBjX25fc2ticzsKK2V4dGVybiBfX2JlMzIgcnhycGNfZXBvY2g7CitleHRlcm4gYXRvbWljX3QgcnhycGNfZGVidWdfaWQ7CitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJ4cnBjX3dvcmtxdWV1ZTsKKworLyoKKyAqIGFyLWFjY2VwdC5jCisgKi8KK2V4dGVybiB2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2FjY2VwdF9jYWxsKHN0cnVjdCByeHJwY19zb2NrICosCisJCQkJCSAgICB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgcnhycGNfcmVqZWN0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKik7CisKKy8qCisgKiBhci1hY2suYworICovCitleHRlcm4gdm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHVpbnQ4X3QsIF9fYmUzMiwgYm9vbCk7CitleHRlcm4gdm9pZCByeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1aW50OF90LCBfX2JlMzIsIGJvb2wpOworZXh0ZXJuIHZvaWQgcnhycGNfcHJvY2Vzc19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKworLyoKKyAqIGFyLWNhbGwuYworICovCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnJ4cnBjX2NhbGxfamFyOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY2FsbHM7CitleHRlcm4gcndsb2NrX3QgcnhycGNfY2FsbF9sb2NrOworCitleHRlcm4gc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2dldF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLAorCQkJCQkJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICosCisJCQkJCQl1bnNpZ25lZCBsb25nLCBpbnQsIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfaGVhZGVyICosIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfZmluZF9zZXJ2ZXJfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOworZXh0ZXJuIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKik7CitleHRlcm4gdm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOworZXh0ZXJuIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKHZvaWQpOworCisvKgorICogYXItY29ubmVjdGlvbi5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5lY3Rpb25zOworZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2Nvbm5lY3Rpb25fbG9jazsKKworZXh0ZXJuIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqcnhycGNfZ2V0X2J1bmRsZShzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosCisJCQkJCQkgIHN0cnVjdCBrZXkgKiwKKwkJCQkJCSAgX19iZTE2LCBnZnBfdCk7CitleHRlcm4gdm9pZCByeHJwY19wdXRfYnVuZGxlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKiwKKwkJCSAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICopOworZXh0ZXJuIGludCByeHJwY19jb25uZWN0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLAorCQkJICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICAgICBnZnBfdCk7CitleHRlcm4gdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZmluZF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKiwKKwkJCQkJCSAgICAgIHN0cnVjdCByeHJwY19oZWFkZXIgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKgorcnhycGNfaW5jb21pbmdfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCByeHJwY19oZWFkZXIgKiwKKwkJCSAgZ2ZwX3QpOworCisvKgorICogYXItY29ubmV2ZW50LmMKKyAqLworZXh0ZXJuIHZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXQoc3RydWN0IHJ4cnBjX2xvY2FsICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHdvcmtfc3RydWN0ICopOworCisvKgorICogYXItZXJyb3IuYworICovCitleHRlcm4gdm9pZCByeHJwY19VRFBfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICopOworZXh0ZXJuIHZvaWQgcnhycGNfVURQX2Vycm9yX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICopOworCisvKgorICogYXItaW5wdXQuYworICovCitleHRlcm4gdW5zaWduZWQgbG9uZyByeHJwY19hY2tfdGltZW91dDsKK2V4dGVybiBjb25zdCBjaGFyICpyeHJwY19wa3RzW107CisKK2V4dGVybiB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKiwgaW50KTsKK2V4dGVybiBpbnQgcnhycGNfcXVldWVfcmN2X3NrYihzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLAorCQkJICAgICAgIGJvb2wpOworZXh0ZXJuIHZvaWQgcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKworLyoKKyAqIGFyLWxvY2FsLmMKKyAqLworZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2xvY2FsX2xvY2s7CitleHRlcm4gc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19sb29rdXBfbG9jYWwoc3RydWN0IHNvY2thZGRyX3J4cnBjICopOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9sb2NhbHModm9pZCk7CisKKy8qCisgKiBhci1rZXkuYworICovCitleHRlcm4gc3RydWN0IGtleV90eXBlIGtleV90eXBlX3J4cnBjOworZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yeHJwY19zOworCitleHRlcm4gaW50IHJ4cnBjX3JlcXVlc3Rfa2V5KHN0cnVjdCByeHJwY19zb2NrICosIGNoYXIgX191c2VyICosIGludCk7CitleHRlcm4gaW50IHJ4cnBjX3NlcnZlcl9rZXlyaW5nKHN0cnVjdCByeHJwY19zb2NrICosIGNoYXIgX191c2VyICosIGludCk7CitleHRlcm4gaW50IHJ4cnBjX2dldF9zZXJ2ZXJfZGF0YV9rZXkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwgY29uc3Qgdm9pZCAqLAorCQkJCSAgICAgdGltZV90LCB1MzIpOworCisvKgorICogYXItb3V0cHV0LmMKKyAqLworZXh0ZXJuIGludCByeHJwY19yZXNlbmRfdGltZW91dDsKKworZXh0ZXJuIGludCByeHJwY19zZW5kX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCByeHJwY19jbGllbnRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwKKwkJCQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCBtc2doZHIgKiwKKwkJCQlzaXplX3QpOworZXh0ZXJuIGludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwKKwkJCQlzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CisKKy8qCisgKiBhci1wZWVyLmMKKyAqLworZXh0ZXJuIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19nZXRfcGVlcihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2ZpbmRfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKiwKKwkJCQkJICBfX2JlMzIsIF9fYmUxNik7CitleHRlcm4gdm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfcGVlcnModm9pZCk7CisKKy8qCisgKiBhci1wcm9jLmMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW107CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfY29ubmVjdGlvbl9zZXFfZm9wczsKKworLyoKKyAqIGFyLXJlY3Ztc2cuYworICovCitleHRlcm4gdm9pZCByeHJwY19yZW1vdmVfdXNlcl9JRChzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK2V4dGVybiBpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosCisJCQkgc2l6ZV90LCBpbnQpOworCisvKgorICogYXItc2VjdXJpdHkuYworICovCitleHRlcm4gaW50IHJ4cnBjX3JlZ2lzdGVyX3NlY3VyaXR5KHN0cnVjdCByeHJwY19zZWN1cml0eSAqKTsKK2V4dGVybiB2b2lkIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICopOworZXh0ZXJuIGludCByeHJwY19pbml0X2NsaWVudF9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworZXh0ZXJuIGludCByeHJwY19pbml0X3NlcnZlcl9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworZXh0ZXJuIGludCByeHJwY19zZWN1cmVfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgICAgc2l6ZV90LCB2b2lkICopOworZXh0ZXJuIGludCByeHJwY192ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgICAgdTMyICopOworZXh0ZXJuIHZvaWQgcnhycGNfY2xlYXJfY29ubl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKKworLyoKKyAqIGFyLXNrYnVmZi5jCisgKi8KK2V4dGVybiB2b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICopOworCisvKgorICogYXItdHJhbnNwb3J0LmMKKyAqLworZXh0ZXJuIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnJ4cnBjX2dldF90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCQkgICBzdHJ1Y3QgcnhycGNfcGVlciAqLAorCQkJCQkJICAgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICopOworZXh0ZXJuIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3RyYW5zcG9ydHModm9pZCk7CitleHRlcm4gc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqcnhycGNfZmluZF90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCQkgICAgc3RydWN0IHJ4cnBjX3BlZXIgKik7CisKKy8qCisgKiBkZWJ1ZyB0cmFjaW5nCisgKi8KK2V4dGVybiB1bnNpZ25lZCByeHJwY19kZWJ1ZzsKKworI2RlZmluZSBkYmdwcmludGsoRk1ULC4uLikgXAorCXByaW50aygiWyV4JS02LjZzXSAiRk1UIlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tICwjI19fVkFfQVJHU19fKQorCisvKiBtYWtlIHN1cmUgd2UgbWFpbnRhaW4gdGhlIGZvcm1hdCBzdHJpbmdzLCBldmVuIHdoZW4gZGVidWdnaW5nIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpCit2b2lkIF9kYnByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKK30KKworI2RlZmluZSBrZW50ZXIoRk1ULC4uLikJZGJncHJpbnRrKCI9PT4gJXMoIkZNVCIpIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtsZWF2ZShGTVQsLi4uKQlkYmdwcmludGsoIjw9PSAlcygpIkZNVCIiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUga2RlYnVnKEZNVCwuLi4pCWRiZ3ByaW50aygiICAgICJGTVQgLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtwcm90byhGTVQsLi4uKQlkYmdwcmludGsoIiMjIyAiRk1UICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBrbmV0KEZNVCwuLi4pCWRiZ3ByaW50aygiQEBAICJGTVQgLCMjX19WQV9BUkdTX18pCisKKworI2lmIGRlZmluZWQoX19LREVCVUcpCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9sZWF2ZShGTVQsLi4uKQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9wcm90byhGTVQsLi4uKQlrcHJvdG8oRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9uZXQoRk1ULC4uLikJa25ldChGTVQsIyNfX1ZBX0FSR1NfXykKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQUZfUlhSUENfREVCVUcpCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tFTlRFUgkweDAxCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tMRUFWRQkweDAyCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tERUJVRwkweDA0CisjZGVmaW5lIFJYUlBDX0RFQlVHX0tQUk9UTwkweDA4CisjZGVmaW5lIFJYUlBDX0RFQlVHX0tORVQJMHgxMAorCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKHVubGlrZWx5KHJ4cnBjX2RlYnVnICYgUlhSUENfREVCVUdfS0VOVEVSKSkJXAorCQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShyeHJwY19kZWJ1ZyAmIFJYUlBDX0RFQlVHX0tMRUFWRSkpCVwKKwkJa2xlYXZlKEZNVCwjI19fVkFfQVJHU19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX2RlYnVnKEZNVCwuLi4pCQkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkocnhycGNfZGVidWcgJiBSWFJQQ19ERUJVR19LREVCVUcpKQlcCisJCWtkZWJ1ZyhGTVQsIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9wcm90byhGTVQsLi4uKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKHVubGlrZWx5KHJ4cnBjX2RlYnVnICYgUlhSUENfREVCVUdfS1BST1RPKSkJXAorCQlrcHJvdG8oRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbmV0KEZNVCwuLi4pCQkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkocnhycGNfZGVidWcgJiBSWFJQQ19ERUJVR19LTkVUKSkJXAorCQlrbmV0KEZNVCwjI19fVkFfQVJHU19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlfZGJwcmludGsoIj09PiAlcygiRk1UIikiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX2xlYXZlKEZNVCwuLi4pCV9kYnByaW50aygiPD09ICVzKCkiRk1UIiIsX19GVU5DVElPTl9fICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBfZGVidWcoRk1ULC4uLikJX2RicHJpbnRrKCIgICAgIkZNVCAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX3Byb3RvKEZNVCwuLi4pCV9kYnByaW50aygiIyMjICJGTVQgLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9uZXQoRk1ULC4uLikJX2RicHJpbnRrKCJAQEAgIkZNVCAsIyNfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisvKgorICogZGVidWcgYXNzZXJ0aW9uIGNoZWNraW5nCisgKi8KKyNpZiAxIC8vIGRlZmluZWQoX19LREVCVUdBTEwpCisKKyNkZWZpbmUgQVNTRVJUKFgpCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKFgpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJSeFJQQzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVENNUChYLCBPUCwgWSkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKChYKSBPUCAoWSkpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiUnhSUEM6IEFzc2VydGlvbiBmYWlsZWRcbiIpOwkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVsdSAiICNPUCAiICVsdSBpcyBmYWxzZVxuIiwJCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKShYKSwgKHVuc2lnbmVkIGxvbmcpKFkpKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIweCVseCAiICNPUCAiIDB4JWx4IGlzIGZhbHNlXG4iLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCUJVRygpOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGKEMsIFgpCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoQykgJiYgIShYKSkpIHsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJSeFJQQzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoKEMpICYmICEoKFgpIE9QIChZKSkpKSB7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlJ4UlBDOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2Vsc2UKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQlcCitkbyB7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmIC8qIF9fS0RFQlVHQUxMICovCisKKy8qCisgKiBzb2NrZXQgYnVmZmVyIGFjY291bnRpbmcgLyBsZWFrIGZpbmRpbmcKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfbmV3X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICpmbikKK3sKKwkvL19uZXQoIm5ldyBza2IgJXAgJXMgWyVkXSIsIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKKwkvL2F0b21pY19pbmMoJnJ4cnBjX25fc2ticyk7Cit9CisKKyNkZWZpbmUgcnhycGNfbmV3X3NrYihza2IpIF9fcnhycGNfbmV3X3NrYigoc2tiKSwgX19mdW5jX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX2tpbGxfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGNoYXIgKmZuKQoreworCS8vX25ldCgia2lsbCBza2IgJXAgJXMgWyVkXSIsIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKKwkvL2F0b21pY19kZWMoJnJ4cnBjX25fc2ticyk7Cit9CisKKyNkZWZpbmUgcnhycGNfa2lsbF9za2Ioc2tiKSBfX3J4cnBjX2tpbGxfc2tiKChza2IpLCBfX2Z1bmNfXykKKworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqZm4pCit7CisJaWYgKHNrYikgeworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQkvL19uZXQoImZyZWUgc2tiICVwICVzIFslZF0iLAorCQkvLyAgICAgc2tiLCBmbiwgYXRvbWljX3JlYWQoJnJ4cnBjX25fc2ticykpOworCQkvL2F0b21pY19kZWMoJnJ4cnBjX25fc2ticyk7CisJCWtmcmVlX3NrYihza2IpOworCX0KK30KKworI2RlZmluZSByeHJwY19mcmVlX3NrYihza2IpIF9fcnhycGNfZnJlZV9za2IoKHNrYiksIF9fZnVuY19fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHVyZ2VfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoKGxpc3QpKSkgIT0gTlVMTCkKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfZ2V0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsIGNvbnN0IGNoYXIgKmYpCit7CisJQ0hFQ0tfU0xBQl9PS0FZKCZsb2NhbC0+dXNhZ2UpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmbG9jYWwtPnVzYWdlKSA9PSAxKQorCQlwcmludGsoInJlc3VycmVjdGVkICglcylcbiIsIGYpOworfQorCisjZGVmaW5lIHJ4cnBjX2dldF9sb2NhbChMT0NBTCkgX19yeHJwY19nZXRfbG9jYWwoKExPQ0FMKSwgX19mdW5jX18pCisKKyNkZWZpbmUgcnhycGNfZ2V0X2NhbGwoQ0FMTCkJCQkJXAorZG8gewkJCQkJCQlcCisJQ0hFQ0tfU0xBQl9PS0FZKCYoQ0FMTCktPnVzYWdlKTsJCVwKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJihDQUxMKS0+dXNhZ2UpID09IDEpCVwKKwkJQlVHKCk7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcnhycGNfcHV0X2NhbGwoQ0FMTCkJCQkJXAorZG8gewkJCQkJCQlcCisJX19yeHJwY19wdXRfY2FsbChDQUxMKTsJCQkJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWtleS5jIGIvbmV0L3J4cnBjL2FyLWtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDQ5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXIta2V5LmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIFJ4UlBDIGtleSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFJ4UlBDIGtleXMgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiBvZiBkZXNjcmliaW5nIHRoZWlyIHB1cnBvc2U6CisgKgkiYWZzQENBTUJSSURHRS5SRURIQVQuQ09NPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgPGtleXMvcnhycGMtdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvdXNlci10eXBlLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RhdGljIGludCByeHJwY19pbnN0YW50aWF0ZShzdHJ1Y3Qga2V5ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgcnhycGNfaW5zdGFudGlhdGVfcyhzdHJ1Y3Qga2V5ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3koc3RydWN0IGtleSAqKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcyhzdHJ1Y3Qga2V5ICopOworc3RhdGljIHZvaWQgcnhycGNfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKik7CisKKy8qCisgKiByeHJwYyBkZWZpbmVkIGtleXMgdGFrZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGFzIHRoZSBkZXNjcmlwdGlvbiBhbmQgYW4KKyAqIGFyYml0cmFyeSBibG9iIG9mIGRhdGEgYXMgdGhlIHBheWxvYWQKKyAqLworc3RydWN0IGtleV90eXBlIGtleV90eXBlX3J4cnBjID0geworCS5uYW1lCQk9ICJyeHJwYyIsCisJLmluc3RhbnRpYXRlCT0gcnhycGNfaW5zdGFudGlhdGUsCisJLm1hdGNoCQk9IHVzZXJfbWF0Y2gsCisJLmRlc3Ryb3kJPSByeHJwY19kZXN0cm95LAorCS5kZXNjcmliZQk9IHJ4cnBjX2Rlc2NyaWJlLAorfTsKKworRVhQT1JUX1NZTUJPTChrZXlfdHlwZV9yeHJwYyk7CisKKy8qCisgKiByeHJwYyBzZXJ2ZXIgZGVmaW5lZCBrZXlzIHRha2UgIjxzZXJ2aWNlSWQ+OjxzZWN1cml0eUluZGV4PiIgYXMgdGhlCisgKiBkZXNjcmlwdGlvbiBhbmQgYW4gOC1ieXRlIGRlY3J5cHRpb24ga2V5IGFzIHRoZSBwYXlsb2FkCisgKi8KK3N0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yeHJwY19zID0geworCS5uYW1lCQk9ICJyeHJwY19zIiwKKwkuaW5zdGFudGlhdGUJPSByeHJwY19pbnN0YW50aWF0ZV9zLAorCS5tYXRjaAkJPSB1c2VyX21hdGNoLAorCS5kZXN0cm95CT0gcnhycGNfZGVzdHJveV9zLAorCS5kZXNjcmliZQk9IHJ4cnBjX2Rlc2NyaWJlLAorfTsKKworLyoKKyAqIGluc3RhbnRpYXRlIGFuIHJ4cnBjIGRlZmluZWQga2V5CisgKiBkYXRhIHNob3VsZCBiZSBvZiB0aGUgZm9ybToKKyAqCU9GRlNFVAlMRU4JQ09OVEVOVAorICoJMAk0CWtleSBpbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIKKyAqCTQJMglzZWN1cml0eSBpbmRleCAodHlwZSkKKyAqCTYJMgl0aWNrZXQgbGVuZ3RoCisgKgk4CTQJa2V5IGV4cGlyeSB0aW1lICh0aW1lX3QpCisgKgkxMgk0CWt2bm8KKyAqCTE2CTgJc2Vzc2lvbiBrZXkKKyAqCTI0CVtsZW5dCXRpY2tldAorICoKKyAqIGlmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZW4gYSBuby1zZWN1cml0eSBrZXkgaXMgbWFkZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJY29uc3Qgc3RydWN0IHJ4a2FkX2tleSAqdHNlYzsKKwlzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnVwYXlsb2FkOworCXNpemVfdCBwbGVuOworCXUzMiBrdmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoInsleH0sLCV6dSIsIGtleV9zZXJpYWwoa2V5KSwgZGF0YWxlbik7CisKKwkvKiBoYW5kbGUgYSBuby1zZWN1cml0eSBrZXkgKi8KKwlpZiAoIWRhdGEgJiYgZGF0YWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGdldCB0aGUga2V5IGludGVyZmFjZSB2ZXJzaW9uIG51bWJlciAqLworCXJldCA9IC1FSU5WQUw7CisJaWYgKGRhdGFsZW4gPD0gNCB8fCAhZGF0YSkKKwkJZ290byBlcnJvcjsKKwltZW1jcHkoJmt2ZXIsIGRhdGEsIHNpemVvZihrdmVyKSk7CisJZGF0YSArPSBzaXplb2Yoa3Zlcik7CisJZGF0YWxlbiAtPSBzaXplb2Yoa3Zlcik7CisKKwlfZGVidWcoIktFWSBJL0YgVkVSU0lPTjogJXUiLCBrdmVyKTsKKworCXJldCA9IC1FS0VZUkVKRUNURUQ7CisJaWYgKGt2ZXIgIT0gMSkKKwkJZ290byBlcnJvcjsKKworCS8qIGRlYWwgd2l0aCBhIHZlcnNpb24gMSBrZXkgKi8KKwlyZXQgPSAtRUlOVkFMOworCWlmIChkYXRhbGVuIDwgc2l6ZW9mKCp0c2VjKSkKKwkJZ290byBlcnJvcjsKKworCXRzZWMgPSBkYXRhOworCWlmIChkYXRhbGVuICE9IHNpemVvZigqdHNlYykgKyB0c2VjLT50aWNrZXRfbGVuKQorCQlnb3RvIGVycm9yOworCisJX2RlYnVnKCJTQ0lYOiAldSIsIHRzZWMtPnNlY3VyaXR5X2luZGV4KTsKKwlfZGVidWcoIlRMRU46ICV1IiwgdHNlYy0+dGlja2V0X2xlbik7CisJX2RlYnVnKCJFWFBZOiAleCIsIHRzZWMtPmV4cGlyeSk7CisJX2RlYnVnKCJLVk5POiAldSIsIHRzZWMtPmt2bm8pOworCV9kZWJ1ZygiU0tFWTogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCSAgICAgICB0c2VjLT5zZXNzaW9uX2tleVswXSwgdHNlYy0+c2Vzc2lvbl9rZXlbMV0sCisJICAgICAgIHRzZWMtPnNlc3Npb25fa2V5WzJdLCB0c2VjLT5zZXNzaW9uX2tleVszXSwKKwkgICAgICAgdHNlYy0+c2Vzc2lvbl9rZXlbNF0sIHRzZWMtPnNlc3Npb25fa2V5WzVdLAorCSAgICAgICB0c2VjLT5zZXNzaW9uX2tleVs2XSwgdHNlYy0+c2Vzc2lvbl9rZXlbN10pOworCWlmICh0c2VjLT50aWNrZXRfbGVuID49IDgpCisJCV9kZWJ1ZygiVENLVDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkgICAgICAgdHNlYy0+dGlja2V0WzBdLCB0c2VjLT50aWNrZXRbMV0sCisJCSAgICAgICB0c2VjLT50aWNrZXRbMl0sIHRzZWMtPnRpY2tldFszXSwKKwkJICAgICAgIHRzZWMtPnRpY2tldFs0XSwgdHNlYy0+dGlja2V0WzVdLAorCQkgICAgICAgdHNlYy0+dGlja2V0WzZdLCB0c2VjLT50aWNrZXRbN10pOworCisJcmV0ID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAodHNlYy0+c2VjdXJpdHlfaW5kZXggIT0gMikKKwkJZ290byBlcnJvcjsKKworCWtleS0+dHlwZV9kYXRhLnhbMF0gPSB0c2VjLT5zZWN1cml0eV9pbmRleDsKKworCXBsZW4gPSBzaXplb2YoKnVwYXlsb2FkKSArIHRzZWMtPnRpY2tldF9sZW47CisJcmV0ID0ga2V5X3BheWxvYWRfcmVzZXJ2ZShrZXksIHBsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gLUVOT01FTTsKKwl1cGF5bG9hZCA9IGttYWxsb2MocGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cGF5bG9hZCkKKwkJZ290byBlcnJvcjsKKworCS8qIGF0dGFjaCB0aGUgZGF0YSAqLworCW1lbWNweSgmdXBheWxvYWQtPmssIHRzZWMsIHNpemVvZigqdHNlYykpOworCW1lbWNweSgmdXBheWxvYWQtPmsudGlja2V0LCAodm9pZCAqKXRzZWMgKyBzaXplb2YoKnRzZWMpLAorCSAgICAgICB0c2VjLT50aWNrZXRfbGVuKTsKKwlrZXktPnBheWxvYWQuZGF0YSA9IHVwYXlsb2FkOworCWtleS0+ZXhwaXJ5ID0gdHNlYy0+ZXhwaXJ5OworCXJldCA9IDA7CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBpbnN0YW50aWF0ZSBhIHNlcnZlciBzZWNyZXQga2V5CisgKiBkYXRhIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gdGhlIDgtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfaW5zdGFudGlhdGVfcyhzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNpOworCisJX2VudGVyKCJ7JXh9LCwlenUiLCBrZXlfc2VyaWFsKGtleSksIGRhdGFsZW4pOworCisJaWYgKGRhdGFsZW4gIT0gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoJmtleS0+dHlwZV9kYXRhLCBkYXRhLCA4KTsKKworCWNpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhkZXMpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihjaSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGNpKSk7CisJCXJldHVybiBQVFJfRVJSKGNpKTsKKwl9CisKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoY2ksIGRhdGEsIDgpIDwgMCkKKwkJQlVHKCk7CisKKwlrZXktPnBheWxvYWQuZGF0YSA9IGNpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogZGlzcG9zZSBvZiB0aGUgZGF0YSBkYW5nbGluZyBmcm9tIHRoZSBjb3Jwc2Ugb2YgYSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXkpCit7CisJa2ZyZWUoa2V5LT5wYXlsb2FkLmRhdGEpOworfQorCisvKgorICogZGlzcG9zZSBvZiB0aGUgZGF0YSBkYW5nbGluZyBmcm9tIHRoZSBjb3Jwc2Ugb2YgYSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9zKHN0cnVjdCBrZXkgKmtleSkKK3sKKwlpZiAoa2V5LT5wYXlsb2FkLmRhdGEpIHsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGtleS0+cGF5bG9hZC5kYXRhKTsKKwkJa2V5LT5wYXlsb2FkLmRhdGEgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGRlc2NyaWJlIHRoZSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3B1dHMobSwga2V5LT5kZXNjcmlwdGlvbik7Cit9CisKKy8qCisgKiBncmFiIHRoZSBzZWN1cml0eSBrZXkgZm9yIGEgc29ja2V0CisgKi8KK2ludCByeHJwY19yZXF1ZXN0X2tleShzdHJ1Y3QgcnhycGNfc29jayAqcngsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGtleSAqa2V5OworCWNoYXIgKmRlc2NyaXB0aW9uOworCisJX2VudGVyKCIiKTsKKworCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBQQUdFX1NJWkUgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2NyaXB0aW9uID0ga21hbGxvYyhvcHRsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2NyaXB0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXNjcmlwdGlvbiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRlc2NyaXB0aW9uW29wdGxlbl0gPSAwOworCisJa2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX3J4cnBjLCBkZXNjcmlwdGlvbiwgTlVMTCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gUFRSX0VSUihrZXkpOworCX0KKworCXJ4LT5rZXkgPSBrZXk7CisJa2ZyZWUoZGVzY3JpcHRpb24pOworCV9sZWF2ZSgiID0gMCBba2V5ICV4XSIsIGtleS0+c2VyaWFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdyYWIgdGhlIHNlY3VyaXR5IGtleXJpbmcgZm9yIGEgc2VydmVyIHNvY2tldAorICovCitpbnQgcnhycGNfc2VydmVyX2tleXJpbmcoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJIGludCBvcHRsZW4pCit7CisJc3RydWN0IGtleSAqa2V5OworCWNoYXIgKmRlc2NyaXB0aW9uOworCisJX2VudGVyKCIiKTsKKworCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBQQUdFX1NJWkUgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2NyaXB0aW9uID0ga21hbGxvYyhvcHRsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2NyaXB0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXNjcmlwdGlvbiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRlc2NyaXB0aW9uW29wdGxlbl0gPSAwOworCisJa2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX2tleXJpbmcsIGRlc2NyaXB0aW9uLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJa2ZyZWUoZGVzY3JpcHRpb24pOworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoa2V5KSk7CisJCXJldHVybiBQVFJfRVJSKGtleSk7CisJfQorCisJcngtPnNlY3VyaXRpZXMgPSBrZXk7CisJa2ZyZWUoZGVzY3JpcHRpb24pOworCV9sZWF2ZSgiID0gMCBba2V5ICV4XSIsIGtleS0+c2VyaWFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGEgc2VydmVyIGRhdGEga2V5CisgKi8KK2ludCByeHJwY19nZXRfc2VydmVyX2RhdGFfa2V5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJICAgICAgY29uc3Qgdm9pZCAqc2Vzc2lvbl9rZXksCisJCQkgICAgICB0aW1lX3QgZXhwaXJ5LAorCQkJICAgICAgdTMyIGt2bm8pCit7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlzdHJ1Y3QgeworCQl1MzIga3ZlcjsKKwkJc3RydWN0IHJ4a2FkX2tleSB0c2VjOworCX0gZGF0YTsKKworCV9lbnRlcigiIik7CisKKwlrZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3J4cnBjLCAieCIsIDAsIDAsIGN1cnJlbnQsIDAsCisJCQlLRVlfQUxMT0NfTk9UX0lOX1FVT1RBKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIFthbGxvYyAlbGRdIiwgUFRSX0VSUihrZXkpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJX2RlYnVnKCJrZXkgJWQiLCBrZXlfc2VyaWFsKGtleSkpOworCisJZGF0YS5rdmVyID0gMTsKKwlkYXRhLnRzZWMuc2VjdXJpdHlfaW5kZXggPSAyOworCWRhdGEudHNlYy50aWNrZXRfbGVuID0gMDsKKwlkYXRhLnRzZWMuZXhwaXJ5ID0gZXhwaXJ5OworCWRhdGEudHNlYy5rdm5vID0gMDsKKworCW1lbWNweSgmZGF0YS50c2VjLnNlc3Npb25fa2V5LCBzZXNzaW9uX2tleSwKKwkgICAgICAgc2l6ZW9mKGRhdGEudHNlYy5zZXNzaW9uX2tleSkpOworCisJcmV0ID0ga2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKGtleSwgJmRhdGEsIHNpemVvZihkYXRhKSwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwljb25uLT5rZXkgPSBrZXk7CisJX2xlYXZlKCIgPSAwIFslZF0iLCBrZXlfc2VyaWFsKGtleSkpOworCXJldHVybiAwOworCitlcnJvcjoKKwlrZXlfcmV2b2tlKGtleSk7CisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gLUVOT01FTSBbaW5zICVkXSIsIHJldCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfZ2V0X3NlcnZlcl9kYXRhX2tleSk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItbG9jYWwuYyBiL25ldC9yeHJwYy9hci1sb2NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDNmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItbG9jYWwuYwpAQCAtMCwwICsxLDMwOSBAQAorLyogQUZfUlhSUEMgbG9jYWwgZW5kcG9pbnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2xvY2Fscyk7CitERUZJTkVfUldMT0NLKHJ4cnBjX2xvY2FsX2xvY2spOworc3RhdGljIERFQ0xBUkVfUldTRU0ocnhycGNfbG9jYWxfc2VtKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyeHJwY19sb2NhbF93cSk7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfbG9jYWwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGxvY2FsCisgKi8KK3N0YXRpYworc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19hbGxvY19sb2NhbChzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCisJbG9jYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAobG9jYWwpIHsKKwkJSU5JVF9XT1JLKCZsb2NhbC0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9sb2NhbCk7CisJCUlOSVRfV09SSygmbG9jYWwtPmFjY2VwdG9yLCAmcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGxzKTsKKwkJSU5JVF9XT1JLKCZsb2NhbC0+cmVqZWN0ZXIsICZyeHJwY19yZWplY3RfcGFja2V0cyk7CisJCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c2VydmljZXMpOworCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpbmspOworCQlpbml0X3J3c2VtKCZsb2NhbC0+ZGVmcmFnX3NlbSk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5hY2NlcHRfcXVldWUpOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+cmVqZWN0X3F1ZXVlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5sb2NrKTsKKwkJcndsb2NrX2luaXQoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJYXRvbWljX3NldCgmbG9jYWwtPnVzYWdlLCAxKTsKKwkJbG9jYWwtPmRlYnVnX2lkID0gYXRvbWljX2luY19yZXR1cm4oJnJ4cnBjX2RlYnVnX2lkKTsKKwkJbWVtY3B5KCZsb2NhbC0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7CisJfQorCisJX2xlYXZlKCIgPSAlcCIsIGxvY2FsKTsKKwlyZXR1cm4gbG9jYWw7Cit9CisKKy8qCisgKiBjcmVhdGUgdGhlIGxvY2FsIHNvY2tldAorICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHJ4cnBjX2xvY2FsX3NlbSB3cml0ZWxvY2tlZAorICovCitzdGF0aWMgaW50IHJ4cnBjX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBzb2NrICpzb2NrOworCWludCByZXQsIG9wdDsKKworCV9lbnRlcigiJXB7JWR9IiwgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUpOworCisJLyogY3JlYXRlIGEgc29ja2V0IHRvIHJlcHJlc2VudCB0aGUgbG9jYWwgZW5kcG9pbnQgKi8KKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsIElQUFJPVE9fVURQLAorCQkJICAgICAgICZsb2NhbC0+c29ja2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtzb2NrZXRdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBpZiBhIGxvY2FsIGFkZHJlc3Mgd2FzIHN1cHBsaWVkIHRoZW4gYmluZCBpdCAqLworCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydF9sZW4gPiBzaXplb2Yoc2FfZmFtaWx5X3QpKSB7CisJCV9kZWJ1ZygiYmluZCIpOworCQlyZXQgPSBrZXJuZWxfYmluZChsb2NhbC0+c29ja2V0LAorCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSAmbG9jYWwtPnNyeC50cmFuc3BvcnQsCisJCQkJICBsb2NhbC0+c3J4LnRyYW5zcG9ydF9sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJX2RlYnVnKCJiaW5kIGZhaWxlZCIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIHdlIHdhbnQgdG8gcmVjZWl2ZSBJQ01QIGVycm9ycyAqLworCW9wdCA9IDE7CisJcmV0ID0ga2VybmVsX3NldHNvY2tvcHQobG9jYWwtPnNvY2tldCwgU09MX0lQLCBJUF9SRUNWRVJSLAorCQkJCShjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNldHNvY2tvcHQgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd2Ugd2FudCB0byBzZXQgdGhlIGRvbid0IGZyYWdtZW50IGJpdCAqLworCW9wdCA9IElQX1BNVFVESVNDX0RPOworCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KGxvY2FsLT5zb2NrZXQsIFNPTF9JUCwgSVBfTVRVX0RJU0NPVkVSLAorCQkJCShjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNldHNvY2tvcHQgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJd3JpdGVfbG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisJbGlzdF9hZGQoJmxvY2FsLT5saW5rLCAmcnhycGNfbG9jYWxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCisJLyogc2V0IHRoZSBzb2NrZXQgdXAgKi8KKwlzb2NrID0gbG9jYWwtPnNvY2tldC0+c2s7CisJc29jay0+c2tfdXNlcl9kYXRhCT0gbG9jYWw7CisJc29jay0+c2tfZGF0YV9yZWFkeQk9IHJ4cnBjX2RhdGFfcmVhZHk7CisJc29jay0+c2tfZXJyb3JfcmVwb3J0CT0gcnhycGNfVURQX2Vycm9yX3JlcG9ydDsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbG9jYWwtPnNvY2tldC0+b3BzLT5zaHV0ZG93bihsb2NhbC0+c29ja2V0LCAyKTsKKwlsb2NhbC0+c29ja2V0LT5zay0+c2tfdXNlcl9kYXRhID0gTlVMTDsKKwlzb2NrX3JlbGVhc2UobG9jYWwtPnNvY2tldCk7CisJbG9jYWwtPnNvY2tldCA9IE5VTEw7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3JlYXRlIGEgbmV3IGxvY2FsIGVuZHBvaW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgVURQIGFkZHJlc3MKKyAqLworc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19sb29rdXBfbG9jYWwoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngpCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0LmZhbWlseSwKKwkgICAgICAgTklQUVVBRChzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCWRvd25fd3JpdGUoJnJ4cnBjX2xvY2FsX3NlbSk7CisKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhIHN1aXRhYmxlIGxvY2FsIGxvY2FsIGVuZHBvaW50IGFscmVhZHkgKi8KKwlyZWFkX2xvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJnJ4cnBjX2xvY2FscywgbGluaykgeworCQlfZGVidWcoIkNNUCB7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJCSAgICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAorCQkgICAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5LAorCQkgICAgICAgTklQUVVBRChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCQkgICAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwkJaWYgKGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUgIT0gc3J4LT50cmFuc3BvcnRfdHlwZSB8fAorCQkgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5ICE9IHNyeC0+dHJhbnNwb3J0LmZhbWlseSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoc3J4LT50cmFuc3BvcnQuZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQgIT0KKwkJCSAgICBzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpCisJCQkJY29udGludWU7CisJCQlpZiAobWVtY21wKCZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCisJCQkJICAgJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJZ290byBmb3VuZF9sb2NhbDsKKworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBvbmUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZSAqLworCWxvY2FsID0gcnhycGNfYWxsb2NfbG9jYWwoc3J4KTsKKwlpZiAoIWxvY2FsKSB7CisJCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXQgPSByeHJwY19jcmVhdGVfbG9jYWwobG9jYWwpOworCWlmIChyZXQgPCAwKSB7CisJCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCQlrZnJlZShsb2NhbCk7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCisJX25ldCgiTE9DQUwgbmV3ICVkIHslZCwldSwldS4ldS4ldS4ldSslaHV9IiwKKwkgICAgIGxvY2FsLT5kZWJ1Z19pZCwKKwkgICAgIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsCisJICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCisJICAgICBOSVBRVUFEKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICBudG9ocyhsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCV9sZWF2ZSgiID0gJXAgW25ld10iLCBsb2NhbCk7CisJcmV0dXJuIGxvY2FsOworCitmb3VuZF9sb2NhbDoKKwlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwl1cF93cml0ZSgmcnhycGNfbG9jYWxfc2VtKTsKKworCV9uZXQoIkxPQ0FMIG9sZCAlZCB7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICBsb2NhbC0+ZGVidWdfaWQsCisJICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAorCSAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5LAorCSAgICAgTklQUVVBRChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlfbGVhdmUoIiA9ICVwIFtyZXVzZV0iLCBsb2NhbCk7CisJcmV0dXJuIGxvY2FsOworfQorCisvKgorICogcmVsZWFzZSBhIGxvY2FsIGVuZHBvaW50CisgKi8KK3ZvaWQgcnhycGNfcHV0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwpCit7CisJX2VudGVyKCIlcHt1PSVkfSIsIGxvY2FsLCBhdG9taWNfcmVhZCgmbG9jYWwtPnVzYWdlKSk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSksID4sIDApOworCisJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUgZWZmZWN0aXZlbHkKKwkgKiBhdG9taWMgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmbG9jYWwtPnVzYWdlKSkpIHsKKwkJX2RlYnVnKCJkZXN0cm95IGxvY2FsIik7CisJCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5kZXN0cm95ZXIpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZXN0cm95IGEgbG9jYWwgZW5kcG9pbnQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9sb2NhbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfbG9jYWwsIGRlc3Ryb3llcik7CisKKwlfZW50ZXIoIiVweyVkfSIsIGxvY2FsLCBhdG9taWNfcmVhZCgmbG9jYWwtPnVzYWdlKSk7CisKKwlkb3duX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZsb2NhbC0+dXNhZ2UpID4gMCkgeworCQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCQl1cF9yZWFkKCZyeHJwY19sb2NhbF9zZW0pOworCQlfbGVhdmUoIiBbcmVzdXJyZWN0ZWRdIik7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbCgmbG9jYWwtPmxpbmspOworCWxvY2FsLT5zb2NrZXQtPnNrLT5za191c2VyX2RhdGEgPSBOVUxMOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisKKwlkb3duZ3JhZGVfd3JpdGUoJnJ4cnBjX2xvY2FsX3NlbSk7CisKKwlBU1NFUlQobGlzdF9lbXB0eSgmbG9jYWwtPnNlcnZpY2VzKSk7CisJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmxvY2FsLT5hY2NlcHRvcikpOworCUFTU0VSVCghd29ya19wZW5kaW5nKCZsb2NhbC0+cmVqZWN0ZXIpKTsKKworCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgbG9jYWwgZGVzY3JpcHRvciAqLworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKKwlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CisJbG9jYWwtPnNvY2tldC0+b3BzLT5zaHV0ZG93bihsb2NhbC0+c29ja2V0LCAyKTsKKwlzb2NrX3JlbGVhc2UobG9jYWwtPnNvY2tldCk7CisKKwl1cF9yZWFkKCZyeHJwY19sb2NhbF9zZW0pOworCisJX25ldCgiREVTVFJPWSBMT0NBTCAlZCIsIGxvY2FsLT5kZWJ1Z19pZCk7CisJa2ZyZWUobG9jYWwpOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2xvY2FscykpCisJCXdha2VfdXBfYWxsKCZyeHJwY19sb2NhbF93cSk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIGxvY2FsIGxvY2FsIGVuZHBvaW50IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yCisgKiB0aGVtIHRvIGJlIGRlc3Ryb3llZAorICovCit2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9sb2NhbHModm9pZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsY3VycmVudCk7CisKKwlfZW50ZXIoIiIpOworCisJLyogd2Ugc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlbSB0byBnbyBhd2F5ICovCisJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19sb2NhbHMpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX2xvY2FsX3dxLCAmbXlzZWxmKTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4cnBjX2xvY2FscykpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnhycGNfbG9jYWxfd3EsICZteXNlbGYpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItb3V0cHV0LmMgYi9uZXQvcnhycGMvYXItb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZGU0YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1vdXRwdXQuYwpAQCAtMCwwICsxLDczNCBAQAorLyogUnhSUEMgcGFja2V0IHRyYW5zbWlzc2lvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK2ludCByeHJwY19yZXNlbmRfdGltZW91dCA9IDQ7CisKK3N0YXRpYyBpbnQgcnhycGNfc2VuZF9kYXRhKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKKworLyoKKyAqIGV4dHJhY3QgY29udHJvbCBtZXNzYWdlcyBmcm9tIHRoZSBzZW5kbXNnKCkgY29udHJvbCBidWZmZXIKKyAqLworc3RhdGljIGludCByeHJwY19zZW5kbXNnX2Ntc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICB1bnNpZ25lZCBsb25nICp1c2VyX2NhbGxfSUQsCisJCQkgICAgICBlbnVtIHJ4cnBjX2NvbW1hbmQgKmNvbW1hbmQsCisJCQkgICAgICB1MzIgKmFib3J0X2NvZGUsCisJCQkgICAgICBib29sIHNlcnZlcikKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlpbnQgbGVuOworCisJKmNvbW1hbmQgPSBSWFJQQ19DTURfU0VORF9EQVRBOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGVuID0gY21zZy0+Y21zZ19sZW4gLSBDTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpOworCQlfZGVidWcoIkNNU0cgJWQsICVkLCAlZCIsCisJCSAgICAgICBjbXNnLT5jbXNnX2xldmVsLCBjbXNnLT5jbXNnX3R5cGUsIGxlbik7CisKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1JYUlBDKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjbXNnLT5jbXNnX3R5cGUpIHsKKwkJY2FzZSBSWFJQQ19VU0VSX0NBTExfSUQ6CisJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkqdXNlcl9jYWxsX0lEID0gKih1MzIgKikgQ01TR19EQVRBKGNtc2cpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJKnVzZXJfY2FsbF9JRCA9ICoodW5zaWduZWQgbG9uZyAqKQorCQkJCQlDTVNHX0RBVEEoY21zZyk7CisJCQl9CisJCQlfZGVidWcoIlVzZXIgQ2FsbCBJRCAlbHgiLCAqdXNlcl9jYWxsX0lEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUJPUlQ6CisJCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7CisJCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKKwkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7CisJCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUNDRVBUOgorCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9BQ0NFUFQ7CisJCQlpZiAobGVuICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIXNlcnZlcikKKwkJCQlyZXR1cm4gLUVJU0NPTk47CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFib3J0IGEgY2FsbCwgc2VuZGluZyBhbiBBQk9SVCBwYWNrZXQgdG8gdGhlIHBlZXIKKyAqLworc3RhdGljIHZvaWQgcnhycGNfc2VuZF9hYm9ydChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCit7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJlc2VuZF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9BQ0ssICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBzZW5kIGEgbWVzc2FnZSBmb3JtaW5nIHBhcnQgb2YgYSBjbGllbnQgY2FsbCB0aHJvdWdoIGFuIFJ4UlBDIHNvY2tldAorICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqIC0gdGhlIHNvY2tldCBtYXkgYmUgZWl0aGVyIGEgY2xpZW50IHNvY2tldCBvciBhIHNlcnZlciBzb2NrZXQKKyAqLworaW50IHJ4cnBjX2NsaWVudF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKmJ1bmRsZTsKKwllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJX19iZTE2IHNlcnZpY2VfaWQ7CisJdTMyIGFib3J0X2NvZGUgPSAwOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKHRyYW5zICE9IE5VTEwpOworCisJcmV0ID0gcnhycGNfc2VuZG1zZ19jbXNnKHJ4LCBtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlidW5kbGUgPSBOVUxMOworCWlmICh0cmFucykgeworCQlzZXJ2aWNlX2lkID0gcngtPnNlcnZpY2VfaWQ7CisJCWlmIChtc2ctPm1zZ19uYW1lKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCA9CisJCQkJKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBtc2ctPm1zZ19uYW1lOworCQkJc2VydmljZV9pZCA9IGh0b25zKHNyeC0+c3J4X3NlcnZpY2UpOworCQl9CisJCWtleSA9IHJ4LT5rZXk7CisJCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YSkKKwkJCWtleSA9IE5VTEw7CisJCWJ1bmRsZSA9IHJ4cnBjX2dldF9idW5kbGUocngsIHRyYW5zLCBrZXksIHNlcnZpY2VfaWQsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCWlmIChJU19FUlIoYnVuZGxlKSkKKwkJCXJldHVybiBQVFJfRVJSKGJ1bmRsZSk7CisJfQorCisJY2FsbCA9IHJ4cnBjX2dldF9jbGllbnRfY2FsbChyeCwgdHJhbnMsIGJ1bmRsZSwgdXNlcl9jYWxsX0lELAorCQkJCSAgICAgYWJvcnRfY29kZSA9PSAwLCBHRlBfS0VSTkVMKTsKKwlpZiAodHJhbnMpCisJCXJ4cnBjX3B1dF9idW5kbGUodHJhbnMsIGJ1bmRsZSk7CisJaWYgKElTX0VSUihjYWxsKSkgeworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY2FsbCkpOworCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwl9CisKKwlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCisJCXJldCA9IC1FU0hVVERPV047CisJfSBlbHNlIGlmIChjbWQgPT0gUlhSUENfQ01EX1NFTkRfQUJPUlQpIHsKKwkJcnhycGNfc2VuZF9hYm9ydChjYWxsLCBhYm9ydF9jb2RlKTsKKwl9IGVsc2UgaWYgKGNtZCAhPSBSWFJQQ19DTURfU0VORF9EQVRBKSB7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QpIHsKKwkJLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCQlyZXQgPSAtRVBST1RPOworCX0gZWxzZSB7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShpb2NiLCByeCwgY2FsbCwgbXNnLCBsZW4pOworCX0KKworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcnhycGNfa2VybmVsX3NlbmRfZGF0YSAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbAorICogQGNhbGw6IFRoZSBjYWxsIHRvIHNlbmQgZGF0YSB0aHJvdWdoCisgKiBAbXNnOiBUaGUgZGF0YSB0byBzZW5kCisgKiBAbGVuOiBUaGUgYW1vdW50IG9mIGRhdGEgdG8gc2VuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbC4gIFRoZSBjYWxsIG11c3QgYmUgaW4gYW4gc3RhdGUKKyAqIGFwcHJvcHJpYXRlIHRvIHNlbmRpbmcgZGF0YS4gIE5vIGNvbnRyb2wgZGF0YSBzaG91bGQgYmUgc3VwcGxpZWQgaW4gQG1zZywKKyAqIG5vciBzaG91bGQgYW4gYWRkcmVzcyBiZSBzdXBwbGllZC4gIE1TR19NT1JFIHNob3VsZCBiZSBmbGFnZ2VkIGlmIHRoZXJlJ3MKKyAqIG1vcmUgZGF0YSB0byBjb21lLCBvdGhlcndpc2UgdGhpcyBkYXRhIHdpbGwgZW5kIHRoZSB0cmFuc21pc3Npb24gcGhhc2UuCisgKi8KK2ludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslZCwlc30sIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwlBU1NFUlRDTVAobXNnLT5tc2dfbmFtZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChtc2ctPm1zZ19jb250cm9sLCA9PSwgTlVMTCk7CisKKwlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047IC8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCX0gZWxzZSBpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKKwkJcmV0ID0gLUVQUk9UTzsgLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCX0gZWxzZSB7CisJCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKE5VTEwsIGNhbGwtPnNvY2tldCwgY2FsbCwgbXNnLCBsZW4pOworCQlzZXRfZnMob2xkZnMpOworCX0KKworCXJlbGVhc2Vfc29jaygmY2FsbC0+c29ja2V0LT5zayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfc2VuZF9kYXRhKTsKKworLyoKKyAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKKyAqIEBjYWxsOiBUaGUgY2FsbCB0byBiZSBhYm9ydGVkCisgKiBAYWJvcnRfY29kZTogVGhlIGFib3J0IGNvZGUgdG8gc3RpY2sgaW50byB0aGUgQUJPUlQgcGFja2V0CisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSkKK3sKKwlfZW50ZXIoInslZH0sJWQiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSk7CisKKwlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7CisKKwlyZWxlYXNlX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCV9sZWF2ZSgiIik7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2Fib3J0X2NhbGwpOworCisvKgorICogc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIHNlcnZlciBzb2NrZXQKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK2ludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJZW51bSByeHJwY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwl1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCA9IDA7CisJdTMyIGFib3J0X2NvZGUgPSAwOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJcmV0ID0gcnhycGNfc2VuZG1zZ19jbXNnKHJ4LCBtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgeworCQljYWxsID0gcnhycGNfYWNjZXB0X2NhbGwocngsIHVzZXJfY2FsbF9JRCk7CisJCWlmIChJU19FUlIoY2FsbCkpCisJCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJCXJldHVybiAwOworCX0KKworCWNhbGwgPSByeHJwY19maW5kX3NlcnZlcl9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FQkFEU0xUOworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSWFJQQ19DTURfU0VORF9EQVRBOgorCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgeworCQkJLyogVHggcGhhc2Ugbm90IHlldCBiZWd1biBmb3IgdGhpcyBjYWxsICovCisJCQlyZXQgPSAtRVBST1RPOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSByeHJwY19zZW5kX2RhdGEoaW9jYiwgcngsIGNhbGwsIG1zZywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0NNRF9TRU5EX0FCT1JUOgorCQlyeHJwY19zZW5kX2Fib3J0KGNhbGwsIGFib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlvdXQ6CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNlbmQgYSBwYWNrZXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0IGVuZHBvaW50CisgKi8KK2ludCByeHJwY19zZW5kX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJc3RydWN0IG1zZ2hkciBtc2c7CisJaW50IHJldCwgb3B0OworCisJX2VudGVyKCIseyVkfSIsIHNrYi0+bGVuKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKKwlpb3ZbMF0uaW92X2xlbiA9IHNrYi0+bGVuOworCisJbXNnLm1zZ19uYW1lID0gJnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IDA7CisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgd2l0aCB0aGUgZG9uJ3QgZnJhZ21lbnQgYml0IHNldCBpZiB3ZSBjdXJyZW50bHkKKwkgKiB0aGluayBpdCdzIHNtYWxsIGVub3VnaCAqLworCWlmIChza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSA8IHRyYW5zLT5wZWVyLT5tYXhkYXRhKSB7CisJCWRvd25fcmVhZCgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwkJLyogc2VuZCB0aGUgcGFja2V0IGJ5IFVEUAorCQkgKiAtIHJldHVybnMgLUVNU0dTSVpFIGlmIFVEUCB3b3VsZCBoYXZlIHRvIGZyYWdtZW50IHRoZSBwYWNrZXQKKwkJICogICB0byBnbyBvdXQgb2YgdGhlIGludGVyZmFjZQorCQkgKiAgIC0gaW4gd2hpY2ggY2FzZSwgd2UnbGwgaGF2ZSBwcm9jZXNzZWQgdGhlIElDTVAgZXJyb3IKKwkJICogICAgIG1lc3NhZ2UgYW5kIHVwZGF0ZSB0aGUgcGVlciByZWNvcmQKKwkJICovCisJCXJldCA9IGtlcm5lbF9zZW5kbXNnKHRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDEsCisJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisKKwkJdXBfcmVhZCgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwkJaWYgKHJldCA9PSAtRU1TR1NJWkUpCisJCQlnb3RvIHNlbmRfZnJhZ21lbnRhYmxlOworCisJCV9sZWF2ZSgiID0gJWQgWyV1XSIsIHJldCwgdHJhbnMtPnBlZXItPm1heGRhdGEpOworCQlyZXR1cm4gcmV0OworCX0KKworc2VuZF9mcmFnbWVudGFibGU6CisJLyogYXR0ZW1wdCB0byBzZW5kIHRoaXMgbWVzc2FnZSB3aXRoIGZyYWdtZW50YXRpb24gZW5hYmxlZCAqLworCV9kZWJ1Zygic2VuZCBmcmFnbWVudCIpOworCisJZG93bl93cml0ZSgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlvcHQgPSBJUF9QTVRVRElTQ19ET05UOworCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KHRyYW5zLT5sb2NhbC0+c29ja2V0LCBTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwKKwkJCQkoY2hhciAqKSAmb3B0LCBzaXplb2Yob3B0KSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IGtlcm5lbF9zZW5kbXNnKHRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDEsCisJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisKKwkJb3B0ID0gSVBfUE1UVURJU0NfRE87CisJCWtlcm5lbF9zZXRzb2Nrb3B0KHRyYW5zLT5sb2NhbC0+c29ja2V0LCBTT0xfSVAsCisJCQkJICBJUF9NVFVfRElTQ09WRVIsIChjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwl9CisKKwl1cF93cml0ZSgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlfbGVhdmUoIiA9ICVkIFtmcmFnICV1XSIsIHJldCwgdHJhbnMtPnBlZXItPm1heGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3YWl0IGZvciBzcGFjZSB0byBhcHBlYXIgaW4gdGhlIHRyYW5zbWl0L0FDSyB3aW5kb3cKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgIGxvbmcgKnRpbWVvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJaW50IHJldDsKKworCV9lbnRlcigiLHslZH0sJWxkIiwKKwkgICAgICAgQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwgY2FsbC0+YWNrc193aW5zeiksCisJICAgICAgICp0aW1lbyk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOworCisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyZXQgPSAwOworCQlpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCSAgICAgICBjYWxsLT5hY2tzX3dpbnN6KSA+IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCQkqdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KCp0aW1lbyk7CisJCWxvY2tfc29jaygmcngtPnNrKTsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGF0dGVtcHQgdG8gc2NoZWR1bGUgYW4gaW5zdGFudCBUeCByZXNlbmQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2luc3RhbnRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKSA+PSAwKSB7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKSkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIHF1ZXVlIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHNldCB0aGUgcmVzZW5kIHRpbWVyIGFuZCBhdHRlbXB0CisgKiB0byBzZW5kIHRoZSBwYWNrZXQgaW1tZWRpYXRlbHkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcXVldWVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJaW50IHJldDsKKworCV9uZXQoInF1ZXVlIHNrYiAlcCBbJWRdIiwgc2tiLCBjYWxsLT5hY2tzX2hlYWQpOworCisJQVNTRVJUKGNhbGwtPmFja3Nfd2luZG93ICE9IE5VTEwpOworCWNhbGwtPmFja3Nfd2luZG93W2NhbGwtPmFja3NfaGVhZF0gPSAodW5zaWduZWQgbG9uZykgc2tiOworCXNtcF93bWIoKTsKKwljYWxsLT5hY2tzX2hlYWQgPSAoY2FsbC0+YWNrc19oZWFkICsgMSkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOworCisJaWYgKGxhc3QgfHwgY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QpIHsKKwkJX2RlYnVnKCJfX19fX19fX2F3YWl0aW5nIHJlcGx5L0FDS19fX19fX19fX18iKTsKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwkJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk7CisJCQlpZiAoIWxhc3QpCisJCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWToKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLAorCSAgICAgICBudG9obChzcC0+aGRyLnNlcmlhbCksIG50b2hsKHNwLT5oZHIuc2VxKSk7CisKKwlzcC0+bmVlZF9yZXNlbmQgPSAwOworCXNwLT5yZXNlbmRfYXQgPSBqaWZmaWVzICsgcnhycGNfcmVzZW5kX3RpbWVvdXQgKiBIWjsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9kZWJ1ZygicnVuIHRpbWVyIik7CisJCWNhbGwtPnJlc2VuZF90aW1lci5leHBpcmVzID0gc3AtPnJlc2VuZF9hdDsKKwkJYWRkX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCX0KKworCS8qIGF0dGVtcHQgdG8gY2FuY2VsIHRoZSByeC1BQ0sgdGltZXIsIGRlZmVycmluZyByZXBseSB0cmFuc21pc3Npb24gaWYKKwkgKiB3ZSdyZSBBQ0snaW5nIHRoZSByZXF1ZXN0IHBoYXNlIG9mIGFuIGluY29taW5nIGNhbGwgKi8KKwlyZXQgPSAtRUFHQUlOOworCWlmICh0cnlfdG9fZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcikgPj0gMCkgeworCQkvKiB0aGUgcGFja2V0IG1heSBiZSBmcmVlZCBieSByeHJwY19wcm9jZXNzX2NhbGwoKSBiZWZvcmUgdGhpcworCQkgKiByZXR1cm5zICovCisJCXJldCA9IHJ4cnBjX3NlbmRfcGFja2V0KGNhbGwtPmNvbm4tPnRyYW5zLCBza2IpOworCQlfbmV0KCJzZW50IHNrYiAlcCIsIHNrYik7CisJfSBlbHNlIHsKKwkJX2RlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIEFDSyB0aW1lciIpOworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7CisJCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBzZW5kIGRhdGEgdGhyb3VnaCBhIHNvY2tldAorICogLSBtdXN0IGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZF9kYXRhKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmZyb207CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaW92ZWMgKmlvdjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSAmcngtPnNrOworCWxvbmcgdGltZW87CisJYm9vbCBtb3JlOworCWludCByZXQsIGlvYywgc2VnbWVudCwgY29waWVkOworCisJX2VudGVyKCIsLCx7JXp1fSwlenUiLCBtc2ctPm1zZ19pb3ZsZW4sIGxlbik7CisKKwl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCS8qIHRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KKwljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJaWYgKHNrLT5za19lcnIgfHwgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pKQorCQlyZXR1cm4gLUVQSVBFOworCisJaW92ID0gbXNnLT5tc2dfaW92OworCWlvYyA9IG1zZy0+bXNnX2lvdmxlbiAtIDE7CisJZnJvbSA9IGlvdi0+aW92X2Jhc2U7CisJc2VnbWVudCA9IGlvdi0+aW92X2xlbjsKKwlpb3YrKzsKKwltb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKKworCXNrYiA9IGNhbGwtPnR4X3BlbmRpbmc7CisJY2FsbC0+dHhfcGVuZGluZyA9IE5VTEw7CisKKwljb3BpZWQgPSAwOworCWRvIHsKKwkJaW50IGNvcHk7CisKKwkJaWYgKHNlZ21lbnQgPiBsZW4pCisJCQlzZWdtZW50ID0gbGVuOworCisJCV9kZWJ1ZygiU0VHTUVOVCAlZCBAJXAiLCBzZWdtZW50LCBmcm9tKTsKKworCQlpZiAoIXNrYikgeworCQkJc2l6ZV90IHNpemUsIGNodW5rLCBtYXgsIHNwYWNlOworCisJCQlfZGVidWcoImFsbG9jIik7CisKKwkJCWlmIChDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLAorCQkJCSAgICAgICBjYWxsLT5hY2tzX3dpbnN6KSA8PSAwKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQpCisJCQkJCWdvdG8gbWF5YmVfZXJyb3I7CisJCQkJcmV0ID0gcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHJ4LCBjYWxsLAorCQkJCQkJCSAgICAgICAmdGltZW8pOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG1heWJlX2Vycm9yOworCQkJfQorCisJCQltYXggPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bWF4ZGF0YTsKKwkJCW1heCAtPSBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplOworCQkJbWF4ICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCWNodW5rID0gbWF4OworCQkJaWYgKGNodW5rID4gbGVuKQorCQkJCWNodW5rID0gbGVuOworCisJCQlzcGFjZSA9IGNodW5rICsgY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbjsKKwkJCXNwYWNlICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCXNpemUgPSBzcGFjZSArIGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplOworCisJCQlfZGVidWcoIlNJWkU6ICV6dS8lenUvJXp1IiwgY2h1bmssIHNwYWNlLCBzaXplKTsKKworCQkJLyogY3JlYXRlIGEgYnVmZmVyIHRoYXQgd2UgY2FuIHJldGFpbiB1bnRpbCBpdCdzIEFDSydkICovCisJCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKAorCQkJCXNrLCBzaXplLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJnJldCk7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIG1heWJlX2Vycm9yOworCisJCQlyeHJwY19uZXdfc2tiKHNrYik7CisKKwkJCV9kZWJ1ZygiQUxMT0MgU0VORCAlcCIsIHNrYik7CisKKwkJCUFTU0VSVENNUChza2ItPm1hcmssID09LCAwKTsKKworCQkJX2RlYnVnKCJIUzogJXUiLCBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZSk7CisJCQlza2JfcmVzZXJ2ZShza2IsIGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplKTsKKwkJCXNrYi0+bGVuICs9IGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplOworCisJCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCQkJc3AtPnJlbWFpbiA9IGNodW5rOworCQkJaWYgKHNwLT5yZW1haW4gPiBza2JfdGFpbHJvb20oc2tiKSkKKwkJCQlzcC0+cmVtYWluID0gc2tiX3RhaWxyb29tKHNrYik7CisKKwkJCV9uZXQoInNrYjogaHIgJWQsIHRyICVkLCBobCAlZCwgcm0gJWQiLAorCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IpLAorCQkJICAgICAgIHNrYl90YWlscm9vbShza2IpLAorCQkJICAgICAgIHNrYl9oZWFkbGVuKHNrYiksCisJCQkgICAgICAgc3AtPnJlbWFpbik7CisKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0KKworCQlfZGVidWcoImFwcGVuZCIpOworCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCS8qIGFwcGVuZCBuZXh0IHNlZ21lbnQgb2YgZGF0YSB0byB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJY29weSA9IHNrYl90YWlscm9vbShza2IpOworCQlBU1NFUlRDTVAoY29weSwgPiwgMCk7CisJCWlmIChjb3B5ID4gc2VnbWVudCkKKwkJCWNvcHkgPSBzZWdtZW50OworCQlpZiAoY29weSA+IHNwLT5yZW1haW4pCisJCQljb3B5ID0gc3AtPnJlbWFpbjsKKworCQlfZGVidWcoImFkZCIpOworCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCBmcm9tLCBjb3B5KTsKKwkJX2RlYnVnKCJhZGRlZCIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZWZhdWx0OworCQlzcC0+cmVtYWluIC09IGNvcHk7CisJCXNrYi0+bWFyayArPSBjb3B5OworCisJCWxlbiAtPSBjb3B5OworCQlzZWdtZW50IC09IGNvcHk7CisJCWZyb20gKz0gY29weTsKKwkJd2hpbGUgKHNlZ21lbnQgPT0gMCAmJiBpb2MgPiAwKSB7CisJCQlmcm9tID0gaW92LT5pb3ZfYmFzZTsKKwkJCXNlZ21lbnQgPSBpb3YtPmlvdl9sZW47CisJCQlpb3YrKzsKKwkJCWlvYy0tOworCQl9CisJCWlmIChsZW4gPT0gMCkgeworCQkJc2VnbWVudCA9IDA7CisJCQlpb2MgPSAwOworCQl9CisKKwkJLyogY2hlY2sgZm9yIHRoZSBmYXIgc2lkZSBhYm9ydGluZyB0aGUgY2FsbCBvciBhIG5ldHdvcmsgZXJyb3IKKwkJICogb2NjdXJyaW5nICovCisJCWlmIChjYWxsLT5zdGF0ZSA+IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCQlnb3RvIGNhbGxfYWJvcnRlZDsKKworCQkvKiBhZGQgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBxdWV1ZSBpZiBpdCdzIG5vdyBmdWxsICovCisJCWlmIChzcC0+cmVtYWluIDw9IDAgfHwgKHNlZ21lbnQgPT0gMCAmJiAhbW9yZSkpIHsKKwkJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwkJCXNpemVfdCBwYWQ7CisKKwkJCS8qIHBhZCBvdXQgaWYgd2UncmUgdXNpbmcgc2VjdXJpdHkgKi8KKwkJCWlmIChjb25uLT5zZWN1cml0eSkgeworCQkJCXBhZCA9IGNvbm4tPnNlY3VyaXR5X3NpemUgKyBza2ItPm1hcms7CisJCQkJcGFkID0gY29ubi0+c2l6ZV9hbGlnbiAtIHBhZDsKKwkJCQlwYWQgJj0gY29ubi0+c2l6ZV9hbGlnbiAtIDE7CisJCQkJX2RlYnVnKCJwYWQgJXp1IiwgcGFkKTsKKwkJCQlpZiAocGFkKQorCQkJCQltZW1zZXQoc2tiX3B1dChza2IsIHBhZCksIDAsIHBhZCk7CisJCQl9CisKKwkJCXNwLT5oZHIuZXBvY2ggPSBjb25uLT5lcG9jaDsKKwkJCXNwLT5oZHIuY2lkID0gY2FsbC0+Y2lkOworCQkJc3AtPmhkci5jYWxsTnVtYmVyID0gY2FsbC0+Y2FsbF9pZDsKKwkJCXNwLT5oZHIuc2VxID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+c2VxdWVuY2UpKTsKKwkJCXNwLT5oZHIuc2VyaWFsID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKSk7CisJCQlzcC0+aGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOworCQkJc3AtPmhkci51c2VyU3RhdHVzID0gMDsKKwkJCXNwLT5oZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCQkJc3AtPmhkci5fcnN2ZCA9IDA7CisJCQlzcC0+aGRyLnNlcnZpY2VJZCA9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwkJCXNwLT5oZHIuZmxhZ3MgPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKKwkJCWlmIChsZW4gPT0gMCAmJiAhbW9yZSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOworCQkJZWxzZSBpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCQkJICAgIGNhbGwtPmFja3Nfd2luc3opID4gMSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX01PUkVfUEFDS0VUUzsKKworCQkJcmV0ID0gcnhycGNfc2VjdXJlX3BhY2tldCgKKwkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywKKwkJCQlza2ItPmhlYWQgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcikpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisKKwkJCW1lbWNweShza2ItPmhlYWQsICZzcC0+aGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSk7CisJCQlyeHJwY19xdWV1ZV9wYWNrZXQoY2FsbCwgc2tiLCBzZWdtZW50ID09IDAgJiYgIW1vcmUpOworCQkJc2tiID0gTlVMTDsKKwkJfQorCisJfSB3aGlsZSAoc2VnbWVudCA+IDApOworCitvdXQ6CisJY2FsbC0+dHhfcGVuZGluZyA9IHNrYjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjYWxsX2Fib3J0ZWQ6CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SKQorCQlyZXQgPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bmV0X2Vycm9yOworCWVsc2UKKwkJcmV0ID0gLUVDT05OQUJPUlRFRDsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCittYXliZV9lcnJvcjoKKwlpZiAoY29waWVkKQorCQlyZXQgPSBjb3BpZWQ7CisJZ290byBvdXQ7CisKK2VmYXVsdDoKKwlyZXQgPSAtRUZBVUxUOworCWdvdG8gb3V0OworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXBlZXIuYyBiL25ldC9yeHJwYy9hci1wZWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5OWRlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1wZWVyLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIFJ4UlBDIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3BlZXJzKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ4cnBjX3BlZXJfbG9jayk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfcGVlcl93cSk7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcGVlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgcGVlcgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2FsbG9jX3BlZXIoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCisJCQkJCSAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKworCV9lbnRlcigiIik7CisKKwlwZWVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX3BlZXIpLCBnZnApOworCWlmIChwZWVyKSB7CisJCUlOSVRfV09SSygmcGVlci0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9wZWVyKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmxpbmspOworCQlJTklUX0xJU1RfSEVBRCgmcGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJCXNwaW5fbG9ja19pbml0KCZwZWVyLT5sb2NrKTsKKwkJYXRvbWljX3NldCgmcGVlci0+dXNhZ2UsIDEpOworCQlwZWVyLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7CisJCW1lbWNweSgmcGVlci0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7CisKKwkJcGVlci0+bXR1ID0gcGVlci0+aWZfbXR1ID0gNjU1MzU7CisKKwkJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0X3R5cGUpIHsKKwkJCWNhc2UgU09DS19ER1JBTToKKwkJCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCisJCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCByeHJwY19oZWFkZXIpOworCQlwZWVyLT5tYXhkYXRhID0gcGVlci0+bXR1IC0gcGVlci0+aGRyc2l6ZTsKKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgcGVlcik7CisJcmV0dXJuIHBlZXI7Cit9CisKKy8qCisgKiBvYnRhaW4gYSByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50IGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3MKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2dldF9wZWVyKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LCBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICpjYW5kaWRhdGU7CisJY29uc3QgY2hhciAqbmV3ID0gIm9sZCI7CisJaW50IHVzYWdlOworCisJX2VudGVyKCJ7JWQsJWQsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X2xlbiwKKwkgICAgICAgTklQUVVBRChzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCS8qIHNlYXJjaCB0aGUgcGVlciBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJnJ4cnBjX3BlZXJzLCBsaW5rKSB7CisJCV9kZWJ1ZygiY2hlY2sgUEVFUiAlZCB7IHU9JWQgdD0lZCBsPSVkIH0iLAorCQkgICAgICAgcGVlci0+ZGVidWdfaWQsCisJCSAgICAgICBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpLAorCQkgICAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAorCQkgICAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF9sZW4pOworCisJCWlmIChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpID4gMCAmJgorCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlID09IHNyeC0+dHJhbnNwb3J0X3R5cGUgJiYKKwkJICAgIHBlZXItPnNyeC50cmFuc3BvcnRfbGVuID09IHNyeC0+dHJhbnNwb3J0X2xlbiAmJgorCQkgICAgbWVtY21wKCZwZWVyLT5zcngudHJhbnNwb3J0LAorCQkJICAgJnNyeC0+dHJhbnNwb3J0LAorCQkJICAgc3J4LT50cmFuc3BvcnRfbGVuKSA9PSAwKQorCQkJZ290byBmb3VuZF9leHRhbnRfcGVlcjsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnJ4cnBjX3BlZXJfbG9jayk7CisKKwkvKiBub3QgeWV0IHByZXNlbnQgLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IHJlY29yZCBhbmQgdGhlbgorCSAqIHJlZG8gdGhlIHNlYXJjaCAqLworCWNhbmRpZGF0ZSA9IHJ4cnBjX2FsbG9jX3BlZXIoc3J4LCBnZnApOworCWlmICghY2FuZGlkYXRlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmcnhycGNfcGVlcnMsIGxpbmspIHsKKwkJaWYgKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPiAwICYmCisJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUgPT0gc3J4LT50cmFuc3BvcnRfdHlwZSAmJgorCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydF9sZW4gPT0gc3J4LT50cmFuc3BvcnRfbGVuICYmCisJCSAgICBtZW1jbXAoJnBlZXItPnNyeC50cmFuc3BvcnQsCisJCQkgICAmc3J4LT50cmFuc3BvcnQsCisJCQkgICBzcngtPnRyYW5zcG9ydF9sZW4pID09IDApCisJCQlnb3RvIGZvdW5kX2V4dGFudF9zZWNvbmQ7CisJfQorCisJLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QgKi8KKwlwZWVyID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKwlsaXN0X2FkZF90YWlsKCZwZWVyLT5saW5rLCAmcnhycGNfcGVlcnMpOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwluZXcgPSAibmV3IjsKKworc3VjY2VzczoKKwlfbmV0KCJQRUVSICVzICVkIHslZCwldSwldS4ldS4ldS4ldSslaHV9IiwKKwkgICAgIG5ldywKKwkgICAgIHBlZXItPmRlYnVnX2lkLAorCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAorCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCisJICAgICBOSVBRVUFEKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkgICAgIG50b2hzKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOworCXJldHVybiBwZWVyOworCisJLyogd2UgZm91bmQgdGhlIHBlZXIgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9wZWVyOgorCXVzYWdlID0gYXRvbWljX2luY19yZXR1cm4oJnBlZXItPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCB0aGUgcGVlciBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZwZWVyLT51c2FnZSk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworfQorCisvKgorICogZmluZCB0aGUgcGVlciBhc3NvY2lhdGVkIHdpdGggYSBwYWNrZXQKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2ZpbmRfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCSAgIF9fYmUzMiBhZGRyLCBfX2JlMTYgcG9ydCkKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKworCV9lbnRlcigiIik7CisKKwkvKiBzZWFyY2ggdGhlIHBlZXIgbGlzdCAqLworCXJlYWRfbG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKworCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHkgPT0gQUZfSU5FVCAmJgorCSAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlID09IFNPQ0tfREdSQU0KKwkgICAgKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJnJ4cnBjX3BlZXJzLCBsaW5rKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSA+IDAgJiYKKwkJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUgPT0gU09DS19ER1JBTSAmJgorCQkJICAgIHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQgJiYKKwkJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCA9PSBwb3J0ICYmCisJCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyID09IGFkZHIpCisJCQkJZ290byBmb3VuZF9VRFBfcGVlcjsKKwkJfQorCisJCWdvdG8gbmV3X1VEUF9wZWVyOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCV9sZWF2ZSgiID0gLUVBRk5PU1VQUE9SVCIpOworCXJldHVybiBFUlJfUFRSKC1FQUZOT1NVUFBPUlQpOworCitmb3VuZF9VRFBfcGVlcjoKKwlfbmV0KCJSeCBVRFAgREdSQU0gZnJvbSBwZWVyICVkIiwgcGVlci0+ZGVidWdfaWQpOworCWF0b21pY19pbmMoJnBlZXItPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIiwgcGVlcik7CisJcmV0dXJuIHBlZXI7CisKK25ld19VRFBfcGVlcjoKKwlfbmV0KCJSeCBVRFAgREdSQU0gZnJvbSBORVcgcGVlciAlZCIsIHBlZXItPmRlYnVnX2lkKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlfbGVhdmUoIiA9IC1FQlVTWSBbbmV3XSIpOworCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Cit9CisKKy8qCisgKiByZWxlYXNlIGEgcmVtb3RlIHRyYW5zcG9ydCBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX3B1dF9wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQoreworCV9lbnRlcigiJXB7dT0lZH0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKKworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpLCA+LCAwKTsKKworCWlmIChsaWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnBlZXItPnVzYWdlKSkpIHsKKwkJX2xlYXZlKCIgW2luIHVzZV0iKTsKKwkJcmV0dXJuOworCX0KKworCXJ4cnBjX3F1ZXVlX3dvcmsoJnBlZXItPmRlc3Ryb3llcik7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlc3Ryb3kgYSByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcGVlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ4cnBjX3BlZXIsIGRlc3Ryb3llcik7CisKKwlfZW50ZXIoIiVweyVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlsaXN0X2RlbCgmcGVlci0+bGluayk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCisJX25ldCgiREVTVFJPWSBQRUVSICVkIiwgcGVlci0+ZGVidWdfaWQpOworCWtmcmVlKHBlZXIpOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX3BlZXJzKSkKKwkJd2FrZV91cF9hbGwoJnJ4cnBjX3BlZXJfd3EpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBwcmVlbXB0aXZlbHkgZGVzdHJveSBhbGwgdGhlIHBlZXIgcmVjb3JkcyBmcm9tIGEgdHJhbnNwb3J0IGVuZHBvaW50IHJhdGhlcgorICogdGhhbiB3YWl0aW5nIGZvciB0aGVtIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3BlZXJzKHZvaWQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLGN1cnJlbnQpOworCisJX2VudGVyKCIiKTsKKworCS8qIHdlIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZW0gdG8gZ28gYXdheSAqLworCWlmICghbGlzdF9lbXB0eSgmcnhycGNfcGVlcnMpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX3BlZXJfd3EsICZteXNlbGYpOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfcGVlcnMpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl9CisKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJ4cnBjX3BlZXJfd3EsICZteXNlbGYpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItcHJvYy5jIGIvbmV0L3J4cnBjL2FyLXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0YjRlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL2FyLXByb2MuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogL3Byb2MvbmV0LyBzdXBwb3J0IGZvciBBRl9SWFJQQworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqcnhycGNfY29ubl9zdGF0ZXNbXSA9IHsKKwlbUlhSUENfQ09OTl9VTlVTRURdCQk9ICJVbnVzZWQgICIsCisJW1JYUlBDX0NPTk5fQ0xJRU5UXQkJPSAiQ2xpZW50ICAiLAorCVtSWFJQQ19DT05OX1NFUlZFUl9VTlNFQ1VSRURdCT0gIlN2VW5zZWMgIiwKKwlbUlhSUENfQ09OTl9TRVJWRVJfQ0hBTExFTkdJTkddCT0gIlN2Q2hhbGwgIiwKKwlbUlhSUENfQ09OTl9TRVJWRVJdCQk9ICJTdlNlY3VyZSIsCisJW1JYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRF0JPSAiUm10QWJvcnQiLAorCVtSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRF0JPSAiTG9jQWJvcnQiLAorCVtSWFJQQ19DT05OX05FVFdPUktfRVJST1JdCT0gIk5ldEVycm9yIiwKK307CisKK2NvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW10gPSB7CisJW1JYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVF0JPSAiQ2xTbmRSZXEiLAorCVtSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWV0JCT0gIkNsQXd0UnBsIiwKKwlbUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWV0JCT0gIkNsUmN2UnBsIiwKKwlbUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLXQkJPSAiQ2xGbmxBQ0siLAorCVtSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklOR10JCT0gIlN2U2VjdXJlIiwKKwlbUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HXQkJPSAiU3ZBY2NlcHQiLAorCVtSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1RdCT0gIlN2UmN2UmVxIiwKKwlbUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1RdCQk9ICJTdkFja1JlcSIsCisJW1JYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFldCQk9ICJTdlNuZFJwbCIsCisJW1JYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDS10JCT0gIlN2QXd0QUNLIiwKKwlbUlhSUENfQ0FMTF9DT01QTEVURV0JCQk9ICJDb21wbGV0ZSIsCisJW1JYUlBDX0NBTExfU0VSVkVSX0JVU1ldCQk9ICJTdkJ1c3kgICIsCisJW1JYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRF0JCT0gIlJtdEFib3J0IiwKKwlbUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURURdCQk9ICJMb2NBYm9ydCIsCisJW1JYUlBDX0NBTExfTkVUV09SS19FUlJPUl0JCT0gIk5ldEVycm9yIiwKKwlbUlhSUENfQ0FMTF9ERUFEXQkJCT0gIkRlYWQgICAgIiwKK307CisKKy8qCisgKiBnZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0YW50IGFuZCBkZWFkIGNhbGxzIGluIC9wcm9jL25ldC9yeHJwY19jYWxscworICovCitzdGF0aWMgdm9pZCAqcnhycGNfY2FsbF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlsb2ZmX3QgcG9zID0gKl9wb3M7CisKKwlyZWFkX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJaWYgKCFwb3MpCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJcG9zLS07CisKKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfY2FsbHMpCisJCWlmICghcG9zLS0pCisJCQlicmVhazsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY2FsbHMgPyBfcCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpyeHJwY19jYWxsX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKworCSgqcG9zKSsrOworCisJX3AgPSB2OworCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX2NhbGxzLm5leHQgOiBfcC0+bmV4dDsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY2FsbHMgPyBfcCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcnhycGNfY2FsbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwljaGFyIGxidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV0sIHJidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV07CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgIFJlbW90ZSAgICAgICAgICAgICAgICAiCisJCQkgIiBTdklEIENvbm5JRCAgIENhbGxJRCAgIEVuZCBVc2UgU3RhdGUgICAgQWJvcnQgICAiCisJCQkgIiBVc2VySURcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgbGluayk7CisJdHJhbnMgPSBjYWxsLT5jb25uLT50cmFuczsKKworCXNwcmludGYobGJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJCW50b2hzKHRyYW5zLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCXNwcmludGYocmJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkJbnRvaHModHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiICUtOC44cyAlMDh4ICVseFxuIiwKKwkJICAgbGJ1ZmYsCisJCSAgIHJidWZmLAorCQkgICBudG9ocyhjYWxsLT5jb25uLT5zZXJ2aWNlX2lkKSwKKwkJICAgbnRvaGwoY2FsbC0+Y29ubi0+Y2lkKSwKKwkJICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCksCisJCSAgIGNhbGwtPmNvbm4tPmluX2NsaWVudGZsYWcgPyAiU3ZjIiA6ICJDbHQiLAorCQkgICBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkgICByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sCisJCSAgIGNhbGwtPmFib3J0X2NvZGUsCisJCSAgIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHJ4cnBjX2NhbGxfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSByeHJwY19jYWxsX3NlcV9uZXh0LAorCS5zdG9wICAgPSByeHJwY19jYWxsX3NlcV9zdG9wLAorCS5zaG93ICAgPSByeHJwY19jYWxsX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCByeHJwY19jYWxsX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcnhycGNfY2FsbF9zZXFfb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSByeHJwY19jYWxsX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKy8qCisgKiBnZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0YW50IHZpcnR1YWwgY29ubmVjdGlvbnMgaW4gL3Byb2MvbmV0L3J4cnBjX2Nvbm5zCisgKi8KK3N0YXRpYyB2b2lkICpyeHJwY19jb25uZWN0aW9uX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCXJlYWRfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlwb3MtLTsKKworCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19jb25uZWN0aW9ucykKKwkJaWYgKCFwb3MtLSkKKwkJCWJyZWFrOworCisJcmV0dXJuIF9wICE9ICZyeHJwY19jb25uZWN0aW9ucyA/IF9wIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsCisJCQkJICAgICAgIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJKCpwb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcnhycGNfY29ubmVjdGlvbnMubmV4dCA6IF9wLT5uZXh0OworCisJcmV0dXJuIF9wICE9ICZyeHJwY19jb25uZWN0aW9ucyA/IF9wIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKK30KKworc3RhdGljIGludCByeHJwY19jb25uZWN0aW9uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCWNoYXIgbGJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXSwgcmJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsCisJCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgUmVtb3RlICAgICAgICAgICAgICAgICIKKwkJCSAiIFN2SUQgQ29ubklEICAgQ2FsbHMgICAgRW5kIFVzZSBTdGF0ZSAgICBLZXkgICAgICIKKwkJCSAiIFNlcmlhbCAgIElTZXJpYWxcbiIKKwkJCSApOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25uID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7CisJdHJhbnMgPSBjb25uLT50cmFuczsKKworCXNwcmludGYobGJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJCW50b2hzKHRyYW5zLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCXNwcmludGYocmJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkJbnRvaHModHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiICVzICUwOHggJTA4eCAlMDh4XG4iLAorCQkgICBsYnVmZiwKKwkJICAgcmJ1ZmYsCisJCSAgIG50b2hzKGNvbm4tPnNlcnZpY2VfaWQpLAorCQkgICBudG9obChjb25uLT5jaWQpLAorCQkgICBjb25uLT5jYWxsX2NvdW50ZXIsCisJCSAgIGNvbm4tPmluX2NsaWVudGZsYWcgPyAiU3ZjIiA6ICJDbHQiLAorCQkgICBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkgICByeHJwY19jb25uX3N0YXRlc1tjb25uLT5zdGF0ZV0sCisJCSAgIGtleV9zZXJpYWwoY29ubi0+a2V5KSwKKwkJICAgYXRvbWljX3JlYWQoJmNvbm4tPnNlcmlhbCksCisJCSAgIGF0b21pY19yZWFkKCZjb25uLT5oaV9zZXJpYWwpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gcnhycGNfY29ubmVjdGlvbl9zZXFfc3RhcnQsCisJLm5leHQgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX25leHQsCisJLnN0b3AgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3N0b3AsCisJLnNob3cgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3Nob3csCit9OworCisKK3N0YXRpYyBpbnQgcnhycGNfY29ubmVjdGlvbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX29wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfY29ubmVjdGlvbl9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcnhycGNfY29ubmVjdGlvbl9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5MTIxZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qIFJ4UlBDIHJlY3Ztc2coKSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogcmVtb3ZhbCBhIGNhbGwncyB1c2VyIElEIGZyb20gdGhlIHNvY2tldCB0cmVlIHRvIG1ha2UgdGhlIHVzZXIgSUQgYXZhaWxhYmxlCisgKiBhZ2FpbiBhbmQgc28gdGhhdCBpdCB3b24ndCBiZSBzZWVuIGFnYWluIGluIGFzc29jaWF0aW9uIHdpdGggdGhhdCBjYWxsCisgKi8KK3ZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlfZGVidWcoIlJFTEVBU0UgQ0FMTCAlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKKwkJd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZjYWxsLT5zb2NrZXQtPmNhbGxzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYW4gUnhSUEMgc29ja2V0CisgKiAtIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB0d28gb3IgbW9yZSB0aHJlYWRzIGNhbGxpbmcgcmVjdm1zZworICogICBzaW11bHRhbmVvdXNseQorICovCitpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IE5VTEwsICpjb250aW51ZV9jYWxsID0gTlVMTDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlsb25nIHRpbWVvOworCWludCBjb3B5LCByZXQsIHVsbGVuLCBvZmZzZXQsIGNvcGllZCA9IDA7CisJdTMyIGFib3J0X2NvZGU7CisKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCV9lbnRlcigiLCwsJXp1LCVkIiwgbGVuLCBmbGFncyk7CisKKwlpZiAoZmxhZ3MgJiAoTVNHX09PQiB8IE1TR19UUlVOQykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXVsbGVuID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQgPyA0IDogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKCZyeC0+c2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKwltc2ctPm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWZvciAoOzspIHsKKwkJLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIGEgY2xpZW50IHNvY2tldCBoYXMgbm8gb3V0c3RhbmRpbmcKKwkJICogY2FsbHMgKi8KKwkJaWYgKFJCX0VNUFRZX1JPT1QoJnJ4LT5jYWxscykpIHsKKwkJCWlmIChjb3BpZWQpCisJCQkJZ290byBvdXQ7CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpIHsKKwkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQkJaWYgKGNvbnRpbnVlX2NhbGwpCisJCQkJCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOworCQkJCXJldHVybiAtRU5PREFUQTsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgbmV4dCBtZXNzYWdlIG9uIHRoZSBSeCBxdWV1ZSAqLworCQlza2IgPSBza2JfcGVlaygmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoIXNrYikgeworCQkJLyogbm90aGluZyByZW1haW5zIG9uIHRoZSBxdWV1ZSAqLworCQkJaWYgKGNvcGllZCAmJgorCQkJICAgIChtc2ctPm1zZ19mbGFncyAmIE1TR19QRUVLIHx8IHRpbWVvID09IDApKQorCQkJCWdvdG8gb3V0OworCisJCQkvKiB3YWl0IGZvciBhIG1lc3NhZ2UgdG8gdHVybiB1cCAqLworCQkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCQkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShyeC0+c2suc2tfc2xlZXAsICZ3YWl0LAorCQkJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcmV0ID0gc29ja19lcnJvcigmcngtPnNrKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byB3YWl0X2Vycm9yOworCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWdvdG8gd2FpdF9pbnRlcnJ1cHRlZDsKKwkJCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCQkJfQorCQkJZmluaXNoX3dhaXQocngtPnNrLnNrX3NsZWVwLCAmd2FpdCk7CisJCQlsb2NrX3NvY2soJnJ4LT5zayk7CisJCQljb250aW51ZTsKKwkJfQorCisJcGVla19uZXh0X3BhY2tldDoKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJY2FsbCA9IHNwLT5jYWxsOworCQlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKKworCQlfZGVidWcoIm5leHQgcGt0ICVzIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdKTsKKworCQkvKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQgaW4gdGhpcyBjYWxsICovCisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkgeworCQkJX2RlYnVnKCJwYWNrZXQgZnJvbSByZWxlYXNlZCBjYWxsIik7CisJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQkJQlVHKCk7CisJCQlyeHJwY19mcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgd2hldGhlciB0byBjb250aW51ZSBsYXN0IGRhdGEgcmVjZWl2ZSAqLworCQlpZiAoY29udGludWVfY2FsbCkgeworCQkJX2RlYnVnKCJtYXliZSBjb250Iik7CisJCQlpZiAoY2FsbCAhPSBjb250aW51ZV9jYWxsIHx8CisJCQkgICAgc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpIHsKKwkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJCQkJX2xlYXZlKCIgPSAlZCBbbm9uY29udF0iLCBjb3BpZWQpOworCQkJCXJldHVybiBjb3BpZWQ7CisJCQl9CisJCX0KKworCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCQkvKiBjb3B5IHRoZSBwZWVyIGFkZHJlc3MgYW5kIHRpbWVzdGFtcCAqLworCQlpZiAoIWNvbnRpbnVlX2NhbGwpIHsKKwkJCWlmIChtc2ctPm1zZ19uYW1lICYmIG1zZy0+bXNnX25hbWVsZW4gPiAwKQorCQkJCW1lbWNweSgmbXNnLT5tc2dfbmFtZSwgJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5zcngsCisJCQkJICAgICAgIHNpemVvZihjYWxsLT5jb25uLT50cmFucy0+cGVlci0+c3J4KSk7CisJCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgJnJ4LT5zaywgc2tiKTsKKwkJfQorCisJCS8qIHJlY2VpdmUgdGhlIG1lc3NhZ2UgKi8KKwkJaWYgKHNrYi0+bWFyayAhPSBSWFJQQ19TS0JfTUFSS19EQVRBKQorCQkJZ290byByZWNlaXZlX25vbl9kYXRhX21lc3NhZ2U7CisKKwkJX2RlYnVnKCJyZWN2bXNnIERBVEEgIyV1IHsgJWQsICVkIH0iLAorCQkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpLCBza2ItPmxlbiwgc3AtPm9mZnNldCk7CisKKwkJaWYgKCFjb250aW51ZV9jYWxsKSB7CisJCQkvKiBvbmx5IHNldCB0aGUgY29udHJvbCBkYXRhIG9uY2UgcGVyIHJlY3Ztc2coKSAqLworCQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKKwkJCQkgICAgICAgdWxsZW4sICZjYWxsLT51c2VyX2NhbGxfSUQpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBjb3B5X2Vycm9yOworCQkJQVNTRVJUKHRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7CisJCX0KKworCQlBU1NFUlRDTVAobnRvaGwoc3AtPmhkci5zZXEpLCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKKwkJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPD0sIGNhbGwtPnJ4X2RhdGFfcmVjdiArIDEpOworCQljYWxsLT5yeF9kYXRhX3JlY3YgPSBudG9obChzcC0+aGRyLnNlcSk7CisKKwkJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPiwgY2FsbC0+cnhfZGF0YV9lYXRlbik7CisKKwkJb2Zmc2V0ID0gc3AtPm9mZnNldDsKKwkJY29weSA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCQlpZiAoY29weSA+IGxlbiAtIGNvcGllZCkKKwkJCWNvcHkgPSBsZW4gLSBjb3BpZWQ7CisKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCQlyZXQgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIG9mZnNldCwKKwkJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29weSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIG9mZnNldCwKKwkJCQkJCQkgICAgICAgbXNnLT5tc2dfaW92KTsKKwkJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCQlnb3RvIGNzdW1fY29weV9lcnJvcjsKKwkJfQorCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBjb3B5X2Vycm9yOworCisJCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCisJCV9kZWJ1ZygiY29waWVkICVkKyVkIiwgY29weSwgY29waWVkKTsKKworCQlvZmZzZXQgKz0gY29weTsKKwkJY29waWVkICs9IGNvcHk7CisKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlzcC0+b2Zmc2V0ID0gb2Zmc2V0OworCisJCWlmIChzcC0+b2Zmc2V0IDwgc2tiLT5sZW4pIHsKKwkJCV9kZWJ1ZygiYnVmZmVyIGZ1bGwiKTsKKwkJCUFTU0VSVENNUChjb3BpZWQsID09LCBsZW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3ZSB0cmFuc2ZlcnJlZCB0aGUgd2hvbGUgZGF0YSBwYWNrZXQgKi8KKwkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQkJX2RlYnVnKCJsYXN0Iik7CisJCQlpZiAoY2FsbC0+Y29ubi0+b3V0X2NsaWVudGZsYWcpIHsKKwkJCQkgLyogbGFzdCBieXRlIG9mIHJlcGx5IHJlY2VpdmVkICovCisJCQkJcmV0ID0gY29waWVkOworCQkJCWdvdG8gdGVybWluYWxfbWVzc2FnZTsKKwkJCX0KKworCQkJLyogbGFzdCBiaXQgb2YgcmVxdWVzdCByZWNlaXZlZCAqLworCQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJCQlfZGVidWcoImVhdCBwYWNrZXQiKTsKKwkJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPQorCQkJCSAgICBza2IpCisJCQkJCUJVRygpOworCQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCQltc2ctPm1zZ19mbGFncyAmPSB+TVNHX01PUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZGF0YSBtZXNzYWdlICovCisJCV9kZWJ1ZygibmV4dCIpOworCQlpZiAoIWNvbnRpbnVlX2NhbGwpCisJCQljb250aW51ZV9jYWxsID0gc3AtPmNhbGw7CisJCWVsc2UKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQljYWxsID0gTlVMTDsKKworCQlpZiAoZmxhZ3MgJiBNU0dfUEVFSykgeworCQkJX2RlYnVnKCJwZWVrIG5leHQiKTsKKwkJCXNrYiA9IHNrYi0+bmV4dDsKKwkJCWlmIChza2IgPT0gKHN0cnVjdCBza19idWZmICopICZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkKKwkJCQlicmVhazsKKwkJCWdvdG8gcGVla19uZXh0X3BhY2tldDsKKwkJfQorCisJCV9kZWJ1ZygiZWF0IHBhY2tldCIpOworCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQlCVUcoKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKiBlbmQgb2Ygbm9uLXRlcm1pbmFsIGRhdGEgcGFja2V0IHJlY2VwdGlvbiBmb3IgdGhlIG1vbWVudCAqLworCV9kZWJ1ZygiZW5kIHJjdiBkYXRhIik7CitvdXQ6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCWlmIChjYWxsKQorCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJX2xlYXZlKCIgPSAlZCBbZGF0YV0iLCBjb3BpZWQpOworCXJldHVybiBjb3BpZWQ7CisKKwkvKiBoYW5kbGUgbm9uLURBVEEgbWVzc2FnZXMgc3VjaCBhcyBhYm9ydHMsIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZAorCSAqIGZpbmFsIEFDS3MgKi8KK3JlY2VpdmVfbm9uX2RhdGFfbWVzc2FnZToKKwlfZGVidWcoIm5vbi1kYXRhIik7CisKKwlpZiAoc2tiLT5tYXJrID09IFJYUlBDX1NLQl9NQVJLX05FV19DQUxMKSB7CisJCV9kZWJ1ZygiUkVDViBORVcgQ0FMTCIpOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVXX0NBTEwsIDAsICZhYm9ydF9jb2RlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGNvcHlfZXJyb3I7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQkJQlVHKCk7CisJCQlyeHJwY19mcmVlX3NrYihza2IpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCisJCSAgICAgICB1bGxlbiwgJmNhbGwtPnVzZXJfY2FsbF9JRCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY29weV9lcnJvcjsKKwlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKTsKKworCXN3aXRjaCAoc2tiLT5tYXJrKSB7CisJY2FzZSBSWFJQQ19TS0JfTUFSS19EQVRBOgorCQlCVUcoKTsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSzoKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FDSywgMCwgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0JVU1k6CisJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19CVVNZLCAwLCAmYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgorCQlhYm9ydF9jb2RlID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0tCX01BUktfTkVUX0VSUk9SOgorCQlfZGVidWcoIlJFQ1YgTkVUIEVSUk9SICVkIiwgc3AtPmVycm9yKTsKKwkJYWJvcnRfY29kZSA9IHNwLT5lcnJvcjsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FVF9FUlJPUiwgNCwgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOgorCQlfZGVidWcoIlJFQ1YgTE9DQUwgRVJST1IgJWQiLCBzcC0+ZXJyb3IpOworCQlhYm9ydF9jb2RlID0gc3AtPmVycm9yOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTE9DQUxfRVJST1IsIDQsCisJCQkgICAgICAgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCWdvdG8gY29weV9lcnJvcjsKKwordGVybWluYWxfbWVzc2FnZToKKwlfZGVidWcoInRlcm1pbmFsIik7CisJbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19NT1JFOworCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7CisKKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQlfbmV0KCJmcmVlIHRlcm1pbmFsIHNrYiAlcCIsIHNrYik7CisJCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKKwkJCUJVRygpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19yZW1vdmVfdXNlcl9JRChyeCwgY2FsbCk7CisJfQorCisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCWlmIChjb250aW51ZV9jYWxsKQorCQlyeHJwY19wdXRfY2FsbChjb250aW51ZV9jYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjb3B5X2Vycm9yOgorCV9kZWJ1ZygiY29weSBlcnJvciIpOworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworY3N1bV9jb3B5X2Vycm9yOgorCV9kZWJ1ZygiY3N1bSBlcnJvciIpOworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJcnhycGNfa2lsbF9za2Ioc2tiKTsKKwlza2Jfa2lsbF9kYXRhZ3JhbSgmcngtPnNrLCBza2IsIGZsYWdzKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlyZXR1cm4gLUVBR0FJTjsKKword2FpdF9pbnRlcnJ1cHRlZDoKKwlyZXQgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOword2FpdF9lcnJvcjoKKwlmaW5pc2hfd2FpdChyeC0+c2suc2tfc2xlZXAsICZ3YWl0KTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJaWYgKGNvcGllZCkKKwkJY29waWVkID0gcmV0OworCV9sZWF2ZSgiID0gJWQgW3dhaXRmYWlsICVkXSIsIGNvcGllZCwgcmV0KTsKKwlyZXR1cm4gY29waWVkOworCit9CisKKy8qKgorICogcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkIC0gUmVjb3JkIGRlbGl2ZXJ5IG9mIGRhdGEgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqCisgKiBSZWNvcmQgdGhlIGRlbGl2ZXJ5IG9mIGEgZGF0YSBtZXNzYWdlLiAgVGhpcyBwZXJtaXRzIFJ4UlBDIHRvIGtlZXAgaXRzCisgKiB0cmFja2luZyBjb3JyZWN0LiAgVGhlIHNvY2tldCBidWZmZXIgd2lsbCBiZSBkZWxldGVkLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IHNwLT5jYWxsOworCisJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7CisJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPD0sIGNhbGwtPnJ4X2RhdGFfcmVjdiArIDEpOworCWNhbGwtPnJ4X2RhdGFfcmVjdiA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKworCUFTU0VSVENNUChudG9obChzcC0+aGRyLnNlcSksID4sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0IC0gRGV0ZXJtaW5lIGlmIGRhdGEgbWVzc2FnZSBpcyBsYXN0IG9uZQorICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqCisgKiBEZXRlcm1pbmUgaWYgZGF0YSBtZXNzYWdlIGlzIGxhc3Qgb25lIGZvciB0aGUgcGFyZW50IGNhbGwuCisgKi8KK2Jvb2wgcnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKworCUFTU0VSVENNUChza2ItPm1hcmssID09LCBSWFJQQ19TS0JfTUFSS19EQVRBKTsKKworCXJldHVybiBzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQ7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdCk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlIC0gR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gUnhSUEMgYWJvcnQgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBpbmRpY2F0aW5nIGFuIGFib3J0CisgKgorICogR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gUnhSUEMgYWJvcnQgbWVzc2FnZS4KKyAqLwordTMyIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKworCUFTU0VSVENNUChza2ItPm1hcmssID09LCBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQpOworCisJcmV0dXJuIHNwLT5jYWxsLT5hYm9ydF9jb2RlOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZSk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2dldF9lcnJvciAtIEdldCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYW4gUnhSUEMgZXJyb3IgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBpbmRpY2F0aW5nIGFuIGVycm9yCisgKgorICogR2V0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhbiBSeFJQQyBlcnJvciBtZXNzYWdlLgorICovCitpbnQgcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisKKwlyZXR1cm4gc3AtPmVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1zZWN1cml0eS5jIGIvbmV0L3J4cnBjL2FyLXNlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMWQzNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1zZWN1cml0eS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiBSeFJQQyBzZWN1cml0eSBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3NlY3VyaXR5X21ldGhvZHMpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocnhycGNfc2VjdXJpdHlfc2VtKTsKKworLyoKKyAqIGdldCBhbiBSeFJQQyBzZWN1cml0eSBtb2R1bGUKKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19zZWN1cml0eSAqcnhycGNfc2VjdXJpdHlfZ2V0KHN0cnVjdCByeHJwY19zZWN1cml0eSAqc2VjKQoreworCXJldHVybiB0cnlfbW9kdWxlX2dldChzZWMtPm93bmVyKSA/IHNlYyA6IE5VTEw7Cit9CisKKy8qCisgKiByZWxlYXNlIGFuIFJ4UlBDIHNlY3VyaXR5IG1vZHVsZQorICovCitzdGF0aWMgdm9pZCByeHJwY19zZWN1cml0eV9wdXQoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisJbW9kdWxlX3B1dChzZWMtPm93bmVyKTsKK30KKworLyoKKyAqIGxvb2sgdXAgYW4gcnhycGMgc2VjdXJpdHkgbW9kdWxlCisgKi8KK3N0cnVjdCByeHJwY19zZWN1cml0eSAqcnhycGNfc2VjdXJpdHlfbG9va3VwKHU4IHNlY3VyaXR5X2luZGV4KQoreworCXN0cnVjdCByeHJwY19zZWN1cml0eSAqc2VjID0gTlVMTDsKKworCV9lbnRlcigiIik7CisKKwlkb3duX3JlYWQoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlYywgJnJ4cnBjX3NlY3VyaXR5X21ldGhvZHMsIGxpbmspIHsKKwkJaWYgKHNlYy0+c2VjdXJpdHlfaW5kZXggPT0gc2VjdXJpdHlfaW5kZXgpIHsKKwkJCWlmICh1bmxpa2VseSghcnhycGNfc2VjdXJpdHlfZ2V0KHNlYykpKQorCQkJCWJyZWFrOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlzZWMgPSBOVUxMOworb3V0OgorCXVwX3JlYWQoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJX2xlYXZlKCIgPSAlcCBbJXNdIiwgc2VjLCBzZWMgPyBzZWMtPm5hbWUgOiAiIik7CisJcmV0dXJuIHNlYzsKK30KKworLyoqCisgKiByeHJwY19yZWdpc3Rlcl9zZWN1cml0eSAtIHJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIKKyAqIEBzZWM6IHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIHJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIgZm9yIHVzZSBieSBSeFJQQworICovCitpbnQgcnhycGNfcmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpwc2VjOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCWRvd25fd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisKKwlyZXQgPSAtRUVYSVNUOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHNlYywgJnJ4cnBjX3NlY3VyaXR5X21ldGhvZHMsIGxpbmspIHsKKwkJaWYgKHBzZWMtPnNlY3VyaXR5X2luZGV4ID09IHNlYy0+c2VjdXJpdHlfaW5kZXgpCisJCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2FkZCgmc2VjLT5saW5rLCAmcnhycGNfc2VjdXJpdHlfbWV0aG9kcyk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlJ4UlBDOiBSZWdpc3RlcmVkIHNlY3VyaXR5IHR5cGUgJWQgJyVzJ1xuIiwKKwkgICAgICAgc2VjLT5zZWN1cml0eV9pbmRleCwgc2VjLT5uYW1lKTsKKwlyZXQgPSAwOworCitvdXQ6CisJdXBfd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnhycGNfcmVnaXN0ZXJfc2VjdXJpdHkpOworCisvKioKKyAqIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkgLSB1bnJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIKKyAqIEBzZWM6IHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIHVucmVnaXN0ZXIgYW4gUnhSUEMgc2VjdXJpdHkgaGFuZGxlcgorICovCit2b2lkIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisKKwlfZW50ZXIoIiIpOworCWRvd25fd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJbGlzdF9kZWxfaW5pdCgmc2VjLT5saW5rKTsKKwl1cF93cml0ZSgmcnhycGNfc2VjdXJpdHlfc2VtKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiUnhSUEM6IFVucmVnaXN0ZXJlZCBzZWN1cml0eSB0eXBlICVkICclcydcbiIsCisJICAgICAgIHNlYy0+c2VjdXJpdHlfaW5kZXgsIHNlYy0+bmFtZSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkpOworCisvKgorICogaW5pdGlhbGlzZSB0aGUgc2VjdXJpdHkgb24gYSBjbGllbnQgY29ubmVjdGlvbgorICovCitpbnQgcnhycGNfaW5pdF9jbGllbnRfY29ubl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgKnNlYzsKKwlzdHJ1Y3Qga2V5ICprZXkgPSBjb25uLT5rZXk7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkfSx7JXh9IiwgY29ubi0+ZGVidWdfaWQsIGtleV9zZXJpYWwoa2V5KSk7CisKKwlpZiAoIWtleSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBrZXlfdmFsaWRhdGUoa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXNlYyA9IHJ4cnBjX3NlY3VyaXR5X2xvb2t1cChrZXktPnR5cGVfZGF0YS54WzBdKTsKKwlpZiAoIXNlYykKKwkJcmV0dXJuIC1FS0VZUkVKRUNURUQ7CisJY29ubi0+c2VjdXJpdHkgPSBzZWM7CisKKwlyZXQgPSBjb25uLT5zZWN1cml0eS0+aW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5KGNvbm4pOworCWlmIChyZXQgPCAwKSB7CisJCXJ4cnBjX3NlY3VyaXR5X3B1dChjb25uLT5zZWN1cml0eSk7CisJCWNvbm4tPnNlY3VyaXR5ID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIHNlY3VyaXR5IG9uIGEgc2VydmVyIGNvbm5lY3Rpb24KKyAqLworaW50IHJ4cnBjX2luaXRfc2VydmVyX2Nvbm5fc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWM7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IGNvbm4tPnRyYW5zLT5sb2NhbDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcng7CisJc3RydWN0IGtleSAqa2V5OworCWtleV9yZWZfdCBrcmVmOworCWNoYXIga2Rlc2NbNSsxKzMrMV07CisKKwlfZW50ZXIoIiIpOworCisJc3ByaW50ZihrZGVzYywgIiV1OiV1IiwgbnRvaHMoY29ubi0+c2VydmljZV9pZCksIGNvbm4tPnNlY3VyaXR5X2l4KTsKKworCXNlYyA9IHJ4cnBjX3NlY3VyaXR5X2xvb2t1cChjb25uLT5zZWN1cml0eV9peCk7CisJaWYgKCFzZWMpIHsKKwkJX2xlYXZlKCIgPSAtRU5PS0VZIFtsb29rdXBdIik7CisJCXJldHVybiAtRU5PS0VZOworCX0KKworCS8qIGZpbmQgdGhlIHNlcnZpY2UgKi8KKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgeworCQlpZiAocngtPnNlcnZpY2VfaWQgPT0gY29ubi0+c2VydmljZV9pZCkKKwkJCWdvdG8gZm91bmRfc2VydmljZTsKKwl9CisKKwkvKiB0aGUgc2VydmljZSBhcHBlYXJzIHRvIGhhdmUgZGllZCAqLworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcnhycGNfc2VjdXJpdHlfcHV0KHNlYyk7CisJX2xlYXZlKCIgPSAtRU5PRU5UIik7CisJcmV0dXJuIC1FTk9FTlQ7CisKK2ZvdW5kX3NlcnZpY2U6CisJaWYgKCFyeC0+c2VjdXJpdGllcykgeworCQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlyeHJwY19zZWN1cml0eV9wdXQoc2VjKTsKKwkJX2xlYXZlKCIgPSAtRU5PS0VZIik7CisJCXJldHVybiAtRU5PS0VZOworCX0KKworCS8qIGxvb2sgdGhyb3VnaCB0aGUgc2VydmljZSdzIGtleXJpbmcgKi8KKwlrcmVmID0ga2V5cmluZ19zZWFyY2gobWFrZV9rZXlfcmVmKHJ4LT5zZWN1cml0aWVzLCAxVUwpLAorCQkJICAgICAgJmtleV90eXBlX3J4cnBjX3MsIGtkZXNjKTsKKwlpZiAoSVNfRVJSKGtyZWYpKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJ4cnBjX3NlY3VyaXR5X3B1dChzZWMpOworCQlfbGVhdmUoIiA9ICVsZCBbc2VhcmNoXSIsIFBUUl9FUlIoa3JlZikpOworCQlyZXR1cm4gUFRSX0VSUihrcmVmKTsKKwl9CisKKwlrZXkgPSBrZXlfcmVmX3RvX3B0cihrcmVmKTsKKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCisJY29ubi0+c2VydmVyX2tleSA9IGtleTsKKwljb25uLT5zZWN1cml0eSA9IHNlYzsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogc2VjdXJlIGEgcGFja2V0IHByaW9yIHRvIHRyYW5zbWlzc2lvbgorICovCitpbnQgcnhycGNfc2VjdXJlX3BhY2tldChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQlzaXplX3QgZGF0YV9zaXplLAorCQkJdm9pZCAqc2VjaGRyKQoreworCWlmIChjYWxsLT5jb25uLT5zZWN1cml0eSkKKwkJcmV0dXJuIGNhbGwtPmNvbm4tPnNlY3VyaXR5LT5zZWN1cmVfcGFja2V0KAorCQkJY2FsbCwgc2tiLCBkYXRhX3NpemUsIHNlY2hkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZWN1cmUgYSBwYWNrZXQgcHJpb3IgdG8gdHJhbnNtaXNzaW9uCisgKi8KK2ludCByeHJwY192ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJdTMyICpfYWJvcnRfY29kZSkKK3sKKwlpZiAoY2FsbC0+Y29ubi0+c2VjdXJpdHkpCisJCXJldHVybiBjYWxsLT5jb25uLT5zZWN1cml0eS0+dmVyaWZ5X3BhY2tldCgKKwkJCWNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOworCXJldHVybiAwOworfQorCisvKgorICogY2xlYXIgY29ubmVjdGlvbiBzZWN1cml0eQorICovCit2b2lkIHJ4cnBjX2NsZWFyX2Nvbm5fc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJaWYgKGNvbm4tPnNlY3VyaXR5KSB7CisJCWNvbm4tPnNlY3VyaXR5LT5jbGVhcihjb25uKTsKKwkJcnhycGNfc2VjdXJpdHlfcHV0KGNvbm4tPnNlY3VyaXR5KTsKKwkJY29ubi0+c2VjdXJpdHkgPSBOVUxMOworCX0KKworCWtleV9wdXQoY29ubi0+a2V5KTsKKwlrZXlfcHV0KGNvbm4tPnNlcnZlcl9rZXkpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXNrYnVmZi5jIGIvbmV0L3J4cnBjL2FyLXNrYnVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItc2tidWZmLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIGFyLXNrYnVmZi5jOiBzb2NrZXQgYnVmZmVyIGRlc3RydWN0aW9uIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKKy8qCisgKiBzZXQgdXAgZm9yIHRoZSBBQ0sgYXQgdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZSBwaGFzZSB3aGVuIHdlIGRpc2NhcmQgdGhlIGZpbmFsCisgKiByZWNlaXZlIHBoYXNlIGRhdGEgcGFja2V0CisgKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCS8qIHRoZSBjYWxsIG1heSBiZSBhYm9ydGVkIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIEFDSyBpdCAqLworCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0s7CisJCV9kZWJ1ZygicmVxdWVzdCBmaW5hbCBBQ0siKTsKKworCQkvKiBnZXQgYW4gZXh0cmEgcmVmIG9uIHRoZSBjYWxsIGZvciB0aGUgZmluYWwtQUNLIGdlbmVyYXRvciB0bworCQkgKiByZWxlYXNlICovCisJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCQlzZXRfYml0KFJYUlBDX0NBTExfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKKwkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworfQorCisvKgorICogZHJvcCB0aGUgYm90dG9tIEFDSyBvZmYgb2YgdGhlIGNhbGwgQUNLIHdpbmRvdyBhbmQgYWR2YW5jZSB0aGUgd2luZG93CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2hhcmRfQUNLX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCkKK3sKKwlpbnQgbG9vcDsKKwl1MzIgc2VxOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCV9kZWJ1ZygiaGFyZCBBQ0sgIyV1IiwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBSWFJQQ19BQ0tSX1dJTkRPV19BU1o7IGxvb3ArKykgeworCQljYWxsLT5hY2tyX3dpbmRvd1tsb29wXSA+Pj0gMTsKKwkJY2FsbC0+YWNrcl93aW5kb3dbbG9vcF0gfD0KKwkJCWNhbGwtPmFja3Jfd2luZG93W2xvb3AgKyAxXSA8PCAoQklUU19QRVJfTE9ORyAtIDEpOworCX0KKworCXNlcSA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKwlBU1NFUlRDTVAoc2VxLCA9PSwgY2FsbC0+cnhfZGF0YV9lYXRlbiArIDEpOworCWNhbGwtPnJ4X2RhdGFfZWF0ZW4gPSBzZXE7CisKKwlpZiAoY2FsbC0+YWNrcl93aW5fdG9wIDwgVUlOVF9NQVgpCisJCWNhbGwtPmFja3Jfd2luX3RvcCsrOworCisJQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKKwkJICAgIGNhbGwtPnJ4X2RhdGFfcG9zdCwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7CisJQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKKwkJICAgIGNhbGwtPnJ4X2RhdGFfcmVjdiwgPj0sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOworCisJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQlyeHJwY19yZXF1ZXN0X2ZpbmFsX0FDSyhjYWxsKTsKKwl9IGVsc2UgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhbGwtPmFja3Jfbm90X2lkbGUpICYmCisJCSAgIHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX1RYX1NPRlRfQUNLLCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9kZWJ1Zygic2VuZCBSeCBpZGxlIEFDSyIpOworCQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19JRExFLCBzcC0+aGRyLnNlcmlhbCwKKwkJCQkgICAgdHJ1ZSk7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworfQorCisvKgorICogZGVzdHJveSBhIHBhY2tldCB0aGF0IGhhcyBhbiBSeFJQQyBjb250cm9sIGJ1ZmZlcgorICogLSBhZHZhbmNlIHRoZSBoYXJkLUFDSyBzdGF0ZSBvZiB0aGUgcGFyZW50IGNhbGwgKGRvbmUgaGVyZSBpbiBjYXNlIHNvbWV0aGluZworICogICBpbiB0aGUga2VybmVsIGJ5cGFzc2VzIHJlY3Ztc2coKSBhbmQgc3RlYWxzIHRoZSBwYWNrZXQgZGlyZWN0bHkgb2ZmIG9mIHRoZQorICogICBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSkKKyAqLwordm9pZCByeHJwY19wYWNrZXRfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IHNwLT5jYWxsOworCisJX2VudGVyKCIlcHslcH0iLCBza2IsIGNhbGwpOworCisJaWYgKGNhbGwpIHsKKwkJLyogc2VuZCB0aGUgZmluYWwgQUNLIG9uIGEgY2xpZW50IGNhbGwgKi8KKwkJaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBKQorCQkJcnhycGNfaGFyZF9BQ0tfZGF0YShjYWxsLCBzcCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlzcC0+Y2FsbCA9IE5VTEw7CisJfQorCisJaWYgKHNrYi0+c2spCisJCXNvY2tfcmZyZWUoc2tiKTsKKwlfbGVhdmUoIiIpOworfQorCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYiAtIEZyZWUgYW4gUnhSUEMgc29ja2V0IGJ1ZmZlcgorICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgdG8gYmUgZnJlZWQKKyAqCisgKiBMZXQgUnhSUEMgZnJlZSBpdHMgb3duIHNvY2tldCBidWZmZXIsIHBlcm1pdHRpbmcgaXQgdG8gbWFpbnRhaW4gZGVidWcKKyAqIGFjY291bnRpbmcuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZnJlZV9za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jIGIvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2Q3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIFJ4UlBDIHBvaW50LXRvLXBvaW50IHRyYW5zcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RhdGljIHZvaWQgcnhycGNfdHJhbnNwb3J0X3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3RyYW5zcG9ydHMpOworc3RhdGljIERFRklORV9SV0xPQ0socnhycGNfdHJhbnNwb3J0X2xvY2spOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQgPSAzNjAwICogMjQ7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksocnhycGNfdHJhbnNwb3J0X3JlYXAsIHJ4cnBjX3RyYW5zcG9ydF9yZWFwZXIpOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgdHJhbnNwb3J0IHNlc3Npb24gbWFuYWdlcgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqcnhycGNfYWxsb2NfdHJhbnNwb3J0KHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCisJCQkJCQkgICAgIHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJCQkJICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnM7CisKKwlfZW50ZXIoIiIpOworCisJdHJhbnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSwgZ2ZwKTsKKwlpZiAodHJhbnMpIHsKKwkJdHJhbnMtPmxvY2FsID0gbG9jYWw7CisJCXRyYW5zLT5wZWVyID0gcGVlcjsKKwkJSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5saW5rKTsKKwkJdHJhbnMtPmJ1bmRsZXMgPSBSQl9ST09UOworCQl0cmFucy0+Y2xpZW50X2Nvbm5zID0gUkJfUk9PVDsKKwkJdHJhbnMtPnNlcnZlcl9jb25ucyA9IFJCX1JPT1Q7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRyYW5zLT5lcnJvcl9xdWV1ZSk7CisJCXNwaW5fbG9ja19pbml0KCZ0cmFucy0+Y2xpZW50X2xvY2spOworCQlyd2xvY2tfaW5pdCgmdHJhbnMtPmNvbm5fbG9jayk7CisJCWF0b21pY19zZXQoJnRyYW5zLT51c2FnZSwgMSk7CisJCXRyYW5zLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7CisKKwkJaWYgKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCXN3aXRjaCAocGVlci0+c3J4LnRyYW5zcG9ydF90eXBlKSB7CisJCQljYXNlIFNPQ0tfREdSQU06CisJCQkJSU5JVF9XT1JLKCZ0cmFucy0+ZXJyb3JfaGFuZGxlciwKKwkJCQkJICByeHJwY19VRFBfZXJyb3JfaGFuZGxlcik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJVRygpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgdHJhbnMpOworCXJldHVybiB0cmFuczsKK30KKworLyoKKyAqIG9idGFpbiBhIHRyYW5zcG9ydCBzZXNzaW9uIGZvciB0aGUgbm9taW5hdGVkIGVuZHBvaW50cworICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19nZXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCisJCQkJCSAgICBzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkJICAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgKmNhbmRpZGF0ZTsKKwljb25zdCBjaGFyICpuZXcgPSAib2xkIjsKKwlpbnQgdXNhZ2U7CisKKwlfZW50ZXIoInsldS4ldS4ldS4ldSslaHV9LHsldS4ldS4ldS4ldSslaHV9LCIsCisJICAgICAgIE5JUFFVQUQobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkgICAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKKwkgICAgICAgTklQUVVBRChwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICAgIG50b2hzKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwkvKiBzZWFyY2ggdGhlIHRyYW5zcG9ydCBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJaWYgKHRyYW5zLT5sb2NhbCA9PSBsb2NhbCAmJiB0cmFucy0+cGVlciA9PSBwZWVyKQorCQkJZ290byBmb3VuZF9leHRhbnRfdHJhbnNwb3J0OworCX0KKwlyZWFkX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCisJLyogbm90IHlldCBwcmVzZW50IC0gY3JlYXRlIGEgY2FuZGlkYXRlIGZvciBhIG5ldyByZWNvcmQgYW5kIHRoZW4KKwkgKiByZWRvIHRoZSBzZWFyY2ggKi8KKwljYW5kaWRhdGUgPSByeHJwY19hbGxvY190cmFuc3BvcnQobG9jYWwsIHBlZXIsIGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX3RyYW5zcG9ydF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZyeHJwY190cmFuc3BvcnRzLCBsaW5rKSB7CisJCWlmICh0cmFucy0+bG9jYWwgPT0gbG9jYWwgJiYgdHJhbnMtPnBlZXIgPT0gcGVlcikKKwkJCWdvdG8gZm91bmRfZXh0YW50X3NlY29uZDsKKwl9CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdCAqLworCXRyYW5zID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKwlyeHJwY19nZXRfbG9jYWwodHJhbnMtPmxvY2FsKTsKKwlhdG9taWNfaW5jKCZ0cmFucy0+cGVlci0+dXNhZ2UpOworCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5saW5rLCAmcnhycGNfdHJhbnNwb3J0cyk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbmV3ID0gIm5ldyI7CisKK3N1Y2Nlc3M6CisJX25ldCgiVFJBTlNQT1JUICVzICVkIGxvY2FsICVkIC0+IHBlZXIgJWQiLAorCSAgICAgbmV3LAorCSAgICAgdHJhbnMtPmRlYnVnX2lkLAorCSAgICAgdHJhbnMtPmxvY2FsLT5kZWJ1Z19pZCwKKwkgICAgIHRyYW5zLT5wZWVyLT5kZWJ1Z19pZCk7CisKKwlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHRyYW5zLCBhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSk7CisJcmV0dXJuIHRyYW5zOworCisJLyogd2UgZm91bmQgdGhlIHRyYW5zcG9ydCBpbiB0aGUgbGlzdCBpbW1lZGlhdGVseSAqLworZm91bmRfZXh0YW50X3RyYW5zcG9ydDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0cmFucy0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJZ290byBzdWNjZXNzOworCisJLyogd2UgZm91bmQgdGhlIHRyYW5zcG9ydCBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0cmFucy0+dXNhZ2UpOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworfQorCisvKgorICogZmluZCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RpbmcgdHdvIGVuZHBvaW50cworICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19maW5kX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCQkgICAgIHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQoreworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCisJX2VudGVyKCJ7JXUuJXUuJXUuJXUrJWh1fSx7JXUuJXUuJXUuJXUrJWh1fSwiLAorCSAgICAgICBOSVBRVUFEKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICAgIG50b2hzKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCksCisJICAgICAgIE5JUFFVQUQocGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOworCisJLyogc2VhcmNoIHRoZSB0cmFuc3BvcnQgbGlzdCAqLworCXJlYWRfbG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJaWYgKHRyYW5zLT5sb2NhbCA9PSBsb2NhbCAmJiB0cmFucy0+cGVlciA9PSBwZWVyKQorCQkJZ290byBmb3VuZF9leHRhbnRfdHJhbnNwb3J0OworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJX2xlYXZlKCIgPSBOVUxMIik7CisJcmV0dXJuIE5VTEw7CisKK2ZvdW5kX2V4dGFudF90cmFuc3BvcnQ6CisJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCV9sZWF2ZSgiID0gJXAiLCB0cmFucyk7CisJcmV0dXJuIHRyYW5zOworfQorCisvKgorICogcmVsZWFzZSBhIHRyYW5zcG9ydCBzZXNzaW9uCisgKi8KK3ZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlfZW50ZXIoIiVwe3U9JWR9IiwgdHJhbnMsIGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpKTsKKworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSwgPiwgMCk7CisKKwl0cmFucy0+cHV0X3RpbWUgPSB4dGltZS50dl9zZWM7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfYW5kX3Rlc3QoJnRyYW5zLT51c2FnZSkpKQorCQlfZGVidWcoInpvbWJpZSIpOworCQkvKiBsZXQgdGhlIHJlYXBlciBkZXRlcm1pbmUgdGhlIHRpbWVvdXQgdG8gYXZvaWQgYSByYWNlIHdpdGgKKwkJICogb3ZlcmV4dGVuZGluZyB0aGUgdGltZW91dCBpZiB0aGUgcmVhcGVyIGlzIHJ1bm5pbmcgYXQgdGhlCisJCSAqIHNhbWUgdGltZSAqLworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLCAwKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogY2xlYW4gdXAgYSB0cmFuc3BvcnQgc2Vzc2lvbgorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhbnVwX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlfbmV0KCJERVNUUk9ZIFRSQU5TICVkIiwgdHJhbnMtPmRlYnVnX2lkKTsKKworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZ0cmFucy0+ZXJyb3JfcXVldWUpOworCisJcnhycGNfcHV0X2xvY2FsKHRyYW5zLT5sb2NhbCk7CisJcnhycGNfcHV0X3BlZXIodHJhbnMtPnBlZXIpOworCWtmcmVlKHRyYW5zKTsKK30KKworLyoKKyAqIHJlYXAgZGVhZCB0cmFuc3BvcnRzIHRoYXQgaGF2ZSBwYXNzZWQgdGhlaXIgZXhwaXJ5IGRhdGUKKyAqLworc3RhdGljIHZvaWQgcnhycGNfdHJhbnNwb3J0X3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsICpfcDsKKwl1bnNpZ25lZCBsb25nIG5vdywgZWFybGllc3QsIHJlYXBfdGltZTsKKworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IHh0aW1lLnR2X3NlYzsKKwllYXJsaWVzdCA9IFVMT05HX01BWDsKKworCS8qIGV4dHJhY3QgYWxsIHRoZSB0cmFuc3BvcnRzIHRoYXQgaGF2ZSBiZWVuIGRlYWQgdG9vIGxvbmcgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zLCBfcCwgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJX2RlYnVnKCJyZWFwIFRSQU5TICVkIHsgdT0lZCB0PSVsZCB9IiwKKwkJICAgICAgIHRyYW5zLT5kZWJ1Z19pZCwgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSksCisJCSAgICAgICAobG9uZykgbm93IC0gKGxvbmcpIHRyYW5zLT5wdXRfdGltZSk7CisKKwkJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSA+IDApKQorCQkJY29udGludWU7CisKKwkJcmVhcF90aW1lID0gdHJhbnMtPnB1dF90aW1lICsgcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQ7CisJCWlmIChyZWFwX3RpbWUgPD0gbm93KQorCQkJbGlzdF9tb3ZlX3RhaWwoJnRyYW5zLT5saW5rLCAmZ3JhdmV5YXJkKTsKKwkJZWxzZSBpZiAocmVhcF90aW1lIDwgZWFybGllc3QpCisJCQllYXJsaWVzdCA9IHJlYXBfdGltZTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisKKwlpZiAoZWFybGllc3QgIT0gVUxPTkdfTUFYKSB7CisJCV9kZWJ1ZygicmVzY2hlZHVsZSByZWFwZXIgJWxkIiwgKGxvbmcpIGVhcmxpZXN0IC0gbm93KTsKKwkJQVNTRVJUQ01QKGVhcmxpZXN0LCA+LCBub3cpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLAorCQkJCQkgKGVhcmxpZXN0IC0gbm93KSAqIEhaKTsKKwl9CisKKwkvKiB0aGVuIGRlc3Ryb3kgYWxsIHRob3NlIHB1bGxlZCBvdXQgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmdyYXZleWFyZCkpIHsKKwkJdHJhbnMgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LAorCQkJCSAgIGxpbmspOworCQlsaXN0X2RlbF9pbml0KCZ0cmFucy0+bGluayk7CisKKwkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpLCA9PSwgMCk7CisJCXJ4cnBjX2NsZWFudXBfdHJhbnNwb3J0KHRyYW5zKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSB0cmFuc3BvcnQgc2Vzc2lvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcKKyAqIGZvciB0aGVtIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3RyYW5zcG9ydHModm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwKTsKKwlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLCAwKTsKKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbC5jIGIvbmV0L3J4cnBjL2NhbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MTIyYi4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMvY2FsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3NyArMCwwIEBACi0vKiBjYWxsLmM6IFJ4IGNhbGwgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLV9fUlhBQ0NUX0RFQ0woYXRvbWljX3QgcnhycGNfY2FsbF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGF0b21pY190IHJ4cnBjX21lc3NhZ2VfY291bnQpOwotCi1MSVNUX0hFQUQocnhycGNfY2FsbHMpOwotREVDTEFSRV9SV1NFTShyeHJwY19jYWxsc19zZW0pOwotCi11bnNpZ25lZCByeHJwY19jYWxsX3Jjdl90aW1lb3V0CQkJPSBIWi8zOwotc3RhdGljIHVuc2lnbmVkIHJ4cnBjX2NhbGxfYWNrc190aW1lb3V0CQk9IEhaLzM7Ci1zdGF0aWMgdW5zaWduZWQgcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQJPSBIWi8yMDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByeHJwY19jYWxsX21heF9yZXNlbmQJPSBIWi8xMDsKLQotY29uc3QgY2hhciAqcnhycGNfY2FsbF9zdGF0ZXNbXSA9IHsKLQkiQ09NUExFVEUiLAotCSJFUlJPUiIsCi0JIlNSVlJfUkNWX09QSUQiLAotCSJTUlZSX1JDVl9BUkdTIiwKLQkiU1JWUl9HT1RfQVJHUyIsCi0JIlNSVlJfU05EX1JFUExZIiwKLQkiU1JWUl9SQ1ZfRklOQUxfQUNLIiwKLQkiQ0xOVF9TTkRfQVJHUyIsCi0JIkNMTlRfUkNWX1JFUExZIiwKLQkiQ0xOVF9HT1RfUkVQTFkiCi19OwotCi1jb25zdCBjaGFyICpyeHJwY19jYWxsX2Vycm9yX3N0YXRlc1tdID0gewotCSJOT19FUlJPUiIsCi0JIkxPQ0FMX0FCT1JUIiwKLQkiUEVFUl9BQk9SVCIsCi0JIkxPQ0FMX0VSUk9SIiwKLQkiUkVNT1RFX0VSUk9SIgotfTsKLQotY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0gewotCSI/MDAiLAotCSJkYXRhIiwgImFjayIsICJidXN5IiwgImFib3J0IiwgImFja2FsbCIsICJjaGFsbCIsICJyZXNwIiwgImRlYnVnIiwKLQkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2Fja3NbXSA9IHsKLQkiLS0tIiwgIlJFUSIsICJEVVAiLCAiU0VRIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLCAiSURMIiwKLQkiLT8tIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2Fja3R5cGVbXSA9ICJOQS0iOwotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVjZWl2ZV9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJcnhycGNfc2VxX3QgaGlnZXN0KTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBoaWdoZXN0KTsKLXN0YXRpYyBpbnQgX19yeHJwY19jYWxsX3JlYWRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLXN0YXRpYyBpbnQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJCSByeHJwY19zZXFfdCBzZXEsCi0JCQkJIHNpemVfdCBjb3VudCk7Ci0KLXN0YXRpYyBpbnQgcnhycGNfY2FsbF9mbHVzaChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLSNkZWZpbmUgX3N0YXRlKGNhbGwpIFwKLQlfZGVidWcoIltbWyBzdGF0ZSAlcyBdXV0iLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0pOwotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYXR0bl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKLX0KLQotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9kZWZhdWx0X2Vycm9yX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jd2FrZV91cCgmY2FsbC0+d2FpdHEpOwotfQotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYWVtYXBfZnVuYyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKLQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOwotCWNhc2UgUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQ6Ci0JCWNhbGwtPmFwcF9lcnJubyA9IC1FQ09OTkFCT1JURUQ7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrc190aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZGVidWcoIkFDS1MgVElNRU9VVCAlMDVsdSIsIGppZmZpZXMgLSBjYWxsLT5jamlmKTsKLQotCWNhbGwtPmZsYWdzIHw9IFJYUlBDX0NBTExfQUNLU19USU1POwotCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOwotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfcmN2X3RpbWVvdXQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCV9kZWJ1ZygiUkNWIFRJTUVPVVQgJTA1bHUiLCBqaWZmaWVzIC0gY2FsbC0+Y2ppZik7Ci0KLQljYWxsLT5mbGFncyB8PSBSWFJQQ19DQUxMX1JDVl9USU1POwotCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOwotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZGVidWcoIkFDS1IgVElNRU9VVCAlMDVsdSIsamlmZmllcyAtIGNhbGwtPmNqaWYpOwotCi0JY2FsbC0+ZmxhZ3MgfD0gUlhSUENfQ0FMTF9BQ0tSX1RJTU87Ci0JcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoY2FsbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjYWxjdWxhdGUgYSB0aW1lb3V0IGJhc2VkIG9uIGFuIFJUVCB2YWx1ZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZXhwaXJ5ID0gY2FsbC0+Y29ubi0+cGVlci0+cnR0IC8gKDEwMDAwMDAgLyBIWik7Ci0KLQlleHBpcnkgKz0gMTA7Ci0JaWYgKGV4cGlyeSA8IEhaIC8gMjUpCi0JCWV4cGlyeSA9IEhaIC8gMjU7Ci0JaWYgKGV4cGlyeSA+IEhaKQotCQlleHBpcnkgPSBIWjsKLQotCV9sZWF2ZSgiID0gJWx1IGppZmZpZXMiLCBleHBpcnkpOwotCXJldHVybiBqaWZmaWVzICsgZXhwaXJ5OwotfSAvKiBlbmQgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqKl9jYWxsKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCi0JX2VudGVyKCIlcCIsIGNvbm4pOwotCi0JLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjYWxsIHJlY29yZCAqLwotCWNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghY2FsbCkgewotCQlfbGVhdmUoIiBFTk9NRU0iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXRvbWljX3NldCgmY2FsbC0+dXNhZ2UsIDEpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+d2FpdHEpOwotCXNwaW5fbG9ja19pbml0KCZjYWxsLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FsbC0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFja3NfcGVuZHEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3ZfcmVjZWl2ZXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3Zfa3J4aW9kcV9sayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9yZWFkeXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfdW5yZWFkeXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfbGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9hdHRuX2xpbmspOwotCi0JaW5pdF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0KTsKLQljYWxsLT5hY2tzX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOwotCWNhbGwtPmFja3NfdGltZW91dC5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQ7Ci0KLQlpbml0X3RpbWVyKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JY2FsbC0+cmN2X3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOwotCWNhbGwtPnJjdl90aW1lb3V0LmZ1bmN0aW9uID0gX19yeHJwY19jYWxsX3Jjdl90aW1lb3V0OwotCi0JaW5pdF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JY2FsbC0+YWNrcl9kZnJfdGltby5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhbGw7Ci0JY2FsbC0+YWNrcl9kZnJfdGltby5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tyX3RpbWVvdXQ7Ci0KLQljYWxsLT5jb25uID0gY29ubjsKLQljYWxsLT5hY2tyX3dpbl9ib3QgPSAxOwotCWNhbGwtPmFja3Jfd2luX3RvcCA9IGNhbGwtPmFja3Jfd2luX2JvdCArIFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFIC0gMTsKLQljYWxsLT5hY2tyX3ByZXZfc2VxID0gMDsKLQljYWxsLT5hcHBfbWFyayA9IFJYUlBDX0FQUF9NQVJLX0VPRjsKLQljYWxsLT5hcHBfYXR0bl9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2F0dG5fZnVuYzsKLQljYWxsLT5hcHBfZXJyb3JfZnVuYyA9IHJ4cnBjX2NhbGxfZGVmYXVsdF9lcnJvcl9mdW5jOwotCWNhbGwtPmFwcF9hZW1hcF9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2FlbWFwX2Z1bmM7Ci0JY2FsbC0+YXBwX3Njcl9hbGxvYyA9IGNhbGwtPmFwcF9zY3JhdGNoOwotCi0JY2FsbC0+Y2ppZiA9IGppZmZpZXM7Ci0KLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNhbGwpOwotCi0JKl9jYWxsID0gY2FsbDsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgX19yeHJwY19jcmVhdGVfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIG91dGdvaW5nIGNhbGxzCi0gKi8KLWludCByeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJICAgICAgcnhycGNfY2FsbF9hdHRuX2Z1bmNfdCBhdHRuLAotCQkgICAgICByeHJwY19jYWxsX2Vycm9yX2Z1bmNfdCBlcnJvciwKLQkJICAgICAgcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QgYWVtYXAsCi0JCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCWludCByZXQsIGNpeCwgbG9vcDsKLQotCV9lbnRlcigiJXAiLCBjb25uKTsKLQotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY2FsbCByZWNvcmQgKi8KLQlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTOwotCWlmIChhdHRuKQotCQljYWxsLT5hcHBfYXR0bl9mdW5jID0gYXR0bjsKLQlpZiAoZXJyb3IpCi0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jID0gZXJyb3I7Ci0JaWYgKGFlbWFwKQotCQljYWxsLT5hcHBfYWVtYXBfZnVuYyA9IGFlbWFwOwotCi0JX3N0YXRlKGNhbGwpOwotCi0Jc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7Ci0KLSB0cnlfYWdhaW46Ci0JLyogdHJ5IHRvIGZpbmQgYW4gdW51c2VkIGNoYW5uZWwgKi8KLQlmb3IgKGNpeCA9IDA7IGNpeCA8IDQ7IGNpeCsrKQotCQlpZiAoIWNvbm4tPmNoYW5uZWxzW2NpeF0pCi0JCQlnb3RvIG9idGFpbmVkX2NoYW47Ci0KLQkvKiBubyBmcmVlIGNoYW5uZWxzIC0gd2FpdCBmb3Igb25lIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KLQlyZXQgPSAtRUlOVFI7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlnb3RvIGVycm9yX3Vud2FpdDsKLQotCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKLQotCXNjaGVkdWxlKCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JZ290byB0cnlfYWdhaW47Ci0KLQkvKiBnb3QgYSBjaGFubmVsIC0gbm93IGF0dGFjaCB0byB0aGUgY29ubmVjdGlvbiAqLwotIG9idGFpbmVkX2NoYW46Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmNvbm4tPmNoYW53YWl0LCAmbXlzZWxmKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JLyogY29uY29jdCBhIHVuaXF1ZSBjYWxsIG51bWJlciAqLwotIG5leHRfY2FsbGlkOgotCWNhbGwtPmNhbGxfaWQgPSBodG9ubCgrK2Nvbm4tPmNhbGxfY291bnRlcik7Ci0JZm9yIChsb29wID0gMDsgbG9vcCA8IDQ7IGxvb3ArKykKLQkJaWYgKGNvbm4tPmNoYW5uZWxzW2xvb3BdICYmCi0JCSAgICBjb25uLT5jaGFubmVsc1tsb29wXS0+Y2FsbF9pZCA9PSBjYWxsLT5jYWxsX2lkKQotCQkJZ290byBuZXh0X2NhbGxpZDsKLQotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOyAvKiBhc3NpZ24gX2FmdGVyXyBkb25lIGNhbGxpZCBjaGVjayBsb29wICovCi0JZG9fZ2V0dGltZW9mZGF5KCZjb25uLT5hdGltZSk7Ci0JY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmNhbGxfbGluaywgJnJ4cnBjX2NhbGxzKTsKLQl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQotCV9fUlhBQ0NUKGF0b21pY19pbmMoJnJ4cnBjX2NhbGxfY291bnQpKTsKLQkqX2NhbGwgPSBjYWxsOwotCi0JX2xlYXZlKCIgPSAwIChjYWxsPSVwIGNpeD0ldSkiLCBjYWxsLCBjaXgpOwotCXJldHVybiAwOwotCi0gZXJyb3JfdW53YWl0OgotCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCByeHJwY19jcmVhdGVfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIGluY29taW5nIGNhbGxzCi0gKi8KLWludCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCXN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0JdW5zaWduZWQgY2l4OwotCWludCByZXQ7Ci0KLQljaXggPSBudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7Ci0KLQlfZW50ZXIoIiVwLCV1LCV1IiwgY29ubiwgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksIGNpeCk7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNhbGwgcmVjb3JkICovCi0JcmV0ID0gX19yeHJwY19jcmVhdGVfY2FsbChjb25uLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2FsbC0+cGt0X3Jjdl9jb3VudCA9IDE7Ci0JY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDsKLQljYWxsLT5hcHBfbWFyayA9IHNpemVvZih1aW50MzJfdCk7Ci0KLQlfc3RhdGUoY2FsbCk7Ci0KLQkvKiBhdHRhY2ggdG8gdGhlIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSAtRUJVU1k7Ci0JY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7Ci0JY2FsbC0+Y2FsbF9pZCA9IG1zZy0+aGRyLmNhbGxOdW1iZXI7Ci0KLQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCi0JaWYgKCFjb25uLT5jaGFubmVsc1tjaXhdIHx8Ci0JICAgIGNvbm4tPmNoYW5uZWxzW2NpeF0tPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9DT01QTEVURSB8fAotCSAgICBjb25uLT5jaGFubmVsc1tjaXhdLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfRVJST1IKLQkgICAgKSB7Ci0JCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOwotCQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKLQkJcmV0ID0gMDsKLQl9Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCQljYWxsID0gTlVMTDsKLQl9Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJZG93bl93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+Y2FsbF9saW5rLCAmcnhycGNfY2FsbHMpOwotCQl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQkJX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfY2FsbF9jb3VudCkpOwotCQkqX2NhbGwgPSBjYWxsOwotCX0KLQotCV9sZWF2ZSgiID0gJWQgWyVwXSIsIHJldCwgY2FsbCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2luY29taW5nX2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZnJlZSBhIGNhbGwgcmVjb3JkCi0gKi8KLXZvaWQgcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0KLQlfZW50ZXIoIiVwe3U9JWR9IixjYWxsLGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlLWxpc3QgbXVzdCBiZSBlZmZlY3RpdmVseQotCSAqIGF0b21pYyAqLwotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY29ubi0+Y2hhbm5lbHNbbnRvaGwoY2FsbC0+Y2hhbl9peCldID09IGNhbGwpCi0JCWNvbm4tPmNoYW5uZWxzW250b2hsKGNhbGwtPmNoYW5faXgpXSA9IE5VTEw7Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQl3YWtlX3VwKCZjb25uLT5jaGFud2FpdCk7Ci0KLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQotCS8qIGNsZWFyIHRoZSB0aW1lcnMgYW5kIGRlcXVldWUgZnJvbSBrcnhpb2QgKi8KLQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQotCXJ4cnBjX2tyeGlvZF9kZXF1ZXVlX2NhbGwoY2FsbCk7Ci0KLQkvKiBjbGVhbiB1cCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdCAqLwotCWlmIChjYWxsLT5zbmRfbmV4dG1zZykKLQkJcnhycGNfcHV0X21lc3NhZ2UoY2FsbC0+c25kX25leHRtc2cpOwotCi0JaWYgKGNhbGwtPnNuZF9waW5nKQotCQlyeHJwY19wdXRfbWVzc2FnZShjYWxsLT5zbmRfcGluZyk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFja3NfcGVuZHEpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YWNrc19wZW5kcS5uZXh0LAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpbmspOwotCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgewotCQltc2cgPSBsaXN0X2VudHJ5KGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0LAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpbmspOwotCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJbGlzdF9kZWwoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfdW5yZWFkeXEpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJbGlzdF9kZWwoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JbW9kdWxlX3B1dChjYWxsLT5vd25lcik7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCWxpc3RfZGVsKCZjYWxsLT5jYWxsX2xpbmspOwotCXVwX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCi0JX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY2FsbF9jb3VudCkpOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0KLQlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOwotfSAvKiBlbmQgcnhycGNfcHV0X2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYWN0dWFsbHkgZ2VuZXJhdGUgYSBub3JtYWwgQUNLCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICAgICAgcnhycGNfc2VxX3Qgc2VxKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGt2ZWMgZGlvdlszXTsKLQlfX2JlMzIgYXV4WzRdOwotCWludCBkZWx0YSwgcmV0OwotCi0JLyogQUNLcyBkZWZhdWx0IHRvIERFTEFZICovCi0JaWYgKCFjYWxsLT5hY2tyLnJlYXNvbikKLQkJY2FsbC0+YWNrci5yZWFzb24gPSBSWFJQQ19BQ0tfREVMQVk7Ci0KLQlfcHJvdG8oIlJ4ICUwNWx1IFNlbmRpbmcgQUNLIHsgbT0laHUgZj0jJXUgcD0jJXUgcz0lJSV1IHI9JXMgbj0ldSB9IiwKLQkgICAgICAgamlmZmllcyAtIGNhbGwtPmNqaWYsCi0JICAgICAgIG50b2hzKGNhbGwtPmFja3IubWF4U2tldyksCi0JICAgICAgIG50b2hsKGNhbGwtPmFja3IuZmlyc3RQYWNrZXQpLAotCSAgICAgICBudG9obChjYWxsLT5hY2tyLnByZXZpb3VzUGFja2V0KSwKLQkgICAgICAgbnRvaGwoY2FsbC0+YWNrci5zZXJpYWwpLAotCSAgICAgICByeHJwY19hY2tzW2NhbGwtPmFja3IucmVhc29uXSwKLQkgICAgICAgY2FsbC0+YWNrci5uQWNrcyk7Ci0KLQlhdXhbMF0gPSBodG9ubChjYWxsLT5jb25uLT5wZWVyLT5pZl9tdHUpOwkvKiBpbnRlcmZhY2UgTVRVICovCi0JYXV4WzFdID0gaHRvbmwoMTQ0NCk7CQkJCS8qIG1heCBNVFUgKi8KLQlhdXhbMl0gPSBodG9ubCgxNik7CQkJCS8qIHJ3aW5kICovCi0JYXV4WzNdID0gaHRvbmwoNCk7CQkJCS8qIG1heCBwYWNrZXRzICovCi0KLQlkaW92WzBdLmlvdl9sZW4gID0gc2l6ZW9mKHN0cnVjdCByeHJwY19hY2twYWNrZXQpOwotCWRpb3ZbMF0uaW92X2Jhc2UgPSAmY2FsbC0+YWNrcjsKLQlkaW92WzFdLmlvdl9sZW4gID0gY2FsbC0+YWNrcl9wZW5kX2NudCArIDM7Ci0JZGlvdlsxXS5pb3ZfYmFzZSA9IGNhbGwtPmFja3JfYXJyYXk7Ci0JZGlvdlsyXS5pb3ZfbGVuICA9IHNpemVvZihhdXgpOwotCWRpb3ZbMl0uaW92X2Jhc2UgPSAmYXV4OwotCi0JLyogYnVpbGQgYW5kIHNlbmQgdGhlIG1lc3NhZ2UgKi8KLQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjYWxsLT5jb25uLGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSywKLQkJCQkzLCBkaW92LCBHRlBfS0VSTkVMLCAmbXNnKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQltc2ctPnNlcSA9IHNlcTsKLQltc2ctPmhkci5zZXEgPSBodG9ubChzZXEpOwotCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7Ci0KLQlyZXQgPSByeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKTsKLQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQljYWxsLT5wa3Rfc25kX2NvdW50Kys7Ci0KLQkvKiBjb3VudCBob3cgbWFueSBhY3R1YWwgQUNLcyB0aGVyZSB3ZXJlIGF0IHRoZSBmcm9udCAqLwotCWZvciAoZGVsdGEgPSAwOyBkZWx0YSA8IGNhbGwtPmFja3JfcGVuZF9jbnQ7IGRlbHRhKyspCi0JCWlmIChjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCi0JCQlicmVhazsKLQotCWNhbGwtPmFja3JfcGVuZF9jbnQgLT0gZGVsdGE7IC8qIGFsbCBBQ0snZCB0byB0aGlzIHBvaW50ICovCi0KLQkvKiBjcmFuayB0aGUgQUNLIHdpbmRvdyBhcm91bmQgKi8KLQlpZiAoZGVsdGEgPT0gMCkgewotCQkvKiB1bi1BQ0snZCB3aW5kb3cgKi8KLQl9Ci0JZWxzZSBpZiAoZGVsdGEgPCBSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSkgewotCQkvKiBwYXJ0aWFsbHkgQUNLJ2Qgd2luZG93Ci0JCSAqIC0gc2h1ZmZsZSBkb3duIHRvIGF2b2lkIGxvc2luZyBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0cwotCQkgKi8KLQkJY2FsbC0+YWNrcl93aW5fYm90ICs9IGRlbHRhOwotCQljYWxsLT5hY2tyX3dpbl90b3AgKz0gZGVsdGE7Ci0KLQkJbWVtbW92ZSgmY2FsbC0+YWNrcl9hcnJheVswXSwKLQkJCSZjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSwKLQkJCWNhbGwtPmFja3JfcGVuZF9jbnQpOwotCi0JCW1lbXNldCgmY2FsbC0+YWNrcl9hcnJheVtjYWxsLT5hY2tyX3BlbmRfY250XSwKLQkJICAgICAgIFJYUlBDX0FDS19UWVBFX05BQ0ssCi0JCSAgICAgICBzaXplb2YoY2FsbC0+YWNrcl9hcnJheSkgLSBjYWxsLT5hY2tyX3BlbmRfY250KTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGZ1bGx5IEFDSydkIHdpbmRvdwotCQkgKiAtIGp1c3QgY2xlYXIgdGhlIHdob2xlIHRoaW5nCi0JCSAqLwotCQltZW1zZXQoJmNhbGwtPmFja3JfYXJyYXksCi0JCSAgICAgICBSWFJQQ19BQ0tfVFlQRV9OQUNLLAotCQkgICAgICAgc2l6ZW9mKGNhbGwtPmFja3JfYXJyYXkpKTsKLQl9Ci0KLQkvKiBjbGVhciB0aGlzIEFDSyAqLwotCW1lbXNldCgmY2FsbC0+YWNrciwgMCwgc2l6ZW9mKGNhbGwtPmFja3IpKTsKLQotIG91dDoKLQlpZiAoIWNhbGwtPmFwcF9jYWxsX3N0YXRlKQotCQlwcmludGsoIl9fXyBTVEFURSAwIF9fX1xuIik7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RlIHRoZSByZWNlcHRpb24gb2YgYSBwYWNrZXQgaW4gdGhlIGNhbGwncyBBQ0sgcmVjb3JkcyBhbmQgZ2VuZXJhdGUgYW4KLSAqIGFwcHJvcHJpYXRlIEFDSyBwYWNrZXQgaWYgbmVjZXNzYXJ5Ci0gKiAtIHJldHVybnMgMCBpZiBwYWNrZXQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgMSBpZiBwYWNrZXQgc2hvdWxkIGJlIGlnbm9yZWQKLSAqICAgYW5kIC12ZSBvbiBhbiBlcnJvcgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19oZWFkZXIgKmhkciwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfYWNrcGFja2V0ICphY2spCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlyeHJwY19zZXFfdCBzZXE7Ci0JdW5zaWduZWQgb2Zmc2V0OwotCWludCByZXQgPSAwLCBlcnI7Ci0JdTggc3BlY2lhbF9BQ0ssIGRvX0FDSywgZm9yY2U7Ci0KLQlfZW50ZXIoIiVwLCVwIHsgc2VxPSVkIHRwPSVkIGZsPSUwMnggfSIsCi0JICAgICAgIGNhbGwsIGhkciwgbnRvaGwoaGRyLT5zZXEpLCBoZHItPnR5cGUsIGhkci0+ZmxhZ3MpOwotCi0Jc2VxID0gbnRvaGwoaGRyLT5zZXEpOwotCW9mZnNldCA9IHNlcSAtIGNhbGwtPmFja3Jfd2luX2JvdDsKLQlkb19BQ0sgPSBSWFJQQ19BQ0tfREVMQVk7Ci0Jc3BlY2lhbF9BQ0sgPSAwOwotCWZvcmNlID0gKHNlcSA9PSAxKTsKLQotCWlmIChjYWxsLT5hY2tyX2hpZ2hfc2VxIDwgc2VxKQotCQljYWxsLT5hY2tyX2hpZ2hfc2VxID0gc2VxOwotCi0JLyogZGVhbCB3aXRoIGdlbmVyYXRpb24gb2Ygb2J2aW91cyBzcGVjaWFsIEFDS3MgZmlyc3QgKi8KLQlpZiAoYWNrICYmIGFjay0+cmVhc29uID09IFJYUlBDX0FDS19QSU5HKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U7Ci0JCXJldCA9IDE7Ci0JCWdvdG8gZ2VuX0FDSzsKLQl9Ci0KLQlpZiAoc2VxIDwgY2FsbC0+YWNrcl93aW5fYm90KSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gMTsKLQkJZ290byBnZW5fQUNLOwotCX0KLQotCWlmIChzZXEgPj0gY2FsbC0+YWNrcl93aW5fdG9wKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XOwotCQlyZXQgPSAxOwotCQlnb3RvIGdlbl9BQ0s7Ci0JfQotCi0JaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9OQUNLKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gMTsKLQkJZ290byBnZW5fQUNLOwotCX0KLQotCS8qIG9rYXkuLi4gaXQncyBhIG5vcm1hbCBkYXRhIHBhY2tldCBpbnNpZGUgdGhlIEFDSyB3aW5kb3cgKi8KLQljYWxsLT5hY2tyX2FycmF5W29mZnNldF0gPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7Ci0KLQlpZiAob2Zmc2V0IDwgY2FsbC0+YWNrcl9wZW5kX2NudCkgewotCX0KLQllbHNlIGlmIChvZmZzZXQgPiBjYWxsLT5hY2tyX3BlbmRfY250KSB7Ci0JCWRvX0FDSyA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7Ci0JCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7Ci0JCWdvdG8gZ2VuX0FDSzsKLQl9Ci0KLQlpZiAoaGRyLT5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7Ci0JCWRvX0FDSyA9IFJYUlBDX0FDS19SRVFVRVNURUQ7Ci0JfQotCi0JLyogZ2VuZXJhdGUgYW4gQUNLIG9uIHRoZSBmaW5hbCBwYWNrZXQgb2YgYSByZXBseSBqdXN0IHJlY2VpdmVkICovCi0JaWYgKGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQlpZiAoY2FsbC0+Y29ubi0+b3V0X2NsaWVudGZsYWcpCi0JCQlmb3JjZSA9IDE7Ci0JfQotCWVsc2UgaWYgKCEoaGRyLT5mbGFncyAmIFJYUlBDX01PUkVfUEFDS0VUUykpIHsKLQkJZG9fQUNLID0gUlhSUENfQUNLX1JFUVVFU1RFRDsKLQl9Ci0KLQkvKiByZS1BQ0sgcGFja2V0cyBwcmV2aW91c2x5IHJlY2VpdmVkIG91dC1vZi1vcmRlciAqLwotCWZvciAob2Zmc2V0Kys7IG9mZnNldCA8IFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFOyBvZmZzZXQrKykKLQkJaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCi0JCQlicmVhazsKLQotCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7Ci0KLQkvKiBnZW5lcmF0ZSBhbiBBQ0sgaWYgd2UgZmlsbCB1cCB0aGUgd2luZG93ICovCi0JaWYgKGNhbGwtPmFja3JfcGVuZF9jbnQgPj0gUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpCi0JCWZvcmNlID0gMTsKLQotIGdlbl9BQ0s6Ci0JX2RlYnVnKCIlMDVsdSBBQ0tzIHBlbmQ9JXUgbm9ybT0lcyBzcGVjaWFsPSVzJXMiLAotCSAgICAgICBqaWZmaWVzIC0gY2FsbC0+Y2ppZiwKLQkgICAgICAgY2FsbC0+YWNrcl9wZW5kX2NudCwKLQkgICAgICAgcnhycGNfYWNrc1tkb19BQ0tdLAotCSAgICAgICByeHJwY19hY2tzW3NwZWNpYWxfQUNLXSwKLQkgICAgICAgZm9yY2UgPyAiIGltbWVkaWF0ZSIgOgotCSAgICAgICBkb19BQ0sgPT0gUlhSUENfQUNLX1JFUVVFU1RFRCA/ICIgbWVyZ2UtcmVxIiA6Ci0JICAgICAgIGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCA/ICIgZmluYWxpc2UiIDoKLQkgICAgICAgIiBkZWZlciIKLQkgICAgICAgKTsKLQotCS8qIHNlbmQgYW55IHBlbmRpbmcgbm9ybWFsIEFDS3MgaWYgbmVlZCBiZSAqLwotCWlmIChjYWxsLT5hY2tyX3BlbmRfY250ID4gMCkgewotCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLwotCQljYWxsLT5hY2tyLmJ1ZmZlclNwYWNlCT0gaHRvbnMoUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpOwotCQljYWxsLT5hY2tyLm1heFNrZXcJPSBodG9ucyhtaW4oY2FsbC0+YWNrcl9oaWdoX3NlcSAtIHNlcSwKLQkJCQkJCSAgICA2NTUzNVUpKTsKLQkJY2FsbC0+YWNrci5maXJzdFBhY2tldAk9IGh0b25sKGNhbGwtPmFja3Jfd2luX2JvdCk7Ci0JCWNhbGwtPmFja3IucHJldmlvdXNQYWNrZXQgPSBjYWxsLT5hY2tyX3ByZXZfc2VxOwotCQljYWxsLT5hY2tyLnNlcmlhbAk9IGhkci0+c2VyaWFsOwotCQljYWxsLT5hY2tyLm5BY2tzCT0gY2FsbC0+YWNrcl9wZW5kX2NudDsKLQotCQlpZiAoZG9fQUNLID09IFJYUlBDX0FDS19SRVFVRVNURUQpCi0JCQljYWxsLT5hY2tyLnJlYXNvbiA9IGRvX0FDSzsKLQotCQkvKiBnZW5lcmF0ZSB0aGUgQUNLIGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAoc3BlY2lhbF9BQ0sgfHwgZm9yY2UpIHsKLQkJCWVyciA9IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygKLQkJCQljYWxsLCBkb19BQ0sgPT0gUlhSUENfQUNLX0RFTEFZID8gMCA6IHNlcSk7Ci0JCQlpZiAoZXJyIDwgMCkgewotCQkJCXJldCA9IGVycjsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChjYWxsLT5hY2tyLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUkVRVUVTVEVEKQotCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSBzZXE7Ci0KLQkvKiBzdGFydCB0aGUgQUNLIHRpbWVyIGlmIG5vdCBydW5uaW5nIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBkZWZlcnJlZAotCSAqIEFDS3MgKi8KLQlpZiAoY2FsbC0+YWNrcl9wZW5kX2NudCA+IDAgJiYKLQkgICAgY2FsbC0+YWNrci5yZWFzb24gIT0gUlhSUENfQUNLX1JFUVVFU1RFRCAmJgotCSAgICAhdGltZXJfcGVuZGluZygmY2FsbC0+YWNrcl9kZnJfdGltbykKLQkgICAgKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGltbzsKLQotCQl0aW1vID0gcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQgKyBqaWZmaWVzOwotCi0JCV9kZWJ1ZygiU1RBUlQgQUNLUiBUSU1FUiBmb3IgY2o9JWx1IiwgdGltbyAtIGNhbGwtPmNqaWYpOwotCi0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCW1vZF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbywgdGltbyk7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQl9Ci0JZWxzZSBpZiAoKGNhbGwtPmFja3JfcGVuZF9jbnQgPT0gMCB8fAotCQkgIGNhbGwtPmFja3IucmVhc29uID09IFJYUlBDX0FDS19SRVFVRVNURUQpICYmCi0JCSB0aW1lcl9wZW5kaW5nKCZjYWxsLT5hY2tyX2Rmcl90aW1vKQotCQkgKSB7Ci0JCS8qIHN0b3AgdGltZXIgaWYgbm8gcGVuZGluZyBBQ0tzICovCi0JCV9kZWJ1ZygiQ0xFQVIgQUNLUiBUSU1FUiIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JfQotCi0JLyogc2VuZCBhIHNwZWNpYWwgQUNLIGlmIG9uZSBpcyByZXF1aXJlZCAqLwotCWlmIChzcGVjaWFsX0FDSykgewotCQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQkJc3RydWN0IGt2ZWMgZGlvdlsyXTsKLQkJdWludDhfdCBhY2tzWzFdID0geyBSWFJQQ19BQ0tfVFlQRV9BQ0sgfTsKLQotCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLwotCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyhSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSk7Ci0JCWFjay5tYXhTa2V3CT0gaHRvbnMobWluKGNhbGwtPmFja3JfaGlnaF9zZXEgLSBzZXEsCi0JCQkJCSAgICA2NTUzNVUpKTsKLQkJYWNrLmZpcnN0UGFja2V0CT0gaHRvbmwoY2FsbC0+YWNrcl93aW5fYm90KTsKLQkJYWNrLnByZXZpb3VzUGFja2V0ID0gY2FsbC0+YWNrcl9wcmV2X3NlcTsKLQkJYWNrLnNlcmlhbAk9IGhkci0+c2VyaWFsOwotCQlhY2sucmVhc29uCT0gc3BlY2lhbF9BQ0s7Ci0JCWFjay5uQWNrcwk9IDA7Ci0KLQkJX3Byb3RvKCJSeCBTZW5kaW5nIHMtQUNLIgotCQkgICAgICAgIiB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCi0JCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCi0JCSAgICAgICBudG9obChhY2suZmlyc3RQYWNrZXQpLAotCQkgICAgICAgbnRvaGwoYWNrLnByZXZpb3VzUGFja2V0KSwKLQkJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAotCQkgICAgICAgcnhycGNfYWNrc1thY2sucmVhc29uXSwKLQkJICAgICAgIGFjay5uQWNrcyk7Ci0KLQkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihzdHJ1Y3QgcnhycGNfYWNrcGFja2V0KTsKLQkJZGlvdlswXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWRpb3ZbMV0uaW92X2xlbiAgPSBzaXplb2YoYWNrcyk7Ci0JCWRpb3ZbMV0uaW92X2Jhc2UgPSBhY2tzOwotCi0JCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSBtZXNzYWdlICovCi0JCWVyciA9IHJ4cnBjX2Nvbm5fbmV3bXNnKGNhbGwtPmNvbm4sY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLLAotCQkJCQloZHItPnNlcSA/IDIgOiAxLCBkaW92LAotCQkJCQlHRlBfS0VSTkVMLAotCQkJCQkmbXNnKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXJldCA9IGVycjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbXNnLT5zZXEgPSBzZXE7Ci0JCW1zZy0+aGRyLnNlcSA9IGh0b25sKHNlcSk7Ci0JCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7Ci0KLQkJZXJyID0gcnhycGNfY29ubl9zZW5kbXNnKGNhbGwtPmNvbm4sIG1zZyk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlyZXQgPSBlcnI7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQljYWxsLT5wa3Rfc25kX2NvdW50Kys7Ci0JfQotCi0gb3V0OgotCWlmIChoZHItPnNlcSkKLQkJY2FsbC0+YWNrcl9wcmV2X3NlcSA9IGhkci0+c2VxOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGhhbmRsZSB3b3JrIHRvIGJlIGRvbmUgb24gYSBjYWxsCi0gKiAtIGluY2x1ZGVzIHBhY2tldCByZWNlcHRpb24gYW5kIHRpbWVvdXQgcHJvY2Vzc2luZwotICovCi12b2lkIHJ4cnBjX2NhbGxfZG9fc3R1ZmYoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JX2VudGVyKCIlcHtmbGFncz0lbHh9IiwgY2FsbCwgY2FsbC0+ZmxhZ3MpOwotCi0JLyogaGFuZGxlIHBhY2tldCByZWNlcHRpb24gKi8KLQlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX1JDVl9QS1QpIHsKLQkJX2RlYnVnKCItIHJlY2VpdmUgcGFja2V0Iik7Ci0JCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX1JDVl9QS1Q7Ci0JCXJ4cnBjX2NhbGxfcmVjZWl2ZV9wYWNrZXQoY2FsbCk7Ci0JfQotCi0JLyogaGFuZGxlIG92ZXJkdWUgQUNLcyAqLwotCWlmIChjYWxsLT5mbGFncyAmIFJYUlBDX0NBTExfQUNLU19USU1PKSB7Ci0JCV9kZWJ1ZygiLSBvdmVyZHVlIEFDSyB0aW1lb3V0Iik7Ci0JCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX0FDS1NfVElNTzsKLQkJcnhycGNfY2FsbF9yZXNlbmQoY2FsbCwgY2FsbC0+c25kX3NlcV9jb3VudCk7Ci0JfQotCi0JLyogaGFuZGxlIGxhY2sgb2YgcmVjZXB0aW9uICovCi0JaWYgKGNhbGwtPmZsYWdzICYgUlhSUENfQ0FMTF9SQ1ZfVElNTykgewotCQlfZGVidWcoIi0gcmVjZXB0aW9uIHRpbWVvdXQiKTsKLQkJY2FsbC0+ZmxhZ3MgJj0gflJYUlBDX0NBTExfUkNWX1RJTU87Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTyk7Ci0JfQotCi0JLyogaGFuZGxlIGRlZmVycmVkIEFDS3MgKi8KLQlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX0FDS1JfVElNTyB8fAotCSAgICAoY2FsbC0+YWNrci5uQWNrcyA+IDAgJiYgY2FsbC0+YWNrci5yZWFzb24gPT0gUlhSUENfQUNLX1JFUVVFU1RFRCkKLQkgICAgKSB7Ci0JCV9kZWJ1ZygiLSBkZWZlcnJlZCBBQ0sgdGltZW91dDogY2o9JTA1bHUgcj0lcyBuPSV1IiwKLQkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAotCQkgICAgICAgcnhycGNfYWNrc1tjYWxsLT5hY2tyLnJlYXNvbl0sCi0JCSAgICAgICBjYWxsLT5hY2tyLm5BY2tzKTsKLQotCQljYWxsLT5mbGFncyAmPSB+UlhSUENfQ0FMTF9BQ0tSX1RJTU87Ci0KLQkJaWYgKGNhbGwtPmFja3IubkFja3MgPiAwICYmCi0JCSAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSAhPSBSWFJQQ19DU1RBVEVfRVJST1IpIHsKLQkJCS8qIGdlbmVyYXRlIEFDSyAqLwotCQkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIGNhbGwtPmFja3JfZGZyX3NlcSk7Ci0JCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSAwOwotCQl9Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9kb19zdHVmZigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGFuIGFib3J0IG1lc3NhZ2UgYXQgY2FsbCBvciBjb25uZWN0aW9uIGxldmVsCi0gKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggY2FsbC0+bG9jayBoZWxkCi0gKiAtIHRoZSBzdXBwbGllZCBlcnJvciBjb2RlIGlzIHNlbnQgYXMgdGhlIHBhY2tldCBkYXRhCi0gKi8KLXN0YXRpYyBpbnQgX19yeHJwY19jYWxsX2Fib3J0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgZXJybm8pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGt2ZWMgZGlvdlsxXTsKLQlpbnQgcmV0OwotCV9fYmUzMiBfZXJyb3I7Ci0KLQlfZW50ZXIoIiVweyUwOHh9LCVweyVkfSwlZCIsCi0JICAgICAgIGNvbm4sIG50b2hsKGNvbm4tPmNvbm5faWQpLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgZXJybm8pOwotCi0JLyogaWYgdGhpcyBjYWxsIGlzIGFscmVhZHkgYWJvcnRlZCwgdGhlbiBqdXN0IHdha2UgdXAgYW55IHdhaXRlcnMgKi8KLQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMoY2FsbCk7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCS8qIGNoYW5nZSB0aGUgc3RhdGUgX3dpdGhfIHRoZSBsb2NrIHN0aWxsIGhlbGQgKi8KLQljYWxsLT5hcHBfY2FsbF9zdGF0ZQk9IFJYUlBDX0NTVEFURV9FUlJPUjsKLQljYWxsLT5hcHBfZXJyX3N0YXRlCT0gUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JUOwotCWNhbGwtPmFwcF9lcnJubwkJPSBlcnJubzsKLQljYWxsLT5hcHBfbWFyawkJPSBSWFJQQ19BUFBfTUFSS19FT0Y7Ci0JY2FsbC0+YXBwX3JlYWRfYnVmCT0gTlVMTDsKLQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7Ci0KLQlfc3RhdGUoY2FsbCk7Ci0KLQkvKiBhc2sgdGhlIGFwcCB0byB0cmFuc2xhdGUgdGhlIGVycm9yIGNvZGUgKi8KLQljYWxsLT5hcHBfYWVtYXBfZnVuYyhjYWxsKTsKLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCS8qIGZsdXNoIGFueSBvdXRzdGFuZGluZyBBQ0tzICovCi0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0KLQlpZiAocnhycGNfY2FsbF9pc19hY2tfcGVuZGluZyhjYWxsKSkKLQkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIDApOwotCi0JLyogc2VuZCB0aGUgYWJvcnQgcGFja2V0IG9ubHkgaWYgd2UgYWN0dWFsbHkgdHJhZGVkIHNvbWUgb3RoZXIKLQkgKiBwYWNrZXRzICovCi0JcmV0ID0gMDsKLQlpZiAoY2FsbC0+cGt0X3NuZF9jb3VudCB8fCBjYWxsLT5wa3RfcmN2X2NvdW50KSB7Ci0JCS8qIGFjdHVhbGx5IHNlbmQgdGhlIGFib3J0ICovCi0JCV9wcm90bygiUnggU2VuZGluZyBDYWxsIEFCT1JUIHsgZGF0YT0lZCB9IiwKLQkJICAgICAgIGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKLQotCQlfZXJyb3IgPSBodG9ubChjYWxsLT5hcHBfYWJvcnRfY29kZSk7Ci0KLQkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihfZXJyb3IpOwotCQlkaW92WzBdLmlvdl9iYXNlID0gJl9lcnJvcjsKLQotCQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjb25uLCBjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCwKLQkJCQkJMSwgZGlvdiwgR0ZQX0tFUk5FTCwgJm1zZyk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gcnhycGNfY29ubl9zZW5kbXNnKGNvbm4sIG1zZyk7Ci0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0JfQotCi0JLyogdGVsbCB0aGUgYXBwIGxheWVyIHRvIGxldCBnbyAqLwotCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOwotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgX19yeHJwY19jYWxsX2Fib3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHNlbmQgYW4gYWJvcnQgbWVzc2FnZSBhdCBjYWxsIG9yIGNvbm5lY3Rpb24gbGV2ZWwKLSAqIC0gdGhlIHN1cHBsaWVkIGVycm9yIGNvZGUgaXMgc2VudCBhcyB0aGUgcGFja2V0IGRhdGEKLSAqLwotaW50IHJ4cnBjX2NhbGxfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGludCBlcnJvcikKLXsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCi0JcmV0dXJuIF9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCBlcnJvcik7Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfYWJvcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcHJvY2VzcyBwYWNrZXRzIHdhaXRpbmcgZm9yIHRoaXMgY2FsbAotICovCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQlfZW50ZXIoIiVwIiwgY2FsbCk7Ci0KLQlyeHJwY19nZXRfY2FsbChjYWxsKTsgLyogbXVzdCBub3QgZ28gYXdheSB0b28gc29vbiBpZiBhYm9ydGVkIGJ5Ci0JCQkgICAgICAgKiBhcHAtbGF5ZXIgKi8KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgewotCQkvKiB0cnkgdG8gZ2V0IG5leHQgcGFja2V0ICovCi0JCV9wID0gTlVMTDsKLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5yY3ZfcmVjZWl2ZXEpKSB7Ci0JCQlfcCA9IGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0OwotCQkJbGlzdF9kZWxfaW5pdChfcCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWlmICghX3ApCi0JCQlicmVhazsKLQotCQltc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0KLQkJX3Byb3RvKCJSeCAlMDVsdSBSZWNlaXZlZCAlcyBwYWNrZXQgKCUlJXUsIyV1LCVjJWMlYyVjJWMpIiwKLQkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAotCQkgICAgICAgcnhycGNfcGt0c1ttc2ctPmhkci50eXBlXSwKLQkJICAgICAgIG50b2hsKG1zZy0+aGRyLnNlcmlhbCksCi0JCSAgICAgICBtc2ctPnNlcSwKLQkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfSlVNQk9fUEFDS0VUCT8gJ2onIDogJy0nLAotCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19NT1JFX1BBQ0tFVFMJPyAnbScgOiAnLScsCi0JCSAgICAgICBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUCT8gJ2wnIDogJy0nLAotCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19SRVFVRVNUX0FDSwk/ICdyJyA6ICctJywKLQkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRAk/ICdDJyA6ICdTJwotCQkgICAgICAgKTsKLQotCQlzd2l0Y2ggKG1zZy0+aGRyLnR5cGUpIHsKLQkJCS8qIGRlYWwgd2l0aCBkYXRhIHBhY2tldHMgKi8KLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQkJLyogQUNLIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5ICovCi0JCQlzd2l0Y2ggKHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKGNhbGwsICZtc2ctPmhkciwKLQkJCQkJCQlOVUxMKSkgewotCQkJY2FzZSAwOiAvKiB1c2VmdWwgcGFja2V0ICovCi0JCQkJcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KGNhbGwsIG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6IC8qIGR1cGxpY2F0ZSBvciBvdXQtb2Ytd2luZG93IHBhY2tldCAqLwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJCS8qIGRlYWwgd2l0aCBBQ0sgcGFja2V0cyAqLwotCQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKLQkJCXJ4cnBjX2NhbGxfcmVjZWl2ZV9hY2tfcGFja2V0KGNhbGwsIG1zZyk7Ci0JCQlicmVhazsKLQotCQkJLyogZGVhbCB3aXRoIGFib3J0IHBhY2tldHMgKi8KLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDogewotCQkJX19iZTMyIF9kYnVmLCAqZHA7Ci0KLQkJCWRwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKLQkJCQkJCXNpemVvZihfZGJ1ZiksICZfZGJ1Zik7Ci0JCQlpZiAoZHAgPT0gTlVMTCkKLQkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFCT1JUIHBhY2tldFxuIik7Ci0KLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgQ2FsbCBBQk9SVCB7IGRhdGE9JWQgfSIsCi0JCQkgICAgICAgKGRwID8gbnRvaGwoKmRwKSA6IDApKTsKLQotCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlCT0gUlhSUENfQ1NUQVRFX0VSUk9SOwotCQkJY2FsbC0+YXBwX2Vycl9zdGF0ZQk9IFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOwotCQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUJPSAoZHAgPyBudG9obCgqZHApIDogMCk7Ci0JCQljYWxsLT5hcHBfZXJybm8JCT0gLUVDT05OQUJPUlRFRDsKLQkJCWNhbGwtPmFwcF9tYXJrCQk9IFJYUlBDX0FQUF9NQVJLX0VPRjsKLQkJCWNhbGwtPmFwcF9yZWFkX2J1Zgk9IE5VTEw7Ci0JCQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7Ci0KLQkJCS8qIGFzayB0aGUgYXBwIHRvIHRyYW5zbGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotCQkJY2FsbC0+YXBwX2FlbWFwX2Z1bmMoY2FsbCk7Ci0JCQlfc3RhdGUoY2FsbCk7Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCQljYWxsLT5hcHBfZXJyb3JfZnVuYyhjYWxsKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBkZWFsIHdpdGggb3RoZXIgcGFja2V0IHR5cGVzICovCi0JCQlfcHJvdG8oIlJ4IFVuc3VwcG9ydGVkIHBhY2tldCB0eXBlICV1ICgjJXUpIiwKLQkJCSAgICAgICBtc2ctPmhkci50eXBlLCBtc2ctPnNlcSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0gb3V0OgotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHByb2Nlc3MgbmV4dCBkYXRhIHBhY2tldAotICogLSBhcyB0aGUgbmV4dCBkYXRhIHBhY2tldCBhcnJpdmVzOgotICogICAtIGl0IGlzIHF1ZXVlZCBvbiBhcHBfcmVhZHlxIF9pZl8gaXQgaXMgdGhlIG5leHQgb25lIGV4cGVjdGVkCi0gKiAgICAgKGFwcF9yZWFkeV9zZXErMSkKLSAqICAgLSBpdCBpcyBxdWV1ZWQgb24gYXBwX3VucmVhZHlxIF9pZl8gaXQgaXMgbm90IHRoZSBuZXh0IG9uZSBleHBlY3RlZAotICogICAtIGlmIGEgcGFja2V0IHBsYWNlZCBvbiBhcHBfcmVhZHlxIGNvbXBsZXRlbHkgZmlsbHMgYSBob2xlIGxlYWRpbmcgdXAgdG8KLSAqICAgICB0aGUgZmlyc3QgcGFja2V0IG9uIGFwcF91bnJlYWR5cSwgdGhlbiBwYWNrZXRzIG5vdyBpbiBzZXF1ZW5jZSBhcmUKLSAqICAgICB0cmFuZmVycmVkIHRvIGFwcF9yZWFkeXEKLSAqIC0gdGhlIGFwcGxpY2F0aW9uIGxheWVyIGNhbiBvbmx5IHNlZSBwYWNrZXRzIG9uIGFwcF9yZWFkeXEKLSAqICAgKGFwcF9yZWFkeV9xdHkgYnl0ZXMpCi0gKiAtIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpcyBwcm9kZGVkIGV2ZXJ5IHRpbWUgYSBuZXcgcGFja2V0IGFycml2ZXMKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCWNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24gKm9wdGJsLCAqb3A7Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnBtc2c7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JaW50IHJldCwgbG8sIGhpLCBybXRpbW87Ci0JX19iZTMyIG9waWQ7Ci0KLQlfZW50ZXIoIiVweyV1fSwlcHsldX0iLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgbXNnLCBtc2ctPnNlcSk7Ci0KLQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCi0JLyogYWRkIHRvIHRoZSB1bnJlYWR5IHF1ZXVlIGlmIHdlJ2QgaGF2ZSB0byBjcmVhdGUgYSBob2xlIGluIHRoZSByZWFkeQotCSAqIHF1ZXVlIG90aGVyd2lzZSAqLwotCWlmIChtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkgewotCQlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byB1bnJlYWR5cSIsIG1zZy0+c2VxKTsKLQotCQkvKiBpbnNlcnQgaW4gc2VxIG9yZGVyICovCi0JCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hcHBfdW5yZWFkeXEpIHsKLQkJCXBtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlpZiAocG1zZy0+c2VxID4gbXNnLT5zZXEpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssIF9wKTsKLQotCQlfbGVhdmUoIiBbdW5yZWFkeXFdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBuZXh0IGluIHNlcXVlbmNlIC0gc2ltcGx5IGFwcGVuZCBpbnRvIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUgKi8KLQlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byByZWFkeXEgKCslWmQgPT4gJVpkIGJ5dGVzKSIsCi0JICAgICAgIG1zZy0+c2VxLCBtc2ctPmRzaXplLCBjYWxsLT5hcHBfcmVhZHlfcXR5KTsKLQotCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JY2FsbC0+YXBwX3JlYWR5X3NlcSA9IG1zZy0+c2VxOwotCWNhbGwtPmFwcF9yZWFkeV9xdHkgKz0gbXNnLT5kc2l6ZTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKLQotCS8qIG1vdmUgdW5yZWFkeSBwYWNrZXRzIHRvIHRoZSByZWFkeXEgaWYgd2UgZ290IHJpZCBvZiBhIGhvbGUgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF91bnJlYWR5cSkpIHsKLQkJcG1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCi0JCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0KLQkJaWYgKHBtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkKLQkJCWJyZWFrOwotCi0JCS8qIG5leHQgaW4gc2VxdWVuY2UgLSBqdXN0IG1vdmUgbGlzdC10by1saXN0ICovCi0JCV9kZWJ1ZygiQ2FsbCB0cmFuc2ZlciBwYWNrZXQgJWQgdG8gcmVhZHlxICgrJVpkID0+ICVaZCBieXRlcykiLAotCQkgICAgICAgcG1zZy0+c2VxLCBwbXNnLT5kc2l6ZSwgY2FsbC0+YXBwX3JlYWR5X3F0eSk7Ci0KLQkJY2FsbC0+YXBwX3JlYWR5X3NlcSA9IHBtc2ctPnNlcTsKLQkJY2FsbC0+YXBwX3JlYWR5X3F0eSArPSBwbXNnLT5kc2l6ZTsKLQkJbGlzdF9tb3ZlX3RhaWwoJnBtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKLQl9Ci0KLQkvKiBzZWUgaWYgd2UndmUgZ290IHRoZSBsYXN0IHBhY2tldCB5ZXQgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9yZWFkeXEpKSB7Ci0JCXBtc2cgPSBsaXN0X2VudHJ5KGNhbGwtPmFwcF9yZWFkeXEucHJldiwKLQkJCQkgIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJaWYgKHBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCQljYWxsLT5hcHBfbGFzdF9yY3YgPSAxOwotCQkJX2RlYnVnKCJMYXN0IHBhY2tldCBvbiByZWFkeXEiKTsKLQkJfQotCX0KLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQkJLyogZG8gbm90aGluZyBpZiBjYWxsIGFscmVhZHkgYWJvcnRlZCAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCV9sZWF2ZSgiIFtlcnJvcl0iKTsKLQkJcmV0dXJuOwotCi0JCS8qIGV4dHJhY3QgdGhlIG9wZXJhdGlvbiBJRCBmcm9tIGFuIGluY29taW5nIGNhbGwgaWYgdGhhdCdzIG5vdAotCQkgKiB5ZXQgYmVlbiBkb25lICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCS8qIGhhbmRsZSBhcyB5ZXQgaW5zdWZmaWNpZW50IGRhdGEgZm9yIHRoZSBvcGVyYXRpb24gSUQgKi8KLQkJaWYgKGNhbGwtPmFwcF9yZWFkeV9xdHkgPCA0KSB7Ci0JCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQotCQkJCS8qIHRyb3VibGUgLSBsYXN0IHBhY2tldCBzZWVuICovCi0JCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKLQotCQkJX2xlYXZlKCIiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIHB1bGwgdGhlIG9wZXJhdGlvbiBJRCBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCAmb3BpZCwgc2l6ZW9mKG9waWQpLCAwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50aygiVW5leHBlY3RlZCBlcnJvciBmcm9tIHJlYWQtZGF0YTogJWRcbiIsIHJldCk7Ci0JCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0VSUk9SKQotCQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJCV9sZWF2ZSgiIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FsbC0+YXBwX29wY29kZSA9IG50b2hsKG9waWQpOwotCi0JCS8qIGxvY2F0ZSB0aGUgb3BlcmF0aW9uIGluIHRoZSBhdmFpbGFibGUgb3BzIHRhYmxlICovCi0JCW9wdGJsID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2JlZ2luOwotCQlsbyA9IDA7Ci0JCWhpID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2VuZCAtIG9wdGJsOwotCi0JCXdoaWxlIChsbyA8IGhpKSB7Ci0JCQlpbnQgbWlkID0gKGhpICsgbG8pIC8gMjsKLQkJCW9wID0gJm9wdGJsW21pZF07Ci0JCQlpZiAoY2FsbC0+YXBwX29wY29kZSA9PSBvcC0+aWQpCi0JCQkJZ290byBmb3VuZF9vcDsKLQkJCWlmIChjYWxsLT5hcHBfb3Bjb2RlID4gb3AtPmlkKQotCQkJCWxvID0gbWlkICsgMTsKLQkJCWVsc2UKLQkJCQloaSA9IG1pZDsKLQkJfQotCi0JCS8qIHNlYXJjaCBmYWlsZWQgKi8KLQkJa3Byb3RvKCJSeCBDbGllbnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAlZCBmcm9tICVzIHNlcnZpY2UiLAotCQkgICAgICAgY2FsbC0+YXBwX29wY29kZSwgY2FsbC0+Y29ubi0+c2VydmljZS0+bmFtZSk7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTlZBTCk7Ci0JCV9sZWF2ZSgiIFtpbnZhbF0iKTsKLQkJcmV0dXJuOwotCi0JZm91bmRfb3A6Ci0JCV9wcm90bygiUnggQ2xpZW50IHJlcXVlc3RlZCBvcGVyYXRpb24gJXMgZnJvbSAlcyBzZXJ2aWNlIiwKLQkJICAgICAgIG9wLT5uYW1lLCBjYWxsLT5jb25uLT5zZXJ2aWNlLT5uYW1lKTsKLQotCQkvKiB3ZSdyZSBub3cgd2FpdGluZyBmb3IgdGhlIGFyZ3VtZW50IGJsb2NrICh1bmxlc3MgdGhlIGNhbGwKLQkJICogd2FzIGFib3J0ZWQpICovCi0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRCB8fAotCQkgICAgY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZKSB7Ci0JCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9Ci0JCQkJCVJYUlBDX0NTVEFURV9TUlZSX1JDVl9BUkdTOwotCQkJZWxzZSBpZiAoY2FsbC0+YXBwX3JlYWR5X3F0eSA+IDApCi0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPQotCQkJCQlSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKLQkJCWVsc2UKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9Ci0JCQkJCVJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKLQkJCWNhbGwtPmFwcF9tYXJrID0gb3AtPmFzaXplOwotCQkJY2FsbC0+YXBwX3VzZXIgPSBvcC0+dXNlcjsKLQkJfQotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJX3N0YXRlKGNhbGwpOwotCQlicmVhazsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6Ci0JCS8qIGNoYW5nZSBzdGF0ZSBpZiBqdXN0IHJlY2VpdmVkIGxhc3QgcGFja2V0IG9mIGFyZyBibG9jayAqLwotCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCV9zdGF0ZShjYWxsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKLQkJLyogY2hhbmdlIHN0YXRlIGlmIGp1c3QgcmVjZWl2ZWQgbGFzdCBwYWNrZXQgb2YgcmVwbHkgYmxvY2sgKi8KLQkJcm10aW1vID0gMDsKLQkJaWYgKGNhbGwtPmFwcF9sYXN0X3JjdikgewotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk7Ci0JCQlybXRpbW8gPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCQlpZiAocm10aW1vKSB7Ci0JCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JCX0KLQotCQlfc3RhdGUoY2FsbCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogZGVhbCB3aXRoIGRhdGEgcmVjZXB0aW9uIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKi8KLQkJcHJpbnRrKCJVbmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsIGNhbGwtPmFwcF9jYWxsX3N0YXRlKTsKLQkJX19yeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFkgJiYKLQkgICAgY2FsbC0+YXBwX2xhc3RfcmN2KQotCQlCVUcoKTsKLQotCS8qIG90aGVyd2lzZSBqdXN0IGludm9rZSB0aGUgZGF0YSBmdW5jdGlvbiB3aGVuZXZlciB3ZSBjYW4gc2F0aXNmeSBpdHMgZGVzaXJlIGZvciBtb3JlCi0JICogZGF0YQotCSAqLwotCV9wcm90bygiUnggUmVjZWl2ZWQgT3AgRGF0YTogc3Q9JXUgcXR5PSVadSBtaz0lWnUlcyIsCi0JICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBjYWxsLT5hcHBfbWFyaywKLQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0LXJjdmQiIDogIiIpOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQotCXJldCA9IF9fcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIDA6Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKLQkJYnJlYWs7Ci0JY2FzZSAtRUFHQUlOOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgLUVDT05OQUJPUlRFRDoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlfX3J4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJYnJlYWs7Ci0JfQotCi0JX3N0YXRlKGNhbGwpOwotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlY2VpdmVkIGFuIEFDSyBwYWNrZXQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2Fja19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJCSAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IF9hY2ssICphcDsKLQlyeHJwY19zZXJpYWxfbmV0X3Qgc2VyaWFsOwotCXJ4cnBjX3NlcV90IHNlcTsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHsldX0sJXB7JXV9IiwgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIG1zZywgbXNnLT5zZXEpOwotCi0JLyogZXh0cmFjdCB0aGUgYmFzaWMgQUNLIHJlY29yZCAqLwotCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwgc2l6ZW9mKF9hY2spLCAmX2Fjayk7Ci0JaWYgKGFwID09IE5VTEwpIHsKLQkJcHJpbnRrKCJSeCBSZWNlaXZlZCBzaG9ydCBBQ0sgcGFja2V0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQltc2ctPm9mZnNldCArPSBzaXplb2YoX2Fjayk7Ci0KLQlzZXJpYWwgPSBhcC0+c2VyaWFsOwotCXNlcSA9IG50b2hsKGFwLT5maXJzdFBhY2tldCk7Ci0KLQlfcHJvdG8oIlJ4IFJlY2VpdmVkIEFDSyAlJSVkIHsgYj0laHUgbT0laHUgZj0ldSBwPSV1IHM9JXUgcj0lcyBuPSV1IH0iLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXJpYWwpLAotCSAgICAgICBudG9ocyhhcC0+YnVmZmVyU3BhY2UpLAotCSAgICAgICBudG9ocyhhcC0+bWF4U2tldyksCi0JICAgICAgIHNlcSwKLQkgICAgICAgbnRvaGwoYXAtPnByZXZpb3VzUGFja2V0KSwKLQkgICAgICAgbnRvaGwoc2VyaWFsKSwKLQkgICAgICAgcnhycGNfYWNrc1thcC0+cmVhc29uXSwKLQkgICAgICAgY2FsbC0+YWNrci5uQWNrcwotCSAgICAgICApOwotCi0JLyogY2hlY2sgdGhlIG90aGVyIHNpZGUgaXNuJ3QgQUNLJ2luZyBhIHNlcXVlbmNlIG51bWJlciBJIGhhdmVuJ3Qgc2VudAotCSAqIHlldCAqLwotCWlmIChhcC0+bkFja3MgPiAwICYmCi0JICAgIChzZXEgPiBjYWxsLT5zbmRfc2VxX2NvdW50IHx8Ci0JICAgICBzZXEgKyBhcC0+bkFja3MgLSAxID4gY2FsbC0+c25kX3NlcV9jb3VudCkpIHsKLQkJcHJpbnRrKCJSZWNlaXZlZCBBQ0sgKCMldS0jJXUpIGZvciB1bnNlbnQgcGFja2V0XG4iLAotCQkgICAgICAgc2VxLCBzZXEgKyBhcC0+bkFja3MgLSAxKTsKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGRlYWwgd2l0aCBSVFQgY2FsY3VsYXRpb24gKi8KLQlpZiAoc2VyaWFsKSB7Ci0JCXN0cnVjdCByeHJwY19tZXNzYWdlICpydHRtc2c7Ci0KLQkJLyogZmluZCB0aGUgcHJvbXB0aW5nIHBhY2tldCAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQlpZiAoY2FsbC0+c25kX3BpbmcgJiYgY2FsbC0+c25kX3BpbmctPmhkci5zZXJpYWwgPT0gc2VyaWFsKSB7Ci0JCQkvKiBpdCB3YXMgYSBwaW5nIHBhY2tldCAqLwotCQkJcnR0bXNnID0gY2FsbC0+c25kX3Bpbmc7Ci0JCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJCWlmIChydHRtc2cpIHsKLQkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOwotCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAotCQkJCQkJCSBydHRtc2csIG1zZyk7Ci0JCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JCQkvKiBpdCBvdWdodCB0byBiZSBhIGRhdGEgcGFja2V0IC0gbG9vayBpbiB0aGUgcGVuZGluZwotCQkJICogQUNLIGxpc3QgKi8KLQkJCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hY2tzX3BlbmRxKSB7Ci0JCQkJcnR0bXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsCi0JCQkJCQkgICAgbGluayk7Ci0JCQkJaWYgKHJ0dG1zZy0+aGRyLnNlcmlhbCA9PSBzZXJpYWwpIHsKLQkJCQkJaWYgKHJ0dG1zZy0+cnR0ZG9uZSkKLQkJCQkJCS8qIG5ldmVyIGRvIFJUVCB0d2ljZSB3aXRob3V0Ci0JCQkJCQkgKiByZXNlbmRpbmcgKi8KLQkJCQkJCWJyZWFrOwotCi0JCQkJCXJ0dG1zZy0+cnR0ZG9uZSA9IDE7Ci0JCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dCgKLQkJCQkJCWNhbGwtPmNvbm4tPnBlZXIsIHJ0dG1zZywgbXNnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChhcC0+cmVhc29uKSB7Ci0JCS8qIGRlYWwgd2l0aCBuZWdhdGl2ZS9wb3NpdGl2ZSBhY2tub3dsZWRnZW1lbnQgb2YgZGF0YQotCQkgKiBwYWNrZXRzICovCi0JY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCWNhc2UgUlhSUENfQUNLX0RFTEFZOgotCWNhc2UgUlhSUENfQUNLX0lETEU6Ci0JCXJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhjYWxsLCBzZXEgLSAxKTsKLQotCWNhc2UgUlhSUENfQUNLX0RVUExJQ0FURToKLQljYXNlIFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U6Ci0JY2FzZSBSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1c6Ci0JCWNhbGwtPnNuZF9yZXNlbmRfY250ID0gMDsKLQkJcmV0ID0gcnhycGNfY2FsbF9yZWNvcmRfQUNLKGNhbGwsIG1zZywgc2VxLCBhcC0+bkFja3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJYnJlYWs7Ci0KLQkJLyogcmVzcG9uZCB0byBwaW5nIHBhY2tldHMgaW1tZWRpYXRlbHkgKi8KLQljYXNlIFJYUlBDX0FDS19QSU5HOgotCQlyeHJwY19jYWxsX2dlbmVyYXRlX0FDSyhjYWxsLCAmbXNnLT5oZHIsIGFwKTsKLQkJYnJlYWs7Ci0KLQkJLyogb25seSByZWNvcmQgUlRUIG9uIHBpbmcgcmVzcG9uc2UgcGFja2V0cyAqLwotCWNhc2UgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U6Ci0JCWlmIChjYWxsLT5zbmRfcGluZykgewotCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJ0dG1zZzsKLQotCQkJLyogb25seSBkbyBSVFQgc3R1ZmYgaWYgdGhlIHJlc3BvbnNlIG1hdGNoZXMgdGhlCi0JCQkgKiByZXRhaW5lZCBwaW5nICovCi0JCQlydHRtc2cgPSBOVUxMOwotCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJCWlmIChjYWxsLT5zbmRfcGluZyAmJgotCQkJICAgIGNhbGwtPnNuZF9waW5nLT5oZHIuc2VyaWFsID09IGFwLT5zZXJpYWwpIHsKLQkJCQlydHRtc2cgPSBjYWxsLT5zbmRfcGluZzsKLQkJCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJCWlmIChydHRtc2cpIHsKLQkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOwotCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAotCQkJCQkJCSBydHRtc2csIG1zZyk7Ci0JCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5zdXBwb3J0ZWQgQUNLIHJlYXNvbiAldVxuIiwgYXAtPnJlYXNvbik7Ci0JCWJyZWFrOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiByZWNvcmQgZGVmaW5pdGl2ZSBBQ0tzIGZvciBhbGwgbWVzc2FnZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgb25lIHdpdGggdGhlCi0gKiAnaGlnaGVzdCcgc2VxCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJcnhycGNfc2VxX3QgaGlnaGVzdCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCWludCBub3dfY29tcGxldGU7Ci0KLQlfZW50ZXIoIiVwe2Fkcz0ldX0sJXUiLCBjYWxsLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBoaWdoZXN0KTsKLQotCXdoaWxlIChjYWxsLT5hY2tzX2RmdHZfc2VxIDwgaGlnaGVzdCkgewotCQljYWxsLT5hY2tzX2RmdHZfc2VxKys7Ci0KLQkJX3Byb3RvKCJEZWZpbml0aXZlIEFDSyBvbiBwYWNrZXQgIyV1IiwgY2FsbC0+YWNrc19kZnR2X3NlcSk7Ci0KLQkJLyogZGlzY2FyZCB0aG9zZSBhdCBmcm9udCBvZiBxdWV1ZSB1bnRpbCBtZXNzYWdlIHdpdGggaGlnaGVzdAotCQkgKiBBQ0sgaXMgZm91bmQgKi8KLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJbXNnID0gTlVMTDsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2tzX3BlbmRxKSkgewotCQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hY2tzX3BlbmRxLm5leHQsCi0JCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOyAvKiBkZXF1ZXVlICovCi0JCQlpZiAobXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfU0VOVCkKLQkJCQljYWxsLT5hY2tzX3BlbmRfY250LS07Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCS8qIGluc2FuaXR5IGNoZWNrICovCi0JCWlmICghbXNnKQotCQkJcGFuaWMoIiVzKCk6IGFja3NfcGVuZHEgdW5leHBlY3RlZGx5IGVtcHR5XG4iLAotCQkJICAgICAgX19GVU5DVElPTl9fKTsKLQotCQlpZiAobXNnLT5zZXEgIT0gY2FsbC0+YWNrc19kZnR2X3NlcSkKLQkJCXBhbmljKCIlcygpOiBQYWNrZXQgIyV1IGV4cGVjdGVkIGF0IGZyb250IG9mIGFja3NfcGVuZHEiCi0JCQkgICAgICAiICgjJXUgZm91bmQpXG4iLAotCQkJICAgICAgX19GVU5DVElPTl9fLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBtc2ctPnNlcSk7Ci0KLQkJLyogZGlzY2FyZCB0aGUgbWVzc2FnZSAqLwotCQltc2ctPnN0YXRlID0gUlhSUENfTVNHX0RPTkU7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JLyogaWYgYWxsIHNlbnQgcGFja2V0cyBhcmUgZGVmaW5pdGl2ZWx5IEFDSydkIHRoZW4gcHJvZCBhbnkgc2xlZXBlcnMganVzdCBpbiBjYXNlICovCi0Jbm93X2NvbXBsZXRlID0gMDsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWlmIChjYWxsLT5hY2tzX2RmdHZfc2VxID09IGNhbGwtPnNuZF9zZXFfY291bnQpIHsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DT01QTEVURSkgewotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7Ci0JCQlfc3RhdGUoY2FsbCk7Ci0JCQlub3dfY29tcGxldGUgPSAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCWlmIChub3dfY29tcGxldGUpIHsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfY2FsbF9kZWZpbml0aXZlbHlfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlY29yZCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBBQ0tzL05BS3MKLSAqLwotc3RhdGljIGludCByeHJwY19jYWxsX3JlY29yZF9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJIHJ4cnBjX3NlcV90IHNlcSwKLQkJCQkgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICpkbXNnOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXJ4cnBjX3NlcV90IGhpZ2hlc3Q7Ci0JdW5zaWduZWQgaXg7Ci0Jc2l6ZV90IGNodW5rOwotCWNoYXIgcmVzZW5kLCBub3dfY29tcGxldGU7Ci0JdTggYWNrc1sxNl07Ci0KLQlfZW50ZXIoIiVwe2FwYz0ldSBhZHM9JXV9LCVwLCV1LCVadSIsCi0JICAgICAgIGNhbGwsIGNhbGwtPmFja3NfcGVuZF9jbnQsIGNhbGwtPmFja3NfZGZ0dl9zZXEsCi0JICAgICAgIG1zZywgc2VxLCBjb3VudCk7Ci0KLQkvKiBoYW5kbGUgcmUtQUNLJ2luZyBvZiBkZWZpbml0aXZlbHkgQUNLJ2QgcGFja2V0cyAobWF5IGJlIG91dC1vZi1vcmRlcgotCSAqIEFDS3MpICovCi0JaWYgKHNlcSA8PSBjYWxsLT5hY2tzX2RmdHZfc2VxKSB7Ci0JCXVuc2lnbmVkIGRlbHRhID0gY2FsbC0+YWNrc19kZnR2X3NlcSAtIHNlcTsKLQotCQlpZiAoY291bnQgPD0gZGVsdGEpIHsKLQkJCV9sZWF2ZSgiID0gMCBbYWxsIGRlZmluaXRpdmVseSBBQ0snZF0iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJc2VxICs9IGRlbHRhOwotCQljb3VudCAtPSBkZWx0YTsKLQkJbXNnLT5vZmZzZXQgKz0gZGVsdGE7Ci0JfQotCi0JaGlnaGVzdCA9IHNlcSArIGNvdW50IC0gMTsKLQlyZXNlbmQgPSAwOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJLyogZXh0cmFjdCB1cCB0byAxNiBBQ0sgc2xvdHMgYXQgYSB0aW1lICovCi0JCWNodW5rID0gbWluKGNvdW50LCBzaXplb2YoYWNrcykpOwotCQljb3VudCAtPSBjaHVuazsKLQotCQltZW1zZXQoYWNrcywgMiwgc2l6ZW9mKGFja3MpKTsKLQotCQlpZiAoc2tiX2NvcHlfYml0cyhtc2ctPnBrdCwgbXNnLT5vZmZzZXQsICZhY2tzLCBjaHVuaykgPCAwKSB7Ci0JCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFDSyBwYWNrZXRcbiIpOwotCQkJX2xlYXZlKCIgPSAtRUlOVkFMIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQltc2ctPm9mZnNldCArPSBjaHVuazsKLQotCQkvKiBjaGVjayB0aGF0IHRoZSBBQ0sgc2V0IGlzIHZhbGlkICovCi0JCWZvciAoaXggPSAwOyBpeCA8IGNodW5rOyBpeCsrKSB7Ci0JCQlzd2l0Y2ggKGFja3NbaXhdKSB7Ci0JCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKLQkJCQlicmVhazsKLQkJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKLQkJCQlyZXNlbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHVuc3VwcG9ydGVkIEFDSyBzdGF0ZSIKLQkJCQkgICAgICAgIiAldVxuIiwgYWNrc1tpeF0pOwotCQkJCV9sZWF2ZSgiID0gLUVJTlZBTCIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJX3Byb3RvKCJSeCBBQ0sgb2YgcGFja2V0cyAjJXUtIyV1ICIKLQkJICAgICAgICJbJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNdIChwZW5kPSV1KSIsCi0JCSAgICAgICBzZXEsICh1bnNpZ25lZCkgKHNlcSArIGNodW5rIC0gMSksCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4MF1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDFdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHgyXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4M11dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDRdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg1XV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Nl1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDddXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg4XV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4OV1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweEFdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhCXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Q11dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweERdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhFXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Rl1dLAotCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudAotCQkgICAgICAgKTsKLQotCQkvKiBtYXJrIHRoZSBwYWNrZXRzIGluIHRoZSBBQ0sgcXVldWUgYXMgYmVpbmcgcHJvdmlzaW9uYWxseQotCQkgKiBBQ0snZCAqLwotCQlpeCA9IDA7Ci0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJLyogZmluZCB0aGUgZmlyc3QgcGFja2V0IEFDSydkL05BSydkIGhlcmUgKi8KLQkJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPmFja3NfcGVuZHEpIHsKLQkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlpZiAoZG1zZy0+c2VxID09IHNlcSkKLQkJCQlnb3RvIGZvdW5kX2ZpcnN0OwotCQkJX2RlYnVnKCItICV1OiBza2lwcGluZyAjJXUiLCBpeCwgZG1zZy0+c2VxKTsKLQkJfQotCQlnb3RvIGJhZF9xdWV1ZTsKLQotCWZvdW5kX2ZpcnN0OgotCQlkbyB7Ci0JCQlfZGVidWcoIi0gJXU6IHByb2Nlc3NpbmcgIyV1ICglYykgYXBjPSV1IiwKLQkJCSAgICAgICBpeCwgZG1zZy0+c2VxLCBfYWNrdHlwZVthY2tzW2l4XV0sCi0JCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudCk7Ci0KLQkJCWlmIChhY2tzW2l4XSA9PSBSWFJQQ19BQ0tfVFlQRV9BQ0spIHsKLQkJCQlpZiAoZG1zZy0+c3RhdGUgPT0gUlhSUENfTVNHX1NFTlQpCi0JCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQtLTsKLQkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19BQ0tFRDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChkbXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfQUNLRUQpCi0JCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQrKzsKLQkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19TRU5UOwotCQkJfQotCQkJaXgrKzsKLQkJCXNlcSsrOwotCi0JCQlfcCA9IGRtc2ctPmxpbmsubmV4dDsKLQkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCX0gd2hpbGUoaXggPCBjaHVuayAmJgotCQkJX3AgIT0gJmNhbGwtPmFja3NfcGVuZHEgJiYKLQkJCWRtc2ctPnNlcSA9PSBzZXEpOwotCi0JCWlmIChpeCA8IGNodW5rKQotCQkJZ290byBiYWRfcXVldWU7Ci0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCX0KLQotCWlmIChyZXNlbmQpCi0JCXJ4cnBjX2NhbGxfcmVzZW5kKGNhbGwsIGhpZ2hlc3QpOwotCi0JLyogaWYgYWxsIHBhY2tldHMgYXJlIHByb3Zpc2lvbmFsbHkgQUNLJ2QsIHRoZW4gd2FrZSB1cCBhbnlvbmUgd2hvJ3MKLQkgKiB3YWl0aW5nIGZvciB0aGF0ICovCi0Jbm93X2NvbXBsZXRlID0gMDsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWlmIChjYWxsLT5hY2tzX3BlbmRfY250ID09IDApIHsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9TUlZSX1JDVl9GSU5BTF9BQ0spIHsKLQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX0NPTVBMRVRFOwotCQkJX3N0YXRlKGNhbGwpOwotCQl9Ci0JCW5vd19jb21wbGV0ZSA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCWlmIChub3dfY29tcGxldGUpIHsKLQkJX2RlYnVnKCItIHdha2UgdXAgd2FpdGVycyIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3JfZGZyX3RpbW8pOwotCQljYWxsLT5hcHBfYXR0bl9mdW5jKGNhbGwpOwotCX0KLQotCV9sZWF2ZSgiID0gMCAoYXBjPSV1KSIsIGNhbGwtPmFja3NfcGVuZF9jbnQpOwotCXJldHVybiAwOwotCi0gYmFkX3F1ZXVlOgotCXBhbmljKCIlcygpOiBhY2tzX3BlbmRxIGluIGJhZCBzdGF0ZSAocGFja2V0ICMldSBhYnNlbnQpXG4iLAotCSAgICAgIF9fRlVOQ1RJT05fXywgc2VxKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRyYW5zZmVyIGRhdGEgZnJvbSB0aGUgcmVhZHkgcGFja2V0IHF1ZXVlIHRvIHRoZSBhc3luY2hyb25vdXMgcmVhZCBidWZmZXIKLSAqIC0gc2luY2UgdGhpcyBmdW5jIGlzIHRoZSBvbmx5IG9uZSBnb2luZyB0byBsb29rIGF0IHBhY2tldHMgcXVldWVkIG9uCi0gKiAgIGFwcF9yZWFkeXEsIHdlIGRvbid0IG5lZWQgYSBsb2NrIHRvIG1vZGlmeSBvciBhY2Nlc3MgdGhlbSwgb25seSB0byBtb2RpZnkKLSAqICAgdGhlIHF1ZXVlIHBvaW50ZXJzCi0gKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAotICogLSB0aGUgYnVmZmVyIG11c3QgYmUgaW4ga2VybmVsIHNwYWNlCi0gKiAtIHJldHVybnM6Ci0gKgkwIGlmIGJ1ZmZlciBmaWxsZWQKLSAqCS1FQUdBSU4gaWYgYnVmZmVyIG5vdCBmaWxsZWQgYW5kIG1vcmUgZGF0YSB0byBjb21lCi0gKgktRUJBRE1TRyBpZiBsYXN0IHBhY2tldCByZWNlaXZlZCBhbmQgaW5zdWZmaWNpZW50IGRhdGEgbGVmdAotICoJLUVDT05OQUJPUlRFRCBpZiB0aGUgY2FsbCBoYXMgaW4gYW4gZXJyb3Igc3RhdGUKLSAqLwotc3RhdGljIGludCBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc2l6ZV90IHF0eTsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHthcz0lZCBidWY9JXAgcXR5PSVadS8lWnV9IiwKLQkgICAgICAgY2FsbCwKLQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsIGNhbGwtPmFwcF9yZWFkX2J1ZiwKLQkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOwotCi0JLyogY2hlY2sgdGhlIHN0YXRlICovCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFk6Ci0JCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKLQkJCXByaW50aygiJXMoJXAsJXAsJVpkKToiCi0JCQkgICAgICAgIiBJbmNvbnNpc3RlbnQgY2FsbCBzdGF0ZSAoJXMsIGxhc3QgcGt0KSIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCi0JCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQkJCUJVRygpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKLQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTOgotCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfR09UX1JFUExZOgotCQlicmVhazsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgotCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikgewotCQkJcHJpbnRrKCIlcyglcCwlcCwlWmQpOiIKLQkJCSAgICAgICAiIEluY29uc2lzdGVudCBjYWxsIHN0YXRlICglcywgbm90IGxhc3QgcGt0KSIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCi0JCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQkJCUJVRygpOwotCQl9Ci0JCV9kZWJ1ZygiVHJ5aW5nIHRvIHJlYWQgZGF0YSBmcm9tIGNhbGwgaW4gU05EX1JFUExZIHN0YXRlIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCV9sZWF2ZSgiID0gLUVDT05OQUJPUlRFRCIpOwotCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygicmVhZGluZyBpbiB1bmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsCi0JCSAgICAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7Ci0JCUJVRygpOwotCX0KLQotCS8qIGhhbmRsZSB0aGUgY2FzZSBvZiBub3QgaGF2aW5nIGFuIGFzeW5jIGJ1ZmZlciAqLwotCWlmICghY2FsbC0+YXBwX2FzeW5jX3JlYWQpIHsKLQkJaWYgKGNhbGwtPmFwcF9tYXJrID09IFJYUlBDX0FQUF9NQVJLX0VPRikgewotCQkJcmV0ID0gY2FsbC0+YXBwX2xhc3RfcmN2ID8gMCA6IC1FQUdBSU47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoY2FsbC0+YXBwX21hcmsgPj0gY2FsbC0+YXBwX3JlYWR5X3F0eSkgewotCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQkJCXJldCA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXQgPSBjYWxsLT5hcHBfbGFzdF9yY3YgPyAtRUJBRE1TRyA6IC1FQUdBSU47Ci0JCQl9Ci0JCX0KLQotCQlfbGVhdmUoIiA9ICVkIFtubyBidWZdIiwgcmV0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfcmVhZHlxKSAmJiBjYWxsLT5hcHBfbWFyayA+IDApIHsKLQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQotCQkvKiBkcmFnIGFzIG11Y2ggZGF0YSBhcyB3ZSBuZWVkIG91dCBvZiB0aGlzIHBhY2tldCAqLwotCQlxdHkgPSBtaW4oY2FsbC0+YXBwX21hcmssIG1zZy0+ZHNpemUpOwotCi0JCV9kZWJ1ZygicmVhZGluZyAlWnUgZnJvbSBza2I9JXAgb2ZmPSVsdSIsCi0JCSAgICAgICBxdHksIG1zZy0+cGt0LCBtc2ctPm9mZnNldCk7Ci0KLQkJaWYgKGNhbGwtPmFwcF9yZWFkX2J1ZikKLQkJCWlmIChza2JfY29weV9iaXRzKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKLQkJCQkJICBjYWxsLT5hcHBfcmVhZF9idWYsIHF0eSkgPCAwKQotCQkJCXBhbmljKCIlczogRmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHBhY2tldDoiCi0JCQkJICAgICAgIiAoJXAsJXAsJVpkKSIsCi0JCQkJICAgICAgX19GVU5DVElPTl9fLAotCQkJCSAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgcXR5KTsKLQotCQkvKiBpZiB0aGF0IHBhY2tldCBpcyBub3cgZW1wdHksIGRpc2NhcmQgaXQgKi8KLQkJY2FsbC0+YXBwX3JlYWR5X3F0eSAtPSBxdHk7Ci0JCW1zZy0+ZHNpemUgLT0gcXR5OwotCi0JCWlmIChtc2ctPmRzaXplID09IDApIHsKLQkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0JCWVsc2UgewotCQkJbXNnLT5vZmZzZXQgKz0gcXR5OwotCQl9Ci0KLQkJY2FsbC0+YXBwX21hcmsgLT0gcXR5OwotCQlpZiAoY2FsbC0+YXBwX3JlYWRfYnVmKQotCQkJY2FsbC0+YXBwX3JlYWRfYnVmICs9IHF0eTsKLQl9Ci0KLQlpZiAoY2FsbC0+YXBwX21hcmsgPT0gMCkgewotCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7Ci0JCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOwotCi0JCS8qIGFkanVzdCB0aGUgc3RhdGUgaWYgdXNlZCB1cCBhbGwgcGFja2V0cyAqLwotCQlpZiAobGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkgJiYgY2FsbC0+YXBwX2xhc3RfcmN2KSB7Ci0JCQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JCQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX1JDVl9PUElEOgotCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOwotCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKLQkJCQlfc3RhdGUoY2FsbCk7Ci0JCQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7Ci0JCQkJX3N0YXRlKGNhbGwpOwotCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tzX3RpbWVvdXQpOwotCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJX2xlYXZlKCIgPSAwIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKLQkJX2RlYnVnKCJJbnN1ZmZpY2llbnQgZGF0YSAoJVp1LyVadSkiLAotCQkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOwotCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7Ci0JCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOwotCi0JCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKLQkJcmV0dXJuIC1FQkFETVNHOwotCX0KLQotCV9sZWF2ZSgiID0gLUVBR0FJTiIpOwotCXJldHVybiAtRUFHQUlOOwotfSAvKiBlbmQgX19yeHJwY19jYWxsX3JlYWRfZGF0YSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBhdHRlbXB0IHRvIHJlYWQgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZGF0YSBmcm9tIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUKLSAqIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZAotICogLSBzaW5jZSB0aGlzIGZ1bmMgaXMgdGhlIG9ubHkgb25lIGdvaW5nIHRvIGxvb2sgYXQgcGFja2V0cyBxdWV1ZWQgb24KLSAqICAgYXBwX3JlYWR5cSwgd2UgZG9uJ3QgbmVlZCBhIGxvY2sgdG8gbW9kaWZ5IG9yIGFjY2VzcyB0aGVtLCBvbmx5IHRvIG1vZGlmeQotICogICB0aGUgcXVldWUgcG9pbnRlcnMKLSAqIC0gaWYgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIE5VTEwsIHRoZW4gZGF0YSBpcyBtZXJlbHkgZHJhaW5lZCwgbm90IGNvcGllZAotICogLSBpZiBmbGFncyZSWFJQQ19DQUxMX1JFQURfQkxPQ0ssIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgd2FpdCB1bnRpbCB0aGVyZSBpcwotICogICBlbm91Z2ggZGF0YSBvciBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZAotICogICAtIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBhZGRlZCB0aGUgY2FsbGluZyB0YXNrIHRvIHRoZSBjYWxsJ3Mgd2FpdAotICogICAgIHF1ZXVlIGJlZm9yZWhhbmQKLSAqIC0gaWYgZmxhZ3MmUlhSUENfQ0FMTF9SRUFEX0FMTCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpZiB0aGlzCi0gKiAgIGZ1bmN0aW9uIGRvZXNuJ3QgcmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEKLSAqLwotaW50IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHthcnE9JVp1fSwlcCwlWmQsJXgiLAotCSAgICAgICBjYWxsLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBidWZmZXIsIHNpemUsIGZsYWdzKTsKLQotCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0KLQlpZiAodW5saWtlbHkoISFjYWxsLT5hcHBfcmVhZF9idWYpKSB7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJX2xlYXZlKCIgPSAtRUJVU1kiKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQljYWxsLT5hcHBfbWFyayA9IHNpemU7Ci0JY2FsbC0+YXBwX3JlYWRfYnVmID0gYnVmZmVyOwotCWNhbGwtPmFwcF9hc3luY19yZWFkID0gMTsKLQljYWxsLT5hcHBfcmVhZF9jb3VudCsrOwotCi0JLyogcmVhZCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgKi8KLQlyZXQgPSBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQlpZiAoZmxhZ3MgJiBSWFJQQ19DQUxMX1JFQURfQUxMICYmCi0JCSAgICAoIWNhbGwtPmFwcF9sYXN0X3JjdiB8fCBjYWxsLT5hcHBfcmVhZHlfcXR5ID4gMCkpIHsKLQkJCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKLQkJCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUJBRE1TRyk7Ci0JCQlyZXR1cm4gLUVCQURNU0c7Ci0JCX0KLQotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCWNhbGwtPmFwcF9hdHRuX2Z1bmMoY2FsbCk7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gcmV0OwotCi0JY2FzZSAtRUNPTk5BQk9SVEVEOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCV9sZWF2ZSgiID0gJWQgW2Fib3J0ZWRdIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQotCWRlZmF1bHQ6Ci0JCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQotCWNhc2UgLUVBR0FJTjoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWlmICghKGZsYWdzICYgUlhSUENfQ0FMTF9SRUFEX0JMT0NLKSkgewotCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCS8qIHdhaXQgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSAqLwotCQlfZGVidWcoImJsb2NraW5nIGZvciBkYXRhIGFycml2YWwiKTsKLQotCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKCFjYWxsLT5hcHBfYXN5bmNfcmVhZCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlicmVhazsKLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCV9sZWF2ZSgiID0gLUVJTlRSIik7Ci0JCQlyZXR1cm4gLUVJTlRSOwotCQl9Ci0KLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9FUlJPUikgewotCQkJX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIik7Ci0JCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKLQkJfQotCi0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfcmVhZF9kYXRhKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHdyaXRlIGRhdGEgdG8gYSBjYWxsCi0gKiAtIHRoZSBkYXRhIG1heSBub3QgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBpdCBkb2Vzbid0IGZpbGwgYSBidWZmZXIKLSAqIC0gaWYgd2UgY2FuJ3QgcXVldWUgYWxsIHRoZSBkYXRhIGZvciBidWZmZXJpbmcgbm93LCBzaW92W10gd2lsbCBoYXZlIGJlZW4KLSAqICAgYWRqdXN0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHdoYXQgaGFzIGJlZW4gc2VudAotICovCi1pbnQgcnhycGNfY2FsbF93cml0ZV9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJICBzaXplX3Qgc2lvYywKLQkJCSAgc3RydWN0IGt2ZWMgKnNpb3YsCi0JCQkgIHU4IHJ4aGRyX2ZsYWdzLAotCQkJICBnZnBfdCBhbGxvY19mbGFncywKLQkJCSAgaW50IGR1cF9kYXRhLAotCQkJICBzaXplX3QgKnNpemVfc2VudCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCBrdmVjICpzcHRyOwotCXNpemVfdCBzcGFjZSwgc2l6ZSwgY2h1bmssIHRtcDsKLQljaGFyICpidWY7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJXAsJVp1LCVwLCUwMngsJXgsJWQsJXAiLAotCSAgICAgICBjYWxsLCBzaW9jLCBzaW92LCByeGhkcl9mbGFncywgYWxsb2NfZmxhZ3MsIGR1cF9kYXRhLAotCSAgICAgICBzaXplX3NlbnQpOwotCi0JKnNpemVfc2VudCA9IDA7Ci0Jc2l6ZSA9IDA7Ci0JcmV0ID0gLUVJTlZBTDsKLQotCS8qIGNhbid0IHNlbmQgbW9yZSBpZiB3ZSd2ZSBzZW50IGxhc3QgcGFja2V0IGZyb20gdGhpcyBlbmQgKi8KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9TTkRfUkVQTFk6Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9TTkRfQVJHUzoKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQlkZWZhdWx0OgotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBjYWxjdWxhdGUgaG93IG11Y2ggZGF0YSB3ZSd2ZSBiZWVuIGdpdmVuICovCi0Jc3B0ciA9IHNpb3Y7Ci0JZm9yICg7IHNpb2MgPiAwOyBzcHRyKyssIHNpb2MtLSkgewotCQlpZiAoIXNwdHItPmlvdl9sZW4pCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXNwdHItPmlvdl9iYXNlKQotCQkJZ290byBvdXQ7Ci0KLQkJc2l6ZSArPSBzcHRyLT5pb3ZfbGVuOwotCX0KLQotCV9kZWJ1ZygiLSBzaXplPSVadSBtdHU9JVp1Iiwgc2l6ZSwgY2FsbC0+Y29ubi0+bXR1X3NpemUpOwotCi0JZG8gewotCQkvKiBtYWtlIHN1cmUgdGhlcmUncyBhIG1lc3NhZ2UgdW5kZXIgY29uc3RydWN0aW9uICovCi0JCWlmICghY2FsbC0+c25kX25leHRtc2cpIHsKLQkJCS8qIG5vIC0gYWxsb2NhdGUgYSBtZXNzYWdlIHdpdGggbm8gZGF0YSB5ZXQgYXR0YWNoZWQgKi8KLQkJCXJldCA9IHJ4cnBjX2Nvbm5fbmV3bXNnKGNhbGwtPmNvbm4sIGNhbGwsCi0JCQkJCQlSWFJQQ19QQUNLRVRfVFlQRV9EQVRBLAotCQkJCQkJMCwgTlVMTCwgYWxsb2NfZmxhZ3MsCi0JCQkJCQkmY2FsbC0+c25kX25leHRtc2cpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCQlfZGVidWcoIi0gYWxsb2NhdGVkIG5ldyBtZXNzYWdlIFtkcz0lWnVdIiwKLQkJCSAgICAgICBjYWxsLT5zbmRfbmV4dG1zZy0+ZHNpemUpOwotCQl9Ci0KLQkJbXNnID0gY2FsbC0+c25kX25leHRtc2c7Ci0JCW1zZy0+aGRyLmZsYWdzIHw9IHJ4aGRyX2ZsYWdzOwotCi0JCS8qIGRlYWwgd2l0aCB6ZXJvLWxlbmd0aCB0ZXJtaW5hbCBwYWNrZXQgKi8KLQkJaWYgKHNpemUgPT0gMCkgewotCQkJaWYgKHJ4aGRyX2ZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKLQkJCQlyZXQgPSByeHJwY19jYWxsX2ZsdXNoKGNhbGwpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogd29yayBvdXQgaG93IG11Y2ggc3BhY2UgY3VycmVudCBwYWNrZXQgaGFzIGF2YWlsYWJsZSAqLwotCQlzcGFjZSA9IGNhbGwtPmNvbm4tPm10dV9zaXplIC0gbXNnLT5kc2l6ZTsKLQkJY2h1bmsgPSBtaW4oc3BhY2UsIHNpemUpOwotCi0JCV9kZWJ1ZygiLSBbYmVmb3JlXSBzcGFjZT0lWnUgY2h1bms9JVp1Iiwgc3BhY2UsIGNodW5rKTsKLQotCQl3aGlsZSAoIXNpb3YtPmlvdl9sZW4pCi0JCQlzaW92Kys7Ci0KLQkJLyogaWYgd2UgYXJlIGdvaW5nIHRvIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBkYXRhIHRoZW4gY29hbGVzY2UKLQkJICogaXQgdG9vICovCi0JCWlmIChkdXBfZGF0YSkgewotCQkJLyogZG9uJ3QgYWxsb2NhdGUgbW9yZSB0aGF0IDEgcGFnZSBhdCBhIHRpbWUgKi8KLQkJCWlmIChjaHVuayA+IFBBR0VfU0laRSkKLQkJCQljaHVuayA9IFBBR0VfU0laRTsKLQotCQkJLyogYWxsb2NhdGUgYSBkYXRhIGJ1ZmZlciBhbmQgYXR0YWNoIHRvIHRoZSBtZXNzYWdlICovCi0JCQlidWYgPSBrbWFsbG9jKGNodW5rLCBhbGxvY19mbGFncyk7Ci0JCQlpZiAodW5saWtlbHkoIWJ1ZikpIHsKLQkJCQlpZiAobXNnLT5kc2l6ZSA9PQotCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcikpIHsKLQkJCQkJLyogZGlzY2FyZCBhbiBlbXB0eSBtc2cgYW5kIHdpbmQgYmFjawotCQkJCQkgKiB0aGUgc2VxIGNvdW50ZXIgKi8KLQkJCQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLQkJCQkJY2FsbC0+c25kX25leHRtc2cgPSBOVUxMOwotCQkJCQljYWxsLT5zbmRfc2VxX2NvdW50LS07Ci0JCQkJfQotCi0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJdG1wID0gbXNnLT5kY291bnQrKzsKLQkJCXNldF9iaXQodG1wLCAmbXNnLT5kZnJlZSk7Ci0JCQltc2ctPmRhdGFbdG1wXS5pb3ZfYmFzZSA9IGJ1ZjsKLQkJCW1zZy0+ZGF0YVt0bXBdLmlvdl9sZW4gPSBjaHVuazsKLQkJCW1zZy0+ZHNpemUgKz0gY2h1bms7Ci0JCQkqc2l6ZV9zZW50ICs9IGNodW5rOwotCQkJc2l6ZSAtPSBjaHVuazsKLQotCQkJLyogbG9hZCB0aGUgYnVmZmVyIHdpdGggZGF0YSAqLwotCQkJd2hpbGUgKGNodW5rID4gMCkgewotCQkJCXRtcCA9IG1pbihjaHVuaywgc2lvdi0+aW92X2xlbik7Ci0JCQkJbWVtY3B5KGJ1Ziwgc2lvdi0+aW92X2Jhc2UsIHRtcCk7Ci0JCQkJYnVmICs9IHRtcDsKLQkJCQlzaW92LT5pb3ZfYmFzZSArPSB0bXA7Ci0JCQkJc2lvdi0+aW92X2xlbiAtPSB0bXA7Ci0JCQkJaWYgKCFzaW92LT5pb3ZfbGVuKQotCQkJCQlzaW92Kys7Ci0JCQkJY2h1bmsgLT0gdG1wOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLyogd2Ugd2FudCB0byBhdHRhY2ggdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgZGlyZWN0bHkgKi8KLQkJCXdoaWxlIChjaHVuayA+IDAgJiYKLQkJCSAgICAgICBtc2ctPmRjb3VudCA8IFJYUlBDX01TR19NQVhfSU9DUykgewotCQkJCXRtcCA9IG1zZy0+ZGNvdW50Kys7Ci0JCQkJbXNnLT5kYXRhW3RtcF0uaW92X2Jhc2UgPSBzaW92LT5pb3ZfYmFzZTsKLQkJCQltc2ctPmRhdGFbdG1wXS5pb3ZfbGVuID0gc2lvdi0+aW92X2xlbjsKLQkJCQltc2ctPmRzaXplICs9IHNpb3YtPmlvdl9sZW47Ci0JCQkJKnNpemVfc2VudCArPSBzaW92LT5pb3ZfbGVuOwotCQkJCXNpemUgLT0gc2lvdi0+aW92X2xlbjsKLQkJCQljaHVuayAtPSBzaW92LT5pb3ZfbGVuOwotCQkJCXNpb3YrKzsKLQkJCX0KLQkJfQotCi0JCV9kZWJ1ZygiLSBbbG9hZGVkXSBjaHVuaz0lWnUgc2l6ZT0lWnUiLCBjaHVuaywgc2l6ZSk7Ci0KLQkJLyogZGlzcGF0Y2ggdGhlIG1lc3NhZ2Ugd2hlbiBmdWxsLCBmaW5hbCBvciByZXF1ZXN0aW5nIEFDSyAqLwotCQlpZiAobXNnLT5kc2l6ZSA+PSBjYWxsLT5jb25uLT5tdHVfc2l6ZSB8fCByeGhkcl9mbGFncykgewotCQkJcmV0ID0gcnhycGNfY2FsbF9mbHVzaChjYWxsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0KLQl9IHdoaWxlKHNpemUgPiAwKTsKLQotCXJldCA9IDA7Ci0gb3V0OgotCV9sZWF2ZSgiID0gJWQgKCVaZCBxdWV1ZWQsICVaZCByZW0pIiwgcmV0LCAqc2l6ZV9zZW50LCBzaXplKTsKLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCByeHJwY19jYWxsX3dyaXRlX2RhdGEoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZmx1c2ggb3V0c3RhbmRpbmcgcGFja2V0cyB0byB0aGUgbmV0d29yawotICovCi1zdGF0aWMgaW50IHJ4cnBjX2NhbGxfZmx1c2goc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAiLCBjYWxsKTsKLQotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCi0JLyogaWYgdGhlcmUncyBhIHBhY2tldCB1bmRlciBjb25zdHJ1Y3Rpb24sIHRoZW4gZGlzcGF0Y2ggaXQgbm93ICovCi0JaWYgKGNhbGwtPnNuZF9uZXh0bXNnKSB7Ci0JCW1zZyA9IGNhbGwtPnNuZF9uZXh0bXNnOwotCQljYWxsLT5zbmRfbmV4dG1zZyA9IE5VTEw7Ci0KLQkJaWYgKG1zZy0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKLQkJCW1zZy0+aGRyLmZsYWdzICY9IH5SWFJQQ19NT1JFX1BBQ0tFVFM7Ci0JCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0NMTlRfU05EX0FSR1MpCi0JCQkJbXNnLT5oZHIuZmxhZ3MgfD0gUlhSUENfUkVRVUVTVF9BQ0s7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltc2ctPmhkci5mbGFncyB8PSBSWFJQQ19NT1JFX1BBQ0tFVFM7Ci0JCX0KLQotCQlfcHJvdG8oIlNlbmRpbmcgREFUQSBtZXNzYWdlIHsgZHM9JVp1IGRjPSV1IGRmPSUwMmx1IH0iLAotCQkgICAgICAgbXNnLT5kc2l6ZSwgbXNnLT5kY291bnQsIG1zZy0+ZGZyZWUpOwotCi0JCS8qIHF1ZXVlIGFuZCBhZGp1c3QgY2FsbCBzdGF0ZSAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZjYWxsLT5hY2tzX3BlbmRxKTsKLQotCQkvKiBkZWNpZGUgd2hhdCB0byBkbyBkZXBlbmRpbmcgb24gY3VycmVudCBzdGF0ZSBhbmQgaWYgdGhpcyBpcwotCQkgKiB0aGUgbGFzdCBwYWNrZXQgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQkJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWToKLQkJCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPQotCQkJCQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfRklOQUxfQUNLOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfU05EX0FSR1M6Ci0JCQlpZiAobXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0KLQkJCQkJUlhSUENfQ1NUQVRFX0NMTlRfUkNWX1JFUExZOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQlkZWZhdWx0OgotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQljYWxsLT5hY2tzX3BlbmRfY250Kys7Ci0KLQkJbW9kX3RpbWVyKCZjYWxsLT5hY2tzX3RpbWVvdXQsCi0JCQkgIF9fcnhycGNfcnR0X2Jhc2VkX3RpbWVvdXQoY2FsbCwKLQkJCQkJCSAgICByeHJwY19jYWxsX2Fja3NfdGltZW91dCkpOwotCi0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCQlyZXQgPSByeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJY2FsbC0+cGt0X3NuZF9jb3VudCsrOwotCX0KLQotIG91dDoKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfZmx1c2goKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcmVzZW5kIE5BSydkIG9yIHVuYWNrbm93bGVkZ2VkIHBhY2tldHMgdXAgdG8gdGhlIGhpZ2hlc3Qgb25lIHNwZWNpZmllZAotICovCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3QgaGlnaGVzdCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXJ4cnBjX3NlcV90IHNlcSA9IDA7Ci0KLQlfZW50ZXIoIiVwLCV1IiwgY2FsbCwgaGlnaGVzdCk7Ci0KLQlfcHJvdG8oIlJ4IFJlc2VuZCByZXF1aXJlZCIpOwotCi0JLyogaGFuZGxlIHRvbyBtYW55IHJlc2VuZHMgKi8KLQlpZiAoY2FsbC0+c25kX3Jlc2VuZF9jbnQgPj0gcnhycGNfY2FsbF9tYXhfcmVzZW5kKSB7Ci0JCV9kZWJ1ZygiQWJvcnRpbmcgZHVlIHRvIHRvbyBtYW55IHJlc2VuZHMgKHJjdj0lZCkiLAotCQkgICAgICAgY2FsbC0+cGt0X3Jjdl9jb3VudCk7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwKLQkJCQkgY2FsbC0+cGt0X3Jjdl9jb3VudCA+IDAgPyAtRUlPIDogLUVUSU1FRE9VVCk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWNhbGwtPnNuZF9yZXNlbmRfY250Kys7Ci0JZm9yICg7OykgewotCQkvKiBkZXRlcm1pbmUgd2hpY2ggdGhlIG5leHQgcGFja2V0IHdlIG1pZ2h0IG5lZWQgdG8gQUNLIGlzICovCi0JCWlmIChzZXEgPD0gY2FsbC0+YWNrc19kZnR2X3NlcSkKLQkJCXNlcSA9IGNhbGwtPmFja3NfZGZ0dl9zZXE7Ci0JCXNlcSsrOwotCi0JCWlmIChzZXEgPiBoaWdoZXN0KQotCQkJYnJlYWs7Ci0KLQkJLyogbG9vayBmb3IgdGhlIHBhY2tldCBpbiB0aGUgcGVuZGluZy1BQ0sgcXVldWUgKi8KLQkJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPmFja3NfcGVuZHEpIHsKLQkJCW1zZyA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJCWlmIChtc2ctPnNlcSA9PSBzZXEpCi0JCQkJZ290byBmb3VuZF9tc2c7Ci0JCX0KLQotCQlwYW5pYygiJXMoJXAsJWQpOiIKLQkJICAgICAgIiBJbmNvbnNpc3RlbnQgcGVuZGluZy1BQ0sgcXVldWUgKGRzPSV1IHNjPSV1IHNxPSV1KVxuIiwKLQkJICAgICAgX19GVU5DVElPTl9fLCBjYWxsLCBoaWdoZXN0LAotCQkgICAgICBjYWxsLT5hY2tzX2RmdHZfc2VxLCBjYWxsLT5zbmRfc2VxX2NvdW50LCBzZXEpOwotCi0JZm91bmRfbXNnOgotCQlpZiAobXNnLT5zdGF0ZSAhPSBSWFJQQ19NU0dfU0VOVCkKLQkJCWNvbnRpbnVlOyAvKiBvbmx5IHVuLUFDSydkIHBhY2tldHMgKi8KLQotCQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJLyogc2VuZCBlYWNoIG1lc3NhZ2UgYWdhaW4gKGFuZCBpZ25vcmUgYW55IGVycm9ycyB3ZSBtaWdodAotCQkgKiBpbmN1cikgKi8KLQkJX3Byb3RvKCJSZXNlbmRpbmcgREFUQSBtZXNzYWdlIHsgZHM9JVp1IGRjPSV1IGRmPSUwMmx1IH0iLAotCQkgICAgICAgbXNnLT5kc2l6ZSwgbXNnLT5kY291bnQsIG1zZy0+ZGZyZWUpOwotCi0JCWlmIChyeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKSA9PSAwKQotCQkJY2FsbC0+cGt0X3NuZF9jb3VudCsrOwotCi0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0KLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQl9Ci0KLQkvKiByZXNldCB0aGUgdGltZW91dCAqLwotCW1vZF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0LAotCQkgIF9fcnhycGNfcnR0X2Jhc2VkX3RpbWVvdXQoY2FsbCwgcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQpKTsKLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3Jlc2VuZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYW4gSUNNUCBlcnJvciBiZWluZyBhcHBsaWVkIHRvIGEgY2FsbAotICovCi12b2lkIHJ4cnBjX2NhbGxfaGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgbG9jYWwsIGludCBlcnJubykKLXsKLQlfZW50ZXIoIiVweyV1fSwlZCIsIGNhbGwsIG50b2hsKGNhbGwtPmNhbGxfaWQpLCBlcnJubyk7Ci0KLQkvKiBpZiB0aGlzIGNhbGwgaXMgYWxyZWFkeSBhYm9ydGVkLCB0aGVuIGp1c3Qgd2FrZSB1cCBhbnkgd2FpdGVycyAqLwotCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfRVJST1IpIHsKLQkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMoY2FsbCk7Ci0JfQotCWVsc2UgewotCQkvKiB0ZWxsIHRoZSBhcHAgbGF5ZXIgd2hhdCBoYXBwZW5lZCAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9FUlJPUjsKLQkJX3N0YXRlKGNhbGwpOwotCQlpZiAobG9jYWwpCi0JCQljYWxsLT5hcHBfZXJyX3N0YXRlID0gUlhSUENfRVNUQVRFX0xPQ0FMX0VSUk9SOwotCQllbHNlCi0JCQljYWxsLT5hcHBfZXJyX3N0YXRlID0gUlhSUENfRVNUQVRFX1JFTU9URV9FUlJPUjsKLQkJY2FsbC0+YXBwX2Vycm5vCQk9IGVycm5vOwotCQljYWxsLT5hcHBfbWFyawkJPSBSWFJQQ19BUFBfTUFSS19FT0Y7Ci0JCWNhbGwtPmFwcF9yZWFkX2J1Zgk9IE5VTEw7Ci0JCWNhbGwtPmFwcF9hc3luY19yZWFkCT0gMDsKLQotCQkvKiBtYXAgdGhlIGVycm9yICovCi0JCWNhbGwtPmFwcF9hZW1hcF9mdW5jKGNhbGwpOwotCi0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tzX3RpbWVvdXQpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX2hhbmRsZV9lcnJvcigpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jIGIvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjOTI5YS4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzc3ICswLDAgQEAKLS8qIGNvbm5lY3Rpb24uYzogUnggY29ubmVjdGlvbiByb3V0aW5lcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KLSNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY19jb25uZWN0aW9uX2NvdW50KTsKLQotTElTVF9IRUFEKHJ4cnBjX2Nvbm5zKTsKLURFQ0xBUkVfUldTRU0ocnhycGNfY29ubnNfc2VtKTsKLXVuc2lnbmVkIGxvbmcgcnhycGNfY29ubl90aW1lb3V0ID0gNjAgKiA2MDsKLQotc3RhdGljIHZvaWQgcnhycGNfY29ubl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKTsKLQotc3RhdGljIHZvaWQgX19yeHJwY19jb25uX3RpbWVvdXQocnhycGNfdGltZXJfdCAqdGltZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgdGltZW91dCk7Ci0KLQlfZGVidWcoIlJ4IENPTk4gVElNRU9VVCBbJXB7dT0lZH1dIiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7Ci0KLQlyeHJwY19jb25uX2RvX3RpbWVvdXQoY29ubik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfdGltZXJfb3BzIHJ4cnBjX2Nvbm5fdGltZXJfb3BzID0gewotCS50aW1lZF9vdXQJPSBfX3J4cnBjX2Nvbm5fdGltZW91dCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiByZWNvcmQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKLQkJCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0KLQlfZW50ZXIoIiVwIixwZWVyKTsKLQotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY29ubmVjdGlvbiByZWNvcmQgKi8KLQljb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbm4pIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKLQotCUlOSVRfTElTVF9IRUFEKCZjb25uLT5saW5rKTsKLQlJTklUX0xJU1RfSEVBRCgmY29ubi0+aWRfbGluayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubi0+Y2hhbndhaXQpOwotCXNwaW5fbG9ja19pbml0KCZjb25uLT5sb2NrKTsKLQlyeHJwY190aW1lcl9pbml0KCZjb25uLT50aW1lb3V0LCAmcnhycGNfY29ubl90aW1lcl9vcHMpOwotCi0JZG9fZ2V0dGltZW9mZGF5KCZjb25uLT5hdGltZSk7Ci0JY29ubi0+bXR1X3NpemUgPSAxMDI0OwotCWNvbm4tPnBlZXIgPSBwZWVyOwotCWNvbm4tPnRyYW5zID0gcGVlci0+dHJhbnM7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19jb25uZWN0aW9uX2NvdW50KSk7Ci0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCBfX3J4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHJlY29yZCBmb3Igb3V0Z29pbmcgY29ubmVjdGlvbnMKLSAqLwotaW50IHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgIF9fYmUxNiBwb3J0LAotCQkJICAgIF9fYmUzMiBhZGRyLAotCQkJICAgIHVpbnQxNl90IHNlcnZpY2VfaWQsCi0JCQkgICAgdm9pZCAqc2VjdXJpdHksCi0JCQkgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY2FuZGlkYXRlLCAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlfX2JlMzIgY29ubmlkOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVodX0sJXUsJWh1IiwgdHJhbnMsIHRyYW5zLT5wb3J0LCBudG9ocyhwb3J0KSwgc2VydmljZV9pZCk7Ci0KLQkvKiBnZXQgYSBwZWVyIHJlY29yZCAqLwotCXJldCA9IHJ4cnBjX3BlZXJfbG9va3VwKHRyYW5zLCBhZGRyLCAmcGVlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjb25uZWN0aW9uIHJlY29yZCAqLwotCXJldCA9IF9fcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24ocGVlciwgJmNhbmRpZGF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIGZpbGwgaW4gdGhlIHNwZWNpZmljIGJpdHMgKi8KLQljYW5kaWRhdGUtPmFkZHIuc2luX2ZhbWlseQk9IEFGX0lORVQ7Ci0JY2FuZGlkYXRlLT5hZGRyLnNpbl9wb3J0CT0gcG9ydDsKLQljYW5kaWRhdGUtPmFkZHIuc2luX2FkZHIuc19hZGRyCT0gYWRkcjsKLQotCWNhbmRpZGF0ZS0+aW5fZXBvY2gJCT0gcnhycGNfZXBvY2g7Ci0JY2FuZGlkYXRlLT5vdXRfZXBvY2gJCT0gcnhycGNfZXBvY2g7Ci0JY2FuZGlkYXRlLT5pbl9jbGllbnRmbGFnCT0gMDsKLQljYW5kaWRhdGUtPm91dF9jbGllbnRmbGFnCT0gUlhSUENfQ0xJRU5UX0lOSVRJQVRFRDsKLQljYW5kaWRhdGUtPnNlcnZpY2VfaWQJCT0gaHRvbnMoc2VydmljZV9pZCk7Ci0KLQkvKiBpbnZlbnQgYSB1bmlxdWUgY29ubmVjdGlvbiBJRCAqLwotCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQotIHRyeV9uZXh0X2lkOgotCWNvbm5pZCA9IGh0b25sKHBlZXItPmNvbm5faWRjb3VudGVyICYgUlhSUENfQ0lETUFTSyk7Ci0JcGVlci0+Y29ubl9pZGNvdW50ZXIgKz0gUlhSUENfTUFYQ0FMTFM7Ci0KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9pZGxpc3QpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBpZF9saW5rKTsKLQkJaWYgKGNvbm5pZCA9PSBjb25uLT5jb25uX2lkKQotCQkJZ290byB0cnlfbmV4dF9pZDsKLQkJaWYgKGNvbm5pZCA+IGNvbm4tPmNvbm5faWQpCi0JCQlicmVhazsKLQl9Ci0KLQlfZGVidWcoInNlbGVjdGVkIGNhbmRpZGF0ZSBjb25uIElEICV4LiV1IiwKLQkgICAgICAgbnRvaGwocGVlci0+YWRkci5zX2FkZHIpLCBudG9obChjb25uaWQpKTsKLQotCWNhbmRpZGF0ZS0+Y29ubl9pZCA9IGNvbm5pZDsKLQlsaXN0X2FkZF90YWlsKCZjYW5kaWRhdGUtPmlkX2xpbmssIF9wKTsKLQotCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCi0JLyogYXR0YWNoIHRvIHBlZXIgKi8KLQljYW5kaWRhdGUtPnBlZXIgPSBwZWVyOwotCi0Jd3JpdGVfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCS8qIHNlYXJjaCB0aGUgcGVlcidzIHRyYW5zcG9ydCBncmF2ZXlhcmQgbGlzdCAqLwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCWxpc3RfZm9yX2VhY2goX3AsICZwZWVyLT5jb25uX2dyYXZleWFyZCkgewotCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOwotCQlpZiAoY29ubi0+YWRkci5zaW5fcG9ydAk9PSBjYW5kaWRhdGUtPmFkZHIuc2luX3BvcnQJJiYKLQkJICAgIGNvbm4tPnNlY3VyaXR5X2l4CT09IGNhbmRpZGF0ZS0+c2VjdXJpdHlfaXgJJiYKLQkJICAgIGNvbm4tPnNlcnZpY2VfaWQJPT0gY2FuZGlkYXRlLT5zZXJ2aWNlX2lkCSYmCi0JCSAgICBjb25uLT5pbl9jbGllbnRmbGFnCT09IDApCi0JCQlnb3RvIGZvdW5kX2luX2dyYXZleWFyZDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQotCS8qIHBpY2sgdGhlIG5ldyBjYW5kaWRhdGUgKi8KLQlfZGVidWcoImNyZWF0ZWQgY29ubmVjdGlvbjogeyUwOHh9IFtvdXRdIiwgbnRvaGwoY2FuZGlkYXRlLT5jb25uX2lkKSk7Ci0JYXRvbWljX2luYygmcGVlci0+Y29ubl9jb3VudCk7Ci0JY29ubiA9IGNhbmRpZGF0ZTsKLQljYW5kaWRhdGUgPSBOVUxMOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnBlZXItPmNvbm5fYWN0aXZlKTsKLQl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0KLQlpZiAoY2FuZGlkYXRlKSB7Ci0JCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQkJbGlzdF9kZWwoJmNhbmRpZGF0ZS0+aWRfbGluayk7Ci0JCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCi0JCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKTsKLQkJa2ZyZWUoY2FuZGlkYXRlKTsKLQl9Ci0JZWxzZSB7Ci0JCWRvd25fd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNvbm4tPnByb2NfbGluaywgJnJ4cnBjX2Nvbm5zKTsKLQkJdXBfd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0JfQotCi0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCi0JcmV0dXJuIDA7Ci0KLQkvKiBoYW5kbGUgcmVzdXJyZWN0aW5nIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBncmF2ZXlhcmQgKi8KLSBmb3VuZF9pbl9ncmF2ZXlhcmQ6Ci0JX2RlYnVnKCJyZXN1cnJlY3RpbmcgY29ubmVjdGlvbjogeyUwOHh9IFtvdXRdIiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlnb3RvIG1ha2VfYWN0aXZlOwotfSAvKiBlbmQgcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbG9va3VwIHRoZSBjb25uZWN0aW9uIGZvciBhbiBpbmNvbWluZyBwYWNrZXQKLSAqIC0gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gcmVjb3JkIGZvciB1bnJlY29yZGVkIGluY29taW5nIGNvbm5lY3Rpb25zCi0gKi8KLWludCByeHJwY19jb25uZWN0aW9uX2xvb2t1cChzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKLQkJCSAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXN0cnVjdCBza19idWZmICpwa3QgPSBtc2ctPnBrdDsKLQlpbnQgcmV0LCBmcmVzaCA9IDA7Ci0JX19iZTMyIHhfZXBvY2gsIHhfY29ubmlkOwotCV9fYmUxNiB4X3BvcnQsIHhfc2VydmlkOwotCV9fdTMyIHhfc2VjaXg7Ci0JdTggeF9jbGZsYWc7Ci0KLQlfZW50ZXIoIiVwe3slaHV9fSwldSwlaHUiLAotCSAgICAgICBwZWVyLAotCSAgICAgICBwZWVyLT50cmFucy0+cG9ydCwKLQkgICAgICAgbnRvaHMocGt0LT5oLnVoLT5zb3VyY2UpLAotCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpKTsKLQotCXhfcG9ydAkJPSBwa3QtPmgudWgtPnNvdXJjZTsKLQl4X2Vwb2NoCQk9IG1zZy0+aGRyLmVwb2NoOwotCXhfY2xmbGFnCT0gbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCXhfY29ubmlkCT0gaHRvbmwobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spOwotCXhfc2VydmlkCT0gbXNnLT5oZHIuc2VydmljZUlkOwotCXhfc2VjaXgJCT0gbXNnLT5oZHIuc2VjdXJpdHlJbmRleDsKLQotCS8qIFtjb21tb24gY2FzZV0gc2VhcmNoIHRoZSB0cmFuc3BvcnQncyBhY3RpdmUgbGlzdCBmaXJzdCAqLwotCXJlYWRfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKLQkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJCT09IHhfcG9ydAkmJgotCQkgICAgY29ubi0+aW5fZXBvY2gJCT09IHhfZXBvY2gJJiYKLQkJICAgIGNvbm4tPmNvbm5faWQJCT09IHhfY29ubmlkCSYmCi0JCSAgICBjb25uLT5zZWN1cml0eV9peAkJPT0geF9zZWNpeAkmJgotCQkgICAgY29ubi0+c2VydmljZV9pZAkJPT0geF9zZXJ2aWQJJiYKLQkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQotCQkJZ290byBmb3VuZF9hY3RpdmU7Ci0JfQotCXJlYWRfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOwotCi0JLyogW3VuY29tbW9uIGNhc2VdIG5vdCBhY3RpdmUKLQkgKiAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGlmIGFuIGluYm91bmQgY29ubmVjdGlvbgotCSAqIC0gb25seSBleGFtaW5lIHRoZSBncmF2ZXlhcmQgZm9yIGFuIG91dGJvdW5kIGNvbm5lY3Rpb24KLQkgKi8KLQlpZiAoeF9jbGZsYWcpIHsKLQkJcmV0ID0gX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbihwZWVyLCAmY2FuZGlkYXRlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIGZpbGwgaW4gdGhlIHNwZWNpZmljcyAqLwotCQljYW5kaWRhdGUtPmFkZHIuc2luX2ZhbWlseQk9IEFGX0lORVQ7Ci0JCWNhbmRpZGF0ZS0+YWRkci5zaW5fcG9ydAk9IHhfcG9ydDsKLQkJY2FuZGlkYXRlLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9IHBrdC0+bmguaXBoLT5zYWRkcjsKLQkJY2FuZGlkYXRlLT5pbl9lcG9jaAkJPSB4X2Vwb2NoOwotCQljYW5kaWRhdGUtPm91dF9lcG9jaAkJPSB4X2Vwb2NoOwotCQljYW5kaWRhdGUtPmluX2NsaWVudGZsYWcJPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCQljYW5kaWRhdGUtPm91dF9jbGllbnRmbGFnCT0gMDsKLQkJY2FuZGlkYXRlLT5jb25uX2lkCQk9IHhfY29ubmlkOwotCQljYW5kaWRhdGUtPnNlcnZpY2VfaWQJCT0geF9zZXJ2aWQ7Ci0JCWNhbmRpZGF0ZS0+c2VjdXJpdHlfaXgJCT0geF9zZWNpeDsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIGFjdGl2ZSBsaXN0IGFnYWluLCBqdXN0IGluIGNhc2UgaXQgYXBwZWFyZWQgd2hpbHN0IHdlCi0JICogd2VyZSBidXN5ICovCi0Jd3JpdGVfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKLQkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJCT09IHhfcG9ydAkmJgotCQkgICAgY29ubi0+aW5fZXBvY2gJCT09IHhfZXBvY2gJJiYKLQkJICAgIGNvbm4tPmNvbm5faWQJCT09IHhfY29ubmlkCSYmCi0JCSAgICBjb25uLT5zZWN1cml0eV9peAkJPT0geF9zZWNpeAkmJgotCQkgICAgY29ubi0+c2VydmljZV9pZAkJPT0geF9zZXJ2aWQJJiYKLQkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQotCQkJZ290byBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZTsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGdyYXZleWFyZCBsaXN0ICovCi0Jc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfcCwgJnBlZXItPmNvbm5fZ3JhdmV5YXJkKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7Ci0JCWlmIChjb25uLT5hZGRyLnNpbl9wb3J0CQk9PSB4X3BvcnQJJiYKLQkJICAgIGNvbm4tPmluX2Vwb2NoCQk9PSB4X2Vwb2NoCSYmCi0JCSAgICBjb25uLT5jb25uX2lkCQk9PSB4X2Nvbm5pZAkmJgotCQkgICAgY29ubi0+c2VjdXJpdHlfaXgJCT09IHhfc2VjaXgJJiYKLQkJICAgIGNvbm4tPnNlcnZpY2VfaWQJCT09IHhfc2VydmlkCSYmCi0JCSAgICBjb25uLT5pbl9jbGllbnRmbGFnCQk9PSB4X2NsZmxhZykKLQkJCWdvdG8gZm91bmRfaW5fZ3JhdmV5YXJkOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogb3V0Ym91bmQgY29ubmVjdGlvbnMgYXJlbid0IGNyZWF0ZWQgaGVyZSAqLwotCWlmICgheF9jbGZsYWcpIHsKLQkJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOwotCQlfbGVhdmUoIiA9IC1FTk9FTlQiKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QgKi8KLQlfZGVidWcoImNyZWF0ZWQgY29ubmVjdGlvbjogeyUwOHh9IFtpbl0iLCBudG9obChjYW5kaWRhdGUtPmNvbm5faWQpKTsKLQlyeHJwY19nZXRfcGVlcihwZWVyKTsKLQljb25uID0gY2FuZGlkYXRlOwotCWNhbmRpZGF0ZSA9IE5VTEw7Ci0JYXRvbWljX2luYygmcGVlci0+Y29ubl9jb3VudCk7Ci0JZnJlc2ggPSAxOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnBlZXItPmNvbm5fYWN0aXZlKTsKLQotIHN1Y2Nlc3NfdXdmcmVlOgotCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCWlmIChjYW5kaWRhdGUpIHsKLQkJd3JpdGVfbG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCQlsaXN0X2RlbCgmY2FuZGlkYXRlLT5pZF9saW5rKTsKLQkJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7Ci0KLQkJX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpOwotCQlrZnJlZShjYW5kaWRhdGUpOwotCX0KLQotCWlmIChmcmVzaCkgewotCQlkb3duX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOwotCQlsaXN0X2FkZF90YWlsKCZjb25uLT5wcm9jX2xpbmssICZyeHJwY19jb25ucyk7Ci0JCXVwX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOwotCX0KLQotIHN1Y2Nlc3M6Ci0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCXJldHVybiAwOwotCi0JLyogaGFuZGxlIHRoZSBjb25uZWN0aW9uIGJlaW5nIGZvdW5kIGluIHRoZSBhY3RpdmUgbGlzdCBzdHJhaWdodCBvZmYgKi8KLSBmb3VuZF9hY3RpdmU6Ci0JcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0JcmVhZF91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0JZ290byBzdWNjZXNzOwotCi0JLyogaGFuZGxlIHJlc3VycmVjdGluZyBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgZ3JhdmV5YXJkICovCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCV9kZWJ1ZygicmVzdXJyZWN0aW5nIGNvbm5lY3Rpb246IHslMDh4fSBbaW5dIiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCXJ4cnBjX2dldF9wZWVyKHBlZXIpOwotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlnb3RvIG1ha2VfYWN0aXZlOwotCi0JLyogaGFuZGxlIGZpbmRpbmcgdGhlIGNvbm5lY3Rpb24gb24gdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggdGhlIGFjdGl2ZQotCSAqIGxpc3QgKi8KLSBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZToKLQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKLQlnb3RvIHN1Y2Nlc3NfdXdmcmVlOwotCi19IC8qIGVuZCByeHJwY19jb25uZWN0aW9uX2xvb2t1cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSBjb25uZWN0aW9uIHJlY29yZAotICogLSBpdCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZWVyJ3MgY29ubmVjdGlvbiBncmF2ZXlhcmQgd2hlbiByZWZjb3VudAotICogICByZWFjaGVzIDAKLSAqLwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQotCWlmICghY29ubikKLQkJcmV0dXJuOwotCi0JX2VudGVyKCIlcHt1PSVkIHA9JWh1fSIsCi0JICAgICAgIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCXBlZXIgPSBjb25uLT5wZWVyOwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT51c2FnZSkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBtb3ZlIHRvIGdyYXZleWFyZCBxdWV1ZSAqLwotCV9kZWJ1ZygiYnVyeWluZyBjb25uZWN0aW9uOiB7JTA4eH0iLCBudG9obChjb25uLT5jb25uX2lkKSk7Ci0JbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmxpbmssICZwZWVyLT5jb25uX2dyYXZleWFyZCk7Ci0KLQlyeHJwY19rcnh0aW1vZF9hZGRfdGltZXIoJmNvbm4tPnRpbWVvdXQsIHJ4cnBjX2Nvbm5fdGltZW91dCAqIEhaKTsKLQotCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0KLQlyeHJwY19wdXRfcGVlcihjb25uLT5wZWVyKTsKLQotCV9sZWF2ZSgiIFtraWxsZWRdIik7Ci19IC8qIGVuZCByeHJwY19wdXRfY29ubmVjdGlvbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmcmVlIGEgY29ubmVjdGlvbiByZWNvcmQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY29ubl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQotewotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCi0JX2VudGVyKCIlcHt1PSVkIHA9JWh1fSIsCi0JICAgICAgIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCXBlZXIgPSBjb25uLT5wZWVyOwotCi0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPCAwKQotCQlCVUcoKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPT0gMCkgewotCQlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbm4gPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JaWYgKCFjb25uKSB7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsgLyogcmVzdXJyZWN0ZWQgKi8KLQl9Ci0KLQlfZGVidWcoIi0tLSBEZXN0cm95aW5nIENvbm5lY3Rpb24gJXB7JTA4eH0gLS0tIiwKLQkgICAgICAgY29ubiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCi0JZG93bl93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKLQlsaXN0X2RlbCgmY29ubi0+cHJvY19saW5rKTsKLQl1cF93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKLQotCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQlsaXN0X2RlbCgmY29ubi0+aWRfbGluayk7Ci0Jd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7Ci0KLQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19jb25uZWN0aW9uX2NvdW50KSk7Ci0Ja2ZyZWUoY29ubik7Ci0KLQkvKiBpZiB0aGUgZ3JhdmV5YXJkIGlzIG5vdyBlbXB0eSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgdGhhdCAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT5jb25uX2NvdW50KSkKLQkJd2FrZV91cCgmcGVlci0+Y29ubl9neV93YWl0cSk7Ci0KLQlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOwotfSAvKiBlbmQgcnhycGNfY29ubl9kb190aW1lb3V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFyIGFsbCBjb25uZWN0aW9uIHJlY29yZHMgZnJvbSBhIHBlZXIgZW5kcG9pbnQKLSAqLwotdm9pZCByeHJwY19jb25uX2NsZWFyYWxsKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgZXJyOwotCi0JX2VudGVyKCIlcCIsIHBlZXIpOwotCi0JLyogdGhlcmUgc2hvdWxkbid0IGJlIGFueSBhY3RpdmUgY29ubnMgcmVtYWluaW5nICovCi0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2FjdGl2ZSkpCi0JCUJVRygpOwotCi0JLyogbWFudWFsbHkgdGltZW91dCBhbGwgY29ubnMgaW4gdGhlIGdyYXZleWFyZCAqLwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9ncmF2ZXlhcmQpKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KHBlZXItPmNvbm5fZ3JhdmV5YXJkLm5leHQsCi0JCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7Ci0JCWVyciA9IHJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0KLQkJaWYgKGVyciA9PSAwKQotCQkJcnhycGNfY29ubl9kb190aW1lb3V0KGNvbm4pOwotCi0JCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogd2FpdCBmb3IgdGhlIHRoZSBjb25uIGdyYXZleWFyZCB0byBiZSBjb21wbGV0ZWx5IGNsZWFyZWQgKi8KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUoJnBlZXItPmNvbm5fZ3lfd2FpdHEsICZteXNlbGYpOwotCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZwZWVyLT5jb25uX2NvdW50KSAhPSAwKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGVlci0+Y29ubl9neV93YWl0cSwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jb25uX2NsZWFyYWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFsbG9jYXRlIGFuZCBwcmVwYXJlIGEgbWVzc2FnZSBmb3Igc2VuZGluZyBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0Ci0gKiBlbmRwb2ludAotICovCi1pbnQgcnhycGNfY29ubl9uZXdtc2coc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkgICAgICB1aW50OF90IHR5cGUsCi0JCSAgICAgIGludCBkY291bnQsCi0JCSAgICAgIHN0cnVjdCBrdmVjIGRpb3ZbXSwKLQkJICAgICAgZ2ZwX3QgYWxsb2NfZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICoqX21zZykKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCWludCBsb29wOwotCi0JX2VudGVyKCIlcHslZH0sJXAsJXUiLCBjb25uLCBudG9ocyhjb25uLT5hZGRyLnNpbl9wb3J0KSwgY2FsbCwgdHlwZSk7Ci0KLQlpZiAoZGNvdW50ID4gMykgewotCQlfbGVhdmUoIiA9IC1FSU5WQUwiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX21lc3NhZ2UpLCBhbGxvY19mbGFncyk7Ci0JaWYgKCFtc2cpIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19zZXQoJm1zZy0+dXNhZ2UsIDEpOwotCi0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGluayk7Ci0KLQltc2ctPnN0YXRlID0gUlhSUENfTVNHX1BSRVBBUkVEOwotCi0JbXNnLT5oZHIuZXBvY2gJCT0gY29ubi0+b3V0X2Vwb2NoOwotCW1zZy0+aGRyLmNpZAkJPSBjb25uLT5jb25uX2lkIHwgKGNhbGwgPyBjYWxsLT5jaGFuX2l4IDogMCk7Ci0JbXNnLT5oZHIuY2FsbE51bWJlcgk9IGNhbGwgPyBjYWxsLT5jYWxsX2lkIDogMDsKLQltc2ctPmhkci50eXBlCQk9IHR5cGU7Ci0JbXNnLT5oZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7Ci0JbXNnLT5oZHIuc2VjdXJpdHlJbmRleAk9IGNvbm4tPnNlY3VyaXR5X2l4OwotCW1zZy0+aGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7Ci0KLQkvKiBnZW5lcmF0ZSBzZXF1ZW5jZSBudW1iZXJzIGZvciBkYXRhIHBhY2tldHMgKi8KLQlpZiAoY2FsbCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQkJbXNnLT5zZXEgPSArK2NhbGwtPnNuZF9zZXFfY291bnQ7Ci0JCQltc2ctPmhkci5zZXEgPSBodG9ubChtc2ctPnNlcSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6Ci0JCQkvKiBBQ0sgc2VxdWVuY2UgbnVtYmVycyBhcmUgY29tcGxpY2F0ZWQuIFRoZSBmb2xsb3dpbmcKLQkJCSAqIG1heSBiZSB3cm9uZzoKLQkJCSAqIC0ganVtYm8gcGFja2V0IEFDS3Mgc2hvdWxkIGhhdmUgYSBzZXEgbnVtYmVyCi0JCQkgKiAtIG5vcm1hbCBBQ0tzIHNob3VsZCBub3QKLQkJCSAqLwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQltc2ctPmRjb3VudCA9IGRjb3VudCArIDE7Ci0JbXNnLT5kc2l6ZSA9IHNpemVvZihtc2ctPmhkcik7Ci0JbXNnLT5kYXRhWzBdLmlvdl9sZW4gPSBzaXplb2YobXNnLT5oZHIpOwotCW1zZy0+ZGF0YVswXS5pb3ZfYmFzZSA9ICZtc2ctPmhkcjsKLQotCWZvciAobG9vcD0wOyBsb29wIDwgZGNvdW50OyBsb29wKyspIHsKLQkJbXNnLT5kc2l6ZSArPSBkaW92W2xvb3BdLmlvdl9sZW47Ci0JCW1zZy0+ZGF0YVtsb29wKzFdLmlvdl9sZW4gID0gZGlvdltsb29wXS5pb3ZfbGVuOwotCQltc2ctPmRhdGFbbG9vcCsxXS5pb3ZfYmFzZSA9IGRpb3ZbbG9vcF0uaW92X2Jhc2U7Ci0JfQotCi0JX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfbWVzc2FnZV9jb3VudCkpOwotCSpfbXNnID0gbXNnOwotCV9sZWF2ZSgiID0gMCAoJXApICMlZCIsIG1zZywgYXRvbWljX3JlYWQoJnJ4cnBjX21lc3NhZ2VfY291bnQpKTsKLQlyZXR1cm4gMDsKLX0gLyogZW5kIHJ4cnBjX2Nvbm5fbmV3bXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGZyZWUgYSBtZXNzYWdlCi0gKi8KLXZvaWQgX19yeHJwY19wdXRfbWVzc2FnZShzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCWludCBsb29wOwotCi0JX2VudGVyKCIlcCAjJWQiLCBtc2csIGF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0KLQlpZiAobXNnLT5wa3QpCi0JCWtmcmVlX3NrYihtc2ctPnBrdCk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24obXNnLT5jb25uKTsKLQotCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCWlmICh0ZXN0X2JpdChsb29wLCAmbXNnLT5kZnJlZSkpCi0JCQlrZnJlZShtc2ctPmRhdGFbbG9vcF0uaW92X2Jhc2UpOwotCi0JX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfbWVzc2FnZV9jb3VudCkpOwotCWtmcmVlKG1zZyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgX19yeHJwY19wdXRfbWVzc2FnZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGEgbWVzc2FnZSBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLWludCByeHJwY19jb25uX3NlbmRtc2coc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCSAgICAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBtc2doZHIgbXNnaGRyOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVkfSIsIGNvbm4sIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCS8qIGZpbGwgaW4gc29tZSBmaWVsZHMgaW4gdGhlIGhlYWRlciAqLwotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JbXNnLT5oZHIuc2VyaWFsID0gaHRvbmwoKytjb25uLT5zZXJpYWxfY291bnRlcik7Ci0JbXNnLT5ydHRkb25lID0gMDsKLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQkvKiBzZXQgdXAgdGhlIG1lc3NhZ2UgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQltc2doZHIubXNnX25hbWUJCT0gJmNvbm4tPmFkZHI7Ci0JbXNnaGRyLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPmFkZHIpOwotCW1zZ2hkci5tc2dfY29udHJvbAk9IE5VTEw7Ci0JbXNnaGRyLm1zZ19jb250cm9sbGVuCT0gMDsKLQltc2doZHIubXNnX2ZsYWdzCT0gTVNHX0NPTkZJUk0gfCBNU0dfRE9OVFdBSVQ7Ci0KLQlfbmV0KCJTZW5kaW5nIG1lc3NhZ2UgdHlwZSAlZCBvZiAlWmQgYnl0ZXMgdG8gJTA4eDolZCIsCi0JICAgICBtc2ctPmhkci50eXBlLAotCSAgICAgbXNnLT5kc2l6ZSwKLQkgICAgIG50b2hsKGNvbm4tPmFkZHIuc2luX2FkZHIuc19hZGRyKSwKLQkgICAgIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCS8qIHNlbmQgdGhlIG1lc3NhZ2UgKi8KLQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT50cmFucy0+c29ja2V0LCAmbXNnaGRyLAotCQkJICAgICBtc2ctPmRhdGEsIG1zZy0+ZGNvdW50LCBtc2ctPmRzaXplKTsKLQlpZiAocmV0IDwgMCkgewotCQltc2ctPnN0YXRlID0gUlhSUENfTVNHX0VSUk9SOwotCX0gZWxzZSB7Ci0JCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfU0VOVDsKLQkJcmV0ID0gMDsKLQotCQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCQlkb19nZXR0aW1lb2ZkYXkoJmNvbm4tPmF0aW1lKTsKLQkJbXNnLT5zdGFtcCA9IGNvbm4tPmF0aW1lOwotCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JfQotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfY29ubl9zZW5kbXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlYWwgd2l0aCBhIHN1YnNlcXVlbnQgY2FsbCBwYWNrZXQKLSAqLwotaW50IHJ4cnBjX2Nvbm5fcmVjZWl2ZV9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICpwbXNnOwotCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQl1bnNpZ25lZCBjaXgsIHNlcTsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAsJXAsJXAiLCBjb25uLCBjYWxsLCBtc2cpOwotCi0JaWYgKCFjYWxsKSB7Ci0JCWNpeCA9IG50b2hsKG1zZy0+aGRyLmNpZCkgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQotCQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCQljYWxsID0gY29ubi0+Y2hhbm5lbHNbY2l4XTsKLQotCQlpZiAoIWNhbGwgfHwgY2FsbC0+Y2FsbF9pZCAhPSBtc2ctPmhkci5jYWxsTnVtYmVyKSB7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoY29ubi0+dHJhbnMsIG1zZywgLUVOT0VOVCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQllbHNlIHsKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQkJc3Bpbl91bmxvY2soJmNvbm4tPmxvY2spOwotCQl9Ci0JfQotCWVsc2UgewotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQl9Ci0KLQlfcHJvdG8oIlJlY2VpdmVkIHBhY2tldCAlJSV1IFsldV0gb24gY2FsbCAlaHU6JXU6JXUiLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXJpYWwpLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXEpLAotCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpLAotCSAgICAgICBudG9obChjb25uLT5jb25uX2lkKSwKLQkgICAgICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOwotCi0JY2FsbC0+cGt0X3Jjdl9jb3VudCsrOwotCi0JZHN0ID0gbXNnLT5wa3QtPmRzdDsKLQlpZiAoZHN0ICYmIGRzdC0+ZGV2KQotCQljb25uLT5wZWVyLT5pZl9tdHUgPQotCQkJZHN0LT5kZXYtPm10dSAtIGRzdC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47Ci0KLQkvKiBxdWV1ZSBvbiB0aGUgY2FsbCBpbiBzZXEgb3JkZXIgKi8KLQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCXNlcSA9IG1zZy0+c2VxOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmY2FsbC0+cmN2X3JlY2VpdmVxKSB7Ci0JCXBtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWlmIChwbXNnLT5zZXEgPiBzZXEpCi0JCQlicmVhazsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCBfcCk7Ci0KLQkvKiByZXNldCB0aGUgYWN0aXZpdHkgdGltZW91dCAqLwotCWNhbGwtPmZsYWdzIHw9IFJYUlBDX0NBTExfUkNWX1BLVDsKLQltb2RfdGltZXIoJmNhbGwtPnJjdl90aW1lb3V0LGppZmZpZXMgKyByeHJwY19jYWxsX3Jjdl90aW1lb3V0ICogSFopOwotCi0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoY2FsbCk7Ci0KLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLSBvdXQ6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2Nvbm5fcmVjZWl2ZV9jYWxsX3BhY2tldCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYW4gSUNNUCBlcnJvciBiZWluZyBhcHBsaWVkIHRvIGEgY29ubmVjdGlvbgotICovCi12b2lkIHJ4cnBjX2Nvbm5faGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJICAgICBpbnQgbG9jYWwsIGludCBlcnJubykKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbHNbNF07Ci0JaW50IGxvb3A7Ci0KLQlfZW50ZXIoIiVweyVkfSwlZCIsIGNvbm4sIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpLCBlcnJubyk7Ci0KLQkvKiBnZXQgYSByZWYgdG8gYWxsIG15IGNhbGxzIGluIG9uZSBnbyAqLwotCW1lbXNldChjYWxscywgMCwgc2l6ZW9mKGNhbGxzKSk7Ci0Jc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKLQotCWZvciAobG9vcCA9IDM7IGxvb3AgPj0gMDsgbG9vcC0tKSB7Ci0JCWlmIChjb25uLT5jaGFubmVsc1tsb29wXSkgewotCQkJY2FsbHNbbG9vcF0gPSBjb25uLT5jaGFubmVsc1tsb29wXTsKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGxzW2xvb3BdKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKLQotCS8qIG5vdyBraWNrIHRoZW0gYWxsICovCi0JZm9yIChsb29wID0gMzsgbG9vcCA+PSAwOyBsb29wLS0pIHsKLQkJaWYgKGNhbGxzW2xvb3BdKSB7Ci0JCQlyeHJwY19jYWxsX2hhbmRsZV9lcnJvcihjYWxsc1tsb29wXSwgbG9jYWwsIGVycm5vKTsKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGxzW2xvb3BdKTsKLQkJfQotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jb25uX2hhbmRsZV9lcnJvcigpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvaW50ZXJuYWwuaCBiL25ldC9yeHJwYy9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBjNTc5Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIGludGVybmFsLmg6IGludGVybmFsIFJ4IFJQQyBzdHVmZgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiAgIERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pLgotICovCi0KLSNpZm5kZWYgUlhSUENfSU5URVJOQUxfSAotI2RlZmluZSBSWFJQQ19JTlRFUk5BTF9ICi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0vKgotICogZGVidWcgYWNjb3VudGluZwotICovCi0jaWYgMQotI2RlZmluZSBfX1JYQUNDVF9ERUNMKFgpIFgKLSNkZWZpbmUgX19SWEFDQ1QoWCkgZG8geyBYOyB9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBfX1JYQUNDVF9ERUNMKFgpCi0jZGVmaW5lIF9fUlhBQ0NUKFgpIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLV9fUlhBQ0NUX0RFQ0woZXh0ZXJuIGF0b21pY190IHJ4cnBjX3RyYW5zcG9ydF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY19wZWVyX2NvdW50KTsKLV9fUlhBQ0NUX0RFQ0woZXh0ZXJuIGF0b21pY190IHJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpOwotX19SWEFDQ1RfREVDTChleHRlcm4gYXRvbWljX3QgcnhycGNfY2FsbF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY19tZXNzYWdlX2NvdW50KTsKLQotLyoKLSAqIGRlYnVnIHRyYWNpbmcKLSAqLwotI2RlZmluZSBrZW50ZXIoRk1ULCBhLi4uKQlwcmludGsoIj09PiAlcygiRk1UIilcbiIsX19GVU5DVElPTl9fICwgIyNhKQotI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyNhKQotI2RlZmluZSBrZGVidWcoRk1ULCBhLi4uKQlwcmludGsoIiAgICAiRk1UIlxuIiAsICMjYSkKLSNkZWZpbmUga3Byb3RvKEZNVCwgYS4uLikJcHJpbnRrKCIjIyMgIkZNVCJcbiIgLCAjI2EpCi0jZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKCIgICAgIkZNVCJcbiIgLCAjI2EpCi0KLSNpZiAwCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWtlbnRlcihGTVQgLCAjI2EpCi0jZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWtsZWF2ZShGTVQgLCAjI2EpCi0jZGVmaW5lIF9kZWJ1ZyhGTVQsIGEuLi4pCWtkZWJ1ZyhGTVQgLCAjI2EpCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWtwcm90byhGTVQgLCAjI2EpCi0jZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJa25ldChGTVQgLCAjI2EpCi0jZWxzZQotI2RlZmluZSBfZW50ZXIoRk1ULCBhLi4uKQlkbyB7IGlmIChyeHJwY19rdHJhY2UpIGtlbnRlcihGTVQgLCAjI2EpOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWRvIHsgaWYgKHJ4cnBjX2t0cmFjZSkga2xlYXZlKEZNVCAsICMjYSk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJZG8geyBpZiAocnhycGNfa2RlYnVnKSBrZGVidWcoRk1UICwgIyNhKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcHJvdG8oRk1ULCBhLi4uKQlkbyB7IGlmIChyeHJwY19rcHJvdG8pIGtwcm90byhGTVQgLCAjI2EpOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJZG8geyBpZiAocnhycGNfa25ldCkgICBrbmV0ICAoRk1UICwgIyNhKTsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19kaXNjYXJkX215X3NpZ25hbHModm9pZCkKLXsKLQl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJc2lnaW5mb190IHNpbmZvOwotCi0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJnNpbmZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl9Ci19Ci0KLS8qCi0gKiBjYWxsLmMKLSAqLwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY2FsbHM7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSByeHJwY19jYWxsc19zZW07Ci0KLS8qCi0gKiBjb25uZWN0aW9uLmMKLSAqLwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY29ubnM7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSByeHJwY19jb25uc19zZW07Ci1leHRlcm4gdW5zaWduZWQgbG9uZyByeHJwY19jb25uX3RpbWVvdXQ7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2Nvbm5fY2xlYXJhbGwoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotCi0vKgotICogcGVlci5jCi0gKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3BlZXJzOwotZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgcnhycGNfcGVlcnNfc2VtOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcnhycGNfcGVlcl90aW1lb3V0OwotCi1leHRlcm4gdm9pZCByeHJwY19wZWVyX2NhbGN1bGF0ZV9ydHQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkJICAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJCSAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJlc3ApOwotCi1leHRlcm4gdm9pZCByeHJwY19wZWVyX2NsZWFyYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotCi0vKgotICogcHJvYy5jCi0gKi8KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotZXh0ZXJuIGludCByeHJwY19wcm9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19wcm9jX2NsZWFudXAodm9pZCk7Ci0jZW5kaWYKLQotLyoKLSAqIHRyYW5zcG9ydC5jCi0gKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0czsKLWV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW07Ci0KLSNlbmRpZiAvKiBSWFJQQ19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4aW9kLmMgYi9uZXQvcnhycGMva3J4aW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmNkNmMuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL2tyeGlvZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIGtyeGlvZC5jOiBSeCBJL08gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfa3J4aW9kX3NsZWVwcSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHJ4cnBjX2tyeGlvZF9kZWFkKTsKLQotc3RhdGljIGF0b21pY190IHJ4cnBjX2tyeGlvZF9xY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLQotc3RhdGljIExJU1RfSEVBRChyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxX2xvY2spOwotCi1zdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2tyeGlvZF9jYWxscSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrKTsKLQotc3RhdGljIHZvbGF0aWxlIGludCByeHJwY19rcnhpb2RfZGllOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggSS9PIGRhZW1vbgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2tyeGlvZCh2b2lkICphcmcpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUoa3J4aW9kLGN1cnJlbnQpOwotCi0JcHJpbnRrKCJTdGFydGVkIGtyeGlvZCAlZFxuIixjdXJyZW50LT5waWQpOwotCi0JZGFlbW9uaXplKCJrcnhpb2QiKTsKLQotCS8qIGxvb3AgYXJvdW5kIHdhaXRpbmcgZm9yIHdvcmsgdG8gZG8gKi8KLQlkbyB7Ci0JCS8qIHdhaXQgZm9yIHdvcmsgb3IgdG8gYmUgdG9sZCB0byBleGl0ICovCi0JCV9kZWJ1ZygiIyMjIEJlZ2luIFdhaXQiKTsKLQkJaWYgKCFhdG9taWNfcmVhZCgmcnhycGNfa3J4aW9kX3Fjb3VudCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJCWFkZF93YWl0X3F1ZXVlKCZyeHJwY19rcnhpb2Rfc2xlZXBxLCAma3J4aW9kKTsKLQotCQkJZm9yICg7OykgewotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZyeHJwY19rcnhpb2RfcWNvdW50KSB8fAotCQkJCSAgICByeHJwY19rcnhpb2RfZGllIHx8Ci0JCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQlicmVhazsKLQotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0KLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZyeHJwY19rcnhpb2Rfc2xlZXBxLCAma3J4aW9kKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCX0KLQkJX2RlYnVnKCIjIyMgRW5kIFdhaXQiKTsKLQotCQkvKiBkbyB3b3JrIGlmIGJlZW4gZ2l2ZW4gc29tZSB0byBkbyAqLwotCQlfZGVidWcoIiMjIyBCZWdpbiBXb3JrIik7Ci0KLQkJLyogc2VlIGlmIHRoZXJlJ3MgYSB0cmFuc3BvcnQgaW4gbmVlZCBvZiBhdHRlbnRpb24gKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSkpIHsKLQkJCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0gTlVMTDsKLQotCQkJc3Bpbl9sb2NrX2lycSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jayk7Ci0KLQkJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHEpKSB7Ci0JCQkJdHJhbnMgPSBsaXN0X2VudHJ5KAotCQkJCQlyeHJwY19rcnhpb2RfdHJhbnNwb3J0cS5uZXh0LAotCQkJCQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LAotCQkJCQlrcnhpb2RxX2xpbmspOwotCi0JCQkJbGlzdF9kZWxfaW5pdCgmdHJhbnMtPmtyeGlvZHFfbGluayk7Ci0JCQkJYXRvbWljX2RlYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0KLQkJCQkvKiBtYWtlIHN1cmUgaXQgaGFzbid0IGdvbmUgYXdheSBhbmQgZG9lc24ndCBnbwotCQkJCSAqIGF3YXkgKi8KLQkJCQlpZiAoYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSk+MCkKLQkJCQkJcnhycGNfZ2V0X3RyYW5zcG9ydCh0cmFucyk7Ci0JCQkJZWxzZQotCQkJCQl0cmFucyA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrX2lycSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jayk7Ci0KLQkJCWlmICh0cmFucykgewotCQkJCXJ4cnBjX3RyYW5zX3JlY2VpdmVfcGFja2V0KHRyYW5zKTsKLQkJCQlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKLQkJCX0KLQkJfQotCi0JCS8qIHNlZSBpZiB0aGVyZSdzIGEgY2FsbCBpbiBuZWVkIG9mIGF0dGVudGlvbiAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJnJ4cnBjX2tyeGlvZF9jYWxscSkpIHsKLQkJCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gTlVMTDsKLQotCQkJc3Bpbl9sb2NrX2lycSgmcnhycGNfa3J4aW9kX2NhbGxxX2xvY2spOwotCi0JCQlpZiAoIWxpc3RfZW1wdHkoJnJ4cnBjX2tyeGlvZF9jYWxscSkpIHsKLQkJCQljYWxsID0gbGlzdF9lbnRyeShyeHJwY19rcnhpb2RfY2FsbHEubmV4dCwKLQkJCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCi0JCQkJCQkgIHJjdl9rcnhpb2RxX2xrKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5yY3Zfa3J4aW9kcV9sayk7Ci0JCQkJYXRvbWljX2RlYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0KLQkJCQkvKiBtYWtlIHN1cmUgaXQgaGFzbid0IGdvbmUgYXdheSBhbmQgZG9lc24ndCBnbwotCQkJCSAqIGF3YXkgKi8KLQkJCQlpZiAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA+IDApIHsKLQkJCQkJX2RlYnVnKCJAQEAgS1JYSU9EIgotCQkJCQkgICAgICAgIiBCZWdpbiBBdHRlbmQgQ2FsbCAlcCIsIGNhbGwpOwotCQkJCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNhbGwgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jayk7Ci0KLQkJCWlmIChjYWxsKSB7Ci0JCQkJcnhycGNfY2FsbF9kb19zdHVmZihjYWxsKTsKLQkJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJCQlfZGVidWcoIkBAQCBLUlhJT0QgRW5kIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7Ci0JCQl9Ci0JCX0KLQotCQlfZGVidWcoIiMjIyBFbmQgV29yayIpOwotCi0JCXRyeV90b19mcmVlemUoKTsKLQotCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLwotCQlyeHJwY19kaXNjYXJkX215X3NpZ25hbHMoKTsKLQotCX0gd2hpbGUgKCFyeHJwY19rcnhpb2RfZGllKTsKLQotCS8qIGFuZCB0aGF0J3MgYWxsICovCi0JY29tcGxldGVfYW5kX2V4aXQoJnJ4cnBjX2tyeGlvZF9kZWFkLCAwKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHVwIGEga3J4aW9kIGRhZW1vbgotICovCi1pbnQgX19pbml0IHJ4cnBjX2tyeGlvZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGtlcm5lbF90aHJlYWQocnhycGNfa3J4aW9kLCBOVUxMLCAwKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kX2luaXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICoga2lsbCB0aGUga3J4aW9kIGRhZW1vbiBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKLSAqLwotdm9pZCByeHJwY19rcnhpb2Rfa2lsbCh2b2lkKQotewotCXJ4cnBjX2tyeGlvZF9kaWUgPSAxOwotCXdha2VfdXBfYWxsKCZyeHJwY19rcnhpb2Rfc2xlZXBxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyeHJwY19rcnhpb2RfZGVhZCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeGlvZF9raWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHF1ZXVlIGEgdHJhbnNwb3J0IGZvciBhdHRlbnRpb24gYnkga3J4aW9kCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JX2VudGVyKCIiKTsKLQotCWlmIChsaXN0X2VtcHR5KCZ0cmFucy0+a3J4aW9kcV9saW5rKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZ0cmFucy0+a3J4aW9kcV9saW5rKSkgewotCQkJaWYgKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpID4gMCkgewotCQkJCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5rcnhpb2RxX2xpbmssCi0JCQkJCSAgICAgICZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSk7Ci0JCQkJYXRvbWljX2luYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0JCQl9Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrLCBmbGFncyk7Ci0JCXdha2VfdXBfYWxsKCZyeHJwY19rcnhpb2Rfc2xlZXBxKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotCi19IC8qIGVuZCByeHJwY19rcnhpb2RfcXVldWVfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSB0cmFuc3BvcnQgZnJvbSBrcnhpb2QncyBhdHRlbnRpb24gcXVldWUKLSAqLwotdm9pZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmdHJhbnMtPmtyeGlvZHFfbGluaykpIHsKLQkJbGlzdF9kZWxfaW5pdCgmdHJhbnMtPmtyeGlvZHFfbGluayk7Ci0JCWF0b21pY19kZWMoJnJ4cnBjX2tyeGlvZF9xY291bnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrLCBmbGFncyk7Ci0KLQlfbGVhdmUoIiIpOwotCi19IC8qIGVuZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcXVldWUgYSBjYWxsIGZvciBhdHRlbnRpb24gYnkga3J4aW9kCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5yY3Zfa3J4aW9kcV9saykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrLCBmbGFncyk7Ci0JCWlmIChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpID4gMCkgewotCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+cmN2X2tyeGlvZHFfbGssCi0JCQkJICAgICAgJnJ4cnBjX2tyeGlvZF9jYWxscSk7Ci0JCQlhdG9taWNfaW5jKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jaywgZmxhZ3MpOwotCX0KLQl3YWtlX3VwX2FsbCgmcnhycGNfa3J4aW9kX3NsZWVwcSk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSBjYWxsIGZyb20ga3J4aW9kJ3MgYXR0ZW50aW9uIHF1ZXVlCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5yY3Zfa3J4aW9kcV9saykpIHsKLQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+cmN2X2tyeGlvZHFfbGspOwotCQlhdG9taWNfZGVjKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhycGNfa3J4aW9kX2NhbGxxX2xvY2ssIGZsYWdzKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbCgpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4c2VjZC5jIGIvbmV0L3J4cnBjL2tyeHNlY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExZTdmNS4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMva3J4c2VjZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIGtyeHNlY2QuYzogUnggc2VjdXJpdHkgZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgZGFlbW9uIGRlYWxzIHdpdGg6Ci0gKiAtIGNvbnN1bHRpbmcgdGhlIGFwcGxpY2F0aW9uIGFzIHRvIHdoZXRoZXIgaW5ib3VuZCBwZWVycyBhbmQgY2FsbHMgc2hvdWxkIGJlIGF1dGhvcmlzZWQKLSAqIC0gZ2VuZXJhdGluZyBzZWN1cml0eSBjaGFsbGVuZ2VzIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zCi0gKiAtIHJlc3BvbmRpbmcgdG8gc2VjdXJpdHkgY2hhbGxlbmdlcyBvbiBvdXRib3VuZCBjb25uZWN0aW9ucwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxyeHJwYy9rcnhzZWNkLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJ4cnBjX2tyeHNlY2Rfc2xlZXBxKTsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04ocnhycGNfa3J4c2VjZF9kZWFkKTsKLXN0YXRpYyB2b2xhdGlsZSBpbnQgcnhycGNfa3J4c2VjZF9kaWU7Ci0KLXN0YXRpYyBhdG9taWNfdCByeHJwY19rcnhzZWNkX3Fjb3VudDsKLQotLyogcXVldWUgb2YgdW5wcm9jZXNzZWQgaW5ib3VuZCBtZXNzYWdlcyB3aXRoIHNlcW5vICMxIGFuZAotICogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBmbGFnIHNldCAqLwotc3RhdGljIExJU1RfSEVBRChyeHJwY19rcnhzZWNkX2luaXRtc2dxKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotc3RhdGljIHZvaWQgcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBzZWN1cml0eSBkYWVtb24KLSAqLwotc3RhdGljIGludCByeHJwY19rcnhzZWNkKHZvaWQgKmFyZykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShrcnhzZWNkLCBjdXJyZW50KTsKLQotCWludCBkaWU7Ci0KLQlwcmludGsoIlN0YXJ0ZWQga3J4c2VjZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKLQotCWRhZW1vbml6ZSgia3J4c2VjZCIpOwotCi0JLyogbG9vcCBhcm91bmQgd2FpdGluZyBmb3Igd29yayB0byBkbyAqLwotCWRvIHsKLQkJLyogd2FpdCBmb3Igd29yayBvciB0byBiZSB0b2xkIHRvIGV4aXQgKi8KLQkJX2RlYnVnKCIjIyMgQmVnaW4gV2FpdCIpOwotCQlpZiAoIWF0b21pY19yZWFkKCZyeHJwY19rcnhzZWNkX3Fjb3VudCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJCWFkZF93YWl0X3F1ZXVlKCZyeHJwY19rcnhzZWNkX3NsZWVwcSwgJmtyeHNlY2QpOwotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KSB8fAotCQkJCSAgICByeHJwY19rcnhzZWNkX2RpZSB8fAotCQkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlzY2hlZHVsZSgpOwotCQkJfQotCi0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnhycGNfa3J4c2VjZF9zbGVlcHEsICZrcnhzZWNkKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCX0KLQkJZGllID0gcnhycGNfa3J4c2VjZF9kaWU7Ci0JCV9kZWJ1ZygiIyMjIEVuZCBXYWl0Iik7Ci0KLQkJLyogc2VlIGlmIHRoZXJlJ3JlIGluY29taW5nIGNhbGxzIGluIG5lZWQgb2YgYXV0aGVudGljYXRpbmcgKi8KLQkJX2RlYnVnKCIjIyMgQmVnaW4gSW5ib3VuZCBDYWxscyIpOwotCi0JCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4c2VjZF9pbml0bXNncSkpIHsKLQkJCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2cgPSBOVUxMOwotCi0JCQlzcGluX2xvY2soJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3FfbG9jayk7Ci0KLQkJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4c2VjZF9pbml0bXNncSkpIHsKLQkJCQltc2cgPSBsaXN0X2VudHJ5KHJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EubmV4dCwKLQkJCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmbXNnLT5saW5rKTsKLQkJCQlhdG9taWNfZGVjKCZyeHJwY19rcnhzZWNkX3Fjb3VudCk7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOwotCi0JCQlpZiAobXNnKSB7Ci0JCQkJcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwobXNnKTsKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJfQotCQl9Ci0KLQkJX2RlYnVnKCIjIyMgRW5kIEluYm91bmQgQ2FsbHMiKTsKLQotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KLQkJcnhycGNfZGlzY2FyZF9teV9zaWduYWxzKCk7Ci0KLQl9IHdoaWxlICghZGllKTsKLQotCS8qIGFuZCB0aGF0J3MgYWxsICovCi0JY29tcGxldGVfYW5kX2V4aXQoJnJ4cnBjX2tyeHNlY2RfZGVhZCwgMCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeHNlY2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RhcnQgdXAgYSBrcnhzZWNkIGRhZW1vbgotICovCi1pbnQgX19pbml0IHJ4cnBjX2tyeHNlY2RfaW5pdCh2b2lkKQotewotCXJldHVybiBrZXJuZWxfdGhyZWFkKHJ4cnBjX2tyeHNlY2QsIE5VTEwsIDApOwotCi19IC8qIGVuZCByeHJwY19rcnhzZWNkX2luaXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICoga2lsbCB0aGUga3J4c2VjZCBkYWVtb24gYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCi0gKi8KLXZvaWQgcnhycGNfa3J4c2VjZF9raWxsKHZvaWQpCi17Ci0JcnhycGNfa3J4c2VjZF9kaWUgPSAxOwotCXdha2VfdXBfYWxsKCZyeHJwY19rcnhzZWNkX3NsZWVwcSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmcnhycGNfa3J4c2VjZF9kZWFkKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9raWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFyIGFsbCBwZW5kaW5nIGluY29taW5nIGNhbGxzIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydAotICovCi12b2lkIHJ4cnBjX2tyeHNlY2RfY2xlYXJfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQotewotCUxJU1RfSEVBRCh0bXApOwotCi0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcCwgKl9uOwotCi0JX2VudGVyKCIlcCIsdHJhbnMpOwotCi0JLyogbW92ZSBhbGwgdGhlIG1lc3NhZ2VzIGZvciB0aGlzIHRyYW5zcG9ydCBvbnRvIGEgdGVtcCBsaXN0ICovCi0Jc3Bpbl9sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKF9wLCBfbiwgJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOwotCQlpZiAobXNnLT50cmFucyA9PSB0cmFucykgewotCQkJbGlzdF9tb3ZlX3RhaWwoJm1zZy0+bGluaywgJnRtcCk7Ci0JCQlhdG9taWNfZGVjKCZyeHJwY19rcnhzZWNkX3Fjb3VudCk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCS8qIHphcCBhbGwgbWVzc2FnZXMgb24gdGhlIHRlbXAgbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQltc2cgPSBsaXN0X2VudHJ5KHRtcC5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2tyeHNlY2RfY2xlYXJfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHF1ZXVlIGEgbWVzc2FnZSBvbiB0aGUgaW5jb21pbmcgY2FsbHMgbGlzdAotICovCi12b2lkIHJ4cnBjX2tyeHNlY2RfcXVldWVfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCV9lbnRlcigiJXAiLCBtc2cpOwotCi0JLyogcXVldWUgZm9yIHByb2Nlc3NpbmcgYnkga3J4c2VjZCAqLwotCXNwaW5fbG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCWlmICghcnhycGNfa3J4c2VjZF9kaWUpIHsKLQkJcnhycGNfZ2V0X21lc3NhZ2UobXNnKTsKLQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCAmcnhycGNfa3J4c2VjZF9pbml0bXNncSk7Ci0JCWF0b21pY19pbmMoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KTsKLQl9Ci0KLQlzcGluX3VubG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCXdha2VfdXAoJnJ4cnBjX2tyeHNlY2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19rcnhzZWNkX3F1ZXVlX2luY29taW5nX2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcHJvY2VzcyB0aGUgaW5pdGlhbCBtZXNzYWdlIG9mIGFuIGluY29taW5nIGNhbGwKLSAqLwotdm9pZCByeHJwY19rcnhzZWNkX3Byb2Nlc3NfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0gbXNnLT50cmFuczsKLQlzdHJ1Y3QgcnhycGNfc2VydmljZSAqc3J2OwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXVuc2lnbmVkIHNob3J0IHNpZDsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHt0cj0lcH0iLCBtc2csIHRyYW5zKTsKLQotCXJldCA9IHJ4cnBjX2luY29taW5nX2NhbGwobXNnLT5jb25uLCBtc2csICZjYWxsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBmaW5kIHRoZSBtYXRjaGluZyBzZXJ2aWNlIG9uIHRoZSB0cmFuc3BvcnQgKi8KLQlzaWQgPSBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpOwotCXNydiA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJnRyYW5zLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnNlcnZpY2VzKSB7Ci0JCXNydiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19zZXJ2aWNlLCBsaW5rKTsKLQkJaWYgKHNydi0+c2VydmljZV9pZCA9PSBzaWQgJiYgdHJ5X21vZHVsZV9nZXQoc3J2LT5vd25lcikpIHsKLQkJCS8qIGZvdW5kIGEgbWF0Y2ggKG1hZGUgc3VyZSBpdCB3b24ndCB2YW5pc2gpICovCi0JCQlfZGVidWcoImZvdW5kIHNlcnZpY2UgJyVzJyIsIHNydi0+bmFtZSk7Ci0JCQljYWxsLT5vd25lciA9IHNydi0+b3duZXI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmdHJhbnMtPmxvY2spOwotCi0JLyogcmVwb3J0IHRoZSBuZXcgY29ubmVjdGlvbgotCSAqIC0gdGhlIGZ1bmMgbXVzdCBpbmMgdGhlIGNhbGwncyB1c2FnZSBjb3VudCB0byBrZWVwIGl0Ci0JICovCi0JcmV0ID0gLUVOT0VOVDsKLQlpZiAoX3AgIT0gJnRyYW5zLT5zZXJ2aWNlcykgewotCQkvKiBhdHRlbXB0IHRvIGFjY2VwdCB0aGUgY2FsbCAqLwotCQljYWxsLT5jb25uLT5zZXJ2aWNlID0gc3J2OwotCQljYWxsLT5hcHBfYXR0bl9mdW5jID0gc3J2LT5hdHRuX2Z1bmM7Ci0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jID0gc3J2LT5lcnJvcl9mdW5jOwotCQljYWxsLT5hcHBfYWVtYXBfZnVuYyA9IHNydi0+YWVtYXBfZnVuYzsKLQotCQlyZXQgPSBzcnYtPm5ld19jYWxsKGNhbGwpOwotCi0JCS8qIHNlbmQgYW4gYWJvcnQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKi8KLQkJaWYgKHJldCA8IDApIHsKLQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIGZvcm1hbGx5IHJlY2VpdmUgYW5kIEFDSyB0aGUgbmV3IHBhY2tldCAqLwotCQkJcmV0ID0gcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KGNhbGwtPmNvbm4sCi0JCQkJCQkJICAgICBjYWxsLCBtc2cpOwotCQl9Ci0JfQotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0OgotCWlmIChyZXQgPCAwKQotCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgcmV0KTsKLQotCV9sZWF2ZSgiICglZCkiLCByZXQpOwotfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeHRpbW9kLmMgYi9uZXQvcnhycGMva3J4dGltb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5YjYxMy4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMva3J4dGltb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKiBrcnh0aW1vZC5jOiBSWFJQQyB0aW1lb3V0IGRhZW1vbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrcnh0aW1vZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGtyeHRpbW9kX2RlYWQpOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtyeHRpbW9kX3NsZWVwcSk7Ci1zdGF0aWMgaW50IGtyeHRpbW9kX2RpZTsKLQotc3RhdGljIExJU1RfSEVBRChrcnh0aW1vZF9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa3J4dGltb2RfbG9jayk7Ci0KLXN0YXRpYyBpbnQga3J4dGltb2Qodm9pZCAqYXJnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbgotICovCi1pbnQgcnhycGNfa3J4dGltb2Rfc3RhcnQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0ga2VybmVsX3RocmVhZChrcnh0aW1vZCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrcnh0aW1vZF9hbGl2ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfa3J4dGltb2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgdGltZW91dCBkYWVtb24KLSAqLwotdm9pZCByeHJwY19rcnh0aW1vZF9raWxsKHZvaWQpCi17Ci0JLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KLQlrcnh0aW1vZF9kaWUgPSAxOwotCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigma3J4dGltb2RfZGVhZCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeHRpbW9kX2tpbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdGltZW91dCBwcm9jZXNzaW5nIGRhZW1vbgotICovCi1zdGF0aWMgaW50IGtyeHRpbW9kKHZvaWQgKmFyZykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwotCi0JcnhycGNfdGltZXJfdCAqdGltZXI7Ci0KLQlwcmludGsoIlN0YXJ0ZWQga3J4dGltb2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImtyeHRpbW9kIik7Ci0KLQljb21wbGV0ZSgma3J4dGltb2RfYWxpdmUpOwotCi0JLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLwotIGxvb3A6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlhZGRfd2FpdF9xdWV1ZSgma3J4dGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgbG9uZyBqaWY7Ci0JCWxvbmcgdGltZW91dDsKLQotCQkvKiBkZWFsIHdpdGggdGhlIHNlcnZlciBiZWluZyBhc2tlZCB0byBkaWUgKi8KLQkJaWYgKGtyeHRpbW9kX2RpZSkgewotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmtyeHRpbW9kX3NsZWVwcSwgJm15c2VsZik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJY29tcGxldGVfYW5kX2V4aXQoJmtyeHRpbW9kX2RlYWQsIDApOwotCQl9Ci0KLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCi0JCS8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCi0JCXJ4cnBjX2Rpc2NhcmRfbXlfc2lnbmFscygpOwotCi0JCS8qIHdvcmsgb3V0IHRoZSB0aW1lIHRvIGVsYXBzZSBiZWZvcmUgdGhlIG5leHQgZXZlbnQgKi8KLQkJc3Bpbl9sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmtyeHRpbW9kX2xpc3QpKSB7Ci0JCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aW1lciA9IGxpc3RfZW50cnkoa3J4dGltb2RfbGlzdC5uZXh0LAotCQkJCQkgICByeHJwY190aW1lcl90LCBsaW5rKTsKLQkJCXRpbWVvdXQgPSB0aW1lci0+dGltb19qaWY7Ci0JCQlqaWYgPSBqaWZmaWVzOwotCi0JCQlpZiAodGltZV9iZWZvcmVfZXEoKHVuc2lnbmVkIGxvbmcpIHRpbWVvdXQsIGppZikpCi0JCQkJZ290byBpbW1lZGlhdGU7Ci0KLQkJCWVsc2UgewotCQkJCXRpbWVvdXQgPSAobG9uZykgdGltZW91dCAtIChsb25nKSBqaWZmaWVzOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQotCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JfQotCi0JLyogdGhlIHRoaW5nIG9uIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgbmVlZHMgcHJvY2Vzc2luZwotCSAqIC0gd2UgY29tZSBoZXJlIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgdGltZXIgcG9pbnRpbmcgdG8gdGhlIGV4cGlyZWQKLQkgKiAgIGVudHJ5Ci0JICovCi0gaW1tZWRpYXRlOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZrcnh0aW1vZF9zbGVlcHEsICZteXNlbGYpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlfZGVidWcoIkBAQCBCZWdpbiBUaW1lb3V0IG9mICVwIiwgdGltZXIpOwotCi0JLyogZGVxdWV1ZSB0aGUgdGltZXIgKi8KLQlsaXN0X2RlbF9pbml0KCZ0aW1lci0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJmtyeHRpbW9kX2xvY2spOwotCi0JLyogY2FsbCB0aGUgdGltZW91dCBmdW5jdGlvbiAqLwotCXRpbWVyLT5vcHMtPnRpbWVkX291dCh0aW1lcik7Ci0KLQlfZGVidWcoIkBAQCBFbmQgVGltZW91dCIpOwotCWdvdG8gbG9vcDsKLQotfSAvKiBlbmQga3J4dGltb2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogKHJlLSlxdWV1ZSBhIHRpbWVyCi0gKi8KLXZvaWQgcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JcnhycGNfdGltZXJfdCAqcHRpbWVyOwotCi0JX2VudGVyKCIlcCwlbHUiLCB0aW1lciwgdGltZW91dCk7Ci0KLQlzcGluX2xvY2soJmtyeHRpbW9kX2xvY2spOwotCi0JbGlzdF9kZWwoJnRpbWVyLT5saW5rKTsKLQotCS8qIHRoZSB0aW1lciB3YXMgZGVmZXJyZWQgb3IgcmVzZXQgLSBwdXQgaXQgYmFjayBpbiB0aGUgcXVldWUgYXQgdGhlCi0JICogcmlnaHQgcGxhY2UgKi8KLQl0aW1lci0+dGltb19qaWYgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCWxpc3RfZm9yX2VhY2goX3AsICZrcnh0aW1vZF9saXN0KSB7Ci0JCXB0aW1lciA9IGxpc3RfZW50cnkoX3AsIHJ4cnBjX3RpbWVyX3QsIGxpbmspOwotCQlpZiAodGltZV9iZWZvcmUodGltZXItPnRpbW9famlmLCBwdGltZXItPnRpbW9famlmKSkKLQkJCWJyZWFrOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5saW5rLCBfcCk7IC8qIGluc2VydCBiZWZvcmUgc3RvcHBpbmcgcG9pbnQgKi8KLQotCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQotCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSB0aW1lcgotICogLSByZXR1cm5zIDAgaWYgdGhlIHRpbWVyIHdhcyBkZWxldGVkIG9yIC1FTk9FTlQgaWYgaXQgd2Fzbid0IHF1ZXVlZAotICovCi1pbnQgcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyKQotewotCWludCByZXQgPSAwOwotCi0JX2VudGVyKCIlcCIsIHRpbWVyKTsKLQotCXNwaW5fbG9jaygma3J4dGltb2RfbG9jayk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmdGltZXItPmxpbmspKQotCQlyZXQgPSAtRU5PRU5UOwotCWVsc2UKLQkJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOwotCi0Jc3Bpbl91bmxvY2soJmtyeHRpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma3J4dGltb2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCByeHJwY19rcnh0aW1vZF9kZWxfdGltZXIoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL21haW4uYyBiL25ldC9yeHJwYy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZWMxZjcuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiBtYWluLmM6IFJ4IFJQQyBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4c2VjZC5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJSeCBSUEMgaW1wbGVtZW50YXRpb24iKTsKLU1PRFVMRV9BVVRIT1IoIlJlZCBIYXQsIEluYy4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotX19iZTMyIHJ4cnBjX2Vwb2NoOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaW5pdGlhbGlzZSB0aGUgUnggbW9kdWxlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJ4cnBjX2luaXRpYWxpc2Uodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogbXkgZXBvY2ggdmFsdWUgKi8KLQlyeHJwY19lcG9jaCA9IGh0b25sKHh0aW1lLnR2X3NlYyk7Ci0KLQkvKiByZWdpc3RlciB0aGUgL3Byb2MgaW50ZXJmYWNlICovCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZXQgPSByeHJwY19wcm9jX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotCS8qIHJlZ2lzdGVyIHRoZSBzeXNjdGwgZmlsZXMgKi8KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JcmV0ID0gcnhycGNfc3lzY3RsX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3JfcHJvYzsKLSNlbmRpZgotCi0JLyogc3RhcnQgdGhlIGtyeHRpbW9kIGRhZW1vbiAqLwotCXJldCA9IHJ4cnBjX2tyeHRpbW9kX3N0YXJ0KCk7Ci0JaWYgKHJldDwwKQotCQlnb3RvIGVycm9yX3N5c2N0bDsKLQotCS8qIHN0YXJ0IHRoZSBrcnhpb2QgZGFlbW9uICovCi0JcmV0ID0gcnhycGNfa3J4aW9kX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3Jfa3J4dGltb2Q7Ci0KLQkvKiBzdGFydCB0aGUga3J4c2VjZCBkYWVtb24gKi8KLQlyZXQgPSByeHJwY19rcnhzZWNkX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3Jfa3J4aW9kOwotCi0Ja2RlYnVnKCJcblxuIik7Ci0KLQlyZXR1cm4gMDsKLQotIGVycm9yX2tyeGlvZDoKLQlyeHJwY19rcnhpb2Rfa2lsbCgpOwotIGVycm9yX2tyeHRpbW9kOgotCXJ4cnBjX2tyeHRpbW9kX2tpbGwoKTsKLSBlcnJvcl9zeXNjdGw6Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXJ4cnBjX3N5c2N0bF9jbGVhbnVwKCk7Ci0gZXJyb3JfcHJvYzoKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcnhycGNfcHJvY19jbGVhbnVwKCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfaW5pdGlhbGlzZSgpICovCi0KLW1vZHVsZV9pbml0KHJ4cnBjX2luaXRpYWxpc2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYW4gdXAgdGhlIFJ4IG1vZHVsZQotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgcnhycGNfY2xlYW51cCh2b2lkKQotewotCWtlbnRlcigiIik7Ci0KLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIE1lc3NhZ2VzICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ2FsbHMgICAgICA6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2NhbGxfY291bnQpKSk7Ci0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBDb25uZWN0aW9uczogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFBlZXJzICAgICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19wZWVyX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgVHJhbnNwb3J0cyA6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX3RyYW5zcG9ydF9jb3VudCkpKTsKLQotCXJ4cnBjX2tyeHNlY2Rfa2lsbCgpOwotCXJ4cnBjX2tyeGlvZF9raWxsKCk7Ci0JcnhycGNfa3J4dGltb2Rfa2lsbCgpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlyeHJwY19zeXNjdGxfY2xlYW51cCgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyeHJwY19wcm9jX2NsZWFudXAoKTsKLSNlbmRpZgotCi0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBNZXNzYWdlcyAgIDogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfbWVzc2FnZV9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIENhbGxzICAgICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19jYWxsX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ29ubmVjdGlvbnM6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKSk7Ci0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBQZWVycyAgICAgIDogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfcGVlcl9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFRyYW5zcG9ydHMgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY190cmFuc3BvcnRfY291bnQpKSk7Ci0KLQlrbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfY2xlYW51cCgpICovCi0KLW1vZHVsZV9leGl0KHJ4cnBjX2NsZWFudXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYXIgdGhlIGRlYWQgc3BhY2UgYmV0d2VlbiB0YXNrX3N0cnVjdCBhbmQga2VybmVsIHN0YWNrCi0gKiAtIGNhbGxlZCBieSBzdXBwbHlpbmcgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucyB0byBnY2MKLSAqLwotI2lmIDAKLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi1fX2F0dHJpYnV0ZV9fKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7Ci0KLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi17Ci0gICAgICAgYXNtIHZvbGF0aWxlKCIgIG1vdmwgICAgJSVlc3AsJSVlZGkgICAgIFxuIgotCQkgICAgIiAgYW5kbCAgICAlMCwlJWVkaSAgICAgICAgXG4iCi0JCSAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKLQkJICAgICIgIG1vdmwgICAgJSVlc3AsJSVlY3ggICAgIFxuIgotCQkgICAgIiAgc3VibCAgICAlJWVkaSwlJWVjeCAgICAgXG4iCi0JCSAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKLQkJICAgICIgIG1vdmwgICAgJDB4ZWRlZGVkZWQsJSVlYXggICAgIFxuIgotCQkgICAgIiAgcmVwIHN0b3NsICAgICAgICAgICAgICAgXG4iCi0JCSAgICA6Ci0JCSAgICA6ICJpIih+KFRIUkVBRF9TSVpFLTEpKSwgImkiKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKQotCQkgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgotCQkgICAgKTsKLX0KLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdCh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi1fX2F0dHJpYnV0ZV9fKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7Ci0KLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQotewotICAgICAgIGFzbSB2b2xhdGlsZSgiICBtb3ZsICAgICUlZXNwLCUlZWRpICAgICBcbiIKLQkJICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgotCQkgICAgIiAgYWRkbCAgICAlMSwlJWVkaSAgICAgICAgXG4iCi0JCSAgICAiICBtb3ZsICAgICUlZXNwLCUlZWN4ICAgICBcbiIKLQkJICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgotCQkgICAgIiAgc2hybCAgICAkMiwlJWVjeCAgICAgICAgXG4iCi0JCSAgICAiICBtb3ZsICAgICQweGRhZGFkYWRhLCUlZWF4ICAgICBcbiIKLQkJICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgotCQkgICAgOgotCQkgICAgOiAiaSIofihUSFJFQURfU0laRS0xKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKLQkJICAgIDogImVheCIsICJlY3giLCAiZWRpIiwgIm1lbW9yeSIsICJjYyIKLQkJICAgICk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wZWVyLmMgYi9uZXQvcnhycGMvcGVlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI3NTE1Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9wZWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyogcGVlci5jOiBSeCBSUEMgcGVlciBtYW5hZ2VtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KLSNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1fX1JYQUNDVF9ERUNMKGF0b21pY190IHJ4cnBjX3BlZXJfY291bnQpOwotTElTVF9IRUFEKHJ4cnBjX3BlZXJzKTsKLURFQ0xBUkVfUldTRU0ocnhycGNfcGVlcnNfc2VtKTsKLXVuc2lnbmVkIGxvbmcgcnhycGNfcGVlcl90aW1lb3V0ID0gMTIgKiA2MCAqIDYwOwotCi1zdGF0aWMgdm9pZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX3BlZXJfdGltZW91dChyeHJwY190aW1lcl90ICp0aW1lcikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciA9Ci0JCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCByeHJwY19wZWVyLCB0aW1lb3V0KTsKLQotCV9kZWJ1ZygiUnggUEVFUiBUSU1FT1VUIFslcHt1PSVkfV0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKLQotCXJ4cnBjX3BlZXJfZG9fdGltZW91dChwZWVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByeHJwY190aW1lcl9vcHMgcnhycGNfcGVlcl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fcnhycGNfcGVlcl90aW1lb3V0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIHBlZXIgcmVjb3JkCi0gKi8KLXN0YXRpYyBpbnQgX19yeHJwY19jcmVhdGVfcGVlcihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgX19iZTMyIGFkZHIsCi0JCQkgICAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKipfcGVlcikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQotCV9lbnRlcigiJXAsJTA4eCIsIHRyYW5zLCBudG9obChhZGRyKSk7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIHBlZXIgcmVjb3JkICovCi0JcGVlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19wZWVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZWVyKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZwZWVyLT51c2FnZSwgMSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcGVlci0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBlZXItPnByb2NfbGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBlZXItPmNvbm5faWRsaXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcGVlci0+Y29ubl9hY3RpdmUpOwotCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5jb25uX2dyYXZleWFyZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZWVyLT5jb25uX2d5X3dhaXRxKTsKLQlyd2xvY2tfaW5pdCgmcGVlci0+Y29ubl9pZGxvY2spOwotCXJ3bG9ja19pbml0KCZwZWVyLT5jb25uX2xvY2spOwotCWF0b21pY19zZXQoJnBlZXItPmNvbm5fY291bnQsIDApOwotCXNwaW5fbG9ja19pbml0KCZwZWVyLT5sb2NrKTsKLQlyeHJwY190aW1lcl9pbml0KCZwZWVyLT50aW1lb3V0LCAmcnhycGNfcGVlcl90aW1lcl9vcHMpOwotCi0JcGVlci0+YWRkci5zX2FkZHIgPSBhZGRyOwotCi0JcGVlci0+dHJhbnMgPSB0cmFuczsKLQlwZWVyLT5vcHMgPSB0cmFucy0+cGVlcl9vcHM7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JKl9wZWVyID0gcGVlcjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIHBlZXIpOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCBfX3J4cnBjX2NyZWF0ZV9wZWVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGZpbmQgYSBwZWVyIHJlY29yZCBvbiB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydAotICogLSByZXR1cm5zIChpZiBzdWNjZXNzZnVsKSB3aXRoIHBlZXIgcmVjb3JkIHVzYWdlIGluY3JlbWVudGVkCi0gKiAtIHJlc3VycmVjdHMgaXQgZnJvbSB0aGUgZ3JhdmV5YXJkIGlmIGZvdW5kIHRoZXJlCi0gKi8KLWludCByeHJwY19wZWVyX2xvb2t1cChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgX19iZTMyIGFkZHIsCi0JCSAgICAgIHN0cnVjdCByeHJwY19wZWVyICoqX3BlZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVodX0sJTA4eCIsIHRyYW5zLCB0cmFucy0+cG9ydCwgbnRvaGwoYWRkcikpOwotCi0JLyogW2NvbW1vbiBjYXNlXSBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGFjdGl2ZSBsaXN0IGZpcnN0ICovCi0JcmVhZF9sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnBlZXJfYWN0aXZlKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7Ci0JCWlmIChwZWVyLT5hZGRyLnNfYWRkciA9PSBhZGRyKQotCQkJZ290byBmb3VuZF9hY3RpdmU7Ci0JfQotCXJlYWRfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQotCS8qIFt1bmNvbW1vbiBjYXNlXSBub3QgYWN0aXZlIC0gY3JlYXRlIGEgY2FuZGlkYXRlIGZvciBhIG5ldyByZWNvcmQgKi8KLQlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9wZWVyKHRyYW5zLCBhZGRyLCAmY2FuZGlkYXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIGFjdGl2ZSBsaXN0IGFnYWluLCBqdXN0IGluIGNhc2UgaXQgYXBwZWFyZWQgd2hpbHN0IHdlCi0JICogd2VyZSBidXN5ICovCi0Jd3JpdGVfbG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfcCwgJnRyYW5zLT5wZWVyX2FjdGl2ZSkgewotCQlwZWVyID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX3BlZXIsIGxpbmspOwotCQlpZiAocGVlci0+YWRkci5zX2FkZHIgPT0gYWRkcikKLQkJCWdvdG8gZm91bmRfYWN0aXZlX3NlY29uZF9jaGFuY2U7Ci0JfQotCi0JLyogc2VhcmNoIHRoZSB0cmFuc3BvcnQncyBncmF2ZXlhcmQgbGlzdCAqLwotCXNwaW5fbG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnBlZXJfZ3JhdmV5YXJkKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7Ci0JCWlmIChwZWVyLT5hZGRyLnNfYWRkciA9PSBhZGRyKQotCQkJZ290byBmb3VuZF9pbl9ncmF2ZXlhcmQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCi0JLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QKLQkgKiAtIHRlbGwgdGhlIGFwcGxpY2F0aW9uIGxheWVyIHRoYXQgdGhpcyBwZWVyIGhhcyBiZWVuIGFkZGVkCi0JICovCi0JcnhycGNfZ2V0X3RyYW5zcG9ydCh0cmFucyk7Ci0JcGVlciA9IGNhbmRpZGF0ZTsKLQljYW5kaWRhdGUgPSBOVUxMOwotCi0JaWYgKHBlZXItPm9wcyAmJiBwZWVyLT5vcHMtPmFkZGluZykgewotCQlyZXQgPSBwZWVyLT5vcHMtPmFkZGluZyhwZWVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXdyaXRlX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JCQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JCQlrZnJlZShwZWVyKTsKLQkJCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JYXRvbWljX2luYygmdHJhbnMtPnBlZXJfY291bnQpOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmcGVlci0+bGluaywgJnRyYW5zLT5wZWVyX2FjdGl2ZSk7Ci0KLSBzdWNjZXNzX3V3ZnJlZToKLQl3cml0ZV91bmxvY2soJnRyYW5zLT5wZWVyX2xvY2spOwotCi0JaWYgKGNhbmRpZGF0ZSkgewotCQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JCWtmcmVlKGNhbmRpZGF0ZSk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnBlZXItPnByb2NfbGluaykpIHsKLQkJZG93bl93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQkJbGlzdF9hZGRfdGFpbCgmcGVlci0+cHJvY19saW5rLCAmcnhycGNfcGVlcnMpOwotCQl1cF93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQl9Ci0KLSBzdWNjZXNzOgotCSpfcGVlciA9IHBlZXI7Ci0KLQlfbGVhdmUoIiA9IDAgKCVwe3U9JWQgY2M9JWR9KSIsCi0JICAgICAgIHBlZXIsCi0JICAgICAgIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSksCi0JICAgICAgIGF0b21pY19yZWFkKCZwZWVyLT5jb25uX2NvdW50KSk7Ci0JcmV0dXJuIDA7Ci0KLQkvKiBoYW5kbGUgdGhlIHBlZXIgYmVpbmcgZm91bmQgaW4gdGhlIGFjdGl2ZSBsaXN0IHN0cmFpZ2h0IG9mZiAqLwotIGZvdW5kX2FjdGl2ZToKLQlyeHJwY19nZXRfcGVlcihwZWVyKTsKLQlyZWFkX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JZ290byBzdWNjZXNzOwotCi0JLyogaGFuZGxlIHJlc3VycmVjdGluZyBhIHBlZXIgZnJvbSB0aGUgZ3JhdmV5YXJkICovCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCXJ4cnBjX2dldF9wZWVyKHBlZXIpOwotCXJ4cnBjX2dldF90cmFuc3BvcnQocGVlci0+dHJhbnMpOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmcGVlci0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmcGVlci0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JZ290byBtYWtlX2FjdGl2ZTsKLQotCS8qIGhhbmRsZSBmaW5kaW5nIHRoZSBwZWVyIG9uIHRoZSBzZWNvbmQgdGltZSB0aHJvdWdoIHRoZSBhY3RpdmUKLQkgKiBsaXN0ICovCi0gZm91bmRfYWN0aXZlX3NlY29uZF9jaGFuY2U6Ci0JcnhycGNfZ2V0X3BlZXIocGVlcik7Ci0JZ290byBzdWNjZXNzX3V3ZnJlZTsKLQotfSAvKiBlbmQgcnhycGNfcGVlcl9sb29rdXAoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZmluaXNoIHdpdGggYSBwZWVyIHJlY29yZAotICogLSBpdCBnZXRzIHNlbnQgdG8gdGhlIGdyYXZleWFyZCBmcm9tIHdoZXJlIGl0IGNhbiBiZSByZXN1cnJlY3RlZCBvciB0aW1lZAotICogICBvdXQKLSAqLwotdm9pZCByeHJwY19wdXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyA9IHBlZXItPnRyYW5zOwotCi0JX2VudGVyKCIlcHtjYz0lZCBhPSUwOHh9IiwKLQkgICAgICAgcGVlciwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkcikpOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQl3cml0ZV9sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmcGVlci0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG1vdmUgdG8gZ3JhdmV5YXJkIHF1ZXVlICovCi0JbGlzdF9kZWwoJnBlZXItPmxpbmspOwotCXdyaXRlX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwZWVyLT5saW5rLCAmdHJhbnMtPnBlZXJfZ3JhdmV5YXJkKTsKLQotCUJVR19PTighbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9hY3RpdmUpKTsKLQotCXJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcigmcGVlci0+dGltZW91dCwgcnhycGNfcGVlcl90aW1lb3V0ICogSFopOwotCi0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0KLQlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKLQotCV9sZWF2ZSgiIFtraWxsZWRdIik7Ci19IC8qIGVuZCByeHJwY19wdXRfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYSBwZWVyIHRpbWluZyBvdXQgaW4gdGhlIGdyYXZleWFyZAotICogLSBjYWxsZWQgZnJvbSBrcnh0aW1vZAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPSBwZWVyLT50cmFuczsKLQotCV9lbnRlcigiJXB7dT0lZCBjYz0lZCBhPSUwOHh9IiwKLQkgICAgICAgcGVlciwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkcikpOwotCi0JQlVHX09OKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPCAwKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCWlmIChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpID09IDApCi0JCWxpc3RfZGVsX2luaXQoJnBlZXItPmxpbmspOwotCWVsc2UKLQkJcGVlciA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0KLQlpZiAoIXBlZXIpIHsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOyAvKiByZXN1cnJlY3RlZCAqLwotCX0KLQotCS8qIGNsZWFyIGFsbCBjb25uZWN0aW9ucyBvbiB0aGlzIHBlZXIgKi8KLQlyeHJwY19jb25uX2NsZWFyYWxsKHBlZXIpOwotCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2FjdGl2ZSkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9ncmF2ZXlhcmQpKTsKLQotCS8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gbGF5ZXIgKi8KLQlpZiAocGVlci0+b3BzICYmIHBlZXItPm9wcy0+ZGlzY2FyZGluZykKLQkJcGVlci0+b3BzLT5kaXNjYXJkaW5nKHBlZXIpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5wcm9jX2xpbmspKSB7Ci0JCWRvd25fd3JpdGUoJnJ4cnBjX3BlZXJzX3NlbSk7Ci0JCWxpc3RfZGVsKCZwZWVyLT5wcm9jX2xpbmspOwotCQl1cF93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQl9Ci0KLQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0Ja2ZyZWUocGVlcik7Ci0KLQkvKiBpZiB0aGUgZ3JhdmV5YXJkIGlzIG5vdyBlbXB0eSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgdGhhdCAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFucy0+cGVlcl9jb3VudCkpCi0JCXdha2VfdXAoJnRyYW5zLT5wZWVyX2d5X3dhaXRxKTsKLQotCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Ci19IC8qIGVuZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYXIgYWxsIHBlZXIgcmVjb3JkcyBmcm9tIGEgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLXZvaWQgcnhycGNfcGVlcl9jbGVhcmFsbChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlpbnQgZXJyOwotCi0JX2VudGVyKCIlcCIsdHJhbnMpOwotCi0JLyogdGhlcmUgc2hvdWxkbid0IGJlIGFueSBhY3RpdmUgcGVlcnMgcmVtYWluaW5nICovCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZ0cmFucy0+cGVlcl9hY3RpdmUpKTsKLQotCS8qIG1hbnVhbGx5IHRpbWVvdXQgYWxsIHBlZXJzIGluIHRoZSBncmF2ZXlhcmQgKi8KLQlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZ0cmFucy0+cGVlcl9ncmF2ZXlhcmQpKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KHRyYW5zLT5wZWVyX2dyYXZleWFyZC5uZXh0LAotCQkJCSAgc3RydWN0IHJ4cnBjX3BlZXIsIGxpbmspOwotCQlfZGVidWcoIkNsZWFyaW5nIHBlZXIgJXBcbiIsIHBlZXIpOwotCQllcnIgPSByeHJwY19rcnh0aW1vZF9kZWxfdGltZXIoJnBlZXItPnRpbWVvdXQpOwotCQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQotCQlpZiAoZXJyID09IDApCi0JCQlyeHJwY19wZWVyX2RvX3RpbWVvdXQocGVlcik7Ci0KLQkJc3Bpbl9sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCX0KLQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQotCS8qIHdhaXQgZm9yIHRoZSB0aGUgcGVlciBncmF2ZXlhcmQgdG8gYmUgY29tcGxldGVseSBjbGVhcmVkICovCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZ0cmFucy0+cGVlcl9neV93YWl0cSwgJm15c2VsZik7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnRyYW5zLT5wZWVyX2NvdW50KSAhPSAwKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmdHJhbnMtPnBlZXJfZ3lfd2FpdHEsICZteXNlbGYpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfcGVlcl9jbGVhcmFsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjYWxjdWxhdGUgYW5kIGNhY2hlIHRoZSBSb3VuZC1UcmlwLVRpbWUgZm9yIGEgbWVzc2FnZSBhbmQgaXRzIHJlc3BvbnNlCi0gKi8KLXZvaWQgcnhycGNfcGVlcl9jYWxjdWxhdGVfcnR0KHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJICAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICpyZXNwKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBydHQ7Ci0JaW50IGxvb3A7Ci0KLQlfZW50ZXIoIiVwLCVwLCVwIiwgcGVlciwgbXNnLCByZXNwKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgbGF0ZXN0IFJUVCAqLwotCXJ0dCA9IHJlc3AtPnN0YW1wLnR2X3NlYyAtIG1zZy0+c3RhbXAudHZfc2VjOwotCXJ0dCAqPSAxMDAwMDAwVUw7Ci0JcnR0ICs9IHJlc3AtPnN0YW1wLnR2X3VzZWMgLSBtc2ctPnN0YW1wLnR2X3VzZWM7Ci0KLQkvKiBhZGQgdG8gY2FjaGUgKi8KLQlwZWVyLT5ydHRfY2FjaGVbcGVlci0+cnR0X3BvaW50XSA9IHJ0dDsKLQlwZWVyLT5ydHRfcG9pbnQrKzsKLQlwZWVyLT5ydHRfcG9pbnQgJT0gUlhSUENfUlRUX0NBQ0hFX1NJWkU7Ci0KLQlpZiAocGVlci0+cnR0X3VzYWdlIDwgUlhSUENfUlRUX0NBQ0hFX1NJWkUpCi0JCXBlZXItPnJ0dF91c2FnZSsrOwotCi0JLyogcmVjYWxjdWxhdGUgUlRUICovCi0JcnR0ID0gMDsKLQlmb3IgKGxvb3AgPSBwZWVyLT5ydHRfdXNhZ2UgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKLQkJcnR0ICs9IHBlZXItPnJ0dF9jYWNoZVtsb29wXTsKLQotCWRvX2RpdihydHQsIHBlZXItPnJ0dF91c2FnZSk7Ci0JcGVlci0+cnR0ID0gcnR0OwotCi0JX2xlYXZlKCIgUlRUPSVsdS4lbHVtcyIsCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0IC8gMTAwMCksIChsb25nKSAocGVlci0+cnR0ICUgMTAwMCkpOwotCi19IC8qIGVuZCByeHJwY19wZWVyX2NhbGN1bGF0ZV9ydHQoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3Byb2MuYyBiL25ldC9yeHJwYy9wcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTFjODcuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL3Byb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDYxNyArMCwwIEBACi0vKiBwcm9jLmM6IC9wcm9jIGludGVyZmFjZSBmb3IgUnhSUEMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfcnhycGM7Ci0KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX3RyYW5zcG9ydHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7Ci1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnhycGNfcHJvY190cmFuc3BvcnRzX29wcyA9IHsKLQkuc3RhcnQJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RhcnQsCi0JLm5leHQJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfbmV4dCwKLQkuc3RvcAk9IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wLAotCS5zaG93CT0gcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3csCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19wcm9jX3RyYW5zcG9ydHNfZm9wcyA9IHsKLQkub3BlbgkJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCByeHJwY19wcm9jX3BlZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19wZWVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpOwotc3RhdGljIHZvaWQgcnhycGNfcHJvY19wZWVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7Ci1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfcGVlcnNfb3BzID0gewotCS5zdGFydAk9IHJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQsCi0JLm5leHQJPSByeHJwY19wcm9jX3BlZXJzX25leHQsCi0JLnN0b3AJPSByeHJwY19wcm9jX3BlZXJzX3N0b3AsCi0JLnNob3cJPSByeHJwY19wcm9jX3BlZXJzX3Nob3csCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19wcm9jX3BlZXJzX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gcnhycGNfcHJvY19wZWVyc19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfY29ubnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jb25uc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2Nvbm5zX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgdm9pZCByeHJwY19wcm9jX2Nvbm5zX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnhycGNfcHJvY19jb25uc19vcHMgPSB7Ci0JLnN0YXJ0CT0gcnhycGNfcHJvY19jb25uc19zdGFydCwKLQkubmV4dAk9IHJ4cnBjX3Byb2NfY29ubnNfbmV4dCwKLQkuc3RvcAk9IHJ4cnBjX3Byb2NfY29ubnNfc3RvcCwKLQkuc2hvdwk9IHJ4cnBjX3Byb2NfY29ubnNfc2hvdywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfY29ubnNfZm9wcyA9IHsKLQkub3BlbgkJPSByeHJwY19wcm9jX2Nvbm5zX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jYWxsc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2NhbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY2FsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfY2FsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOwotc3RhdGljIGludCByeHJwY19wcm9jX2NhbGxzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByeHJwY19wcm9jX2NhbGxzX29wcyA9IHsKLQkuc3RhcnQJPSByeHJwY19wcm9jX2NhbGxzX3N0YXJ0LAotCS5uZXh0CT0gcnhycGNfcHJvY19jYWxsc19uZXh0LAotCS5zdG9wCT0gcnhycGNfcHJvY19jYWxsc19zdG9wLAotCS5zaG93CT0gcnhycGNfcHJvY19jYWxsc19zaG93LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfcHJvY19jYWxsc19mb3BzID0gewotCS5vcGVuCQk9IHJ4cnBjX3Byb2NfY2FsbHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzN1tdID0gewotCSJjb21wbGV0IiwKLQkiZXJyb3IgICIsCi0JInJjdl9vcCAiLAotCSJyY3ZfYXJnIiwKLQkiZ290X2FyZyIsCi0JInNuZF9ycGwiLAotCSJmaW5fYWNrIiwKLQkic25kX2FyZyIsCi0JInJjdl9ycGwiLAotCSJnb3RfcnBsIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzN1tdID0gewotCSJub19lcnIgIiwKLQkibG9jX2FidCIsCi0JInJtdF9hYnQiLAotCSJsb2NfZXJyIiwKLQkicm10X2VyciIKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBpbml0aWFsaXNlIHRoZSAvcHJvYy9uZXQvcnhycGMvIGRpcmVjdG9yeQotICovCi1pbnQgcnhycGNfcHJvY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwotCi0JcHJvY19yeHJwYyA9IHByb2NfbWtkaXIoInJ4cnBjIiwgcHJvY19uZXQpOwotCWlmICghcHJvY19yeHJwYykKLQkJZ290byBlcnJvcjsKLQlwcm9jX3J4cnBjLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjYWxscyIsIDAsIHByb2NfcnhycGMpOwotCWlmICghcCkKLQkJZ290byBlcnJvcl9wcm9jOwotCXAtPnByb2NfZm9wcyA9ICZyeHJwY19wcm9jX2NhbGxzX2ZvcHM7Ci0JcC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY29ubmVjdGlvbnMiLCAwLCBwcm9jX3J4cnBjKTsKLQlpZiAoIXApCi0JCWdvdG8gZXJyb3JfY2FsbHM7Ci0JcC0+cHJvY19mb3BzID0gJnJ4cnBjX3Byb2NfY29ubnNfZm9wczsKLQlwLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwZWVycyIsIDAsIHByb2NfcnhycGMpOwotCWlmICghcCkKLQkJZ290byBlcnJvcl9jYWxsczsKLQlwLT5wcm9jX2ZvcHMgPSAmcnhycGNfcHJvY19wZWVyc19mb3BzOwotCXAtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlwID0gY3JlYXRlX3Byb2NfZW50cnkoInRyYW5zcG9ydHMiLCAwLCBwcm9jX3J4cnBjKTsKLQlpZiAoIXApCi0JCWdvdG8gZXJyb3JfY29ubnM7Ci0JcC0+cHJvY19mb3BzID0gJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19mb3BzOwotCXAtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlyZXR1cm4gMDsKLQotIGVycm9yX2Nvbm5zOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJjb25uZWN0aW9ucyIsIHByb2NfcnhycGMpOwotIGVycm9yX2NhbGxzOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJjYWxscyIsIHByb2NfcnhycGMpOwotIGVycm9yX3Byb2M6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoInJ4cnBjIiwgcHJvY19uZXQpOwotIGVycm9yOgotCXJldHVybiAtRU5PTUVNOwotfSAvKiBlbmQgcnhycGNfcHJvY19pbml0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIHRoZSAvcHJvYy9uZXQvcnhycGMvIGRpcmVjdG9yeQotICovCi12b2lkIHJ4cnBjX3Byb2NfY2xlYW51cCh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFuc3BvcnRzIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoInBlZXJzIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNvbm5lY3Rpb25zIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNhbGxzIiwgcHJvY19yeHJwYyk7Ci0KLQlyZW1vdmVfcHJvY19lbnRyeSgicnhycGMiLCBwcm9jX25ldCk7Ci0KLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2xlYW51cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBvcGVuICIvcHJvYy9uZXQvcnhycGMvdHJhbnNwb3J0cyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCB0cmFuc3BvcnRzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNlcV9maWxlICptOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcnhycGNfcHJvY190cmFuc3BvcnRzX29wcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpLT5kYXRhOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX3RyYW5zcG9ydHNfb3BlbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0cyBsaXN0IGFuZCByZXR1cm4gdGhlIGZpcnN0IGl0ZW0KLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KLQkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JZG93bl9yZWFkKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19wcm9jX3RyYW5zcG9ydHMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfcHJvY190cmFuc3BvcnRzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3N0YXJ0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG1vdmUgdG8gbmV4dCBjYWxsIGluIHRyYW5zcG9ydHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY190cmFuc3BvcnRzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX3Byb2NfdHJhbnNwb3J0cy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX3Byb2NfdHJhbnNwb3J0cyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19uZXh0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0cyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQl1cF9yZWFkKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiBjYWxsIGxpbmVzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0KLQkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LCBwcm9jX2xpbmspOwotCi0JLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wdXRzKG0sICJMT0NBTCBVU0VcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBkaXNwbGF5IG9uZSB0cmFuc3BvcnQgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwgIiU1aHUgJTNkXG4iLAotCQkgICB0cmFucy0+cG9ydCwKLQkJICAgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3coKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogb3BlbiAiL3Byb2MvbmV0L3J4cnBjL3BlZXJzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IHBlZXJzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19wZWVyc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzZXFfZmlsZSAqbTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX3Byb2NfcGVlcnNfb3BzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JbS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7Ci0KLQlyZXR1cm4gMDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfcGVlcnNfb3BlbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgcGVlcnMgbGlzdCBhbmQgcmV0dXJuIHRoZQotICogZmlyc3QgaXRlbQotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19wZWVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KLQkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JZG93bl9yZWFkKCZyeHJwY19wZWVyc19zZW0pOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJnJ4cnBjX3BlZXJzKQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX3BlZXJzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zdGFydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBtb3ZlIHRvIG5leHQgY29ubiBpbiBwZWVycyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX3BlZXJzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX3BlZXJzLm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfcGVlcnMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCByeHJwY19wcm9jX3BlZXJzX25leHQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBwZWVycyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfcGVlcnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JdXBfcmVhZCgmcnhycGNfcGVlcnNfc2VtKTsKLQotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2YgY29ubiBsaW5lcwotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCi17Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19wZWVyLCBwcm9jX2xpbmspOwotCWxvbmcgdGltZW91dDsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLCAiTE9DQUwgUkVNT1RFICAgVVNBR0UgQ09OTlMgIFRJTUVPVVQiCi0JCQkgIiAgIE1UVSBSVFQodVMpXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZGlzcGxheSBvbmUgcGVlciBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCi0JdGltZW91dCA9IDA7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT50aW1lb3V0LmxpbmspKQotCQl0aW1lb3V0ID0gKGxvbmcpIHBlZXItPnRpbWVvdXQudGltb19qaWYgLQotCQkJKGxvbmcpIGppZmZpZXM7Ci0KLQlzZXFfcHJpbnRmKG0sICIlNWh1ICUwOHggJTVkICU1ZCAlOGxkICU1WnUgJTdsdVxuIiwKLQkJICAgcGVlci0+dHJhbnMtPnBvcnQsCi0JCSAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSwKLQkJICAgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSwKLQkJICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCQkgICB0aW1lb3V0LAotCQkgICBwZWVyLT5pZl9tdHUsCi0JCSAgIChsb25nKSBwZWVyLT5ydHQKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zaG93KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG9wZW4gIi9wcm9jL25ldC9yeHJwYy9jb25uZWN0aW9ucyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudAotICogY29ubmVjdGlvbnMKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jX2Nvbm5zX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNlcV9maWxlICptOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcnhycGNfcHJvY19jb25uc19vcHMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19vcGVuKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHNldCB1cCB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBjb25ucyBsaXN0IGFuZCByZXR1cm4gdGhlCi0gKiBmaXJzdCBpdGVtCi0gKi8KLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2Nvbm5zX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQotCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KLQlkb3duX3JlYWQoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfY29ubnMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfY29ubnMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCByeHJwY19wcm9jX2Nvbm5zX3N0YXJ0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG1vdmUgdG8gbmV4dCBjb25uIGluIGNvbm5zIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY29ubnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcnhycGNfY29ubnMubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZyeHJwY19jb25ucyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfY29ubnNfbmV4dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNvbm5zIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcHJvY19jb25uc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQl1cF9yZWFkKCZyeHJwY19jb25uc19zZW0pOwotCi19IC8qIGVuZCByeHJwY19wcm9jX2Nvbm5zX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiBjb25uIGxpbmVzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlsb25nIHRpbWVvdXQ7Ci0KLQljb25uID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgcHJvY19saW5rKTsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLAotCQkJICJMT0NBTCBSRU1PVEUgICBSUE9SVCBTUlZDIENPTk4gICAgIEVORCBTRVJJQUxOTyAiCi0JCQkgIkNBTExOTyAgICAgTVRVICBUSU1FT1VUIgotCQkJICJcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBkaXNwbGF5IG9uZSBjb25uIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KLQl0aW1lb3V0ID0gMDsKLQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPnRpbWVvdXQubGluaykpCi0JCXRpbWVvdXQgPSAobG9uZykgY29ubi0+dGltZW91dC50aW1vX2ppZiAtCi0JCQkobG9uZykgamlmZmllczsKLQotCXNlcV9wcmludGYobSwKLQkJICAgIiU1aHUgJTA4eCAlNWh1ICUwNGh4ICUwOHggJS0zLjNzICUwOHggJTA4eCAlNVp1ICU4bGRcbiIsCi0JCSAgIGNvbm4tPnRyYW5zLT5wb3J0LAotCQkgICBudG9obChjb25uLT5hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCSAgIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpLAotCQkgICBudG9ocyhjb25uLT5zZXJ2aWNlX2lkKSwKLQkJICAgbnRvaGwoY29ubi0+Y29ubl9pZCksCi0JCSAgIGNvbm4tPm91dF9jbGllbnRmbGFnID8gIkNMVCIgOiAiU1JWIiwKLQkJICAgY29ubi0+c2VyaWFsX2NvdW50ZXIsCi0JCSAgIGNvbm4tPmNhbGxfY291bnRlciwKLQkJICAgY29ubi0+bXR1X3NpemUsCi0JCSAgIHRpbWVvdXQKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19zaG93KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG9wZW4gIi9wcm9jL25ldC9yeHJwYy9jYWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjYWxscwotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfY2FsbHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm07Ci0JaW50IHJldDsKLQotCXJldCA9IHNlcV9vcGVuKGZpbGUsICZyeHJwY19wcm9jX2NhbGxzX29wcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpLT5kYXRhOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX29wZW4oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNhbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKLSAqIGZpcnN0IGl0ZW0KLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY2FsbHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCi0JLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwotCWRvd25fcmVhZCgmcnhycGNfY2FsbHNfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19jYWxscykKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZyeHJwY19jYWxscyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2FsbHNfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbW92ZSB0byBuZXh0IGNhbGwgaW4gY2FsbHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jYWxsc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQkoKnBvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyByeHJwY19jYWxscy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX2NhbGxzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY19jYWxsc19uZXh0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2FsbHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wcm9jX2NhbGxzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCXVwX3JlYWQoJnJ4cnBjX2NhbGxzX3NlbSk7Ci0KLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2FsbHNfc3RvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNhbGwgbGluZXMKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jX2NhbGxzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgY2FsbF9saW5rKTsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLAotCQkJICJMT0NBTCBSRU1PVCBTUlZDIENPTk4gICAgIENBTEwgICAgIERJUiBVU0UgIgotCQkJICIgTCBTVEFURSAgIE9QQ09ERSBBQk9SVCAgICBFUlJOT1xuIgotCQkJICk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGRpc3BsYXkgb25lIGNhbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwKLQkJICAgIiU1aHUgJTVodSAlMDRoeCAlMDh4ICUwOHggJXMgJTN1JWMiCi0JCSAgICIgJWMgJS03LjdzICU2ZCAlMDh4ICU1ZFxuIiwKLQkJICAgY2FsbC0+Y29ubi0+dHJhbnMtPnBvcnQsCi0JCSAgIG50b2hzKGNhbGwtPmNvbm4tPmFkZHIuc2luX3BvcnQpLAotCQkgICBudG9ocyhjYWxsLT5jb25uLT5zZXJ2aWNlX2lkKSwKLQkJICAgbnRvaGwoY2FsbC0+Y29ubi0+Y29ubl9pZCksCi0JCSAgIG50b2hsKGNhbGwtPmNhbGxfaWQpLAotCQkgICBjYWxsLT5jb25uLT5zZXJ2aWNlID8gIlNWQyIgOiAiQ0xUIiwKLQkJICAgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKLQkJICAgd2FpdHF1ZXVlX2FjdGl2ZSgmY2FsbC0+d2FpdHEpID8gJ3cnIDogJyAnLAotCQkgICBjYWxsLT5hcHBfbGFzdF9yY3YgPyAnWScgOiAnLScsCi0JCSAgIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSE9UlhSUENfQ1NUQVRFX0VSUk9SID8KLQkJICAgIHJ4cnBjX2NhbGxfc3RhdGVzN1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0gOgotCQkgICAgcnhycGNfY2FsbF9lcnJvcl9zdGF0ZXM3W2NhbGwtPmFwcF9lcnJfc3RhdGVdKSwKLQkJICAgY2FsbC0+YXBwX29wY29kZSwKLQkJICAgY2FsbC0+YXBwX2Fib3J0X2NvZGUsCi0JCSAgIGNhbGwtPmFwcF9lcnJubwotCQkgICApOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX3Nob3coKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3J4a2FkLmMgYi9uZXQvcnhycGMvcnhrYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWFmNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL3J4a2FkLmMKQEAgLTAsMCArMSwxMTUzIEBACisvKiBLZXJiZXJvcy1iYXNlZCBSeFJQQyBzZWN1cml0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworI2RlZmluZSBSWEtBRF9WRVJTSU9OCQkJMgorI2RlZmluZSBNQVhLUkI1VElDS0VUTEVOCQkxMDI0CisjZGVmaW5lIFJYS0FEX1RLVF9UWVBFX0tFUkJFUk9TX1Y1CTI1NgorI2RlZmluZSBBTkFNRV9TWgkJCTQwCS8qIHNpemUgb2YgYXV0aGVudGljYXRpb24gbmFtZSAqLworI2RlZmluZSBJTlNUX1NaCQkJCTQwCS8qIHNpemUgb2YgcHJpbmNpcGFsJ3MgaW5zdGFuY2UgKi8KKyNkZWZpbmUgUkVBTE1fU1oJCQk0MAkvKiBzaXplIG9mIHByaW5jaXBhbCdzIGF1dGggZG9tYWluICovCisjZGVmaW5lIFNOQU1FX1NaCQkJNDAJLyogc2l6ZSBvZiBzZXJ2aWNlIG5hbWUgKi8KKwordW5zaWduZWQgcnhycGNfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHJ4cnBjX2RlYnVnLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4cnBjX2RlYnVnLCAicnhrYWQgZGVidWdnaW5nIG1hc2siKTsKKworc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIgeworCV9fYmUzMglkYXRhX3NpemU7CS8qIHRydWUgZGF0YSBzaXplIChleGNsdWRpbmcgcGFkZGluZykgKi8KK307CisKK3N0cnVjdCByeGthZF9sZXZlbDJfaGRyIHsKKwlfX2JlMzIJZGF0YV9zaXplOwkvKiB0cnVlIGRhdGEgc2l6ZSAoZXhjbHVkaW5nIHBhZGRpbmcpICovCisJX19iZTMyCWNoZWNrc3VtOwkvKiBkZWNyeXB0ZWQgZGF0YSBjaGVja3N1bSAqLworfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSeFJQQyBuZXR3b3JrIHByb3RvY29sIHR5cGUtMiBzZWN1cml0eSAoS2VyYmVyb3MpIik7CitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0LCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiB0aGlzIGhvbGRzIGEgcGlubmVkIGNpcGhlciBzbyB0aGF0IGtldmVudGQgZG9lc24ndCBnZXQgY2FsbGVkIGJ5IHRoZSBjaXBoZXIKKyAqIGFsbG9jIHJvdXRpbmUsIGJ1dCBzaW5jZSB3ZSBoYXZlIGl0IHRvIGhhbmQsIHdlIHVzZSBpdCB0byBkZWNyeXB0IFJFU1BPTlNFCisgKiBwYWNrZXRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhrYWRfY2k7CitzdGF0aWMgREVGSU5FX01VVEVYKHJ4a2FkX2NpX211dGV4KTsKKworLyoKKyAqIGluaXRpYWxpc2UgY29ubmVjdGlvbiBzZWN1cml0eQorICovCitzdGF0aWMgaW50IHJ4a2FkX2luaXRfY29ubmVjdGlvbl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNpOworCWludCByZXQ7CisKKwlfZW50ZXIoInslZH0seyV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJcGF5bG9hZCA9IGNvbm4tPmtleS0+cGF5bG9hZC5kYXRhOworCWNvbm4tPnNlY3VyaXR5X2l4ID0gcGF5bG9hZC0+ay5zZWN1cml0eV9pbmRleDsKKworCWNpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhmY3J5cHQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihjaSkpIHsKKwkJX2RlYnVnKCJubyBjaXBoZXIiKTsKKwkJcmV0ID0gUFRSX0VSUihjaSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGNpLCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LAorCQkJCSAgICBzaXplb2YocGF5bG9hZC0+ay5zZXNzaW9uX2tleSkpIDwgMCkKKwkJQlVHKCk7CisKKwlzd2l0Y2ggKGNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQljb25uLT5zaXplX2FsaWduID0gODsKKwkJY29ubi0+c2VjdXJpdHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7CisJCWNvbm4tPmhlYWRlcl9zaXplICs9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJY29ubi0+c2l6ZV9hbGlnbiA9IDg7CisJCWNvbm4tPnNlY3VyaXR5X3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOworCQljb25uLT5oZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUtFWVJFSkVDVEVEOworCQlnb3RvIGVycm9yOworCX0KKworCWNvbm4tPmNpcGhlciA9IGNpOworCXJldCA9IDA7CitlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcHJpbWUgdGhlIGVuY3J5cHRpb24gc3RhdGUgd2l0aCB0aGUgaW52YXJpYW50IHBhcnRzIG9mIGEgY29ubmVjdGlvbidzCisgKiBkZXNjcmlwdGlvbgorICovCitzdGF0aWMgdm9pZCByeGthZF9wcmltZV9wYWNrZXRfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX2tleV9wYXlsb2FkICpwYXlsb2FkOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKKwlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CisJc3RydWN0IHsKKwkJX19iZTMyIHhbNF07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsgLyogbXVzdCBhbGwgYmUgaW4gc2FtZSBwYWdlICovCisKKwlfZW50ZXIoIiIpOworCisJaWYgKCFjb25uLT5rZXkpCisJCXJldHVybjsKKworCXBheWxvYWQgPSBjb25uLT5rZXktPnBheWxvYWQuZGF0YTsKKwltZW1jcHkoJml2LCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKworCWRlc2MudGZtID0gY29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwl0bXBidWYueFswXSA9IGNvbm4tPmVwb2NoOworCXRtcGJ1Zi54WzFdID0gY29ubi0+Y2lkOworCXRtcGJ1Zi54WzJdID0gMDsKKwl0bXBidWYueFszXSA9IGh0b25sKGNvbm4tPnNlY3VyaXR5X2l4KTsKKworCW1lbXNldChzZywgMCwgc2l6ZW9mKHNnKSk7CisJc2dfc2V0X2J1Zigmc2dbMF0sICZ0bXBidWYsIHNpemVvZih0bXBidWYpKTsKKwlzZ19zZXRfYnVmKCZzZ1sxXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCWNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmZGVzYywgJnNnWzBdLCAmc2dbMV0sIHNpemVvZih0bXBidWYpKTsKKworCW1lbWNweSgmY29ubi0+Y3N1bV9pdiwgJnRtcGJ1Zi54WzJdLCBzaXplb2YoY29ubi0+Y3N1bV9pdikpOworCUFTU0VSVENNUChjb25uLT5jc3VtX2l2Lm5bMF0sID09LCB0bXBidWYueFsyXSk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcGFydGlhbGx5IGVuY3J5cHQgYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCisgKi8KK3N0YXRpYyBpbnQgcnhrYWRfc2VjdXJlX3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICB1MzIgZGF0YV9zaXplLAorCQkJCSAgICB2b2lkICpzZWNoZHIpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCXN0cnVjdCB7CisJCXN0cnVjdCByeGthZF9sZXZlbDFfaGRyIGhkcjsKKwkJX19iZTMyCWZpcnN0OwkvKiBmaXJzdCBmb3VyIGJ5dGVzIG9mIGRhdGEgYW5kIHBhZGRpbmcgKi8KKwl9IHRtcGJ1ZiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7IC8qIG11c3QgYWxsIGJlIGluIHNhbWUgcGFnZSAqLworCXUxNiBjaGVjazsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoIiIpOworCisJY2hlY2sgPSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJZGF0YV9zaXplIHw9ICh1MzIpIGNoZWNrIDw8IDE2OworCisJdG1wYnVmLmhkci5kYXRhX3NpemUgPSBodG9ubChkYXRhX3NpemUpOworCW1lbWNweSgmdG1wYnVmLmZpcnN0LCBzZWNoZHIgKyA0LCBzaXplb2YodG1wYnVmLmZpcnN0KSk7CisKKwkvKiBzdGFydCB0aGUgZW5jcnlwdGlvbiBhZnJlc2ggKi8KKwltZW1zZXQoJml2LCAwLCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJbWVtc2V0KHNnLCAwLCBzaXplb2Yoc2cpKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCXNnX3NldF9idWYoJnNnWzFdLCAmdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7CisJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCAmc2dbMF0sICZzZ1sxXSwgc2l6ZW9mKHRtcGJ1ZikpOworCisJbWVtY3B5KHNlY2hkciwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3aG9sbHkgZW5jcnlwdCBhIHBhY2tldCAobGV2ZWwgMiBzZWN1cml0eSkKKyAqLworc3RhdGljIGludCByeGthZF9zZWN1cmVfcGFja2V0X2VuY3J5cHQoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXUzMiBkYXRhX3NpemUsCisJCQkJCXZvaWQgKnNlY2hkcikKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgcnhraGRyCisJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGwgb24gb25lIHBhZ2UgKi8KKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMTZdOworCXN0cnVjdCBza19idWZmICp0cmFpbGVyOworCXVuc2lnbmVkIGxlbjsKKwl1MTYgY2hlY2s7CisJaW50IG5zZzsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoIiIpOworCisJY2hlY2sgPSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisKKwlyeGtoZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplIHwgKHUzMikgY2hlY2sgPDwgMTYpOworCXJ4a2hkci5jaGVja3N1bSA9IDA7CisKKwkvKiBlbmNyeXB0IGZyb20gdGhlIHNlc3Npb24ga2V5ICovCisJcGF5bG9hZCA9IGNhbGwtPmNvbm4tPmtleS0+cGF5bG9hZC5kYXRhOworCW1lbWNweSgmaXYsIHBheWxvYWQtPmsuc2Vzc2lvbl9rZXksIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwltZW1zZXQoc2csIDAsIHNpemVvZihzZ1swXSkgKiAyKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgc2VjaGRyLCBzaXplb2YocnhraGRyKSk7CisJc2dfc2V0X2J1Zigmc2dbMV0sICZyeGtoZHIsIHNpemVvZihyeGtoZHIpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsICZzZ1swXSwgJnNnWzFdLCBzaXplb2YocnhraGRyKSk7CisKKwkvKiB3ZSB3YW50IHRvIGVuY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZSAqLworCW5zZyA9IHNrYl9jb3dfZGF0YShza2IsIDAsICZ0cmFpbGVyKTsKKwlpZiAobnNnIDwgMCB8fCBuc2cgPiAxNikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW4gPSBkYXRhX3NpemUgKyBjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMTsKKwlsZW4gJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMSk7CisKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgMCwgbGVuKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIHNnLCBzZywgbGVuKTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogY2hlY2tzdW0gYW4gUnhSUEMgcGFja2V0IGhlYWRlcgorICovCitzdGF0aWMgaW50IHJ4a2FkX3NlY3VyZV9wYWNrZXQoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzaXplX3QgZGF0YV9zaXplLAorCQkJCXZvaWQgKnNlY2hkcikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHsKKwkJX19iZTMyIHhbMl07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGFsbCBiZSBpbiBzYW1lIHBhZ2UgKi8KKwlfX2JlMzIgeDsKKwlpbnQgcmV0OworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCV9lbnRlcigieyVkeyV4fX0seyMldX0sJXp1LCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNhbGwtPmNvbm4tPmtleSksIG50b2hsKHNwLT5oZHIuc2VxKSwKKwkgICAgICAgZGF0YV9zaXplKTsKKworCWlmICghY2FsbC0+Y29ubi0+Y2lwaGVyKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGtleV92YWxpZGF0ZShjYWxsLT5jb25uLT5rZXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogY29udGludWUgZW5jcnlwdGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmICovCisJbWVtY3B5KCZpdiwgY2FsbC0+Y29ubi0+Y3N1bV9pdi54LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJLyogY2FsY3VsYXRlIHRoZSBzZWN1cml0eSBjaGVja3N1bSAqLworCXggPSBodG9ubChjYWxsLT5jaGFubmVsIDw8ICgzMiAtIFJYUlBDX0NJRFNISUZUKSk7CisJeCB8PSBzcC0+aGRyLnNlcSAmIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzZmZmZmZmZik7CisJdG1wYnVmLnhbMF0gPSBzcC0+aGRyLmNhbGxOdW1iZXI7CisJdG1wYnVmLnhbMV0gPSB4OworCisJbWVtc2V0KCZzZywgMCwgc2l6ZW9mKHNnKSk7CisJc2dfc2V0X2J1Zigmc2dbMF0sICZ0bXBidWYsIHNpemVvZih0bXBidWYpKTsKKwlzZ19zZXRfYnVmKCZzZ1sxXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCWNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmZGVzYywgJnNnWzBdLCAmc2dbMV0sIHNpemVvZih0bXBidWYpKTsKKworCXggPSBudG9obCh0bXBidWYueFsxXSk7CisJeCA9ICh4ID4+IDE2KSAmIDB4ZmZmZjsKKwlpZiAoeCA9PSAwKQorCQl4ID0gMTsgLyogemVybyBjaGVja3N1bXMgYXJlIG5vdCBwZXJtaXR0ZWQgKi8KKwlzcC0+aGRyLmNrc3VtID0gaHRvbnMoeCk7CisKKwlzd2l0Y2ggKGNhbGwtPmNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyZXQgPSByeGthZF9zZWN1cmVfcGFja2V0X2F1dGgoY2FsbCwgc2tiLCBkYXRhX3NpemUsIHNlY2hkcik7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJcmV0ID0gcnhrYWRfc2VjdXJlX3BhY2tldF9lbmNyeXB0KGNhbGwsIHNrYiwgZGF0YV9zaXplLAorCQkJCQkJICBzZWNoZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRVBFUk07CisJCWJyZWFrOworCX0KKworCV9sZWF2ZSgiID0gJWQgW3NldCAlaHhdIiwgcmV0LCB4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGVjcnlwdCBwYXJ0aWFsIGVuY3J5cHRpb24gb24gYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCisgKi8KK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICB1MzIgKl9hYm9ydF9jb2RlKQoreworCXN0cnVjdCByeGthZF9sZXZlbDFfaGRyIHNlY2hkcjsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CisJdTMyIGRhdGFfc2l6ZSwgYnVmOworCXUxNiBjaGVjazsKKworCV9lbnRlcigiIik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogd2Ugd2FudCB0byBkZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UgKi8KKwlpZiAoc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpIDwgMCkKKwkJZ290byBub21lbTsKKworCXNrYl90b19zZ3ZlYyhza2IsIHNnLCAwLCA4KTsKKworCS8qIHN0YXJ0IHRoZSBkZWNyeXB0aW9uIGFmcmVzaCAqLworCW1lbXNldCgmaXYsIDAsIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIHNnLCBzZywgOCk7CisKKwkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlnb3RvIGRhdGFsZW5fZXJyb3I7CisJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKKwkJQlVHKCk7CisKKwlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKKwlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CisKKwljaGVjayA9IGJ1ZiA+PiAxNjsKKwljaGVjayBePSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJY2hlY2sgJj0gMHhmZmZmOworCWlmIChjaGVjayAhPSAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCisJLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLworCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKKwkJZ290byBkYXRhbGVuX2Vycm9yOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQorCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKworCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOworCXJldHVybiAwOworCitkYXRhbGVuX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKK3Byb3RvY29sX2Vycm9yOgorCV9sZWF2ZSgiID0gLUVQUk9UTyIpOworCXJldHVybiAtRVBST1RPOworCitub21lbToKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIHdob2xseSBkZWNyeXB0IGEgcGFja2V0IChsZXZlbCAyIHNlY3VyaXR5KQorICovCitzdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OworCXN0cnVjdCBzY2F0dGVybGlzdCBfc2dbNF0sICpzZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHJhaWxlcjsKKwl1MzIgZGF0YV9zaXplLCBidWY7CisJdTE2IGNoZWNrOworCWludCBuc2c7CisKKwlfZW50ZXIoIix7JWR9Iiwgc2tiLT5sZW4pOworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCS8qIHdlIHdhbnQgdG8gZGVjcnlwdCB0aGUgc2tidWZmIGluLXBsYWNlICovCisJbnNnID0gc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpOworCWlmIChuc2cgPCAwKQorCQlnb3RvIG5vbWVtOworCisJc2cgPSBfc2c7CisJaWYgKHVubGlrZWx5KG5zZyA+IDQpKSB7CisJCXNnID0ga21hbGxvYyhzaXplb2YoKnNnKSAqIG5zZywgR0ZQX05PSU8pOworCQlpZiAoIXNnKQorCQkJZ290byBub21lbTsKKwl9CisKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgMCwgc2tiLT5sZW4pOworCisJLyogZGVjcnlwdCBmcm9tIHRoZSBzZXNzaW9uIGtleSAqLworCXBheWxvYWQgPSBjYWxsLT5jb25uLT5rZXktPnBheWxvYWQuZGF0YTsKKwltZW1jcHkoJml2LCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZkZXNjLCBzZywgc2csIHNrYi0+bGVuKTsKKwlpZiAoc2cgIT0gX3NnKQorCQlrZnJlZShzZyk7CisKKwkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlnb3RvIGRhdGFsZW5fZXJyb3I7CisJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKKwkJQlVHKCk7CisKKwlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKKwlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CisKKwljaGVjayA9IGJ1ZiA+PiAxNjsKKwljaGVjayBePSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJY2hlY2sgJj0gMHhmZmZmOworCWlmIChjaGVjayAhPSAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCisJLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLworCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKKwkJZ290byBkYXRhbGVuX2Vycm9yOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQorCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKworCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOworCXJldHVybiAwOworCitkYXRhbGVuX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKK3Byb3RvY29sX2Vycm9yOgorCV9sZWF2ZSgiID0gLUVQUk9UTyIpOworCXJldHVybiAtRVBST1RPOworCitub21lbToKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIHZlcmlmeSB0aGUgc2VjdXJpdHkgb24gYSByZWNlaXZlZCBwYWNrZXQKKyAqLworc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHsKKwkJX19iZTMyIHhbMl07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGFsbCBiZSBpbiBzYW1lIHBhZ2UgKi8KKwlfX2JlMzIgeDsKKwlfX2JlMTYgY2tzdW07CisJaW50IHJldDsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoInslZHsleH19LHsjJXV9IiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+a2V5KSwKKwkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCWlmICghY2FsbC0+Y29ubi0+Y2lwaGVyKQorCQlyZXR1cm4gMDsKKworCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggIT0gMikgeworCQkqX2Fib3J0X2NvZGUgPSBSWEtBRElOQ09OU0lTVEVOQ1k7CisJCV9sZWF2ZSgiID0gLUVQUk9UTyBbbm90IHJ4a2FkXSIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwkvKiBjb250aW51ZSBlbmNyeXB0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYgKi8KKwltZW1jcHkoJml2LCBjYWxsLT5jb25uLT5jc3VtX2l2LngsIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwkvKiB2YWxpZGF0ZSB0aGUgc2VjdXJpdHkgY2hlY2tzdW0gKi8KKwl4ID0gaHRvbmwoY2FsbC0+Y2hhbm5lbCA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCkpOworCXggfD0gc3AtPmhkci5zZXEgJiBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4M2ZmZmZmZmYpOworCXRtcGJ1Zi54WzBdID0gY2FsbC0+Y2FsbF9pZDsKKwl0bXBidWYueFsxXSA9IHg7CisKKwltZW1zZXQoJnNnLCAwLCBzaXplb2Yoc2cpKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCXNnX3NldF9idWYoJnNnWzFdLCAmdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7CisJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCAmc2dbMF0sICZzZ1sxXSwgc2l6ZW9mKHRtcGJ1ZikpOworCisJeCA9IG50b2hsKHRtcGJ1Zi54WzFdKTsKKwl4ID0gKHggPj4gMTYpICYgMHhmZmZmOworCWlmICh4ID09IDApCisJCXggPSAxOyAvKiB6ZXJvIGNoZWNrc3VtcyBhcmUgbm90IHBlcm1pdHRlZCAqLworCisJY2tzdW0gPSBodG9ucyh4KTsKKwlpZiAoc3AtPmhkci5ja3N1bSAhPSBja3N1bSkgeworCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlfbGVhdmUoIiA9IC1FUFJPVE8gW2NzdW0gZmFpbGVkXSIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlzd2l0Y2ggKGNhbGwtPmNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyZXQgPSByeGthZF92ZXJpZnlfcGFja2V0X2F1dGgoY2FsbCwgc2tiLCBfYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJcmV0ID0gcnhrYWRfdmVyaWZ5X3BhY2tldF9lbmNyeXB0KGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PQU5POworCQlicmVhazsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaXNzdWUgYSBjaGFsbGVuZ2UKKyAqLworc3RhdGljIGludCByeGthZF9pc3N1ZV9jaGFsbGVuZ2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSBjaGFsbGVuZ2U7CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXNpemVfdCBsZW47CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJcmV0ID0ga2V5X3ZhbGlkYXRlKGNvbm4tPmtleSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZjb25uLT5zZWN1cml0eV9ub25jZSwgc2l6ZW9mKGNvbm4tPnNlY3VyaXR5X25vbmNlKSk7CisKKwljaGFsbGVuZ2UudmVyc2lvbgk9IGh0b25sKDIpOworCWNoYWxsZW5nZS5ub25jZQkJPSBodG9ubChjb25uLT5zZWN1cml0eV9ub25jZSk7CisJY2hhbGxlbmdlLm1pbl9sZXZlbAk9IGh0b25sKDApOworCWNoYWxsZW5nZS5fX3BhZGRpbmcJPSAwOworCisJbXNnLm1zZ19uYW1lCT0gJmNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4JPSBzaXplb2YoY29ubi0+dHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncwk9IDA7CisKKwloZHIuZXBvY2gJPSBjb25uLT5lcG9jaDsKKwloZHIuY2lkCQk9IGNvbm4tPmNpZDsKKwloZHIuY2FsbE51bWJlcgk9IDA7CisJaGRyLnNlcQkJPSAwOworCWhkci50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOworCWhkci5mbGFncwk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCWhkci51c2VyU3RhdHVzCT0gMDsKKwloZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWhkci5fcnN2ZAk9IDA7CisJaGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwlpb3ZbMF0uaW92X2Jhc2UJPSAmaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKGhkcik7CisJaW92WzFdLmlvdl9iYXNlCT0gJmNoYWxsZW5nZTsKKwlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihjaGFsbGVuZ2UpOworCisJbGVuID0gaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbjsKKworCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCBDSEFMTEVOR0UgJSUldSIsIG50b2hsKGhkci5zZXJpYWwpKTsKKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJX2RlYnVnKCJzZW5kbXNnIGZhaWxlZDogJWQiLCByZXQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNlbmQgYSBLZXJiZXJvcyBzZWN1cml0eSByZXNwb25zZQorICovCitzdGF0aWMgaW50IHJ4a2FkX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyLAorCQkJICAgICAgIHN0cnVjdCByeGthZF9yZXNwb25zZSAqcmVzcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcnhrYWRfa2V5ICpzMikKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbM107CisJc2l6ZV90IGxlbjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCW1zZy5tc2dfbmFtZQk9ICZjb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLT5lcG9jaAk9IGNvbm4tPmVwb2NoOworCWhkci0+c2VxCT0gMDsKKwloZHItPnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9SRVNQT05TRTsKKwloZHItPmZsYWdzCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJaGRyLT51c2VyU3RhdHVzCT0gMDsKKwloZHItPl9yc3ZkCT0gMDsKKworCWlvdlswXS5pb3ZfYmFzZQk9IGhkcjsKKwlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZigqaGRyKTsKKwlpb3ZbMV0uaW92X2Jhc2UJPSByZXNwOworCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKCpyZXNwKTsKKwlpb3ZbMl0uaW92X2Jhc2UJPSAodm9pZCAqKSBzMi0+dGlja2V0OworCWlvdlsyXS5pb3ZfbGVuCT0gczItPnRpY2tldF9sZW47CisKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuICsgaW92WzJdLmlvdl9sZW47CisKKwloZHItPnNlcmlhbCA9IGh0b25sKGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpKTsKKwlfcHJvdG8oIlR4IFJFU1BPTlNFICUlJXUiLCBudG9obChoZHItPnNlcmlhbCkpOworCisJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+dHJhbnMtPmxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMywgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogY2FsY3VsYXRlIHRoZSByZXNwb25zZSBjaGVja3N1bQorICovCitzdGF0aWMgdm9pZCByeGthZF9jYWxjX3Jlc3BvbnNlX2NoZWNrc3VtKHN0cnVjdCByeGthZF9yZXNwb25zZSAqcmVzcG9uc2UpCit7CisJdTMyIGNzdW0gPSAxMDAwMDAzOworCWludCBsb29wOworCXU4ICpwID0gKHU4ICopIHJlc3BvbnNlOworCisJZm9yIChsb29wID0gc2l6ZW9mKCpyZXNwb25zZSk7IGxvb3AgPiAwOyBsb29wLS0pCisJCWNzdW0gPSBjc3VtICogMHgxMDIwNDA4MSArICpwKys7CisKKwlyZXNwb25zZS0+ZW5jcnlwdGVkLmNoZWNrc3VtID0gaHRvbmwoY3N1bSk7Cit9CisKKy8qCisgKiBsb2FkIGEgc2NhdHRlcmxpc3Qgd2l0aCBhIHBvdGVudGlhbGx5IHNwbGl0LXBhZ2UgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX3NnX3NldF9idWYyKHN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXSwKKwkJCSAgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKworCW1lbXNldChzZywgMCwgc2l6ZW9mKHNnKSk7CisKKwlzZ19zZXRfYnVmKCZzZ1swXSwgYnVmLCBidWZsZW4pOworCWlmIChzZ1swXS5vZmZzZXQgKyBidWZsZW4gPiBQQUdFX1NJWkUpIHsKKwkJLyogdGhlIGJ1ZmZlciB3YXMgc3BsaXQgb3ZlciB0d28gcGFnZXMgKi8KKwkJc2dbMF0ubGVuZ3RoID0gUEFHRV9TSVpFIC0gc2dbMF0ub2Zmc2V0OworCQlzZ19zZXRfYnVmKCZzZ1sxXSwgYnVmICsgc2dbMF0ubGVuZ3RoLCBidWZsZW4gLSBzZ1swXS5sZW5ndGgpOworCX0KKworCUFTU0VSVENNUChzZ1swXS5sZW5ndGggKyBzZ1sxXS5sZW5ndGgsID09LCBidWZsZW4pOworfQorCisvKgorICogZW5jcnlwdCB0aGUgcmVzcG9uc2UgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2VuY3J5cHRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHJ4a2FkX3Jlc3BvbnNlICpyZXNwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByeGthZF9rZXkgKnMyKQoreworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3NnWzJdLCBkc2dbMl07CisKKwkvKiBjb250aW51ZSBlbmNyeXB0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYgKi8KKwltZW1jcHkoJml2LCBzMi0+c2Vzc2lvbl9rZXksIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwlyeGthZF9zZ19zZXRfYnVmMihzc2csICZyZXNwLT5lbmNyeXB0ZWQsIHNpemVvZihyZXNwLT5lbmNyeXB0ZWQpKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCBzaXplb2YocmVzcC0+ZW5jcnlwdGVkKSk7Cit9CisKKy8qCisgKiByZXNwb25kIHRvIGEgY2hhbGxlbmdlIHBhY2tldAorICovCitzdGF0aWMgaW50IHJ4a2FkX3Jlc3BvbmRfdG9fY2hhbGxlbmdlKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSBjaGFsbGVuZ2U7CisJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3AKKwkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGJlIGFsaWduZWQgZm9yIGNyeXB0byAqLworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJdTMyIHZlcnNpb24sIG5vbmNlLCBtaW5fbGV2ZWwsIGFib3J0X2NvZGU7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJaWYgKCFjb25uLT5rZXkpIHsKKwkJX2xlYXZlKCIgPSAtRVBST1RPIFtubyBrZXldIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXJldCA9IGtleV92YWxpZGF0ZShjb25uLT5rZXkpOworCWlmIChyZXQgPCAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FERVhQSVJFRDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhYm9ydF9jb2RlID0gUlhLQURQQUNLRVRTSE9SVDsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJmNoYWxsZW5nZSwgc2l6ZW9mKGNoYWxsZW5nZSkpIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCXZlcnNpb24gPSBudG9obChjaGFsbGVuZ2UudmVyc2lvbik7CisJbm9uY2UgPSBudG9obChjaGFsbGVuZ2Uubm9uY2UpOworCW1pbl9sZXZlbCA9IG50b2hsKGNoYWxsZW5nZS5taW5fbGV2ZWwpOworCisJX3Byb3RvKCJSeCBDSEFMTEVOR0UgJSUldSB7IHY9JXUgbj0ldSBtbD0ldSB9IiwKKwkgICAgICAgbnRvaGwoc3AtPmhkci5zZXJpYWwpLCB2ZXJzaW9uLCBub25jZSwgbWluX2xldmVsKTsKKworCWFib3J0X2NvZGUgPSBSWEtBRElOQ09OU0lTVEVOQ1k7CisJaWYgKHZlcnNpb24gIT0gUlhLQURfVkVSU0lPTikKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCWFib3J0X2NvZGUgPSBSWEtBRExFVkVMRkFJTDsKKwlpZiAoY29ubi0+c2VjdXJpdHlfbGV2ZWwgPCBtaW5fbGV2ZWwpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwlwYXlsb2FkID0gY29ubi0+a2V5LT5wYXlsb2FkLmRhdGE7CisKKwkvKiBidWlsZCB0aGUgcmVzcG9uc2UgcGFja2V0ICovCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YocmVzcCkpOworCisJcmVzcC52ZXJzaW9uID0gUlhLQURfVkVSU0lPTjsKKwlyZXNwLmVuY3J5cHRlZC5lcG9jaCA9IGNvbm4tPmVwb2NoOworCXJlc3AuZW5jcnlwdGVkLmNpZCA9IGNvbm4tPmNpZDsKKwlyZXNwLmVuY3J5cHRlZC5zZWN1cml0eUluZGV4ID0gaHRvbmwoY29ubi0+c2VjdXJpdHlfaXgpOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMF0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMF0gPyBjb25uLT5jaGFubmVsc1swXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMV0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMV0gPyBjb25uLT5jaGFubmVsc1sxXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMl0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMl0gPyBjb25uLT5jaGFubmVsc1syXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbM10gPQorCQkoY29ubi0+Y2hhbm5lbHNbM10gPyBjb25uLT5jaGFubmVsc1szXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmluY19ub25jZSA9IGh0b25sKG5vbmNlICsgMSk7CisJcmVzcC5lbmNyeXB0ZWQubGV2ZWwgPSBodG9ubChjb25uLT5zZWN1cml0eV9sZXZlbCk7CisJcmVzcC5rdm5vID0gaHRvbmwocGF5bG9hZC0+ay5rdm5vKTsKKwlyZXNwLnRpY2tldF9sZW4gPSBodG9ubChwYXlsb2FkLT5rLnRpY2tldF9sZW4pOworCisJLyogY2FsY3VsYXRlIHRoZSByZXNwb25zZSBjaGVja3N1bSBhbmQgdGhlbiBkbyB0aGUgZW5jcnlwdGlvbiAqLworCXJ4a2FkX2NhbGNfcmVzcG9uc2VfY2hlY2tzdW0oJnJlc3ApOworCXJ4a2FkX2VuY3J5cHRfcmVzcG9uc2UoY29ubiwgJnJlc3AsICZwYXlsb2FkLT5rKTsKKwlyZXR1cm4gcnhrYWRfc2VuZF9yZXNwb25zZShjb25uLCAmc3AtPmhkciwgJnJlc3AsICZwYXlsb2FkLT5rKTsKKworcHJvdG9jb2xfZXJyb3I6CisJKl9hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwlfbGVhdmUoIiA9IC1FUFJPVE8gWyVkXSIsIGFib3J0X2NvZGUpOworCXJldHVybiAtRVBST1RPOworfQorCisvKgorICogZGVjcnlwdCB0aGUga2VyYmVyb3MgSVYgdGlja2V0IGluIHRoZSByZXNwb25zZQorICovCitzdGF0aWMgaW50IHJ4a2FkX2RlY3J5cHRfdGlja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCXZvaWQgKnRpY2tldCwgc2l6ZV90IHRpY2tldF9sZW4sCisJCQkJc3RydWN0IHJ4cnBjX2NyeXB0ICpfc2Vzc2lvbl9rZXksCisJCQkJdGltZV90ICpfZXhwaXJ5LAorCQkJCXUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHJ4cnBjX2NyeXB0IGl2LCBrZXk7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNzZ1sxXSwgZHNnWzFdOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJdW5zaWduZWQgbGlmZTsKKwl0aW1lX3QgaXNzdWUsIG5vdzsKKwlib29sIGxpdHRsZV9lbmRpYW47CisJaW50IHJldDsKKwl1OCAqcCwgKnEsICpuYW1lLCAqZW5kOworCisJX2VudGVyKCJ7JWR9LHsleH0iLCBjb25uLT5kZWJ1Z19pZCwga2V5X3NlcmlhbChjb25uLT5zZXJ2ZXJfa2V5KSk7CisKKwkqX2V4cGlyeSA9IDA7CisKKwlyZXQgPSBrZXlfdmFsaWRhdGUoY29ubi0+c2VydmVyX2tleSk7CisJaWYgKHJldCA8IDApIHsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCQkqX2Fib3J0X2NvZGUgPSBSWEtBREVYUElSRUQ7CisJCQlnb3RvIGVycm9yOworCQlkZWZhdWx0OgorCQkJKl9hYm9ydF9jb2RlID0gUlhLQUROT0FVVEg7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJQVNTRVJUKGNvbm4tPnNlcnZlcl9rZXktPnBheWxvYWQuZGF0YSAhPSBOVUxMKTsKKwlBU1NFUlRDTVAoKHVuc2lnbmVkIGxvbmcpIHRpY2tldCAmIDdVTCwgPT0sIDApOworCisJbWVtY3B5KCZpdiwgJmNvbm4tPnNlcnZlcl9rZXktPnR5cGVfZGF0YSwgc2l6ZW9mKGl2KSk7CisKKwlkZXNjLnRmbSA9IGNvbm4tPnNlcnZlcl9rZXktPnBheWxvYWQuZGF0YTsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJc2dfaW5pdF9vbmUoJnNzZ1swXSwgdGlja2V0LCB0aWNrZXRfbGVuKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCB0aWNrZXRfbGVuKTsKKworCXAgPSB0aWNrZXQ7CisJZW5kID0gcCArIHRpY2tldF9sZW47CisKKyNkZWZpbmUgWihzaXplKQkJCQkJCVwKKwkoewkJCQkJCVwKKwkJdTggKl9fc3RyID0gcDsJCQkJXAorCQlxID0gbWVtY2hyKHAsIDAsIGVuZCAtIHApOwkJXAorCQlpZiAoIXEgfHwgcSAtIHAgPiAoc2l6ZSkpCQlcCisJCQlnb3RvIGJhZF90aWNrZXQ7CQlcCisJCWZvciAoOyBwIDwgcTsgcCsrKQkJCVwKKwkJCWlmICghaXNwcmludCgqcCkpCQlcCisJCQkJZ290byBiYWRfdGlja2V0OwlcCisJCXArKzsJCQkJCVwKKwkJX19zdHI7CQkJCQlcCisJfSkKKworCS8qIGV4dHJhY3QgdGhlIHRpY2tldCBmbGFncyAqLworCV9kZWJ1ZygiS0lWIEZMQUdTOiAleCIsICpwKTsKKwlsaXR0bGVfZW5kaWFuID0gKnAgJiAxOworCXArKzsKKworCS8qIGV4dHJhY3QgdGhlIGF1dGhlbnRpY2F0aW9uIG5hbWUgKi8KKwluYW1lID0gWihBTkFNRV9TWik7CisJX2RlYnVnKCJLSVYgQU5BTUU6ICVzIiwgbmFtZSk7CisKKwkvKiBleHRyYWN0IHRoZSBwcmluY2lwYWwncyBpbnN0YW5jZSAqLworCW5hbWUgPSBaKElOU1RfU1opOworCV9kZWJ1ZygiS0lWIElOU1QgOiAlcyIsIG5hbWUpOworCisJLyogZXh0cmFjdCB0aGUgcHJpbmNpcGFsJ3MgYXV0aGVudGljYXRpb24gZG9tYWluICovCisJbmFtZSA9IFooUkVBTE1fU1opOworCV9kZWJ1ZygiS0lWIFJFQUxNOiAlcyIsIG5hbWUpOworCisJaWYgKGVuZCAtIHAgPCA0ICsgOCArIDQgKyAyKQorCQlnb3RvIGJhZF90aWNrZXQ7CisKKwkvKiBnZXQgdGhlIElQdjQgYWRkcmVzcyBvZiB0aGUgZW50aXR5IHRoYXQgcmVxdWVzdGVkIHRoZSB0aWNrZXQgKi8KKwltZW1jcHkoJmFkZHIsIHAsIHNpemVvZihhZGRyKSk7CisJcCArPSA0OworCV9kZWJ1ZygiS0lWIEFERFIgOiAiTklQUVVBRF9GTVQsIE5JUFFVQUQoYWRkcikpOworCisJLyogZ2V0IHRoZSBzZXNzaW9uIGtleSBmcm9tIHRoZSB0aWNrZXQgKi8KKwltZW1jcHkoJmtleSwgcCwgc2l6ZW9mKGtleSkpOworCXAgKz0gODsKKwlfZGVidWcoIktJViBLRVkgIDogJTA4eCAlMDh4IiwgbnRvaGwoa2V5Lm5bMF0pLCBudG9obChrZXkublsxXSkpOworCW1lbWNweShfc2Vzc2lvbl9rZXksICZrZXksIHNpemVvZihrZXkpKTsKKworCS8qIGdldCB0aGUgdGlja2V0J3MgbGlmZXRpbWUgKi8KKwlsaWZlID0gKnArKyAqIDUgKiA2MDsKKwlfZGVidWcoIktJViBMSUZFIDogJXUiLCBsaWZlKTsKKworCS8qIGdldCB0aGUgaXNzdWUgdGltZSBvZiB0aGUgdGlja2V0ICovCisJaWYgKGxpdHRsZV9lbmRpYW4pIHsKKwkJX19sZTMyIHN0YW1wOworCQltZW1jcHkoJnN0YW1wLCBwLCA0KTsKKwkJaXNzdWUgPSBsZTMyX3RvX2NwdShzdGFtcCk7CisJfSBlbHNlIHsKKwkJX19iZTMyIHN0YW1wOworCQltZW1jcHkoJnN0YW1wLCBwLCA0KTsKKwkJaXNzdWUgPSBiZTMyX3RvX2NwdShzdGFtcCk7CisJfQorCXAgKz0gNDsKKwlub3cgPSB4dGltZS50dl9zZWM7CisJX2RlYnVnKCJLSVYgSVNTVUU6ICVseCBbJWx4XSIsIGlzc3VlLCBub3cpOworCisJLyogY2hlY2sgdGhlIHRpY2tldCBpcyBpbiBkYXRlICovCisJaWYgKGlzc3VlID4gbm93KSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FETk9BVVRIOworCQlyZXQgPSAtRUtFWVJFSkVDVEVEOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChpc3N1ZSA8IG5vdyAtIGxpZmUpIHsKKwkJKl9hYm9ydF9jb2RlID0gUlhLQURFWFBJUkVEOworCQlyZXQgPSAtRUtFWUVYUElSRUQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKl9leHBpcnkgPSBpc3N1ZSArIGxpZmU7CisKKwkvKiBnZXQgdGhlIHNlcnZpY2UgbmFtZSAqLworCW5hbWUgPSBaKFNOQU1FX1NaKTsKKwlfZGVidWcoIktJViBTTkFNRTogJXMiLCBuYW1lKTsKKworCS8qIGdldCB0aGUgc2VydmljZSBpbnN0YW5jZSBuYW1lICovCisJbmFtZSA9IFooSU5TVF9TWik7CisJX2RlYnVnKCJLSVYgU0lOU1Q6ICVzIiwgbmFtZSk7CisKKwlyZXQgPSAwOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworYmFkX3RpY2tldDoKKwkqX2Fib3J0X2NvZGUgPSBSWEtBREJBRFRJQ0tFVDsKKwlyZXQgPSAtRUJBRE1TRzsKKwlnb3RvIGVycm9yOworfQorCisvKgorICogZGVjcnlwdCB0aGUgcmVzcG9uc2UgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2RlY3J5cHRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHJ4a2FkX3Jlc3BvbnNlICpyZXNwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByeHJwY19jcnlwdCAqc2Vzc2lvbl9rZXkpCit7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNzZ1syXSwgZHNnWzJdOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKworCV9lbnRlcigiLCwlMDh4JTA4eCIsCisJICAgICAgIG50b2hsKHNlc3Npb25fa2V5LT5uWzBdKSwgbnRvaGwoc2Vzc2lvbl9rZXktPm5bMV0pKTsKKworCUFTU0VSVChyeGthZF9jaSAhPSBOVUxMKTsKKworCW11dGV4X2xvY2soJnJ4a2FkX2NpX211dGV4KTsKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkocnhrYWRfY2ksIHNlc3Npb25fa2V5LT54LAorCQkJCSAgICBzaXplb2YoKnNlc3Npb25fa2V5KSkgPCAwKQorCQlCVUcoKTsKKworCW1lbWNweSgmaXYsIHNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IHJ4a2FkX2NpOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwlyeGthZF9zZ19zZXRfYnVmMihzc2csICZyZXNwLT5lbmNyeXB0ZWQsIHNpemVvZihyZXNwLT5lbmNyeXB0ZWQpKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCBzaXplb2YocmVzcC0+ZW5jcnlwdGVkKSk7CisJbXV0ZXhfdW5sb2NrKCZyeGthZF9jaV9tdXRleCk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogdmVyaWZ5IGEgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCByeGthZF92ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3BvbnNlCisJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGlnbmVkIGZvciBjcnlwdG8gKi8KKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19jcnlwdCBzZXNzaW9uX2tleTsKKwl0aW1lX3QgZXhwaXJ5OworCXZvaWQgKnRpY2tldDsKKwl1MzIgYWJvcnRfY29kZSwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbiwgY3N1bSwgbGV2ZWw7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPnNlcnZlcl9rZXkpKTsKKworCWFib3J0X2NvZGUgPSBSWEtBRFBBQ0tFVFNIT1JUOworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSA8IDApCisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2YocmVzcG9uc2UpKSkKKwkJQlVHKCk7CisKKwl2ZXJzaW9uID0gbnRvaGwocmVzcG9uc2UudmVyc2lvbik7CisJdGlja2V0X2xlbiA9IG50b2hsKHJlc3BvbnNlLnRpY2tldF9sZW4pOworCWt2bm8gPSBudG9obChyZXNwb25zZS5rdm5vKTsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCV9wcm90bygiUnggUkVTUE9OU0UgJSUldSB7IHY9JXUga3Y9JXUgdGw9JXUgfSIsCisJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbik7CisKKwlhYm9ydF9jb2RlID0gUlhLQURJTkNPTlNJU1RFTkNZOworCWlmICh2ZXJzaW9uICE9IFJYS0FEX1ZFUlNJT04pCisKKwlhYm9ydF9jb2RlID0gUlhLQURUSUNLRVRMRU47CisJaWYgKHRpY2tldF9sZW4gPCA0IHx8IHRpY2tldF9sZW4gPiBNQVhLUkI1VElDS0VUTEVOKQorCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJYWJvcnRfY29kZSA9IFJYS0FEVU5LTk9XTktFWTsKKwlpZiAoa3ZubyA+PSBSWEtBRF9US1RfVFlQRV9LRVJCRVJPU19WNSkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCS8qIGV4dHJhY3QgdGhlIGtlcmJlcm9zIHRpY2tldCBhbmQgZGVjcnlwdCBhbmQgZGVjb2RlIGl0ICovCisJdGlja2V0ID0ga21hbGxvYyh0aWNrZXRfbGVuLCBHRlBfTk9GUyk7CisJaWYgKCF0aWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7CisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOworCisJcmV0ID0gcnhrYWRfZGVjcnlwdF90aWNrZXQoY29ubiwgdGlja2V0LCB0aWNrZXRfbGVuLCAmc2Vzc2lvbl9rZXksCisJCQkJICAgJmV4cGlyeSwgJmFib3J0X2NvZGUpOworCWlmIChyZXQgPCAwKSB7CisJCSpfYWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJCWtmcmVlKHRpY2tldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdXNlIHRoZSBzZXNzaW9uIGtleSBmcm9tIGluc2lkZSB0aGUgdGlja2V0IHRvIGRlY3J5cHQgdGhlCisJICogcmVzcG9uc2UgKi8KKwlyeGthZF9kZWNyeXB0X3Jlc3BvbnNlKGNvbm4sICZyZXNwb25zZSwgJnNlc3Npb25fa2V5KTsKKworCWFib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCWlmIChyZXNwb25zZS5lbmNyeXB0ZWQuZXBvY2ggIT0gY29ubi0+ZXBvY2gpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKwlpZiAocmVzcG9uc2UuZW5jcnlwdGVkLmNpZCAhPSBjb25uLT5jaWQpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKwlpZiAobnRvaGwocmVzcG9uc2UuZW5jcnlwdGVkLnNlY3VyaXR5SW5kZXgpICE9IGNvbm4tPnNlY3VyaXR5X2l4KQorCQlnb3RvIHByb3RvY29sX2Vycm9yX2ZyZWU7CisJY3N1bSA9IHJlc3BvbnNlLmVuY3J5cHRlZC5jaGVja3N1bTsKKwlyZXNwb25zZS5lbmNyeXB0ZWQuY2hlY2tzdW0gPSAwOworCXJ4a2FkX2NhbGNfcmVzcG9uc2VfY2hlY2tzdW0oJnJlc3BvbnNlKTsKKwlpZiAocmVzcG9uc2UuZW5jcnlwdGVkLmNoZWNrc3VtICE9IGNzdW0pCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKworCWlmIChudG9obChyZXNwb25zZS5lbmNyeXB0ZWQuY2FsbF9pZFswXSkgPiBJTlRfTUFYIHx8CisJICAgIG50b2hsKHJlc3BvbnNlLmVuY3J5cHRlZC5jYWxsX2lkWzFdKSA+IElOVF9NQVggfHwKKwkgICAgbnRvaGwocmVzcG9uc2UuZW5jcnlwdGVkLmNhbGxfaWRbMl0pID4gSU5UX01BWCB8fAorCSAgICBudG9obChyZXNwb25zZS5lbmNyeXB0ZWQuY2FsbF9pZFszXSkgPiBJTlRfTUFYKQorCQlnb3RvIHByb3RvY29sX2Vycm9yX2ZyZWU7CisKKwlhYm9ydF9jb2RlID0gUlhLQURPVVRPRlNFUVVFTkNFOworCWlmIChyZXNwb25zZS5lbmNyeXB0ZWQuaW5jX25vbmNlICE9IGh0b25sKGNvbm4tPnNlY3VyaXR5X25vbmNlICsgMSkpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKworCWFib3J0X2NvZGUgPSBSWEtBRExFVkVMRkFJTDsKKwlsZXZlbCA9IG50b2hsKHJlc3BvbnNlLmVuY3J5cHRlZC5sZXZlbCk7CisJaWYgKGxldmVsID4gUlhSUENfU0VDVVJJVFlfRU5DUllQVCkKKwkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOworCWNvbm4tPnNlY3VyaXR5X2xldmVsID0gbGV2ZWw7CisKKwkvKiBjcmVhdGUgYSBrZXkgdG8gaG9sZCB0aGUgc2VjdXJpdHkgZGF0YSBhbmQgZXhwaXJhdGlvbiB0aW1lIC0gYWZ0ZXIKKwkgKiB0aGlzIHRoZSBjb25uZWN0aW9uIHNlY3VyaXR5IGNhbiBiZSBoYW5kbGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5CisJICogYXMgZm9yIGEgY2xpZW50IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19nZXRfc2VydmVyX2RhdGFfa2V5KGNvbm4sICZzZXNzaW9uX2tleSwgZXhwaXJ5LCBrdm5vKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZSh0aWNrZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWtmcmVlKHRpY2tldCk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK3Byb3RvY29sX2Vycm9yX2ZyZWU6CisJa2ZyZWUodGlja2V0KTsKK3Byb3RvY29sX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJX2xlYXZlKCIgPSAtRVBST1RPIFslZF0iLCBhYm9ydF9jb2RlKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBjb25uZWN0aW9uIHNlY3VyaXR5CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2NsZWFyKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCV9lbnRlcigiIik7CisKKwlpZiAoY29ubi0+Y2lwaGVyKQorCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoY29ubi0+Y2lwaGVyKTsKK30KKworLyoKKyAqIFJ4UlBDIEtlcmJlcm9zLWJhc2VkIHNlY3VyaXR5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgcnhrYWQgPSB7CisJLm93bmVyCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSAicnhrYWQiLAorCS5zZWN1cml0eV9pbmRleAkJCT0gUlhLQURfVkVSU0lPTiwKKwkuaW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5CT0gcnhrYWRfaW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5LAorCS5wcmltZV9wYWNrZXRfc2VjdXJpdHkJCT0gcnhrYWRfcHJpbWVfcGFja2V0X3NlY3VyaXR5LAorCS5zZWN1cmVfcGFja2V0CQkJPSByeGthZF9zZWN1cmVfcGFja2V0LAorCS52ZXJpZnlfcGFja2V0CQkJPSByeGthZF92ZXJpZnlfcGFja2V0LAorCS5pc3N1ZV9jaGFsbGVuZ2UJCT0gcnhrYWRfaXNzdWVfY2hhbGxlbmdlLAorCS5yZXNwb25kX3RvX2NoYWxsZW5nZQkJPSByeGthZF9yZXNwb25kX3RvX2NoYWxsZW5nZSwKKwkudmVyaWZ5X3Jlc3BvbnNlCQk9IHJ4a2FkX3ZlcmlmeV9yZXNwb25zZSwKKwkuY2xlYXIJCQkJPSByeGthZF9jbGVhciwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHJ4a2FkX2luaXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJLyogcGluIHRoZSBjaXBoZXIgd2UgbmVlZCBzbyB0aGF0IHRoZSBjcnlwdG8gbGF5ZXIgZG9lc24ndCBpbnZva2UKKwkgKiBrZXZlbnRkIHRvIGdvIGdldCBpdCAqLworCXJ4a2FkX2NpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhmY3J5cHQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihyeGthZF9jaSkpCisJCXJldHVybiBQVFJfRVJSKHJ4a2FkX2NpKTsKKworCXJldHVybiByeHJwY19yZWdpc3Rlcl9zZWN1cml0eSgmcnhrYWQpOworfQorCittb2R1bGVfaW5pdChyeGthZF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIHJ4a2FkX2V4aXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJcnhycGNfdW5yZWdpc3Rlcl9zZWN1cml0eSgmcnhrYWQpOworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihyeGthZF9jaSk7Cit9CisKK21vZHVsZV9leGl0KHJ4a2FkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3J4cnBjX3N5bXMuYyBiL25ldC9yeHJwYy9yeHJwY19zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTZmZDguLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL3J4cnBjX3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIHJ4cnBjX3N5bXMuYzogZXhwb3J0ZWQgUnggUlBDIGxheWVyIGludGVyZmFjZSBzeW1ib2xzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0KLS8qIGNhbGwuYyAqLwotRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfY2FsbCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX3B1dF9jYWxsKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfY2FsbF9hYm9ydCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2NhbGxfcmVhZF9kYXRhKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfY2FsbF93cml0ZV9kYXRhKTsKLQotLyogY29ubmVjdGlvbi5jICovCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfcHV0X2Nvbm5lY3Rpb24pOwotCi0vKiB0cmFuc3BvcnQuYyAqLwotRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfdHJhbnNwb3J0KTsKLUVYUE9SVF9TWU1CT0wocnhycGNfcHV0X3RyYW5zcG9ydCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2FkZF9zZXJ2aWNlKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfZGVsX3NlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3N5c2N0bC5jIGIvbmV0L3J4cnBjL3N5c2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQyOTA3Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9zeXNjdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBzeXNjdGwuYzogUnggUlBDIGNvbnRyb2wKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPHJ4cnBjL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1pbnQgcnhycGNfa3RyYWNlOwotaW50IHJ4cnBjX2tkZWJ1ZzsKLWludCByeHJwY19rcHJvdG87Ci1pbnQgcnhycGNfa25ldDsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqcnhycGNfc3lzY3RsID0gTlVMTDsKLQotc3RhdGljIGN0bF90YWJsZSByeHJwY19zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IDEsCi0JCS5wcm9jbmFtZQk9ICJrZGVidWciLAotCQkuZGF0YQkJPSAmcnhycGNfa2RlYnVnLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gMiwKLQkJLnByb2NuYW1lCT0gImt0cmFjZSIsCi0JCS5kYXRhCQk9ICZyeHJwY19rdHJhY2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewotCQkuY3RsX25hbWUJPSAzLAotCQkucHJvY25hbWUJPSAia3Byb3RvIiwKLQkJLmRhdGEJCT0gJnJ4cnBjX2twcm90bywKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IDQsCi0JCS5wcm9jbmFtZQk9ICJrbmV0IiwKLQkJLmRhdGEJCT0gJnJ4cnBjX2tuZXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewotCQkuY3RsX25hbWUJPSA1LAotCQkucHJvY25hbWUJPSAicGVlcnRpbW8iLAotCQkuZGF0YQkJPSAmcnhycGNfcGVlcl90aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4Ci0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IDYsCi0JCS5wcm9jbmFtZQk9ICJjb25udGltbyIsCi0JCS5kYXRhCQk9ICZyeHJwY19jb25uX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1zdGF0aWMgY3RsX3RhYmxlIHJ4cnBjX2Rpcl9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IDEsCi0JCS5wcm9jbmFtZQk9ICJyeHJwYyIsCi0JCS5tYXhsZW4JCT0gMCwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IHJ4cnBjX3N5c2N0bF90YWJsZQotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaW5pdGlhbGlzZSB0aGUgc3lzY3RsIHN0dWZmIGZvciBSeCBSUEMKLSAqLwotaW50IHJ4cnBjX3N5c2N0bF9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXJ4cnBjX3N5c2N0bCA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShyeHJwY19kaXJfc3lzY3RsX3RhYmxlKTsKLQlpZiAoIXJ4cnBjX3N5c2N0bCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19zeXNjdGxfaW5pdCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhbiB1cCB0aGUgc3lzY3RsIHN0dWZmIGZvciBSeCBSUEMKLSAqLwotdm9pZCByeHJwY19zeXNjdGxfY2xlYW51cCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlpZiAocnhycGNfc3lzY3RsKSB7Ci0JCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHJ4cnBjX3N5c2N0bCk7Ci0JCXJ4cnBjX3N5c2N0bCA9IE5VTEw7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KLQotfSAvKiBlbmQgcnhycGNfc3lzY3RsX2NsZWFudXAoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3RyYW5zcG9ydC5jIGIvbmV0L3J4cnBjL3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU3YmUyLi4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKiB0cmFuc3BvcnQuYzogUnggVHJhbnNwb3J0IHJvdXRpbmVzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHNlY2QuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKLSNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CS8qIHRoaXMgc2hvdWxkIF9yZWFsbHlfIGJlIGluIGVycnF1ZXVlLmguLiAqLwotI2VuZGlmCi0jaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0cnVjdCBlcnJvcm1zZyB7Ci0Jc3RydWN0IGNtc2doZHIJCQljbXNnOwkJLyogY29udHJvbCBtZXNzYWdlIGhlYWRlciAqLwotCXN0cnVjdCBzb2NrX2V4dGVuZGVkX2VycgllZTsJCS8qIGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IHNvY2thZGRyX2luCQlpY21wX3NyYzsJLyogSUNNUCBwYWNrZXQgc291cmNlIGFkZHJlc3MgKi8KLX07Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3RyYW5zcG9ydHMgPSBMSVNUX0hFQURfSU5JVChyeHJwY190cmFuc3BvcnRzKTsKLQotX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY190cmFuc3BvcnRfY291bnQpOwotTElTVF9IRUFEKHJ4cnBjX3Byb2NfdHJhbnNwb3J0cyk7Ci1ERUNMQVJFX1JXU0VNKHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOwotCi1zdGF0aWMgdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spOwotc3RhdGljIGludCByeHJwY190cmFuc19yZWNlaXZlX25ld19jYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIG5ldyB0cmFuc3BvcnQgZW5kcG9pbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBVRFAgcG9ydAotICovCi1pbnQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJICAgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKl90cmFucykKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCW1tX3NlZ21lbnRfdCBvbGRmczsKLQlzdHJ1Y3Qgc29jayAqc29jazsKLQlpbnQgcmV0LCBvcHQ7Ci0KLQlfZW50ZXIoIiVodSIsIHBvcnQpOwotCi0JdHJhbnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cmFucykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdG9taWNfc2V0KCZ0cmFucy0+dXNhZ2UsIDEpOwotCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+c2VydmljZXMpOwotCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5rcnhpb2RxX2xpbmspOwotCXNwaW5fbG9ja19pbml0KCZ0cmFucy0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5wZWVyX2FjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5wZWVyX2dyYXZleWFyZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdHJhbnMtPnBlZXJfZ3lfd2FpdHEpOwotCXJ3bG9ja19pbml0KCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlhdG9taWNfc2V0KCZ0cmFucy0+cGVlcl9jb3VudCwgMCk7Ci0JdHJhbnMtPnBvcnQgPSBwb3J0OwotCi0JLyogY3JlYXRlIGEgVURQIHNvY2tldCB0byBiZSBteSBhY3R1YWwgdHJhbnNwb3J0IGVuZHBvaW50ICovCi0JcmV0ID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJnRyYW5zLT5zb2NrZXQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JLyogdXNlIHRoZSBzcGVjaWZpZWQgcG9ydCAqLwotCWlmIChwb3J0KSB7Ci0JCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7Ci0JCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCXJldCA9IHRyYW5zLT5zb2NrZXQtPm9wcy0+YmluZCh0cmFucy0+c29ja2V0LAotCQkJCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLAotCQkJCQkgICAgICAgc2l6ZW9mKHNpbikpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCi0Jb3B0ID0gMTsKLQlvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhLRVJORUxfRFMpOwotCXJldCA9IHRyYW5zLT5zb2NrZXQtPm9wcy0+c2V0c29ja29wdCh0cmFucy0+c29ja2V0LCBTT0xfSVAsIElQX1JFQ1ZFUlIsCi0JCQkJCSAgICAgKGNoYXIgKikgJm9wdCwgc2l6ZW9mKG9wdCkpOwotCXNldF9mcyhvbGRmcyk7Ci0KLQlzcGluX2xvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0JbGlzdF9hZGQoJnRyYW5zLT5saW5rLCAmcnhycGNfdHJhbnNwb3J0cyk7Ci0Jc3Bpbl91bmxvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0KLQkvKiBzZXQgdGhlIHNvY2tldCB1cCAqLwotCXNvY2sgPSB0cmFucy0+c29ja2V0LT5zazsKLQlzb2NrLT5za191c2VyX2RhdGEJPSB0cmFuczsKLQlzb2NrLT5za19kYXRhX3JlYWR5CT0gcnhycGNfZGF0YV9yZWFkeTsKLQlzb2NrLT5za19lcnJvcl9yZXBvcnQJPSByeHJwY19lcnJvcl9yZXBvcnQ7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQlsaXN0X2FkZF90YWlsKCZ0cmFucy0+cHJvY19saW5rLCAmcnhycGNfcHJvY190cmFuc3BvcnRzKTsKLQl1cF93cml0ZSgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY190cmFuc3BvcnRfY291bnQpKTsKLQotCSpfdHJhbnMgPSB0cmFuczsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIHRyYW5zKTsKLQlyZXR1cm4gMDsKLQotIGVycm9yOgotCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgdHJhbnNwb3J0IChub3QgcmVhbGx5IG5lZWRlZCBoZXJlLCBidXQuLi4pICovCi0JaWYgKHRyYW5zLT5zb2NrZXQpCi0JCXRyYW5zLT5zb2NrZXQtPm9wcy0+c2h1dGRvd24odHJhbnMtPnNvY2tldCwgMik7Ci0KLQkvKiBjbG9zZSB0aGUgc29ja2V0ICovCi0JaWYgKHRyYW5zLT5zb2NrZXQpIHsKLQkJdHJhbnMtPnNvY2tldC0+c2stPnNrX3VzZXJfZGF0YSA9IE5VTEw7Ci0JCXNvY2tfcmVsZWFzZSh0cmFucy0+c29ja2V0KTsKLQkJdHJhbnMtPnNvY2tldCA9IE5VTEw7Ci0JfQotCi0Ja2ZyZWUodHJhbnMpOwotCi0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBkZXN0cm95IGEgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLXZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlfZW50ZXIoIiVwe3U9JWQgcD0laHV9IiwKLQkgICAgICAgdHJhbnMsIGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpLCB0cmFucy0+cG9ydCk7Ci0KLQlCVUdfT04oYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkgPD0gMCk7Ci0KLQkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZQotCSAqIGVmZmVjdGl2ZWx5IGF0b21pYyAqLwotCXNwaW5fbG9jaygmcnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLQlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFucy0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmcnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCWxpc3RfZGVsKCZ0cmFucy0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0KLQkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIHRyYW5zcG9ydCAqLwotCWlmICh0cmFucy0+c29ja2V0KQotCQl0cmFucy0+c29ja2V0LT5vcHMtPnNodXRkb3duKHRyYW5zLT5zb2NrZXQsIDIpOwotCi0JcnhycGNfa3J4c2VjZF9jbGVhcl90cmFuc3BvcnQodHJhbnMpOwotCXJ4cnBjX2tyeGlvZF9kZXF1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0KLQkvKiBkaXNjYXJkIGFsbCBwZWVyIGluZm9ybWF0aW9uICovCi0JcnhycGNfcGVlcl9jbGVhcmFsbCh0cmFucyk7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQlsaXN0X2RlbCgmdHJhbnMtPnByb2NfbGluayk7Ci0JdXBfd3JpdGUoJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOwotCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX3RyYW5zcG9ydF9jb3VudCkpOwotCi0JLyogY2xvc2UgdGhlIHNvY2tldCAqLwotCWlmICh0cmFucy0+c29ja2V0KSB7Ci0JCXRyYW5zLT5zb2NrZXQtPnNrLT5za191c2VyX2RhdGEgPSBOVUxMOwotCQlzb2NrX3JlbGVhc2UodHJhbnMtPnNvY2tldCk7Ci0JCXRyYW5zLT5zb2NrZXQgPSBOVUxMOwotCX0KLQotCWtmcmVlKHRyYW5zKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19wdXRfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFkZCBhIHNlcnZpY2UgdG8gYSB0cmFuc3BvcnQgdG8gYmUgbGlzdGVuZWQgdXBvbgotICovCi1pbnQgcnhycGNfYWRkX3NlcnZpY2Uoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCSAgICAgIHN0cnVjdCByeHJwY19zZXJ2aWNlICpuZXdzcnYpCi17Ci0Jc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlpbnQgcmV0ID0gLUVFWElTVDsKLQotCV9lbnRlcigiJXB7JWh1fSwlcHslaHV9IiwKLQkgICAgICAgdHJhbnMsIHRyYW5zLT5wb3J0LCBuZXdzcnYsIG5ld3Nydi0+c2VydmljZV9pZCk7Ci0KLQkvKiB2ZXJpZnkgdGhhdCB0aGUgc2VydmljZSBJRCBpcyBub3QgYWxyZWFkeSBwcmVzZW50ICovCi0Jc3Bpbl9sb2NrKCZ0cmFucy0+bG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnNlcnZpY2VzKSB7Ci0JCXNydiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19zZXJ2aWNlLCBsaW5rKTsKLQkJaWYgKHNydi0+c2VydmljZV9pZCA9PSBuZXdzcnYtPnNlcnZpY2VfaWQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBva2F5IC0gYWRkIHRoZSB0cmFuc3BvcnQgdG8gdGhlIGxpc3QgKi8KLQlsaXN0X2FkZF90YWlsKCZuZXdzcnYtPmxpbmssICZ0cmFucy0+c2VydmljZXMpOwotCXJ4cnBjX2dldF90cmFuc3BvcnQodHJhbnMpOwotCXJldCA9IDA7Ci0KLSBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5sb2NrKTsKLQotCV9sZWF2ZSgiPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2FkZF9zZXJ2aWNlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlbW92ZSBhIHNlcnZpY2UgZnJvbSBhIHRyYW5zcG9ydAotICovCi12b2lkIHJ4cnBjX2RlbF9zZXJ2aWNlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLCBzdHJ1Y3QgcnhycGNfc2VydmljZSAqc3J2KQotewotCV9lbnRlcigiJXB7JWh1fSwlcHslaHV9IiwgdHJhbnMsIHRyYW5zLT5wb3J0LCBzcnYsIHNydi0+c2VydmljZV9pZCk7Ci0KLQlzcGluX2xvY2soJnRyYW5zLT5sb2NrKTsKLQlsaXN0X2RlbCgmc3J2LT5saW5rKTsKLQlzcGluX3VubG9jaygmdHJhbnMtPmxvY2spOwotCi0JcnhycGNfcHV0X3RyYW5zcG9ydCh0cmFucyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfZGVsX3NlcnZpY2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogSU5FVCBjYWxsYmFjayB3aGVuIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgb24gdGhlIHNvY2tldC4KLSAqLwotc3RhdGljIHZvaWQgcnhycGNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKLQotCV9lbnRlcigiJXB7dD0lcH0sJWQiLCBzaywgc2stPnNrX3VzZXJfZGF0YSwgY291bnQpOwotCi0JLyogcXVldWUgdGhlIHRyYW5zcG9ydCBmb3IgYXR0ZW50aW9uIGJ5IGtyeGlvZCAqLwotCXRyYW5zID0gKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKikgc2stPnNrX3VzZXJfZGF0YTsKLQlpZiAodHJhbnMpCi0JCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCi0JLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgc29ja2V0ICovCi0JaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2RhdGFfcmVhZHkoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogSU5FVCBjYWxsYmFjayB3aGVuIGFuIElDTVAgZXJyb3IgcGFja2V0IGlzIHJlY2VpdmVkCi0gKiAtIHNrLT5lcnIgaXMgZXJyb3IgKEVIT1NUVU5SRUFDSCwgRVBST1RPIG9yIEVNU0dTSVpFKQotICovCi1zdGF0aWMgdm9pZCByeHJwY19lcnJvcl9yZXBvcnQoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOwotCi0JX2VudGVyKCIlcHt0PSVwfSIsIHNrLCBzay0+c2tfdXNlcl9kYXRhKTsKLQotCS8qIHF1ZXVlIHRoZSB0cmFuc3BvcnQgZm9yIGF0dGVudGlvbiBieSBrcnhpb2QgKi8KLQl0cmFucyA9IChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICopIHNrLT5za191c2VyX2RhdGE7Ci0JaWYgKHRyYW5zKSB7Ci0JCXRyYW5zLT5lcnJvcl9yY3ZkID0gMTsKLQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0JfQotCi0JLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgc29ja2V0ICovCi0JaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2Vycm9yX3JlcG9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzcGxpdCBhIG1lc3NhZ2UgdXAsIGFsbG9jYXRpbmcgbWVzc2FnZSByZWNvcmRzIGFuZCBmaWxsaW5nIHRoZW0gaW4KLSAqIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgc29ja2V0IGJ1ZmZlcgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2luY29taW5nX21zZyhzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwa3QsCi0JCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiIik7Ci0KLQltc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfbWVzc2FnZSksIEdGUF9LRVJORUwpOwotCWlmICghbXNnKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZtc2ctPnVzYWdlLCAxKTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssbXNncSk7Ci0KLQkvKiBkaWcgb3V0IHRoZSBSeCByb3V0aW5nIHBhcmFtZXRlcnMgKi8KLQlpZiAoc2tiX2NvcHlfYml0cyhwa3QsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKLQkJCSAgJm1zZy0+aGRyLCBzaXplb2YobXNnLT5oZHIpKSA8IDApIHsKLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JbXNnLT50cmFucyA9IHRyYW5zOwotCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfUkVDRUlWRUQ7Ci0Jc2tiX2dldF90aW1lc3RhbXAocGt0LCAmbXNnLT5zdGFtcCk7Ci0JaWYgKG1zZy0+c3RhbXAudHZfc2VjID09IDApIHsKLQkJZG9fZ2V0dGltZW9mZGF5KCZtc2ctPnN0YW1wKTsKLQkJaWYgKHBrdC0+c2spCi0JCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAocGt0LT5zayk7Ci0JfQotCW1zZy0+c2VxID0gbnRvaGwobXNnLT5oZHIuc2VxKTsKLQotCS8qIGF0dGFjaCB0aGUgcGFja2V0ICovCi0Jc2tiX2dldChwa3QpOwotCW1zZy0+cGt0ID0gcGt0OwotCi0JbXNnLT5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcik7Ci0JbXNnLT5kc2l6ZSA9IG1zZy0+cGt0LT5sZW4gLSBtc2ctPm9mZnNldDsKLQotCV9uZXQoIlJ4IFJlY2VpdmVkIHBhY2tldCBmcm9tICVzICglMDh4OyUwOHgsJTF4LCVkLCVzLCUwMngsJWQsJWQpIiwKLQkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCi0JICAgICBudG9obChtc2ctPmhkci5lcG9jaCksCi0JICAgICAobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spID4+IFJYUlBDX0NJRFNISUZULAotCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAotCSAgICAgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksCi0JICAgICByeHJwY19wa3RzW21zZy0+aGRyLnR5cGVdLAotCSAgICAgbXNnLT5oZHIuZmxhZ3MsCi0JICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpLAotCSAgICAgbXNnLT5oZHIuc2VjdXJpdHlJbmRleCk7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0KLQkvKiBzcGxpdCBvZmYganVtYm8gcGFja2V0cyAqLwotCXdoaWxlIChtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQKLQkgICAgICAgKSB7Ci0JCXN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIganVtYm87Ci0JCXN0cnVjdCByeHJwY19tZXNzYWdlICpqdW1ib21zZyA9IG1zZzsKLQotCQlfZGVidWcoInNwbGl0IGp1bWJvIHBhY2tldCIpOwotCi0JCS8qIHF1aWNrIHNhbml0eSBjaGVjayAqLwotCQlyZXQgPSAtRUJBRE1TRzsKLQkJaWYgKG1zZy0+ZHNpemUgPAotCQkgICAgUlhSUENfSlVNQk9fREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKQotCQkJZ290byBlcnJvcjsKLQotCQkvKiBkaWcgb3V0IHRoZSBzZWNvbmRhcnkgaGVhZGVyICovCi0JCWlmIChza2JfY29weV9iaXRzKHBrdCwgbXNnLT5vZmZzZXQgKyBSWFJQQ19KVU1CT19EQVRBTEVOLAotCQkJCSAgJmp1bWJvLCBzaXplb2YoanVtYm8pKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCi0JCS8qIGFsbG9jYXRlIGEgbmV3IG1lc3NhZ2UgcmVjb3JkICovCi0JCXJldCA9IC1FTk9NRU07Ci0JCW1zZyA9IGttZW1kdXAoanVtYm9tc2csIHNpemVvZihzdHJ1Y3QgcnhycGNfbWVzc2FnZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1zZykKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCBtc2dxKTsKLQotCQkvKiBhZGp1c3QgdGhlIGp1bWJvIHBhY2tldCAqLwotCQlqdW1ib21zZy0+ZHNpemUgPSBSWFJQQ19KVU1CT19EQVRBTEVOOwotCi0JCS8qIGF0dGFjaCB0aGUgcGFja2V0IGhlcmUgdG9vICovCi0JCXNrYl9nZXQocGt0KTsKLQotCQkvKiBhZGp1c3QgdGhlIHBhcmFtZXRlcnMgKi8KLQkJbXNnLT5zZXErKzsKLQkJbXNnLT5oZHIuc2VxID0gaHRvbmwobXNnLT5zZXEpOwotCQltc2ctPmhkci5zZXJpYWwgPSBodG9ubChudG9obChtc2ctPmhkci5zZXJpYWwpICsgMSk7Ci0JCW1zZy0+b2Zmc2V0ICs9IFJYUlBDX0pVTUJPX0RBVEFMRU4gKwotCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOwotCQltc2ctPmRzaXplIC09IFJYUlBDX0pVTUJPX0RBVEFMRU4gKwotCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOwotCQltc2ctPmhkci5mbGFncyA9IGp1bWJvLmZsYWdzOwotCQltc2ctPmhkci5fcnN2ZCA9IGp1bWJvLl9yc3ZkOwotCi0JCV9uZXQoIlJ4IFNwbGl0IGp1bWJvIHBhY2tldCBmcm9tICVzIgotCQkgICAgICIgKCUwOHg7JTA4eCwlMXgsJWQsJXMsJTAyeCwlZCwlZCkiLAotCQkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCi0JCSAgICAgbnRvaGwobXNnLT5oZHIuZXBvY2gpLAotCQkgICAgIChudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0lETUFTSykgPj4gUlhSUENfQ0lEU0hJRlQsCi0JCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAotCQkgICAgIG50b2hsKG1zZy0+aGRyLmNhbGxOdW1iZXIpLAotCQkgICAgIHJ4cnBjX3BrdHNbbXNnLT5oZHIudHlwZV0sCi0JCSAgICAgbXNnLT5oZHIuZmxhZ3MsCi0JCSAgICAgbnRvaHMobXNnLT5oZHIuc2VydmljZUlkKSwKLQkJICAgICBtc2ctPmhkci5zZWN1cml0eUluZGV4KTsKLQotCQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0JfQotCi0JX2xlYXZlKCIgPSAwICMlZCIsIGF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQl3aGlsZSAoIWxpc3RfZW1wdHkobXNncSkpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShtc2dxLT5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0KLQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLQl9Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfaW5jb21pbmdfbXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFjY2VwdCBhIG5ldyBjYWxsCi0gKiAtIGNhbGxlZCBmcm9tIGtyeGlvZCBpbiBwcm9jZXNzIGNvbnRleHQKLSAqLwotdm9pZCByeHJwY190cmFuc19yZWNlaXZlX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0JaW50IHJldDsKLQlfX2JlMzIgYWRkcjsKLQlfX2JlMTYgcG9ydDsKLQotCUxJU1RfSEVBRChtc2dxKTsKLQotCV9lbnRlcigiJXB7JWR9IiwgdHJhbnMsIHRyYW5zLT5wb3J0KTsKLQotCWZvciAoOzspIHsKLQkJLyogZGVhbCB3aXRoIG91dHN0YW50aW5nIGVycm9ycyBmaXJzdCAqLwotCQlpZiAodHJhbnMtPmVycm9yX3JjdmQpCi0JCQlyeHJwY190cmFuc19yZWNlaXZlX2Vycm9yX3JlcG9ydCh0cmFucyk7Ci0KLQkJLyogYXR0ZW1wdCB0byByZWNlaXZlIGEgcGFja2V0ICovCi0JCXBrdCA9IHNrYl9yZWN2X2RhdGFncmFtKHRyYW5zLT5zb2NrZXQtPnNrLCAwLCAxLCAmcmV0KTsKLQkJaWYgKCFwa3QpIHsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJCV9sZWF2ZSgiIEVBR0FJTiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLyogYW4gaWNtcCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZCAqLwotCQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0JCQlfbGVhdmUoIiBlcnJvciAlZFxuIiwgcmV0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIHdlJ2xsIHByb2JhYmx5IG5lZWQgdG8gY2hlY2tzdW0gaXQgKGRpZG4ndCBjYWxsCi0JCSAqIHNvY2tfcmVjdm1zZykgKi8KLQkJaWYgKHNrYl9jaGVja3N1bV9jb21wbGV0ZShwa3QpKSB7Ci0JCQlrZnJlZV9za2IocGt0KTsKLQkJCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgQ1NVTSBmYWlsZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWFkZHIgPSBwa3QtPm5oLmlwaC0+c2FkZHI7Ci0JCXBvcnQgPSBwa3QtPmgudWgtPnNvdXJjZTsKLQotCQlfbmV0KCJSeCBSZWNlaXZlZCBVRFAgcGFja2V0IGZyb20gJTA4eDolMDRodSIsCi0JCSAgICAgbnRvaGwoYWRkciksIG50b2hzKHBvcnQpKTsKLQotCQkvKiB1bm1hcnNoYWxsIHRoZSBSeCBwYXJhbWV0ZXJzIGFuZCBzcGxpdCBqdW1ibyBwYWNrZXRzICovCi0JCXJldCA9IHJ4cnBjX2luY29taW5nX21zZyh0cmFucywgcGt0LCAmbXNncSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlrZnJlZV9za2IocGt0KTsKLQkJCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgYmFkIHBhY2tldCIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQlVHX09OKGxpc3RfZW1wdHkoJm1zZ3EpKTsKLQotCQltc2cgPSBsaXN0X2VudHJ5KG1zZ3EubmV4dCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOwotCi0JCS8qIGxvY2F0ZSB0aGUgcmVjb3JkIGZvciB0aGUgcGVlciBmcm9tIHdoaWNoIGl0Ci0JCSAqIG9yaWdpbmF0ZWQgKi8KLQkJcmV0ID0gcnhycGNfcGVlcl9sb29rdXAodHJhbnMsIGFkZHIsICZwZWVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWtkZWJ1ZygiUnggTm8gY29ubmVjdGlvbnMgZnJvbSB0aGF0IHBlZXIiKTsKLQkJCXJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCh0cmFucywgbXNnLCAtRUlOVkFMKTsKLQkJCWdvdG8gZmluaXNoZWRfbXNnOwotCQl9Ci0KLQkJLyogdHJ5IGFuZCBmaW5kIGEgbWF0Y2hpbmcgY29ubmVjdGlvbiAqLwotCQlyZXQgPSByeHJwY19jb25uZWN0aW9uX2xvb2t1cChwZWVyLCBtc2csICZtc2ctPmNvbm4pOwotCQlpZiAocmV0IDwgMCkgewotCQkJa2RlYnVnKCJSeCBVbmtub3duIENvbm5lY3Rpb24iKTsKLQkJCXJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCh0cmFucywgbXNnLCAtRUlOVkFMKTsKLQkJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOwotCQkJZ290byBmaW5pc2hlZF9tc2c7Ci0JCX0KLQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0KLQkJLyogZGVhbCB3aXRoIHRoZSBmaXJzdCBwYWNrZXQgb2YgYSBuZXcgY2FsbCAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEICYmCi0JCSAgICBtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkJICAgIG50b2hsKG1zZy0+aGRyLnNlcSkgPT0gMQotCQkgICAgKSB7Ci0JCQlfZGVidWcoIlJ4IE5ldyBzZXJ2ZXIgY2FsbCIpOwotCQkJcnhycGNfdHJhbnNfcmVjZWl2ZV9uZXdfY2FsbCh0cmFucywgJm1zZ3EpOwotCQkJZ290byBmaW5pc2hlZF9tc2c7Ci0JCX0KLQotCQkvKiBkZWFsIHdpdGggc3Vic2VxdWVudCBwYWNrZXQocykgb2YgY2FsbCAqLwotCQlfZGVidWcoIlJ4IENhbGwgcGFja2V0Iik7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgmbXNncSkpIHsKLQkJCW1zZyA9IGxpc3RfZW50cnkobXNncS5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOwotCi0JCQlyZXQgPSByeHJwY19jb25uX3JlY2VpdmVfY2FsbF9wYWNrZXQobXNnLT5jb25uLCBOVUxMLCBtc2cpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgcmV0KTsKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJCWdvdG8gZmluaXNoZWRfbXNnOwotCQkJfQotCi0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0KLQkJZ290byBmaW5pc2hlZF9tc2c7Ci0KLQkJLyogZGlzcG9zZSBvZiB0aGUgcGFja2V0cyAqLwotCWZpbmlzaGVkX21zZzoKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtc2dxKSkgewotCQkJbXNnID0gbGlzdF9lbnRyeShtc2dxLm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0KLQkJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JCX0KLQkJa2ZyZWVfc2tiKHBrdCk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfdHJhbnNfcmVjZWl2ZV9wYWNrZXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYWNjZXB0IGEgbmV3IGNhbGwgZnJvbSBhIGNsaWVudCB0cnlpbmcgdG8gY29ubmVjdCB0byBvbmUgb2YgbXkgc2VydmljZXMKLSAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3RyYW5zX3JlY2VpdmVfbmV3X2NhbGwoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm1zZ3EpCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQotCV9lbnRlcigiIik7Ci0KLQkvKiBvbmx5IGJvdGhlciB3aXRoIHRoZSBmaXJzdCBwYWNrZXQgKi8KLQltc2cgPSBsaXN0X2VudHJ5KG1zZ3EtPm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOwotCXJ4cnBjX2tyeHNlY2RfcXVldWVfaW5jb21pbmdfY2FsbChtc2cpOwotCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0KLQlfbGVhdmUoIiA9IDAiKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfdHJhbnNfcmVjZWl2ZV9uZXdfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBwZXJmb3JtIGFuIGltbWVkaWF0ZSBhYm9ydCB3aXRob3V0IGNvbm5lY3Rpb24gb3IgY2FsbCBzdHJ1Y3R1cmVzCi0gKi8KLWludCByeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCQlpbnQgZXJyb3IpCi17Ci0Jc3RydWN0IHJ4cnBjX2hlYWRlciBhaGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0Jc3RydWN0IG1zZ2hkciBtc2doZHI7Ci0Jc3RydWN0IGt2ZWMgaW92WzJdOwotCV9fYmUzMiBfZXJyb3I7Ci0JaW50IGxlbiwgcmV0OwotCi0JX2VudGVyKCIlcCwlcCwlZCIsIHRyYW5zLCBtc2csIGVycm9yKTsKLQotCS8qIGRvbid0IGFib3J0IGFuIGFib3J0IHBhY2tldCAqLwotCWlmIChtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUKSB7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlfZXJyb3IgPSBodG9ubCgtZXJyb3IpOwotCi0JLyogc2V0IHVwIHRoZSBtZXNzYWdlIHRvIGJlIHRyYW5zbWl0dGVkICovCi0JbWVtY3B5KCZhaGRyLCAmbXNnLT5oZHIsIHNpemVvZihhaGRyKSk7Ci0JYWhkci5lcG9jaAk9IG1zZy0+aGRyLmVwb2NoOwotCWFoZHIuc2VyaWFsCT0gaHRvbmwoMSk7Ci0JYWhkci5zZXEJPSAwOwotCWFoZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOwotCWFoZHIuZmxhZ3MJPSBSWFJQQ19MQVNUX1BBQ0tFVDsKLQlhaGRyLmZsYWdzCXw9IH5tc2ctPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0KLQlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZihhaGRyKTsKLQlpb3ZbMF0uaW92X2Jhc2UJPSAmYWhkcjsKLQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihfZXJyb3IpOwotCWlvdlsxXS5pb3ZfYmFzZQk9ICZfZXJyb3I7Ci0KLQlsZW4gPSBzaXplb2YoYWhkcikgKyBzaXplb2YoX2Vycm9yKTsKLQotCW1lbXNldCgmc2luLDAsc2l6ZW9mKHNpbikpOwotCXNpbi5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7Ci0Jc2luLnNpbl9wb3J0CQk9IG1zZy0+cGt0LT5oLnVoLT5zb3VyY2U7Ci0Jc2luLnNpbl9hZGRyLnNfYWRkcgk9IG1zZy0+cGt0LT5uaC5pcGgtPnNhZGRyOwotCi0JbXNnaGRyLm1zZ19uYW1lCQk9ICZzaW47Ci0JbXNnaGRyLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7Ci0JbXNnaGRyLm1zZ19jb250cm9sCT0gTlVMTDsKLQltc2doZHIubXNnX2NvbnRyb2xsZW4JPSAwOwotCW1zZ2hkci5tc2dfZmxhZ3MJPSBNU0dfRE9OVFdBSVQ7Ci0KLQlfbmV0KCJTZW5kaW5nIG1lc3NhZ2UgdHlwZSAlZCBvZiAlZCBieXRlcyB0byAlMDh4OiVkIiwKLQkgICAgIGFoZHIudHlwZSwKLQkgICAgIGxlbiwKLQkgICAgIG50b2hsKHNpbi5zaW5fYWRkci5zX2FkZHIpLAotCSAgICAgbnRvaHMoc2luLnNpbl9wb3J0KSk7Ci0KLQkvKiBzZW5kIHRoZSBtZXNzYWdlICovCi0JcmV0ID0ga2VybmVsX3NlbmRtc2codHJhbnMtPnNvY2tldCwgJm1zZ2hkciwgaW92LCAyLCBsZW4pOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiByZWNlaXZlIGFuIElDTVAgZXJyb3IgcmVwb3J0IGFuZCBwZXJjb2xhdGUgaXQgdG8gYWxsIGNvbm5lY3Rpb25zCi0gKiBoZWFkaW5nIHRvIHRoZSBhZmZlY3RlZCBob3N0IG9yIHBvcnQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfdHJhbnNfcmVjZWl2ZV9lcnJvcl9yZXBvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNvbm5xLCAqX3A7Ci0Jc3RydWN0IGVycm9ybXNnIGVtc2c7Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0JX19iZTE2IHBvcnQ7Ci0JaW50IGxvY2FsLCBlcnI7Ci0KLQlfZW50ZXIoIiVwIiwgdHJhbnMpOwotCi0JZm9yICg7OykgewotCQl0cmFucy0+ZXJyb3JfcmN2ZCA9IDA7Ci0KLQkJLyogdHJ5IGFuZCByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgKi8KLQkJbXNnLm1zZ19uYW1lCT0gJnNpbjsKLQkJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7Ci0JCW1zZy5tc2dfY29udHJvbAk9ICZlbXNnOwotCQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoZW1zZyk7Ci0JCW1zZy5tc2dfZmxhZ3MJPSAwOwotCi0JCWVyciA9IGtlcm5lbF9yZWN2bXNnKHRyYW5zLT5zb2NrZXQsICZtc2csIE5VTEwsIDAsIDAsCi0JCQkJICAgTVNHX0VSUlFVRVVFIHwgTVNHX0RPTlRXQUlUIHwgTVNHX1RSVU5DKTsKLQotCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKLQkJCV9sZWF2ZSgiIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIHJlY3YgYW4gZXJyb3IgcmVwb3J0OiAlZFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbXNnLm1zZ19jb250cm9sbGVuID0gKGNoYXIgKikgbXNnLm1zZ19jb250cm9sIC0gKGNoYXIgKikgJmVtc2c7Ci0KLQkJaWYgKG1zZy5tc2dfY29udHJvbGxlbiA8IHNpemVvZihlbXNnLmNtc2cpIHx8Ci0JCSAgICBtc2cubXNnX25hbWVsZW4gPCBzaXplb2Yoc2luKSkgewotCQkJcHJpbnRrKCIlczogc2hvcnQgY29udHJvbCBtZXNzYWdlIgotCQkJICAgICAgICIgKG5sZW49JXUgY2xlbj0lWnUgZmw9JXgpXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgICBtc2cubXNnX25hbWVsZW4sCi0JCQkgICAgICAgbXNnLm1zZ19jb250cm9sbGVuLAotCQkJICAgICAgIG1zZy5tc2dfZmxhZ3MpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlfbmV0KCJSeCBSZWNlaXZlZCBjb250cm9sIG1lc3NhZ2UiCi0JCSAgICAgIiB7IGxlbj0lWnUgbGV2ZWw9JXUgdHlwZT0ldSB9IiwKLQkJICAgICBlbXNnLmNtc2cuY21zZ19sZW4sCi0JCSAgICAgZW1zZy5jbXNnLmNtc2dfbGV2ZWwsCi0JCSAgICAgZW1zZy5jbXNnLmNtc2dfdHlwZSk7Ci0KLQkJaWYgKHNpbi5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKLQkJCXByaW50aygiUnggSWdub3JpbmcgZXJyb3IgcmVwb3J0IHdpdGggbm9uLUlORVQgYWRkcmVzcyIKLQkJCSAgICAgICAiIChmYW09JXUpIiwKLQkJCSAgICAgICBzaW4uc2luX2ZhbWlseSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCV9uZXQoIlJ4IFJlY2VpdmVkIG1lc3NhZ2UgcGVydGFpbmluZyB0byBob3N0IGFkZHI9JXggcG9ydD0laHUiLAotCQkgICAgIG50b2hsKHNpbi5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4uc2luX3BvcnQpKTsKLQotCQlpZiAoZW1zZy5jbXNnLmNtc2dfbGV2ZWwgIT0gU09MX0lQIHx8Ci0JCSAgICBlbXNnLmNtc2cuY21zZ190eXBlICE9IElQX1JFQ1ZFUlIpIHsKLQkJCXByaW50aygiUnggSWdub3JpbmcgdW5rbm93biBlcnJvciByZXBvcnQiCi0JCQkgICAgICAgIiB7IGxldmVsPSV1IHR5cGU9JXUgfSIsCi0JCQkgICAgICAgZW1zZy5jbXNnLmNtc2dfbGV2ZWwsCi0JCQkgICAgICAgZW1zZy5jbXNnLmNtc2dfdHlwZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChtc2cubXNnX2NvbnRyb2xsZW4gPCBzaXplb2YoZW1zZy5jbXNnKSArIHNpemVvZihlbXNnLmVlKSkgewotCQkJcHJpbnRrKCIlczogc2hvcnQgZXJyb3IgbWVzc2FnZSAoJVp1KVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1zZy5tc2dfY29udHJvbGxlbik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcG9ydCA9IHNpbi5zaW5fcG9ydDsKLQotCQlzd2l0Y2ggKGVtc2cuZWUuZWVfb3JpZ2luKSB7Ci0JCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6Ci0JCQlsb2NhbCA9IDA7Ci0JCQlzd2l0Y2ggKGVtc2cuZWUuZWVfdHlwZSkgewotCQkJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKLQkJCQlzd2l0Y2ggKGVtc2cuZWUuZWVfY29kZSkgewotCQkJCWNhc2UgSUNNUF9ORVRfVU5SRUFDSDoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBOZXR3b3JrIFVucmVhY2hhYmxlIik7Ci0JCQkJCXBvcnQgPSAwOwotCQkJCQllcnIgPSAtRU5FVFVOUkVBQ0g7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNNUF9IT1NUX1VOUkVBQ0g6Ci0JCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgSG9zdCBVbnJlYWNoYWJsZSIpOwotCQkJCQlwb3J0ID0gMDsKLQkJCQkJZXJyID0gLUVIT1NUVU5SRUFDSDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ01QX1BPUlRfVU5SRUFDSDoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBQb3J0IFVucmVhY2hhYmxlIik7Ci0JCQkJCWVyciA9IC1FQ09OTlJFRlVTRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNNUF9ORVRfVU5LTk9XTjoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIE5ldHdvcmsiKTsKLQkJCQkJcG9ydCA9IDA7Ci0JCQkJCWVyciA9IC1FTkVUVU5SRUFDSDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ01QX0hPU1RfVU5LTk9XTjoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIEhvc3QiKTsKLQkJCQkJcG9ydCA9IDA7Ci0JCQkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgRGVzdFVucmVhY2ggeyBjb2RlPSV1IH0iLAotCQkJCQkgICAgIGVtc2cuZWUuZWVfY29kZSk7Ci0JCQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6Ci0JCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBUVEwgRXhjZWVkZWQiKTsKLQkJCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCV9wcm90bygiUnggUmVjZWl2ZWQgSUNNUCBlcnJvciB7IHR5cGU9JXUgY29kZT0ldSB9IiwKLQkJCQkgICAgICAgZW1zZy5lZS5lZV90eXBlLCBlbXNnLmVlLmVlX2NvZGUpOwotCQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0VFX09SSUdJTl9MT0NBTDoKLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgbG9jYWwgZXJyb3IgeyBlcnJvcj0lZCB9IiwKLQkJCSAgICAgICBlbXNnLmVlLmVlX2Vycm5vKTsKLQkJCWxvY2FsID0gMTsKLQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0VFX09SSUdJTl9OT05FOgotCQljYXNlIFNPX0VFX09SSUdJTl9JQ01QNjoKLQkJZGVmYXVsdDoKLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgZXJyb3IgcmVwb3J0IHsgb3JpZz0ldSB9IiwKLQkJCSAgICAgICBlbXNnLmVlLmVlX29yaWdpbik7Ci0JCQlsb2NhbCA9IDA7Ci0JCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBmaW5kIGFsbCB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGlzIHRyYW5zcG9ydCBhbmQgdGhlCi0JCSAqIGFmZmVjdGVkIGRlc3RpbmF0aW9uICovCi0JCUlOSVRfTElTVF9IRUFEKCZjb25ucSk7Ci0KLQkJaWYgKHJ4cnBjX3BlZXJfbG9va3VwKHRyYW5zLCBzaW4uc2luX2FkZHIuc19hZGRyLAotCQkJCSAgICAgICZwZWVyKSA9PSAwKSB7Ci0JCQlyZWFkX2xvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0JCQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCi0JCQkJCQkgIGxpbmspOwotCQkJCWlmIChwb3J0ICYmIGNvbm4tPmFkZHIuc2luX3BvcnQgIT0gcG9ydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFsaXN0X2VtcHR5KCZjb25uLT5lcnJfbGluaykpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmY29ubi0+ZXJyX2xpbmssICZjb25ucSk7Ci0JCQl9Ci0JCQlyZWFkX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCQkJLyogc2VydmljZSBhbGwgdGhvc2UgY29ubmVjdGlvbnMgKi8KLQkJCXdoaWxlICghbGlzdF9lbXB0eSgmY29ubnEpKSB7Ci0JCQkJY29ubiA9IGxpc3RfZW50cnkoY29ubnEubmV4dCwKLQkJCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCi0JCQkJCQkgIGVycl9saW5rKTsKLQkJCQlsaXN0X2RlbCgmY29ubi0+ZXJyX2xpbmspOwotCi0JCQkJcnhycGNfY29ubl9oYW5kbGVfZXJyb3IoY29ubiwgbG9jYWwsIGVycik7Ci0KLQkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQkJCX0KLQotCQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0JCX0KLQl9Ci0KLQlfbGVhdmUoIiIpOwotCXJldHVybjsKLX0gLyogZW5kIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KCkgKi8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9LY29uZmlnIGIvbmV0L3NjaGVkL0tjb25maWcKaW5kZXggZjQ1NDRkZC4uNDc1ZGY4NCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL0tjb25maWcKKysrIGIvbmV0L3NjaGVkL0tjb25maWcKQEAgLTQ2LDYyICs0Niw2IEBACiAKIGlmIE5FVF9TQ0hFRAogCi1jaG9pY2UKLQlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgotCWRlZmF1bHQgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCi0JLS0taGVscC0tLQotCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKLQkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKLQkgIGRpZmZlcmVudCBwcm9wZXJ0aWVzOgotCSAgCi0JICAtIGhpZ2ggcmVzb2x1dGlvbiAodXMgb3IgYmV0dGVyKQotCSAgLSBmYXN0IHRvIHJlYWQgKG1pbmltYWwgbG9ja2luZywgbm8gaS9vIGFjY2VzcykKLQkgIC0gc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzCi0JICAtIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzCi0KLQkgIGJ1dCBub3RoaW5nIHByb3ZpZGVzIGFsbCBvZiB0aGUgYWJvdmUuCi0KLWNvbmZpZyBORVRfU0NIX0NMS19KSUZGSUVTCi0JYm9vbCAiVGltZXIgaW50ZXJydXB0IgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB0aW1lciBpbnRlcnJ1cHQgKGppZmZpZXMpIGFzIGNsb2NrCi0JICBzb3VyY2UuIFRoaXMgY2xvY2sgc291cmNlIGlzIGZhc3QsIHN5bmNocm9uaXplZCBvbiBhbGwgcHJvY2Vzc29ycyBhbmQKLQkgIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzLCBidXQgaXRzIHJlc29sdXRpb24gaXMgdG9vIGxvdwotCSAgZm9yIGFjY3VyYXRlIHNoYXBpbmcgZXhjZXB0IGF0IHZlcnkgbG93IHNwZWVkLgotCi1jb25maWcgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCi0JYm9vbCAiZ2V0dGltZW9mZGF5IgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGdldHRpbWVvZmRheSBhcyBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sKLQkgIHNvdXJjZSBoYXMgaGlnaCByZXNvbHV0aW9uLCBpcyBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kCi0JICBoYW5kbGVzIGNwdSBjbG9jayBmcmVxdWVuY3kgY2hhbmdlcywgYnV0IGl0IGlzIHNsb3cuCi0KLQkgIENob29zZSB0aGlzIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIGNsb2NrIHNvdXJjZSBidXQgY2FuJ3QgdXNlCi0JICB0aGUgQ1BVJ3MgY3ljbGUgY291bnRlci4KLQotIyBkb24ndCBhbGxvdyBvbiBTTVAgeDg2IGJlY2F1c2UgdGhleSBjYW4gaGF2ZSB1bnN5bmNocm9uaXplZCBUU0NzLgotIyBnZXR0aW1lb2ZkYXkgaXMgYSBnb29kIGFsdGVybmF0aXZlCi1jb25maWcgTkVUX1NDSF9DTEtfQ1BVCi0JYm9vbCAiQ1BVIGN5Y2xlIGNvdW50ZXIiCi0JZGVwZW5kcyBvbiAoKFg4Nl9UU0MgfHwgWDg2XzY0KSAmJiAhU01QKSB8fCBBTFBIQSB8fCBTUEFSQzY0IHx8IFBQQzY0IHx8IElBNjQKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQ1BVJ3MgY3ljbGUgY291bnRlciBhcyBjbG9jayBzb3VyY2UuCi0JICBUaGlzIGlzIGEgY2hlYXAgYW5kIGhpZ2ggcmVzb2x1dGlvbiBjbG9jayBzb3VyY2UsIGJ1dCBvbiBzb21lCi0JICBhcmNoaXRlY3R1cmVzIGl0IGlzIG5vdCBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kIGRvZXNuJ3QKLQkgIGhhbmRsZSBjcHUgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZXMuCi0KLQkgIFRoZSB1c2VhYmxlIGN5Y2xlIGNvdW50ZXJzIGFyZToKLQotCSAgCXg4Ni94ODZfNjQJLSBUaW1lc3RhbXAgQ291bnRlcgotCQlhbHBoYQkJLSBDeWNsZSBDb3VudGVyCi0JCXNwYXJjNjQJCS0gJXRpY2tzIHJlZ2lzdGVyCi0JCXBwYzY0CQktIFRpbWUgYmFzZQotCQlpYTY0CQktIEludGVydmFsIFRpbWUgQ291bnRlcgotCi0JICBDaG9vc2UgdGhpcyBpZiB5b3VyIENQVSdzIGN5Y2xlIGNvdW50ZXIgaXMgd29ya2luZyBwcm9wZXJseS4KLQotZW5kY2hvaWNlCi0KIGNvbW1lbnQgIlF1ZXVlaW5nL1NjaGVkdWxpbmciCiAKIGNvbmZpZyBORVRfU0NIX0NCUQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9hcGkuYyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKaW5kZXggY2IyMTYxNy4uNzExZGQyNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9hcGkuYworKysgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCkBAIC0yNSwxMiArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiB2b2lkIHRjZl9oYXNoX2Rlc3Ryb3koc3RydWN0IHRjZl9jb21tb24gKnAsIHN0cnVjdCB0Y2ZfaGFzaGluZm8gKmhpbmZvKQogewpAQCAtOTMsMTUgKzkzLDE1IEBACiAJCQkJY29udGludWU7CiAJCQlhLT5wcml2ID0gcDsKIAkJCWEtPm9yZGVyID0gbl9pOwotCQkJciA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQkJciA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCQkJUlRBX1BVVChza2IsIGEtPm9yZGVyLCAwLCBOVUxMKTsKIAkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMCk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCWluZGV4LS07Ci0JCQkJc2tiX3RyaW0oc2tiLCAodTgqKXIgLSBza2ItPmRhdGEpOworCQkJCW5sbXNnX3RyaW0oc2tiLCByKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCQkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJCQluX2krKzsKIAkJCWlmIChuX2kgPj0gVENBX0FDVF9NQVhfUFJJTykKIAkJCQlnb3RvIGRvbmU7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAlyZXR1cm4gbl9pOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHIpOwogCWdvdG8gZG9uZTsKIH0KIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJc3RydWN0IHJ0YXR0ciAqciA7CiAJaW50IGk9IDAsIG5faSA9IDA7CiAKLQlyID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJciA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9LSU5ELCBJRk5BTVNJWiwgYS0+b3BzLT5raW5kKTsKIAlmb3IgKGkgPSAwOyBpIDwgKGhpbmZvLT5obWFzayArIDEpOyBpKyspIHsKQEAgLTE0MCwxMSArMTQwLDExIEBACiAJCX0KIAl9CiAJUlRBX1BVVChza2IsIFRDQV9GQ05ULCA0LCAmbl9pKTsKLQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCXItPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilyOwogCiAJcmV0dXJuIG5faTsKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgcik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTQyMyw3ICs0MjMsNyBAQAogdGNmX2FjdGlvbl9kdW1wXzEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnI7CiAKIAlpZiAoYS0+b3BzID09IE5VTEwgfHwgYS0+b3BzLT5kdW1wID09IE5VTEwpCkBAIC00MzIsMTUgKzQzMiwxNSBAQAogCVJUQV9QVVQoc2tiLCBUQ0FfS0lORCwgSUZOQU1TSVosIGEtPm9wcy0+a2luZCk7CiAJaWYgKHRjZl9hY3Rpb25fY29weV9zdGF0cyhza2IsIGEsIDApKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwlyID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoKGVyciA9IHRjZl9hY3Rpb25fZHVtcF9vbGQoc2tiLCBhLCBiaW5kLCByZWYpKSA+IDApIHsKLQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJCXJldHVybiBlcnI7CiAJfQogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQ0OSwxNyArNDQ5LDE3IEBACiB7CiAJc3RydWN0IHRjX2FjdGlvbiAqYTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqciA7CiAKIAl3aGlsZSAoKGEgPSBhY3QpICE9IE5VTEwpIHsKLQkJciA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQlyID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJCWFjdCA9IGEtPm5leHQ7CiAJCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgYmluZCwgcmVmKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycm91dDsKLQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NjcsNyArNDY3LDcgQEAKIHJ0YXR0cl9mYWlsdXJlOgogCWVyciA9IC1FSU5WQUw7CiBlcnJvdXQ6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjM1LDcgKzYzNSw3IEBACiB7CiAJc3RydWN0IHRjYW1zZyAqdDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqeDsKIAogCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCp0KSwgZmxhZ3MpOwpAQCAtNjQ1LDIwICs2NDUsMjAgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAlpZiAodGNmX2FjdGlvbl9kdW1wKHNrYiwgYSwgYmluZCwgcmVmKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAKLQl4LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4Kil4OworCXgtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKil4OwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTc2Nyw3ICs3NjcsNyBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCi0JYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCWIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0FDVF9NQVgsIHJ0YSkgPCAwKQogCQlnb3RvIGVycl9vdXQ7CkBAIC03ODMsMTYgKzc4MywxNiBAQAogCXQtPnRjYV9fcGFkMSA9IDA7CiAJdC0+dGNhX19wYWQyID0gMDsKIAotCXggPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAllcnIgPSBhLT5vcHMtPndhbGsoc2tiLCAmZGNiLCBSVE1fREVMQUNUSU9OLCBhKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTggKikgeDsKKwl4LT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopeDsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9ST09UOwogCW1vZHVsZV9wdXQoYS0+b3BzLT5vd25lcik7CiAJa2ZyZWUoYSk7CkBAIC04ODQsNyArODg0LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCWIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdCksIGZsYWdzKTsKIAl0ID0gTkxNU0dfREFUQShubGgpOwpAQCAtODkyLDE1ICs4OTIsMTUgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAlpZiAodGNmX2FjdGlvbl9kdW1wKHNrYiwgYSwgMCwgMCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JeC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopeDsKKwl4LT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopeDsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IFJUTkxHUlBfVEM7CiAKIAllcnIgPSBydG5ldGxpbmtfc2VuZChza2IsIHBpZCwgUlROTEdSUF9UQywgZmxhZ3MmTkxNX0ZfRUNITyk7CkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogdGNfZHVtcF9hY3Rpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICp4OwogCXN0cnVjdCB0Y19hY3Rpb25fb3BzICphX287CiAJc3RydWN0IHRjX2FjdGlvbiBhOwpAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOworCXggPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOwogCiAJcmV0ID0gYV9vLT53YWxrKHNrYiwgY2IsIFJUTV9HRVRBQ1RJT04sICZhKTsKQEAgLTEwNTYsMTIgKzEwNTYsMTIgQEAKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAogCWlmIChyZXQgPiAwKSB7Ci0JCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTggKikgeDsKKwkJeC0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXg7CiAJCXJldCA9IHNrYi0+bGVuOwogCX0gZWxzZQotCQlza2JfdHJpbShza2IsICh1OCopeCAtIHNrYi0+ZGF0YSk7CisJCW5sbXNnX3RyaW0oc2tiLCB4KTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJaWYgKE5FVExJTktfQ0IoY2ItPnNrYikucGlkICYmIHJldCkKIAkJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKIAltb2R1bGVfcHV0KGFfby0+b3duZXIpOwpAQCAtMTA3MCwyMCArMTA3MCwxNSBAQAogcnRhdHRyX2ZhaWx1cmU6CiBubG1zZ19mYWlsdXJlOgogCW1vZHVsZV9wdXQoYV9vLT5vd25lcik7Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB0Y19hY3Rpb25faW5pdCh2b2lkKQogewotCXN0cnVjdCBydG5ldGxpbmtfbGluayAqbGlua19wID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107Ci0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXQUNUSU9OLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX2FjdGlvbjsKLQkJbGlua19wW1JUTV9ERUxBQ1RJT04tUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfYWN0aW9uOwotCQlsaW5rX3BbUlRNX0dFVEFDVElPTi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF9hY3Rpb247Ci0JCWxpbmtfcFtSVE1fR0VUQUNUSU9OLVJUTV9CQVNFXS5kdW1waXQgPSB0Y19kdW1wX2FjdGlvbjsKLQl9CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdBQ1RJT04sIHRjX2N0bF9hY3Rpb24sIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMQUNUSU9OLCB0Y19jdGxfYWN0aW9uLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVEFDVElPTiwgdGNfY3RsX2FjdGlvbiwgdGNfZHVtcF9hY3Rpb24pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2dhY3QuYyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCmluZGV4IDg3ZDBmYWYuLjc1MTdmMzcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19nYWN0Lmg+CkBAIC0xNTUsNyArMTU2LDcgQEAKIAogc3RhdGljIGludCB0Y2ZfZ2FjdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfZ2FjdCBvcHQ7CiAJc3RydWN0IHRjZl9nYWN0ICpnYWN0ID0gYS0+cHJpdjsKIAlzdHJ1Y3QgdGNmX3QgdDsKQEAgLTE4MSw3ICsxODIsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwppbmRleCA0N2YwYjEzLi4wMGIwNWY0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2lwdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19pcHQuaD4KQEAgLTI0NSw3ICsyNDYsNyBAQAogCiBzdGF0aWMgaW50IHRjZl9pcHRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKIHsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9pcHQgKmlwdCA9IGEtPnByaXY7CiAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7CiAJc3RydWN0IHRjZl90IHRtOwpAQCAtMjc3LDcgKzI3OCw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlrZnJlZSh0KTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwppbmRleCAzZTkzNjgzLi5kZTIxYzkyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX21pcnJlZC5oPgpAQCAtMjA2LDcgKzIwNyw3IEBACiAKIHN0YXRpYyBpbnQgdGNmX21pcnJlZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX21pcnJlZCAqbSA9IGEtPnByaXY7CiAJc3RydWN0IHRjX21pcnJlZCBvcHQ7CiAJc3RydWN0IHRjZl90IHQ7CkBAIC0yMjUsNyArMjI2LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jIGIvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCmluZGV4IDNkNmEyZmMuLjQ1YjNjZGEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfcGVkaXQuYworKysgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3BlZGl0Lmg+CkBAIC0xMzYsNyArMTM3LDcgQEAKIAkJfQogCX0KIAotCXBwdHIgPSBza2ItPm5oLnJhdzsKKwlwcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlzcGluX2xvY2soJnAtPnRjZl9sb2NrKTsKIApAQCAtMTk1LDcgKzE5Niw3IEBACiBzdGF0aWMgaW50IHRjZl9wZWRpdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCQkgIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gYS0+cHJpdjsKIAlzdHJ1Y3QgdGNfcGVkaXQgKm9wdDsKIAlzdHJ1Y3QgdGNmX3QgdDsKQEAgLTIyNiw3ICsyMjcsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJa2ZyZWUob3B0KTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwppbmRleCAxMGE1YTVjLi42MTZmNDY1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCisrKyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNkZWZpbmUgTDJUKHAsTCkgICAoKHApLT50Y2ZwX1JfdGFiLT5kYXRhWyhMKT4+KHApLT50Y2ZwX1JfdGFiLT5yYXRlLmNlbGxfbG9nXSkKICNkZWZpbmUgTDJUX1AocCxMKSAoKHApLT50Y2ZwX1BfdGFiLT5kYXRhWyhMKT4+KHApLT50Y2ZwX1BfdGFiLT5yYXRlLmNlbGxfbG9nXSkKQEAgLTgwLDcgKzgxLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWEtPnByaXYgPSBwOwogCQkJYS0+b3JkZXIgPSBpbmRleDsKLQkJCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwkJCXIgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAkJCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJCQlpZiAodHlwZSA9PSBSVE1fREVMQUNUSU9OKQogCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMSk7CkBAIC04OCwxMCArODksMTAgQEAKIAkJCQllcnIgPSB0Y2ZfYWN0aW9uX2R1bXBfMShza2IsIGEsIDAsIDApOwogCQkJaWYgKGVyciA8IDApIHsKIAkJCQlpbmRleC0tOwotCQkJCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwkJCQlubG1zZ190cmltKHNrYiwgcik7CiAJCQkJZ290byBkb25lOwogCQkJfQotCQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJCXItPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilyOwogCQkJbl9pKys7CiAJCX0KIAl9CkBAIC0xMDIsNyArMTAzLDcgQEAKIAlyZXR1cm4gbl9pOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHIpOwogCWdvdG8gZG9uZTsKIH0KICNlbmRpZgpAQCAtMjQwLDcgKzI0MSw3IEBACiAJaWYgKHJldCAhPSBBQ1RfUF9DUkVBVEVEKQogCQlyZXR1cm4gcmV0OwogCi0JUFNDSEVEX0dFVF9USU1FKHBvbGljZS0+dGNmcF90X2MpOworCXBvbGljZS0+dGNmcF90X2MgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAlwb2xpY2UtPnRjZl9pbmRleCA9IHBhcm0tPmluZGV4ID8gcGFybS0+aW5kZXggOgogCQl0Y2ZfaGFzaF9uZXdfaW5kZXgoJnBvbGljZV9pZHhfZ2VuLCAmcG9saWNlX2hhc2hfaW5mbyk7CiAJaCA9IHRjZl9oYXNoKHBvbGljZS0+dGNmX2luZGV4LCBQT0xfVEFCX01BU0spOwpAQCAtMjk1LDEwICsyOTYsOSBAQAogCQkJcmV0dXJuIHBvbGljZS0+dGNmcF9yZXN1bHQ7CiAJCX0KIAotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQotCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwb2xpY2UtPnRjZnBfdF9jLAotCQkJCQkgcG9saWNlLT50Y2ZwX2J1cnN0KTsKKwkJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisJCXRva3MgPSBwc2NoZWRfdGRpZmZfYm91bmRlZChub3csIHBvbGljZS0+dGNmcF90X2MsCisJCQkJCSAgICBwb2xpY2UtPnRjZnBfYnVyc3QpOwogCQlpZiAocG9saWNlLT50Y2ZwX1BfdGFiKSB7CiAJCQlwdG9rcyA9IHRva3MgKyBwb2xpY2UtPnRjZnBfcHRva3M7CiAJCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwb2xpY2UsIHBvbGljZS0+dGNmcF9tdHUpKQpAQCAtMzI2LDcgKzMyNiw3IEBACiBzdGF0aWMgaW50CiB0Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSA9IGEtPnByaXY7CiAJc3RydWN0IHRjX3BvbGljZSBvcHQ7CiAKQEAgLTM1NSw3ICszNTUsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC00OTQsNyArNDk0LDcgQEAKIAl9CiAJaWYgKHBvbGljZS0+dGNmcF9QX3RhYikKIAkJcG9saWNlLT50Y2ZwX3B0b2tzID0gTDJUX1AocG9saWNlLCBwb2xpY2UtPnRjZnBfbXR1KTsKLQlQU0NIRURfR0VUX1RJTUUocG9saWNlLT50Y2ZwX3RfYyk7CisJcG9saWNlLT50Y2ZwX3RfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXBvbGljZS0+dGNmX2luZGV4ID0gcGFybS0+aW5kZXggPyBwYXJtLT5pbmRleCA6CiAJCXRjZl9wb2xpY2VfbmV3X2luZGV4KCk7CiAJcG9saWNlLT50Y2ZfYWN0aW9uID0gcGFybS0+YWN0aW9uOwpAQCAtNTQyLDkgKzU0Miw5IEBACiAJCQlyZXR1cm4gcG9saWNlLT50Y2ZwX3Jlc3VsdDsKIAkJfQogCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwb2xpY2UtPnRjZnBfdF9jLAotCQkJCQkgcG9saWNlLT50Y2ZwX2J1cnN0KTsKKwkJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisJCXRva3MgPSBwc2NoZWRfdGRpZmZfYm91bmRlZChub3csIHBvbGljZS0+dGNmcF90X2MsCisJCQkJCSAgICBwb2xpY2UtPnRjZnBfYnVyc3QpOwogCQlpZiAocG9saWNlLT50Y2ZwX1BfdGFiKSB7CiAJCQlwdG9rcyA9IHRva3MgKyBwb2xpY2UtPnRjZnBfcHRva3M7CiAJCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwb2xpY2UsIHBvbGljZS0+dGNmcF9tdHUpKQpAQCAtNTcyLDcgKzU3Miw3IEBACiAKIGludCB0Y2ZfcG9saWNlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSkKIHsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX3BvbGljZSBvcHQ7CiAKIAlvcHQuaW5kZXggPSBwb2xpY2UtPnRjZl9pbmRleDsKQEAgLTU5OCw3ICs1OTgsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jIGIvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYwppbmRleCBjNzk3MTE4Li4zNmUxZWRhIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCisrKyBiL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIAogI2RlZmluZSBUQ0FfQUNUX1NJTVAgMjIKQEAgLTE1NSw3ICsxNTYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgdGNmX3NpbXBfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAogCQkJCWludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX2RlZmFjdCAqZCA9IGEtPnByaXY7CiAJc3RydWN0IHRjX2RlZmFjdCBvcHQ7CiAJc3RydWN0IHRjZl90IHQ7CkBAIC0xNzMsNyArMTc0LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggNWM2ZmZkYi4uZWJmOTRlZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0yOSw5ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KQEAgLTMyMyw3ICszMjQsNyBAQAogewogCXN0cnVjdCB0Y21zZyAqdGNtOwogCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnRjbSksIGZsYWdzKTsKIAl0Y20gPSBOTE1TR19EQVRBKG5saCk7CkBAIC0zNDAsMTIgKzM0MSwxMiBAQAogCQlpZiAodHAtPm9wcy0+ZHVtcCAmJiB0cC0+b3BzLT5kdW1wKHRwLCBmaCwgc2tiLCB0Y20pIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJfQotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zOTksNyArNDAwLDYgQEAKIAlpZiAoKGRldiA9IGRldl9nZXRfYnlfaW5kZXgodGNtLT50Y21faWZpbmRleCkpID09IE5VTEwpCiAJCXJldHVybiBza2ItPmxlbjsKIAotCXJlYWRfbG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAlpZiAoIXRjbS0+dGNtX3BhcmVudCkKIAkJcSA9IGRldi0+cWRpc2Nfc2xlZXBpbmc7CiAJZWxzZQpAQCAtNDU2LDcgKzQ1Niw2IEBACiAJaWYgKGNsKQogCQljb3BzLT5wdXQocSwgY2wpOwogb3V0OgotCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCWRldl9wdXQoZGV2KTsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CkBAIC01NjMsMzAgKzU2MiwzMCBAQAogCQkgKiB0byB3b3JrIHdpdGggYm90aCBvbGQgYW5kIG5ldyBtb2RlcyBvZiBlbnRlcmluZwogCQkgKiB0YyBkYXRhIGV2ZW4gaWYgaXByb3V0ZTIgIHdhcyBuZXdlciAtIGpocwogCQkgKi8KLQkJc3RydWN0IHJ0YXR0ciAqIHBfcnRhID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCXN0cnVjdCBydGF0dHIgKnBfcnRhID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAkJaWYgKGV4dHMtPmFjdGlvbi0+dHlwZSAhPSBUQ0FfT0xEX0NPTVBBVCkgewogCQkJUlRBX1BVVChza2IsIG1hcC0+YWN0aW9uLCAwLCBOVUxMKTsKIAkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCBleHRzLT5hY3Rpb24sIDAsIDApIDwgMCkKIAkJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXBfcnRhOworCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilwX3J0YTsKIAkJfSBlbHNlIGlmIChtYXAtPnBvbGljZSkgewogCQkJUlRBX1BVVChza2IsIG1hcC0+cG9saWNlLCAwLCBOVUxMKTsKIAkJCWlmICh0Y2ZfYWN0aW9uX2R1bXBfb2xkKHNrYiwgZXh0cy0+YWN0aW9uLCAwLCAwKSA8IDApCiAJCQkJZ290byBydGF0dHJfZmFpbHVyZTsKLQkJCXBfcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilwX3J0YTsKKwkJCXBfcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopcF9ydGE7CiAJCX0KIAl9CiAjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQogCWlmIChtYXAtPnBvbGljZSAmJiBleHRzLT5wb2xpY2UpIHsKLQkJc3RydWN0IHJ0YXR0ciAqIHBfcnRhID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCXN0cnVjdCBydGF0dHIgKnBfcnRhID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAkJUlRBX1BVVChza2IsIG1hcC0+cG9saWNlLCAwLCBOVUxMKTsKIAogCQlpZiAodGNmX3BvbGljZV9kdW1wKHNrYiwgZXh0cy0+cG9saWNlKSA8IDApCiAJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JCXBfcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilwX3J0YTsKKwkJcF9ydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilwX3J0YTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTYxNCwxOCArNjEzLDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRjX2ZpbHRlcl9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3AgPSBydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1RGSUxURVIsIHRjX2N0bF90ZmlsdGVyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRGSUxURVIsIHRjX2N0bF90ZmlsdGVyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFRGSUxURVIsIHRjX2N0bF90ZmlsdGVyLAorCQkJCQkJIHRjX2R1bXBfdGZpbHRlcik7CiAKLQkvKiBTZXR1cCBydG5ldGxpbmsgbGlua3MuIEl0IGlzIG1hZGUgaGVyZSB0byBhdm9pZAotCSAgIGV4cG9ydGluZyBsYXJnZSBudW1iZXIgb2YgcHVibGljIHN5bWJvbHMuCi0JICovCi0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXVEZJTFRFUi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90ZmlsdGVyOwotCQlsaW5rX3BbUlRNX0RFTFRGSUxURVItUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGZpbHRlcjsKLQkJbGlua19wW1JUTV9HRVRURklMVEVSLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RmaWx0ZXI7Ci0JCWxpbmtfcFtSVE1fR0VUVEZJTFRFUi1SVE1fQkFTRV0uZHVtcGl0ID0gdGNfZHVtcF90ZmlsdGVyOwotCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jIGIvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCmluZGV4IDRhOTFmMDguLmM4ODU0MTIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYmFzaWMuYworKysgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogCkBAIC0yNDUsNyArMjQ2LDcgQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCBiYXNpY19maWx0ZXIgKmYgPSAoc3RydWN0IGJhc2ljX2ZpbHRlciAqKSBmaDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJaWYgKGYgPT0gTlVMTCkKQEAgLTI2MywxMSArMjY0LDExIEBACiAJICAgIHRjZl9lbV90cmVlX2R1bXAoc2tiLCAmZi0+ZW1hdGNoZXMsIFRDQV9CQVNJQ19FTUFUQ0hFUykgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JcnRhLT5ydGFfbGVuID0gKHNrYi0+dGFpbCAtIGIpOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZncuYyBiL25ldC9zY2hlZC9jbHNfZncuYwppbmRleCA1ZGJiOWQ0Li5iYmVjNGEwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Z3LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mdy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0zNDgsNyArMzQ5LDcgQEAKIHsKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCAqKXRwLT5yb290OwogCXN0cnVjdCBmd19maWx0ZXIgKmYgPSAoc3RydWN0IGZ3X2ZpbHRlciopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAoZiA9PSBOVUxMKQpAQCAtMzc0LDcgKzM3NSw3IEBACiAJaWYgKHRjZl9leHRzX2R1bXAoc2tiLCAmZi0+ZXh0cywgJmZ3X2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJmYtPmV4dHMsICZmd19leHRfbWFwKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CkBAIC0zODIsNyArMzgzLDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCmluZGV4IGFiYzQ3Y2MuLmNjOTQxZDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcm91dGUuYworKysgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtODgsOSArODksOSBAQAogc3RhdGljIGlubGluZQogdm9pZCByb3V0ZTRfcmVzZXRfZmFzdG1hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQsIHUzMiBpZCkKIHsKLQlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJcWRpc2NfbG9ja190cmVlKGRldik7CiAJbWVtc2V0KGhlYWQtPmZhc3RtYXAsIDAsIHNpemVvZihoZWFkLT5mYXN0bWFwKSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01NjIsNyArNTYzLDcgQEAKIAkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZiA9IChzdHJ1Y3Qgcm91dGU0X2ZpbHRlciopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJdTMyIGlkOwogCkBAIC01OTEsNyArNTkyLDcgQEAKIAlpZiAodGNmX2V4dHNfZHVtcChza2IsICZmLT5leHRzLCAmcm91dGVfZXh0X21hcCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCiAJaWYgKHRjZl9leHRzX2R1bXBfc3RhdHMoc2tiLCAmZi0+ZXh0cywgJnJvdXRlX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKQEAgLTU5OSw3ICs2MDAsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuYyBiL25ldC9zY2hlZC9jbHNfcnN2cC5jCmluZGV4IDFkNGExZmIuLjBhNjgzYzAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmggYi9uZXQvc2NoZWQvY2xzX3JzdnAuaAppbmRleCA3ODUzNjIxLi4yMmY5ZWRlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JzdnAuaAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuaApAQCAtMTQzLDkgKzE0Myw5IEBACiAJdTggdHVubmVsaWQgPSAwOwogCXU4ICp4cHJ0OwogI2lmIFJTVlBfRFNUX0xFTiA9PSA0Ci0Jc3RydWN0IGlwdjZoZHIgKm5ocHRyID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqbmhwdHIgPSBpcHY2X2hkcihza2IpOwogI2Vsc2UKLQlzdHJ1Y3QgaXBoZHIgKm5ocHRyID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICpuaHB0ciA9IGlwX2hkcihza2IpOwogI2VuZGlmCiAKIHJlc3RhcnQ6CkBAIC0xNjAsNyArMTYwLDcgQEAKIAlkc3QgPSAmbmhwdHItPmRhZGRyOwogCXByb3RvY29sID0gbmhwdHItPnByb3RvY29sOwogCXhwcnQgPSAoKHU4KiluaHB0cikgKyAobmhwdHItPmlobDw8Mik7Ci0JaWYgKG5ocHRyLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkpCisJaWYgKG5ocHRyLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpCiAJCXJldHVybiAtMTsKICNlbmRpZgogCkBAIC01OTMsNyArNTkzLDcgQEAKIHsKIAlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmYgPSAoc3RydWN0IHJzdnBfZmlsdGVyKilmaDsKIAlzdHJ1Y3QgcnN2cF9zZXNzaW9uICpzOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCXN0cnVjdCB0Y19yc3ZwX3BpbmZvIHBpbmZvOwogCkBAIC02MjMsMTQgKzYyMywxNCBAQAogCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJmYtPmV4dHMsICZyc3ZwX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJmYtPmV4dHMsICZyc3ZwX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwNi5jIGIvbmV0L3NjaGVkL2Nsc19yc3ZwNi5jCmluZGV4IGEyOTc5ZDguLjkzYjZhYmUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cDYuYworKysgYi9uZXQvc2NoZWQvY2xzX3JzdnA2LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjZGVmaW5lIFJTVlBfRFNUX0xFTgk0CiAjZGVmaW5lIFJTVlBfSUQJCSJyc3ZwNiIKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggNzU2M2ZkYy4uNDdhYzBjNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KIApAQCAtNDQ4LDcgKzQ0OSw3IEBACiB7CiAJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IFBSSVYodHApOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIgPSAoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqKSBmaDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJRFBSSU5USygidGNpbmRleF9kdW1wKHRwICVwLGZoIDB4JWx4LHNrYiAlcCx0ICVwKSxwICVwLHIgJXAsYiAlcFxuIiwKQEAgLTQ2Myw3ICs0NjQsNyBAQAogCQlSVEFfUFVUKHNrYixUQ0FfVENJTkRFWF9TSElGVCxzaXplb2YocC0+c2hpZnQpLCZwLT5zaGlmdCk7CiAJCVJUQV9QVVQoc2tiLFRDQV9UQ0lOREVYX0ZBTExfVEhST1VHSCxzaXplb2YocC0+ZmFsbF90aHJvdWdoKSwKIAkJICAgICZwLT5mYWxsX3Rocm91Z2gpOwotCQlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwtYjsKKwkJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAl9IGVsc2UgewogCQlpZiAocC0+cGVyZmVjdCkgewogCQkJdC0+dGNtX2hhbmRsZSA9IHItcC0+cGVyZmVjdDsKQEAgLTQ4Niw3ICs0ODcsNyBAQAogCiAJCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJnItPmV4dHMsICZ0Y2luZGV4X2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCQlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCiAJCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJnItPmV4dHMsICZ0Y2luZGV4X2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CkBAIC00OTUsNyArNDk2LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc191MzIuYyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKaW5kZXggMGJjYjE2OS4uYzdhMzQ3YiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc191MzIuYworKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0xMTksNyArMTIwLDcgQEAKIAl9IHN0YWNrW1RDX1UzMl9NQVhERVBUSF07CiAKIAlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQgPSAoc3RydWN0IHRjX3VfaG5vZGUqKXRwLT5yb290OwotCXU4ICpwdHIgPSBza2ItPm5oLnJhdzsKKwl1OCAqcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc3RydWN0IHRjX3Vfa25vZGUgKm47CiAJaW50IHNkZXB0aCA9IDA7CiAJaW50IG9mZjIgPSAwOwpAQCAtMjEzLDcgKzIxNCw3IEBACiAJCQlvZmYyID0gMDsKIAkJfQogCi0JCWlmIChwdHIgPCBza2ItPnRhaWwpCisJCWlmIChwdHIgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCQlnb3RvIG5leHRfaHQ7CiAJfQogCkBAIC00MzUsNyArNDM2LDcgQEAKIAkJCUJVR19UUkFQKGh0LT5yZWZjbnQgPT0gMCk7CiAKIAkJCWtmcmVlKGh0KTsKLQkJfTsKKwkJfQogCiAJCWtmcmVlKHRwX2MpOwogCX0KQEAgLTcxOCw3ICs3MTksNyBAQAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKIAlzdHJ1Y3QgdGNfdV9rbm9kZSAqbiA9IChzdHJ1Y3QgdGNfdV9rbm9kZSopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAobiA9PSBOVUxMKQpAQCAtNzY1LDE0ICs3NjYsMTQgQEAKICNlbmRpZgogCX0KIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlpZiAoVENfVTMyX0tFWShuLT5oYW5kbGUpKQogCQlpZiAodGNmX2V4dHNfZHVtcF9zdGF0cyhza2IsICZuLT5leHRzLCAmdTMyX2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV91MzIuYyBiL25ldC9zY2hlZC9lbV91MzIuYwppbmRleCBjZDA2MDBjLi4wYTJhN2ZlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvZW1fdTMyLmMKKysrIGIvbmV0L3NjaGVkL2VtX3UzMi5jCkBAIC0yMiw3ICsyMiw3IEBACiAJCQlzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvKQogewogCXN0cnVjdCB0Y191MzJfa2V5ICprZXkgPSAoc3RydWN0IHRjX3UzMl9rZXkgKikgZW0tPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAqcHRyID0gc2tiLT5uaC5yYXc7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlpZiAoaW5mbykgewogCQlpZiAoaW5mby0+cHRyKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtYXRjaC5jIGIvbmV0L3NjaGVkL2VtYXRjaC5jCmluZGV4IDk1OWMzMDYuLjYzMTQ2ZDMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbWF0Y2guYworKysgYi9uZXQvc2NoZWQvZW1hdGNoLmMKQEAgLTQxOCwxNyArNDE4LDE5IEBACiBpbnQgdGNmX2VtX3RyZWVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlICp0cmVlLCBpbnQgdGx2KQogewogCWludCBpOwotCXN0cnVjdCBydGF0dHIgKiB0b3Bfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKLQlzdHJ1Y3QgcnRhdHRyICogbGlzdF9zdGFydDsKKwl1OCAqdGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICp0b3Bfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwlzdHJ1Y3QgcnRhdHRyICpsaXN0X3N0YXJ0OwogCiAJUlRBX1BVVChza2IsIHRsdiwgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9FTUFUQ0hfVFJFRV9IRFIsIHNpemVvZih0cmVlLT5oZHIpLCAmdHJlZS0+aGRyKTsKIAotCWxpc3Rfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJbGlzdF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfRU1BVENIX1RSRUVfTElTVCwgMCwgTlVMTCk7CiAKKwl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5oZHIubm1hdGNoZXM7IGkrKykgewotCQlzdHJ1Y3QgcnRhdHRyICptYXRjaF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQlzdHJ1Y3QgcnRhdHRyICptYXRjaF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopdGFpbDsKIAkJc3RydWN0IHRjZl9lbWF0Y2ggKmVtID0gdGNmX2VtX2dldF9tYXRjaCh0cmVlLCBpKTsKIAkJc3RydWN0IHRjZl9lbWF0Y2hfaGRyIGVtX2hkciA9IHsKIAkJCS5raW5kID0gZW0tPm9wcyA/IGVtLT5vcHMtPmtpbmQgOiBUQ0ZfRU1fQ09OVEFJTkVSLApAQCAtNDQ3LDExICs0NDksMTIgQEAKIAkJfSBlbHNlIGlmIChlbS0+ZGF0YWxlbiA+IDApCiAJCQlSVEFfUFVUX05PSERSKHNrYiwgZW0tPmRhdGFsZW4sICh2b2lkICopIGVtLT5kYXRhKTsKIAotCQltYXRjaF9zdGFydC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopIG1hdGNoX3N0YXJ0OworCQl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCQltYXRjaF9zdGFydC0+cnRhX2xlbiA9IHRhaWwgLSAodTggKiltYXRjaF9zdGFydDsKIAl9CiAKLQlsaXN0X3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIGxpc3Rfc3RhcnQ7Ci0JdG9wX3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIHRvcF9zdGFydDsKKwlsaXN0X3N0YXJ0LT5ydGFfbGVuID0gdGFpbCAtICh1OCAqKWxpc3Rfc3RhcnQ7CisJdG9wX3N0YXJ0LT5ydGFfbGVuID0gdGFpbCAtICh1OCAqKXRvcF9zdGFydDsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2FwaS5jIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwppbmRleCBlY2M5ODhhLi44Njk5ZTcwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2FwaS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKQEAgLTI3LDE0ICsyNywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KIAorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAKQEAgLTE5MCw3ICsxOTEsNyBAQAogICAgKHJvb3QgcWRpc2MsIGFsbCBpdHMgY2hpbGRyZW4sIGNoaWxkcmVuIG9mIGNoaWxkcmVuIGV0Yy4pCiAgKi8KIAotc3RhdGljIHN0cnVjdCBRZGlzYyAqX19xZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSkKK3N0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCiB7CiAJc3RydWN0IFFkaXNjICpxOwogCkBAIC0yMDEsMTYgKzIwMiw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCi17Ci0Jc3RydWN0IFFkaXNjICpxOwotCi0JcmVhZF9sb2NrKCZxZGlzY190cmVlX2xvY2spOwotCXEgPSBfX3FkaXNjX2xvb2t1cChkZXYsIGhhbmRsZSk7Ci0JcmVhZF91bmxvY2soJnFkaXNjX3RyZWVfbG9jayk7Ci0JcmV0dXJuIHE7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xlYWYoc3RydWN0IFFkaXNjICpwLCB1MzIgY2xhc3NpZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsOwpAQCAtMjkxLDYgKzI4Miw0OCBAQAogCX0KIH0KIAorc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHFkaXNjX3dhdGNoZG9nKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2csCisJCQkJCQkgdGltZXIpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZC0+cWRpc2MtPmRldjsKKworCXdkLT5xZGlzYy0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwlzbXBfd21iKCk7CisJaWYgKHNwaW5fdHJ5bG9jaygmZGV2LT5xdWV1ZV9sb2NrKSkgeworCQlxZGlzY19ydW4oZGV2KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+cXVldWVfbG9jayk7CisJfSBlbHNlCisJCW5ldGlmX3NjaGVkdWxlKGRldik7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3ZvaWQgcWRpc2Nfd2F0Y2hkb2dfaW5pdChzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkLCBzdHJ1Y3QgUWRpc2MgKnFkaXNjKQoreworCWhydGltZXJfaW5pdCgmd2QtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9BQlMpOworCXdkLT50aW1lci5mdW5jdGlvbiA9IHFkaXNjX3dhdGNoZG9nOworCXdkLT5xZGlzYyA9IHFkaXNjOworfQorRVhQT1JUX1NZTUJPTChxZGlzY193YXRjaGRvZ19pbml0KTsKKwordm9pZCBxZGlzY193YXRjaGRvZ19zY2hlZHVsZShzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkLCBwc2NoZWRfdGltZV90IGV4cGlyZXMpCit7CisJa3RpbWVfdCB0aW1lOworCisJd2QtPnFkaXNjLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CisJdGltZSA9IGt0aW1lX3NldCgwLCAwKTsKKwl0aW1lID0ga3RpbWVfYWRkX25zKHRpbWUsIFBTQ0hFRF9VUzJOUyhleHBpcmVzKSk7CisJaHJ0aW1lcl9zdGFydCgmd2QtPnRpbWVyLCB0aW1lLCBIUlRJTUVSX01PREVfQUJTKTsKK30KK0VYUE9SVF9TWU1CT0wocWRpc2Nfd2F0Y2hkb2dfc2NoZWR1bGUpOworCit2b2lkIHFkaXNjX3dhdGNoZG9nX2NhbmNlbChzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkKQoreworCWhydGltZXJfY2FuY2VsKCZ3ZC0+dGltZXIpOworCXdkLT5xZGlzYy0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKK30KK0VYUE9SVF9TWU1CT0wocWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKTsKIAogLyogQWxsb2NhdGUgYW4gdW5pcXVlIGhhbmRsZSBmcm9tIHNwYWNlIG1hbmFnZWQgYnkga2VybmVsICovCiAKQEAgLTM2Miw3ICszOTUsNyBAQAogCWlmIChuID09IDApCiAJCXJldHVybjsKIAl3aGlsZSAoKHBhcmVudGlkID0gc2NoLT5wYXJlbnQpKSB7Ci0JCXNjaCA9IF9fcWRpc2NfbG9va3VwKHNjaC0+ZGV2LCBUQ19IX01BSihwYXJlbnRpZCkpOworCQlzY2ggPSBxZGlzY19sb29rdXAoc2NoLT5kZXYsIFRDX0hfTUFKKHBhcmVudGlkKSk7CiAJCWNvcHMgPSBzY2gtPm9wcy0+Y2xfb3BzOwogCQlpZiAoY29wcy0+cWxlbl9ub3RpZnkpIHsKIAkJCWNsID0gY29wcy0+Z2V0KHNjaCwgcGFyZW50aWQpOwpAQCAtNDY3LDEyICs1MDAsMTYgQEAKIAogCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKSB7CiAJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfSU5HUkVTUzsKKwkJc2NoLT5zdGF0c19sb2NrID0gJmRldi0+aW5ncmVzc19sb2NrOwogCQloYW5kbGUgPSBUQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKLQl9IGVsc2UgaWYgKGhhbmRsZSA9PSAwKSB7Ci0JCWhhbmRsZSA9IHFkaXNjX2FsbG9jX2hhbmRsZShkZXYpOwotCQllcnIgPSAtRU5PTUVNOwotCQlpZiAoaGFuZGxlID09IDApCi0JCQlnb3RvIGVycl9vdXQzOworCX0gZWxzZSB7CisJCXNjaC0+c3RhdHNfbG9jayA9ICZkZXYtPnF1ZXVlX2xvY2s7CisJCWlmIChoYW5kbGUgPT0gMCkgeworCQkJaGFuZGxlID0gcWRpc2NfYWxsb2NfaGFuZGxlKGRldik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJaWYgKGhhbmRsZSA9PSAwKQorCQkJCWdvdG8gZXJyX291dDM7CisJCX0KIAl9CiAKIAlzY2gtPmhhbmRsZSA9IGhhbmRsZTsKQEAgLTYyMSw5ICs2NTgsOSBAQAogCQkJcmV0dXJuIGVycjsKIAkJaWYgKHEpIHsKIAkJCXFkaXNjX25vdGlmeShza2IsIG4sIGNsaWQsIHEsIE5VTEwpOwotCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQkJcWRpc2NfbG9ja190cmVlKGRldik7CiAJCQlxZGlzY19kZXN0cm95KHEpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQlxZGlzY191bmxvY2tfdHJlZShkZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJcWRpc2Nfbm90aWZ5KHNrYiwgbiwgY2xpZCwgTlVMTCwgcSk7CkBAIC03NTYsMTcgKzc5MywxNyBAQAogCQllcnIgPSBxZGlzY19ncmFmdChkZXYsIHAsIGNsaWQsIHEsICZvbGRfcSk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChxKSB7Ci0JCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQkJCXFkaXNjX2xvY2tfdHJlZShkZXYpOwogCQkJCXFkaXNjX2Rlc3Ryb3kocSk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQkJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKIAkJCX0KIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJcWRpc2Nfbm90aWZ5KHNrYiwgbiwgY2xpZCwgb2xkX3EsIHEpOwogCQlpZiAob2xkX3EpIHsKLQkJCXNwaW5fbG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCXFkaXNjX2xvY2tfdHJlZShkZXYpOwogCQkJcWRpc2NfZGVzdHJveShvbGRfcSk7Ci0JCQlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCXFkaXNjX3VubG9ja190cmVlKGRldik7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC03NzcsNyArODE0LDcgQEAKIHsKIAlzdHJ1Y3QgdGNtc2cgKnRjbTsKIAlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgZ25ldF9kdW1wIGQ7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSwgZmxhZ3MpOwpAQCAtODExLDEyICs4NDgsMTIgQEAKIAlpZiAoZ25ldF9zdGF0c19maW5pc2hfY29weSgmZCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTg2Miw3ICs4OTksNiBAQAogCQkJY29udGludWU7CiAJCWlmIChpZHggPiBzX2lkeCkKIAkJCXNfcV9pZHggPSAwOwotCQlyZWFkX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJCXFfaWR4ID0gMDsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmZGV2LT5xZGlzY19saXN0LCBsaXN0KSB7CiAJCQlpZiAocV9pZHggPCBzX3FfaWR4KSB7CkBAIC04NzAsMTMgKzkwNiwxMCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKHRjX2ZpbGxfcWRpc2Moc2tiLCBxLCBxLT5wYXJlbnQsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAotCQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkgewotCQkJCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOworCQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkKIAkJCQlnb3RvIGRvbmU7Ci0JCQl9CiAJCQlxX2lkeCsrOwogCQl9Ci0JCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCX0KIAogZG9uZToKQEAgLTEwMTUsNyArMTA0OCw3IEBACiB7CiAJc3RydWN0IHRjbXNnICp0Y207CiAJc3RydWN0IG5sbXNnaGRyICAqbmxoOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IGduZXRfZHVtcCBkOwogCXN0cnVjdCBRZGlzY19jbGFzc19vcHMgKmNsX29wcyA9IHEtPm9wcy0+Y2xfb3BzOwogCkBAIC0xMDQwLDEyICsxMDczLDEyIEBACiAJaWYgKGduZXRfc3RhdHNfZmluaXNoX2NvcHkoJmQpIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMDk5LDcgKzExMzIsNiBAQAogCXNfdCA9IGNiLT5hcmdzWzBdOwogCXQgPSAwOwogCi0JcmVhZF9sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmRldi0+cWRpc2NfbGlzdCwgbGlzdCkgewogCQlpZiAodCA8IHNfdCB8fCAhcS0+b3BzLT5jbF9vcHMgfHwKIAkJICAgICh0Y20tPnRjbV9wYXJlbnQgJiYKQEAgLTExMjEsNyArMTE1Myw2IEBACiAJCQlicmVhazsKIAkJdCsrOwogCX0KLQlyZWFkX3VubG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAogCWNiLT5hcmdzWzBdID0gdDsKIApAQCAtMTE0Niw3ICsxMTc3LDcgQEAKIAogCWZvciAoIDsgdHA7IHRwID0gdHAtPm5leHQpIHsKIAkJaWYgKCh0cC0+cHJvdG9jb2wgPT0gcHJvdG9jb2wgfHwKLQkJCXRwLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FMTCkpICYmCisJCQl0cC0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQUxMKSkgJiYKIAkJCShlcnIgPSB0cC0+Y2xhc3NpZnkoc2tiLCB0cCwgcmVzKSkgPj0gMCkgewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCQkJaWYgKCBUQ19BQ1RfUkVDTEFTU0lGWSA9PSBlcnIpIHsKQEAgLTExNzUsMTUgKzEyMDYsMzEgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgcHNjaGVkX3VzX3Blcl90aWNrID0gMTsKLXN0YXRpYyBpbnQgcHNjaGVkX3RpY2tfcGVyX3VzID0gMTsKK3ZvaWQgdGNmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCit7CisJdHAtPm9wcy0+ZGVzdHJveSh0cCk7CisJbW9kdWxlX3B1dCh0cC0+b3BzLT5vd25lcik7CisJa2ZyZWUodHApOworfQorCit2b2lkIHRjZl9kZXN0cm95X2NoYWluKHN0cnVjdCB0Y2ZfcHJvdG8gKmZsKQoreworCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOworCisJd2hpbGUgKCh0cCA9IGZsKSAhPSBOVUxMKSB7CisJCWZsID0gdHAtPm5leHQ7CisJCXRjZl9kZXN0cm95KHRwKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRjZl9kZXN0cm95X2NoYWluKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHBzY2hlZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXNlcV9wcmludGYoc2VxLCAiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJICAgICAgcHNjaGVkX3RpY2tfcGVyX3VzLCBwc2NoZWRfdXNfcGVyX3RpY2ssCi0JCSAgICAgIDEwMDAwMDAsIEhaKTsKKwkJICAgKHUzMilOU0VDX1BFUl9VU0VDLCAodTMyKVBTQ0hFRF9VUzJOUygxKSwKKwkJICAgMTAwMDAwMCwKKwkJICAgKHUzMilOU0VDX1BFUl9TRUMvKHUzMilrdGltZV90b19ucyhLVElNRV9NT05PVE9OSUNfUkVTKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMDIsMTAxICsxMjQ5LDE5IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVCi1wc2NoZWRfdGRpZmZfdCBwc2NoZWRfY2xvY2tfcGVyX2h6OwotaW50IHBzY2hlZF9jbG9ja19zY2FsZTsKLUVYUE9SVF9TWU1CT0wocHNjaGVkX2Nsb2NrX3Blcl9oeik7Ci1FWFBPUlRfU1lNQk9MKHBzY2hlZF9jbG9ja19zY2FsZSk7Ci0KLXBzY2hlZF90aW1lX3QgcHNjaGVkX3RpbWVfYmFzZTsKLWN5Y2xlc190IHBzY2hlZF90aW1lX21hcms7Ci1FWFBPUlRfU1lNQk9MKHBzY2hlZF90aW1lX21hcmspOwotRVhQT1JUX1NZTUJPTChwc2NoZWRfdGltZV9iYXNlKTsKLQotLyoKLSAqIFBlcmlvZGljYWxseSBhZGp1c3QgcHNjaGVkX3RpbWVfYmFzZSB0byBhdm9pZCBvdmVyZmxvdwotICogd2l0aCAzMi1iaXQgZ2V0X2N5Y2xlcygpLiBTYWZlIHVwIHRvIDRHSHogQ1BVLgotICovCi1zdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBERUZJTkVfVElNRVIocHNjaGVkX3RpbWVyLCBwc2NoZWRfdGljaywgMCwgMCk7Ci0KLXN0YXRpYyB2b2lkIHBzY2hlZF90aWNrKHVuc2lnbmVkIGxvbmcgZHVtbXkpCi17Ci0JaWYgKHNpemVvZihjeWNsZXNfdCkgPT0gc2l6ZW9mKHUzMikpIHsKLQkJcHNjaGVkX3RpbWVfdCBkdW1teV9zdGFtcDsKLQkJUFNDSEVEX0dFVF9USU1FKGR1bW15X3N0YW1wKTsKLQkJcHNjaGVkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSpIWjsKLQkJYWRkX3RpbWVyKCZwc2NoZWRfdGltZXIpOwotCX0KLX0KLQotaW50IF9faW5pdCBwc2NoZWRfY2FsaWJyYXRlX2Nsb2NrKHZvaWQpCi17Ci0JcHNjaGVkX3RpbWVfdCBzdGFtcCwgc3RhbXAxOwotCXN0cnVjdCB0aW1ldmFsIHR2LCB0djE7Ci0JcHNjaGVkX3RkaWZmX3QgZGVsYXk7Ci0JbG9uZyByZGVsYXk7Ci0JdW5zaWduZWQgbG9uZyBzdG9wOwotCi0JcHNjaGVkX3RpY2soMCk7Ci0Jc3RvcCA9IGppZmZpZXMgKyBIWi8xMDsKLQlQU0NIRURfR0VUX1RJTUUoc3RhbXApOwotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSkgewotCQliYXJyaWVyKCk7Ci0JCWNwdV9yZWxheCgpOwotCX0KLQlQU0NIRURfR0VUX1RJTUUoc3RhbXAxKTsKLQlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7Ci0KLQlkZWxheSA9IFBTQ0hFRF9URElGRihzdGFtcDEsIHN0YW1wKTsKLQlyZGVsYXkgPSB0djEudHZfdXNlYyAtIHR2LnR2X3VzZWM7Ci0JcmRlbGF5ICs9ICh0djEudHZfc2VjIC0gdHYudHZfc2VjKSoxMDAwMDAwOwotCWlmIChyZGVsYXkgPiBkZWxheSkKLQkJcmV0dXJuIC0xOwotCWRlbGF5IC89IHJkZWxheTsKLQlwc2NoZWRfdGlja19wZXJfdXMgPSBkZWxheTsKLQl3aGlsZSAoKGRlbGF5Pj49MSkgIT0gMCkKLQkJcHNjaGVkX2Nsb2NrX3NjYWxlKys7Ci0JcHNjaGVkX3VzX3Blcl90aWNrID0gMTw8cHNjaGVkX2Nsb2NrX3NjYWxlOwotCXBzY2hlZF9jbG9ja19wZXJfaHogPSAocHNjaGVkX3RpY2tfcGVyX3VzKigxMDAwMDAwL0haKSk+PnBzY2hlZF9jbG9ja19zY2FsZTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBwa3RzY2hlZF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3A7Ci0KLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVCi0JaWYgKHBzY2hlZF9jYWxpYnJhdGVfY2xvY2soKSA8IDApCi0JCXJldHVybiAtMTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVMpCi0JcHNjaGVkX3RpY2tfcGVyX3VzID0gSFo8PFBTQ0hFRF9KU0NBTEU7Ci0JcHNjaGVkX3VzX3Blcl90aWNrID0gMTAwMDAwMDsKLSNlbmRpZgotCi0JbGlua19wID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107Ci0KLQkvKiBTZXR1cCBydG5ldGxpbmsgbGlua3MuIEl0IGlzIG1hZGUgaGVyZSB0byBhdm9pZAotCSAgIGV4cG9ydGluZyBsYXJnZSBudW1iZXIgb2YgcHVibGljIHN5bWJvbHMuCi0JICovCi0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19tb2RpZnlfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fREVMUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19nZXRfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fR0VUUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19nZXRfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fR0VUUURJU0MtUlRNX0JBU0VdLmR1bXBpdCA9IHRjX2R1bXBfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fTkVXVENMQVNTLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RjbGFzczsKLQkJbGlua19wW1JUTV9ERUxUQ0xBU1MtUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGNsYXNzOwotCQlsaW5rX3BbUlRNX0dFVFRDTEFTUy1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90Y2xhc3M7Ci0JCWxpbmtfcFtSVE1fR0VUVENMQVNTLVJUTV9CQVNFXS5kdW1waXQgPSB0Y19kdW1wX3RjbGFzczsKLQl9Ci0KIAlyZWdpc3Rlcl9xZGlzYygmcGZpZm9fcWRpc2Nfb3BzKTsKIAlyZWdpc3Rlcl9xZGlzYygmYmZpZm9fcWRpc2Nfb3BzKTsKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZSgicHNjaGVkIiwgMCwgJnBzY2hlZF9mb3BzKTsKIAorCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXUURJU0MsIHRjX21vZGlmeV9xZGlzYywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxRRElTQywgdGNfZ2V0X3FkaXNjLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFFESVNDLCB0Y19nZXRfcWRpc2MsIHRjX2R1bXBfcWRpc2MpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXVENMQVNTLCB0Y19jdGxfdGNsYXNzLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2F0bS5jIGIvbmV0L3NjaGVkL3NjaF9hdG0uYwppbmRleCBhZmIzYmJkLi5iZTdkMjk5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2F0bS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+IC8qIGZvciBmcHV0ICovCisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIApAQCAtMTU3LDE5ICsxNTgsNiBAQAogCXJldHVybiBhdG1fdGNfZ2V0KHNjaCxjbGFzc2lkKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2ZpbHRlcnMoc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cpCi17Ci0Jc3RydWN0IHRjZl9wcm90byAqZmlsdGVyOwotCi0Jd2hpbGUgKChmaWx0ZXIgPSBmbG93LT5maWx0ZXJfbGlzdCkpIHsKLQkJRFBSSU5USygiZGVzdHJveV9maWx0ZXJzOiBkZXN0cm95aW5nIGZpbHRlciAlcFxuIixmaWx0ZXIpOwotCQlmbG93LT5maWx0ZXJfbGlzdCA9IGZpbHRlci0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3koZmlsdGVyKTsKLQl9Ci19Ci0KLQogLyoKICAqIGF0bV90Y19wdXQgaGFuZGxlcyBhbGwgZGVzdHJ1Y3Rpb25zLCBpbmNsdWRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgZXhwbGljaXRseQogICogcmVxdWVzdGVkIChhdG1fdGNfZGVzdHJveSwgZXRjLikuIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSBuZXZlciBkcm9wCkBAIC0xOTQsNyArMTgyLDcgQEAKIAkqcHJldiA9IGZsb3ctPm5leHQ7CiAJRFBSSU5USygiYXRtX3RjX3B1dDogcWRpc2MgJXBcbiIsZmxvdy0+cSk7CiAJcWRpc2NfZGVzdHJveShmbG93LT5xKTsKLQlkZXN0cm95X2ZpbHRlcnMoZmxvdyk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oZmxvdy0+ZmlsdGVyX2xpc3QpOwogCWlmIChmbG93LT5zb2NrKSB7CiAJCURQUklOVEsoImF0bV90Y19wdXQ6IGZfY291bnQgJWRcbiIsCiAJCSAgICBmaWxlX2NvdW50KGZsb3ctPnNvY2stPmZpbGUpKTsKQEAgLTUwMyw3ICs0OTEsNyBAQAogCQkJfQogCQkJRDJQUklOVEsoImF0bV90Y19kZXF1ZXVlOiBzZW5kaW5nIG9uIGNsYXNzICVwXG4iLGZsb3cpOwogCQkJLyogcmVtb3ZlIGFueSBMTCBoZWFkZXIgc29tZWJvZHkgZWxzZSBoYXMgYXR0YWNoZWQgKi8KLQkJCXNrYl9wdWxsKHNrYiwoY2hhciAqKSBza2ItPm5oLmlwaC0oY2hhciAqKSBza2ItPmRhdGEpOworCQkJc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBmbG93LT5oZHJfbGVuKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKm5ldzsKIApAQCAtNTEzLDcgKzUwMSw3IEBACiAJCQkJc2tiID0gbmV3OwogCQkJfQogCQkJRDJQUklOVEsoInNjaF9hdG1fZGVxdWV1ZTogaXAgJXAsIGRhdGEgJXBcbiIsCi0JCQkgICAgc2tiLT5uaC5pcGgsc2tiLT5kYXRhKTsKKwkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIHNrYi0+ZGF0YSk7CiAJCQlBVE1fU0tCKHNrYiktPnZjYyA9IGZsb3ctPnZjYzsKIAkJCW1lbWNweShza2JfcHVzaChza2IsZmxvdy0+aGRyX2xlbiksZmxvdy0+aGRyLAogCQkJICAgIGZsb3ctPmhkcl9sZW4pOwpAQCAtNjEwLDcgKzU5OCw3IEBACiAJRFBSSU5USygiYXRtX3RjX2Rlc3Ryb3koc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKIAkvKiByYWNlcyA/ICovCiAJd2hpbGUgKChmbG93ID0gcC0+Zmxvd3MpKSB7Ci0JCWRlc3Ryb3lfZmlsdGVycyhmbG93KTsKKwkJdGNmX2Rlc3Ryb3lfY2hhaW4oZmxvdy0+ZmlsdGVyX2xpc3QpOwogCQlpZiAoZmxvdy0+cmVmID4gMSkKIAkJCXByaW50ayhLRVJOX0VSUiAiYXRtX2Rlc3Ryb3k6ICVwLT5yZWYgPSAlZFxuIixmbG93LAogCQkJICAgIGZsb3ctPnJlZik7CkBAIC02MzEsNyArNjE5LDcgQEAKIHsKIAlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CiAJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgY2w7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAogCURQUklOVEsoImF0bV90Y19kdW1wX2NsYXNzKHNjaCAlcCxbcWRpc2MgJXBdLGZsb3cgJXAsc2tiICVwLHRjbSAlcClcbiIsCkBAIC02NjEsMTEgKzY0OSwxMSBAQAogCiAJCVJUQV9QVVQoc2tiLFRDQV9BVE1fRVhDRVNTLHNpemVvZih6ZXJvKSwmemVybyk7CiAJfQotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsYi1za2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2NicS5jIGIvbmV0L3NjaGVkL3NjaF9jYnEuYwppbmRleCA3NmM5MmU3Li5hMjk0NTQyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2NicS5jCisrKyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMTEyLDcgKzExMyw3IEBACiAKIAkvKiBPdmVybGltaXQgc3RyYXRlZ3kgcGFyYW1ldGVycyAqLwogCXZvaWQJCQkoKm92ZXJsaW1pdCkoc3RydWN0IGNicV9jbGFzcyAqY2wpOwotCWxvbmcJCQlwZW5hbHR5OworCXBzY2hlZF90ZGlmZl90CQlwZW5hbHR5OwogCiAJLyogR2VuZXJhbCBzY2hlZHVsZXIgKFdSUikgcGFyYW1ldGVycyAqLwogCWxvbmcJCQlhbGxvdDsKQEAgLTE0Myw3ICsxNDQsNyBAQAogCXBzY2hlZF90aW1lX3QJCXVuZGVydGltZTsKIAlsb25nCQkJYXZnaWRsZTsKIAlsb25nCQkJZGVmaWNpdDsJLyogU2F2ZWQgZGVmaWNpdCBmb3IgV1JSICovCi0JdW5zaWduZWQgbG9uZwkJcGVuYWxpemVkOworCXBzY2hlZF90aW1lX3QJCXBlbmFsaXplZDsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyBic3RhdHM7CiAJc3RydWN0IGduZXRfc3RhdHNfcXVldWUgcXN0YXRzOwogCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IHJhdGVfZXN0OwpAQCAtMTgwLDEyICsxODEsMTIgQEAKIAlwc2NoZWRfdGltZV90CQlub3dfcnQ7CQkvKiBDYWNoZWQgcmVhbCB0aW1lICovCiAJdW5zaWduZWQJCXBtYXNrOwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJZGVsYXlfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJd2RfdGltZXI7CS8qIFdhdGNoZG9nIHRpbWVyLAorCXN0cnVjdCBocnRpbWVyCQlkZWxheV90aW1lcjsKKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cJd2F0Y2hkb2c7CS8qIFdhdGNoZG9nIHRpbWVyLAogCQkJCQkJICAgc3RhcnRlZCB3aGVuIENCUSBoYXMKIAkJCQkJCSAgIGJhY2tsb2csIGJ1dCBjYW5ub3QKIAkJCQkJCSAgIHRyYW5zbWl0IGp1c3Qgbm93ICovCi0JbG9uZwkJCXdkX2V4cGlyZXM7CisJcHNjaGVkX3RkaWZmX3QJCXdkX2V4cGlyZXM7CiAJaW50CQkJdG9wbGV2ZWw7CiAJdTMyCQkJaGdlbmVyYXRvcjsKIH07CkBAIC0zODQsMTIgKzM4NSwxMiBAQAogCQlwc2NoZWRfdGltZV90IG5vdzsKIAkJcHNjaGVkX3RkaWZmX3QgaW5jcjsKIAotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQkJaW5jciA9IFBTQ0hFRF9URElGRihub3csIHEtPm5vd19ydCk7Ci0JCVBTQ0hFRF9UQUREMihxLT5ub3csIGluY3IsIG5vdyk7CisJCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCQlpbmNyID0gbm93IC0gcS0+bm93X3J0OworCQlub3cgPSBxLT5ub3cgKyBpbmNyOwogCiAJCWRvIHsKLQkJCWlmIChQU0NIRURfVExFU1MoY2wtPnVuZGVydGltZSwgbm93KSkgeworCQkJaWYgKGNsLT51bmRlcnRpbWUgPCBub3cpIHsKIAkJCQlxLT50b3BsZXZlbCA9IGNsLT5sZXZlbDsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC00NzMsNyArNDc0LDcgQEAKIHN0YXRpYyB2b2lkIGNicV9vdmxfY2xhc3NpYyhzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7Ci0JcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2wtPnVuZGVydGltZSwgcS0+bm93KTsKKwlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IGNsLT51bmRlcnRpbWUgLSBxLT5ub3c7CiAKIAlpZiAoIWNsLT5kZWxheWVkKSB7CiAJCWRlbGF5ICs9IGNsLT5vZmZ0aW1lOwpAQCAtNDkxLDcgKzQ5Miw3IEBACiAJCQljbC0+YXZnaWRsZSA9IGNsLT5taW5pZGxlOwogCQlpZiAoZGVsYXkgPD0gMCkKIAkJCWRlbGF5ID0gMTsKLQkJUFNDSEVEX1RBREQyKHEtPm5vdywgZGVsYXksIGNsLT51bmRlcnRpbWUpOworCQljbC0+dW5kZXJ0aW1lID0gcS0+bm93ICsgZGVsYXk7CiAKIAkJY2wtPnhzdGF0cy5vdmVyYWN0aW9ucysrOwogCQljbC0+ZGVsYXllZCA9IDE7CkBAIC01MDgsNyArNTA5LDcgQEAKIAkJcHNjaGVkX3RkaWZmX3QgYmFzZV9kZWxheSA9IHEtPndkX2V4cGlyZXM7CiAKIAkJZm9yIChiID0gY2wtPmJvcnJvdzsgYjsgYiA9IGItPmJvcnJvdykgewotCQkJZGVsYXkgPSBQU0NIRURfVERJRkYoYi0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCQkJZGVsYXkgPSBiLT51bmRlcnRpbWUgLSBxLT5ub3c7CiAJCQlpZiAoZGVsYXkgPCBiYXNlX2RlbGF5KSB7CiAJCQkJaWYgKGRlbGF5IDw9IDApCiAJCQkJCWRlbGF5ID0gMTsKQEAgLTU0NiwyNyArNTQ3LDMyIEBACiBzdGF0aWMgdm9pZCBjYnFfb3ZsX2RlbGF5KHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewogCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoY2wtPnFkaXNjKTsKLQlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IFBTQ0hFRF9URElGRihjbC0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCXBzY2hlZF90ZGlmZl90IGRlbGF5ID0gY2wtPnVuZGVydGltZSAtIHEtPm5vdzsKIAogCWlmICghY2wtPmRlbGF5ZWQpIHsKLQkJdW5zaWduZWQgbG9uZyBzY2hlZCA9IGppZmZpZXM7CisJCXBzY2hlZF90aW1lX3Qgc2NoZWQgPSBxLT5ub3c7CisJCWt0aW1lX3QgZXhwaXJlczsKIAogCQlkZWxheSArPSBjbC0+b2ZmdGltZTsKIAkJaWYgKGNsLT5hdmdpZGxlIDwgMCkKIAkJCWRlbGF5IC09ICgtY2wtPmF2Z2lkbGUpIC0gKCgtY2wtPmF2Z2lkbGUpID4+IGNsLT5ld21hX2xvZyk7CiAJCWlmIChjbC0+YXZnaWRsZSA8IGNsLT5taW5pZGxlKQogCQkJY2wtPmF2Z2lkbGUgPSBjbC0+bWluaWRsZTsKLQkJUFNDSEVEX1RBREQyKHEtPm5vdywgZGVsYXksIGNsLT51bmRlcnRpbWUpOworCQljbC0+dW5kZXJ0aW1lID0gcS0+bm93ICsgZGVsYXk7CiAKIAkJaWYgKGRlbGF5ID4gMCkgewotCQkJc2NoZWQgKz0gUFNDSEVEX1VTMkpJRkZJRShkZWxheSkgKyBjbC0+cGVuYWx0eTsKKwkJCXNjaGVkICs9IGRlbGF5ICsgY2wtPnBlbmFsdHk7CiAJCQljbC0+cGVuYWxpemVkID0gc2NoZWQ7CiAJCQljbC0+Y3ByaW9yaXR5ID0gVENfQ0JRX01BWFBSSU87CiAJCQlxLT5wbWFzayB8PSAoMTw8VENfQ0JRX01BWFBSSU8pOwotCQkJaWYgKGRlbF90aW1lcigmcS0+ZGVsYXlfdGltZXIpICYmCi0JCQkgICAgKGxvbmcpKHEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgLSBzY2hlZCkgPiAwKQotCQkJCXEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBzY2hlZDsKLQkJCWFkZF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOworCisJCQlleHBpcmVzID0ga3RpbWVfc2V0KDAsIDApOworCQkJZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhleHBpcmVzLCBQU0NIRURfVVMyTlMoc2NoZWQpKTsKKwkJCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJnEtPmRlbGF5X3RpbWVyKSAmJgorCQkJICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1YihxLT5kZWxheV90aW1lci5leHBpcmVzLAorCQkJCQkJICBleHBpcmVzKSkgPiAwKQorCQkJCXEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBleHBpcmVzOworCQkJaHJ0aW1lcl9yZXN0YXJ0KCZxLT5kZWxheV90aW1lcik7CiAJCQljbC0+ZGVsYXllZCA9IDE7CiAJCQljbC0+eHN0YXRzLm92ZXJhY3Rpb25zKys7CiAJCQlyZXR1cm47CkBAIC01ODMsNyArNTg5LDcgQEAKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7CiAKLQljbC0+cGVuYWxpemVkID0gamlmZmllcyArIGNsLT5wZW5hbHR5OworCWNsLT5wZW5hbGl6ZWQgPSBxLT5ub3cgKyBjbC0+cGVuYWx0eTsKIAogCWlmIChjbC0+Y3ByaW9yaXR5ICE9IGNsLT5wcmlvcml0eTIpIHsKIAkJY2wtPmNwcmlvcml0eSA9IGNsLT5wcmlvcml0eTI7CkBAIC02MDQsMjcgKzYxMCwxOSBAQAogCWNicV9vdmxfY2xhc3NpYyhjbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNicV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgUWRpc2MgKnNjaCA9IChzdHJ1Y3QgUWRpc2MqKWFyZzsKLQotCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKLQluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNicV91bmRlbGF5X3ByaW8oc3RydWN0IGNicV9zY2hlZF9kYXRhICpxLCBpbnQgcHJpbykKK3N0YXRpYyBwc2NoZWRfdGRpZmZfdCBjYnFfdW5kZWxheV9wcmlvKHN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSwgaW50IHByaW8sCisJCQkJICAgICAgIHBzY2hlZF90aW1lX3Qgbm93KQogewogCXN0cnVjdCBjYnFfY2xhc3MgKmNsOwogCXN0cnVjdCBjYnFfY2xhc3MgKmNsX3ByZXYgPSBxLT5hY3RpdmVbcHJpb107Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgc2NoZWQgPSBub3c7CisJcHNjaGVkX3RpbWVfdCBzY2hlZCA9IG5vdzsKIAogCWlmIChjbF9wcmV2ID09IE5VTEwpCi0JCXJldHVybiBub3c7CisJCXJldHVybiAwOwogCiAJZG8gewogCQljbCA9IGNsX3ByZXYtPm5leHRfYWxpdmU7Ci0JCWlmICgobG9uZykobm93IC0gY2wtPnBlbmFsaXplZCkgPiAwKSB7CisJCWlmIChub3cgLSBjbC0+cGVuYWxpemVkID4gMCkgewogCQkJY2xfcHJldi0+bmV4dF9hbGl2ZSA9IGNsLT5uZXh0X2FsaXZlOwogCQkJY2wtPm5leHRfYWxpdmUgPSBOVUxMOwogCQkJY2wtPmNwcmlvcml0eSA9IGNsLT5wcmlvcml0eTsKQEAgLTY0MCwzMCArNjM4LDM0IEBACiAJCQl9CiAKIAkJCWNsID0gY2xfcHJldi0+bmV4dF9hbGl2ZTsKLQkJfSBlbHNlIGlmICgobG9uZykoc2NoZWQgLSBjbC0+cGVuYWxpemVkKSA+IDApCisJCX0gZWxzZSBpZiAoc2NoZWQgLSBjbC0+cGVuYWxpemVkID4gMCkKIAkJCXNjaGVkID0gY2wtPnBlbmFsaXplZDsKIAl9IHdoaWxlICgoY2xfcHJldiA9IGNsKSAhPSBxLT5hY3RpdmVbcHJpb10pOwogCi0JcmV0dXJuIChsb25nKShzY2hlZCAtIG5vdyk7CisJcmV0dXJuIHNjaGVkIC0gbm93OwogfQogCi1zdGF0aWMgdm9pZCBjYnFfdW5kZWxheSh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBjYnFfdW5kZWxheShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7Ci0Jc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCWxvbmcgZGVsYXkgPSAwOworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGNicV9zY2hlZF9kYXRhLAorCQkJCQkJZGVsYXlfdGltZXIpOworCXN0cnVjdCBRZGlzYyAqc2NoID0gcS0+d2F0Y2hkb2cucWRpc2M7CisJcHNjaGVkX3RpbWVfdCBub3c7CisJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSAwOwogCXVuc2lnbmVkIHBtYXNrOwogCisJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisKIAlwbWFzayA9IHEtPnBtYXNrOwogCXEtPnBtYXNrID0gMDsKIAogCXdoaWxlIChwbWFzaykgewogCQlpbnQgcHJpbyA9IGZmeih+cG1hc2spOwotCQlsb25nIHRtcDsKKwkJcHNjaGVkX3RkaWZmX3QgdG1wOwogCiAJCXBtYXNrICY9IH4oMTw8cHJpbyk7CiAKLQkJdG1wID0gY2JxX3VuZGVsYXlfcHJpbyhxLCBwcmlvKTsKKwkJdG1wID0gY2JxX3VuZGVsYXlfcHJpbyhxLCBwcmlvLCBub3cpOwogCQlpZiAodG1wID4gMCkgewogCQkJcS0+cG1hc2sgfD0gMTw8cHJpbzsKIAkJCWlmICh0bXAgPCBkZWxheSB8fCBkZWxheSA9PSAwKQpAQCAtNjcyLDEyICs2NzQsMTYgQEAKIAl9CiAKIAlpZiAoZGVsYXkpIHsKLQkJcS0+ZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBkZWxheTsKLQkJYWRkX3RpbWVyKCZxLT5kZWxheV90aW1lcik7CisJCWt0aW1lX3QgdGltZTsKKworCQl0aW1lID0ga3RpbWVfc2V0KDAsIDApOworCQl0aW1lID0ga3RpbWVfYWRkX25zKHRpbWUsIFBTQ0hFRF9VUzJOUyhub3cgKyBkZWxheSkpOworCQlocnRpbWVyX3N0YXJ0KCZxLT5kZWxheV90aW1lciwgdGltZSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJfQogCiAJc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwogCW5ldGlmX3NjaGVkdWxlKHNjaC0+ZGV2KTsKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiB9CiAKIApAQCAtNzMyLDcgKzczOCw3IEBACiAJaWYgKGNsICYmIHEtPnRvcGxldmVsID49IGJvcnJvd2VkLT5sZXZlbCkgewogCQlpZiAoY2wtPnEtPnEucWxlbiA+IDEpIHsKIAkJCWRvIHsKLQkJCQlpZiAoUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGJvcnJvd2VkLT51bmRlcnRpbWUpKSB7CisJCQkJaWYgKGJvcnJvd2VkLT51bmRlcnRpbWUgPT0gUFNDSEVEX1BBU1RQRVJGRUNUKSB7CiAJCQkJCXEtPnRvcGxldmVsID0gYm9ycm93ZWQtPmxldmVsOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtNzcwLDcgKzc3Niw3IEBACiAJCQkgaWRsZSA9IChub3cgLSBsYXN0KSAtIGxhc3RfcGt0bGVuL3JhdGUKIAkJICovCiAKLQkJaWRsZSA9IFBTQ0hFRF9URElGRihxLT5ub3csIGNsLT5sYXN0KTsKKwkJaWRsZSA9IHEtPm5vdyAtIGNsLT5sYXN0OwogCQlpZiAoKHVuc2lnbmVkIGxvbmcpaWRsZSA+IDEyOCoxMDI0KjEwMjQpIHsKIAkJCWF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKIAkJfSBlbHNlIHsKQEAgLTgxNCwxMyArODIwLDExIEBACiAJCQlpZGxlIC09IEwyVCgmcS0+bGluaywgbGVuKTsKIAkJCWlkbGUgKz0gTDJUKGNsLCBsZW4pOwogCi0JCQlQU0NIRURfQVVESVRfVERJRkYoaWRsZSk7Ci0KLQkJCVBTQ0hFRF9UQUREMihxLT5ub3csIGlkbGUsIGNsLT51bmRlcnRpbWUpOworCQkJY2wtPnVuZGVydGltZSA9IHEtPm5vdyArIGlkbGU7CiAJCX0gZWxzZSB7CiAJCQkvKiBVbmRlcmxpbWl0ICovCiAKLQkJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSk7CisJCQljbC0+dW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCQkJaWYgKGF2Z2lkbGUgPiBjbC0+bWF4aWRsZSkKIAkJCQljbC0+YXZnaWRsZSA9IGNsLT5tYXhpZGxlOwogCQkJZWxzZQpAQCAtODQxLDggKzg0NSw3IEBACiAJaWYgKGNsLT50cGFyZW50ID09IE5VTEwpCiAJCXJldHVybiBjbDsKIAotCWlmIChQU0NIRURfSVNfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSkgfHwKLQkgICAgIVBTQ0hFRF9UTEVTUyhxLT5ub3csIGNsLT51bmRlcnRpbWUpKSB7CisJaWYgKGNsLT51bmRlcnRpbWUgPT0gUFNDSEVEX1BBU1RQRVJGRUNUIHx8IHEtPm5vdyA+PSBjbC0+dW5kZXJ0aW1lKSB7CiAJCWNsLT5kZWxheWVkID0gMDsKIAkJcmV0dXJuIGNsOwogCX0KQEAgLTg2NSw4ICs4NjgsNyBAQAogCQl9CiAJCWlmIChjbC0+bGV2ZWwgPiBxLT50b3BsZXZlbCkKIAkJCXJldHVybiBOVUxMOwotCX0gd2hpbGUgKCFQU0NIRURfSVNfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSkgJiYKLQkJIFBTQ0hFRF9UTEVTUyhxLT5ub3csIGNsLT51bmRlcnRpbWUpKTsKKwl9IHdoaWxlIChjbC0+dW5kZXJ0aW1lICE9IFBTQ0hFRF9QQVNUUEVSRkVDVCAmJiBxLT5ub3cgPCBjbC0+dW5kZXJ0aW1lKTsKIAogCWNsLT5kZWxheWVkID0gMDsKIAlyZXR1cm4gY2w7CkBAIC0xMDAxLDggKzEwMDMsOCBAQAogCXBzY2hlZF90aW1lX3Qgbm93OwogCXBzY2hlZF90ZGlmZl90IGluY3I7CiAKLQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQlpbmNyID0gUFNDSEVEX1RESUZGKG5vdywgcS0+bm93X3J0KTsKKwlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwlpbmNyID0gbm93IC0gcS0+bm93X3J0OwogCiAJaWYgKHEtPnR4X2NsYXNzKSB7CiAJCXBzY2hlZF90ZGlmZl90IGluY3IyOwpAQCAtMTAxNCwxMiArMTAxNiwxMiBAQAogCQkgICBjYnFfdGltZSA9IG1heChyZWFsX3RpbWUsIHdvcmspOwogCQkgKi8KIAkJaW5jcjIgPSBMMlQoJnEtPmxpbmssIHEtPnR4X2xlbik7Ci0JCVBTQ0hFRF9UQUREKHEtPm5vdywgaW5jcjIpOworCQlxLT5ub3cgKz0gaW5jcjI7CiAJCWNicV91cGRhdGUocSk7CiAJCWlmICgoaW5jciAtPSBpbmNyMikgPCAwKQogCQkJaW5jciA9IDA7CiAJfQotCVBTQ0hFRF9UQUREKHEtPm5vdywgaW5jcik7CisJcS0+bm93ICs9IGluY3I7CiAJcS0+bm93X3J0ID0gbm93OwogCiAJZm9yICg7OykgewpAQCAtMTA1MSwxMSArMTA1MywxMSBAQAogCQkqLwogCiAJCWlmIChxLT50b3BsZXZlbCA9PSBUQ19DQlFfTUFYTEVWRUwgJiYKLQkJICAgIFBTQ0hFRF9JU19QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSkpCisJCSAgICBxLT5saW5rLnVuZGVydGltZSA9PSBQU0NIRURfUEFTVFBFUkZFQ1QpCiAJCQlicmVhazsKIAogCQlxLT50b3BsZXZlbCA9IFRDX0NCUV9NQVhMRVZFTDsKLQkJUFNDSEVEX1NFVF9QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSk7CisJCXEtPmxpbmsudW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCX0KIAogCS8qIE5vIHBhY2tldHMgaW4gc2NoZWR1bGVyIG9yIG5vYm9keSB3YW50cyB0byBnaXZlIHRoZW0gdG8gdXMgOi0oCkBAIC0xMDYzLDEzICsxMDY1LDkgQEAKIAogCWlmIChzY2gtPnEucWxlbikgewogCQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7Ci0JCWlmIChxLT53ZF9leHBpcmVzKSB7Ci0JCQlsb25nIGRlbGF5ID0gUFNDSEVEX1VTMkpJRkZJRShxLT53ZF9leHBpcmVzKTsKLQkJCWlmIChkZWxheSA8PSAwKQotCQkJCWRlbGF5ID0gMTsKLQkJCW1vZF90aW1lcigmcS0+d2RfdGltZXIsIGppZmZpZXMgKyBkZWxheSk7Ci0JCQlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKLQkJfQorCQlpZiAocS0+d2RfZXhwaXJlcykKKwkJCXFkaXNjX3dhdGNoZG9nX3NjaGVkdWxlKCZxLT53YXRjaGRvZywKKwkJCQkJCW5vdyArIHEtPndkX2V4cGlyZXMpOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEyNzYsMTAgKzEyNzQsMTAgQEAKIAlxLT5wbWFzayA9IDA7CiAJcS0+dHhfY2xhc3MgPSBOVUxMOwogCXEtPnR4X2JvcnJvd2VkID0gTlVMTDsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKLQlkZWxfdGltZXIoJnEtPmRlbGF5X3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKKwlocnRpbWVyX2NhbmNlbCgmcS0+ZGVsYXlfdGltZXIpOwogCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOwotCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXEtPm5vd19ydCA9IHEtPm5vdzsKIAogCWZvciAocHJpbyA9IDA7IHByaW8gPD0gVENfQ0JRX01BWFBSSU87IHByaW8rKykKQEAgLTEyOTAsNyArMTI4OCw3IEBACiAJCQlxZGlzY19yZXNldChjbC0+cSk7CiAKIAkJCWNsLT5uZXh0X2FsaXZlID0gTlVMTDsKLQkJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSk7CisJCQljbC0+dW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCQkJY2wtPmF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKIAkJCWNsLT5kZWZpY2l0ID0gY2wtPnF1YW50dW07CiAJCQljbC0+Y3ByaW9yaXR5ID0gY2wtPnByaW9yaXR5OwpAQCAtMTM3OSw3ICsxMzc3LDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JY2wtPnBlbmFsdHkgPSAob3ZsLT5wZW5hbHR5KkhaKS8xMDAwOworCWNsLT5wZW5hbHR5ID0gb3ZsLT5wZW5hbHR5OwogCXJldHVybiAwOwogfQogCkBAIC0xNDQ2LDE0ICsxNDQ0LDExIEBACiAJcS0+bGluay5taW5pZGxlID0gLTB4N0ZGRkZGRkY7CiAJcS0+bGluay5zdGF0c19sb2NrID0gJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrOwogCi0JaW5pdF90aW1lcigmcS0+d2RfdGltZXIpOwotCXEtPndkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7Ci0JcS0+d2RfdGltZXIuZnVuY3Rpb24gPSBjYnFfd2F0Y2hkb2c7Ci0JaW5pdF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOwotCXEtPmRlbGF5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CisJaHJ0aW1lcl9pbml0KCZxLT5kZWxheV90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKIAlxLT5kZWxheV90aW1lci5mdW5jdGlvbiA9IGNicV91bmRlbGF5OwogCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOwotCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXEtPm5vd19ydCA9IHEtPm5vdzsKIAogCWNicV9saW5rX2NsYXNzKCZxLT5saW5rKTsKQEAgLTE0NjcsMTkgKzE0NjIsMTkgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX3JhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCiB7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCVJUQV9QVVQoc2tiLCBUQ0FfQ0JRX1JBVEUsIHNpemVvZihjbC0+Ul90YWItPnJhdGUpLCAmY2wtPlJfdGFiLT5yYXRlKTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIAogc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX2xzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y19jYnFfbHNzb3B0IG9wdDsKIAogCW9wdC5mbGFncyA9IDA7CkBAIC0xNDk4LDEzICsxNDkzLDEzIEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF93cnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCiB7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfY2JxX3dycm9wdCBvcHQ7CiAKIAlvcHQuZmxhZ3MgPSAwOwpAQCAtMTUxNiwzMCArMTUxMSwzMCBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2JxX2R1bXBfb3ZsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9vdmwgb3B0OwogCiAJb3B0LnN0cmF0ZWd5ID0gY2wtPm92bF9zdHJhdGVneTsKIAlvcHQucHJpb3JpdHkyID0gY2wtPnByaW9yaXR5MisxOwogCW9wdC5wYWQgPSAwOwotCW9wdC5wZW5hbHR5ID0gKGNsLT5wZW5hbHR5KjEwMDApL0haOworCW9wdC5wZW5hbHR5ID0gY2wtPnBlbmFsdHk7CiAJUlRBX1BVVChza2IsIFRDQV9DQlFfT1ZMX1NUUkFURUdZLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF9mb3B0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9mb3B0IG9wdDsKIAogCWlmIChjbC0+c3BsaXQgfHwgY2wtPmRlZm1hcCkgewpAQCAtMTU1MSwxNCArMTU0NiwxNCBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2JxX2R1bXBfcG9saWNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9wb2xpY2Ugb3B0OwogCiAJaWYgKGNsLT5wb2xpY2UpIHsKQEAgLTE1NzAsNyArMTU2NSw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAjZW5kaWYKQEAgLTE1OTIsMTggKzE1ODcsMTggQEAKIHN0YXRpYyBpbnQgY2JxX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoY2JxX2R1bXBfYXR0cihza2IsICZxLT5saW5rKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjIxLDcgKzE2MTYsNyBAQAogCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKIHsKIAlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzKilhcmc7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAoY2wtPnRwYXJlbnQpCkBAIC0xNjM1LDExICsxNjMwLDExIEBACiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoY2JxX2R1bXBfYXR0cihza2IsIGNsKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjU0LDggKzE2NDksOCBAQAogCWNsLT54c3RhdHMuYXZnaWRsZSA9IGNsLT5hdmdpZGxlOwogCWNsLT54c3RhdHMudW5kZXJ0aW1lID0gMDsKIAotCWlmICghUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpKQotCQljbC0+eHN0YXRzLnVuZGVydGltZSA9IFBTQ0hFRF9URElGRihjbC0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCWlmIChjbC0+dW5kZXJ0aW1lICE9IFBTQ0hFRF9QQVNUUEVSRkVDVCkKKwkJY2wtPnhzdGF0cy51bmRlcnRpbWUgPSBjbC0+dW5kZXJ0aW1lIC0gcS0+bm93OwogCiAJaWYgKGduZXRfc3RhdHNfY29weV9iYXNpYyhkLCAmY2wtPmJzdGF0cykgPCAwIHx8CiAjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKQEAgLTE3MjIsMjMgKzE3MTcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2JxX2Rlc3Ryb3lfZmlsdGVycyhzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKLXsKLQlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKLQotCXdoaWxlICgodHAgPSBjbC0+ZmlsdGVyX2xpc3QpICE9IE5VTEwpIHsKLQkJY2wtPmZpbHRlcl9saXN0ID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGNicV9kZXN0cm95X2NsYXNzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKIAlCVUdfVFJBUCghY2wtPmZpbHRlcnMpOwogCi0JY2JxX2Rlc3Ryb3lfZmlsdGVycyhjbCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oY2wtPmZpbHRlcl9saXN0KTsKIAlxZGlzY19kZXN0cm95KGNsLT5xKTsKIAlxZGlzY19wdXRfcnRhYihjbC0+Ul90YWIpOwogI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCkBAIC0xNzY1LDcgKzE3NTAsNyBAQAogCSAqLwogCWZvciAoaCA9IDA7IGggPCAxNjsgaCsrKQogCQlmb3IgKGNsID0gcS0+Y2xhc3Nlc1toXTsgY2w7IGNsID0gY2wtPm5leHQpCi0JCQljYnFfZGVzdHJveV9maWx0ZXJzKGNsKTsKKwkJCXRjZl9kZXN0cm95X2NoYWluKGNsLT5maWx0ZXJfbGlzdCk7CiAKIAlmb3IgKGggPSAwOyBoIDwgMTY7IGgrKykgewogCQlzdHJ1Y3QgY2JxX2NsYXNzICpuZXh0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9kc21hcmsuYyBiL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMKaW5kZXggOTYzMjRjZi4uM2M2ZmQxOCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9kc21hcmsuYworKysgYi9uZXQvc2NoZWQvc2NoX2RzbWFyay5jCkBAIC0yMTYsMTcgKzIxNiwxNyBAQAogCQkvKiBGSVhNRTogU2FmZSB3aXRoIG5vbi1saW5lYXIgc2ticz8gLS1SUiAqLwogCQlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKIAkJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCQkJc2tiLT50Y19pbmRleCA9IGlwdjRfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcGgpCisJCQkJc2tiLT50Y19pbmRleCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBfaGRyKHNrYikpCiAJCQkJCSYgfklORVRfRUNOX01BU0s7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6Ci0JCQkJc2tiLT50Y19pbmRleCA9IGlwdjZfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcHY2aCkKKwkJCQlza2ItPnRjX2luZGV4ID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2X2hkcihza2IpKQogCQkJCQkmIH5JTkVUX0VDTl9NQVNLOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlza2ItPnRjX2luZGV4ID0gMDsKIAkJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIAogCWlmIChUQ19IX01BSihza2ItPnByaW9yaXR5KSA9PSBzY2gtPmhhbmRsZSkKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkJCWlmIChwLT5kZWZhdWx0X2luZGV4ICE9IE5PX0RFRkFVTFRfSU5ERVgpCiAJCQkJCXNrYi0+dGNfaW5kZXggPSBwLT5kZWZhdWx0X2luZGV4OwogCQkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogCiAJZXJyID0gcC0+cS0+ZW5xdWV1ZShza2IscC0+cSk7CkBAIC0yOTIsMTEgKzI5MiwxMSBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKHNrYi0+bmguaXBoLCBwLT5tYXNrW2luZGV4XSwKKwkJCWlwdjRfY2hhbmdlX2RzZmllbGQoaXBfaGRyKHNrYiksIHAtPm1hc2tbaW5kZXhdLAogCQkJCQkgICAgcC0+dmFsdWVbaW5kZXhdKTsKIAkJCWJyZWFrOwogCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6Ci0JCQlpcHY2X2NoYW5nZV9kc2ZpZWxkKHNrYi0+bmguaXB2NmgsIHAtPm1hc2tbaW5kZXhdLAorCQkJaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2X2hkcihza2IpLCBwLT5tYXNrW2luZGV4XSwKIAkJCQkJICAgIHAtPnZhbHVlW2luZGV4XSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTMxMCw3ICszMTAsNyBAQAogCQkJCSAgICAgICAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgJWRcbiIsCiAJCQkJICAgICAgIG50b2hzKHNrYi0+cHJvdG9jb2wpKTsKIAkJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHNrYjsKIH0KQEAgLTQxMiwxNiArNDEyLDEwIEBACiBzdGF0aWMgdm9pZCBkc21hcmtfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7Ci0Jc3RydWN0IHRjZl9wcm90byAqdHA7CiAKIAlEUFJJTlRLKCJkc21hcmtfZGVzdHJveShzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNjaCwgcCk7CiAKLQl3aGlsZSAocC0+ZmlsdGVyX2xpc3QpIHsKLQkJdHAgPSBwLT5maWx0ZXJfbGlzdDsKLQkJcC0+ZmlsdGVyX2xpc3QgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KLQorCXRjZl9kZXN0cm95X2NoYWluKHAtPmZpbHRlcl9saXN0KTsKIAlxZGlzY19kZXN0cm95KHAtPnEpOwogCWtmcmVlKHAtPm1hc2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCA1MmViMzQzLi4zMzg1ZWU1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMzYsMzQgKzM2LDI3IEBACiAKIC8qIE1haW4gdHJhbnNtaXNzaW9uIHF1ZXVlLiAqLwogCi0vKiBNYWluIHFkaXNjIHN0cnVjdHVyZSBsb2NrLgotCi0gICBIb3dldmVyLCBtb2RpZmljYXRpb25zCi0gICB0byBkYXRhLCBwYXJ0aWNpcGF0aW5nIGluIHNjaGVkdWxpbmcgbXVzdCBiZSBhZGRpdGlvbmFsbHkKLSAgIHByb3RlY3RlZCB3aXRoIGRldi0+cXVldWVfbG9jayBzcGlubG9jay4KLQotICAgVGhlIGlkZWEgaXMgdGhlIGZvbGxvd2luZzoKLSAgIC0gZW5xdWV1ZSwgZGVxdWV1ZSBhcmUgc2VyaWFsaXplZCB2aWEgdG9wIGxldmVsIGRldmljZQotICAgICBzcGlubG9jayBkZXYtPnF1ZXVlX2xvY2suCi0gICAtIHRyZWUgd2Fsa2luZyBpcyBwcm90ZWN0ZWQgYnkgcmVhZF9sb2NrKHFkaXNjX3RyZWVfbG9jaykKLSAgICAgYW5kIHRoaXMgbG9jayBpcyB1c2VkIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgotICAgLSB1cGRhdGVzIHRvIHRyZWUgYXJlIG1hZGUgb25seSB1bmRlciBydG5sIHNlbWFwaG9yZSwKLSAgICAgaGVuY2UgdGhpcyBsb2NrIG1heSBiZSBtYWRlIHdpdGhvdXQgbG9jYWwgYmggZGlzYWJsaW5nLgotCi0gICBxZGlzY190cmVlX2xvY2sgbXVzdCBiZSBncmFiYmVkIEJFRk9SRSBkZXYtPnF1ZXVlX2xvY2shCisvKiBNb2RpZmljYXRpb25zIHRvIGRhdGEgcGFydGljaXBhdGluZyBpbiBzY2hlZHVsaW5nIG11c3QgYmUgcHJvdGVjdGVkIHdpdGgKKyAqIGRldi0+cXVldWVfbG9jayBzcGlubG9jay4KKyAqCisgKiBUaGUgaWRlYSBpcyB0aGUgZm9sbG93aW5nOgorICogLSBlbnF1ZXVlLCBkZXF1ZXVlIGFyZSBzZXJpYWxpemVkIHZpYSB0b3AgbGV2ZWwgZGV2aWNlCisgKiAgIHNwaW5sb2NrIGRldi0+cXVldWVfbG9jay4KKyAqIC0gaW5ncmVzcyBmaWx0ZXJpbmcgaXMgc2VyaWFsaXplZCB2aWEgdG9wIGxldmVsIGRldmljZQorICogICBzcGlubG9jayBkZXYtPmluZ3Jlc3NfbG9jay4KKyAqIC0gdXBkYXRlcyB0byB0cmVlIGFuZCB0cmVlIHdhbGtpbmcgYXJlIG9ubHkgZG9uZSB1bmRlciB0aGUgcnRubCBtdXRleC4KICAqLwotREVGSU5FX1JXTE9DSyhxZGlzY190cmVlX2xvY2spOwogCiB2b2lkIHFkaXNjX2xvY2tfdHJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXdyaXRlX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCXNwaW5fbG9jaygmZGV2LT5pbmdyZXNzX2xvY2spOwogfQogCiB2b2lkIHFkaXNjX3VubG9ja190cmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3Bpbl91bmxvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKLQl3cml0ZV91bmxvY2soJnFkaXNjX3RyZWVfbG9jayk7CiB9CiAKIC8qCkBAIC00NDIsNyArNDM1LDYgQEAKIAlzY2gtPmRlcXVldWUgPSBvcHMtPmRlcXVldWU7CiAJc2NoLT5kZXYgPSBkZXY7CiAJZGV2X2hvbGQoZGV2KTsKLQlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwogCWF0b21pY19zZXQoJnNjaC0+cmVmY250LCAxKTsKIAogCXJldHVybiBzY2g7CkBAIC00NTgsNiArNDUwLDcgQEAKIAlzY2ggPSBxZGlzY19hbGxvYyhkZXYsIG9wcyk7CiAJaWYgKElTX0VSUihzY2gpKQogCQlnb3RvIGVycm91dDsKKwlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwogCXNjaC0+cGFyZW50ID0gcGFyZW50aWQ7CiAKIAlpZiAoIW9wcy0+aW5pdCB8fCBvcHMtPmluaXQoc2NoLCBOVUxMKSA9PSAwKQpAQCAtNTI4LDE1ICs1MjEsMTEgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogYWN0aXZhdGlvbiBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJd3JpdGVfbG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAkJCWxpc3RfYWRkX3RhaWwoJnFkaXNjLT5saXN0LCAmZGV2LT5xZGlzY19saXN0KTsKLQkJCXdyaXRlX3VubG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXFkaXNjID0gICZub3F1ZXVlX3FkaXNjOwogCQl9Ci0JCXdyaXRlX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJCWRldi0+cWRpc2Nfc2xlZXBpbmcgPSBxZGlzYzsKLQkJd3JpdGVfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCX0KIAogCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwppbmRleCA0MDdjNmZiLi45ZDEyNGM0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2hmc2MuYworKysgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwpAQCAtNTksMTMgKzU5LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTE5MiwyMyArMTkyLDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRyb3BsaXN0OwkJLyogYWN0aXZlIGxlYWYgY2xhc3MgbGlzdCAoZm9yCiAJCQkJCQkgICBkcm9wcGluZykgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJlcXVldWU7CQkvKiByZXF1ZXVlZCBwYWNrZXQgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB3ZF90aW1lcjsJCS8qIHdhdGNoZG9nIHRpbWVyICovCisJc3RydWN0IHFkaXNjX3dhdGNoZG9nIHdhdGNoZG9nOwkJLyogd2F0Y2hkb2cgdGltZXIgKi8KIH07CiAKLS8qCi0gKiBtYWNyb3MKLSAqLwotI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jdW5kZWYgUFNDSEVEX0dFVF9USU1FCi0jZGVmaW5lIFBTQ0hFRF9HRVRfVElNRShzdGFtcCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXN0cnVjdCB0aW1ldmFsIHR2OwkJCQkJCVwKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsJCQkJCQlcCi0JKHN0YW1wKSA9IDFVTEwgKiBVU0VDX1BFUl9TRUMgKiB0di50dl9zZWMgKyB0di50dl91c2VjOwkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjZGVmaW5lCUhUX0lORklOSVRZCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTAkvKiBpbmZpbml0ZSB0aW1lIHZhbHVlICovCiAKIApAQCAtMzk0LDI4ICszODAsMTcgQEAKICAqCWlzbTogKHBzY2hlZF91cy9ieXRlKSA8PCBJU01fU0hJRlQKICAqCWR4OiBwc2NoZWRfdXMKICAqCi0gKiBDbG9jayBzb3VyY2UgcmVzb2x1dGlvbiAoQ09ORklHX05FVF9TQ0hfQ0xLXyopCi0gKiAgSklGRklFUzogZm9yIDQ4PD1IWjw9MTUzNCByZXNvbHV0aW9uIGlzIGJldHdlZW4gMC42M3VzIGFuZCAxLjI3dXMuCi0gKiAgQ1BVOiByZXNvbHV0aW9uIGlzIGJldHdlZW4gMC41dXMgYW5kIDF1cy4KLSAqICBHRVRUSU1FT0ZEQVk6IHJlc29sdXRpb24gaXMgZXhhY3RseSAxdXMuCisgKiBUaGUgY2xvY2sgc291cmNlIHJlc29sdXRpb24gd2l0aCBrdGltZSBpcyAxLjAyNHVzLgogICoKICAqIHNtIGFuZCBpc20gYXJlIHNjYWxlZCBpbiBvcmRlciB0byBrZWVwIGVmZmVjdGl2ZSBkaWdpdHMuCiAgKiBTTV9TSElGVCBhbmQgSVNNX1NISUZUIGFyZSBzZWxlY3RlZCB0byBrZWVwIGF0IGxlYXN0IDQgZWZmZWN0aXZlCiAgKiBkaWdpdHMgaW4gZGVjaW1hbCB1c2luZyB0aGUgZm9sbG93aW5nIHRhYmxlLgogICoKLSAqIE5vdGU6IFdlIGNhbiBhZmZvcmQgdGhlIGFkZGl0aW9uYWwgYWNjdXJhY3kgKGFsdHEgaGZzYyBrZWVwcyBhdCBtb3N0Ci0gKiAzIGVmZmVjdGl2ZSBkaWdpdHMpIHRoYW5rcyB0byB0aGUgZmFjdCB0aGF0IGxpbnV4IGNsb2NrIGlzIGJvdW5kZWQKLSAqIG11Y2ggbW9yZSB0aWdodGx5LgotICoKICAqICBiaXRzL3NlYyAgICAgIDEwMEticHMgICAgIDFNYnBzICAgICAxME1icHMgICAgIDEwME1icHMgICAgMUdicHMKICAqICAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIGJ5dGVzLzAuNXVzICAgNi4yNWUtMyAgICA2Mi41ZS0zICAgIDYyNWUtMyAgICAgNjI1MGUtZSAgICA2MjUwMGUtMwotICogIGJ5dGVzL3VzICAgICAgMTIuNWUtMyAgICAxMjVlLTMgICAgIDEyNTBlLTMgICAgMTI1MDBlLTMgICAxMjUwMDBlLTMKLSAqICBieXRlcy8xLjI3dXMgIDE1Ljg3NWUtMyAgMTU4Ljc1ZS0zICAxNTg3LjVlLTMgIDE1ODc1ZS0zICAgMTU4NzUwZS0zCisgKiAgYnl0ZXMvMS4wMjR1cyAxMi44ZS0zICAgIDEyOGUtMyAgICAgMTI4MGUtMyAgICAxMjgwMGUtMyAgIDEyODAwMGUtMwogICoKLSAqICAwLjV1cy9ieXRlICAgIDE2MCAgICAgICAgMTYgICAgICAgICAxLjYgICAgICAgIDAuMTYgICAgICAgMC4wMTYKLSAqICB1cy9ieXRlICAgICAgIDgwICAgICAgICAgOCAgICAgICAgICAwLjggICAgICAgIDAuMDggICAgICAgMC4wMDgKLSAqICAxLjI3dXMvYnl0ZSAgIDYzICAgICAgICAgNi4zICAgICAgICAwLjYzICAgICAgIDAuMDYzICAgICAgMC4wMDYzCisgKiAgMS4wMjR1cy9ieXRlICA3OC4xMjUgICAgIDcuODEyNSAgICAgMC43ODEyNSAgICAwLjA3ODEyNSAgIDAuMDA3ODEyNQogICovCiAjZGVmaW5lCVNNX1NISUZUCTIwCiAjZGVmaW5lCUlTTV9TSElGVAkxOApAQCAtNDYwLDggKzQzNSw4IEBACiAJdTY0IHNtOwogCiAJc20gPSAoKHU2NCltIDw8IFNNX1NISUZUKTsKLQlzbSArPSBQU0NIRURfSklGRklFMlVTKEhaKSAtIDE7Ci0JZG9fZGl2KHNtLCBQU0NIRURfSklGRklFMlVTKEhaKSk7CisJc20gKz0gUFNDSEVEX1RJQ0tTX1BFUl9TRUMgLSAxOworCWRvX2RpdihzbSwgUFNDSEVEX1RJQ0tTX1BFUl9TRUMpOwogCXJldHVybiBzbTsKIH0KIApAQCAtNDc0LDcgKzQ0OSw3IEBACiAJaWYgKG0gPT0gMCkKIAkJaXNtID0gSFRfSU5GSU5JVFk7CiAJZWxzZSB7Ci0JCWlzbSA9ICgodTY0KVBTQ0hFRF9KSUZGSUUyVVMoSFopIDw8IElTTV9TSElGVCk7CisJCWlzbSA9ICgodTY0KVBTQ0hFRF9USUNLU19QRVJfU0VDIDw8IElTTV9TSElGVCk7CiAJCWlzbSArPSBtIC0gMTsKIAkJZG9fZGl2KGlzbSwgbSk7CiAJfQpAQCAtNDg3LDcgKzQ2Miw3IEBACiB7CiAJdTY0IGR4OwogCi0JZHggPSAoKHU2NClkICogUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCWR4ID0gKCh1NjQpZCAqIFBTQ0hFRF9USUNLU19QRVJfU0VDKTsKIAlkeCArPSBVU0VDX1BFUl9TRUMgLSAxOwogCWRvX2RpdihkeCwgVVNFQ19QRVJfU0VDKTsKIAlyZXR1cm4gZHg7CkBAIC00OTksNyArNDc0LDcgQEAKIHsKIAl1NjQgbTsKIAotCW0gPSAoc20gKiBQU0NIRURfSklGRklFMlVTKEhaKSkgPj4gU01fU0hJRlQ7CisJbSA9IChzbSAqIFBTQ0hFRF9USUNLU19QRVJfU0VDKSA+PiBTTV9TSElGVDsKIAlyZXR1cm4gKHUzMiltOwogfQogCkBAIC01MTAsNyArNDg1LDcgQEAKIAl1NjQgZDsKIAogCWQgPSBkeCAqIFVTRUNfUEVSX1NFQzsKLQlkb19kaXYoZCwgUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCWRvX2RpdihkLCBQU0NIRURfVElDS1NfUEVSX1NFQyk7CiAJcmV0dXJuICh1MzIpZDsKIH0KIApAQCAtNjU0LDkgKzYyOSw3IEBACiBzdGF0aWMgdm9pZAogaW5pdF9lZChzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHVuc2lnbmVkIGludCBuZXh0X2xlbikKIHsKLQl1NjQgY3VyX3RpbWU7Ci0KLQlQU0NIRURfR0VUX1RJTUUoY3VyX3RpbWUpOworCXU2NCBjdXJfdGltZSA9IHBzY2hlZF9nZXRfdGltZSgpOwogCiAJLyogdXBkYXRlIHRoZSBkZWFkbGluZSBjdXJ2ZSAqLwogCXJ0c2NfbWluKCZjbC0+Y2xfZGVhZGxpbmUsICZjbC0+Y2xfcnNjLCBjdXJfdGltZSwgY2wtPmNsX2N1bXVsKTsKQEAgLTc3OSw3ICs3NTIsNyBAQAogCQkJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfVVNDKSB7CiAJCQkJLyogY2xhc3MgaGFzIHVwcGVyIGxpbWl0IGN1cnZlICovCiAJCQkJaWYgKGN1cl90aW1lID09IDApCi0JCQkJCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisJCQkJCWN1cl90aW1lID0gcHNjaGVkX2dldF90aW1lKCk7CiAKIAkJCQkvKiB1cGRhdGUgdGhlIHVsaW1pdCBjdXJ2ZSAqLwogCQkJCXJ0c2NfbWluKCZjbC0+Y2xfdWxpbWl0LCAmY2wtPmNsX3VzYywgY3VyX3RpbWUsCkBAIC0xMDYzLDcgKzEwMzYsNyBAQAogCQkJaWYgKGNsLT5jbF9wYXJlbnQgPT0gTlVMTCAmJiBwYXJlbnRpZCAhPSBUQ19IX1JPT1QpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJUFNDSEVEX0dFVF9USU1FKGN1cl90aW1lKTsKKwkJY3VyX3RpbWUgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCQlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJCWlmIChyc2MgIT0gTlVMTCkKQEAgLTExNDksMjIgKzExMjIsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLWhmc2NfZGVzdHJveV9maWx0ZXJzKHN0cnVjdCB0Y2ZfcHJvdG8gKipmbCkKLXsKLQlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKLQotCXdoaWxlICgodHAgPSAqZmwpICE9IE5VTEwpIHsKLQkJKmZsID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCiBoZnNjX2Rlc3Ryb3lfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAotCWhmc2NfZGVzdHJveV9maWx0ZXJzKCZjbC0+ZmlsdGVyX2xpc3QpOworCXRjZl9kZXN0cm95X2NoYWluKGNsLT5maWx0ZXJfbGlzdCk7CiAJcWRpc2NfZGVzdHJveShjbC0+cWRpc2MpOwogI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCiAJZ2VuX2tpbGxfZXN0aW1hdG9yKCZjbC0+YnN0YXRzLCAmY2wtPnJhdGVfZXN0KTsKQEAgLTEzODksNyArMTM1MSw3IEBACiAJCXN0cnVjdCB0Y21zZyAqdGNtKQogewogCXN0cnVjdCBoZnNjX2NsYXNzICpjbCA9IChzdHJ1Y3QgaGZzY19jbGFzcyAqKWFyZzsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhID0gKHN0cnVjdCBydGF0dHIgKiliOwogCiAJdGNtLT50Y21fcGFyZW50ID0gY2wtPmNsX3BhcmVudCA/IGNsLT5jbF9wYXJlbnQtPmNsYXNzaWQgOiBUQ19IX1JPT1Q7CkBAIC0xNDAwLDExICsxMzYyLDExIEBACiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoaGZzY19kdW1wX2N1cnZlcyhza2IsIGNsKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTQ1OSwyMSArMTQyMSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotaGZzY193YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgUWRpc2MgKnNjaCA9IChzdHJ1Y3QgUWRpc2MgKilhcmc7Ci0KLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZAotaGZzY19zY2hlZHVsZV93YXRjaGRvZyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTY0IGN1cl90aW1lKQoraGZzY19zY2hlZHVsZV93YXRjaGRvZyhzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3QgaGZzY19jbGFzcyAqY2w7CiAJdTY0IG5leHRfdGltZSA9IDA7Ci0JbG9uZyBkZWxheTsKIAogCWlmICgoY2wgPSBlbHRyZWVfZ2V0X21pbmVsKHEpKSAhPSBOVUxMKQogCQluZXh0X3RpbWUgPSBjbC0+Y2xfZTsKQEAgLTE0ODIsMTEgKzE0MzQsNyBAQAogCQkJbmV4dF90aW1lID0gcS0+cm9vdC5jbF9jZm1pbjsKIAl9CiAJV0FSTl9PTihuZXh0X3RpbWUgPT0gMCk7Ci0JZGVsYXkgPSBuZXh0X3RpbWUgLSBjdXJfdGltZTsKLQlkZWxheSA9IFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpOwotCi0Jc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7Ci0JbW9kX3RpbWVyKCZxLT53ZF90aW1lciwgamlmZmllcyArIGRlbGF5KTsKKwlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csIG5leHRfdGltZSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE1MjMsOSArMTQ3MSw3IEBACiAKIAlsaXN0X2FkZCgmcS0+cm9vdC5obGlzdCwgJnEtPmNsaGFzaFtoZnNjX2hhc2gocS0+cm9vdC5jbGFzc2lkKV0pOwogCi0JaW5pdF90aW1lcigmcS0+d2RfdGltZXIpOwotCXEtPndkX3RpbWVyLmZ1bmN0aW9uID0gaGZzY193YXRjaGRvZzsKLQlxLT53ZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOworCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTk1LDggKzE1NDEsNyBAQAogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5yZXF1ZXVlKTsKIAlxLT5lbGlnaWJsZSA9IFJCX1JPT1Q7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPmRyb3BsaXN0KTsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiAJc2NoLT5xLnFsZW4gPSAwOwogfQogCkBAIC0xNjEyLDE0ICsxNTU3LDE0IEBACiAJCQloZnNjX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7CiAJfQogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5yZXF1ZXVlKTsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKIH0KIAogc3RhdGljIGludAogaGZzY19kdW1wX3FkaXNjKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfaGZzY19xb3B0IHFvcHQ7CiAKIAlxb3B0LmRlZmNscyA9IHEtPmRlZmNsczsKQEAgLTE2MjcsNyArMTU3Miw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiAgcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjgxLDcgKzE2MjYsNyBAQAogCWlmICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+cmVxdWV1ZSkpKQogCQlnb3RvIG91dDsKIAotCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisJY3VyX3RpbWUgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCS8qCiAJICogaWYgdGhlcmUgYXJlIGVsaWdpYmxlIGNsYXNzZXMsIHVzZSByZWFsLXRpbWUgY3JpdGVyaWEuCkBAIC0xNjk4LDcgKzE2NDMsNyBAQAogCQljbCA9IHZ0dHJlZV9nZXRfbWludnQoJnEtPnJvb3QsIGN1cl90aW1lKTsKIAkJaWYgKGNsID09IE5VTEwpIHsKIAkJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKLQkJCWhmc2Nfc2NoZWR1bGVfd2F0Y2hkb2coc2NoLCBjdXJfdGltZSk7CisJCQloZnNjX3NjaGVkdWxlX3dhdGNoZG9nKHNjaCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDNjMzI5NGQuLjk5YmNlYzggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CkBAIC0xMjgsNyArMTI5LDcgQEAKIAl9IHVuOwogCXN0cnVjdCByYl9ub2RlIG5vZGVbVENfSFRCX05VTVBSSU9dOwkvKiBub2RlIGZvciBzZWxmIG9yIGZlZWQgdHJlZSAqLwogCXN0cnVjdCByYl9ub2RlIHBxX25vZGU7CS8qIG5vZGUgZm9yIGV2ZW50IHF1ZXVlICovCi0JdW5zaWduZWQgbG9uZyBwcV9rZXk7CS8qIHRoZSBzYW1lIHR5cGUgYXMgamlmZmllcyBnbG9iYWwgKi8KKwlwc2NoZWRfdGltZV90IHBxX2tleTsKIAogCWludCBwcmlvX2FjdGl2aXR5OwkvKiBmb3Igd2hpY2ggcHJpb3MgYXJlIHdlIGFjdGl2ZSAqLwogCWVudW0gaHRiX2Ntb2RlIGNtb2RlOwkvKiBjdXJyZW50IG1vZGUgb2YgdGhlIGNsYXNzICovCkBAIC0xNzksMTAgKzE4MCw3IEBACiAJc3RydWN0IHJiX3Jvb3Qgd2FpdF9wcVtUQ19IVEJfTUFYREVQVEhdOwogCiAJLyogdGltZSBvZiBuZWFyZXN0IGV2ZW50IHBlciBsZXZlbCAocm93KSAqLwotCXVuc2lnbmVkIGxvbmcgbmVhcl9ldl9jYWNoZVtUQ19IVEJfTUFYREVQVEhdOwotCi0JLyogY2FjaGVkIHZhbHVlIG9mIGppZmZpZXMgaW4gZGVxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcgamlmZmllczsKKwlwc2NoZWRfdGltZV90IG5lYXJfZXZfY2FjaGVbVENfSFRCX01BWERFUFRIXTsKIAogCS8qIHdoZXRoZXIgd2UgaGl0IG5vbi13b3JrIGNvbnNlcnZpbmcgY2xhc3MgZHVyaW5nIHRoaXMgZGVxdWV1ZTsgd2UgdXNlICovCiAJaW50IG53Y19oaXQ7CQkvKiB0aGlzIHRvIGRpc2FibGUgbWluZGVsYXkgY29tcGxhaW50IGluIGRlcXVldWUgKi8KQEAgLTE5NSw3ICsxOTMsNyBAQAogCiAJaW50IHJhdGUycXVhbnR1bTsJLyogcXVhbnQgPSByYXRlIC8gcmF0ZTJxdWFudHVtICovCiAJcHNjaGVkX3RpbWVfdCBub3c7CS8qIGNhY2hlZCBkZXF1ZXVlIHRpbWUgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogc2VuZCBkZWxheSB0aW1lciAqLworCXN0cnVjdCBxZGlzY193YXRjaGRvZyB3YXRjaGRvZzsKICNpZmRlZiBIVEJfUkFURUNNCiAJc3RydWN0IHRpbWVyX2xpc3QgcnR0aW07CS8qIHJhdGUgY29tcHV0ZXIgdGltZXIgKi8KIAlpbnQgcmVjbXBfYnVja2V0OwkvKiB3aGljaCBoYXNoIGJ1Y2tldCB0byByZWNvbXB1dGUgbmV4dCAqLwpAQCAtMzQyLDE5ICszNDAsMTkgQEAKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcS0+d2FpdF9wcVtjbC0+bGV2ZWxdLnJiX25vZGUsICpwYXJlbnQgPSBOVUxMOwogCi0JY2wtPnBxX2tleSA9IHEtPmppZmZpZXMgKyBQU0NIRURfVVMySklGRklFKGRlbGF5KTsKLQlpZiAoY2wtPnBxX2tleSA9PSBxLT5qaWZmaWVzKQorCWNsLT5wcV9rZXkgPSBxLT5ub3cgKyBkZWxheTsKKwlpZiAoY2wtPnBxX2tleSA9PSBxLT5ub3cpCiAJCWNsLT5wcV9rZXkrKzsKIAogCS8qIHVwZGF0ZSB0aGUgbmVhcmVzdCBldmVudCBjYWNoZSAqLwotCWlmICh0aW1lX2FmdGVyKHEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSwgY2wtPnBxX2tleSkpCisJaWYgKHEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSA+IGNsLT5wcV9rZXkpCiAJCXEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSA9IGNsLT5wcV9rZXk7CiAKIAl3aGlsZSAoKnApIHsKIAkJc3RydWN0IGh0Yl9jbGFzcyAqYzsKIAkJcGFyZW50ID0gKnA7CiAJCWMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBodGJfY2xhc3MsIHBxX25vZGUpOwotCQlpZiAodGltZV9hZnRlcl9lcShjbC0+cHFfa2V5LCBjLT5wcV9rZXkpKQorCQlpZiAoY2wtPnBxX2tleSA+PSBjLT5wcV9rZXkpCiAJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CiAJCWVsc2UKIAkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwpAQCAtNjc5LDE0ICs2NzcsNiBAQAogCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOwogfQogCi1zdGF0aWMgdm9pZCBodGJfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOwotCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKLQl3bWIoKTsKLQluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Ci19Ci0KICNpZmRlZiBIVEJfUkFURUNNCiAjZGVmaW5lIFJUX0dFTihELFIpIFIrPUQtKFIvSFRCX0VXTUFDKTtEPTAKIHN0YXRpYyB2b2lkIGh0Yl9yYXRlX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtNzM5LDcgKzcyOSw3IEBACiAJY2wtPlQgPSB0b2tzCiAKIAl3aGlsZSAoY2wpIHsKLQkJZGlmZiA9IFBTQ0hFRF9URElGRl9TQUZFKHEtPm5vdywgY2wtPnRfYywgKHUzMikgY2wtPm1idWZmZXIpOworCQlkaWZmID0gcHNjaGVkX3RkaWZmX2JvdW5kZWQocS0+bm93LCBjbC0+dF9jLCBjbC0+bWJ1ZmZlcik7CiAJCWlmIChjbC0+bGV2ZWwgPj0gbGV2ZWwpIHsKIAkJCWlmIChjbC0+bGV2ZWwgPT0gbGV2ZWwpCiAJCQkJY2wtPnhzdGF0cy5sZW5kcysrOwpAQCAtNzc4LDExICs3NjgsMTEgQEAKIC8qKgogICogaHRiX2RvX2V2ZW50cyAtIG1ha2UgbW9kZSBjaGFuZ2VzIHRvIGNsYXNzZXMgYXQgdGhlIGxldmVsCiAgKgotICogU2NhbnMgZXZlbnQgcXVldWUgZm9yIHBlbmRpbmcgZXZlbnRzIGFuZCBhcHBsaWVzIHRoZW0uIFJldHVybnMgamlmZmllcyB0bworICogU2NhbnMgZXZlbnQgcXVldWUgZm9yIHBlbmRpbmcgZXZlbnRzIGFuZCBhcHBsaWVzIHRoZW0uIFJldHVybnMgdGltZSBvZgogICogbmV4dCBwZW5kaW5nIGV2ZW50ICgwIGZvciBubyBldmVudCBpbiBwcSkuCi0gKiBOb3RlOiBBcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkgPD0gamlmZmllcy4KKyAqIE5vdGU6IEFwcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkgPD0gcS0+bm93LgogICovCi1zdGF0aWMgbG9uZyBodGJfZG9fZXZlbnRzKHN0cnVjdCBodGJfc2NoZWQgKnEsIGludCBsZXZlbCkKK3N0YXRpYyBwc2NoZWRfdGltZV90IGh0Yl9kb19ldmVudHMoc3RydWN0IGh0Yl9zY2hlZCAqcSwgaW50IGxldmVsKQogewogCWludCBpOwogCkBAIC03OTUsMTggKzc4NSwxOCBAQAogCQkJcmV0dXJuIDA7CiAKIAkJY2wgPSByYl9lbnRyeShwLCBzdHJ1Y3QgaHRiX2NsYXNzLCBwcV9ub2RlKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoY2wtPnBxX2tleSwgcS0+amlmZmllcykpIHsKLQkJCXJldHVybiBjbC0+cHFfa2V5IC0gcS0+amlmZmllczsKLQkJfQorCQlpZiAoY2wtPnBxX2tleSA+IHEtPm5vdykKKwkJCXJldHVybiBjbC0+cHFfa2V5OworCiAJCWh0Yl9zYWZlX3JiX2VyYXNlKHAsIHEtPndhaXRfcHEgKyBsZXZlbCk7Ci0JCWRpZmYgPSBQU0NIRURfVERJRkZfU0FGRShxLT5ub3csIGNsLT50X2MsICh1MzIpIGNsLT5tYnVmZmVyKTsKKwkJZGlmZiA9IHBzY2hlZF90ZGlmZl9ib3VuZGVkKHEtPm5vdywgY2wtPnRfYywgY2wtPm1idWZmZXIpOwogCQlodGJfY2hhbmdlX2NsYXNzX21vZGUocSwgY2wsICZkaWZmKTsKIAkJaWYgKGNsLT5jbW9kZSAhPSBIVEJfQ0FOX1NFTkQpCiAJCQlodGJfYWRkX3RvX3dhaXRfdHJlZShxLCBjbCwgZGlmZik7CiAJfQogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImh0YjogdG9vIG1hbnkgZXZlbnRzICFcbiIpOwotCXJldHVybiBIWiAvIDEwOworCXJldHVybiBxLT5ub3cgKyBQU0NIRURfVElDS1NfUEVSX1NFQyAvIDEwOwogfQogCiAvKiBSZXR1cm5zIGNsYXNzLT5ub2RlK3ByaW8gZnJvbSBpZC10cmVlIHdoZXJlIGNsYXNzZSdzIGlkIGlzID49IGlkLiBOVUxMCkBAIC05NTgsMzAgKzk0OCwxMiBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyB2b2lkIGh0Yl9kZWxheV9ieShzdHJ1Y3QgUWRpc2MgKnNjaCwgbG9uZyBkZWxheSkKLXsKLQlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCWlmIChkZWxheSA8PSAwKQotCQlkZWxheSA9IDE7Ci0JaWYgKHVubGlrZWx5KGRlbGF5ID4gNSAqIEhaKSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFRCIGRlbGF5ICVsZCA+IDVzZWNcbiIsIGRlbGF5KTsKLQkJZGVsYXkgPSA1ICogSFo7Ci0JfQotCS8qIHdoeSBkb24ndCB1c2UgamlmZmllcyBoZXJlID8gYmVjYXVzZSBleHBpcmVzIGNhbiBiZSBpbiBwYXN0ICovCi0JbW9kX3RpbWVyKCZxLT50aW1lciwgcS0+amlmZmllcyArIGRlbGF5KTsKLQlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKLQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHRiX2RlcXVldWUoc3RydWN0IFFkaXNjICpzY2gpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlpbnQgbGV2ZWw7Ci0JbG9uZyBtaW5fZGVsYXk7Ci0KLQlxLT5qaWZmaWVzID0gamlmZmllczsKKwlwc2NoZWRfdGltZV90IG5leHRfZXZlbnQ7CiAKIAkvKiB0cnkgdG8gZGVxdWV1ZSBkaXJlY3QgcGFja2V0cyBhcyBoaWdoIHByaW8gKCEpIHRvIG1pbmltaXplIGNwdSB3b3JrICovCiAJc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+ZGlyZWN0X3F1ZXVlKTsKQEAgLTk5MywyMyArOTY1LDI1IEBACiAKIAlpZiAoIXNjaC0+cS5xbGVuKQogCQlnb3RvIGZpbjsKLQlQU0NIRURfR0VUX1RJTUUocS0+bm93KTsKKwlxLT5ub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAotCW1pbl9kZWxheSA9IExPTkdfTUFYOworCW5leHRfZXZlbnQgPSBxLT5ub3cgKyA1ICogUFNDSEVEX1RJQ0tTX1BFUl9TRUM7CiAJcS0+bndjX2hpdCA9IDA7CiAJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgVENfSFRCX01BWERFUFRIOyBsZXZlbCsrKSB7CiAJCS8qIGNvbW1vbiBjYXNlIG9wdGltaXphdGlvbiAtIHNraXAgZXZlbnQgaGFuZGxlciBxdWlja2x5ICovCiAJCWludCBtOwotCQlsb25nIGRlbGF5OwotCQlpZiAodGltZV9hZnRlcl9lcShxLT5qaWZmaWVzLCBxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSkpIHsKLQkJCWRlbGF5ID0gaHRiX2RvX2V2ZW50cyhxLCBsZXZlbCk7Ci0JCQlxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSA9Ci0JCQkgICAgcS0+amlmZmllcyArIChkZWxheSA/IGRlbGF5IDogSFopOwotCQl9IGVsc2UKLQkJCWRlbGF5ID0gcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0gLSBxLT5qaWZmaWVzOworCQlwc2NoZWRfdGltZV90IGV2ZW50OwogCi0JCWlmIChkZWxheSAmJiBtaW5fZGVsYXkgPiBkZWxheSkKLQkJCW1pbl9kZWxheSA9IGRlbGF5OworCQlpZiAocS0+bm93ID49IHEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxdKSB7CisJCQlldmVudCA9IGh0Yl9kb19ldmVudHMocSwgbGV2ZWwpOworCQkJcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0gPSBldmVudCA/IGV2ZW50IDoKKwkJCQkJCQkgIFBTQ0hFRF9USUNLU19QRVJfU0VDOworCQl9IGVsc2UKKwkJCWV2ZW50ID0gcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF07CisKKwkJaWYgKGV2ZW50ICYmIG5leHRfZXZlbnQgPiBldmVudCkKKwkJCW5leHRfZXZlbnQgPSBldmVudDsKKwogCQltID0gfnEtPnJvd19tYXNrW2xldmVsXTsKIAkJd2hpbGUgKG0gIT0gKGludCkoLTEpKSB7CiAJCQlpbnQgcHJpbyA9IGZmeihtKTsKQEAgLTEwMjIsNyArOTk2LDggQEAKIAkJCX0KIAkJfQogCX0KLQlodGJfZGVsYXlfYnkoc2NoLCBtaW5fZGVsYXkgPiA1ICogSFogPyA1ICogSFogOiBtaW5fZGVsYXkpOworCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csIG5leHRfZXZlbnQpOwogZmluOgogCXJldHVybiBza2I7CiB9CkBAIC0xMDc1LDggKzEwNTAsNyBAQAogCiAJCX0KIAl9Ci0Jc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwotCWRlbF90aW1lcigmcS0+dGltZXIpOworCXFkaXNjX3dhdGNoZG9nX2NhbmNlbCgmcS0+d2F0Y2hkb2cpOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5kaXJlY3RfcXVldWUpOwogCXNjaC0+cS5xbGVuID0gMDsKIAltZW1zZXQocS0+cm93LCAwLCBzaXplb2YocS0+cm93KSk7CkBAIC0xMTEzLDE0ICsxMDg3LDEyIEBACiAJZm9yIChpID0gMDsgaSA8IFRDX0hUQl9OVU1QUklPOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKHEtPmRyb3BzICsgaSk7CiAKLQlpbml0X3RpbWVyKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+ZGlyZWN0X3F1ZXVlKTsKIAogCXEtPmRpcmVjdF9xbGVuID0gc2NoLT5kZXYtPnR4X3F1ZXVlX2xlbjsKIAlpZiAocS0+ZGlyZWN0X3FsZW4gPCAyKQkvKiBzb21lIGRldmljZXMgaGF2ZSB6ZXJvIHR4X3F1ZXVlX2xlbiAqLwogCQlxLT5kaXJlY3RfcWxlbiA9IDI7Ci0JcS0+dGltZXIuZnVuY3Rpb24gPSBodGJfdGltZXI7Ci0JcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKIAogI2lmZGVmIEhUQl9SQVRFQ00KIAlpbml0X3RpbWVyKCZxLT5ydHRpbSk7CkBAIC0xMTM5LDcgKzExMTEsNyBAQAogc3RhdGljIGludCBodGJfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJc3RydWN0IHRjX2h0Yl9nbG9iIGdvcHQ7CiAJc3Bpbl9sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7CkBAIC0xMTUyLDEyICsxMTI0LDEyIEBACiAJcnRhID0gKHN0cnVjdCBydGF0dHIgKiliOwogCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9IVEJfSU5JVCwgc2l6ZW9mKGdvcHQpLCAmZ29wdCk7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXNwaW5fdW5sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7CiAJcmV0dXJuIHNrYi0+bGVuOwogcnRhdHRyX2ZhaWx1cmU6CiAJc3Bpbl91bmxvY2tfYmgoJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrKTsKLQlza2JfdHJpbShza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMTY1LDcgKzExMzcsNyBAQAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKIHsKIAlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzICopYXJnOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJc3RydWN0IHRjX2h0Yl9vcHQgb3B0OwogCkBAIC0xMTg4LDEyICsxMTYwLDEyIEBACiAJb3B0LnByaW8gPSBjbC0+dW4ubGVhZi5wcmlvOwogCW9wdC5sZXZlbCA9IGNsLT5sZXZlbDsKIAlSVEFfUFVUKHNrYiwgVENBX0hUQl9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlzcGluX3VubG9ja19iaCgmc2NoLT5kZXYtPnF1ZXVlX2xvY2spOwogCXJldHVybiBza2ItPmxlbjsKIHJ0YXR0cl9mYWlsdXJlOgogCXNwaW5fdW5sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMjY0LDE2ICsxMjM2LDYgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpY2w7CiB9CiAKLXN0YXRpYyB2b2lkIGh0Yl9kZXN0cm95X2ZpbHRlcnMoc3RydWN0IHRjZl9wcm90byAqKmZsKQotewotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwotCi0Jd2hpbGUgKCh0cCA9ICpmbCkgIT0gTlVMTCkgewotCQkqZmwgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KLX0KLQogc3RhdGljIGlubGluZSBpbnQgaHRiX3BhcmVudF9sYXN0X2NoaWxkKHN0cnVjdCBodGJfY2xhc3MgKmNsKQogewogCWlmICghY2wtPnBhcmVudCkKQEAgLTEzMDIsNyArMTI2NCw3IEBACiAJcGFyZW50LT51bi5sZWFmLnByaW8gPSBwYXJlbnQtPnByaW87CiAJcGFyZW50LT50b2tlbnMgPSBwYXJlbnQtPmJ1ZmZlcjsKIAlwYXJlbnQtPmN0b2tlbnMgPSBwYXJlbnQtPmNidWZmZXI7Ci0JUFNDSEVEX0dFVF9USU1FKHBhcmVudC0+dF9jKTsKKwlwYXJlbnQtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXBhcmVudC0+Y21vZGUgPSBIVEJfQ0FOX1NFTkQ7CiB9CiAKQEAgLTEzMTcsNyArMTI3OSw3IEBACiAJcWRpc2NfcHV0X3J0YWIoY2wtPnJhdGUpOwogCXFkaXNjX3B1dF9ydGFiKGNsLT5jZWlsKTsKIAotCWh0Yl9kZXN0cm95X2ZpbHRlcnMoJmNsLT5maWx0ZXJfbGlzdCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oY2wtPmZpbHRlcl9saXN0KTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmY2wtPmNoaWxkcmVuKSkKIAkJaHRiX2Rlc3Ryb3lfY2xhc3Moc2NoLCBsaXN0X2VudHJ5KGNsLT5jaGlsZHJlbi5uZXh0LApAQCAtMTM0MSw3ICsxMzAzLDcgQEAKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwogCi0JZGVsX3RpbWVyX3N5bmMoJnEtPnRpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKICNpZmRlZiBIVEJfUkFURUNNCiAJZGVsX3RpbWVyX3N5bmMoJnEtPnJ0dGltKTsKICNlbmRpZgpAQCAtMTM0OSw3ICsxMzExLDcgQEAKIAkgICBhbmQgc3VycHJpc2luZ2x5IGl0IHdvcmtlZCBpbiAyLjQuIEJ1dCBpdCBtdXN0IHByZWNlZGUgaXQKIAkgICBiZWNhdXNlIGZpbHRlciBuZWVkIGl0cyB0YXJnZXQgY2xhc3MgYWxpdmUgdG8gYmUgYWJsZSB0byBjYWxsCiAJICAgdW5iaW5kX2ZpbHRlciBvbiBpdCAod2l0aG91dCBPb3BzKS4gKi8KLQlodGJfZGVzdHJveV9maWx0ZXJzKCZxLT5maWx0ZXJfbGlzdCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4ocS0+ZmlsdGVyX2xpc3QpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZxLT5yb290KSkKIAkJaHRiX2Rlc3Ryb3lfY2xhc3Moc2NoLCBsaXN0X2VudHJ5KHEtPnJvb3QubmV4dCwKQEAgLTE0OTgsOCArMTQ2MCw4IEBACiAJCS8qIHNldCBjbGFzcyB0byBiZSBpbiBIVEJfQ0FOX1NFTkQgc3RhdGUgKi8KIAkJY2wtPnRva2VucyA9IGhvcHQtPmJ1ZmZlcjsKIAkJY2wtPmN0b2tlbnMgPSBob3B0LT5jYnVmZmVyOwotCQljbC0+bWJ1ZmZlciA9IFBTQ0hFRF9KSUZGSUUyVVMoSFogKiA2MCk7CS8qIDFtaW4gKi8KLQkJUFNDSEVEX0dFVF9USU1FKGNsLT50X2MpOworCQljbC0+bWJ1ZmZlciA9IDYwICogUFNDSEVEX1RJQ0tTX1BFUl9TRUM7CS8qIDFtaW4gKi8KKwkJY2wtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCQljbC0+Y21vZGUgPSBIVEJfQ0FOX1NFTkQ7CiAKIAkJLyogYXR0YWNoIHRvIHRoZSBoYXNoIGxpc3QgYW5kIHBhcmVudCdzIGZhbWlseSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9pbmdyZXNzLmMgYi9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYwppbmRleCBjZmUwNzBlLi5mOGI5ZjFjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYworKysgYi9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xNjksNyArMTcwLDcgQEAKIAkJCXNrYi0+dGNfaW5kZXggPSBUQ19IX01JTihyZXMuY2xhc3NpZCk7CiAJCQlyZXN1bHQgPSBUQ19BQ1RfT0s7CiAJCQlicmVhazsKLQl9OworCX0KIC8qIGJhY2t3YXJkIGNvbXBhdCAqLwogI2Vsc2UKICNpZmRlZglDT05GSUdfTkVUX0NMU19QT0xJQ0UKQEAgLTE4Niw3ICsxODcsNyBAQAogCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKIAkJcmVzdWx0ID0gTkZfQUNDRVBUOwogCQlicmVhazsKLQl9OworCX0KIAogI2Vsc2UKIAlEMlBSSU5USygiT3ZlcnJpZGluZyByZXN1bHQgdG8gQUNDRVBUXG4iKTsKQEAgLTI0NywxNiArMjQ4LDExIEBACiAJCXNrYi0+ZGV2ID8gKCpwc2tiKS0+ZGV2LT5uYW1lIDogIihubyBkZXYpIiwKIAkJc2tiLT5sZW4pOwogCi0vKgotcmV2aXNpdCBsYXRlcjogVXNlIGEgcHJpdmF0ZSBzaW5jZSBsb2NrIGRldi0+cXVldWVfbG9jayBpcyBhbHNvCi11c2VkIG9uIHRoZSBlZ3Jlc3MgKG1pZ2h0IHNsb3cgdGhpbmdzIGZvciBhbiBpb3RhKQotKi8KLQogCWlmIChkZXYtPnFkaXNjX2luZ3Jlc3MpIHsKLQkJc3Bpbl9sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCQlzcGluX2xvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAkJaWYgKChxID0gZGV2LT5xZGlzY19pbmdyZXNzKSAhPSBOVUxMKQogCQkJZndyZXMgPSBxLT5lbnF1ZXVlKHNrYiwgcSk7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCQlzcGluX3VubG9jaygmZGV2LT5pbmdyZXNzX2xvY2spOwogCX0KIAogCXJldHVybiBmd3JlczsKQEAgLTM0NSwxNCArMzQxLDkgQEAKIHN0YXRpYyB2b2lkIGluZ3Jlc3NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOwotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwogCiAJRFBSSU5USygiaW5ncmVzc19kZXN0cm95KHNjaCAlcCxbcWRpc2MgJXBdKVxuIiwgc2NoLCBwKTsKLQl3aGlsZSAocC0+ZmlsdGVyX2xpc3QpIHsKLQkJdHAgPSBwLT5maWx0ZXJfbGlzdDsKLQkJcC0+ZmlsdGVyX2xpc3QgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KKwl0Y2ZfZGVzdHJveV9jaGFpbihwLT5maWx0ZXJfbGlzdCk7CiAjaWYgMAogLyogZm9yIGZ1dHVyZSB1c2UgKi8KIAlxZGlzY19kZXN0cm95KHAtPnEpOwpAQCAtMzYyLDE2ICszNTMsMTYgQEAKIAogc3RhdGljIGludCBpbmdyZXNzX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAogCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKLQlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSBiOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCAxY2NiZmI1Li41ZDlkOGJjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIAogI2RlZmluZSBWRVJTSU9OICIxLjIiCkBAIC01NCwyMSArNTUsMjIgQEAKIAogc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgewogCXN0cnVjdCBRZGlzYwkqcWRpc2M7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IHFkaXNjX3dhdGNoZG9nIHdhdGNoZG9nOwogCi0JdTMyIGxhdGVuY3k7CisJcHNjaGVkX3RkaWZmX3QgbGF0ZW5jeTsKKwlwc2NoZWRfdGRpZmZfdCBqaXR0ZXI7CisKIAl1MzIgbG9zczsKIAl1MzIgbGltaXQ7CiAJdTMyIGNvdW50ZXI7CiAJdTMyIGdhcDsKLQl1MzIgaml0dGVyOwogCXUzMiBkdXBsaWNhdGU7CiAJdTMyIHJlb3JkZXI7CiAJdTMyIGNvcnJ1cHQ7CiAKIAlzdHJ1Y3QgY3JuZHN0YXRlIHsKLQkJdW5zaWduZWQgbG9uZyBsYXN0OwotCQl1bnNpZ25lZCBsb25nIHJobzsKKwkJdTMyIGxhc3Q7CisJCXUzMiByaG87CiAJfSBkZWxheV9jb3IsIGxvc3NfY29yLCBkdXBfY29yLCByZW9yZGVyX2NvciwgY29ycnVwdF9jb3I7CiAKIAlzdHJ1Y3QgZGlzdHRhYmxlIHsKQEAgLTk1LDEyICs5NywxMiBAQAogICogTmV4dCBudW1iZXIgZGVwZW5kcyBvbiBsYXN0IHZhbHVlLgogICogcmhvIGlzIHNjYWxlZCB0byBhdm9pZCBmbG9hdGluZyBwb2ludC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2NyYW5kb20oc3RydWN0IGNybmRzdGF0ZSAqc3RhdGUpCitzdGF0aWMgdTMyIGdldF9jcmFuZG9tKHN0cnVjdCBjcm5kc3RhdGUgKnN0YXRlKQogewogCXU2NCB2YWx1ZSwgcmhvOwogCXVuc2lnbmVkIGxvbmcgYW5zd2VyOwogCi0JaWYgKHN0YXRlLT5yaG8gPT0gMCkJLyogbm8gY29ycmVsbGF0aW9uICovCisJaWYgKHN0YXRlLT5yaG8gPT0gMCkJLyogbm8gY29ycmVsYXRpb24gKi8KIAkJcmV0dXJuIG5ldF9yYW5kb20oKTsKIAogCXZhbHVlID0gbmV0X3JhbmRvbSgpOwpAQCAtMTE0LDExICsxMTYsMTMgQEAKICAqIHN0ZCBkZXZpYXRpb24gc2lnbWEuICBVc2VzIHRhYmxlIGxvb2t1cCB0byBhcHByb3hpbWF0ZSB0aGUgZGVzaXJlZAogICogZGlzdHJpYnV0aW9uLCBhbmQgYSB1bmlmb3JtbHktZGlzdHJpYnV0ZWQgcHNldWRvLXJhbmRvbSBzb3VyY2UuCiAgKi8KLXN0YXRpYyBsb25nIHRhYmxlZGlzdCh1bnNpZ25lZCBsb25nIG11LCBsb25nIHNpZ21hLAotCQkgICAgICBzdHJ1Y3QgY3JuZHN0YXRlICpzdGF0ZSwgY29uc3Qgc3RydWN0IGRpc3R0YWJsZSAqZGlzdCkKK3N0YXRpYyBwc2NoZWRfdGRpZmZfdCB0YWJsZWRpc3QocHNjaGVkX3RkaWZmX3QgbXUsIHBzY2hlZF90ZGlmZl90IHNpZ21hLAorCQkJCXN0cnVjdCBjcm5kc3RhdGUgKnN0YXRlLAorCQkJCWNvbnN0IHN0cnVjdCBkaXN0dGFibGUgKmRpc3QpCiB7Ci0JbG9uZyB0LCB4OwotCXVuc2lnbmVkIGxvbmcgcm5kOworCXBzY2hlZF90ZGlmZl90IHg7CisJbG9uZyB0OworCXUzMiBybmQ7CiAKIAlpZiAoc2lnbWEgPT0gMCkKIAkJcmV0dXJuIG11OwpAQCAtMjEzLDggKzIxNyw4IEBACiAJCWRlbGF5ID0gdGFibGVkaXN0KHEtPmxhdGVuY3ksIHEtPmppdHRlciwKIAkJCQkgICZxLT5kZWxheV9jb3IsIHEtPmRlbGF5X2Rpc3QpOwogCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCQlQU0NIRURfVEFERDIobm93LCBkZWxheSwgY2ItPnRpbWVfdG9fc2VuZCk7CisJCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCQljYi0+dGltZV90b19zZW5kID0gbm93ICsgZGVsYXk7CiAJCSsrcS0+Y291bnRlcjsKIAkJcmV0ID0gcS0+cWRpc2MtPmVucXVldWUoc2tiLCBxLT5xZGlzYyk7CiAJfSBlbHNlIHsKQEAgLTIyMiw3ICsyMjYsNyBAQAogCQkgKiBEbyByZS1vcmRlcmluZyBieSBwdXR0aW5nIG9uZSBvdXQgb2YgTiBwYWNrZXRzIGF0IHRoZSBmcm9udAogCQkgKiBvZiB0aGUgcXVldWUuCiAJCSAqLwotCQlQU0NIRURfR0VUX1RJTUUoY2ItPnRpbWVfdG9fc2VuZCk7CisJCWNiLT50aW1lX3RvX3NlbmQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAkJcS0+Y291bnRlciA9IDA7CiAJCXJldCA9IHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYyk7CiAJfQpAQCAtMjY5LDU1ICsyNzMsNDMgQEAKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc21wX21iKCk7CisJaWYgKHNjaC0+ZmxhZ3MgJiBUQ1FfRl9USFJPVFRMRUQpCisJCXJldHVybiBOVUxMOworCiAJc2tiID0gcS0+cWRpc2MtPmRlcXVldWUocS0+cWRpc2MpOwogCWlmIChza2IpIHsKIAkJY29uc3Qgc3RydWN0IG5ldGVtX3NrYl9jYiAqY2IKIAkJCT0gKGNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKilza2ItPmNiOwotCQlwc2NoZWRfdGltZV90IG5vdzsKKwkJcHNjaGVkX3RpbWVfdCBub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCQkvKiBpZiBtb3JlIHRpbWUgcmVtYWluaW5nPyAqLwotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQotCQlpZiAoUFNDSEVEX1RMRVNTKGNiLT50aW1lX3RvX3NlbmQsIG5vdykpIHsKKwkJaWYgKGNiLT50aW1lX3RvX3NlbmQgPD0gbm93KSB7CiAJCQlwcl9kZWJ1ZygibmV0ZW1fZGVxdWV1ZTogcmV0dXJuIHNrYj0lcFxuIiwgc2tiKTsKIAkJCXNjaC0+cS5xbGVuLS07Ci0JCQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CiAJCQlyZXR1cm4gc2tiOwotCQl9IGVsc2UgewotCQkJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2ItPnRpbWVfdG9fc2VuZCwgbm93KTsKLQotCQkJaWYgKHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykgewotCQkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7Ci0JCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm5ldGVtOiBxdWV1ZSBkaXNjcGxpbmUgJXMgY291bGQgbm90IHJlcXVldWVcbiIsCi0JCQkJICAgICAgIHEtPnFkaXNjLT5vcHMtPmlkKTsKLQkJCX0KLQotCQkJbW9kX3RpbWVyKCZxLT50aW1lciwgamlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpKTsKLQkJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfVEhST1RUTEVEOwogCQl9CisKKwkJaWYgKHVubGlrZWx5KHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykpIHsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7CisJCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQkJcHJpbnRrKEtFUk5fRVJSICJuZXRlbTogJXMgY291bGQgbm90IHJlcXVldWVcbiIsCisJCQkgICAgICAgcS0+cWRpc2MtPm9wcy0+aWQpOworCQl9CisKKwkJcWRpc2Nfd2F0Y2hkb2dfc2NoZWR1bGUoJnEtPndhdGNoZG9nLCBjYi0+dGltZV90b19zZW5kKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbmV0ZW1fd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOwotCi0JcHJfZGVidWcoIm5ldGVtX3dhdGNoZG9nIHFsZW49JWRcbiIsIHNjaC0+cS5xbGVuKTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCiBzdGF0aWMgdm9pZCBuZXRlbV9yZXNldChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAogCXFkaXNjX3Jlc2V0KHEtPnFkaXNjKTsKIAlzY2gtPnEucWxlbiA9IDA7Ci0Jc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwotCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiB9CiAKIC8qIFBhc3Mgc2l6ZSBjaGFuZ2UgbWVzc2FnZSBkb3duIHRvIGVtYmVkZGVkIEZJRk8gKi8KQEAgLTQzOCwxMCArNDMwLDExIEBACiAJcS0+bG9zcyA9IHFvcHQtPmxvc3M7CiAJcS0+ZHVwbGljYXRlID0gcW9wdC0+ZHVwbGljYXRlOwogCi0JLyogZm9yIGNvbXBhdGlhYmxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zLgotCSAqIGlmIGdhcCBpcyBzZXQsIG5lZWQgdG8gYXNzdW1lIDEwMCUgcHJvYmFibGl0eQorCS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucy4KKwkgKiBpZiBnYXAgaXMgc2V0LCBuZWVkIHRvIGFzc3VtZSAxMDAlIHByb2JhYmlsaXR5CiAJICovCi0JcS0+cmVvcmRlciA9IH4wOworCWlmIChxLT5nYXApCisJCXEtPnJlb3JkZXIgPSB+MDsKIAogCS8qIEhhbmRsZSBuZXN0ZWQgb3B0aW9ucyBhZnRlciBpbml0aWFsIHF1ZXVlIG9wdGlvbnMuCiAJICogU2hvdWxkIGhhdmUgcHV0IGFsbCBvcHRpb25zIGluIG5lc3RlZCBmb3JtYXQgYnV0IHRvbyBsYXRlIG5vdy4KQEAgLTQ4NywyMiArNDgwLDI4IEBACiAgKi8KIHN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgewogCXUzMiBsaW1pdDsKKwlwc2NoZWRfdGltZV90IG9sZGVzdDsKIH07CiAKIHN0YXRpYyBpbnQgdGZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCiB7CiAJc3RydWN0IGZpZm9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnNjaC0+cTsKLQljb25zdCBzdHJ1Y3QgbmV0ZW1fc2tiX2NiICpuY2IKLQkJPSAoY29uc3Qgc3RydWN0IG5ldGVtX3NrYl9jYiAqKW5za2ItPmNiOworCXBzY2hlZF90aW1lX3QgdG5leHQgPSAoKHN0cnVjdCBuZXRlbV9za2JfY2IgKiluc2tiLT5jYiktPnRpbWVfdG9fc2VuZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWYgKGxpa2VseShza2JfcXVldWVfbGVuKGxpc3QpIDwgcS0+bGltaXQpKSB7CisJCS8qIE9wdGltaXplIGZvciBhZGQgYXQgdGFpbCAqLworCQlpZiAobGlrZWx5KHNrYl9xdWV1ZV9lbXB0eShsaXN0KSB8fCB0bmV4dCA+PSBxLT5vbGRlc3QpKSB7CisJCQlxLT5vbGRlc3QgPSB0bmV4dDsKKwkJCXJldHVybiBxZGlzY19lbnF1ZXVlX3RhaWwobnNrYiwgc2NoKTsKKwkJfQorCiAJCXNrYl9xdWV1ZV9yZXZlcnNlX3dhbGsobGlzdCwgc2tiKSB7CiAJCQljb25zdCBzdHJ1Y3QgbmV0ZW1fc2tiX2NiICpjYgogCQkJCT0gKGNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKilza2ItPmNiOwogCi0JCQlpZiAoIVBTQ0hFRF9UTEVTUyhuY2ItPnRpbWVfdG9fc2VuZCwgY2ItPnRpbWVfdG9fc2VuZCkpCisJCQlpZiAodG5leHQgPj0gY2ItPnRpbWVfdG9fc2VuZCkKIAkJCQlicmVhazsKIAkJfQogCkBAIC01MTUsNyArNTE0LDcgQEAKIAkJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CiAJfQogCi0JcmV0dXJuIHFkaXNjX2Ryb3AobnNrYiwgc2NoKTsKKwlyZXR1cm4gcWRpc2NfcmVzaGFwZV9mYWlsKG5za2IsIHNjaCk7CiB9CiAKIHN0YXRpYyBpbnQgdGZpZm9faW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQpAQCAtNTMxLDYgKzUzMCw3IEBACiAJfSBlbHNlCiAJCXEtPmxpbWl0ID0gbWF4X3QodTMyLCBzY2gtPmRldi0+dHhfcXVldWVfbGVuLCAxKTsKIAorCXEtPm9sZGVzdCA9IFBTQ0hFRF9QQVNUUEVSRkVDVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTY3LDkgKzU2Nyw3IEBACiAJaWYgKCFvcHQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaW5pdF90aW1lcigmcS0+dGltZXIpOwotCXEtPnRpbWVyLmZ1bmN0aW9uID0gbmV0ZW1fd2F0Y2hkb2c7Ci0JcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2g7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAKIAlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmdGZpZm9fcWRpc2Nfb3BzLAogCQkJCSAgICAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCAxKSk7CkBAIC01OTAsNyArNTg4LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAotCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiAJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7CiAJa2ZyZWUocS0+ZGVsYXlfZGlzdCk7CiB9CkBAIC01OTgsNyArNTk2LDcgQEAKIHN0YXRpYyBpbnQgbmV0ZW1fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CiAJc3RydWN0IHRjX25ldGVtX3FvcHQgcW9wdDsKIAlzdHJ1Y3QgdGNfbmV0ZW1fY29yciBjb3I7CkBAIC02MjYsMTIgKzYyNCwxMiBAQAogCWNvcnJ1cHQuY29ycmVsYXRpb24gPSBxLT5jb3JydXB0X2Nvci5yaG87CiAJUlRBX1BVVChza2IsIFRDQV9ORVRFTV9DT1JSVVBULCBzaXplb2YoY29ycnVwdCksICZjb3JydXB0KTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3ByaW8uYyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCmluZGV4IGRlODg5ZjIuLjI2OWE2ZTEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIApAQCAtNjEsNyArNjIsNyBAQAogCQkJKnFlcnIgPSBORVRfWE1JVF9TVUNDRVNTOwogCQljYXNlIFRDX0FDVF9TSE9UOgogCQkJcmV0dXJuIE5VTEw7Ci0JCX07CisJCX0KIAogCQlpZiAoIXEtPmZpbHRlcl9saXN0ICkgewogI2Vsc2UKQEAgLTE4OCwxMyArMTg5LDggQEAKIHsKIAlpbnQgcHJpbzsKIAlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwogCi0Jd2hpbGUgKCh0cCA9IHEtPmZpbHRlcl9saXN0KSAhPSBOVUxMKSB7Ci0JCXEtPmZpbHRlcl9saXN0ID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci0KKwl0Y2ZfZGVzdHJveV9jaGFpbihxLT5maWx0ZXJfbGlzdCk7CiAJZm9yIChwcmlvPTA7IHByaW88cS0+YmFuZHM7IHByaW8rKykKIAkJcWRpc2NfZGVzdHJveShxLT5xdWV1ZXNbcHJpb10pOwogfQpAQCAtMjcxLDcgKzI2Nyw3IEBACiBzdGF0aWMgaW50IHByaW9fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX3ByaW9fcW9wdCBvcHQ7CiAKIAlvcHQuYmFuZHMgPSBxLT5iYW5kczsKQEAgLTI4MCw3ICsyNzYsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCA2NmYzMjA1Li45NmRmZGY3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTEzNyw3ICsxMzgsNyBAQAogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CiAJewotCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCQloID0gaXBoLT5kYWRkcjsKIAkJaDIgPSBpcGgtPnNhZGRyXmlwaC0+cHJvdG9jb2w7CiAJCWlmICghKGlwaC0+ZnJhZ19vZmYmaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgJiYKQEAgLTE1Miw3ICsxNTMsNyBAQAogCX0KIAljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CiAJewotCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJCWggPSBpcGgtPmRhZGRyLnM2X2FkZHIzMlszXTsKIAkJaDIgPSBpcGgtPnNhZGRyLnM2X2FkZHIzMlszXV5pcGgtPm5leHRoZHI7CiAJCWlmIChpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19UQ1AgfHwKQEAgLTQ2MSw3ICs0NjIsNyBAQAogc3RhdGljIGludCBzZnFfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfc2ZxX3FvcHQgb3B0OwogCiAJb3B0LnF1YW50dW0gPSBxLT5xdWFudHVtOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGJmLmMgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCmluZGV4IDg1ZGE4ZGEuLjUzODYyOTUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGJmLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90YmYuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0xMjcsOCArMTI4LDggQEAKIAlsb25nCXRva2VuczsJCQkvKiBDdXJyZW50IG51bWJlciBvZiBCIHRva2VucyAqLwogCWxvbmcJcHRva2VuczsJCS8qIEN1cnJlbnQgbnVtYmVyIG9mIFAgdG9rZW5zICovCiAJcHNjaGVkX3RpbWVfdAl0X2M7CQkvKiBUaW1lIGNoZWNrLXBvaW50ICovCi0Jc3RydWN0IHRpbWVyX2xpc3Qgd2RfdGltZXI7CS8qIFdhdGNoZG9nIHRpbWVyICovCiAJc3RydWN0IFFkaXNjCSpxZGlzYzsJCS8qIElubmVyIHFkaXNjLCBkZWZhdWx0IC0gYmZpZm8gcXVldWUgKi8KKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgd2F0Y2hkb2c7CS8qIFdhdGNoZG9nIHRpbWVyICovCiB9OwogCiAjZGVmaW5lIEwyVChxLEwpICAgKChxKS0+Ul90YWItPmRhdGFbKEwpPj4ocSktPlJfdGFiLT5yYXRlLmNlbGxfbG9nXSkKQEAgLTE4NSwxNCArMTg2LDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgdm9pZCB0YmZfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7Ci0KLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRiZl9kZXF1ZXVlKHN0cnVjdCBRZGlzYyogc2NoKQogewogCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKQEAgLTIwMiwxMyArMTk1LDEyIEBACiAKIAlpZiAoc2tiKSB7CiAJCXBzY2hlZF90aW1lX3Qgbm93OwotCQlsb25nIHRva3MsIGRlbGF5OworCQlsb25nIHRva3M7CiAJCWxvbmcgcHRva3MgPSAwOwogCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CiAKLQkJUFNDSEVEX0dFVF9USU1FKG5vdyk7Ci0KLQkJdG9rcyA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcS0+dF9jLCBxLT5idWZmZXIpOworCQlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwkJdG9rcyA9IHBzY2hlZF90ZGlmZl9ib3VuZGVkKG5vdywgcS0+dF9jLCBxLT5idWZmZXIpOwogCiAJCWlmIChxLT5QX3RhYikgewogCQkJcHRva3MgPSB0b2tzICsgcS0+cHRva2VuczsKQEAgLTIzMCwxMiArMjIyLDggQEAKIAkJCXJldHVybiBza2I7CiAJCX0KIAotCQlkZWxheSA9IFBTQ0hFRF9VUzJKSUZGSUUobWF4X3QobG9uZywgLXRva3MsIC1wdG9rcykpOwotCi0JCWlmIChkZWxheSA9PSAwKQotCQkJZGVsYXkgPSAxOwotCi0JCW1vZF90aW1lcigmcS0+d2RfdGltZXIsIGppZmZpZXMrZGVsYXkpOworCQlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csCisJCQkJCW5vdyArIG1heF90KGxvbmcsIC10b2tzLCAtcHRva3MpKTsKIAogCQkvKiBNYXliZSB3ZSBoYXZlIGEgc2hvcnRlciBwYWNrZXQgaW4gdGhlIHF1ZXVlLAogCQkgICB3aGljaCBjYW4gYmUgc2VudCBub3cuIEl0IHNvdW5kcyBjb29sLApAQCAtMjU0LDcgKzI0Miw2IEBACiAJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwogCQl9CiAKLQkJc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CiAJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0yNjYsMTEgKzI1MywxMCBAQAogCiAJcWRpc2NfcmVzZXQocS0+cWRpc2MpOwogCXNjaC0+cS5xbGVuID0gMDsKLQlQU0NIRURfR0VUX1RJTUUocS0+dF9jKTsKKwlxLT50X2MgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAlxLT50b2tlbnMgPSBxLT5idWZmZXI7CiAJcS0+cHRva2VucyA9IHEtPm10dTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JZGVsX3RpbWVyKCZxLT53ZF90aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnRiZl9jcmVhdGVfZGZsdF9xZGlzYyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGxpbWl0KQpAQCAtMzc3LDExICszNjMsOCBAQAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlQU0NIRURfR0VUX1RJTUUocS0+dF9jKTsKLQlpbml0X3RpbWVyKCZxLT53ZF90aW1lcik7Ci0JcS0+d2RfdGltZXIuZnVuY3Rpb24gPSB0YmZfd2F0Y2hkb2c7Ci0JcS0+d2RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKLQorCXEtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOworCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCXEtPnFkaXNjID0gJm5vb3BfcWRpc2M7CiAKIAlyZXR1cm4gdGJmX2NoYW5nZShzY2gsIG9wdCk7CkBAIC0zOTEsNyArMzc0LDcgQEAKIHsKIAlzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKIAogCWlmIChxLT5QX3RhYikKIAkJcWRpc2NfcHV0X3J0YWIocS0+UF90YWIpOwpAQCAtNDA0LDcgKzM4Nyw3IEBACiBzdGF0aWMgaW50IHRiZl9kdW1wKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAlzdHJ1Y3QgdGNfdGJmX3FvcHQgb3B0OwogCkBAIC00MjAsMTIgKzQwMywxMiBAQAogCW9wdC5tdHUgPSBxLT5tdHU7CiAJb3B0LmJ1ZmZlciA9IHEtPmJ1ZmZlcjsKIAlSVEFfUFVUKHNrYiwgVENBX1RCRl9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3RlcWwuYyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCmluZGV4IDU4NzEyM2MuLmQyNDkxNGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGVxbC5jCisrKyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJCW5vcmVzID0gMTsKIAkJCWJyZWFrOwogCQl9Ci0JCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJfSB3aGlsZSAoKHEgPSBORVhUX1NMQVZFKHEpKSAhPSBzdGFydCk7CiAKIAlpZiAobm9yZXMgJiYgc2tiX3JlcyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDc4ZDJkZGIuLmRiNzNlZjkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBtYXhpbXVtIG11bWJlciBvZiBuZXcgZGF0YSBwYWNrZXRzIHRoYXQgY2FuIGJlIHNlbnQKIAkgKiBpbiBhIGJ1cnN0LgogCSAqLwotCWFzb2MtPm1heF9idXJzdCA9IHNjdHBfbWF4X2J1cnN0OworCWFzb2MtPm1heF9idXJzdCA9IHNwLT5tYXhfYnVyc3Q7CiAKIAkvKiBpbml0aWFsaXplIGFzc29jaWF0aW9uIHRpbWVycyAqLwogCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9OT05FXSA9IDA7CkBAIC03MTQsOCArNzE0LDE2IEBACiAJLyogUmVjb3JkIHRoZSB0cmFuc2l0aW9uIG9uIHRoZSB0cmFuc3BvcnQuICAqLwogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2UgU0NUUF9UUkFOU1BPUlRfVVA6CisJCS8qIElmIHdlIGFyZSBtb3ZpbmcgZnJvbSBVTkNPTkZJUk1FRCBzdGF0ZSBkdWUKKwkJICogdG8gaGVhcnRiZWF0IHN1Y2Nlc3MsIHJlcG9ydCB0aGUgU0NUUF9BRERSX0NPTkZJUk1FRAorCQkgKiBzdGF0ZSB0byB0aGUgdXNlciwgb3RoZXJ3aXNlIHJlcG9ydCBTQ1RQX0FERFJfQVZBSUxBQkxFLgorCQkgKi8KKwkJaWYgKFNDVFBfVU5DT05GSVJNRUQgPT0gdHJhbnNwb3J0LT5zdGF0ZSAmJgorCQkgICAgU0NUUF9IRUFSVEJFQVRfU1VDQ0VTUyA9PSBlcnJvcikKKwkJCXNwY19zdGF0ZSA9IFNDVFBfQUREUl9DT05GSVJNRUQ7CisJCWVsc2UKKwkJCXNwY19zdGF0ZSA9IFNDVFBfQUREUl9BVkFJTEFCTEU7CiAJCXRyYW5zcG9ydC0+c3RhdGUgPSBTQ1RQX0FDVElWRTsKLQkJc3BjX3N0YXRlID0gU0NUUF9BRERSX0FWQUlMQUJMRTsKIAkJYnJlYWs7CiAKIAljYXNlIFNDVFBfVFJBTlNQT1JUX0RPV046CkBAIC03MjUsNyArNzMzLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybjsKLQl9OworCX0KIAogCS8qIEdlbmVyYXRlIGFuZCBzZW5kIGEgU0NUUF9QRUVSX0FERFJfQ0hBTkdFIG5vdGlmaWNhdGlvbiB0byB0aGUKIAkgKiB1c2VyLgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZGVidWcuYyBiL25ldC9zY3RwL2RlYnVnLmMKaW5kZXggNWY1YWIyOC4uZThjMGY3NCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvZGVidWcuYworKysgYi9uZXQvc2N0cC9kZWJ1Zy5jCkBAIC05Myw4ICs5Myw5IEBACiAJCXJldHVybiAiRldEX1RTTiI7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gY2h1bmsiOwotCX07CisJCWJyZWFrOworCX0KKwogCXJldHVybiAidW5rbm93biBjaHVuayI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IDcxZGI2NjguLjg4NTEwOWYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtNzksMTQgKzc5LDEwIEBACiAvKiBDYWxjdWxhdGUgdGhlIFNDVFAgY2hlY2tzdW0gb2YgYW4gU0NUUCBwYWNrZXQuICAqLwogc3RhdGljIGlubGluZSBpbnQgc2N0cF9yY3ZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgc2N0cGhkciAqc2g7Ci0JX191MzIgY21wLCB2YWw7CiAJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKLQotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7Ci0JY21wID0gbnRvaGwoc2gtPmNoZWNrc3VtKTsKLQotCXZhbCA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgc2tiX2hlYWRsZW4oc2tiKSk7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gc2N0cF9oZHIoc2tiKTsKKwlfX3UzMiBjbXAgPSBudG9obChzaC0+Y2hlY2tzdW0pOworCV9fdTMyIHZhbCA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgc2tiX2hlYWRsZW4oc2tiKSk7CiAKIAlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCiAJCXZhbCA9IHNjdHBfdXBkYXRlX2Nrc3VtKChfX3U4ICopbGlzdC0+ZGF0YSwgc2tiX2hlYWRsZW4obGlzdCksCkBAIC0xMzgsMTQgKzEzNCwxMyBAQAogCWlmIChza2JfbGluZWFyaXplKHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc2ggPSBzY3RwX2hkcihza2IpOwogCiAJLyogUHVsbCB1cCB0aGUgSVAgYW5kIFNDVFAgaGVhZGVycy4gKi8KLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpOwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cGhkcikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKLQlpZiAoKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSAmJgotCSAgICAoc2N0cF9yY3ZfY2hlY2tzdW0oc2tiKSA8IDApKQorCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiBzY3RwX3Jjdl9jaGVja3N1bShza2IpIDwgMCkKIAkJZ290byBkaXNjYXJkX2l0OwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBoZHIpKTsKQEAgLTE1NCw3ICsxNDksNyBAQAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVua2hkcikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWZhbWlseSA9IGlwdmVyMmFmKHNrYi0+bmguaXBoLT52ZXJzaW9uKTsKKwlmYW1pbHkgPSBpcHZlcjJhZihpcF9oZHIoc2tiKS0+dmVyc2lvbik7CiAJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhmYW1pbHkpOwogCWlmICh1bmxpa2VseSghYWYpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CkBAIC01MTAsMzAgKzUwNSwzMCBAQAogdm9pZCBzY3RwX3Y0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UzMiBpbmZvKQogewogCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc2N0cGhkciAqc2ggPSAoc3RydWN0IHNjdHBoZHIgKikoc2tiLT5kYXRhICsgKGlwaC0+aWhsIDw8MikpOwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCBpaGxlbiA9IGlwaC0+aWhsICogNDsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IE5VTEw7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKLQljaGFyICpzYXZlaXAsICpzYXZlc2N0cDsKKwlza19idWZmX2RhdGFfdCBzYXZlaXAsIHNhdmVzY3RwOwogCWludCBlcnI7CiAKLQlpZiAoc2tiLT5sZW4gPCAoKGlwaC0+aWhsIDw8IDIpICsgOCkpIHsKKwlpZiAoc2tiLT5sZW4gPCBpaGxlbiArIDgpIHsKIAkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CiAJfQogCiAJLyogRml4IHVwIHNrYiB0byBsb29rIGF0IHRoZSBlbWJlZGRlZCBuZXQgaGVhZGVyLiAqLwotCXNhdmVpcCA9IHNrYi0+bmgucmF3OwotCXNhdmVzY3RwICA9IHNrYi0+aC5yYXc7Ci0Jc2tiLT5uaC5pcGggPSBpcGg7Ci0Jc2tiLT5oLnJhdyA9IChjaGFyICopc2g7Ci0Jc2sgPSBzY3RwX2Vycl9sb29rdXAoQUZfSU5FVCwgc2tiLCBzaCwgJmFzb2MsICZ0cmFuc3BvcnQpOwotCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgcG9pbnRlcnMuICovCi0Jc2tiLT5uaC5yYXcgPSBzYXZlaXA7Ci0Jc2tiLT5oLnJhdyA9IHNhdmVzY3RwOworCXNhdmVpcCA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2F2ZXNjdHAgPSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgaWhsZW4pOworCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQsIHNrYiwgc2N0cF9oZHIoc2tiKSwgJmFzb2MsICZ0cmFuc3BvcnQpOworCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgdmFsdWVzLiAqLworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBzYXZlaXA7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2F2ZXNjdHA7CiAJaWYgKCFzaykgewogCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CiAJCXJldHVybjsKQEAgLTYxNiw3ICs2MTEsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7Ci0JCWlmIChjaF9lbmQgPiBza2ItPnRhaWwpCisJCWlmIChjaF9lbmQgPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCQlicmVhazsKIAogCQkvKiBSRkMgOC40LCAyKSBJZiB0aGUgT09UQiBwYWNrZXQgY29udGFpbnMgYW4gQUJPUlQgY2h1bmssIHRoZQpAQCAtNjQ4LDcgKzY0Myw3IEBACiAJCX0KIAogCQljaCA9IChzY3RwX2NodW5raGRyX3QgKikgY2hfZW5kOwotCX0gd2hpbGUgKGNoX2VuZCA8IHNrYi0+dGFpbCk7CisJfSB3aGlsZSAoY2hfZW5kIDwgc2tiX3RhaWxfcG9pbnRlcihza2IpKTsKIAogCXJldHVybiAwOwogCkBAIC05MDUsNyArOTAwLDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAl1bmlvbiBzY3RwX2FkZHIgYWRkcjsKIAl1bmlvbiBzY3RwX2FkZHIgKnBhZGRyID0gJmFkZHI7Ci0Jc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gc2N0cF9oZHIoc2tiKTsKIAlzY3RwX2NodW5raGRyX3QgKmNoOwogCXVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtczsKIAlzY3RwX2luaXRfY2h1bmtfdCAqaW5pdDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucXVldWUuYyBiL25ldC9zY3RwL2lucXVldWUuYwppbmRleCBjMzA2MjllLi44OGFhMjI0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCkBAIC0xNTksMTYgKzE1OSwxNiBAQAogCSAqIHRoZSBza2ItPnRhaWwuCiAJICovCiAJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoY2h1bmstPnNrYikpKSB7Ci0JCWlmIChjaHVuay0+Y2h1bmtfZW5kID4gY2h1bmstPnNrYi0+dGFpbCkKLQkJCWNodW5rLT5jaHVua19lbmQgPSBjaHVuay0+c2tiLT50YWlsOworCQlpZiAoY2h1bmstPmNodW5rX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYikpCisJCQljaHVuay0+Y2h1bmtfZW5kID0gc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKTsKIAl9CiAJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOwogCWNodW5rLT5zdWJoLnYgPSBOVUxMOyAvKiBTdWJoZWFkZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KIAotCWlmIChjaHVuay0+Y2h1bmtfZW5kIDwgY2h1bmstPnNrYi0+dGFpbCkgeworCWlmIChjaHVuay0+Y2h1bmtfZW5kIDwgc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKSkgewogCQkvKiBUaGlzIGlzIG5vdCBhIHNpbmdsZXRvbiAqLwogCQljaHVuay0+c2luZ2xldG9uID0gMDsKLQl9IGVsc2UgaWYgKGNodW5rLT5jaHVua19lbmQgPiBjaHVuay0+c2tiLT50YWlsKSB7CisJfSBlbHNlIGlmIChjaHVuay0+Y2h1bmtfZW5kID4gc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKSkgewogCQkvKiBSRkMgMjk2MCwgU2VjdGlvbiA2LjEwICBCdW5kbGluZwogCQkgKgogCQkgKiBQYXJ0aWFsIGNodW5rcyBNVVNUIE5PVCBiZSBwbGFjZWQgaW4gYW4gU0NUUCBwYWNrZXQuCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMGI5YzQ5Yi4uY2E1MjdhMiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTIyLDI2ICsxMjIsMjQgQEAKIAkJCSAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCXN0cnVjdCBpcHY2aGRyICppcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopKHNrYi0+ZGF0YSArIG9mZnNldCk7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKLQljaGFyICpzYXZlaXAsICpzYXZlc2N0cDsKKwlza19idWZmX2RhdGFfdCBzYXZlaXAsIHNhdmVzY3RwOwogCWludCBlcnI7CiAKIAlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCiAJLyogRml4IHVwIHNrYiB0byBsb29rIGF0IHRoZSBlbWJlZGRlZCBuZXQgaGVhZGVyLiAqLwotCXNhdmVpcCA9IHNrYi0+bmgucmF3OwotCXNhdmVzY3RwICA9IHNrYi0+aC5yYXc7Ci0Jc2tiLT5uaC5pcHY2aCA9IGlwaDsKLQlza2ItPmgucmF3ID0gKGNoYXIgKilzaDsKLQlzayA9IHNjdHBfZXJyX2xvb2t1cChBRl9JTkVUNiwgc2tiLCBzaCwgJmFzb2MsICZ0cmFuc3BvcnQpOworCXNhdmVpcAkgPSBza2ItPm5ldHdvcmtfaGVhZGVyOworCXNhdmVzY3RwID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIG9mZnNldCk7CisJc2sgPSBzY3RwX2Vycl9sb29rdXAoQUZfSU5FVDYsIHNrYiwgc2N0cF9oZHIoc2tiKSwgJmFzb2MsICZ0cmFuc3BvcnQpOwogCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgcG9pbnRlcnMuICovCi0Jc2tiLT5uaC5yYXcgPSBzYXZlaXA7Ci0Jc2tiLT5oLnJhdyA9IHNhdmVzY3RwOworCXNrYi0+bmV0d29ya19oZWFkZXIgICA9IHNhdmVpcDsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBzYXZlc2N0cDsKIAlpZiAoIXNrKSB7CiAJCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5FUlJPUlMpOwogCQlnb3RvIG91dDsKQEAgLTM5MSwxMyArMzg5LDEzIEBACiAJYWRkci0+djYuc2luNl9mbG93aW5mbyA9IDA7IC8qIEZJWE1FICovCiAJYWRkci0+djYuc2luNl9zY29wZV9pZCA9ICgoc3RydWN0IGluZXQ2X3NrYl9wYXJtICopc2tiLT5jYiktPmlpZjsKIAotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc2ggPSBzY3RwX2hkcihza2IpOwogCWlmIChpc19zYWRkcikgewogCQkqcG9ydCAgPSBzaC0+c291cmNlOwotCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCQlmcm9tID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOwogCX0gZWxzZSB7CiAJCSpwb3J0ID0gc2gtPmRlc3Q7Ci0JCWZyb20gPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJCWZyb20gPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJfQogCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsIGZyb20pOwogfQpAQCAtNjA2LDcgKzYwNCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gU0NUUF9TQ09QRV9HTE9CQUw7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTY5OSw3ICs2OTcsNyBAQAogLyogV2FzIHRoaXMgcGFja2V0IG1hcmtlZCBieSBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbj8gKi8KIHN0YXRpYyBpbnQgc2N0cF92Nl9pc19jZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAqKChfX3UzMiAqKShza2ItPm5oLmlwdjZoKSkgJiBodG9ubCgxPDwyMCk7CisJcmV0dXJuICooKF9fdTMyICopKGlwdjZfaGRyKHNrYikpKSAmIGh0b25sKDEgPDwgMjApOwogfQogCiAvKiBEdW1wIHRoZSB2NiBhZGRyIHRvIHRoZSBzZXEgZmlsZS4gKi8KQEAgLTc2NiwxOSArNzY0LDE5IEBACiAJaWYgKG1zZ25hbWUpIHsKIAkJc2N0cF9pbmV0Nl9tc2duYW1lKG1zZ25hbWUsIGFkZHJfbGVuKTsKIAkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnbmFtZTsKLQkJc2ggPSAoc3RydWN0IHNjdHBoZHIgKilza2ItPmgucmF3OworCQlzaCA9IHNjdHBfaGRyKHNrYik7CiAJCXNpbjYtPnNpbjZfcG9ydCA9IHNoLT5zb3VyY2U7CiAKIAkJLyogTWFwIGlwdjQgYWRkcmVzcyBpbnRvIHY0LW1hcHBlZC1vbi12NiBhZGRyZXNzLiAqLwogCQlpZiAoc2N0cF9zayhza2ItPnNrKS0+djRtYXBwZWQgJiYKLQkJICAgIHNrYi0+bmguaXBoLT52ZXJzaW9uID09IDQpIHsKKwkJICAgIGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQpIHsKIAkJCXNjdHBfdjRfbWFwX3Y2KCh1bmlvbiBzY3RwX2FkZHIgKilzaW42KTsKLQkJCXNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10gPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCQlzaW42LT5zaW42X2FkZHIuczZfYWRkcjMyWzNdID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogT3RoZXJ3aXNlLCBqdXN0IGNvcHkgdGhlIHY2IGFkZHJlc3MuICovCi0JCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7CiAJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHsKIAkJCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldiA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CiAJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gZXYtPmlpZjsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggZjg3NWZjMy4uZDg1NTQzZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWNhc2UgU0NUUF9YTUlUX09LOgogCWNhc2UgU0NUUF9YTUlUX05BR0xFX0RFTEFZOgogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA0MWFiZmQxLi45OTJmMzYxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCQkJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVE9SREVSQ0hVTktTKTsKIAkJCXEtPmVtcHR5ID0gMDsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCQkJLyogUmV0cmlldmUgYSBuZXcgY2h1bmsgdG8gYnVuZGxlLiAqLwogCQkJbGNodW5rID0gc2N0cF9saXN0X2RlcXVldWUobHF1ZXVlKTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJLyogSWYgd2UgYXJlIGhlcmUgZHVlIHRvIGEgcmV0cmFuc21pdCB0aW1lb3V0IG9yIGEgZmFzdAogCQkgKiByZXRyYW5zbWl0IGFuZCBpZiB0aGVyZSBhcmUgYW55IGNodW5rcyBsZWZ0IGluIHRoZSByZXRyYW5zbWl0CkBAIC03NzksNyArNzc5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCS8qIFdlIGJ1aWx0IGEgY2h1bmsgd2l0aCBhbiBpbGxlZ2FsIHR5cGUhICovCiAJCQlCVUcoKTsKLQkJfTsKKwkJfQogCX0KIAogCS8qIElzIGl0IE9LIHRvIHNlbmQgZGF0YSBjaHVua3M/ICAqLwpAQCAtMTM5Nyw3ICsxMzk3LDcgQEAKIAkJCQlTQ1RQX0RFQlVHX1BSSU5USygiQUNLZWQ6ICUwOHgiLCB0c24pOwogCQkJCWRiZ19wcnRfc3RhdGUgPSAwOwogCQkJCWRiZ19hY2tfdHNuID0gdHNuOwotCQkJfTsKKwkJCX0KIAogCQkJZGJnX2xhc3RfYWNrX3RzbiA9IHRzbjsKICNlbmRpZiAvKiBTQ1RQX0RFQlVHICovCkBAIC0xNDUyLDcgKzE0NTIsNyBAQAogCQkJCVNDVFBfREVCVUdfUFJJTlRLKCJLRVBUOiAlMDh4Iix0c24pOwogCQkJCWRiZ19wcnRfc3RhdGUgPSAxOwogCQkJCWRiZ19rZXB0X3RzbiA9IHRzbjsKLQkJCX07CisJCQl9CiAKIAkJCWRiZ19sYXN0X2tlcHRfdHNuID0gdHNuOwogI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KQEAgLTE0NzYsNyArMTQ3Niw3IEBACiAJCX0gZWxzZSB7CiAJCQlTQ1RQX0RFQlVHX1BSSU5USygiXG4iKTsKIAkJfQotCX07CisJfQogI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KIAlpZiAodHJhbnNwb3J0KSB7CiAJCWlmIChieXRlc19hY2tlZCkgewpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggZTE3YTgyMy4uYzM2MWRlYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0yMzUsMTMgKzIzNSwxMyBAQAogCXBvcnQgPSAmYWRkci0+djQuc2luX3BvcnQ7CiAJYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAKLQlzaCA9IChzdHJ1Y3Qgc2N0cGhkciAqKSBza2ItPmgucmF3OworCXNoID0gc2N0cF9oZHIoc2tiKTsKIAlpZiAoaXNfc2FkZHIpIHsKIAkJKnBvcnQgID0gc2gtPnNvdXJjZTsKLQkJZnJvbSA9ICZza2ItPm5oLmlwaC0+c2FkZHI7CisJCWZyb20gPSAmaXBfaGRyKHNrYiktPnNhZGRyOwogCX0gZWxzZSB7CiAJCSpwb3J0ID0gc2gtPmRlc3Q7Ci0JCWZyb20gPSAmc2tiLT5uaC5pcGgtPmRhZGRyOworCQlmcm9tID0gJmlwX2hkcihza2IpLT5kYWRkcjsKIAl9CiAJbWVtY3B5KCZhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIsIGZyb20sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwogfQpAQCAtNTMwLDcgKzUzMCw3IEBACiAvKiBXYXMgdGhpcyBwYWNrZXQgbWFya2VkIGJ5IEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uPyAqLwogc3RhdGljIGludCBzY3RwX3Y0X2lzX2NlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIElORVRfRUNOX2lzX2NlKHNrYi0+bmguaXBoLT50b3MpOworCXJldHVybiBJTkVUX0VDTl9pc19jZShpcF9oZHIoc2tiKS0+dG9zKTsKIH0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHNrIGZvciB0aGUgc29ja2V0IHJldHVybmVkIGJ5IGFjY2VwdCgpLiAqLwpAQCAtNzMxLDE1ICs3MzEsMTMgQEAKIC8qIEluaXRpYWxpemUgYW5kIGNvcHkgb3V0IGEgbXNnbmFtZSBmcm9tIGFuIGluYm91bmQgc2tiLiAqLwogc3RhdGljIHZvaWQgc2N0cF9pbmV0X3NrYl9tc2duYW1lKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKm1zZ25hbWUsIGludCAqbGVuKQogewotCXN0cnVjdCBzY3RwaGRyICpzaDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQogCWlmIChtc2duYW1lKSB7CisJCXN0cnVjdCBzY3RwaGRyICpzaCA9IHNjdHBfaGRyKHNrYik7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZ25hbWU7CisKIAkJc2N0cF9pbmV0X21zZ25hbWUobXNnbmFtZSwgbGVuKTsKLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZ25hbWU7Ci0JCXNoID0gKHN0cnVjdCBzY3RwaGRyICopc2tiLT5oLnJhdzsKIAkJc2luLT5zaW5fcG9ydCA9IHNoLT5zb3VyY2U7Ci0JCXNpbi0+c2luX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAl9CiB9CiAKQEAgLTEwNDQsNyArMTA0Miw3IEBACiAJc2N0cF9jb29raWVfcHJlc2VydmVfZW5hYmxlIAk9IDE7CiAKIAkvKiBNYXguQnVyc3QJCSAgICAtIDQgKi8KLQlzY3RwX21heF9idXJzdCAJCQk9IFNDVFBfTUFYX0JVUlNUOworCXNjdHBfbWF4X2J1cnN0IAkJCT0gU0NUUF9ERUZBVUxUX01BWF9CVVJTVDsKIAogCS8qIEFzc29jaWF0aW9uLk1heC5SZXRyYW5zICAtIDEwIGF0dGVtcHRzCiAJICogUGF0aC5NYXguUmV0cmFucyAgICAgICAgIC0gNSAgYXR0ZW1wdHMgKHBlciBkZXN0aW5hdGlvbiBhZGRyZXNzKQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IGY3ZmIyOWQuLmJlNzgzYTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CiAJaW50IGlpZiA9IDA7CiAKLQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGlwdmVyMmFmKGNodW5rLT5za2ItPm5oLmlwaC0+dmVyc2lvbikpOworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoaXB2ZXIyYWYoaXBfaGRyKGNodW5rLT5za2IpLT52ZXJzaW9uKSk7CiAJaWYgKGFmKQogCQlpaWYgPSBhZi0+c2tiX2lpZihjaHVuay0+c2tiKTsKIApAQCAtMTE0Myw3ICsxMTQzLDcgQEAKIAogCS8qIEFkanVzdCB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLiAgKi8KIAljaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGggPSBodG9ucyhjaHVua2xlbiArIHBhZGxlbiArIGxlbik7Ci0JY2h1bmstPmNodW5rX2VuZCA9IGNodW5rLT5za2ItPnRhaWw7CisJY2h1bmstPmNodW5rX2VuZCA9IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYik7CiAKIAlyZXR1cm4gdGFyZ2V0OwogfQpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAkvKiBBZGp1c3QgdGhlIGNodW5rIGxlbmd0aCBmaWVsZC4gICovCiAJY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoID0KIAkJaHRvbnMobnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSArIGxlbik7Ci0JY2h1bmstPmNodW5rX2VuZCA9IGNodW5rLT5za2ItPnRhaWw7CisJY2h1bmstPmNodW5rX2VuZCA9IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYik7CiAKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKIAlhc29jLT50ZW1wID0gMTsKIAlza2IgPSBjaHVuay0+c2tiOwogCS8qIENyZWF0ZSBhbiBlbnRyeSBmb3IgdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQuICAqLwotCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoaXB2ZXIyYWYoc2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGlwdmVyMmFmKGlwX2hkcihza2IpLT52ZXJzaW9uKSk7CiAJaWYgKHVubGlrZWx5KCFhZikpCiAJCWdvdG8gZmFpbDsKIAlhZi0+ZnJvbV9za2IoJmFzb2MtPmMucGVlcl9hZGRyLCBza2IsIDEpOwpAQCAtMjA3Nyw3ICsyMDc3LDcgQEAKIAogCQkJZGVmYXVsdDogLyogSnVzdCBpZ25vcmUgYW55dGhpbmcgZWxzZS4gICovCiAJCQkJYnJlYWs7Ci0JCQl9OworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC0yMTE4LDcgKzIxMTgsNyBAQAogCQlTQ1RQX0RFQlVHX1BSSU5USygiSWdub3JpbmcgcGFyYW06ICVkIGZvciBhc3NvY2lhdGlvbiAlcC5cbiIsCiAJCQkJICBudG9ocyhwYXJhbS5wLT50eXBlKSwgYXNvYyk7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCAxMzU1Njc0Li5iMzdhN2FkIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC00NjQsNyArNDY0LDcgQEAKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAKIAlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywwLCBTQ1RQX0NBTlRfU1RSX0FTU09DLAotCQkJCQkJKF9fdTE2KWVycm9yLCAwLCAwLAorCQkJCQkJKF9fdTE2KWVycm9yLCAwLCAwLCBOVUxMLAogCQkJCQkJR0ZQX0FUT01JQyk7CiAKIAlpZiAoZXZlbnQpCkBAIC00OTIsOCArNDkyLDEzIEBACiAJLyogQ2FuY2VsIGFueSBwYXJ0aWFsIGRlbGl2ZXJ5IGluIHByb2dyZXNzLiAqLwogCXNjdHBfdWxwcV9hYm9ydF9wZCgmYXNvYy0+dWxwcSwgR0ZQX0FUT01JQyk7CiAKLQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9DT01NX0xPU1QsCi0JCQkJCQkoX191MTYpZXJyb3IsIDAsIDAsCisJaWYgKGV2ZW50X3R5cGUgPT0gU0NUUF9FVkVOVF9UX0NIVU5LICYmIHN1YnR5cGUuY2h1bmsgPT0gU0NUUF9DSURfQUJPUlQpCisJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLCAwLCBTQ1RQX0NPTU1fTE9TVCwKKwkJCQkJCShfX3UxNillcnJvciwgMCwgMCwgY2h1bmssCisJCQkJCQlHRlBfQVRPTUlDKTsKKwllbHNlCisJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLCAwLCBTQ1RQX0NPTU1fTE9TVCwKKwkJCQkJCShfX3UxNillcnJvciwgMCwgMCwgTlVMTCwKIAkJCQkJCUdGUF9BVE9NSUMpOwogCWlmIChldmVudCkKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCkBAIC0xMDA0LDcgKzEwMDksNyBAQAogCQkgICAgICAgc3RhdHVzLCBzdGF0ZSwgZXZlbnRfdHlwZSwgc3VidHlwZS5jaHVuayk7CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIAogYmFpbDoKIAlyZXR1cm4gZXJyb3I7CkBAIC0xNDg0LDcgKzE0ODksOCBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW1wb3NzaWJsZSBjb21tYW5kOiAldSwgJXBcbiIsCiAJCQkgICAgICAgY21kLT52ZXJiLCBjbWQtPm9iai5wdHIpOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KKwogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCmluZGV4IGU5MDk3Y2YuLjllMjhhNWQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAkgKiBub3RpZmljYXRpb24gaXMgcGFzc2VkIHRvIHRoZSB1cHBlciBsYXllci4KIAkgKi8KIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9TSFVURE9XTl9DT01QLAotCQkJCQkgICAgIDAsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIDAsIDAsIDAsIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmIChldikKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCiAJCQkJU0NUUF9VTFBFVkVOVChldikpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJCWNhc2UgLVNDVFBfSUVSUk9SX0JBRF9TSUc6CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Ci0JCX07CisJCX0KIAl9CiAKIApAQCAtNjYxLDcgKzY2MSw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKG5ld19hc29jLCAwLCBTQ1RQX0NPTU1fVVAsIDAsCiAJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zLAogCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCQkJCSAgICAgTlVMTCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFldikKIAkJZ290byBub21lbV9ldjsKIApAQCAtNzkwLDcgKzc5MCw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfQ09NTV9VUCwKIAkJCQkJICAgICAwLCBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCQkJCSAgICAgTlVMTCwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIWV2KQogCQlnb3RvIG5vbWVtOwpAQCAtMTE5NSw3ICsxMTk1LDcgQEAKIAkJbmV3X2Fzb2MtPmMubXlfdHRhZyAgID0gYXNvYy0+Yy5teV92dGFnOwogCQluZXdfYXNvYy0+Yy5wZWVyX3R0YWcgPSBhc29jLT5jLnBlZXJfdnRhZzsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBPdGhlciBwYXJhbWV0ZXJzIGZvciB0aGUgZW5kcG9pbnQgU0hPVUxEIGJlIGNvcGllZCBmcm9tIHRoZQogCSAqIGV4aXN0aW5nIHBhcmFtZXRlcnMgb2YgdGhlIGFzc29jaWF0aW9uIChlLmcuIG51bWJlciBvZgpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9SRVNUQVJULCAwLAogCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zLAotCQkJCQkgICAgIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmICghZXYpCiAJCWdvdG8gbm9tZW1fZXY7CiAKQEAgLTE2OTEsNyArMTY5MSw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfQ09NTV9VUCwgMCwKIAkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMsCiAJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcywKLQkJCQkJICAgICBHRlBfQVRPTUlDKTsKKwkJCQkJICAgICBOVUxMLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWV2KQogCQlnb3RvIG5vbWVtX2V2OwogCkBAIC0xNzg2LDcgKzE3ODYsNyBAQAogCQkJCQkgICAgIFNDVFBfQ09NTV9VUCwgMCwKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFldikKIAkJCWdvdG8gbm9tZW07CiAKQEAgLTE5MDQsNyArMTkwNCw3IEBACiAJCWNhc2UgLVNDVFBfSUVSUk9SX0JBRF9TSUc6CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Ci0JCX07CisJCX0KIAl9CiAKIAkvKiBDb21wYXJlIHRoZSB0aWVfdGFnIGluIGNvb2tpZSB3aXRoIHRoZSB2ZXJpZmljYXRpb24gdGFnIG9mCkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogCWRlZmF1bHQ6IC8qIERpc2NhcmQgcGFja2V0IGZvciBhbGwgb3RoZXJzLiAqLwogCQlyZXR2YWwgPSBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBEZWxldGUgdGhlIHRlbXBvcnkgbmV3IGFzc29jaWF0aW9uLiAqLwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX0FTT0MsIFNDVFBfQVNPQyhuZXdfYXNvYykpOwpAQCAtMzAzNSw3ICszMDM1LDcgQEAKIAkgKiBub3RpZmljYXRpb24gaXMgcGFzc2VkIHRvIHRoZSB1cHBlciBsYXllci4KIAkgKi8KIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9TSFVURE9XTl9DT01QLAotCQkJCQkgICAgIDAsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIDAsIDAsIDAsIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmICghZXYpCiAJCWdvdG8gbm9tZW07CiAKQEAgLTMxMTUsNyArMzExNSw3IEBACiAJCQlicmVhazsKIAogCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKLQkJaWYgKGNoX2VuZCA+IHNrYi0+dGFpbCkKKwkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCWJyZWFrOwogCiAJCWlmIChTQ1RQX0NJRF9TSFVURE9XTl9BQ0sgPT0gY2gtPnR5cGUpCkBAIC0zMTMwLDcgKzMxMzAsNyBAQAogCQkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOwogCiAJCWNoID0gKHNjdHBfY2h1bmtoZHJfdCAqKSBjaF9lbmQ7Ci0JfSB3aGlsZSAoY2hfZW5kIDwgc2tiLT50YWlsKTsKKwl9IHdoaWxlIChjaF9lbmQgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpOwogCiAJaWYgKG9vdGJfc2h1dF9hY2spCiAJCXNjdHBfc2Zfc2h1dF84XzRfNShlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CkBAIC00ODE2LDcgKzQ4MTYsNyBAQAogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIAogCWlmICghcmVwbHkpCiAJCWdvdG8gbm9tZW07CkBAIC01Mjg2LDcgKzUyODYsNyBAQAogCQljaHVuay0+ZWNuX2NlX2RvbmUgPSAxOwogCiAJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoCi0JCQlpcHZlcjJhZihjaHVuay0+c2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKwkJCWlwdmVyMmFmKGlwX2hkcihjaHVuay0+c2tiKS0+dmVyc2lvbikpOwogCiAJCWlmIChhZiAmJiBhZi0+aXNfY2UoY2h1bmstPnNrYikgJiYgYXNvYy0+cGVlci5lY25fY2FwYWJsZSkgewogCQkJLyogRG8gcmVhbCB3b3JrIGFzIHNpZGVmZmVjdC4gKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwppbmRleCA1ZTU0YjE3Li41MjMwNzFjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlkZWZhdWx0OgogCQkvKiBZaWtlcyEgIFdlIGdvdCBhbiBpbGxlZ2FsIGV2ZW50IHR5cGUuICAqLwogCQlyZXR1cm4gJmJ1ZzsKLQl9OworCX0KIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRlVOQyhmdW5jKSB7LmZuID0gZnVuYywgLm5hbWUgPSAjZnVuY30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggYTFkMDI2Zi4uMTE5MzhmYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTk0MSw3ICs5NDEsNyBAQAogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJCWJyZWFrOwotCX07CisJfQogCiBvdXQ6CiAJa2ZyZWUoa2FkZHJzKTsKQEAgLTIwMzksNiArMjAzOSwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICBTUFBfSEJfREVNQU5EIC0gUmVxdWVzdCBhIHVzZXIgaW5pdGlhdGVkIGhlYXJ0YmVhdAogICogICAgICAgICAgICAgICAgICAgICB0byBiZSBtYWRlIGltbWVkaWF0ZWx5LgogICoKKyAqICAgICAgICAgICAgICAgICAgICAgU1BQX0hCX1RJTUVfSVNfWkVSTyAtIFNwZWNpZnkncyB0aGF0IHRoZSB0aW1lIGZvcgorICogICAgICAgICAgICAgICAgICAgICBoZWFydGJlYXQgZGVsYXlpcyB0byBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIDAKKyAqICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzLgorICoKICAqICAgICAgICAgICAgICAgICAgICAgU1BQX1BNVFVEX0VOQUJMRSAtIFRoaXMgZmllbGQgd2lsbCBlbmFibGUgUE1UVQogICogICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcnkgdXBvbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIE5vdGUgdGhhdAogICogICAgICAgICAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBmZWlsZCBpcyBlbXB0eSB0aGVuIGFsbCBhZGRyZXNzZXMKQEAgLTIwODEsMTMgKzIwODUsMzAgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAocGFyYW1zLT5zcHBfaGJpbnRlcnZhbCkgewotCQlpZiAodHJhbnMpIHsKLQkJCXRyYW5zLT5oYmludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKLQkJfSBlbHNlIGlmIChhc29jKSB7Ci0JCQlhc29jLT5oYmludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKLQkJfSBlbHNlIHsKLQkJCXNwLT5oYmludGVydmFsID0gcGFyYW1zLT5zcHBfaGJpbnRlcnZhbDsKKwkvKiBOb3RlIHRoYXQgdW5sZXNzIHRoZSBzcHBfZmxhZyBpcyBzZXQgdG8gU1BQX0hCX0VOQUJMRSB0aGUgdmFsdWUgb2YKKwkgKiB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuICBOb3RlIGFsc28gdGhhdCBhIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzCisJICogdGhlIGN1cnJlbnQgc2V0dGluZyBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuCisJICovCisJaWYgKHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX0hCX0VOQUJMRSkgeworCisJCS8qIFJlLXplcm8gdGhlIGludGVydmFsIGlmIHRoZSBTUFBfSEJfVElNRV9JU19aRVJPIGlzCisJCSAqIHNldC4gIFRoaXMgbGV0cyB1cyB1c2UgMCB2YWx1ZSB3aGVuIHRoaXMgZmxhZworCQkgKiBpcyBzZXQuCisJCSAqLworCQlpZiAocGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfSEJfVElNRV9JU19aRVJPKQorCQkJcGFyYW1zLT5zcHBfaGJpbnRlcnZhbCA9IDA7CisKKwkJaWYgKHBhcmFtcy0+c3BwX2hiaW50ZXJ2YWwgfHwKKwkJICAgIChwYXJhbXMtPnNwcF9mbGFncyAmIFNQUF9IQl9USU1FX0lTX1pFUk8pKSB7CisJCQlpZiAodHJhbnMpIHsKKwkJCQl0cmFucy0+aGJpbnRlcnZhbCA9CisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocGFyYW1zLT5zcHBfaGJpbnRlcnZhbCk7CisJCQl9IGVsc2UgaWYgKGFzb2MpIHsKKwkJCQlhc29jLT5oYmludGVydmFsID0KKwkJCQkgICAgbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPmhiaW50ZXJ2YWwgPSBwYXJhbXMtPnNwcF9oYmludGVydmFsOworCQkJfQogCQl9CiAJfQogCkBAIC0yMTA0LDcgKzIxMjUsMTIgQEAKIAkJfQogCX0KIAotCWlmIChwYXJhbXMtPnNwcF9wYXRobXR1KSB7CisJLyogV2hlbiBQYXRoIE1UVSBkaXNjb3ZlcnkgaXMgZGlzYWJsZWQgdGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIHdpbGwKKwkgKiBiZSB0aGUgImZpeGVkIiBwYXRoIG10dSAoaS5lLiB0aGUgdmFsdWUgb2YgdGhlIHNwcF9mbGFncyBmaWVsZCBtdXN0CisJICogaW5jbHVkZSB0aGUgZmxhZyBTUFBfUE1UVURfRElTQUJMRSBmb3IgdGhpcyBmaWVsZCB0byBoYXZlIGFueQorCSAqIGVmZmVjdCkuCisJICovCisJaWYgKChwYXJhbXMtPnNwcF9mbGFncyAmIFNQUF9QTVRVRF9ESVNBQkxFKSAmJiBwYXJhbXMtPnNwcF9wYXRobXR1KSB7CiAJCWlmICh0cmFucykgewogCQkJdHJhbnMtPnBhdGhtdHUgPSBwYXJhbXMtPnNwcF9wYXRobXR1OwogCQkJc2N0cF9hc3NvY19zeW5jX3BtdHUoYXNvYyk7CkBAIC0yMTM1LDcgKzIxNjEsMTEgQEAKIAkJfQogCX0KIAotCWlmIChwYXJhbXMtPnNwcF9zYWNrZGVsYXkpIHsKKwkvKiBOb3RlIHRoYXQgdW5sZXNzIHRoZSBzcHBfZmxhZyBpcyBzZXQgdG8gU1BQX1NBQ0tERUxBWV9FTkFCTEUgdGhlCisJICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiAgTm90ZSBhbHNvIHRoYXQgYSB2YWx1ZSBvZiB6ZXJvCisJICogaW5kaWNhdGVzIHRoZSBjdXJyZW50IHNldHRpbmcgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLgorCSAqLworCWlmICgocGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfU0FDS0RFTEFZX0VOQUJMRSkgJiYgcGFyYW1zLT5zcHBfc2Fja2RlbGF5KSB7CiAJCWlmICh0cmFucykgewogCQkJdHJhbnMtPnNhY2tkZWxheSA9CiAJCQkJbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9zYWNrZGVsYXkpOwpAQCAtMjE2Myw3ICsyMTkzLDExIEBACiAJCX0KIAl9CiAKLQlpZiAocGFyYW1zLT5zcHBfcGF0aG1heHJ4dCkgeworCS8qIE5vdGUgdGhhdCB1bmxlc3MgdGhlIHNwcF9mbGFnIGlzIHNldCB0byBTUFBfUE1UVURfRU5BQkxFIHRoZSB2YWx1ZQorCSAqIG9mIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gIE5vdGUgYWxzbyB0aGF0IGEgdmFsdWUgb2YgemVybworCSAqIGluZGljYXRlcyB0aGUgY3VycmVudCBzZXR0aW5nIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4KKwkgKi8KKwlpZiAoKHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX1BNVFVEX0VOQUJMRSkgJiYgcGFyYW1zLT5zcHBfcGF0aG1heHJ4dCkgewogCQlpZiAodHJhbnMpIHsKIAkJCXRyYW5zLT5wYXRobWF4cnh0ID0gcGFyYW1zLT5zcHBfcGF0aG1heHJ4dDsKIAkJfSBlbHNlIGlmIChhc29jKSB7CkBAIC0yMjU1LDcgKzIyODksNyBAQAogCXJldHVybiAwOwogfQogCi0vKiA3LjEuMjQuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCisvKiA3LjEuMjMuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCiAgKgogICogICBUaGlzIG9wdGlvbnMgd2lsbCBnZXQgb3Igc2V0IHRoZSBkZWxheWVkIGFjayB0aW1lci4gIFRoZSB0aW1lIGlzIHNldAogICogICBpbiBtaWxsaXNlY29uZHMuICBJZiB0aGUgYXNzb2NfaWQgaXMgMCwgdGhlbiB0aGlzIHNldHMgb3IgZ2V0cyB0aGUKQEAgLTI3OTIsNiArMjgyNiwxMDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIDcuMS4yNC4gIEdldCBvciBzZXQgZnJhZ21lbnRlZCBpbnRlcmxlYXZlIChTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUpCisgKgorICogVGhpcyBvcHRpb25zIHdpbGwgYXQgYSBtaW5pbXVtIHNwZWNpZnkgaWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvaW5nCisgKiBmcmFnbWVudGVkIGludGVybGVhdmUuICBGcmFnbWVudGVkIGludGVybGVhdmUsIGZvciBhIG9uZSB0byBtYW55CisgKiBzb2NrZXQsIGlzIHdoZW4gc3Vic2VxdWVudCBjYWxscyB0byByZWNlaXZlIGEgbWVzc2FnZSBtYXkgcmV0dXJuCisgKiBwYXJ0cyBvZiBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCBhc3NvY2lhdGlvbnMuICBTb21lIGltcGxlbWVudGF0aW9ucworICogbWF5IGFsbG93IHlvdSB0byB0dXJuIHRoaXMgdmFsdWUgb24gb3Igb2ZmLiAgSWYgc28sIHdoZW4gdHVybmVkIG9mZiwKKyAqIG5vIGZyYWdtZW50IGludGVybGVhdmUgd2lsbCBvY2N1ciAod2hpY2ggd2lsbCBjYXVzZSBhIGhlYWQgb2YgbGluZQorICogYmxvY2tpbmcgYW1vbmdzdCBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgc2hhcmluZyB0aGUgc2FtZSBvbmUgdG8gbWFueQorICogc29ja2V0KS4gIFdoZW4gdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uLCB0aGVuIGVhY2ggcmVjZWl2ZSBjYWxsIG1heQorICogY29tZSBmcm9tIGEgZGlmZmVyZW50IGFzc29jaWF0aW9uICh0aHVzIHRoZSB1c2VyIG11c3QgcmVjZWl2ZSBkYXRhCisgKiB3aXRoIHRoZSBleHRlbmRlZCBjYWxscyAoZS5nLiBzY3RwX3JlY3Ztc2cpIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2gKKyAqIGFzc29jaWF0aW9uIGVhY2ggcmVjZWl2ZSBiZWxvbmdzIHRvLgorICoKKyAqIFRoaXMgb3B0aW9uIHRha2VzIGEgYm9vbGVhbiB2YWx1ZS4gIEEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQKKyAqIGZyYWdtZW50ZWQgaW50ZXJsZWF2ZSBpcyBvbi4gIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdAorICogZnJhZ21lbnRlZCBpbnRlcmxlYXZlIGlzIG9mZi4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgdGhpcworICogb3B0aW9uIHRvIGJlIHR1cm5lZCBvbiwgaGF2ZSBpdCBvZmYgYnkgZGVmYXVsdC4gIE90aGVyd2lzZSBhbiB1bmF3YXJlCisgKiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgb25lIHRvIG1hbnkgbW9kZWwgbWF5IGJlY29tZSBjb25mdXNlZCBhbmQgYWN0CisgKiBpbmNvcnJlY3RseS4KKyAqLworc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZnJhZ21lbnRfaW50ZXJsZWF2ZShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkgICAgICAgaW50IG9wdGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNjdHBfc2soc2spLT5mcmFnX2ludGVybGVhdmUgPSAodmFsID09IDApID8gMCA6IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS4yNS4gIFNldCBvciBHZXQgdGhlIHNjdHAgcGFydGlhbCBkZWxpdmVyeSBwb2ludAorICogICAgICAgKFNDVFBfUEFSVElBTF9ERUxJVkVSWV9QT0lOVCkKKyAqIFRoaXMgb3B0aW9uIHdpbGwgc2V0IG9yIGdldCB0aGUgU0NUUCBwYXJ0aWFsIGRlbGl2ZXJ5IHBvaW50LiAgVGhpcworICogcG9pbnQgaXMgdGhlIHNpemUgb2YgYSBtZXNzYWdlIHdoZXJlIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5IEFQSSB3aWxsIGJlCisgKiBpbnZva2VkIHRvIGhlbHAgZnJlZSB1cCByd25kIHNwYWNlIGZvciB0aGUgcGVlci4gIFNldHRpbmcgdGhpcyB0byBhCisgKiBsb3dlciB2YWx1ZSB3aWxsIGNhdXNlIHBhcnRpYWwgZGVsaXZlcnkncyB0byBoYXBwZW4gbW9yZSBvZnRlbi4gIFRoZQorICogY2FsbHMgYXJndW1lbnQgaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgb3IgZ2V0cyB0aGUgcGFydGlhbCBkZWxpdmVyeQorICogcG9pbnQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BhcnRpYWxfZGVsaXZlcnlfcG9pbnQoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkJICBpbnQgb3B0bGVuKQoreworCXUzMiB2YWw7CisKKwlpZiAob3B0bGVuICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2N0cF9zayhzayktPnBkX3BvaW50ID0gdmFsOworCisJcmV0dXJuIDA7IC8qIGlzIHRoaXMgdGhlIHJpZ2h0IGVycm9yIGNvZGU/ICovCit9CisKKy8qCisgKiA3LjEuMjguICBTZXQgb3IgR2V0IHRoZSBtYXhpbXVtIGJ1cnN0IChTQ1RQX01BWF9CVVJTVCkKKyAqCisgKiBUaGlzIG9wdGlvbiB3aWxsIGFsbG93IGEgdXNlciB0byBjaGFuZ2UgdGhlIG1heGltdW0gYnVyc3Qgb2YgcGFja2V0cworICogdGhhdCBjYW4gYmUgZW1pdHRlZCBieSB0aGlzIGFzc29jaWF0aW9uLiAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlCisgKiBpcyA0LCBhbmQgc29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlc3RyaWN0IHRoaXMgc2V0dGluZyBzbyB0aGF0IGl0CisgKiBjYW4gb25seSBiZSBsb3dlcmVkLgorICoKKyAqIE5PVEU6IFRoaXMgdGV4dCBkb2Vzbid0IHNlZW0gcmlnaHQuICBEbyB0aGlzIG9uIGEgc29ja2V0IGJhc2lzIHdpdGgKKyAqIGZ1dHVyZSBhc3NvY2lhdGlvbnMgaW5oZXJpdGluZyB0aGUgc29ja2V0IHZhbHVlLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgIGludCBvcHRsZW4pCit7CisJaW50IHZhbDsKKworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY3RwX3NrKHNrKS0+bWF4X2J1cnN0ID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKIC8qIEFQSSA2LjIgc2V0c29ja29wdCgpLCBnZXRzb2Nrb3B0KCkKICAqCiAgKiBBcHBsaWNhdGlvbnMgdXNlIHNldHNvY2tvcHQoKSBhbmQgZ2V0c29ja29wdCgpIHRvIHNldCBvciByZXRyaWV2ZQpAQCAtMjg3MSw2ICszMDAxLDkgQEAKIAljYXNlIFNDVFBfREVMQVlFRF9BQ0tfVElNRToKIAkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2RlbGF5ZWRfYWNrX3RpbWUoc2ssIG9wdHZhbCwgb3B0bGVuKTsKIAkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQ6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOwogCiAJY2FzZSBTQ1RQX0lOSVRNU0c6CiAJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9pbml0bXNnKHNrLCBvcHR2YWwsIG9wdGxlbik7CkBAIC0yOTA2LDExICszMDM5LDE2IEBACiAJY2FzZSBTQ1RQX0NPTlRFWFQ6CiAJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9jb250ZXh0KHNrLCBvcHR2YWwsIG9wdGxlbik7CiAJCWJyZWFrOwotCisJY2FzZSBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkU6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9mcmFnbWVudF9pbnRlcmxlYXZlKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9NQVhfQlVSU1Q6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzaywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwotCX07CisJfQogCiAJc2N0cF9yZWxlYXNlX3NvY2soc2spOwogCkBAIC0zMDY2LDYgKzMyMDQsNyBAQAogCXNwLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSAwOwogCiAJc3AtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSAwOworCXNwLT5tYXhfYnVyc3QgPSBzY3RwX21heF9idXJzdDsKIAogCS8qIEluaXRpYWxpemUgZGVmYXVsdCBzZXR1cCBwYXJhbWV0ZXJzLiBUaGVzZSBwYXJhbWV0ZXJzCiAJICogY2FuIGJlIG1vZGlmaWVkIHdpdGggdGhlIFNDVFBfSU5JVE1TRyBzb2NrZXQgb3B0aW9uIG9yCkBAIC0zMTM0LDggKzMyNzMsOSBAQAogCXNwLT5wZiA9IHNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpOwogCiAJLyogQ29udHJvbCB2YXJpYWJsZXMgZm9yIHBhcnRpYWwgZGF0YSBkZWxpdmVyeS4gKi8KLQlzcC0+cGRfbW9kZSAgICAgICAgICAgPSAwOworCWF0b21pY19zZXQoJnNwLT5wZF9tb2RlLCAwKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzcC0+cGRfbG9iYnkpOworCXNwLT5mcmFnX2ludGVybGVhdmUgPSAwOwogCiAJLyogQ3JlYXRlIGEgcGVyIHNvY2tldCBlbmRwb2ludCBzdHJ1Y3R1cmUuICBFdmVuIGlmIHdlCiAJICogY2hhbmdlIHRoZSBkYXRhIHN0cnVjdHVyZSByZWxhdGlvbnNoaXBzLCB0aGlzIG1heSBzdGlsbApAQCAtMzY0Miw3ICszNzgyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogNy4xLjI0LiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQorLyogNy4xLjIzLiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQogICoKICAqICAgVGhpcyBvcHRpb25zIHdpbGwgZ2V0IG9yIHNldCB0aGUgZGVsYXllZCBhY2sgdGltZXIuICBUaGUgdGltZSBpcyBzZXQKICAqICAgaW4gbWlsbGlzZWNvbmRzLiAgSWYgdGhlIGFzc29jX2lkIGlzIDAsIHRoZW4gdGhpcyBzZXRzIG9yIGdldHMgdGhlCkBAIC00NTM2LDYgKzQ2NzYsNzcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIDcuMS4yNC4gIEdldCBvciBzZXQgZnJhZ21lbnRlZCBpbnRlcmxlYXZlIChTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUpCisgKiAoY2hhcHRlciBhbmQgdmVyc2UgaXMgcXVvdGVkIGF0IHNjdHBfc2V0c29ja29wdF9mcmFnbWVudF9pbnRlcmxlYXZlKCkpCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X2ZyYWdtZW50X2ludGVybGVhdmUoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKGludCk7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+ZnJhZ19pbnRlcmxlYXZlOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogNy4xLjI1LiAgU2V0IG9yIEdldCB0aGUgc2N0cCBwYXJ0aWFsIGRlbGl2ZXJ5IHBvaW50CisgKiAoY2hhcHRlciBhbmQgdmVyc2UgaXMgcXVvdGVkIGF0IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KCkpCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3BhcnRpYWxfZGVsaXZlcnlfcG9pbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkJICBpbnQgX191c2VyICpvcHRsZW4pCit7CisgICAgICAgIHUzMiB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKHUzMik7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+cGRfcG9pbnQ7CisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworLyoKKyAqIDcuMS4yOC4gIFNldCBvciBHZXQgdGhlIG1heGltdW0gYnVyc3QgKFNDVFBfTUFYX0JVUlNUKQorICogKGNoYXB0ZXIgYW5kIHZlcnNlIGlzIHF1b3RlZCBhdCBzY3RwX3NldHNvY2tvcHRfbWF4YnVyc3QoKSkKKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfbWF4YnVyc3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCSAgICBpbnQgX191c2VyICpvcHRsZW4pCit7CisgICAgICAgIGludCB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKGludCk7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+bWF4X2J1cnN0OworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIFNDVFBfU1RBVElDIGludCBzY3RwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTQ2NDgsMTAgKzQ4NTksMjEgQEAKIAljYXNlIFNDVFBfQ09OVEVYVDoKIAkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2NvbnRleHQoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOwogCQlicmVhazsKKwljYXNlIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRToKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2ZyYWdtZW50X2ludGVybGVhdmUoc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJCSAgICAgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQ6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KHNrLCBsZW4sIG9wdHZhbCwKKwkJCQkJCQkJb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX01BWF9CVVJTVDoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X21heGJ1cnN0KHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKLQl9OworCX0KIAogCXNjdHBfcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDk3Niw3ICs1MTk4LDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0JfTsKKwl9CisKIAlpZiAoZXJyKQogCQlnb3RvIGNsZWFudXA7CiAKQEAgLTUyMzksNyArNTQ2Miw3IEBACiAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9OworCQl9CiAJfQogCXJldHVybiAwOwogfQpAQCAtNTc0Miw5ICs1OTY1LDkgQEAKIAkgKiAzKSBQZWVsaW5nIG9mZiBub24tcGFydGlhbCBkZWxpdmVyeTsgbW92ZSBwZF9sb2JieSB0byByZWNlaXZlX3F1ZXVlLgogCSAqLwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3NwLT5wZF9sb2JieSk7Ci0Jc2N0cF9zayhuZXdzayktPnBkX21vZGUgPSBhc3NvYy0+dWxwcS5wZF9tb2RlOworCWF0b21pY19zZXQoJnNjdHBfc2sobmV3c2spLT5wZF9tb2RlLCBhc3NvYy0+dWxwcS5wZF9tb2RlKTsKIAotCWlmIChzY3RwX3NrKG9sZHNrKS0+cGRfbW9kZSkgeworCWlmIChhdG9taWNfcmVhZCgmc2N0cF9zayhvbGRzayktPnBkX21vZGUpKSB7CiAJCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlOwogCiAJCS8qIERlY2lkZSB3aGljaCBxdWV1ZSB0byBtb3ZlIHBkX2xvYmJ5IHNrYnMgdG8uICovCkBAIC01NzcwLDcgKzU5OTMsNyBAQAogCQkgKiBkZWxpdmVyeSB0byBmaW5pc2guCiAJCSAqLwogCQlpZiAoYXNzb2MtPnVscHEucGRfbW9kZSkKLQkJCXNjdHBfY2xlYXJfcGQob2xkc2spOworCQkJc2N0cF9jbGVhcl9wZChvbGRzaywgTlVMTCk7CiAKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3RyYW5zcG9ydC5jIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKaW5kZXggNGQ4YzJhYi4uOTYxZGYyNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMKKysrIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKQEAgLTUwNyw3ICs1MDcsNyBAQAogCQkJdHJhbnNwb3J0LT5jd25kID0gbWF4KHRyYW5zcG9ydC0+Y3duZC8yLAogCQkJCQkJIDQqdHJhbnNwb3J0LT5hc29jLT5wYXRobXR1KTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAl0cmFuc3BvcnQtPnBhcnRpYWxfYnl0ZXNfYWNrZWQgPSAwOwogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogdHJhbnNwb3J0OiAlcCByZWFzb246ICVkIGN3bmQ6ICIKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IDJlMTFiYzguLjY2MWVhMmQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMTMxLDE5ICsxMzEsNTQgQEAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICAqc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAlfX3UxNiBmbGFncywgX191MTYgc3RhdGUsIF9fdTE2IGVycm9yLCBfX3UxNiBvdXRib3VuZCwKLQlfX3UxNiBpbmJvdW5kLCBnZnBfdCBnZnApCisJX191MTYgaW5ib3VuZCwgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqc2FjOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCS8qIElmIHRoZSBsb3dlciBsYXllciBwYXNzZWQgaW4gdGhlIGNodW5rLCBpdCB3aWxsIGJlCisJICogYW4gQUJPUlQsIHNvIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc2FjX2luZm8uCisJICovCisJaWYgKGNodW5rKSB7CisJCS8qIHNjdHBfaW5xdV9wb3AoKSBoYXMgYWxscmVhZHkgcHVsbGVkIG9mZiB0aGUgY2h1bmsKKwkJICogaGVhZGVyLiAgV2UgbmVlZCB0byBwdXQgaXQgYmFjayB0ZW1wb3JhcmlseQorCQkgKi8KKwkJc2tiX3B1c2goY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCisJCS8qIENvcHkgdGhlIGNodW5rIGRhdGEgdG8gYSBuZXcgc2tiIGFuZCByZXNlcnZlIGVub3VnaAorCQkgKiBoZWFkIHJvb20gdG8gdXNlIGFzIG5vdGlmaWNhdGlvbi4KKwkJICovCisJCXNrYiA9IHNrYl9jb3B5X2V4cGFuZChjaHVuay0+c2tiLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLCAwLCBnZnApOworCisJCWlmICghc2tiKQorCQkJZ290byBmYWlsOworCisJCS8qIHB1dCBiYWNrIHRoZSBjaHVuayBoZWFkZXIgbm93IHRoYXQgd2UgaGF2ZSBhIGNvcHkgKi8KKwkJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCisJCS8qIEVtYmVkIHRoZSBldmVudCBmaWVsZHMgaW5zaWRlIHRoZSBjbG9uZWQgc2tiLiAgKi8KKwkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04sIHNrYi0+dHJ1ZXNpemUpOworCisJCS8qIEluY2x1ZGUgdGhlIG5vdGlmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KKwkJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKQorCQkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSk7CisKKwkJLyogVHJpbSB0aGUgYnVmZmVyIHRvIHRoZSByaWdodCBsZW5ndGguICAqLworCQlza2JfdHJpbShza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpICsKKwkJCSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwl9IGVsc2UgeworCQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAogCQkJCSAgTVNHX05PVElGSUNBVElPTiwgZ2ZwKTsKLQlpZiAoIWV2ZW50KQotCQlnb3RvIGZhaWw7Ci0Jc2tiID0gc2N0cF9ldmVudDJza2IoZXZlbnQpOwotCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKikKLQkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpKTsKKwkJaWYgKCFldmVudCkKKwkJCWdvdG8gZmFpbDsKKworCQlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKikgc2tiX3B1dChza2IsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpKTsKKwl9CiAKIAkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAogCSAqIDUuMy4xLjEgU0NUUF9BU1NPQ19DSEFOR0UKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IGIyOWUzZTQuLjM0ZWI5NzcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvdWxwcXVldWUuYwpAQCAtMTM4LDI2ICsxMzgsNTkgQEAKIC8qIENsZWFyIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGUgZm9yIHRoaXMgc29ja2V0LiAgIE5vdGU6IFRoaXMKICAqIGFzc3VtZXMgdGhhdCBubyBhc3NvY2lhdGlvbiBpcyBjdXJyZW50bHkgaW4gcGFydGlhbCBkZWxpdmVyeSBtb2RlLgogICovCi1pbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2spCitpbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CiAKLQlzcC0+cGRfbW9kZSA9IDA7Ci0JaWYgKCFza2JfcXVldWVfZW1wdHkoJnNwLT5wZF9sb2JieSkpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQkJc2N0cF9za2JfbGlzdF90YWlsKCZzcC0+cGRfbG9iYnksICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCWxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKSZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7Ci0JCUlOSVRfTElTVF9IRUFEKGxpc3QpOwotCQlyZXR1cm4gMTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnBkX21vZGUpKSB7CisJCS8qIFRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG90aGVyIGFzc29jaWF0aW9ucyBpbiBQRCwgc28KKwkJICogd2UgY2FuIGdvIGFoZWFkIGFuZCBjbGVhciBvdXQgdGhlIGxvYmJ5IGluIG9uZSBzaG90CisJCSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3AtPnBkX2xvYmJ5KSkgeworCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwkJCXNjdHBfc2tiX2xpc3RfdGFpbCgmc3AtPnBkX2xvYmJ5LCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopJnNjdHBfc2soc2spLT5wZF9sb2JieTsKKwkJCUlOSVRfTElTVF9IRUFEKGxpc3QpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGVyZSBhcmUgb3RoZXIgYXNzb2NpYXRpb25zIGluIFBELCBzbyB3ZSBvbmx5IG5lZWQgdG8KKwkJICogcHVsbCBzdHVmZiBvdXQgb2YgdGhlIGxvYmJ5IHRoYXQgYmVsb25ncyB0byB0aGUKKwkJICogYXNzb2NpYXRpb25zIHRoYXQgaXMgZXhpdGluZyBQRCAoYWxsIG9mIGl0cyBub3RpZmljYXRpb25zCisJCSAqIGFyZSBwb3N0ZWQgaGVyZSkuCisJCSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3AtPnBkX2xvYmJ5KSAmJiBhc29jKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOworCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCisJCQlzY3RwX3NrYl9mb3JfZWFjaChza2IsICZzcC0+cGRfbG9iYnksIHRtcCkgeworCQkJCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKwkJCQlpZiAoZXZlbnQtPmFzb2MgPT0gYXNvYykgeworCQkJCQlfX3NrYl91bmxpbmsoc2tiLCAmc3AtPnBkX2xvYmJ5KTsKKwkJCQkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsCisJCQkJCQkJIHNrYik7CisJCQkJfQorCQkJfQorCQl9CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKKy8qIFNldCB0aGUgcGRfbW9kZSBvbiB0aGUgc29ja2V0IGFuZCB1bHBxICovCitzdGF0aWMgdm9pZCBzY3RwX3VscHFfc2V0X3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHVscHEtPmFzb2MtPmJhc2Uuc2spOworCisJYXRvbWljX2luYygmc3AtPnBkX21vZGUpOworCXVscHEtPnBkX21vZGUgPSAxOworfQorCiAvKiBDbGVhciB0aGUgcGRfbW9kZSBhbmQgcmVzdGFydCBhbnkgcGVuZGluZyBtZXNzYWdlcyB3YWl0aW5nIGZvciBkZWxpdmVyeS4gKi8KIHN0YXRpYyBpbnQgc2N0cF91bHBxX2NsZWFyX3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCiB7CiAJdWxwcS0+cGRfbW9kZSA9IDA7Ci0JcmV0dXJuIHNjdHBfY2xlYXJfcGQodWxwcS0+YXNvYy0+YmFzZS5zayk7CisJcmV0dXJuIHNjdHBfY2xlYXJfcGQodWxwcS0+YXNvYy0+YmFzZS5zaywgdWxwcS0+YXNvYyk7CiB9CiAKIC8qIElmIHRoZSBTS0Igb2YgJ2V2ZW50JyBpcyBvbiBhIGxpc3QsIGl0IGlzIHRoZSBmaXJzdCBzdWNoIG1lbWJlcgpAQCAtMTg3LDI1ICsyMjAsMzUgQEAKIAkgKiB0aGUgYXNzb2NpYXRpb24gdGhlIGNhdXNlIG9mIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5LgogCSAqLwogCi0JaWYgKCFzY3RwX3NrKHNrKS0+cGRfbW9kZSkgeworCWlmIChhdG9taWNfcmVhZCgmc2N0cF9zayhzayktPnBkX21vZGUpID09IDApIHsKIAkJcXVldWUgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7Ci0JfSBlbHNlIGlmICh1bHBxLT5wZF9tb2RlKSB7Ci0JCS8qIElmIHRoZSBhc3NvY2lhdGlvbiBpcyBpbiBwYXJ0aWFsIGRlbGl2ZXJ5LCB3ZQotCQkgKiBuZWVkIHRvIGZpbmlzaCBkZWxpdmVyaW5nIHRoZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkCi0JCSAqIHBhY2tldCBiZWZvcmUgcGFzc2luZyBhbnkgb3RoZXIgZGF0YS4gIFRoaXMgaXMKLQkJICogYmVjYXVzZSB3ZSBkb24ndCB0cnVseSBzdXBwb3J0IHN0cmVhbSBpbnRlcmxlYXZpbmcuCi0JCSAqLwotCQlpZiAoKGV2ZW50LT5tc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKSB8fAotCQkgICAgKFNDVFBfREFUQV9OT1RfRlJBRyA9PQotCQkJICAgIChldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykpKQotCQkJcXVldWUgPSAmc2N0cF9zayhzayktPnBkX2xvYmJ5OwotCQllbHNlIHsKLQkJCWNsZWFyX3BkID0gZXZlbnQtPm1zZ19mbGFncyAmIE1TR19FT1I7Ci0JCQlxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwl9IGVsc2UgeworCQlpZiAodWxwcS0+cGRfbW9kZSkgeworCQkJLyogSWYgdGhlIGFzc29jaWF0aW9uIGlzIGluIHBhcnRpYWwgZGVsaXZlcnksIHdlCisJCQkgKiBuZWVkIHRvIGZpbmlzaCBkZWxpdmVyaW5nIHRoZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkCisJCQkgKiBwYWNrZXQgYmVmb3JlIHBhc3NpbmcgYW55IG90aGVyIGRhdGEuICBUaGlzIGlzCisJCQkgKiBiZWNhdXNlIHdlIGRvbid0IHRydWx5IHN1cHBvcnQgc3RyZWFtIGludGVybGVhdmluZy4KKwkJCSAqLworCQkJaWYgKChldmVudC0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgfHwKKwkJCSAgICAoU0NUUF9EQVRBX05PVF9GUkFHID09CisJCQkJICAgIChldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykpKQorCQkJCXF1ZXVlID0gJnNjdHBfc2soc2spLT5wZF9sb2JieTsKKwkJCWVsc2UgeworCQkJCWNsZWFyX3BkID0gZXZlbnQtPm1zZ19mbGFncyAmIE1TR19FT1I7CisJCQkJcXVldWUgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgZnJhZ21lbnQgaW50ZXJsZWF2ZSBpcyBlbmFibGVkLCB3ZQorCQkJICogY2FuIHF1ZXVlIHRoaXMgdG8gdGhlIHJlY2lldmUgcXVldWUgaW5zdGVhZAorCQkJICogb2YgdGhlIGxvYmJ5LgorCQkJICovCisJCQlpZiAoc2N0cF9zayhzayktPmZyYWdfaW50ZXJsZWF2ZSkKKwkJCQlxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwkJCWVsc2UKKwkJCQlxdWV1ZSA9ICZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7CiAJCX0KLQl9IGVsc2UKLQkJcXVldWUgPSAmc2N0cF9zayhzayktPnBkX2xvYmJ5OwotCisJfQogCiAJLyogSWYgd2UgYXJlIGhhcnZlc3RpbmcgbXVsdGlwbGUgc2ticyB0aGV5IHdpbGwgYmUKIAkgKiBjb2xsZWN0ZWQgb24gYSBsaXN0LgpAQCAtMzQ4LDcgKzM5MSw3IEBACiAJCQlicmVhazsKIAkJcG9zLT5uZXh0ID0gcG5leHQ7CiAJCXBvcyA9IHBuZXh0OwotCX07CisJfQogCiAJZXZlbnQgPSBzY3RwX3NrYjJldmVudChmX2ZyYWcpOwogCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX1JFQVNNVVNSTVNHUyk7CkBAIC0zNjcsNiArNDEwLDExIEBACiAJc3RydWN0IHNrX2J1ZmYgKmZpcnN0X2ZyYWcgPSBOVUxMOwogCV9fdTMyIGN0c24sIG5leHRfdHNuOwogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpyZXR2YWwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwZF9maXJzdCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnBkX2xhc3QgPSBOVUxMOworCXNpemVfdCBwZF9sZW4gPSAwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXUzMiBwZF9wb2ludDsKIAogCS8qIEluaXRpYWxpemVkIHRvIDAganVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2UuICBXaWxsCiAJICogbmV2ZXIgYmUgdXNlZCB3aXRoIHRoaXMgdmFsdWUuIEl0IGlzIHJlZmVyZW5jZWQgb25seSBhZnRlciBpdApAQCAtMzgyLDYgKzQzMCwxMCBAQAogCSAqIHdlIGV4cGVjdCB0byBmaW5kIHRoZSByZW1haW5pbmcgbWlkZGxlIGZyYWdtZW50cyBhbmQgdGhlIGxhc3QKIAkgKiBmcmFnbWVudCBpbiBvcmRlci4gSWYgbm90LCBmaXJzdF9mcmFnIGlzIHJlc2V0IHRvIE5VTEwgYW5kIHdlCiAJICogc3RhcnQgdGhlIG5leHQgcGFzcyB3aGVuIHdlIGZpbmQgYW5vdGhlciBmaXJzdCBmcmFnbWVudC4KKwkgKgorCSAqIFRoZXJlIGlzIGEgcG90ZW50aWFsIHRvIGRvIHBhcnRpYWwgZGVsaXZlcnkgaWYgdXNlciBzZXRzCisJICogU0NUUF9QQVJUSUFMX0RFTElWRVJZX1BPSU5UIG9wdGlvbi4gTGV0cyBjb3VudCBzb21lIHRoaW5ncyBoZXJlCisJICogdG8gc2VlIGlmIGNhbiBkbyBQRC4KIAkgKi8KIAlza2JfcXVldWVfd2FsaygmdWxwcS0+cmVhc20sIHBvcykgewogCQljZXZlbnQgPSBzY3RwX3NrYjJldmVudChwb3MpOwpAQCAtMzg5LDE0ICs0NDEsMzIgQEAKIAogCQlzd2l0Y2ggKGNldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykgewogCQljYXNlIFNDVFBfREFUQV9GSVJTVF9GUkFHOgorCQkJLyogSWYgdGhpcyAiRklSU1RfRlJBRyIgaXMgdGhlIGZpcnN0CisJCQkgKiBlbGVtZW50IGluIHRoZSBxdWV1ZSwgdGhlbiBjb3VudCBpdCB0b3dhcmRzCisJCQkgKiBwb3NzaWJsZSBQRC4KKwkJCSAqLworCQkJaWYgKHBvcyA9PSB1bHBxLT5yZWFzbS5uZXh0KSB7CisJCQkgICAgcGRfZmlyc3QgPSBwb3M7CisJCQkgICAgcGRfbGFzdCA9IHBvczsKKwkJCSAgICBwZF9sZW4gPSBwb3MtPmxlbjsKKwkJCX0gZWxzZSB7CisJCQkgICAgcGRfZmlyc3QgPSBOVUxMOworCQkJICAgIHBkX2xhc3QgPSBOVUxMOworCQkJICAgIHBkX2xlbiA9IDA7CisJCQl9CisKIAkJCWZpcnN0X2ZyYWcgPSBwb3M7CiAJCQluZXh0X3RzbiA9IGN0c24gKyAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0RBVEFfTUlERExFX0ZSQUc6Ci0JCQlpZiAoKGZpcnN0X2ZyYWcpICYmIChjdHNuID09IG5leHRfdHNuKSkKKwkJCWlmICgoZmlyc3RfZnJhZykgJiYgKGN0c24gPT0gbmV4dF90c24pKSB7CiAJCQkJbmV4dF90c24rKzsKLQkJCWVsc2UKKwkJCQlpZiAocGRfZmlyc3QpIHsKKwkJCQkgICAgcGRfbGFzdCA9IHBvczsKKwkJCQkgICAgcGRfbGVuICs9IHBvcy0+bGVuOworCQkJCX0KKwkJCX0gZWxzZQogCQkJCWZpcnN0X2ZyYWcgPSBOVUxMOwogCQkJYnJlYWs7CiAKQEAgLTQwNiw4ICs0NzYsMjkgQEAKIAkJCWVsc2UKIAkJCQlmaXJzdF9mcmFnID0gTlVMTDsKIAkJCWJyZWFrOwotCQl9OworCQl9CisJfQogCisJYXNvYyA9IHVscHEtPmFzb2M7CisJaWYgKHBkX2ZpcnN0KSB7CisJCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gZW50ZXIgcGFydGlhbCBkZWxpdmVyLgorCQkgKiBXZSBjYW4gdHJpZ2dlciBwYXJ0aWFsIGRlbGl2ZXJ5IG9ubHkgaWYgZnJhbWdlbnQKKwkJICogaW50ZXJsZWF2ZSBpcyBzZXQsIG9yIHRoZSBzb2NrZXQgaXMgbm90IGFscmVhZHkKKwkJICogaW4gIHBhcnRpYWwgZGVsaXZlcnkuCisJCSAqLworCQlpZiAoIXNjdHBfc2soYXNvYy0+YmFzZS5zayktPmZyYWdfaW50ZXJsZWF2ZSAmJgorCQkgICAgYXRvbWljX3JlYWQoJnNjdHBfc2soYXNvYy0+YmFzZS5zayktPnBkX21vZGUpKQorCQkJZ290byBkb25lOworCisJCWNldmVudCA9IHNjdHBfc2tiMmV2ZW50KHBkX2ZpcnN0KTsKKwkJcGRfcG9pbnQgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZF9wb2ludDsKKwkJaWYgKHBkX3BvaW50ICYmIHBkX3BvaW50IDw9IHBkX2xlbikgeworCQkJcmV0dmFsID0gc2N0cF9tYWtlX3JlYXNzZW1ibGVkX2V2ZW50KCZ1bHBxLT5yZWFzbSwKKwkJCQkJCQkgICAgIHBkX2ZpcnN0LAorCQkJCQkJCSAgICAgcGRfbGFzdCk7CisJCQlpZiAocmV0dmFsKQorCQkJCXNjdHBfdWxwcV9zZXRfcGQodWxwcSk7CisJCX0KIAl9CiBkb25lOgogCXJldHVybiByZXR2YWw7CkBAIC00NjUsNyArNTU2LDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBOVUxMOwotCQl9OworCQl9CiAJfQogCiAJLyogV2UgaGF2ZSB0aGUgcmVhc3NlbWJsZWQgZXZlbnQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vawpAQCAtNTU3LDcgKzY0OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBOVUxMOwotCQl9OworCQl9CiAJfQogCiAJLyogV2UgaGF2ZSB0aGUgcmVhc3NlbWJsZWQgZXZlbnQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vawpAQCAtODI2LDE5ICs5MTcsMjkgQEAKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CiAKIAlhc29jID0gdWxwcS0+YXNvYzsKKwlzcCA9IHNjdHBfc2soYXNvYy0+YmFzZS5zayk7CiAKLQkvKiBBcmUgd2UgYWxyZWFkeSBpbiBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGU/ICAqLwotCWlmICghc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSkgeworCS8qIElmIHRoZSBhc3NvY2lhdGlvbiBpcyBhbHJlYWR5IGluIFBhcnRpYWwgRGVsaXZlcnkgbW9kZQorCSAqIHdlIGhhdmUgbm90aW5nIHRvIGRvLgorCSAqLworCWlmICh1bHBxLT5wZF9tb2RlKQorCQlyZXR1cm47CiAKKwkvKiBJZiB0aGUgdXNlciBlbmFibGVkIGZyYWdtZW50IGludGVybGVhdmUgc29ja2V0IG9wdGlvbiwKKwkgKiBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgY2FuIGVudGVyIHBhcnRpYWwgZGVsaXZlcnkuCisJICogT3RoZXJ3aXNlLCB3ZSBjYW4gb25seSBlbnRlciBwYXJ0aWFsIGRlbGl2ZXJ5IGlmIHRoZQorCSAqIHNvY2tldCBpcyBub3QgaW4gcGFydGlhbCBkZWxpdmVyIG1vZGUuCisJICovCisJaWYgKHNwLT5mcmFnX2ludGVybGVhdmUgfHwgYXRvbWljX3JlYWQoJnNwLT5wZF9tb2RlKSA9PSAwKSB7CiAJCS8qIElzIHBhcnRpYWwgZGVsaXZlcnkgcG9zc2libGU/ICAqLwogCQlldmVudCA9IHNjdHBfdWxwcV9yZXRyaWV2ZV9maXJzdCh1bHBxKTsKIAkJLyogU2VuZCBldmVudCB0byB0aGUgVUxQLiAgICovCiAJCWlmIChldmVudCkgewogCQkJc2N0cF91bHBxX3RhaWxfZXZlbnQodWxwcSwgZXZlbnQpOwotCQkJc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSA9IDE7Ci0JCQl1bHBxLT5wZF9tb2RlID0gMTsKKwkJCXNjdHBfdWxwcV9zZXRfcGQodWxwcSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggZWE4ZjgxYS4uMWFkNjJjMCAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtNTg1LDYgKzU4NSwzNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBjYWxsZWQgZnJvbSBzb2NrX3JlY3ZfdGltZXN0YW1wKCkgaWYgc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCkKKyAqLwordm9pZCBfX3NvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrdGltZV90IGt0ID0gc2tiLT50c3RhbXA7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVBOUykpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCS8qIFJhY2Ugb2NjdXJyZWQgYmV0d2VlbiB0aW1lc3RhbXAgZW5hYmxpbmcgYW5kIHBhY2tldAorCQkgICByZWNlaXZpbmcuICBGaWxsIGluIHRoZSBjdXJyZW50IHRpbWUgZm9yIG5vdy4gKi8KKwkJaWYgKGt0LnR2NjQgPT0gMCkKKwkJCWt0ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwkJc2tiLT50c3RhbXAgPSBrdDsKKwkJdHYgPSBrdGltZV90b190aW1ldmFsKGt0KTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fVElNRVNUQU1QLCBzaXplb2YodHYpLCAmdHYpOworCX0gZWxzZSB7CisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkJLyogUmFjZSBvY2N1cnJlZCBiZXR3ZWVuIHRpbWVzdGFtcCBlbmFibGluZyBhbmQgcGFja2V0CisJCSAgIHJlY2VpdmluZy4gIEZpbGwgaW4gdGhlIGN1cnJlbnQgdGltZSBmb3Igbm93LiAqLworCQlpZiAoa3QudHY2NCA9PSAwKQorCQkJa3QgPSBrdGltZV9nZXRfcmVhbCgpOworCQlza2ItPnRzdGFtcCA9IGt0OworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0KTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fVElNRVNUQU1QTlMsIHNpemVvZih0cyksICZ0cyk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl90aW1lc3RhbXApOworCiBzdGF0aWMgaW5saW5lIGludCBfX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKQEAgLTEyOTIsNyArMTMyMyw3IEBACiAJaW50IGVyciwgZnB1dF9uZWVkZWQ7CiAKIAlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKLQlpZihzb2NrKSB7CisJaWYgKHNvY2spIHsKIAkJZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbCh1bXlhZGRyLCBhZGRybGVuLCBhZGRyZXNzKTsKIAkJaWYgKGVyciA+PSAwKSB7CiAJCQllcnIgPSBzZWN1cml0eV9zb2NrZXRfYmluZChzb2NrLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IGYwMmYyNGEuLjU0M2IwODUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTEyMzcsMjAgKzEyMzcsMTIgQEAKIAogCXJldHVybiByZXM7CiB9Ci1zdGF0aWMgaW50IGNvbnRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoYW5kbGUgKmhhbiA9IG0tPnByaXZhdGU7Ci0Ja2ZyZWUoaGFuKTsKLQltLT5wcml2YXRlID0gTlVMTDsKLQlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwotfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb250ZW50X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBjb250ZW50X29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBjb250ZW50X3JlbGVhc2UsCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIAogc3RhdGljIHNzaXplX3QgcmVhZF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc29ja2xpYi5jIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKaW5kZXggNjM0ODg1Yi4uMWQzNzdkMSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zb2NrbGliLmMKKysrIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCWRlc2Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCWRlc2MuY291bnQgPSBza2ItPmxlbiAtIGRlc2Mub2Zmc2V0OwogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQogCQlnb3RvIG5vX2NoZWNrc3VtOwogCiAJZGVzYy5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgZGVzYy5vZmZzZXQsIHNrYi0+Y3N1bSk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IDI3NzJmZWUuLjIyZjYxYWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC03OTgsMTYgKzc5OCwxMiBAQAogCQlkcHJpbnRrKCJzdmM6IHJlY3Zmcm9tIHJldHVybmVkIGVycm9yICVkXG4iLCAtZXJyKTsKIAl9CiAJcnFzdHAtPnJxX2FkZHJsZW4gPSBzaXplb2YocnFzdHAtPnJxX2FkZHIpOwotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjID09IDApIHsKLQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0KLQkJdHYudHZfc2VjID0geHRpbWUudHZfc2VjOwotCQl0di50dl91c2VjID0geHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7Ci0JCXNrYl9zZXRfdGltZXN0YW1wKHNrYiwgJnR2KTsKKwlpZiAoc2tiLT50c3RhbXAudHY2NCA9PSAwKSB7CisJCXNrYi0+dHN0YW1wID0ga3RpbWVfZ2V0X3JlYWwoKTsKIAkJLyogRG9uJ3QgZW5hYmxlIG5ldHN0YW1wLCBzdW5ycGMgZG9lc24ndAogCQkgICBuZWVkIHRoYXQgbXVjaCBhY2N1cmFjeSAqLwogCX0KLQlza2JfZ2V0X3RpbWVzdGFtcChza2IsICZzdnNrLT5za19zay0+c2tfc3RhbXApOworCXN2c2stPnNrX3NrLT5za19zdGFtcCA9IHNrYi0+dHN0YW1wOwogCXNldF9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsgLyogdGhlcmUgbWF5IGJlIG1vcmUgZGF0YS4uLiAqLwogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5jIGIvbmV0L3RpcGMvY29uZmlnLmMKaW5kZXggMTQ3ODlhOC4uYzcxMzM3YTIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvbmZpZy5jCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC04OSw3ICs4OSw3IEBACiBpbnQgdGlwY19jZmdfYXBwZW5kX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBpbnQgdGx2X3R5cGUsCiAJCQl2b2lkICp0bHZfZGF0YSwgaW50IHRsdl9kYXRhX3NpemUpCiB7Ci0Jc3RydWN0IHRsdl9kZXNjICp0bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT50YWlsOworCXN0cnVjdCB0bHZfZGVzYyAqdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKXNrYl90YWlsX3BvaW50ZXIoYnVmKTsKIAlpbnQgbmV3X3Rsdl9zcGFjZSA9IFRMVl9TUEFDRSh0bHZfZGF0YV9zaXplKTsKIAogCWlmIChza2JfdGFpbHJvb20oYnVmKSA8IG5ld190bHZfc3BhY2UpIHsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2V0aF9tZWRpYS5jIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKaW5kZXggOWJlNDgzOS4uNjdiYjI5YiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZXRoX21lZGlhLmMKKysrIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKQEAgLTczLDcgKzczLDcgQEAKIAogCWNsb25lID0gc2tiX2Nsb25lKGJ1ZiwgR0ZQX0FUT01JQyk7CiAJaWYgKGNsb25lKSB7Ci0JCWNsb25lLT5uaC5yYXcgPSBjbG9uZS0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGNsb25lKTsKIAkJZGV2ID0gKChzdHJ1Y3QgZXRoX2JlYXJlciAqKSh0Yl9wdHItPnVzcl9oYW5kbGUpKS0+ZGV2OwogCQljbG9uZS0+ZGV2ID0gZGV2OwogCQlkZXYtPmhhcmRfaGVhZGVyKGNsb25lLCBkZXYsIEVUSF9QX1RJUEMsCkBAIC05OSw4ICs5OSw4IEBACiAKIAlpZiAobGlrZWx5KGViX3B0ci0+YmVhcmVyKSkgewogCSAgICAgICBpZiAobGlrZWx5KCFkZXYtPnByb21pc2N1aXR5KSB8fAotCQkgICAhbWVtY21wKGJ1Zi0+bWFjLnJhdyxkZXYtPmRldl9hZGRyLEVUSF9BTEVOKSB8fAotCQkgICAhbWVtY21wKGJ1Zi0+bWFjLnJhdyxkZXYtPmJyb2FkY2FzdCxFVEhfQUxFTikpIHsKKwkJICAgIW1lbWNtcChza2JfbWFjX2hlYWRlcihidWYpLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgfHwKKwkJICAgIW1lbWNtcChza2JfbWFjX2hlYWRlcihidWYpLCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pKSB7CiAJCQlzaXplID0gbXNnX3NpemUoKHN0cnVjdCB0aXBjX21zZyAqKWJ1Zi0+ZGF0YSk7CiAJCQlza2JfdHJpbShidWYsIHNpemUpOwogCQkJaWYgKGxpa2VseShidWYtPmxlbiA9PSBzaXplKSkgewpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybiAtRURRVU9UOwogCWlmICghZWJfcHRyLT5kZXYpIHsKIAkJZWJfcHRyLT5kZXYgPSBkZXY7Ci0JCWViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9USVBDKTsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLnR5cGUgPSBodG9ucyhFVEhfUF9USVBDKTsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmRldiA9IGRldjsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmZ1bmMgPSByZWN2X21zZzsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmFmX3BhY2tldF9wcml2ID0gZWJfcHRyOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCmluZGV4IDcxYzJmMmYuLjIxMjRmMzIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuYworKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJCXJldHVybiAwOwogCiAJc2tiX3B1dChidW5kbGVyLCBwYWQgKyBzaXplKTsKLQltZW1jcHkoYnVuZGxlci0+ZGF0YSArIHRvX3BvcywgYnVmLT5kYXRhLCBzaXplKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVuZGxlciwgdG9fcG9zLCBidWYtPmRhdGEsIHNpemUpOwogCW1zZ19zZXRfc2l6ZShidW5kbGVyX21zZywgdG9fcG9zICsgc2l6ZSk7CiAJbXNnX3NldF9tc2djbnQoYnVuZGxlcl9tc2csIG1zZ19tc2djbnQoYnVuZGxlcl9tc2cpICsgMSk7CiAJZGJnKCJQYWNrZWQgbXNnICMgJXUoJXUgb2N0ZXRzKSBpbnRvIHBvcyAldSBpbiBidWYoIyV1KVxuIiwKQEAgLTExMDksOCArMTEwOSw4IEBACiAJCQlpZiAoYnVuZGxlcikgewogCQkJCW1zZ19pbml0KCZidW5kbGVyX2hkciwgTVNHX0JVTkRMRVIsIE9QRU5fTVNHLAogCQkJCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbF9wdHItPmFkZHIpOwotCQkJCW1lbWNweShidW5kbGVyLT5kYXRhLCAodW5jaGFyICopJmJ1bmRsZXJfaGRyLAotCQkJCSAgICAgICBJTlRfSF9TSVpFKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShidW5kbGVyLCAmYnVuZGxlcl9oZHIsCisJCQkJCQkJSU5UX0hfU0laRSk7CiAJCQkJc2tiX3RyaW0oYnVuZGxlciwgSU5UX0hfU0laRSk7CiAJCQkJbGlua19idW5kbGVfYnVmKGxfcHRyLCBidW5kbGVyLCBidWYpOwogCQkJCWJ1ZiA9IGJ1bmRsZXI7CkBAIC0xMzgzLDkgKzEzODMsOSBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAlidWYtPm5leHQgPSBOVUxMOwotCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmZnJhZ21faGRyLCBJTlRfSF9TSVpFKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShidWYsICZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOwogCWhzeiA9IG1zZ19oZHJfc3ooaGRyKTsKLQltZW1jcHkoYnVmLT5kYXRhICsgSU5UX0hfU0laRSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVmLCBJTlRfSF9TSVpFLCBoZHIsIGhzeik7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+QlVJTEQ+Iik7CiAKIAkvKiBDaG9wIHVwIG1lc3NhZ2U6ICovCkBAIC0xNDE2LDggKzE0MTYsOCBAQAogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQl9IGVsc2UKLQkJCW1lbWNweShidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeik7Ci0KKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChidWYsIGZyYWdtX2NycywKKwkJCQkJCSAgICAgICBzZWN0X2Nycywgc3opOwogCQlzZWN0X2NycyArPSBzejsKIAkJc2VjdF9yZXN0IC09IHN6OwogCQlmcmFnbV9jcnMgKz0gc3o7CkBAIC0xNDQyLDcgKzE0NDIsNyBAQAogCiAJCQlidWYtPm5leHQgPSBOVUxMOwogCQkJcHJldi0+bmV4dCA9IGJ1ZjsKLQkJCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmZnJhZ21faGRyLCBJTlRfSF9TSVpFKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CiAJCQlmcmFnbV9jcnMgPSBJTlRfSF9TSVpFOwogCQkJZnJhZ21fcmVzdCA9IGZyYWdtX3N6OwogCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIiAgPkJVSUxEPiIpOwpAQCAtMjEzMCw3ICsyMTMwLDcgQEAKIAkJYnVmID0gbF9wdHItPnByb3RvX21zZ19xdWV1ZTsKIAkJaWYgKCFidWYpCiAJCQlyZXR1cm47Ci0JCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemVvZihsX3B0ci0+cHJvdG9fbXNnKSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCQlyZXR1cm47CiAJfQogCW1zZ19zZXRfdGltZXN0YW1wKG1zZywgamlmZmllc190b19tc2VjcyhqaWZmaWVzKSk7CkBAIC0yMTQzLDcgKzIxNDMsNyBAQAogCWlmICghYnVmKQogCQlyZXR1cm47CiAKLQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCW1zZ19zZXRfc2l6ZShidWZfbXNnKGJ1ZiksIG1zZ19zaXplKTsKIAogCWlmICh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CkBAIC0yMzE5LDggKzIzMTksOCBAQAogCQkgICAgICJ1bmFibGUgdG8gc2VuZCB0dW5uZWwgbXNnXG4iKTsKIAkJcmV0dXJuOwogCX0KLQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopdHVubmVsX2hkciwgSU5UX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsICh1bmNoYXIgKiltc2csIGxlbmd0aCk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoYnVmLCB0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVmLCBJTlRfSF9TSVpFLCBtc2csIGxlbmd0aCk7CiAJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsIHR1bm5lbC0+Yl9wdHItPm5ldF9wbGFuZSk7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+U0VORD4iKTsKIAl0aXBjX2xpbmtfc2VuZF9idWYodHVubmVsLCBidWYpOwpAQCAtMjM2MSw3ICsyMzYxLDcgQEAKIAogCQlidWYgPSBidWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKIAkJaWYgKGJ1ZikgewotCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOwogCQkJbXNnX3NldF9zaXplKCZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKIAkJCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLAogCQkJICAgIHR1bm5lbC0+Yl9wdHItPm5ldF9wbGFuZSk7CkBAIC0yNDI2LDggKzI0MjYsOSBAQAogCQkJICAgICAidW5hYmxlIHRvIHNlbmQgZHVwbGljYXRlIG1zZ1xuIik7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKLQkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsIGl0ZXItPmRhdGEsIGxlbmd0aCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKG91dGJ1ZiwgJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQob3V0YnVmLCBJTlRfSF9TSVpFLCBpdGVyLT5kYXRhLAorCQkJCQkgICAgICAgbGVuZ3RoKTsKIAkJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsCiAJCSAgICB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOwogCQltc2dfZGJnKGJ1Zl9tc2cob3V0YnVmKSwgIj5TRU5EPiIpOwpAQCAtMjQ1Nyw3ICsyNDU4LDcgQEAKIAogCWViID0gYnVmX2FjcXVpcmUoc2l6ZSk7CiAJaWYgKGViKQotCQltZW1jcHkoZWItPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShlYiwgbXNnLCBzaXplKTsKIAlyZXR1cm4gZWI7CiB9CiAKQEAgLTI1NjksNyArMjU3MCw3IEBACiAJCWlmIChvYnVmID09IE5VTEwpIHsKIAkJCXdhcm4oIkxpbmsgdW5hYmxlIHRvIHVuYnVuZGxlIG1lc3NhZ2UocylcbiIpOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJcG9zICs9IGFsaWduKG1zZ19zaXplKGJ1Zl9tc2cob2J1ZikpKTsKIAkJbXNnX2RiZyhidWZfbXNnKG9idWYpLCAiICAgICAvIik7CiAJCXRpcGNfbmV0X3JvdXRlX21zZyhvYnVmKTsKQEAgLTI2MzEsOSArMjYzMiw5IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJbXNnX3NldF9zaXplKCZmcmFnbV9oZHIsIGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7Ci0JCW1lbWNweShmcmFnbS0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOwotCQltZW1jcHkoZnJhZ20tPmRhdGEgKyBJTlRfSF9TSVpFLCBjcnMsIGZyYWdtX3N6KTsKLQorCQlza2JfY29weV90b19saW5lYXJfZGF0YShmcmFnbSwgJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChmcmFnbSwgSU5UX0hfU0laRSwgY3JzLAorCQkJCQkgICAgICAgZnJhZ21fc3opOwogCQkvKiAgU2VuZCBxdWV1ZWQgbWVzc2FnZXMgZmlyc3QsIGlmIGFueTogKi8KIAogCQlsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudHMrKzsKQEAgLTI3MzMsOCArMjczNCw4IEBACiAJCWlmIChwYnVmICE9IE5VTEwpIHsKIAkJCXBidWYtPm5leHQgPSAqcGVuZGluZzsKIAkJCSpwZW5kaW5nID0gcGJ1ZjsKLQkJCW1lbWNweShwYnVmLT5kYXRhLCAodW5jaGFyICopaW1zZywgbXNnX2RhdGFfc3ooZnJhZ20pKTsKLQorCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEocGJ1ZiwgaW1zZywKKwkJCQkJCW1zZ19kYXRhX3N6KGZyYWdtKSk7CiAJCQkvKiAgUHJlcGFyZSBidWZmZXIgZm9yIHN1YnNlcXVlbnQgZnJhZ21lbnRzLiAqLwogCiAJCQlzZXRfbG9uZ19tc2dfc2Vxbm8ocGJ1ZiwgbG9uZ19tc2dfc2VxX25vKTsKQEAgLTI3NTAsNyArMjc1MSw4IEBACiAJCXUzMiBmc3ogPSBnZXRfZnJhZ21fc2l6ZShwYnVmKTsKIAkJdTMyIGNycyA9ICgobXNnX2ZyYWdtX25vKGZyYWdtKSAtIDEpICogZnN6KTsKIAkJdTMyIGV4cF9mcmFncyA9IGdldF9leHBlY3RlZF9mcmFncyhwYnVmKSAtIDE7Ci0JCW1lbWNweShwYnVmLT5kYXRhICsgY3JzLCBtc2dfZGF0YShmcmFnbSksIGRzeik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChwYnVmLCBjcnMsCisJCQkJCSAgICAgICBtc2dfZGF0YShmcmFnbSksIGRzeik7CiAJCWJ1Zl9kaXNjYXJkKGZidWYpOwogCiAJCS8qIElzIG1lc3NhZ2UgY29tcGxldGU/ICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IDYyZDU0OTAuLjM1ZDViYTEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5oCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIG5ldC90aXBjL21zZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbWVzc2FnZSBoZWFkZXIgcm91dGluZXMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNywgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03MSw4ICs3MSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYml0cyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB3LAogCQkJCXUzMiBwb3MsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCXUzMiB3b3JkID0gbXNnX3dvcmQobSx3KSAmIH4obWFzayA8PCBwb3MpOwotCW1zZ19zZXRfd29yZChtLCB3LCAod29yZCB8PSAodmFsIDw8IHBvcykpKTsKKwl2YWwgPSAodmFsICYgbWFzaykgPDwgcG9zOworCXZhbCA9IGh0b25sKHZhbCk7CisJbWFzayA9IGh0b25sKG1hc2sgPDwgcG9zKTsKKwltLT5oZHJbd10gJj0gfm1hc2s7CisJbS0+aGRyW3ddIHw9IHZhbDsKIH0KIAogLyoKQEAgLTc4NiwxNSArNzg5LDE2IEBACiAJKmJ1ZiA9IGJ1Zl9hY3F1aXJlKHN6KTsKIAlpZiAoISgqYnVmKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KCgqYnVmKS0+ZGF0YSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YSgqYnVmLCBoZHIsIGhzeik7CiAJZm9yIChyZXMgPSAxLCBjbnQgPSAwOyByZXMgJiYgKGNudCA8IG51bV9zZWN0KTsgY250KyspIHsKIAkJaWYgKGxpa2VseSh1c3JtZW0pKQogCQkJcmVzID0gIWNvcHlfZnJvbV91c2VyKCgqYnVmKS0+ZGF0YSArIHBvcywKIAkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwKIAkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKIAkJZWxzZQotCQkJbWVtY3B5KCgqYnVmKS0+ZGF0YSArIHBvcywgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwKLQkJCSAgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9sZW4pOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KCpidWYsIHBvcywKKwkJCQkJCSAgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9iYXNlLAorCQkJCQkJICAgICAgIG1zZ19zZWN0W2NudF0uaW92X2xlbik7CiAJCXBvcyArPSBtc2dfc2VjdFtjbnRdLmlvdl9sZW47CiAJfQogCWlmIChsaWtlbHkocmVzKSkKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldGxpbmsuYyBiL25ldC90aXBjL25ldGxpbmsuYwppbmRleCBiOGUxZWRjLi40Y2RhZmEyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uZXRsaW5rLmMKKysrIGIvbmV0L3RpcGMvbmV0bGluay5jCkBAIC01Nyw3ICs1Nyw3IEBACiAKIAlpZiAocmVwX2J1ZikgewogCQlza2JfcHVzaChyZXBfYnVmLCBoZHJfc3BhY2UpOwotCQlyZXBfbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlcF9idWYtPmRhdGE7CisJCXJlcF9ubGggPSBubG1zZ19oZHIocmVwX2J1Zik7CiAJCW1lbWNweShyZXBfbmxoLCByZXFfbmxoLCBoZHJfc3BhY2UpOwogCQlyZXBfbmxoLT5ubG1zZ19sZW4gPSByZXBfYnVmLT5sZW47CiAJCWdlbmxtc2dfdW5pY2FzdChyZXBfYnVmLCByZXFfbmxoLT5ubG1zZ19waWQpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5jIGIvbmV0L3RpcGMvcG9ydC5jCmluZGV4IDVmODIxN2QuLmJjZDVkYTAgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3BvcnQuYworKysgYi9uZXQvdGlwYy9wb3J0LmMKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCW1zZ19zZXRfc2l6ZShybXNnLCBkYXRhX3N6ICsgaGRyX3N6KTsKIAltc2dfc2V0X25hbWV0eXBlKHJtc2csIG1zZ19uYW1ldHlwZShtc2cpKTsKIAltc2dfc2V0X25hbWVpbnN0KHJtc2csIG1zZ19uYW1laW5zdChtc2cpKTsKLQltZW1jcHkocmJ1Zi0+ZGF0YSArIGhkcl9zeiwgbXNnX2RhdGEobXNnKSwgZGF0YV9zeik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHJidWYsIGhkcl9zeiwgbXNnX2RhdGEobXNnKSwgZGF0YV9zeik7CiAKIAkvKiBzZW5kIHNlbGYtYWJvcnQgbWVzc2FnZSB3aGVuIHJlamVjdGluZyBvbiBhIGNvbm5lY3RlZCBwb3J0ICovCiAJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSkgewpAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlza2JfcHVzaChidWYsIGhzeik7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShidWYsIG1zZywgaHN6KTsKIAlkZXN0bm9kZSA9IG1zZ19kZXN0bm9kZShtc2cpOwogCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDE7CiAJaWYgKCF0aXBjX3BvcnRfY29uZ2VzdGVkKHBfcHRyKSkgewpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIAlpZiAoc2tiX2NvdyhidWYsIExPTkdfSF9TSVpFKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2tiX3B1c2goYnVmLCBMT05HX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgTE9OR19IX1NJWkUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBMT05HX0hfU0laRSk7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIlBSRVA6Iik7CiAJaWYgKGxpa2VseShkZXN0cG9ydCB8fCBkZXN0bm9kZSkpIHsKIAkJcF9wdHItPnNlbnQrKzsKQEAgLTE2NzksNyArMTY3OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2tiX3B1c2goYnVmLCBESVJfTVNHX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgRElSX01TR19IX1NJWkUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBESVJfTVNHX0hfU0laRSk7CiAJbXNnX2RiZyhtc2csICJidWYycG9ydDogIik7CiAJcF9wdHItPnNlbnQrKzsKIAlpZiAoZGVzdC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc29ja2V0LmMgYi9uZXQvdGlwYy9zb2NrZXQuYwppbmRleCBiNzE3MzlmLi40NTgzMmZiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9zb2NrZXQuYworKysgYi9uZXQvdGlwYy9zb2NrZXQuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogCWlmICghZXJyKSB7CiAJCWJ1Zl9jcnMgPSAodW5zaWduZWQgY2hhciAqKShUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUpOwotCQlzeiA9IGJ1Zi0+dGFpbCAtIGJ1Zl9jcnM7CisJCXN6ID0gc2tiX3RhaWxfcG9pbnRlcihidWYpIC0gYnVmX2NyczsKIAogCQluZWVkZWQgPSAoYnVmX2xlbiAtIHN6X2NvcGllZCk7CiAJCXN6X3RvX2NvcHkgPSAoc3ogPD0gbmVlZGVkKSA/IHN6IDogbmVlZGVkOwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IDYwNjk3MTYuLmFlYzhjZjEgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTEzMTksNyArMTMxOSw3IEBACiAJCXVuaXhfYXR0YWNoX2ZkcyhzaW9jYi0+c2NtLCBza2IpOwogCXVuaXhfZ2V0X3NlY2RhdGEoc2lvY2ItPnNjbSwgc2tiKTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMgYi9uZXQvd2Fucm91dGVyL3dhbm1haW4uYwppbmRleCA1ZDJkOTNkLi43YTE5ZTBlIDEwMDY0NAotLS0gYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYworKysgYi9uZXQvd2Fucm91dGVyL3dhbm1haW4uYwpAQCAtMjc3LDggKzI3Nyw4IEBACiAJCXNrYl9wdXNoKHNrYiwgNyk7CiAJCXNrYi0+ZGF0YVswXSA9IDA7CiAJCXNrYi0+ZGF0YVsxXSA9IE5MUElEX1NOQVA7Ci0JCW1lbWNweSgmc2tiLT5kYXRhWzJdLCB3YW5yb3V0ZXJfb3VpX2V0aGVyLAotCQkgICAgICAgc2l6ZW9mKHdhbnJvdXRlcl9vdWlfZXRoZXIpKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMiwgd2Fucm91dGVyX291aV9ldGhlciwKKwkJCQkJICAgICAgIHNpemVvZih3YW5yb3V0ZXJfb3VpX2V0aGVyKSk7CiAJCSooKHVuc2lnbmVkIHNob3J0Kikmc2tiLT5kYXRhWzVdKSA9IGh0b25zKHR5cGUpOwogCQlicmVhazsKIApAQCAtMzM5LDcgKzMzOSw3IEBACiAJc2tiLT5wcm90b2NvbCA9IGV0aGVydHlwZTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CS8qCVBoeXNpY2FsbHkgcG9pbnQgdG8gcG9pbnQgKi8KIAlza2JfcHVsbChza2IsIGNudCk7Ci0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXJldHVybiBldGhlcnR5cGU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9LY29uZmlnIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyOGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBDRkc4MDIxMQorICAgICAgICB0cmlzdGF0ZSAiSW1wcm92ZWQgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUEkiCisKK2NvbmZpZyBXSVJFTEVTU19FWFQKKwlib29sICJXaXJlbGVzcyBleHRlbnNpb25zIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGxlZ2FjeSB3aXJlbGVzcyBleHRlbnNpb25zCisJICAod2lyZWxlc3MgbmV0d29yayBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiB2aWEgaW9jdGxzLikKKworCSAgV2lyZWxlc3MgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGNmZzgwMjExIGFuZAorCSAgd2lsbCBiZSByZXF1aXJlZCBvbmx5IGJ5IGxlZ2FjeSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50CisJICB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMuCisKKwkgIFNheSBOIChpZiB5b3UgY2FuKSB1bmxlc3MgeW91IGtub3cgeW91IG5lZWQgd2lyZWxlc3MKKwkgIGV4dGVuc2lvbnMgZm9yIGV4dGVybmFsIG1vZHVsZXMuCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NmFlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19XSVJFTEVTU19FWFQpICs9IHdleHQubworb2JqLSQoQ09ORklHX0NGRzgwMjExKSArPSBjZmc4MDIxMS5vCisKK2NmZzgwMjExLXkgKz0gY29yZS5vIHN5c2ZzLm8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogVGhpcyBpcyB0aGUgbGludXggd2lyZWxlc3MgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcJCUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKworLyogbmFtZSBmb3Igc3lzZnMsICVkIGlzIGFwcGVuZGVkICovCisjZGVmaW5lIFBIWV9OQU1FICJwaHkiCisKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigid2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdXBwb3J0Iik7CisKKy8qIFJDVSBtaWdodCBiZSBhcHByb3ByaWF0ZSBoZXJlIHNpbmNlIHdlIHVzdWFsbHkKKyAqIG9ubHkgcmVhZCB0aGUgbGlzdCwgYW5kIHRoYXQgY2FuIGhhcHBlbiBxdWl0ZQorICogb2Z0ZW4gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGl0IGZvciBlYWNoIGNvbW1hbmQgKi8KK0xJU1RfSEVBRChjZmc4MDIxMV9kcnZfbGlzdCk7CitERUZJTkVfTVVURVgoY2ZnODAyMTFfZHJ2X211dGV4KTsKK3N0YXRpYyBpbnQgd2lwaHlfY291bnRlcjsKKworLyogZm9yIGRlYnVnZnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppZWVlODAyMTFfZGVidWdmc19kaXI7CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3Qgd2lwaHkgKndpcGh5X25ldyhzdHJ1Y3QgY2ZnODAyMTFfb3BzICpvcHMsIGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRydjsKKwlpbnQgYWxsb2Nfc2l6ZTsKKworCWFsbG9jX3NpemUgPSBzaXplb2YoKmRydikgKyBzaXplb2ZfcHJpdjsKKworCWRydiA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnYpCisJCXJldHVybiBOVUxMOworCisJZHJ2LT5vcHMgPSBvcHM7CisKKwltdXRleF9sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOworCisJZHJ2LT5pZHggPSB3aXBoeV9jb3VudGVyOworCisJLyogbm93IGluY3JlYXNlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IGRldmljZSB1bmxlc3MKKwkgKiBpdCBoYXMgd3JhcHBlZCBwcmV2aW91c2x5ICovCisJaWYgKHdpcGh5X2NvdW50ZXIgPj0gMCkKKwkJd2lwaHlfY291bnRlcisrOworCisJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOworCisJaWYgKHVubGlrZWx5KGRydi0+aWR4IDwgMCkpIHsKKwkJLyogdWdoLCB3cmFwcGVkISAqLworCQlrZnJlZShkcnYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBnaXZlIGl0IGEgcHJvcGVyIG5hbWUgKi8KKwlzbnByaW50ZihkcnYtPndpcGh5LmRldi5idXNfaWQsIEJVU19JRF9TSVpFLAorCQkgUEhZX05BTUUgIiVkIiwgZHJ2LT5pZHgpOworCisJbXV0ZXhfaW5pdCgmZHJ2LT5tdHgpOworCW11dGV4X2luaXQoJmRydi0+ZGV2bGlzdF9tdHgpOworCUlOSVRfTElTVF9IRUFEKCZkcnYtPm5ldGRldl9saXN0KTsKKworCWRldmljZV9pbml0aWFsaXplKCZkcnYtPndpcGh5LmRldik7CisJZHJ2LT53aXBoeS5kZXYuY2xhc3MgPSAmaWVlZTgwMjExX2NsYXNzOworCWRydi0+d2lwaHkuZGV2LnBsYXRmb3JtX2RhdGEgPSBkcnY7CisKKwlyZXR1cm4gJmRydi0+d2lwaHk7Cit9CitFWFBPUlRfU1lNQk9MKHdpcGh5X25ldyk7CisKK2ludCB3aXBoeV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlpbnQgcmVzOworCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKworCXJlcyA9IGRldmljZV9hZGQoJmRydi0+d2lwaHkuZGV2KTsKKwlpZiAocmVzKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlsaXN0X2FkZCgmZHJ2LT5saXN0LCAmY2ZnODAyMTFfZHJ2X2xpc3QpOworCisJLyogYWRkIHRvIGRlYnVnZnMgKi8KKwlkcnYtPndpcGh5LmRlYnVnZnNkaXIgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIod2lwaHlfbmFtZSgmZHJ2LT53aXBoeSksCisJCQkJICAgaWVlZTgwMjExX2RlYnVnZnNfZGlyKTsKKworCXJlcyA9IDA7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTCh3aXBoeV9yZWdpc3Rlcik7CisKK3ZvaWQgd2lwaHlfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKworCS8qIHByb3RlY3QgdGhlIGRldmljZSBsaXN0ICovCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKworCUJVR19PTighbGlzdF9lbXB0eSgmZHJ2LT5uZXRkZXZfbGlzdCkpOworCisJLyoKKwkgKiBUcnkgdG8gZ3JhYiBkcnYtPm10eC4gSWYgYSBjb21tYW5kIGlzIHN0aWxsIGluIHByb2dyZXNzLAorCSAqIGhvcGVmdWxseSB0aGUgZHJpdmVyIHdpbGwgcmVmdXNlIGl0IHNpbmNlIGl0J3MgdGVhcmluZworCSAqIGRvd24gdGhlIGRldmljZSBhbHJlYWR5LiBXZSB3YWl0IGZvciB0aGlzIGNvbW1hbmQgdG8gY29tcGxldGUKKwkgKiBiZWZvcmUgdW5saW5raW5nIHRoZSBpdGVtIGZyb20gdGhlIGxpc3QuCisJICogTm90ZTogYXMgY29kaWZpZWQgYnkgdGhlIEJVR19PTiBhYm92ZSB3ZSBjYW5ub3QgZ2V0IGhlcmUgaWYKKwkgKiBhIHZpcnR1YWwgaW50ZXJmYWNlIGlzIHN0aWxsIGFzc29jaWF0ZWQuIEhlbmNlLCB3ZSBjYW4gb25seQorCSAqIGdldCB0byBsb2NrIGNvbnRlbnRpb24gaGVyZSBpZiB1c2Vyc3BhY2UgaXNzdWVzIGEgY29tbWFuZAorCSAqIHRoYXQgaWRlbnRpZmllZCB0aGUgaGFyZHdhcmUgYnkgd2lwaHkgaW5kZXguCisJICovCisJbXV0ZXhfbG9jaygmZHJ2LT5tdHgpOworCS8qIHVubG9jayBhZ2FpbiBiZWZvcmUgZnJlZWluZyAqLworCW11dGV4X3VubG9jaygmZHJ2LT5tdHgpOworCisJbGlzdF9kZWwoJmRydi0+bGlzdCk7CisJZGV2aWNlX2RlbCgmZHJ2LT53aXBoeS5kZXYpOworCWRlYnVnZnNfcmVtb3ZlKGRydi0+d2lwaHkuZGVidWdmc2Rpcik7CisKKwltdXRleF91bmxvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHdpcGh5X3VucmVnaXN0ZXIpOworCit2b2lkIGNmZzgwMjExX2Rldl9mcmVlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2KQoreworCW11dGV4X2Rlc3Ryb3koJmRydi0+bXR4KTsKKwltdXRleF9kZXN0cm95KCZkcnYtPmRldmxpc3RfbXR4KTsKKwlrZnJlZShkcnYpOworfQorCit2b2lkIHdpcGh5X2ZyZWUoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlwdXRfZGV2aWNlKCZ3aXBoeS0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wod2lwaHlfZnJlZSk7CisKK3N0YXRpYyBpbnQgY2ZnODAyMTFfbmV0ZGV2X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICogbmIsCisJCQkJCSB1bnNpZ25lZCBsb25nIHN0YXRlLAorCQkJCQkgdm9pZCAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmRldjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CisKKwlpZiAoIWRldi0+aWVlZTgwMjExX3B0cikKKwkJcmV0dXJuIDA7CisKKwlyZGV2ID0gd2lwaHlfdG9fZGV2KGRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHkpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgTkVUREVWX1JFR0lTVEVSOgorCQltdXRleF9sb2NrKCZyZGV2LT5kZXZsaXN0X210eCk7CisJCWxpc3RfYWRkKCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QsICZyZGV2LT5uZXRkZXZfbGlzdCk7CisJCWlmIChzeXNmc19jcmVhdGVfbGluaygmZGV2LT5kZXYua29iaiwgJnJkZXYtPndpcGh5LmRldi5rb2JqLAorCQkJCSAgICAgICJwaHk4MDIxMSIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndpcmVsZXNzOiBmYWlsZWQgdG8gYWRkIHBoeTgwMjExICIKKwkJCQkic3ltbGluayB0byBuZXRkZXYhXG4iKTsKKwkJfQorCQlkZXYtPmllZWU4MDIxMV9wdHItPm5ldGRldiA9IGRldjsKKwkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5kZXZsaXN0X210eCk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCW11dGV4X2xvY2soJnJkZXYtPmRldmxpc3RfbXR4KTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QpKSB7CisJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5kZXYua29iaiwgInBoeTgwMjExIik7CisJCQlsaXN0X2RlbF9pbml0KCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QpOworCQl9CisJCW11dGV4X3VubG9jaygmcmRldi0+ZGV2bGlzdF9tdHgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXJfY2FsbCwKK307CisKK3N0YXRpYyBpbnQgY2ZnODAyMTFfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSB3aXBoeV9zeXNmc19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbF9zeXNmczsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmY2ZnODAyMTFfbmV0ZGV2X25vdGlmaWVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsX25vdGlmaWVyOworCisJaWVlZTgwMjExX2RlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJpZWVlODAyMTEiLCBOVUxMKTsKKworCXJldHVybiAwOworCitvdXRfZmFpbF9ub3RpZmllcjoKKwl3aXBoeV9zeXNmc19leGl0KCk7CitvdXRfZmFpbF9zeXNmczoKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoY2ZnODAyMTFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGNmZzgwMjExX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShpZWVlODAyMTFfZGVidWdmc19kaXIpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXIpOworCXdpcGh5X3N5c2ZzX2V4aXQoKTsKK30KK21vZHVsZV9leGl0KGNmZzgwMjExX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuaCBiL25ldC93aXJlbGVzcy9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4ZGIxZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGludGVybmFscy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICovCisjaWZuZGVmIF9fTkVUX1dJUkVMRVNTX0NPUkVfSAorI2RlZmluZSBfX05FVF9XSVJFTEVTU19DT1JFX0gKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisKK3N0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSB7CisJc3RydWN0IGNmZzgwMjExX29wcyAqb3BzOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiB3ZSBob2xkIHRoaXMgbXV0ZXggZHVyaW5nIGFueSBjYWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW5ub3QgZG8gbXVsdGlwbGUgY2FsbHMgYXQgb25jZSwgYW5kIGFsc28KKwkgKiB0byBhdm9pZCB0aGUgZGVyZWdpc3RlciBjYWxsIHRvIHByb2NlZWQgd2hpbGUKKwkgKiBhbnkgY2FsbCBpcyBpbiBwcm9ncmVzcyAqLworCXN0cnVjdCBtdXRleCBtdHg7CisKKwkvKiB3aXBoeSBpbmRleCwgaW50ZXJuYWwgb25seSAqLworCWludCBpZHg7CisKKwkvKiBhc3NvY2lhdGUgbmV0ZGV2IGxpc3QgKi8KKwlzdHJ1Y3QgbXV0ZXggZGV2bGlzdF9tdHg7CisJc3RydWN0IGxpc3RfaGVhZCBuZXRkZXZfbGlzdDsKKworCS8qIG11c3QgYmUgbGFzdCBiZWNhdXNlIG9mIHRoZSB3YXkgd2UgZG8gd2lwaHlfcHJpdigpLAorCSAqIGFuZCBpdCBzaG91bGQgYXQgbGVhc3QgYmUgYWxpZ25lZCB0byBORVRERVZfQUxJR04gKi8KKwlzdHJ1Y3Qgd2lwaHkgd2lwaHkgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oTkVUREVWX0FMSUdOKSkpOworfTsKKworc3RhdGljIGlubGluZQorc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICp3aXBoeV90b19kZXYoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlCVUdfT04oIXdpcGh5KTsKKwlyZXR1cm4gY29udGFpbmVyX29mKHdpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UsIHdpcGh5KTsKK30KKworZXh0ZXJuIHN0cnVjdCBtdXRleCBjZmc4MDIxMV9kcnZfbXV0ZXg7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjZmc4MDIxMV9kcnZfbGlzdDsKKworLyogZnJlZSBvYmplY3QgKi8KK2V4dGVybiB2b2lkIGNmZzgwMjExX2Rldl9mcmVlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2KTsKKworI2VuZGlmIC8qIF9fTkVUX1dJUkVMRVNTX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmMgYi9uZXQvd2lyZWxlc3Mvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJhZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyAvc3lzL2NsYXNzL2llZWU4MDIxMS88d2lwaHkgbmFtZT4vCisgKiBhbmQgc29tZSBkZWZhdWx0IGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNglKaXJpIEJlbmMgPGpiZW5jQHN1c2UuY3o+CisgKiBDb3B5cmlnaHQgMjAwNglKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBHUEx2MiBhcyBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSAic3lzZnMuaCIKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXZfdG9fcmRldigKKwlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSwgd2lwaHkuZGV2KTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfaW5kZXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2X3RvX3JkZXYoZGV2KS0+aWR4KTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfcGVybWFkZHIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJY2hhciAqYWRkciA9IGRldl90b19yZGV2KGRldiktPndpcGh5LnBlcm1fYWRkcjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAorCQkgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpZWVlODAyMTFfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSKGluZGV4LCBTX0lSVUdPLCBfc2hvd19pbmRleCwgTlVMTCksCisJX19BVFRSKG1hY2FkZHJlc3MsIFNfSVJVR08sIF9zaG93X3Blcm1hZGRyLCBOVUxMKSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgd2lwaHlfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGRldl90b19yZGV2KGRldik7CisKKwljZmc4MDIxMV9kZXZfZnJlZShyZGV2KTsKK30KKworc3RhdGljIGludCB3aXBoeV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwKKwkJCWludCBudW1fZW52cCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwkvKiBUT0RPLCB3ZSBwcm9iYWJseSBuZWVkIHN0dWZmIGhlcmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNsYXNzIGllZWU4MDIxMV9jbGFzcyA9IHsKKwkubmFtZSA9ICJpZWVlODAyMTEiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kZXZfcmVsZWFzZSA9IHdpcGh5X2Rldl9yZWxlYXNlLAorCS5kZXZfYXR0cnMgPSBpZWVlODAyMTFfZGV2X2F0dHJzLAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisJLmRldl91ZXZlbnQgPSB3aXBoeV91ZXZlbnQsCisjZW5kaWYKK307CisKK2ludCB3aXBoeV9zeXNmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZpZWVlODAyMTFfY2xhc3MpOworfQorCit2b2lkIHdpcGh5X3N5c2ZzX2V4aXQodm9pZCkKK3sKKwljbGFzc191bnJlZ2lzdGVyKCZpZWVlODAyMTFfY2xhc3MpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmggYi9uZXQvd2lyZWxlc3Mvc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFjYmViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fV0lSRUxFU1NfU1lTRlNfSAorI2RlZmluZSBfX1dJUkVMRVNTX1NZU0ZTX0gKKworZXh0ZXJuIGludCB3aXBoeV9zeXNmc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgd2lwaHlfc3lzZnNfZXhpdCh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBjbGFzcyBpZWVlODAyMTFfY2xhc3M7CisKKyNlbmRpZiAvKiBfX1dJUkVMRVNTX1NZU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWFmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCkBAIC0wLDAgKzEsMTUwOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgQVBJcy4KKyAqCisgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNyBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogKEFzIGFsbCBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoaXMgZmlsZSBpcyBHUEwpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQVBJIGRlZmluaXRpb24gOgorICogLS0tLS0tLS0tLS0tLS0KKyAqIFNlZSA8bGludXgvd2lyZWxlc3MuaD4gZm9yIGRldGFpbHMgb2YgdGhlIEFQSXMgYW5kIHRoZSByZXN0LgorICoKKyAqIEhpc3RvcnkgOgorICogLS0tLS0tLQorICoKKyAqIHYxIC0gNS4xMi4wMSAtIEplYW4gSUkKKyAqCW8gQ3JlYXRlZCB0aGlzIGZpbGUuCisgKgorICogdjIgLSAxMy4xMi4wMSAtIEplYW4gSUkKKyAqCW8gTW92ZSAvcHJvYy9uZXQvd2lyZWxlc3Mgc3R1ZmYgZnJvbSBuZXQvY29yZS9kZXYuYyB0byBoZXJlCisgKglvIE1ha2UgV2lyZWxlc3MgRXh0ZW5zaW9uIElPQ1RMcyBnbyB0aHJvdWdoIGhlcmUKKyAqCW8gQWRkZWQgaXdfaGFuZGxlciBoYW5kbGluZyA7LSkKKyAqCW8gQWRkZWQgc3RhbmRhcmQgaW9jdGwgZGVzY3JpcHRpb24KKyAqCW8gSW5pdGlhbCBkdW1iIGNvbW1pdCBzdHJhdGVneSBiYXNlZCBvbiBvcmlub2NvLmMKKyAqCisgKiB2MyAtIDE5LjEyLjAxIC0gSmVhbiBJSQorICoJbyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gb3V0IG9mIHN0YW5kYXJkX2lvY3RsW10gaW4gaW9jdGxfc3RhbmRhcmRfY2FsbAorICoJbyBBZGQgZXZlbnQgZGlzcGF0Y2hlciBmdW5jdGlvbgorICoJbyBBZGQgZXZlbnQgZGVzY3JpcHRpb24KKyAqCW8gUHJvcGFnYXRlIGV2ZW50cyBhcyBydG5ldGxpbmsgSUZMQV9XSVJFTEVTUyBvcHRpb24KKyAqCW8gR2VuZXJhdGUgZXZlbnQgb24gc2VsZWN0ZWQgU0VUIHJlcXVlc3RzCisgKgorICogdjQgLSAxOC4wNC4wMiAtIEplYW4gSUkKKyAqCW8gRml4IHN0dXBpZCBvZmYgYnkgb25lIGluIGl3X2lvY3RsX2Rlc2NyaXB0aW9uIDogSVdfRVNTSURfTUFYX1NJWkUgKyAxCisgKgorICogdjUgLSAyMS4wNi4wMiAtIEplYW4gSUkKKyAqCW8gQWRkIElXX1BSSVZfVFlQRV9BRERSIGluIHByaXZfdHlwZV9zaXplICgrY2xlYW51cCkKKyAqCW8gUmVzaHVmZmxlIElXX0hFQURFUl9UWVBFX1hYWCB0byBtYXAgSVdfUFJJVl9UWVBFX1hYWCBjaGFuZ2VzCisgKglvIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KKyAqCW8gVHVybiBvbiBXRV9TVFJJQ1RfV1JJVEUgYnkgZGVmYXVsdCArIGtlcm5lbCB3YXJuaW5nCisgKglvIEZpeCBXRV9TVFJJQ1RfV1JJVEUgaW4gaW9jdGxfZXhwb3J0X3ByaXZhdGUoKSAoMzIgPT4gaXdfbnVtKQorICoJbyBGaXggb2ZmLWJ5LW9uZSBpbiB0ZXN0IChleHRyYV9zaXplIDw9IElGTkFNU0laKQorICoKKyAqIHY2IC0gOS4wMS4wMyAtIEplYW4gSUkKKyAqCW8gQWRkIGNvbW1vbiBzcHkgc3VwcG9ydCA6IGl3X2hhbmRsZXJfc2V0X3NweSgpLCB3aXJlbGVzc19zcHlfdXBkYXRlKCkKKyAqCW8gQWRkIGVuaGFuY2VkIHNweSBzdXBwb3J0IDogaXdfaGFuZGxlcl9zZXRfdGhyc3B5KCkgYW5kIGV2ZW50LgorICoJbyBBZGQgV0lSRUxFU1NfRVhUIHZlcnNpb24gZGlzcGxheSBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCisgKiB2NiAtIDE4LjA2LjA0IC0gSmVhbiBJSQorICoJbyBDaGFuZ2UgZ2V0X3NweWRhdGEoKSBtZXRob2QgZm9yIGFkZGVkIHNhZmV0eQorICoJbyBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQorICoJbyBBbGxvdyBhbnkgc2l6ZSBHRVQgcmVxdWVzdCBpZiB1c2VyIHNwZWNpZmllcyBsZW5ndGggPiBtYXgKKyAqCQlhbmQgaWYgcmVxdWVzdCBoYXMgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIG9yIGlzIFNJT0NHSVdQUklWCisgKglvIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCisgKglvIEFkZCB3bWIoKSBpbiBpd19oYW5kbGVyX3NldF9zcHkoKSBmb3Igbm9uLWNvaGVyZW50IGFyY2hzL2NwdXMKKyAqIEJhc2VkIG9uIHBhdGNoIGZyb20gUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gOgorICoJbyBGaXgga2VybmVsIGRhdGEgbGVhayB0byB1c2VyIHNwYWNlIGluIHByaXZhdGUgaGFuZGxlciBoYW5kbGluZworICoKKyAqIHY3IC0gMTguMy4wNSAtIEplYW4gSUkKKyAqCW8gUmVtb3ZlIChzdHJ1Y3QgaXdfcG9pbnQgKiktPnBvaW50ZXIgZnJvbSBldmVudHMgYW5kIHN0cmVhbXMKKyAqCW8gUmVtb3ZlIHNweV9vZmZzZXQgZnJvbSBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYKKyAqCW8gU3RhcnQgZGVwcmVjYXRpbmcgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMsIG91dHB1dCBhIHdhcm5pbmcKKyAqCW8gSWYgSVdfUVVBTF9EQk0gaXMgc2V0LCBzaG93IGRCbSB2YWx1ZXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKglvIERvbid0IGxvb3NlIElOVkFMSUQvREJNIGZsYWdzIHdoZW4gY2xlYXJpbmcgVVBEQVRFRCBmbGFncyAoaXdzdGF0cykKKyAqCisgKiB2OCAtIDE3LjAyLjA2IC0gSmVhbiBJSQorICoJbyBSdE5ldGxpbmsgcmVxdWVzdHMgc3VwcG9ydCAoU0VUL0dFVCkKKyAqCisgKiB2OGIgLSAwMy4wOC4wNiAtIEhlcmJlcnQgWHUKKyAqCW8gRml4IFdpcmVsZXNzIEV2ZW50IGxvY2tpbmcgaXNzdWVzLgorICoKKyAqIHY5IC0gMTQuMy4wNiAtIEplYW4gSUkKKyAqCW8gQ2hhbmdlIGxlbmd0aCBpbiBFU1NJRCBhbmQgTklDSyB0byBzdHJsZW4oKSBpbnN0ZWFkIG9mIHN0cmxlbigpKzEKKyAqCW8gTWFrZSBzdGFuZGFyZF9pb2N0bF9udW0gYW5kIHN0YW5kYXJkX2V2ZW50X251bSB1bnNpZ25lZAorICoJbyBSZW1vdmUgKHN0cnVjdCBuZXRfZGV2aWNlICopLT5nZXRfd2lyZWxlc3Nfc3RhdHMoKQorICoKKyAqIHYxMCAtIDE2LjMuMDcgLSBKZWFuIElJCisgKglvIFByZXZlbnQgbGVha2luZyBvZiBrZXJuZWwgc3BhY2UgaW4gc3RyZWFtIG9uIDY0IGJpdHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIG9mZl90ICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CQkvKiBzdHJ1Y3QgaWZyZXEsIGRldl9nZXRfYnlfbmFtZSgpICovCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkJLyogcnRuZXRsaW5rIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkJLyogZm9yIF9faW5pdCAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkJLyogQVJQSFJEX0VUSEVSICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGNvbXBhcmVfZXRoZXJfYWRkciAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFByZXR0eSBvYnZpb3VzICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIE5ldyBkcml2ZXIgQVBJICovCisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvd2V4dC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JCS8qIGNvcHlfdG9fdXNlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEdMT0JBTCBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcywgYmVjYXVzZSBvZiByZS1lbnRyYW5jeS4KKyAqIE9uIG91ciBjYXNlLCBpdCdzIG9ubHkgY29uc3QsIHNvIGl0J3MgT0suLi4KKyAqLworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiByZXF1ZXN0IHdlCisgKiBrbm93IGFib3V0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uIHN0YW5kYXJkX2lvY3RsW10gPSB7CisJW1NJT0NTSVdDT01NSVQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV05BTUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0NIQVIsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV05XSUQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTldJRAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0ZSRVEsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAorCX0sCisJW1NJT0NHSVdGUkVRCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9GUkVRLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9VSU5ULAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfVUlOVCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKKwl9LAorCVtTSU9DU0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXUkFOR0UJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSksCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJCS5tYXhfdG9rZW5zCT0gMTYsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAorCX0sCisJW1NJT0NTSVdTVEFUUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXU1RBVFMJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc3RhdGlzdGljcyksCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksCisJCS5tYXhfdG9rZW5zCT0gSVdfTUFYX1NQWSwKKwl9LAorCVtTSU9DR0lXU1BZCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSArCisJCQkJICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpLAorCQkubWF4X3Rva2Vucwk9IElXX01BWF9TUFksCisJfSwKKwlbU0lPQ1NJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpd190aHJzcHkpLAorCQkubWluX3Rva2Vucwk9IDEsCisJCS5tYXhfdG9rZW5zCT0gMSwKKwl9LAorCVtTSU9DR0lXVEhSU1BZCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3RocnNweSksCisJCS5taW5fdG9rZW5zCT0gMSwKKwkJLm1heF90b2tlbnMJPSAxLAorCX0sCisJW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKKwl9LAorCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV01MTUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5taW5fdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19tbG1lKSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21sbWUpLAorCX0sCisJW1NJT0NHSVdBUExJU1QJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksCisJCS5tYXhfdG9rZW5zCT0gSVdfTUFYX0FQLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19OT01BWCwKKwl9LAorCVtTSU9DU0lXU0NBTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSAwLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc2Nhbl9yZXEpLAorCX0sCisJW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX1NDQU5fTUFYX0RBVEEsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAorCX0sCisJW1NJT0NTSVdFU1NJRAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQsCisJfSwKKwlbU0lPQ0dJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKKwl9LAorCVtTSU9DR0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfRVNTSURfTUFYX1NJWkUsCisJfSwKKwlbU0lPQ1NJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSQVRFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXRlJBRwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV0ZSQUcJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdUWFBPVwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUkVUUlkJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSRVRSWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ1NJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FTkNPRElOR19UT0tFTl9NQVgsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5UIHwgSVdfREVTQ1JfRkxBR19SRVNUUklDVCwKKwl9LAorCVtTSU9DR0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VOQ09ESU5HX1RPS0VOX01BWCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCB8IElXX0RFU0NSX0ZMQUdfUkVTVFJJQ1QsCisJfSwKKwlbU0lPQ1NJV1BPV0VSCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdHRU5JRQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKKwl9LAorCVtTSU9DR0lXR0VOSUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbU0lPQ1NJV0FVVEgJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdBVVRICS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXRU5DT0RFRVhUIC0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWluX3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCksCisJCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19lbmNvZGVfZXh0KSArCisJCQkJICBJV19FTkNPRElOR19UT0tFTl9NQVgsCisJfSwKKwlbU0lPQ0dJV0VOQ09ERUVYVCAtIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X2VuY29kZV9leHQpLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCkgKworCQkJCSAgSVdfRU5DT0RJTkdfVE9LRU5fTUFYLAorCX0sCisJW1NJT0NTSVdQTUtTQSAtIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzdGFuZGFyZF9pb2N0bF9udW0gPSBBUlJBWV9TSVpFKHN0YW5kYXJkX2lvY3RsKTsKKworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIGFkZGl0aW9uYWwgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGV2ZW50cworICogd2Uga25vdyBhYm91dC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiBzdGFuZGFyZF9ldmVudFtdID0geworCVtJV0VWVFhEUk9QCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKKwl9LAorCVtJV0VWUVVBTAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1FVQUwsCisJfSwKKwlbSVdFVkNVU1RPTQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfQ1VTVE9NX01BWCwKKwl9LAorCVtJV0VWUkVHSVNURVJFRAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJfSwKKwlbSVdFVkVYUElSRUQJLSBJV0VWRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAorCX0sCisJW0lXRVZHRU5JRQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbSVdFVk1JQ0hBRUxNSUNGQUlMVVJFCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlKSwKKwl9LAorCVtJV0VWQVNTT0NSRVFJRQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbSVdFVkFTU09DUkVTUElFCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKKwl9LAorCVtJV0VWUE1LSURDQU5ECS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta2lkX2NhbmQpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN0YW5kYXJkX2V2ZW50X251bSA9IEFSUkFZX1NJWkUoc3RhbmRhcmRfZXZlbnQpOworCisvKiBTaXplIChpbiBieXRlcykgb2YgdGhlIHZhcmlvdXMgcHJpdmF0ZSBkYXRhIHR5cGVzICovCitzdGF0aWMgY29uc3QgY2hhciBpd19wcml2X3R5cGVfc2l6ZVtdID0geworCTAsCQkJCS8qIElXX1BSSVZfVFlQRV9OT05FICovCisJMSwJCQkJLyogSVdfUFJJVl9UWVBFX0JZVEUgKi8KKwkxLAkJCQkvKiBJV19QUklWX1RZUEVfQ0hBUiAqLworCTAsCQkJCS8qIE5vdCBkZWZpbmVkICovCisJc2l6ZW9mKF9fdTMyKSwJCQkvKiBJV19QUklWX1RZUEVfSU5UICovCisJc2l6ZW9mKHN0cnVjdCBpd19mcmVxKSwJCS8qIElXX1BSSVZfVFlQRV9GTE9BVCAqLworCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpLAkvKiBJV19QUklWX1RZUEVfQUREUiAqLworCTAsCQkJCS8qIE5vdCBkZWZpbmVkICovCit9OworCisvKiBTaXplIChpbiBieXRlcykgb2YgdmFyaW91cyBldmVudHMgKi8KK3N0YXRpYyBjb25zdCBpbnQgZXZlbnRfdHlwZV9zaXplW10gPSB7CisJSVdfRVZfTENQX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9OVUxMICovCisJMCwKKwlJV19FVl9DSEFSX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9DSEFSICovCisJMCwKKwlJV19FVl9VSU5UX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9VSU5UICovCisJSVdfRVZfRlJFUV9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfRlJFUSAqLworCUlXX0VWX0FERFJfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX0FERFIgKi8KKwkwLAorCUlXX0VWX1BPSU5UX0xFTiwJCS8qIFdpdGhvdXQgdmFyaWFibGUgcGF5bG9hZCAqLworCUlXX0VWX1BBUkFNX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX1BBUkFNICovCisJSVdfRVZfUVVBTF9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfUVVBTCAqLworfTsKKworLyogU2l6ZSAoaW4gYnl0ZXMpIG9mIHZhcmlvdXMgZXZlbnRzLCBhcyBwYWNrZWQgKi8KK3N0YXRpYyBjb25zdCBpbnQgZXZlbnRfdHlwZV9wa19zaXplW10gPSB7CisJSVdfRVZfTENQX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX05VTEwgKi8KKwkwLAorCUlXX0VWX0NIQVJfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfQ0hBUiAqLworCTAsCisJSVdfRVZfVUlOVF9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9VSU5UICovCisJSVdfRVZfRlJFUV9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9GUkVRICovCisJSVdfRVZfQUREUl9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9BRERSICovCisJMCwKKwlJV19FVl9QT0lOVF9QS19MRU4sCQkvKiBXaXRob3V0IHZhcmlhYmxlIHBheWxvYWQgKi8KKwlJV19FVl9QQVJBTV9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9QQVJBTSAqLworCUlXX0VWX1FVQUxfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfUVVBTCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT01NT04gU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFN0dWZmIHRoYXQgbWF5IGJlIHVzZWQgaW4gdmFyaW91cyBwbGFjZSBvciBkb2Vzbid0IGZpdCBpbiBvbmUKKyAqIG9mIHRoZSBzZWN0aW9uIGJlbG93LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBSZXR1cm4gdGhlIGRyaXZlciBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIFdpcmVsZXNzIEV4dGVuc2lvbi4KKyAqLworc3RhdGljIGl3X2hhbmRsZXIgZ2V0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwkvKiBEb24ndCAib3B0aW1pc2UiIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIGl0IHdpbGwgY3Jhc2ggKi8KKwl1bnNpZ25lZCBpbnQJaW5kZXg7CQkvKiAqTVVTVCogYmUgdW5zaWduZWQgKi8KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgc29tZSB3aXJlbGVzcyBoYW5kbGVycyBkZWZpbmVkICovCisJaWYgKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBUcnkgYXMgYSBzdGFuZGFyZCBjb21tYW5kICovCisJaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwlpZiAoaW5kZXggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fc3RhbmRhcmQpCisJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zdGFuZGFyZFtpbmRleF07CisKKwkvKiBUcnkgYXMgYSBwcml2YXRlIGNvbW1hbmQgKi8KKwlpbmRleCA9IGNtZCAtIFNJT0NJV0ZJUlNUUFJJVjsKKwlpZiAoaW5kZXggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZSkKKwkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVbaW5kZXhdOworCisJLyogTm90IGZvdW5kICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBHZXQgc3RhdGlzdGljcyBvdXQgb2YgdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKmdldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5ldyBsb2NhdGlvbiAqLworCWlmICgoZGV2LT53aXJlbGVzc19oYW5kbGVycyAhPSBOVUxMKSAmJgorCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMgIT0gTlVMTCkpCisJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKKworCS8qIE5vdCBmb3VuZCAqLworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ2FsbCB0aGUgY29tbWl0IGhhbmRsZXIgaW4gdGhlIGRyaXZlcgorICogKGlmIGV4aXN0IGFuZCBpZiBjb25kaXRpb25zIGFyZSByaWdodCkKKyAqCisgKiBOb3RlIDogb3VyIGN1cnJlbnQgY29tbWl0IHN0cmF0ZWd5IGlzIGN1cnJlbnRseSBwcmV0dHkgZHVtYiwKKyAqIGJ1dCB3ZSB3aWxsIGJlIGFibGUgdG8gaW1wcm92ZSBvbiB0aGF0Li4uCisgKiBUaGUgZ29hbCBpcyB0byB0cnkgdG8gYWdyZWFnYXRlIGFzIG1hbnkgY2hhbmdlcyBhcyBwb3NzaWJsZQorICogYmVmb3JlIGRvaW5nIHRoZSBjb21taXQuIERyaXZlcnMgdGhhdCB3aWxsIGRlZmluZSBhIGNvbW1pdCBoYW5kbGVyCisgKiBhcmUgdXN1YWxseSB0aG9zZSB0aGF0IG5lZWQgYSByZXNldCBhZnRlciBjaGFuZ2luZyBwYXJhbWV0ZXJzLCBzbworICogd2Ugd2FudCB0byBtaW5pbWlzZSB0aGUgbnVtYmVyIG9mIHJlc2V0LgorICogQSBjb29sIGlkZWEgaXMgdG8gdXNlIGEgdGltZXIgOiBhdCBlYWNoICJzZXQiIGNvbW1hbmQsIHdlIHJlLXNldCB0aGUKKyAqIHRpbWVyLCB3aGVuIHRoZSB0aW1lciBldmVudHVhbGx5IGZpcmVzLCB3ZSBjYWxsIHRoZSBkcml2ZXIuCisgKiBIb3BlZnVsbHksIG1vcmUgb24gdGhhdCBsYXRlci4KKyAqCisgKiBBbHNvLCBJJ20gd2FpdGluZyB0byBzZWUgaG93IG1hbnkgcGVvcGxlIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlCisgKiBuZXRpZl9ydW5uaW5nKGRldikgdGVzdC4gSSdtIG9wZW4gb24gdGhhdCBvbmUuLi4KKyAqIEhvcGVmdWxseSwgdGhlIGRyaXZlciB3aWxsIHJlbWVtYmVyIHRvIGRvIGEgY29tbWl0IGluICJvcGVuKCkiIDstKQorICovCitzdGF0aWMgaW50IGNhbGxfY29tbWl0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoKG5ldGlmX3J1bm5pbmcoZGV2KSkgJiYKKwkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0gIT0gTlVMTCkpCisJCS8qIENhbGwgdGhlIGNvbW1pdCBoYW5kbGVyIG9uIHRoZSBkcml2ZXIgKi8KKwkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkWzBdKGRldiwgTlVMTCwKKwkJCQkJCQkgICBOVUxMLCBOVUxMKTsKKwllbHNlCisJCXJldHVybiAwOwkJLyogQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBDYWxjdWxhdGUgc2l6ZSBvZiBwcml2YXRlIGFyZ3VtZW50cworICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfcHJpdl9zaXplKF9fdTE2CWFyZ3MpCit7CisJaW50CW51bSA9IGFyZ3MgJiBJV19QUklWX1NJWkVfTUFTSzsKKwlpbnQJdHlwZSA9IChhcmdzICYgSVdfUFJJVl9UWVBFX01BU0spID4+IDEyOworCisJcmV0dXJuIG51bSAqIGl3X3ByaXZfdHlwZV9zaXplW3R5cGVdOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUmUtY2FsY3VsYXRlIHRoZSBzaXplIG9mIHByaXZhdGUgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFkanVzdF9wcml2X3NpemUoX191MTYJCWFyZ3MsCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUpCit7CisJaW50CW51bSA9IHdycXUtPmRhdGEubGVuZ3RoOworCWludAltYXggPSBhcmdzICYgSVdfUFJJVl9TSVpFX01BU0s7CisJaW50CXR5cGUgPSAoYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSA+PiAxMjsKKworCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGRvZXNuJ3QgZ29vZiB1cCAqLworCWlmIChtYXggPCBudW0pCisJCW51bSA9IG1heDsKKworCXJldHVybiBudW0gKiBpd19wcml2X3R5cGVfc2l6ZVt0eXBlXTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgd2lyZWxlc3Mgc3RhdHMKKyAqCUFsbG93IHByb2dyYW1hdGljIGFjY2VzcyB0byAvcHJvYy9uZXQvd2lyZWxlc3MgZXZlbiBpZiAvcHJvYworICoJZG9lc24ndCBleGlzdC4uLiBBbHNvIG1vcmUgZWZmaWNpZW50Li4uCisgKi8KK3N0YXRpYyBpbnQgaXdfaGFuZGxlcl9nZXRfaXdzdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKKwkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgkJd3JxdSwKKwkJCQkgIGNoYXIgKgkJCWV4dHJhKQoreworCS8qIEdldCBzdGF0cyBmcm9tIHRoZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqc3RhdHM7CisKKwlzdGF0cyA9IGdldF93aXJlbGVzc19zdGF0cyhkZXYpOworCWlmIChzdGF0cykgeworCQkvKiBDb3B5IHN0YXRpc3RpY3MgdG8gZXh0cmEgKi8KKwkJbWVtY3B5KGV4dHJhLCBzdGF0cywgc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKSk7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKTsKKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSB1cGRhdGVkIGZsYWcgKi8KKwkJaWYgKHdycXUtPmRhdGEuZmxhZ3MgIT0gMCkKKwkJCXN0YXRzLT5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfQUxMX1VQREFURUQ7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGl3cHJpdiBkZWZpbml0aW9ucworICogRXhwb3J0IHRoZSBkcml2ZXIgcHJpdmF0ZSBoYW5kbGVyIGRlZmluaXRpb24KKyAqIFRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdG9vbHMgbGlrZSBpd3ByaXYuLi4KKyAqLworc3RhdGljIGludCBpd19oYW5kbGVyX2dldF9wcml2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJCWRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCQl3cnF1LAorCQkJCSAgY2hhciAqCQkJZXh0cmEpCit7CisJLyogQ2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCAqLworCWlmICgoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJncyA9PSAwKSB8fAorCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MgPT0gTlVMTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgdXAgdGhlcmUgKi8KKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZV9hcmdzKSB7CisJCS8qIFVzZXIgc3BhY2UgY2FuJ3Qga25vdyBpbiBhZHZhbmNlIGhvdyBsYXJnZSB0aGUgYnVmZmVyCisJCSAqIG5lZWRzIHRvIGJlLiBHaXZlIGl0IGEgaGludCwgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydAorCQkgKiBhbnkgc2l6ZSBidWZmZXIgd2Ugd2FudCBzb21ld2hhdCBlZmZpY2llbnRseS4uLiAqLworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7CisJCXJldHVybiAtRTJCSUc7CisJfQorCisJLyogU2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGlvY3Rscy4gKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7CisKKwkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIuICovCisJbWVtY3B5KGV4dHJhLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSAqIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKiAvcHJvYy9uZXQvd2lyZWxlc3MgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgL3Byb2MvbmV0L3dpcmVsZXNzIGZpbGUgaXMgYSBodW1hbiByZWFkYWJsZSB1c2VyLXNwYWNlIGludGVyZmFjZQorICogZXhwb3J0aW5nIHZhcmlvdXMgd2lyZWxlc3Mgc3BlY2lmaWMgc3RhdGlzdGljcyBmcm9tIHRoZSB3aXJlbGVzcyBkZXZpY2VzLgorICogVGhpcyBpcyB0aGUgbW9zdCBwb3B1bGFyIHBhcnQgb2YgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgOy0pCisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYSBwdXJlIGNsb25lIG9mIC9wcm9jL25ldC9kZXYgKGluIG5ldC9jb3JlL2Rldi5jKS4KKyAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGlzIGJhc2ljYWxseSB0aGUgY29udGVudCBvZiAic3RydWN0IGl3X3N0YXRpc3RpY3MiLgorICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUHJpbnQgb25lIGVudHJ5IChsaW5lKSBvZiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqLworc3RhdGljIHZvaWQgd2lyZWxlc3Nfc2VxX3ByaW50Zl9zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEdldCBzdGF0cyBmcm9tIHRoZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqc3RhdHMgPSBnZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKKworCWlmIChzdGF0cykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiU2czogJTA0eCAgJTNkJWMgICUzZCVjICAlM2QlYyAgJTZkICU2ZCAlNmQgIgorCQkJCSIlNmQgJTZkICAgJTZkXG4iLAorCQkJICAgZGV2LT5uYW1lLCBzdGF0cy0+c3RhdHVzLCBzdGF0cy0+cXVhbC5xdWFsLAorCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfUVVBTF9VUERBVEVECisJCQkgICA/ICcuJyA6ICcgJywKKwkJCSAgICgoX19zMzIpIHN0YXRzLT5xdWFsLmxldmVsKSAtCisJCQkgICAoKHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0RCTSkgPyAweDEwMCA6IDApLAorCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJICAgPyAnLicgOiAnICcsCisJCQkgICAoKF9fczMyKSBzdGF0cy0+cXVhbC5ub2lzZSkgLQorCQkJICAgKChzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9EQk0pID8gMHgxMDAgOiAwKSwKKwkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX05PSVNFX1VQREFURUQKKwkJCSAgID8gJy4nIDogJyAnLAorCQkJICAgc3RhdHMtPmRpc2NhcmQubndpZCwgc3RhdHMtPmRpc2NhcmQuY29kZSwKKwkJCSAgIHN0YXRzLT5kaXNjYXJkLmZyYWdtZW50LCBzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzLAorCQkJICAgc3RhdHMtPmRpc2NhcmQubWlzYywgc3RhdHMtPm1pc3MuYmVhY29uKTsKKwkJc3RhdHMtPnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBQcmludCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MgKHByaW50IGFsbCBlbnRyaWVzKQorICovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJJbnRlci18IHN0YS18ICAgUXVhbGl0eSAgICAgICAgfCAgIERpc2NhcmRlZCAiCisJCQkJInBhY2tldHMgICAgICAgICAgICAgICB8IE1pc3NlZCB8IFdFXG4iCisJCQkJIiBmYWNlIHwgdHVzIHwgbGluayBsZXZlbCBub2lzZSB8ICBud2lkICAiCisJCQkJImNyeXB0ICAgZnJhZyAgcmV0cnkgICBtaXNjIHwgYmVhY29uIHwgJWRcbiIsCisJCQkgICBXSVJFTEVTU19FWFQpOworCWVsc2UKKwkJd2lyZWxlc3Nfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdpcmVsZXNzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IHdpcmVsZXNzX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCB3aXJlbGVzc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJndpcmVsZXNzX3NlcV9vcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3aXJlbGVzc19zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB3aXJlbGVzc19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitpbnQgX19pbml0IHdleHRfcHJvY19pbml0KHZvaWQpCit7CisJLyogQ3JlYXRlIC9wcm9jL25ldC93aXJlbGVzcyBlbnRyeSAqLworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIndpcmVsZXNzIiwgU19JUlVHTywgJndpcmVsZXNzX3NlcV9mb3BzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSU9DVEwgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgb3JpZ2luYWwgdXNlciBzcGFjZSBBUEkgdG8gY29uZmlndXJlIGFsbCB0aG9zZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBpcyB0aHJvdWdoIElPQ1RMcy4KKyAqIEluIHRoZXJlLCB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5ldyBkcml2ZXIgQVBJIChpd19oYW5kbGVyKQorICogb3IganVzdCBjYWxsIHRoZSBkcml2ZXIgaW9jdGwgaGFuZGxlci4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXIuCisgKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgbW92aW5nIGRhdGEgYmV0d2VlbgorICogdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLgorICovCitzdGF0aWMgaW50IGlvY3RsX3N0YW5kYXJkX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgICAgICAgc3RydWN0IGlmcmVxICoJCWlmciwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQJCWNtZCwKKwkJCSAgICAgICBpd19oYW5kbGVyCQloYW5kbGVyKQoreworCXN0cnVjdCBpd3JlcSAqCQkJCWl3ciA9IChzdHJ1Y3QgaXdyZXEgKikgaWZyOworCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyOworCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCQlpbmZvOworCWludAkJCQkJcmV0ID0gLUVJTlZBTDsKKworCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCisJaWYgKChjbWQgLSBTSU9DSVdGSVJTVCkgPj0gc3RhbmRhcmRfaW9jdGxfbnVtKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZCAtIFNJT0NJV0ZJUlNUXSk7CisKKwkvKiBQcmVwYXJlIHRoZSBjYWxsICovCisJaW5mby5jbWQgPSBjbWQ7CisJaW5mby5mbGFncyA9IDA7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgcG9pbnRlciB0byB1c2VyIHNwYWNlIGRhdGEgb3Igbm90ICovCisJaWYgKGRlc2NyLT5oZWFkZXJfdHlwZSAhPSBJV19IRUFERVJfVFlQRV9QT0lOVCkgeworCisJCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KKwkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIE5VTEwpOworCisJCS8qIEdlbmVyYXRlIGFuIGV2ZW50IHRvIG5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZSAqLworCQlpZiAoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCisJCSAgICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVJV0NPTU1JVCkpKQorCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLCBOVUxMKTsKKwl9IGVsc2UgeworCQljaGFyICoJZXh0cmE7CisJCWludAlleHRyYV9zaXplOworCQlpbnQJdXNlcl9sZW5ndGggPSAwOworCQlpbnQJZXJyOworCQlpbnQJZXNzaWRfY29tcGF0ID0gMDsKKworCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCisJCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLworCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKKworCQkvKiBDaGVjayBuZWVkIGZvciBFU1NJRCBjb21wYXRpYmlsaXR5IGZvciBXRSA8IDIxICovCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NJV0VTU0lEOgorCQljYXNlIFNJT0NHSVdFU1NJRDoKKwkJY2FzZSBTSU9DU0lXTklDS046CisJCWNhc2UgU0lPQ0dJV05JQ0tOOgorCQkJaWYgKGl3ci0+dS5kYXRhLmxlbmd0aCA9PSBkZXNjci0+bWF4X3Rva2VucyArIDEpCisJCQkJZXNzaWRfY29tcGF0ID0gMTsKKwkJCWVsc2UgaWYgKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCQljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisKKwkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKGVzc2lkW2l3ci0+dS5kYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCisJCQkJCWVzc2lkX2NvbXBhdCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaXdyLT51LmRhdGEubGVuZ3RoIC09IGVzc2lkX2NvbXBhdDsKKworCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCisJCWlmIChJV19JU19TRVQoY21kKSkgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZiAoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKKwkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkvKiBDaGVjayBpZiBudW1iZXIgb2YgdG9rZW4gZml0cyB3aXRoaW4gYm91bmRzICovCisJCQlpZiAoaXdyLT51LmRhdGEubGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWlmIChpd3ItPnUuZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLworCQkJaWYgKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCS8qIFNhdmUgdXNlciBzcGFjZSBidWZmZXIgc2l6ZSBmb3IgY2hlY2tpbmcgKi8KKwkJCXVzZXJfbGVuZ3RoID0gaXdyLT51LmRhdGEubGVuZ3RoOworCisJCQkvKiBEb24ndCBjaGVjayBpZiB1c2VyX2xlbmd0aCA+IG1heCB0byBhbGxvdyBmb3J3YXJkCisJCQkgKiBjb21wYXRpYmlsaXR5LiBUaGUgdGVzdCB1c2VyX2xlbmd0aCA8IG1pbiBpcworCQkJICogaW1wbGllZCBieSB0aGUgdGVzdCBhdCB0aGUgZW5kLiAqLworCisJCQkvKiBTdXBwb3J0IGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzICovCisJCQlpZiAoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfTk9NQVgpICYmCisJCQkgICAodXNlcl9sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykpIHsKKwkJCQkvKiBBbGxvdyB1c2Vyc3BhY2UgdG8gR0VUIG1vcmUgdGhhbiBtYXggc28KKwkJCQkgKiB3ZSBjYW4gc3VwcG9ydCBhbnkgc2l6ZSBHRVQgcmVxdWVzdHMuCisJCQkJICogVGhlcmUgaXMgc3RpbGwgYSBsaW1pdCA6IC1FTk9NRU0uICovCisJCQkJZXh0cmFfc2l6ZSA9IHVzZXJfbGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7CisJCQkJLyogTm90ZSA6IHVzZXJfbGVuZ3RoIGlzIG9yaWdpbmFsbHkgYSBfX3UxNiwKKwkJCQkgKiBhbmQgdG9rZW5fc2l6ZSBpcyBjb250cm9sbGVkIGJ5IHVzLAorCQkJCSAqIHNvIGV4dHJhX3NpemUgd29uJ3QgZ2V0IG5lZ2F0aXZlIGFuZAorCQkJCSAqIHdvbid0IG92ZXJmbG93Li4uICovCisJCQl9CisJCX0KKworCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgKi8KKwkJLyogICAga3phbGxvYyBlbnN1cmVzIE5VTEwtdGVybWluYXRpb24gZm9yIGVzc2lkX2NvbXBhdCAqLworCQlleHRyYSA9IGt6YWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChleHRyYSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogSWYgaXQgaXMgYSBTRVQsIGdldCBhbGwgdGhlIGV4dHJhIGRhdGEgaW4gaGVyZSAqLworCQlpZiAoSVdfSVNfU0VUKGNtZCkgJiYgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkgeworCQkJZXJyID0gY29weV9mcm9tX3VzZXIoZXh0cmEsIGl3ci0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJICAgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJa2ZyZWUoZXh0cmEpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisKKwkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLworCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgZXh0cmEpOworCisJCWl3ci0+dS5kYXRhLmxlbmd0aCArPSBlc3NpZF9jb21wYXQ7CisKKwkJLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuIHRvIHRoZSB1c2VyICovCisJCWlmICghcmV0ICYmIElXX0lTX0dFVChjbWQpKSB7CisJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHVwIHRoZXJlICovCisJCQlpZiAodXNlcl9sZW5ndGggPCBpd3ItPnUuZGF0YS5sZW5ndGgpIHsKKwkJCQlrZnJlZShleHRyYSk7CisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCX0KKworCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAorCQkJCQkgICBpd3ItPnUuZGF0YS5sZW5ndGggKgorCQkJCQkgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAoZXJyKQorCQkJCXJldCA9ICAtRUZBVUxUOworCQl9CisKKwkJLyogR2VuZXJhdGUgYW4gZXZlbnQgdG8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlICovCisJCWlmICgoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19FVkVOVCkgJiYKKwkJICAgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtRUlXQ09NTUlUKSkpIHsKKwkJCWlmIChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX1JFU1RSSUNUKQorCQkJCS8qIElmIHRoZSBldmVudCBpcyByZXN0cmljdGVkLCBkb24ndAorCQkJCSAqIGV4cG9ydCB0aGUgcGF5bG9hZCAqLworCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICYoaXdyLT51KSwgTlVMTCk7CisJCQllbHNlCisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLAorCQkJCQkJICAgIGV4dHJhKTsKKwkJfQorCisJCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLworCWlmIChyZXQgPT0gLUVJV0NPTU1JVCkKKwkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOworCisJLyogSGVyZSwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVlZGVkICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV3JhcHBlciB0byBjYWxsIGEgcHJpdmF0ZSBXaXJlbGVzcyBFeHRlbnNpb24gaGFuZGxlci4KKyAqIFdlIGRvIHZhcmlvdXMgY2hlY2tzIGFuZCBhbHNvIHRha2UgY2FyZSBvZiBtb3ZpbmcgZGF0YSBiZXR3ZWVuCisgKiB1c2VyIHNwYWNlIGFuZCBrZXJuZWwgc3BhY2UuCisgKiBJdCdzIG5vdCBhcyBuaWNlIGFuZCBzbGltbGluZSBhcyB0aGUgc3RhbmRhcmQgd3JhcHBlci4gVGhlIGNhdXNlCisgKiBpcyBzdHJ1Y3QgaXdfcHJpdl9hcmdzLCB3aGljaCB3YXMgbm90IHJlYWxseSBkZXNpZ25lZCBmb3IgdGhlCisgKiBqb2Igd2UgYXJlIGdvaW5nIGhlcmUuCisgKgorICogSU1QT1JUQU5UIDogVGhpcyBmdW5jdGlvbiBwcmV2ZW50IHRvIHNldCBhbmQgZ2V0IGRhdGEgb24gdGhlIHNhbWUKKyAqIElPQ1RMIGFuZCBlbmZvcmNlIHRoZSBTRVQvR0VUIGNvbnZlbnRpb24uIE5vdCBkb2luZyBpdCB3b3VsZCBiZQorICogZmFyIHRvbyBoYWlyeS4uLgorICogSWYgeW91IG5lZWQgdG8gc2V0IGFuZCBnZXQgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLCBwbGVhc2UgZG9uJ3QgdXNlCisgKiBhIGl3X2hhbmRsZXIgYnV0IHByb2Nlc3MgaXQgaW4geW91ciBpb2N0bCBoYW5kbGVyIChpLmUuIHVzZSB0aGUKKyAqIG9sZCBkcml2ZXIgQVBJKS4KKyAqLworc3RhdGljIGludCBpb2N0bF9wcml2YXRlX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCBpd19oYW5kbGVyIGhhbmRsZXIpCit7CisJc3RydWN0IGl3cmVxICoJCQlpd3IgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKwljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJZGVzY3IgPSBOVUxMOworCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCWluZm87CisJaW50CQkJCWV4dHJhX3NpemUgPSAwOworCWludAkJCQlpOworCWludAkJCQlyZXQgPSAtRUlOVkFMOworCisJLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQorCQlpZiAoY21kID09IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXS5jbWQpIHsKKwkJCWRlc2NyID0gJihkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3NbaV0pOworCQkJYnJlYWs7CisJCX0KKworCS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNldC9nZXQgYXJndW1lbnRzICovCisJaWYgKGRlc2NyICE9IE5VTEwpIHsKKwkJaWYgKElXX0lTX1NFVChjbWQpKSB7CisJCQlpbnQJb2Zmc2V0ID0gMDsJLyogRm9yIHN1Yi1pb2N0bHMgKi8KKwkJCS8qIENoZWNrIGZvciBzdWItaW9jdGwgaGFuZGxlciAqLworCQkJaWYgKGRlc2NyLT5uYW1lWzBdID09ICdcMCcpCisJCQkJLyogUmVzZXJ2ZSBvbmUgaW50IGZvciBzdWItaW9jdGwgaW5kZXggKi8KKwkJCQlvZmZzZXQgPSBzaXplb2YoX191MzIpOworCisJCQkvKiBTaXplIG9mIHNldCBhcmd1bWVudHMgKi8KKwkJCWV4dHJhX3NpemUgPSBnZXRfcHJpdl9zaXplKGRlc2NyLT5zZXRfYXJncyk7CisKKwkJCS8qIERvZXMgaXQgZml0cyBpbiBpd3IgPyAqLworCQkJaWYgKChkZXNjci0+c2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpICYmCisJCQkgICAoKGV4dHJhX3NpemUgKyBvZmZzZXQpIDw9IElGTkFNU0laKSkKKwkJCQlleHRyYV9zaXplID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpemUgb2YgZ2V0IGFyZ3VtZW50cyAqLworCQkJZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzKTsKKworCQkJLyogRG9lcyBpdCBmaXRzIGluIGl3ciA/ICovCisJCQlpZiAoKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkgJiYKKwkJCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkKKwkJCQlleHRyYV9zaXplID0gMDsKKwkJfQorCX0KKworCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KKwlpbmZvLmNtZCA9IGNtZDsKKwlpbmZvLmZsYWdzID0gMDsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCisJaWYgKGV4dHJhX3NpemUgPT0gMCkgeworCQkvKiBObyBleHRyYSBhcmd1bWVudHMuIFRyaXZpYWwgdG8gaGFuZGxlICovCisJCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCAoY2hhciAqKSAmKGl3ci0+dSkpOworCX0gZWxzZSB7CisJCWNoYXIgKglleHRyYTsKKwkJaW50CWVycjsKKworCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCisJCWlmIChJV19JU19TRVQoY21kKSkgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZiAoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKKwkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIERvZXMgaXQgZml0cyB3aXRoaW4gYm91bmRzID8gKi8KKwkJCWlmIChpd3ItPnUuZGF0YS5sZW5ndGggPiAoZGVzY3ItPnNldF9hcmdzICYKKwkJCQkJCSBJV19QUklWX1NJWkVfTUFTSykpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJfSBlbHNlIGlmIChpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBBbHdheXMgYWxsb2NhdGUgZm9yIG1heCBzcGFjZS4gRWFzaWVyLCBhbmQgd29uJ3QgbGFzdAorCQkgKiBsb25nLi4uICovCisJCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGV4dHJhID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBJZiBpdCBpcyBhIFNFVCwgZ2V0IGFsbCB0aGUgZXh0cmEgZGF0YSBpbiBoZXJlICovCisJCWlmIChJV19JU19TRVQoY21kKSAmJiAoaXdyLT51LmRhdGEubGVuZ3RoICE9IDApKSB7CisJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihleHRyYSwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJICAgICBleHRyYV9zaXplKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlrZnJlZShleHRyYSk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKworCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCisJCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCBleHRyYSk7CisKKwkJLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuIHRvIHRoZSB1c2VyICovCisJCWlmICghcmV0ICYmIElXX0lTX0dFVChjbWQpKSB7CisKKwkJCS8qIEFkanVzdCBmb3IgdGhlIGFjdHVhbCBsZW5ndGggaWYgaXQncyB2YXJpYWJsZSwKKwkJCSAqIGF2b2lkIGxlYWtpbmcga2VybmVsIGJpdHMgb3V0c2lkZS4gKi8KKwkJCWlmICghKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkpIHsKKwkJCQlleHRyYV9zaXplID0gYWRqdXN0X3ByaXZfc2l6ZShkZXNjci0+Z2V0X2FyZ3MsCisJCQkJCQkJICAgICAgJihpd3ItPnUpKTsKKwkJCX0KKworCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAorCQkJCQkgICBleHRyYV9zaXplKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0ID0gIC1FRkFVTFQ7CisJCX0KKworCQkvKiBDbGVhbnVwIC0gSSB0b2xkIHlvdSBpdCB3YXNuJ3QgdGhhdCBsb25nIDstKSAqLworCQlrZnJlZShleHRyYSk7CisJfQorCisKKwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLworCWlmIChyZXQgPT0gLUVJV0NPTU1JVCkKKwkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE1haW4gSU9DVGwgZGlzcGF0Y2hlci4KKyAqIENoZWNrIHRoZSB0eXBlIG9mIElPQ1RMIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyLi4uCisgKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfcHJvY2Vzc19pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWl3X2hhbmRsZXIJaGFuZGxlcjsKKworCS8qIFBlcm1pc3Npb25zIGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gZGV2X2lvY3RsKCkgYmVmb3JlIGNhbGxpbmcgdXMuCisJICogVGhlIGNvcHlfdG8vZnJvbV91c2VyKCkgb2YgaWZyIGlzIGFsc28gZGVhbHQgd2l0aCBpbiB0aGVyZSAqLworCisJLyogTWFrZSBzdXJlIHRoZSBkZXZpY2UgZXhpc3QgKi8KKwlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEEgYnVuY2ggb2Ygc3BlY2lhbCBjYXNlcywgdGhlbiB0aGUgZ2VuZXJpYyBjYXNlLi4uCisJICogTm90ZSB0aGF0ICdjbWQnIGlzIGFscmVhZHkgZmlsdGVyZWQgaW4gZGV2X2lvY3RsKCkgd2l0aAorCSAqIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpICovCisJaWYgKGNtZCA9PSBTSU9DR0lXU1RBVFMpCisJCXJldHVybiBpb2N0bF9zdGFuZGFyZF9jYWxsKGRldiwgaWZyLCBjbWQsCisJCQkJCSAgICZpd19oYW5kbGVyX2dldF9pd3N0YXRzKTsKKworCWlmIChjbWQgPT0gU0lPQ0dJV1BSSVYgJiYgZGV2LT53aXJlbGVzc19oYW5kbGVycykKKwkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LCBpZnIsIGNtZCwKKwkJCQkJICAgJml3X2hhbmRsZXJfZ2V0X3ByaXZhdGUpOworCisJLyogQmFzaWMgY2hlY2sgKi8KKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogTmV3IGRyaXZlciBBUEkgOiB0cnkgdG8gZmluZCB0aGUgaGFuZGxlciAqLworCWhhbmRsZXIgPSBnZXRfaGFuZGxlcihkZXYsIGNtZCk7CisJaWYgKGhhbmRsZXIpIHsKKwkJLyogU3RhbmRhcmQgYW5kIHByaXZhdGUgYXJlIG5vdCB0aGUgc2FtZSAqLworCQlpZiAoY21kIDwgU0lPQ0lXRklSU1RQUklWKQorCQkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LCBpZnIsIGNtZCwgaGFuZGxlcik7CisJCWVsc2UKKwkJCXJldHVybiBpb2N0bF9wcml2YXRlX2NhbGwoZGV2LCBpZnIsIGNtZCwgaGFuZGxlcik7CisJfQorCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLworCWlmIChkZXYtPmRvX2lvY3RsKQorCQlyZXR1cm4gZGV2LT5kb19pb2N0bChkZXYsIGlmciwgY21kKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qIGVudHJ5IHBvaW50IGZyb20gZGV2IGlvY3RsICovCitpbnQgd2V4dF9oYW5kbGVfaW9jdGwoc3RydWN0IGlmcmVxICppZnIsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldDsKKworCS8qIElmIGNvbW1hbmQgaXMgYHNldCBhIHBhcmFtZXRlcicsIG9yCisJICogYGdldCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycycsIGNoZWNrIGlmCisJICogdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBkbyBpdCAqLworCWlmICgoSVdfSVNfU0VUKGNtZCkgfHwgY21kID09IFNJT0NHSVdFTkNPREUgfHwgY21kID09IFNJT0NHSVdFTkNPREVFWFQpCisJICAgICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGV2X2xvYWQoaWZyLT5pZnJfbmFtZSk7CisJcnRubF9sb2NrKCk7CisJcmV0ID0gd2lyZWxlc3NfcHJvY2Vzc19pb2N0bChpZnIsIGNtZCk7CisJcnRubF91bmxvY2soKTsKKwlpZiAoSVdfSVNfR0VUKGNtZCkgJiYgY29weV90b191c2VyKGFyZywgaWZyLCBzaXplb2Yoc3RydWN0IGlmcmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVWRU5UIFBST0NFU1NJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQcm9jZXNzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgdGhlIHdpcmVsZXNzIGxheWVyIG9yIHRoZSBkcml2ZXIuCisgKiBNb3N0IG9mdGVuLCB0aGUgZXZlbnQgd2lsbCBiZSBwcm9wYWdhdGVkIHRocm91Z2ggcnRuZXRsaW5rCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIExvY2tpbmcuLi4KKyAqIC0tLS0tLS0tLS0KKyAqCisgKiBUaGFua3MgdG8gSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PiBmb3IgZml4aW5nCisgKiB0aGUgbG9ja2luZyBpc3N1ZSBpbiBoZXJlIGFuZCBpbXBsZW1lbnRpbmcgdGhpcyBjb2RlICEKKyAqCisgKiBUaGUgaXNzdWUgOiB3aXJlbGVzc19zZW5kX2V2ZW50KCkgaXMgb2Z0ZW4gY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LAorICogd2hpbGUgdGhlIE5ldGxpbmsgbGF5ZXIgY2FuIG5ldmVyIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqIFRoZSBmdWxseSBmb3JtZWQgUnROZXRsaW5rIGV2ZW50cyBhcmUgcXVldWVkLCBhbmQgdGhlbiBhIHRhc2tsZXQgaXMgcnVuCisgKiB0byBmZWVkIHRob3NlIHRvIE5ldGxpbmsuCisgKiBUaGUgc2tiX3F1ZXVlIGlzIGludGVycnVwdCBzYWZlLCBhbmQgaXRzIGxvY2sgaXMgbm90IGhlbGQgd2hpbGUgY2FsbGluZworICogTmV0bGluaywgc28gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgZGVhbG9jay4KKyAqIEplYW4gSUkKKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCB3aXJlbGVzc19ubGV2ZW50X3F1ZXVlOworCitzdGF0aWMgaW50IF9faW5pdCB3aXJlbGVzc19ubGV2ZW50X2luaXQodm9pZCkKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ3aXJlbGVzc19ubGV2ZW50X3F1ZXVlKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHdpcmVsZXNzX25sZXZlbnRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIHdpcmVsZXNzX25sZXZlbnRfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndpcmVsZXNzX25sZXZlbnRfcXVldWUpKSkKKwkJcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0xJTkssIE5VTEwsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgREVDTEFSRV9UQVNLTEVUKHdpcmVsZXNzX25sZXZlbnRfdGFza2xldCwgd2lyZWxlc3NfbmxldmVudF9wcm9jZXNzLCAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEZpbGwgYSBydG5ldGxpbmsgbWVzc2FnZSB3aXRoIG91ciBldmVudCBkYXRhLgorICogTm90ZSB0aGF0IHdlIHByb3BhZ2Ugb25seSB0aGUgc3BlY2lmaWVkIGV2ZW50IGFuZCBkb24ndCBkdW1wIHRoZQorICogY3VycmVudCB3aXJlbGVzcyBjb25maWcuIER1bXBpbmcgdGhlIHdpcmVsZXNzIGNvbmZpZyBpcyBmYXIgdG9vCisgKiBleHBlbnNpdmUgKGZvciBlYWNoIHBhcmFtZXRlciwgdGhlIGRyaXZlciBuZWVkIHRvIHF1ZXJ5IHRoZSBoYXJkd2FyZSkuCisgKi8KK3N0YXRpYyBpbnQgcnRuZXRsaW5rX2ZpbGxfaXdpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIGludCB0eXBlLCBjaGFyICpldmVudCwgaW50IGV2ZW50X2xlbikKK3sKKwlzdHJ1Y3QgaWZpbmZvbXNnICpyOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIHR5cGUsIHNpemVvZigqcikpOworCXIgPSBOTE1TR19EQVRBKG5saCk7CisJci0+aWZpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlyLT5fX2lmaV9wYWQgPSAwOworCXItPmlmaV90eXBlID0gZGV2LT50eXBlOworCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKKwlyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7CisJci0+aWZpX2NoYW5nZSA9IDA7CS8qIFdpcmVsZXNzIGNoYW5nZXMgZG9uJ3QgYWZmZWN0IHRob3NlIGZsYWdzICovCisKKwkvKiBBZGQgdGhlIHdpcmVsZXNzIGV2ZW50cyBpbiB0aGUgbmV0bGluayBwYWNrZXQgKi8KKwlSVEFfUFVUKHNrYiwgSUZMQV9XSVJFTEVTUywgZXZlbnRfbGVuLCBldmVudCk7CisKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJbmxtc2dfdHJpbShza2IsIGIpOworCXJldHVybiAtMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENyZWF0ZSBhbmQgYnJvYWRjYXN0IGFuZCBzZW5kIGl0IG9uIHRoZSBzdGFuZGFyZCBydG5ldGxpbmsgc29ja2V0CisgKiBUaGlzIGlzIGEgcHVyZSBjbG9uZSBydG1zZ19pZmluZm8oKSBpbiBuZXQvY29yZS9ydG5ldGxpbmsuYworICogQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiBtYW5kYXRlZCB0aGF0IEkgdXNlZCBhIElGTEFfWFhYIGZpZWxkCisgKiB3aXRoaW4gYSBSVE1fTkVXTElOSyBldmVudC4KKyAqLworc3RhdGljIHZvaWQgcnRtc2dfaXdpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmV2ZW50LCBpbnQgZXZlbnRfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19HT09EU0laRTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaWYgKHJ0bmV0bGlua19maWxsX2l3aW5mbyhza2IsIGRldiwgUlRNX05FV0xJTkssCisJCQkJICBldmVudCwgZXZlbnRfbGVuKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IFJUTkxHUlBfTElOSzsKKwlza2JfcXVldWVfdGFpbCgmd2lyZWxlc3NfbmxldmVudF9xdWV1ZSwgc2tiKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZ3aXJlbGVzc19ubGV2ZW50X3Rhc2tsZXQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTWFpbiBldmVudCBkaXNwYXRjaGVyLiBDYWxsZWQgZnJvbSBvdGhlciBwYXJ0cyBhbmQgZHJpdmVycy4KKyAqIFNlbmQgdGhlIGV2ZW50IG9uIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVscy4KKyAqIE1heSBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCB3aXJlbGVzc19zZW5kX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJIHVuc2lnbmVkIGludAkJY21kLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkJIGNoYXIgKgkJCWV4dHJhKQoreworCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyID0gTlVMTDsKKwlpbnQgZXh0cmFfbGVuID0gMDsKKwlzdHJ1Y3QgaXdfZXZlbnQgICpldmVudDsJCS8qIE1hbGxvY2F0ZWQgd2hvbGUgZXZlbnQgKi8KKwlpbnQgZXZlbnRfbGVuOwkJCQkvKiBJdHMgc2l6ZSAqLworCWludCBoZHJfbGVuOwkJCQkvKiBTaXplIG9mIHRoZSBldmVudCBoZWFkZXIgKi8KKwlpbnQgd3JxdV9vZmYgPSAwOwkJCS8qIE9mZnNldCBpbiB3cnF1ICovCisJLyogRG9uJ3QgIm9wdGltaXNlIiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlLCBpdCB3aWxsIGNyYXNoICovCisJdW5zaWduZWQJY21kX2luZGV4OwkJLyogKk1VU1QqIGJlIHVuc2lnbmVkICovCisKKwkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBFdmVudCAqLworCWlmIChjbWQgPD0gU0lPQ0lXTEFTVCkgeworCQljbWRfaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwkJaWYgKGNtZF9pbmRleCA8IHN0YW5kYXJkX2lvY3RsX251bSkKKwkJCWRlc2NyID0gJihzdGFuZGFyZF9pb2N0bFtjbWRfaW5kZXhdKTsKKwl9IGVsc2UgeworCQljbWRfaW5kZXggPSBjbWQgLSBJV0VWRklSU1Q7CisJCWlmIChjbWRfaW5kZXggPCBzdGFuZGFyZF9ldmVudF9udW0pCisJCQlkZXNjciA9ICYoc3RhbmRhcmRfZXZlbnRbY21kX2luZGV4XSk7CisJfQorCS8qIERvbid0IGFjY2VwdCB1bmtub3duIGV2ZW50cyAqLworCWlmIChkZXNjciA9PSBOVUxMKSB7CisJCS8qIE5vdGUgOiB3ZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGRyaXZlciwgYmVjYXVzZQorCQkgKiB0aGUgZHJpdmVyIHdvdWxkIG5vdCBrbm93IHdoYXQgdG8gZG8gYWJvdXQgaXQuIEl0IGNhbid0CisJCSAqIHJldHVybiBhbiBlcnJvciB0byB0aGUgdXNlciwgYmVjYXVzZSB0aGUgZXZlbnQgaXMgbm90CisJCSAqIGluaXRpYXRlZCBieSBhIHVzZXIgcmVxdWVzdC4KKwkJICogVGhlIGJlc3QgdGhlIGRyaXZlciBjb3VsZCBkbyBpcyB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZS4KKwkJICogV2Ugd2lsbCBkbyBpdCBvdXJzZWx2ZXMgaW5zdGVhZC4uLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogSW52YWxpZC9Vbmtub3duIFdpcmVsZXNzIEV2ZW50ICgweCUwNFgpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgZXh0cmEgcGFyYW1ldGVycyBhbmQgc2V0IGV4dHJhX2xlbiAqLworCWlmIChkZXNjci0+aGVhZGVyX3R5cGUgPT0gSVdfSEVBREVSX1RZUEVfUE9JTlQpIHsKKwkJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIHRva2VuIGZpdHMgd2l0aGluIGJvdW5kcyAqLworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIGJpZyAoJWQpXG4iLCBkZXYtPm5hbWUsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIHNtYWxsICglZClcbiIsIGRldi0+bmFtZSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQkJcmV0dXJuOworCQl9CisJCS8qIENhbGN1bGF0ZSBleHRyYV9sZW4gLSBleHRyYSBpcyBOVUxMIGZvciByZXN0cmljdGVkIGV2ZW50cyAqLworCQlpZiAoZXh0cmEgIT0gTlVMTCkKKwkJCWV4dHJhX2xlbiA9IHdycXUtPmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7CisJCS8qIEFsd2F5cyBhdCBhbiBvZmZzZXQgaW4gd3JxdSAqLworCQl3cnF1X29mZiA9IElXX0VWX1BPSU5UX09GRjsKKwl9CisKKwkvKiBUb3RhbCBsZW5ndGggb2YgdGhlIGV2ZW50ICovCisJaGRyX2xlbiA9IGV2ZW50X3R5cGVfc2l6ZVtkZXNjci0+aGVhZGVyX3R5cGVdOworCWV2ZW50X2xlbiA9IGhkcl9sZW4gKyBleHRyYV9sZW47CisKKwkvKiBDcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBldmVudCAqLworCWV2ZW50ID0ga21hbGxvYyhldmVudF9sZW4sIEdGUF9BVE9NSUMpOworCWlmIChldmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBGaWxsIGV2ZW50ICovCisJZXZlbnQtPmxlbiA9IGV2ZW50X2xlbjsKKwlldmVudC0+Y21kID0gY21kOworCW1lbWNweSgmZXZlbnQtPnUsICgoY2hhciAqKSB3cnF1KSArIHdycXVfb2ZmLCBoZHJfbGVuIC0gSVdfRVZfTENQX0xFTik7CisJaWYgKGV4dHJhKQorCQltZW1jcHkoKChjaGFyICopIGV2ZW50KSArIGhkcl9sZW4sIGV4dHJhLCBleHRyYV9sZW4pOworCisJLyogU2VuZCB2aWEgdGhlIFJ0TmV0bGluayBldmVudCBjaGFubmVsICovCisJcnRtc2dfaXdpbmZvKGRldiwgKGNoYXIgKikgZXZlbnQsIGV2ZW50X2xlbik7CisKKwkvKiBDbGVhbnVwICovCisJa2ZyZWUoZXZlbnQpOworCisJcmV0dXJuOwkJLyogQWx3YXlzIHN1Y2Nlc3MsIEkgZ3Vlc3MgOy0pICovCit9CitFWFBPUlRfU1lNQk9MKHdpcmVsZXNzX3NlbmRfZXZlbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKiBFTkhBTkNFRCBJV1NQWSBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW4gdGhlIG9sZCBkYXlzLCB0aGUgZHJpdmVyIHdhcyBoYW5kbGluZyBzcHkgc3VwcG9ydCBhbGwgYnkgaXRzZWxmLgorICogTm93LCB0aGUgZHJpdmVyIGNhbiBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIEl0IG5lZWRzIHRvIHVzZSB0aG9zZSBzdGFuZGFyZCBzcHkgaXdfaGFuZGxlciBpbiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYsCisgKiBwdXNoIGRhdGEgdG8gdXMgdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSBhbmQgaW5jbHVkZSBzdHJ1Y3QgaXdfc3B5X2RhdGEKKyAqIGluIGl0cyBwcml2YXRlIHBhcnQgKGFuZCBleHBvcnQgaXQgaW4gbmV0X2RldmljZS0+d2lyZWxlc3NfZGF0YS0+c3B5X2RhdGEpLgorICogT25lIG9mIHRoZSBtYWluIGFkdmFudGFnZSBvZiBjZW50cmFsaXNpbmcgc3B5IHN1cHBvcnQgaGVyZSBpcyB0aGF0CisgKiBpdCBiZWNvbWVzIG11Y2ggZWFzaWVyIHRvIGltcHJvdmUgYW5kIGV4dGVuZCBpdCB3aXRob3V0IGhhdmluZyB0byB0b3VjaAorICogdGhlIGRyaXZlcnMuIE9uZSBleGFtcGxlIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgU3B5LVRocmVzaG9sZCBldmVudHMuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgc3B5IGRhdGEgaW4gdGhlIGRyaXZlci4KKyAqIEJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgb24gdGhlIFJ4IHBhdGggdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSwKKyAqIHdlIHdhbnQgaXQgdG8gYmUgZWZmaWNpZW50Li4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGl3X3NweV9kYXRhICpnZXRfc3B5ZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFRoaXMgaXMgdGhlIG5ldyB3YXkgKi8KKwlpZiAoZGV2LT53aXJlbGVzc19kYXRhKQorCQlyZXR1cm4gZGV2LT53aXJlbGVzc19kYXRhLT5zcHlfZGF0YTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgU3B5IExpc3QKKyAqLworaW50IGl3X2hhbmRsZXJfc2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCSAgICAgICBjaGFyICoJCQlleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKglhZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBEaXNhYmxlIHNweSBjb2xsZWN0aW9uIHdoaWxlIHdlIGNvcHkgdGhlIGFkZHJlc3Nlcy4KKwkgKiBXaGlsZSB3ZSBjb3B5IGFkZHJlc3NlcywgYW55IGNhbGwgdG8gd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpCisJICogd2lsbCBOT1AuIFRoaXMgaXMgT0ssIGFzIGFueXdheSB0aGUgYWRkcmVzc2VzIGFyZSBjaGFuZ2luZy4gKi8KKwlzcHlkYXRhLT5zcHlfbnVtYmVyID0gMDsKKworCS8qIFdlIHdhbnQgdG8gb3BlcmF0ZSB3aXRob3V0IGxvY2tpbmcsIGJlY2F1c2Ugd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpCisJICogbW9zdCBsaWtlbHkgd2lsbCBoYXBwZW4gaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLCBhbmQgdGhlcmVmb3JlCisJICogaGF2ZSBpdHMgb3duIGxvY2tpbmcgY29uc3RyYWludHMgYW5kIG5lZWRzIHBlcmZvcm1hbmNlLgorCSAqIFRoZSBydG5sX2xvY2soKSBtYWtlIHN1cmUgd2UgZG9uJ3QgcmFjZSB3aXRoIHRoZSBvdGhlciBpd19oYW5kbGVycy4KKwkgKiBUaGlzIG1ha2Ugc3VyZSB3aXJlbGVzc19zcHlfdXBkYXRlKCkgInNlZSIgdGhhdCB0aGUgc3B5IGxpc3QKKwkgKiBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZC4gKi8KKwlzbXBfd21iKCk7CisKKwkvKiBBcmUgdGhlcmUgYXJlIGFkZHJlc3NlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJaW50IGk7CisKKwkJLyogQ29weSBhZGRyZXNzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCisJCQltZW1jcHkoc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCS8qIFJlc2V0IHN0YXRzICovCisJCW1lbXNldChzcHlkYXRhLT5zcHlfc3RhdCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWJvdmUgaXMgdXBkYXRlZCBiZWZvcmUgcmUtZW5hYmxpbmcgKi8KKwlzbXBfd21iKCk7CisKKwkvKiBFbmFibGUgYWRkcmVzc2VzICovCisJc3B5ZGF0YS0+c3B5X251bWJlciA9IHdycXUtPmRhdGEubGVuZ3RoOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGl3X2hhbmRsZXJfc2V0X3NweSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFNweSBMaXN0CisgKi8KK2ludCBpd19oYW5kbGVyX2dldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKKwkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkgICAgICAgY2hhciAqCQkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IHNvY2thZGRyICoJYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisJaW50CQkJaTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNweWRhdGEtPnNweV9udW1iZXI7CisKKwkvKiBDb3B5IGFkZHJlc3Nlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKSAJeworCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOworCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CisJfQorCS8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKS4gKi8KKwlpZiAoc3B5ZGF0YS0+c3B5X251bWJlciA+IDApCisJCW1lbWNweShleHRyYSAgKyAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKnNweWRhdGEtPnNweV9udW1iZXIpLAorCQkgICAgICAgc3B5ZGF0YS0+c3B5X3N0YXQsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogc3B5ZGF0YS0+c3B5X251bWJlcik7CisJLyogUmVzZXQgdXBkYXRlZCBmbGFncy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQorCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF9zcHkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzcHkgdGhyZXNob2xkCisgKi8KK2ludCBpd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkJICBjaGFyICoJCWV4dHJhKQoreworCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOworCXN0cnVjdCBpd190aHJzcHkgKgl0aHJlc2hvbGQgPSAoc3RydWN0IGl3X3RocnNweSAqKSBleHRyYTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBKdXN0IGRvIGl0ICovCisJbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLCAmKHRocmVzaG9sZC0+bG93KSwKKwkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCisJLyogQ2xlYXIgZmxhZyAqLworCW1lbXNldChzcHlkYXRhLT5zcHlfdGhyX3VuZGVyLCAnXDAnLCBzaXplb2Yoc3B5ZGF0YS0+c3B5X3Rocl91bmRlcikpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGl3X2hhbmRsZXJfc2V0X3RocnNweSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHNweSB0aHJlc2hvbGQKKyAqLworaW50IGl3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCQkgIGNoYXIgKgkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IGl3X3RocnNweSAqCXRocmVzaG9sZCA9IChzdHJ1Y3QgaXdfdGhyc3B5ICopIGV4dHJhOworCisJLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KKwlpZiAoIXNweWRhdGEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIEp1c3QgZG8gaXQgKi8KKwltZW1jcHkoJih0aHJlc2hvbGQtPmxvdyksICYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLAorCSAgICAgICAyICogc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9nZXRfdGhyc3B5KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByZXBhcmUgYW5kIHNlbmQgYSBTcHkgVGhyZXNob2xkIGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIGl3X3NlbmRfdGhyc3B5X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJCSBzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhLAorCQkJCSB1bnNpZ25lZCBjaGFyICoJYWRkcmVzcywKKwkJCQkgc3RydWN0IGl3X3F1YWxpdHkgKgl3c3RhdHMpCit7CisJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCXN0cnVjdCBpd190aHJzcHkJdGhyZXNob2xkOworCisJLyogSW5pdCAqLworCXdycXUuZGF0YS5sZW5ndGggPSAxOworCXdycXUuZGF0YS5mbGFncyA9IDA7CisJLyogQ29weSBhZGRyZXNzICovCisJbWVtY3B5KHRocmVzaG9sZC5hZGRyLnNhX2RhdGEsIGFkZHJlc3MsIEVUSF9BTEVOKTsKKwl0aHJlc2hvbGQuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJLyogQ29weSBzdGF0cyAqLworCW1lbWNweSgmKHRocmVzaG9sZC5xdWFsKSwgd3N0YXRzLCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKKwkvKiBDb3B5IGFsc28gdGhyZXNob2xkcyAqLworCW1lbWNweSgmKHRocmVzaG9sZC5sb3cpLCAmKHNweWRhdGEtPnNweV90aHJfbG93KSwKKwkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCisJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdUSFJTUFksICZ3cnF1LCAoY2hhciAqKSAmdGhyZXNob2xkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENhbGwgZm9yIHRoZSBkcml2ZXIgdG8gdXBkYXRlIHRoZSBzcHkgZGF0YS4KKyAqIEZvciBub3csIHRoZSBzcHkgZGF0YSBpcyBhIHNpbXBsZSBhcnJheS4gQXMgdGhlIHNpemUgb2YgdGhlIGFycmF5IGlzCisgKiBzbWFsbCwgdGhpcyBpcyBnb29kIGVub3VnaC4gSWYgd2Ugd2FudGVkIHRvIHN1cHBvcnQgbGFyZ2VyIG51bWJlciBvZgorICogc3B5IGFkZHJlc3Nlcywgd2Ugc2hvdWxkIHVzZSBzb21ldGhpbmcgbW9yZSBlZmZpY2llbnQuLi4KKyAqLwordm9pZCB3aXJlbGVzc19zcHlfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJIHVuc2lnbmVkIGNoYXIgKglhZGRyZXNzLAorCQkJIHN0cnVjdCBpd19xdWFsaXR5ICoJd3N0YXRzKQoreworCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOworCWludAkJCWk7CisJaW50CQkJbWF0Y2ggPSAtMTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm47CisKKwkvKiBVcGRhdGUgYWxsIHJlY29yZHMgdGhhdCBtYXRjaCAqLworCWZvciAoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspCisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGFkZHJlc3MsIHNweWRhdGEtPnNweV9hZGRyZXNzW2ldKSkgeworCQkJbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3N0YXRbaV0pLCB3c3RhdHMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CisJCQltYXRjaCA9IGk7CisJCX0KKworCS8qIEdlbmVyYXRlIGFuIGV2ZW50IGlmIHdlIGNyb3NzIHRoZSBzcHkgdGhyZXNob2xkLgorCSAqIFRvIGF2b2lkIGV2ZW50IHN0b3Jtcywgd2UgaGF2ZSBhIHNpbXBsZSBoeXN0ZXJlc2lzIDogd2UgZ2VuZXJhdGUKKwkgKiBldmVudCBvbmx5IHdoZW4gd2UgZ28gdW5kZXIgdGhlIGxvdyB0aHJlc2hvbGQgb3IgYWJvdmUgdGhlCisJICogaGlnaCB0aHJlc2hvbGQuICovCisJaWYgKG1hdGNoID49IDApIHsKKwkJaWYgKHNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdKSB7CisJCQlpZiAod3N0YXRzLT5sZXZlbCA+IHNweWRhdGEtPnNweV90aHJfaGlnaC5sZXZlbCkgeworCQkJCXNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdID0gMDsKKwkJCQlpd19zZW5kX3RocnNweV9ldmVudChkZXYsIHNweWRhdGEsCisJCQkJCQkgICAgIGFkZHJlc3MsIHdzdGF0cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod3N0YXRzLT5sZXZlbCA8IHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsKSB7CisJCQkJc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0gPSAxOworCQkJCWl3X3NlbmRfdGhyc3B5X2V2ZW50KGRldiwgc3B5ZGF0YSwKKwkJCQkJCSAgICAgYWRkcmVzcywgd3N0YXRzKTsKKwkJCX0KKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wod2lyZWxlc3Nfc3B5X3VwZGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQveDI1L2FmX3gyNS5jIGIvbmV0L3gyNS9hZl94MjUuYwppbmRleCBlNjJiYTQxLi4wZDYwMDJmYyAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC05NTEsNyArOTUxLDcgQEAKIAkgKglJbmNvbWluZyBDYWxsIFVzZXIgRGF0YS4KIAkgKi8KIAlpZiAoc2tiLT5sZW4gPj0gMCkgewotCQltZW1jcHkobWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+bGVuKTsKIAkJbWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA9IHNrYi0+bGVuOwogCX0KIApAQCAtMTA1OCw5ICsxMDU4LDEwIEBACiAJICovCiAJU09DS19ERUJVRyhzaywgIngyNV9zZW5kbXNnOiBDb3B5aW5nIHVzZXIgZGF0YVxuIik7CiAKLQlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKIAotCXJjID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlyYyA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwgbXNnLT5tc2dfaW92LCBsZW4pOwogCWlmIChyYykKIAkJZ290byBvdXRfa2ZyZWVfc2tiOwogCkBAIC0xMjEwLDggKzEyMTEsNyBAQAogCQl9CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKLQorCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJY29waWVkID0gc2tiLT5sZW47CiAKIAlpZiAoY29waWVkID4gc2l6ZSkgewpAQCAtMTI4MCw2ICsxMjgwLDEyIEBACiAJCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssCiAJCQkJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJncCk7CiAJCQlicmVhazsKKwkJY2FzZSBTSU9DR1NUQU1QTlM6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlpZiAoc2spCisJCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywKKwkJCQkJCShzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopYXJncCk7CisJCQlicmVhazsKIAkJY2FzZSBTSU9DR0lGQUREUjoKIAkJY2FzZSBTSU9DU0lGQUREUjoKIAkJY2FzZSBTSU9DR0lGRFNUQUREUjoKQEAgLTE1MjEsNiArMTUyNywxMiBAQAogCQkJcmMgPSBjb21wYXRfc29ja19nZXRfdGltZXN0YW1wKHNrLAogCQkJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyKilhcmdwKTsKIAkJYnJlYWs7CisJY2FzZSBTSU9DR1NUQU1QTlM6CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKHNrKQorCQkJcmMgPSBjb21wYXRfc29ja19nZXRfdGltZXN0YW1wbnMoc2ssCisJCQkJCShzdHJ1Y3QgdGltZXNwZWMgX191c2VyKilhcmdwKTsKKwkJYnJlYWs7CiAJY2FzZSBTSU9DR0lGQUREUjoKIAljYXNlIFNJT0NTSUZBRERSOgogCWNhc2UgU0lPQ0dJRkRTVEFERFI6CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9kZXYuYyBiL25ldC94MjUveDI1X2Rldi5jCmluZGV4IGM3MjIxZGUuLjg0OGE2YjYgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X2Rldi5jCisrKyBiL25ldC94MjUveDI1X2Rldi5jCkBAIC00OCw3ICs0OCw3IEBACiAJaWYgKChzayA9IHgyNV9maW5kX3NvY2tldChsY2ksIG5iKSkgIT0gTlVMTCkgewogCQlpbnQgcXVldWVkID0gMTsKIAotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQliaF9sb2NrX3NvY2soc2spOwogCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKIAkJCXF1ZXVlZCA9IHgyNV9wcm9jZXNzX3J4X2ZyYW1lKHNrLCBza2IpOwpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqZHB0cjsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc3dpdGNoIChuYi0+ZGV2LT50eXBlKSB7CiAJCWNhc2UgQVJQSFJEX1gyNToKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X2luLmMgYi9uZXQveDI1L3gyNV9pbi5jCmluZGV4IGM1MjM5ZmMuLjFjODg3NjIgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X2luLmMKKysrIGIvbmV0L3gyNS94MjVfaW4uYwpAQCAtNTMsMTcgKzUzLDIwIEBACiAKIAkJc2tiX3F1ZXVlX3RhaWwoJngyNS0+ZnJhZ21lbnRfcXVldWUsIHNrYik7CiAKLQkJc2tibi0+aC5yYXcgPSBza2JuLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2JuKTsKIAogCQlza2JvID0gc2tiX2RlcXVldWUoJngyNS0+ZnJhZ21lbnRfcXVldWUpOwotCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYm8sIHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwKKwkJCQkJICBza2JvLT5sZW4pOwogCQlrZnJlZV9za2Ioc2tibyk7CiAKIAkJd2hpbGUgKChza2JvID0KIAkJCXNrYl9kZXF1ZXVlKCZ4MjUtPmZyYWdtZW50X3F1ZXVlKSkgIT0gTlVMTCkgewogCQkJc2tiX3B1bGwoc2tibywgKHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCkgPwogCQkJCQlYMjVfRVhUX01JTl9MRU4gOiBYMjVfU1REX01JTl9MRU4pOwotCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwgc2tiby0+ZGF0YSwgc2tiby0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tibywKKwkJCQkJCSAgc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLAorCQkJCQkJICBza2JvLT5sZW4pOwogCQkJa2ZyZWVfc2tiKHNrYm8pOwogCQl9CiAKQEAgLTExMiw4ICsxMTUsOSBAQAogCQkJICoJQ29weSBhbnkgQ2FsbCBVc2VyIERhdGEuCiAJCQkgKi8KIAkJCWlmIChza2ItPmxlbiA+PSAwKSB7Ci0JCQkJbWVtY3B5KHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwKLQkJCQkgICAgICAgc2tiLT5sZW4pOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkgICAgICB4MjUtPmNhbGx1c2VyZGF0YS5jdWRkYXRhLAorCQkJCQkgICAgICBza2ItPmxlbik7CiAJCQkJeDI1LT5jYWxsdXNlcmRhdGEuY3VkbGVuZ3RoID0gc2tiLT5sZW47CiAJCQl9CiAJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X291dC5jIGIvbmV0L3gyNS94MjVfb3V0LmMKaW5kZXggNmY1NzM3OC4uMmI5NmI1MiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfb3V0LmMKKysrIGIvbmV0L3gyNS94MjVfb3V0LmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogCWlmIChza2ItPmxlbiAtIGhlYWRlcl9sZW4gPiBtYXhfbGVuKSB7CiAJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSBIZWFkZXIgKi8KLQkJbWVtY3B5KGhlYWRlciwgc2tiLT5kYXRhLCBoZWFkZXJfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGhlYWRlciwgaGVhZGVyX2xlbik7CiAJCXNrYl9wdWxsKHNrYiwgaGVhZGVyX2xlbik7CiAKIAkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKQEAgLTg0LDEyICs4NCwxMiBAQAogCQkJbGVuID0gbWF4X2xlbiA+IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBtYXhfbGVuOwogCiAJCQkvKiBDb3B5IHRoZSB1c2VyIGRhdGEgKi8KLQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIGxlbiksIGxlbik7CiAJCQlza2JfcHVsbChza2IsIGxlbik7CiAKIAkJCS8qIER1cGxpY2F0ZSB0aGUgSGVhZGVyICovCiAJCQlza2JfcHVzaChza2JuLCBoZWFkZXJfbGVuKTsKLQkJCW1lbWNweShza2JuLT5kYXRhLCBoZWFkZXIsIGhlYWRlcl9sZW4pOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tibiwgaGVhZGVyLCBoZWFkZXJfbGVuKTsKIAogCQkJaWYgKHNrYi0+bGVuID4gMCkgewogCQkJCWlmICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2FsZ28uYyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCmluZGV4IGYzNzNhOGEuLmJlNTI5YzQgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fYWxnby5jCisrKyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCkBAIC01MzIsOCArNTMyLDggQEAKIGludCBza2JfaWN2X3dhbGsoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhhc2hfZGVzYyAqZGVzYywKIAkJIGludCBvZmZzZXQsIGludCBsZW4sIGljdl91cGRhdGVfZm5fdCBpY3ZfdXBkYXRlKQogewotCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7Ci0JaW50IGksIGNvcHkgPSBzdGFydCAtIG9mZnNldDsKKwlpbnQgZW5kID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgaSwgY29weSA9IGVuZCAtIG9mZnNldDsKIAlpbnQgZXJyOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIApAQCAtNTU2LDExICs1NTYsOSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKLQkJaW50IGVuZDsKKwkJQlVHX1RSQVAobGVuID49IDApOwogCi0JCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWVuZCA9IG9mZnNldCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKIAkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKIApAQCAtNTY4LDcgKzU2Niw3IEBACiAJCQkJY29weSA9IGxlbjsKIAogCQkJc2cucGFnZSA9IGZyYWctPnBhZ2U7Ci0JCQlzZy5vZmZzZXQgPSBmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldC1zdGFydDsKKwkJCXNnLm9mZnNldCA9IGZyYWctPnBhZ2Vfb2Zmc2V0OwogCQkJc2cubGVuZ3RoID0gY29weTsKIAogCQkJZXJyID0gaWN2X3VwZGF0ZShkZXNjLCAmc2csIGNvcHkpOwpAQCAtNTc5LDIyICs1NzcsMTkgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCW9mZnNldCArPSBjb3B5OwogCQl9Ci0JCXN0YXJ0ID0gZW5kOwogCX0KIAogCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OwogCiAJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgewotCQkJaW50IGVuZDsKKwkJCUJVR19UUkFQKGxlbiA+PSAwKTsKIAotCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQllbmQgPSBvZmZzZXQgKyBsaXN0LT5sZW47CiAJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewogCQkJCWlmIChjb3B5ID4gbGVuKQogCQkJCQljb3B5ID0gbGVuOwotCQkJCWVyciA9IHNrYl9pY3Zfd2FsayhsaXN0LCBkZXNjLCBvZmZzZXQtc3RhcnQsCisJCQkJZXJyID0gc2tiX2ljdl93YWxrKGxpc3QsIGRlc2MsIDAsCiAJCQkJCQkgICBjb3B5LCBpY3ZfdXBkYXRlKTsKIAkJCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCQkJcmV0dXJuIGVycjsKQEAgLTYwMiw3ICs1OTcsNiBAQAogCQkJCQlyZXR1cm4gMDsKIAkJCQlvZmZzZXQgKz0gY29weTsKIAkJCX0KLQkJCXN0YXJ0ID0gZW5kOwogCQl9CiAJfQogCUJVR19PTihsZW4pOwpAQCAtNjEyLDE3NSArNjA2LDYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0lORVRfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUX0VTUF9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0VTUCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQX01PRFVMRSkKIAotLyogTG9va2luZyBnZW5lcmljIGl0IGlzIG5vdCB1c2VkIGluIGFub3RoZXIgcGxhY2VzLiAqLwotCi1pbnQKLXNrYl90b19zZ3ZlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQotewotCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7Ci0JaW50IGksIGNvcHkgPSBzdGFydCAtIG9mZnNldDsKLQlpbnQgZWx0ID0gMDsKLQotCWlmIChjb3B5ID4gMCkgewotCQlpZiAoY29weSA+IGxlbikKLQkJCWNvcHkgPSBsZW47Ci0JCXNnW2VsdF0ucGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEgKyBvZmZzZXQpOwotCQlzZ1tlbHRdLm9mZnNldCA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKyBvZmZzZXQpICUgUEFHRV9TSVpFOwotCQlzZ1tlbHRdLmxlbmd0aCA9IGNvcHk7Ci0JCWVsdCsrOwotCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQotCQkJcmV0dXJuIGVsdDsKLQkJb2Zmc2V0ICs9IGNvcHk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewotCQlpbnQgZW5kOwotCi0JCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7Ci0JCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07Ci0KLQkJCWlmIChjb3B5ID4gbGVuKQotCQkJCWNvcHkgPSBsZW47Ci0JCQlzZ1tlbHRdLnBhZ2UgPSBmcmFnLT5wYWdlOwotCQkJc2dbZWx0XS5vZmZzZXQgPSBmcmFnLT5wYWdlX29mZnNldCtvZmZzZXQtc3RhcnQ7Ci0JCQlzZ1tlbHRdLmxlbmd0aCA9IGNvcHk7Ci0JCQllbHQrKzsKLQkJCWlmICghKGxlbiAtPSBjb3B5KSkKLQkJCQlyZXR1cm4gZWx0OwotCQkJb2Zmc2V0ICs9IGNvcHk7Ci0JCX0KLQkJc3RhcnQgPSBlbmQ7Ci0JfQotCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7Ci0JCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7Ci0KLQkJZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7Ci0JCQlpbnQgZW5kOwotCi0JCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOwotCi0JCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKLQkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQkJaWYgKGNvcHkgPiBsZW4pCi0JCQkJCWNvcHkgPSBsZW47Ci0JCQkJZWx0ICs9IHNrYl90b19zZ3ZlYyhsaXN0LCBzZytlbHQsIG9mZnNldCAtIHN0YXJ0LCBjb3B5KTsKLQkJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQotCQkJCQlyZXR1cm4gZWx0OwotCQkJCW9mZnNldCArPSBjb3B5OwotCQkJfQotCQkJc3RhcnQgPSBlbmQ7Ci0JCX0KLQl9Ci0JQlVHX09OKGxlbik7Ci0JcmV0dXJuIGVsdDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNrYl90b19zZ3ZlYyk7Ci0KLS8qIENoZWNrIHRoYXQgc2tiIGRhdGEgYml0cyBhcmUgd3JpdGFibGUuIElmIHRoZXkgYXJlIG5vdCwgY29weSBkYXRhCi0gKiB0byBuZXdseSBjcmVhdGVkIHByaXZhdGUgYXJlYS4gSWYgInRhaWxiaXRzIiBpcyBnaXZlbiwgbWFrZSBzdXJlIHRoYXQKLSAqIHRhaWxiaXRzIGJ5dGVzIGJleW9uZCBjdXJyZW50IGVuZCBvZiBza2IgYXJlIHdyaXRhYmxlLgotICoKLSAqIFJldHVybnMgYW1vdW50IG9mIGVsZW1lbnRzIG9mIHNjYXR0ZXJsaXN0IHRvIGxvYWQgZm9yIHN1YnNlcXVlbnQKLSAqIHRyYW5zZm9ybWF0aW9ucyBhbmQgcG9pbnRlciB0byB3cml0YWJsZSB0cmFpbGVyIHNrYi4KLSAqLwotCi1pbnQgc2tiX2Nvd19kYXRhKHN0cnVjdCBza19idWZmICpza2IsIGludCB0YWlsYml0cywgc3RydWN0IHNrX2J1ZmYgKip0cmFpbGVyKQotewotCWludCBjb3B5ZmxhZzsKLQlpbnQgZWx0OwotCXN0cnVjdCBza19idWZmICpza2IxLCAqKnNrYl9wOwotCi0JLyogSWYgc2tiIGlzIGNsb25lZCBvciBpdHMgaGVhZCBpcyBwYWdlZCwgcmVhbGxvY2F0ZQotCSAqIGhlYWQgcHVsbGluZyBvdXQgYWxsIHRoZSBwYWdlcyAocGFnZXMgYXJlIGNvbnNpZGVyZWQgbm90IHdyaXRhYmxlCi0JICogYXQgdGhlIG1vbWVudCBldmVuIGlmIHRoZXkgYXJlIGFub255bW91cykuCi0JICovCi0JaWYgKChza2JfY2xvbmVkKHNrYikgfHwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgJiYKLQkgICAgX19wc2tiX3B1bGxfdGFpbChza2IsIHNrYl9wYWdlbGVuKHNrYiktc2tiX2hlYWRsZW4oc2tiKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBFYXN5IGNhc2UuIE1vc3Qgb2YgcGFja2V0cyB3aWxsIGdvIHRoaXMgd2F5LiAqLwotCWlmICghc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKLQkJLyogQSBsaXR0bGUgb2YgdHJvdWJsZSwgbm90IGVub3VnaCBvZiBzcGFjZSBmb3IgdHJhaWxlci4KLQkJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgd2hlbiBzdGFjayBpcyB0dW5lZCB0byBnZW5lcmF0ZQotCQkgKiBnb29kIGZyYW1lcy4gT0ssIG9uIG1pc3Mgd2UgcmVhbGxvY2F0ZSBhbmQgcmVzZXJ2ZSBldmVuIG1vcmUKLQkJICogc3BhY2UsIDEyOCBieXRlcyBpcyBmYWlyLiAqLwotCi0JCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHRhaWxiaXRzICYmCi0JCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgdGFpbGJpdHMtc2tiX3RhaWxyb29tKHNrYikrMTI4LCBHRlBfQVRPTUlDKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCS8qIFZvaWxhISAqLwotCQkqdHJhaWxlciA9IHNrYjsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogTWlzZXJ5LiBXZSBhcmUgaW4gdHJvdWJsZXMsIGdvaW5nIHRvIG1pbmNlciBmcmFnbWVudHMuLi4gKi8KLQotCWVsdCA9IDE7Ci0Jc2tiX3AgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7Ci0JY29weWZsYWcgPSAwOwotCi0Jd2hpbGUgKChza2IxID0gKnNrYl9wKSAhPSBOVUxMKSB7Ci0JCWludCBudGFpbCA9IDA7Ci0KLQkJLyogVGhlIGZyYWdtZW50IGlzIHBhcnRpYWxseSBwdWxsZWQgYnkgc29tZW9uZSwKLQkJICogdGhpcyBjYW4gaGFwcGVuIG9uIGlucHV0LiBDb3B5IGl0IGFuZCBldmVyeXRoaW5nCi0JCSAqIGFmdGVyIGl0LiAqLwotCi0JCWlmIChza2Jfc2hhcmVkKHNrYjEpKQotCQkJY29weWZsYWcgPSAxOwotCi0JCS8qIElmIHRoZSBza2IgaXMgdGhlIGxhc3QsIHdvcnJ5IGFib3V0IHRyYWlsZXIuICovCi0KLQkJaWYgKHNrYjEtPm5leHQgPT0gTlVMTCAmJiB0YWlsYml0cykgewotCQkJaWYgKHNrYl9zaGluZm8oc2tiMSktPm5yX2ZyYWdzIHx8Ci0JCQkgICAgc2tiX3NoaW5mbyhza2IxKS0+ZnJhZ19saXN0IHx8Ci0JCQkgICAgc2tiX3RhaWxyb29tKHNrYjEpIDwgdGFpbGJpdHMpCi0JCQkJbnRhaWwgPSB0YWlsYml0cyArIDEyODsKLQkJfQotCi0JCWlmIChjb3B5ZmxhZyB8fAotCQkgICAgc2tiX2Nsb25lZChza2IxKSB8fAotCQkgICAgbnRhaWwgfHwKLQkJICAgIHNrYl9zaGluZm8oc2tiMSktPm5yX2ZyYWdzIHx8Ci0JCSAgICBza2Jfc2hpbmZvKHNrYjEpLT5mcmFnX2xpc3QpIHsKLQkJCXN0cnVjdCBza19idWZmICpza2IyOwotCi0JCQkvKiBGdWNrLCB3ZSBhcmUgbWlzZXJhYmxlIHBvb3IgZ3V5cy4uLiAqLwotCQkJaWYgKG50YWlsID09IDApCi0JCQkJc2tiMiA9IHNrYl9jb3B5KHNrYjEsIEdGUF9BVE9NSUMpOwotCQkJZWxzZQotCQkJCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiMSwKLQkJCQkJCSAgICAgICBza2JfaGVhZHJvb20oc2tiMSksCi0JCQkJCQkgICAgICAgbnRhaWwsCi0JCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JCQlpZiAodW5saWtlbHkoc2tiMiA9PSBOVUxMKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJaWYgKHNrYjEtPnNrKQotCQkJCXNrYl9zZXRfb3duZXJfdyhza2IyLCBza2IxLT5zayk7Ci0KLQkJCS8qIExvb2tpbmcgYXJvdW5kLiBBcmUgd2Ugc3RpbGwgYWxpdmU/Ci0JCQkgKiBPSywgbGluayBuZXcgc2tiLCBkcm9wIG9sZCBvbmUgKi8KLQotCQkJc2tiMi0+bmV4dCA9IHNrYjEtPm5leHQ7Ci0JCQkqc2tiX3AgPSBza2IyOwotCQkJa2ZyZWVfc2tiKHNrYjEpOwotCQkJc2tiMSA9IHNrYjI7Ci0JCX0KLQkJZWx0Kys7Ci0JCSp0cmFpbGVyID0gc2tiMTsKLQkJc2tiX3AgPSAmc2tiMS0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gZWx0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc2tiX2Nvd19kYXRhKTsKLQogdm9pZCAqcHNrYl9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmYgKnRhaWwsIGludCBsZW4pCiB7CiAJaWYgKHRhaWwgIT0gc2tiKSB7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2lucHV0LmMgYi9uZXQveGZybS94ZnJtX2lucHV0LmMKaW5kZXggZWUxNWJkYS4uNWM0Njk1OCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9pbnB1dC5jCisrKyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwpAQCAtNjIsNyArNjIsNyBAQAogCWNhc2UgSVBQUk9UT19DT01QOgogCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwX2NvbXBfaGRyKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJKnNwaSA9IGh0b25sKG50b2hzKCooX19iZTE2Kikoc2tiLT5oLnJhdyArIDIpKSk7CisJCSpzcGkgPSBodG9ubChudG9ocygqKF9fYmUxNiopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKyAyKSkpOwogCQkqc2VxID0gMDsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKQEAgLTcyLDggKzcyLDggQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAxNikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKnNwaSA9ICooX19iZTMyKikoc2tiLT5oLnJhdyArIG9mZnNldCk7Ci0JKnNlcSA9ICooX19iZTMyKikoc2tiLT5oLnJhdyArIG9mZnNldF9zZXEpOworCSpzcGkgPSAqKF9fYmUzMiopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKyBvZmZzZXQpOworCSpzZXEgPSAqKF9fYmUzMiopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKyBvZmZzZXRfc2VxKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9wYXJzZV9zcGkpOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggNzg1YzNlMy4uNzYyOTI2MCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIHN0YXRpYyB2b2lkIHhmcm1fcG9saWN5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwID0gKHN0cnVjdCB4ZnJtX3BvbGljeSopZGF0YTsKLQl1bnNpZ25lZCBsb25nIG5vdyA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGdldF9zZWNvbmRzKCk7CiAJbG9uZyBuZXh0ID0gTE9OR19NQVg7CiAJaW50IHdhcm4gPSAwOwogCWludCBkaXI7CkBAIC02OTAsNyArNjkwLDcgQEAKIAl9CiAJcG9saWN5LT5pbmRleCA9IGRlbHBvbCA/IGRlbHBvbC0+aW5kZXggOiB4ZnJtX2dlbl9pbmRleChwb2xpY3ktPnR5cGUsIGRpcik7CiAJaGxpc3RfYWRkX2hlYWQoJnBvbGljeS0+YnlpZHgsIHhmcm1fcG9saWN5X2J5aWR4K2lkeF9oYXNoKHBvbGljeS0+aW5kZXgpKTsKLQlwb2xpY3ktPmN1cmxmdC5hZGRfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwlwb2xpY3ktPmN1cmxmdC5hZGRfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSAwOwogCWlmICghbW9kX3RpbWVyKCZwb2xpY3ktPnRpbWVyLCBqaWZmaWVzICsgSFopKQogCQl4ZnJtX3BvbF9ob2xkKHBvbGljeSk7CkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCQlyZXR1cm4gRkxPV19ESVJfT1VUOwogCWNhc2UgWEZSTV9QT0xJQ1lfRldEOgogCQlyZXR1cm4gRkxPV19ESVJfRldEOwotCX07CisJfQogfQogCiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICp4ZnJtX3NrX3BvbGljeV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLCBpbnQgZGlyLCBzdHJ1Y3QgZmxvd2kgKmZsKQpAQCAtMTEzMyw3ICsxMTMzLDcgQEAKIAlvbGRfcG9sID0gc2stPnNrX3BvbGljeVtkaXJdOwogCXNrLT5za19wb2xpY3lbZGlyXSA9IHBvbDsKIAlpZiAocG9sKSB7Ci0JCXBvbC0+Y3VybGZ0LmFkZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCQlwb2wtPmN1cmxmdC5hZGRfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJCXBvbC0+aW5kZXggPSB4ZnJtX2dlbl9pbmRleChwb2wtPnR5cGUsIFhGUk1fUE9MSUNZX01BWCtkaXIpOwogCQlfX3hmcm1fcG9saWN5X2xpbmsocG9sLCBYRlJNX1BPTElDWV9NQVgrZGlyKTsKIAl9CkBAIC0xMzg2LDcgKzEzODYsNyBAQAogCQlyZXR1cm4gMDsKIAogCWZhbWlseSA9IGRzdF9vcmlnLT5vcHMtPmZhbWlseTsKLQlwb2xpY3ktPmN1cmxmdC51c2VfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwlwb2xpY3ktPmN1cmxmdC51c2VfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJcG9sc1swXSA9IHBvbGljeTsKIAlucG9scyArKzsKIAl4ZnJtX25yICs9IHBvbHNbMF0tPnhmcm1fbnI7CkBAIC0xNjgyLDcgKzE2ODIsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlwb2wtPmN1cmxmdC51c2VfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwlwb2wtPmN1cmxmdC51c2VfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAKIAlwb2xzWzBdID0gcG9sOwogCW5wb2xzICsrOwpAQCAtMTY5NCw3ICsxNjk0LDcgQEAKIAkJaWYgKHBvbHNbMV0pIHsKIAkJCWlmIChJU19FUlIocG9sc1sxXSkpCiAJCQkJcmV0dXJuIDA7Ci0JCQlwb2xzWzFdLT5jdXJsZnQudXNlX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJCQlwb2xzWzFdLT5jdXJsZnQudXNlX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCQkJbnBvbHMgKys7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3N0YXRlLmMgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKaW5kZXggZTNhMGJjZmEuLmYzYTYxZWIgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogc3RhdGljIHZvaWQgeGZybV90aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IChzdHJ1Y3QgeGZybV9zdGF0ZSopZGF0YTsKLQl1bnNpZ25lZCBsb25nIG5vdyA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGdldF9zZWNvbmRzKCk7CiAJbG9uZyBuZXh0ID0gTE9OR19NQVg7CiAJaW50IHdhcm4gPSAwOwogCWludCBlcnIgPSAwOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAJCWluaXRfdGltZXIoJngtPnJ0aW1lcik7CiAJCXgtPnJ0aW1lci5mdW5jdGlvbiA9IHhmcm1fcmVwbGF5X3RpbWVyX2hhbmRsZXI7CiAJCXgtPnJ0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXg7Ci0JCXgtPmN1cmxmdC5hZGRfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwkJeC0+Y3VybGZ0LmFkZF90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAkJeC0+bGZ0LnNvZnRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOwogCQl4LT5sZnQuc29mdF9wYWNrZXRfbGltaXQgPSBYRlJNX0lORjsKIAkJeC0+bGZ0LmhhcmRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOwpAQCAtNDIxLDYgKzQyMSwxNiBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2ZsdXNoKTsKIAordm9pZCB4ZnJtX3NhZF9nZXRpbmZvKHN0cnVjdCB4ZnJtX3NhZGluZm8gKnNpKQoreworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwlzaS0+c2FkY250ID0geGZybV9zdGF0ZV9udW07CisJc2ktPnNhZGhjbnQgPSB4ZnJtX3N0YXRlX2htYXNrOworCXNpLT5zYWRobWNudCA9IHhmcm1fc3RhdGVfaGFzaG1heDsKKwlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zYWRfZ2V0aW5mbyk7CisKIHN0YXRpYyBpbnQKIHhmcm1faW5pdF90ZW1wc2VsKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkgIHN0cnVjdCB4ZnJtX3RtcGwgKnRtcGwsCkBAIC00NTgsNyArNDY4LDcgQEAKIAkJCQkJICAgICB4LT5pZC5kYWRkci5hNikpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJcmV0dXJuIHg7CkBAIC00OTMsNyArNTAzLDcgQEAKIAkJCQkJICAgICB4LT5wcm9wcy5zYWRkci5hNikpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJcmV0dXJuIHg7CkBAIC03MjIsNyArNzMyLDcgQEAKIAkJCQkJICAgICAoc3RydWN0IGluNl9hZGRyICopc2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAogCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CiAJCXJldHVybiB4OwpAQCAtNzU1LDcgKzc2NSw3IEBACiAJCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeC0+aWQuZGFkZHIuYTYsCiAJCQkJICAgICAgIChzdHJ1Y3QgaW42X2FkZHIgKilkYWRkcik7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCiAJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9BQ1E7CiAJCXgtPmlkLnByb3RvID0gcHJvdG87CkBAIC0xMDUxLDcgKzEwNjEsNyBAQAogaW50IHhmcm1fc3RhdGVfY2hlY2tfZXhwaXJlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQogewogCWlmICgheC0+Y3VybGZ0LnVzZV90aW1lKQotCQl4LT5jdXJsZnQudXNlX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJCXgtPmN1cmxmdC51c2VfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAKIAlpZiAoeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9WQUxJRCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjY3LDM3ICsxNjc3LDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbCk7CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIE5PVCBvcHRpbWFsLiAgRm9yIGV4YW1wbGUsIHdpdGggRVNQIGl0IHdpbGwgZ2l2ZSBhbgotICogTVRVIHRoYXQncyB1c3VhbGx5IHR3byBieXRlcyBzaG9ydCBvZiBiZWluZyBvcHRpbWFsLiAgSG93ZXZlciwgaXQgd2lsbAotICogdXN1YWxseSBnaXZlIGFuIGFuc3dlciB0aGF0J3MgYSBtdWx0aXBsZSBvZiA0IHByb3ZpZGVkIHRoZSBpbnB1dCBpcwotICogYWxzbyBhIG11bHRpcGxlIG9mIDQuCi0gKi8KIGludCB4ZnJtX3N0YXRlX210dShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKIHsKLQlpbnQgcmVzID0gbXR1OworCWludCByZXM7CiAKLQlyZXMgLT0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQotCWZvciAoOzspIHsKLQkJaW50IG0gPSByZXM7Ci0KLQkJaWYgKG0gPCA2OCkKLQkJCXJldHVybiA2ODsKLQotCQlzcGluX2xvY2tfYmgoJngtPmxvY2spOwotCQlpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9WQUxJRCAmJgotCQkgICAgeC0+dHlwZSAmJiB4LT50eXBlLT5nZXRfbWF4X3NpemUpCi0JCQltID0geC0+dHlwZS0+Z2V0X21heF9zaXplKHgsIG0pOwotCQllbHNlCi0JCQltICs9IHgtPnByb3BzLmhlYWRlcl9sZW47Ci0JCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKLQotCQlpZiAobSA8PSBtdHUpCi0JCQlicmVhazsKLQkJcmVzIC09IChtIC0gbXR1KTsKLQl9Ci0KKwlzcGluX2xvY2tfYmgoJngtPmxvY2spOworCWlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX1ZBTElEICYmCisJICAgIHgtPnR5cGUgJiYgeC0+dHlwZS0+Z2V0X210dSkKKwkJcmVzID0geC0+dHlwZS0+Z2V0X210dSh4LCBtdHUpOworCWVsc2UKKwkJcmVzID0gbXR1OworCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKIAlyZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IDgxNmUzNjkuLjY5MTEwZmUgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC03MSw3ICs3MSw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQl9OworCX0KIAogCWFsZ3AtPmFsZ19uYW1lW0NSWVBUT19NQVhfQUxHX05BTUUgLSAxXSA9ICdcMCc7CiAJcmV0dXJuIDA7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogCWRlZmF1bHQ6CiAJCWdvdG8gb3V0OwotCX07CisJfQogCiAJZXJyID0gLUVJTlZBTDsKIAlzd2l0Y2ggKHAtPmlkLnByb3RvKSB7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAogCWRlZmF1bHQ6CiAJCWdvdG8gb3V0OwotCX07CisJfQogCiAJaWYgKChlcnIgPSB2ZXJpZnlfb25lX2FsZyh4ZnJtYSwgWEZSTUFfQUxHX0FVVEgpKSkKIAkJZ290byBvdXQ7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCWRlZmF1bHQ6CiAJCWdvdG8gb3V0OwotCX07CisJfQogCiAJZXJyID0gMDsKIApAQCAtNTc2LDcgKzU3Niw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNwLT5vdXRfc2tiOwogCXN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvICpwOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCWlmIChzcC0+dGhpc19pZHggPCBzcC0+c3RhcnRfaWR4KQogCQlnb3RvIG91dDsKQEAgLTYyMSwxNCArNjIxLDE0IEBACiAJaWYgKHgtPmxhc3R1c2VkKQogCQlSVEFfUFVUKHNrYiwgWEZSTUFfTEFTVFVTRUQsIHNpemVvZih4LT5sYXN0dXNlZCksICZ4LT5sYXN0dXNlZCk7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogb3V0OgogCXNwLT50aGlzX2lkeCsrOwogCXJldHVybiAwOwogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC02NzIsNiArNjcyLDYxIEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIGludCBidWlsZF9zYWRpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgeGZybV9zYWRpbmZvIHNpOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXUzMiAqZjsKKworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBYRlJNX01TR19ORVdTQURJTkZPLCBzaXplb2YodTMyKSwgMCk7CisJaWYgKG5saCA9PSBOVUxMKSAvKiBzaG91bGRudCByZWFsbHkgaGFwcGVuIC4uLiAqLworCQlyZXR1cm4gLUVNU0dTSVpFOworCisJZiA9IG5sbXNnX2RhdGEobmxoKTsKKwkqZiA9IGZsYWdzOworCXhmcm1fc2FkX2dldGluZm8oJnNpKTsKKworCWlmIChmbGFncyAmIFhGUk1fU0FEX0hNQVNLKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NBREhNQVNLLCBzaS5zYWRoY250KTsKKwlpZiAoZmxhZ3MgJiBYRlJNX1NBRF9ITUFYKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NBREhNQVgsIHNpLnNhZGhtY250KTsKKwlpZiAoZmxhZ3MgJiBYRlJNX1NBRF9DTlQpCisJCU5MQV9QVVRfVTMyKHNrYiwgWEZSTUFfU0FEQ05ULCBzaS5zYWRjbnQpOworCisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9nZXRfc2FkaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQoreworCXN0cnVjdCBza19idWZmICpyX3NrYjsKKwl1MzIgKmZsYWdzID0gTkxNU0dfREFUQShubGgpOworCXUzMiBzcGlkID0gTkVUTElOS19DQihza2IpLnBpZDsKKwl1MzIgc2VxID0gbmxoLT5ubG1zZ19zZXE7CisJaW50IGxlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YodTMyKSk7CisKKwlpZiAoKmZsYWdzICYgWEZSTV9TQURfSE1BU0spCisJCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHUzMikpOworCWlmICgqZmxhZ3MgJiBYRlJNX1NBRF9ITUFYKQorCQlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZih1MzIpKTsKKwlpZiAoKmZsYWdzICYgWEZSTV9TQURfQ05UKQorCQlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZih1MzIpKTsKKworCXJfc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocl9za2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYnVpbGRfc2FkaW5mbyhyX3NrYiwgc3BpZCwgc2VxLCAqZmxhZ3MpIDwgMCkKKwkJQlVHKCk7CisKKwlyZXR1cm4gbmxtc2dfdW5pY2FzdCh4ZnJtX25sLCByX3NrYiwgc3BpZCk7Cit9CisKIHN0YXRpYyBpbnQgeGZybV9nZXRfc2Eoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCXN0cnVjdCBydGF0dHIgKip4ZnJtYSkKIHsKQEAgLTcxMSw3ICs3NjYsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlpZiAocC0+bWluID4gcC0+bWF4KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc4OSw3ICs4NDQsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgwNSw3ICs4NjAsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgyMSw3ICs4NzYsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlzd2l0Y2ggKHAtPmFjdGlvbikgewogCWNhc2UgWEZSTV9QT0xJQ1lfQUxMT1c6CkBAIC04MzAsNyArODg1LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJc3dpdGNoIChwLT5zZWwuZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgpAQCAtODQ1LDcgKzkwMCw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQl9OworCX0KIAogCXJldHVybiB2ZXJpZnlfcG9saWN5X2RpcihwLT5kaXIpOwogfQpAQCAtOTEyLDcgKzk2Nyw3IEBACiAjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9OworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTU3LDcgKzEyMTIsNyBAQAogCXN0cnVjdCBza19idWZmICppbl9za2IgPSBzcC0+aW5fc2tiOwogCXN0cnVjdCBza19idWZmICpza2IgPSBzcC0+b3V0X3NrYjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlpZiAoc3AtPnRoaXNfaWR4IDwgc3AtPnN0YXJ0X2lkeCkKIAkJZ290byBvdXQ7CkBAIC0xMTc2LDEzICsxMjMxLDEzIEBACiAJaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cC0+dHlwZSwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiBvdXQ6CiAJc3AtPnRoaXNfaWR4Kys7CiAJcmV0dXJuIDA7CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMzMwLDcgKzEzODUsNyBAQAogCXN0cnVjdCB4ZnJtX2FldmVudF9pZCAqaWQ7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHhmcm1fbGlmZXRpbWVfY3VyIGx0aW1lOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCW5saCA9IE5MTVNHX1BVVChza2IsIGMtPnBpZCwgYy0+c2VxLCBYRlJNX01TR19ORVdBRSwgc2l6ZW9mKCppZCkpOwogCWlkID0gTkxNU0dfREFUQShubGgpOwpAQCAtMTM2MiwxMiArMTQxNywxMiBAQAogCQlSVEFfUFVUKHNrYixYRlJNQV9FVElNRVJfVEhSRVNILHNpemVvZih1MzIpLCZldGltZXIpOwogCX0KIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNzQ0LDcgKzE3OTksNyBAQAogCXN0cnVjdCB4ZnJtX21pZ3JhdGUgKm1wOwogCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKnBvbF9pZDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJaW50IGk7CiAKIAlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCBYRlJNX01TR19NSUdSQVRFLCBzaXplb2YoKnBvbF9pZCkpOwpAQCAtMTc2NCwxMCArMTgxOSwxMCBAQAogCQkJZ290byBubG1zZ19mYWlsdXJlOwogCX0KIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE4MjMsNiArMTg3OCw3IEBACiAJW1hGUk1fTVNHX0dFVEFFICAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX2FldmVudF9pZCksCiAJW1hGUk1fTVNHX1JFUE9SVCAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX3VzZXJfcmVwb3J0KSwKIAlbWEZSTV9NU0dfTUlHUkFURSAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnBvbGljeV9pZCksCisJW1hGUk1fTVNHX0dFVFNBRElORk8gIC0gWEZSTV9NU0dfQkFTRV0gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHUzMikpLAogfTsKIAogI3VuZGVmIFhNU0dTSVpFCkBAIC0xODUwLDU1ICsxOTA2LDM5IEBACiAJW1hGUk1fTVNHX05FV0FFICAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9uZXdfYWUgIH0sCiAJW1hGUk1fTVNHX0dFVEFFICAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9nZXRfYWUgIH0sCiAJW1hGUk1fTVNHX01JR1JBVEUgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9kb19taWdyYXRlICAgIH0sCisJW1hGUk1fTVNHX0dFVFNBRElORk8gIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9nZXRfc2FkaW5mbyAgIH0sCiB9OwogCi1zdGF0aWMgaW50IHhmcm1fdXNlcl9yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCitzdGF0aWMgaW50IHhmcm1fdXNlcl9yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCXN0cnVjdCBydGF0dHIgKnhmcm1hW1hGUk1BX01BWF07CiAJc3RydWN0IHhmcm1fbGluayAqbGluazsKIAlpbnQgdHlwZSwgbWluX2xlbjsKIAotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVFVRVNUKSkKLQkJcmV0dXJuIDA7Ci0KIAl0eXBlID0gbmxoLT5ubG1zZ190eXBlOwotCi0JLyogQSBjb250cm9sIG1lc3NhZ2U6IGlnbm9yZSB0aGVtICovCi0JaWYgKHR5cGUgPCBYRlJNX01TR19CQVNFKQotCQlyZXR1cm4gMDsKLQotCS8qIFVua25vd24gbWVzc2FnZTogcmVwbHkgd2l0aCBFSU5WQUwgKi8KIAlpZiAodHlwZSA+IFhGUk1fTVNHX01BWCkKLQkJZ290byBlcnJfZWludmFsOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXR5cGUgLT0gWEZSTV9NU0dfQkFTRTsKIAlsaW5rID0gJnhmcm1fZGlzcGF0Y2hbdHlwZV07CiAKIAkvKiBBbGwgb3BlcmF0aW9ucyByZXF1aXJlIHByaXZpbGVnZXMsIGV2ZW4gR0VUICovCi0JaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKSB7Ci0JCSplcnJwID0gLUVQRVJNOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICgodHlwZSA9PSAoWEZSTV9NU0dfR0VUU0EgLSBYRlJNX01TR19CQVNFKSB8fAogCSAgICAgdHlwZSA9PSAoWEZSTV9NU0dfR0VUUE9MSUNZIC0gWEZSTV9NU0dfQkFTRSkpICYmCiAJICAgIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkpIHsKIAkJaWYgKGxpbmstPmR1bXAgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX2VpbnZhbDsKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICgoKmVycnAgPSBuZXRsaW5rX2R1bXBfc3RhcnQoeGZybV9ubCwgc2tiLCBubGgsCi0JCQkJCQlsaW5rLT5kdW1wLCBOVUxMKSkgIT0gMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbmV0bGlua19xdWV1ZV9za2lwKG5saCwgc2tiKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KHhmcm1fbmwsIHNrYiwgbmxoLCBsaW5rLT5kdW1wLCBOVUxMKTsKIAl9CiAKIAltZW1zZXQoeGZybWEsIDAsIHNpemVvZih4ZnJtYSkpOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgKG1pbl9sZW4gPSB4ZnJtX21zZ19taW5bdHlwZV0pKQotCQlnb3RvIGVycl9laW52YWw7CisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuID4gbWluX2xlbikgewogCQlpbnQgYXR0cmxlbiA9IG5saC0+bmxtc2dfbGVuIC0gTkxNU0dfQUxJR04obWluX2xlbik7CkBAIC0xOTA4LDcgKzE5NDgsNyBAQAogCQkJdW5zaWduZWQgc2hvcnQgZmxhdm9yID0gYXR0ci0+cnRhX3R5cGU7CiAJCQlpZiAoZmxhdm9yKSB7CiAJCQkJaWYgKGZsYXZvciA+IFhGUk1BX01BWCkKLQkJCQkJZ290byBlcnJfZWludmFsOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl4ZnJtYVtmbGF2b3IgLSAxXSA9IGF0dHI7CiAJCQl9CiAJCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CkBAIC0xOTE2LDE0ICsxOTU2LDkgQEAKIAl9CiAKIAlpZiAobGluay0+ZG9pdCA9PSBOVUxMKQotCQlnb3RvIGVycl9laW52YWw7Ci0JKmVycnAgPSBsaW5rLT5kb2l0KHNrYiwgbmxoLCB4ZnJtYSk7CisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuICplcnJwOwotCi1lcnJfZWludmFsOgotCSplcnJwID0gLUVJTlZBTDsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGxpbmstPmRvaXQoc2tiLCBubGgsIHhmcm1hKTsKIH0KIAogc3RhdGljIHZvaWQgeGZybV9uZXRsaW5rX3JjdihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pCkBAIC0xOTQyLDcgKzE5NzcsNyBAQAogewogCXN0cnVjdCB4ZnJtX3VzZXJfZXhwaXJlICp1ZTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlubGggPSBOTE1TR19QVVQoc2tiLCBjLT5waWQsIDAsIFhGUk1fTVNHX0VYUElSRSwKIAkJCXNpemVvZigqdWUpKTsKQEAgLTE5NTIsMTEgKzE5ODcsMTEgQEAKIAljb3B5X3RvX3VzZXJfc3RhdGUoeCwgJnVlLT5zdGF0ZSk7CiAJdWUtPmhhcmQgPSAoYy0+ZGF0YS5oYXJkICE9IDApID8gMSA6IDA7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE5OTksNyArMjAzNCw3IEBACiAJc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoICpwOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqYjsKKwlza19idWZmX2RhdGFfdCBiOwogCWludCBsZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9mbHVzaCkpOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CkBAIC0yMDQ1LDcgKzIwODAsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJzYV9pZCAqaWQ7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICpiOworCXNrX2J1ZmZfZGF0YV90IGI7CiAJaW50IGxlbiA9IHhmcm1fc2FfbGVuKHgpOwogCWludCBoZWFkbGVuOwogCkBAIC0yMTI5LDcgKzIxNjQsNyBAQAogewogCXN0cnVjdCB4ZnJtX3VzZXJfYWNxdWlyZSAqdWE7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCV9fdTMyIHNlcSA9IHhmcm1fZ2V0X2FjcXNlcSgpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgWEZSTV9NU0dfQUNRVUlSRSwKQEAgLTIxNTMsMTEgKzIxODgsMTEgQEAKIAlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMjQ5LDcgKzIyODQsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlICp1cGU7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJaW50IGhhcmQgPSBjLT5kYXRhLmhhcmQ7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgYy0+cGlkLCAwLCBYRlJNX01TR19QT0xFWFBJUkUsIHNpemVvZigqdXBlKSk7CiAJdXBlID0gTkxNU0dfREFUQShubGgpOwpAQCAtMjI2NCwxMSArMjI5OSwxMSBAQAogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAJdXBlLT5oYXJkID0gISFoYXJkOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMzAwLDcgKzIzMzUsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKmlkOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqYjsKKwlza19idWZmX2RhdGFfdCBiOwogCWludCBsZW4gPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9ucik7CiAJaW50IGhlYWRsZW47CiAKQEAgLTIzNTcsNyArMjM5Miw3IEBACiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICpiOworCXNrX2J1ZmZfZGF0YV90IGI7CiAJaW50IGxlbiA9IDA7CiAjaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQogCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSkpOwpAQCAtMjQxMCw3ICsyNDQ1LDcgQEAKIHsKIAlzdHJ1Y3QgeGZybV91c2VyX3JlcG9ydCAqdXI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgWEZSTV9NU0dfUkVQT1JULCBzaXplb2YoKnVyKSk7CiAJdXIgPSBOTE1TR19EQVRBKG5saCk7CkBAIC0yNDIyLDEyICsyNDU3LDEyIEBACiAJaWYgKGFkZHIpCiAJCVJUQV9QVVQoc2tiLCBYRlJNQV9DT0FERFIsIHNpemVvZigqYWRkciksIGFkZHIpOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTI0NjYsNyArMjUwMSw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIFhGUk0gbmV0bGluayBzb2NrZXRcbiIpOwogCiAJbmxzayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1hGUk0sIFhGUk1OTEdSUF9NQVgsCi0JCQkJICAgICB4ZnJtX25ldGxpbmtfcmN2LCBUSElTX01PRFVMRSk7CisJCQkJICAgICB4ZnJtX25ldGxpbmtfcmN2LCBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKG5sc2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmN1X2Fzc2lnbl9wb2ludGVyKHhmcm1fbmwsIG5sc2spOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwppbmRleCBhZDQ1Y2U3Li44ODI5MmUzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYworKysgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwpAQCAtNjYsNiArNjYsOCBAQAogCS5yZWFkCQk9IGtleXJpbmdfcmVhZCwKIH07CiAKK0VYUE9SVF9TWU1CT0woa2V5X3R5cGVfa2V5cmluZyk7CisKIC8qCiAgKiBzZW1hcGhvcmUgdG8gc2VyaWFsaXNlIGxpbmsvbGluayBjYWxscyB0byBwcmV2ZW50IHR3byBsaW5rIGNhbGxzIGluIHBhcmFsbGVsCiAgKiBpbnRyb2R1Y2luZyBhIGN5Y2xlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggZDQxZTI0ZC4uNWYwMmI0YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMjk0NCw3ICsyOTQ0LDcgQEAKIAlpbnQgb2Zmc2V0LCBpaGxlbiwgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOwogCi0Jb2Zmc2V0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXBoKSwgJl9pcGgpOwogCWlmIChpaCA9PSBOVUxMKQogCQlnb3RvIG91dDsKQEAgLTMwMjYsNyArMzAyNiw3IEBACiAJaW50IHJldCA9IC1FSU5WQUwsIG9mZnNldDsKIAlzdHJ1Y3QgaXB2NmhkciBfaXB2NmgsICppcDY7CiAKLQlvZmZzZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlvZmZzZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAlpcDYgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXB2NmgpLCAmX2lwdjZoKTsKIAlpZiAoaXA2ID09IE5VTEwpCiAJCWdvdG8gb3V0OwpAQCAtMzc4Niw3ICszNzg2LDcgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQotCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJCiAJZXJyID0gc2VsaW51eF9ubG1zZ19sb29rdXAoaXNlYy0+c2NsYXNzLCBubGgtPm5sbXNnX3R5cGUsICZwZXJtKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxpbmsuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCmluZGV4IGUyMDM4ODMuLmY0OTA0NmQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCkBAIC02Niw3ICs2Niw3IEBACiBzdGF0aWMgdm9pZCBzZWxubF9ub3RpZnkoaW50IG1zZ3R5cGUsIHZvaWQgKmRhdGEpCiB7CiAJaW50IGxlbjsKLQl1bnNpZ25lZCBjaGFyICp0bXA7CisJc2tfYnVmZl9kYXRhX3QgdG1wOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2VsbmxfaW5pdCh2b2lkKQogewotCXNlbG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfU0VMSU5VWCwgU0VMTkxHUlBfTUFYLCBOVUxMLAorCXNlbG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfU0VMSU5VWCwgU0VMTkxHUlBfTUFYLCBOVUxMLCBOVUxMLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfTU9EVUxFKTsKIAlpZiAoc2VsbmwgPT0gTlVMTCkKIAkJcGFuaWMoIlNFTGludXg6ICBDYW5ub3QgY3JlYXRlIG5ldGxpbmsgc29ja2V0LiIpOwo=