ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CmluZGV4IDA5ZGQ1MTAuLjU3NmNlNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dApAQCAtNzgsNyArNzgsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0KIEdQSU9zIGFyZSBpZGVudGlmaWVkIGJ5IHVuc2lnbmVkIGludGVnZXJzIGluIHRoZSByYW5nZSAwLi5NQVhfSU5ULiAgVGhhdAogcmVzZXJ2ZXMgIm5lZ2F0aXZlIiBudW1iZXJzIGZvciBvdGhlciBwdXJwb3NlcyBsaWtlIG1hcmtpbmcgc2lnbmFscyBhcwotIm5vdCBhdmFpbGFibGUgb24gdGhpcyBib2FyZCIsIG9yIGluZGljYXRpbmcgZmF1bHRzLgorIm5vdCBhdmFpbGFibGUgb24gdGhpcyBib2FyZCIsIG9yIGluZGljYXRpbmcgZmF1bHRzLiAgQ29kZSB0aGF0IGRvZXNuJ3QKK3RvdWNoIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIHRyZWF0cyB0aGVzZSBpbnRlZ2VycyBhcyBvcGFxdWUgY29va2llcy4KIAogUGxhdGZvcm1zIGRlZmluZSBob3cgdGhleSB1c2UgdGhvc2UgaW50ZWdlcnMsIGFuZCB1c3VhbGx5ICNkZWZpbmUgc3ltYm9scwogZm9yIHRoZSBHUElPIGxpbmVzIHNvIHRoYXQgYm9hcmQtc3BlY2lmaWMgc2V0dXAgY29kZSBkaXJlY3RseSBjb3JyZXNwb25kcwpAQCAtMTM5LDEwICsxNDAsMTAgQEAKIFRoZSBnZXQvc2V0IGNhbGxzIGhhdmUgbm8gZXJyb3IgcmV0dXJucyBiZWNhdXNlICJpbnZhbGlkIEdQSU8iIHNob3VsZCBoYXZlCiBiZWVuIHJlcG9ydGVkIGVhcmxpZXIgaW4gZ3Bpb19zZXRfZGlyZWN0aW9uKCkuICBIb3dldmVyLCBub3RlIHRoYXQgbm90IGFsbAogcGxhdGZvcm1zIGNhbiByZWFkIHRoZSB2YWx1ZSBvZiBvdXRwdXQgcGluczsgdGhvc2UgdGhhdCBjYW4ndCBzaG91bGQgYWx3YXlzCi1yZXR1cm4gemVyby4gIEFsc28sIHRoZXNlIGNhbGxzIHdpbGwgYmUgaWdub3JlZCBmb3IgR1BJT3MgdGhhdCBjYW4ndCBzYWZlbHkKLWJlIGFjY2Vzc2VkIHdpaHRvdXQgc2xlZXBpbmcgKHNlZSBiZWxvdykuCityZXR1cm4gemVyby4gIEFsc28sIHVzaW5nIHRoZXNlIGNhbGxzIGZvciBHUElPcyB0aGF0IGNhbid0IHNhZmVseSBiZSBhY2Nlc3NlZAord2l0aG91dCBzbGVlcGluZyAoc2VlIGJlbG93KSBpcyBhbiBlcnJvci4KIAotUGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIG9wdGltaXNlIHRoZSB0d28KK1BsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byBvcHRpbWl6ZSB0aGUgdHdvCiBjYWxscyB0byBhY2Nlc3MgdGhlIEdQSU8gdmFsdWUgaW4gY2FzZXMgd2hlcmUgdGhlIEdQSU8gbnVtYmVyIChhbmQgZm9yCiBvdXRwdXQsIHZhbHVlKSBhcmUgY29uc3RhbnQuICBJdCdzIG5vcm1hbCBmb3IgdGhlbSB0byBuZWVkIG9ubHkgYSBjb3VwbGUKIG9mIGluc3RydWN0aW9ucyBpbiBzdWNoIGNhc2VzIChyZWFkaW5nIG9yIHdyaXRpbmcgYSBoYXJkd2FyZSByZWdpc3RlciksCkBAIC0yMzksNyArMjQwLDggQEAKIHN5c3RlbSB3YWtldXAgY2FwYWJpbGl0aWVzLgogCiBOb24tZXJyb3IgdmFsdWVzIHJldHVybmVkIGZyb20gaXJxX3RvX2dwaW8oKSB3b3VsZCBtb3N0IGNvbW1vbmx5IGJlIHVzZWQKLXdpdGggZ3Bpb19nZXRfdmFsdWUoKS4KK3dpdGggZ3Bpb19nZXRfdmFsdWUoKSwgZm9yIGV4YW1wbGUgdG8gaW5pdGlhbGl6ZSBvciB1cGRhdGUgZHJpdmVyIHN0YXRlCit3aGVuIHRoZSBJUlEgaXMgZWRnZS10cmlnZ2VyZWQuCiAKIAogCkBAIC0yNjAsOSArMjYyLDEwIEBACiBUaGVyZSBhcmUgb3RoZXIgc3lzdGVtLXNwZWNpZmljIG1lY2hhbmlzbXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBoZXJlLAogbGlrZSB0aGUgYWZvcmVtZW50aW9uZWQgb3B0aW9ucyBmb3IgaW5wdXQgZGUtZ2xpdGNoaW5nIGFuZCB3aXJlLU9SIG91dHB1dC4KIEhhcmR3YXJlIG1heSBzdXBwb3J0IHJlYWRpbmcgb3Igd3JpdGluZyBHUElPcyBpbiBnYW5ncywgYnV0IHRoYXQncyB1c3VhbGx5Ci1jb25maWd1cmF0aW9uIGRlcGVuZGVkbnQ6ICBmb3IgR1BJT3Mgc2hhcmluZyB0aGUgc2FtZSBiYW5rLiAgKEdQSU9zIGFyZQorY29uZmlndXJhdGlvbiBkZXBlbmRlbnQ6ICBmb3IgR1BJT3Mgc2hhcmluZyB0aGUgc2FtZSBiYW5rLiAgKEdQSU9zIGFyZQogY29tbW9ubHkgZ3JvdXBlZCBpbiBiYW5rcyBvZiAxNiBvciAzMiwgd2l0aCBhIGdpdmVuIFNPQyBoYXZpbmcgc2V2ZXJhbCBzdWNoCi1iYW5rcy4pICBDb2RlIHJlbHlpbmcgb24gc3VjaCBtZWNoYW5pc21zIHdpbGwgbmVjZXNzYXJpbHkgYmUgbm9ucG9ydGFibGUuCitiYW5rcy4pICBTb21lIHN5c3RlbXMgY2FuIHRyaWdnZXIgSVJRcyBmcm9tIG91dHB1dCBHUElPcy4gIENvZGUgcmVseWluZyBvbgorc3VjaCBtZWNoYW5pc21zIHdpbGwgbmVjZXNzYXJpbHkgYmUgbm9ucG9ydGFibGUuCiAKIER5bmFtaWMgZGVmaW5pdGlvbiBvZiBHUElPcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZDsgZm9yIGV4YW1wbGUsIGFzCiBhIHNpZGUgZWZmZWN0IG9mIGNvbmZpZ3VyaW5nIGFuIGFkZC1vbiBib2FyZCB3aXRoIHNvbWUgR1BJTyBleHBhbmRlcnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y3ODJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dApAQCAtMCwwICsxLDY4IEBACit0aW1lcl9zdGF0cyAtIHRpbWVyIHVzYWdlIHN0YXRpc3RpY3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aW1lcl9zdGF0cyBpcyBhIGRlYnVnZ2luZyBmYWNpbGl0eSB0byBtYWtlIHRoZSB0aW1lciAoYWIpdXNhZ2UgaW4gYSBMaW51eAorc3lzdGVtIHZpc2libGUgdG8ga2VybmVsIGFuZCB1c2Vyc3BhY2UgZGV2ZWxvcGVycy4gSXQgaXMgbm90IGludGVuZGVkIGZvcgorcHJvZHVjdGlvbiB1c2FnZSBhcyBpdCBhZGRzIHNpZ25pZmljYW50IG92ZXJoZWFkIHRvIHRoZSAoaHIpdGltZXIgY29kZSBhbmQgdGhlCisoaHIpdGltZXIgZGF0YSBzdHJ1Y3R1cmVzLgorCit0aW1lcl9zdGF0cyBzaG91bGQgYmUgdXNlZCBieSBrZXJuZWwgYW5kIHVzZXJzcGFjZSBkZXZlbG9wZXJzIHRvIHZlcmlmeSB0aGF0Cit0aGVpciBjb2RlIGRvZXMgbm90IG1ha2UgdW5kdWx5IHVzZSBvZiB0aW1lcnMuIFRoaXMgaGVscHMgdG8gYXZvaWQgdW5uZWNlc3NhcnkKK3dha2V1cHMsIHdoaWNoIHNob3VsZCBiZSBhdm9pZGVkIHRvIG9wdGltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorCitJdCBjYW4gYmUgZW5hYmxlZCBieSBDT05GSUdfVElNRVJfU1RBVFMgaW4gdGhlICJLZXJuZWwgaGFja2luZyIgY29uZmlndXJhdGlvbgorc2VjdGlvbi4KKwordGltZXJfc3RhdHMgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRpbWVyIGV2ZW50cyB3aGljaCBhcmUgZmlyZWQgaW4gYQorTGludXggc3lzdGVtIG92ZXIgYSBzYW1wbGUgcGVyaW9kOgorCistIHRoZSBwaWQgb2YgdGhlIHRhc2socHJvY2Vzcykgd2hpY2ggaW5pdGlhbGl6ZWQgdGhlIHRpbWVyCistIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHdoaWNoIGluaXRpYWxpemVkIHRoZSB0aW1lcgorLSB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIHRpbWVyIHdhcyBpbnRpYWxpemVkCistIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBhc3NvY2lhdGVkIHRvIHRoZSB0aW1lcgorLSB0aGUgbnVtYmVyIG9mIGV2ZW50cyAoY2FsbGJhY2tzKQorCit0aW1lcl9zdGF0cyBhZGRzIGFuIGVudHJ5IHRvIC9wcm9jOiAvcHJvYy90aW1lcl9zdGF0cworCitUaGlzIGVudHJ5IGlzIHVzZWQgdG8gY29udHJvbCB0aGUgc3RhdGlzdGljcyBmdW5jdGlvbmFsaXR5IGFuZCB0byByZWFkIG91dCB0aGUKK3NhbXBsZWQgaW5mb3JtYXRpb24uCisKK1RoZSB0aW1lcl9zdGF0cyBmdW5jdGlvbmFsaXR5IGlzIGluYWN0aXZlIG9uIGJvb3R1cC4KKworVG8gYWN0aXZhdGUgYSBzYW1wbGUgcGVyaW9kIGlzc3VlOgorIyBlY2hvIDEgPi9wcm9jL3RpbWVyX3N0YXRzCisKK1RvIHN0b3AgYSBzYW1wbGUgcGVyaW9kIGlzc3VlOgorIyBlY2hvIDAgPi9wcm9jL3RpbWVyX3N0YXRzCisKK1RoZSBzdGF0aXN0aWNzIGNhbiBiZSByZXRyaWV2ZWQgYnk6CisjIGNhdCAvcHJvYy90aW1lcl9zdGF0cworCitUaGUgcmVhZG91dCBvZiAvcHJvYy90aW1lcl9zdGF0cyBhdXRvbWF0aWNhbGx5IGRpc2FibGVzIHNhbXBsaW5nLiBUaGUgc2FtcGxlZAoraW5mb3JtYXRpb24gaXMga2VwdCB1bnRpbCBhIG5ldyBzYW1wbGUgcGVyaW9kIGlzIHN0YXJ0ZWQuIFRoaXMgYWxsb3dzIG11bHRpcGxlCityZWFkb3V0cy4KKworU2FtcGxlIG91dHB1dCBvZiAvcHJvYy90aW1lcl9zdGF0czoKKworVGltZXJzdGF0cyBzYW1wbGUgcGVyaW9kOiAzLjg4ODc3MCBzCisgIDEyLCAgICAgMCBzd2FwcGVyICAgICAgICAgIGhydGltZXJfc3RvcF9zY2hlZF90aWNrIChocnRpbWVyX3NjaGVkX3RpY2spCisgIDE1LCAgICAgMSBzd2FwcGVyICAgICAgICAgIGhjZF9zdWJtaXRfdXJiIChyaF90aW1lcl9mdW5jKQorICAgNCwgICA5NTkga2VkYWMgICAgICAgICAgICBzY2hlZHVsZV90aW1lb3V0IChwcm9jZXNzX3RpbWVvdXQpCisgICAxLCAgICAgMCBzd2FwcGVyICAgICAgICAgIHBhZ2Vfd3JpdGViYWNrX2luaXQgKHdiX3RpbWVyX2ZuKQorICAyOCwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0b3Bfc2NoZWRfdGljayAoaHJ0aW1lcl9zY2hlZF90aWNrKQorICAyMiwgIDI5NDggSVJRIDQgICAgICAgICAgICB0dHlfZmxpcF9idWZmZXJfcHVzaCAoZGVsYXllZF93b3JrX3RpbWVyX2ZuKQorICAgMywgIDMxMDAgYmFzaCAgICAgICAgICAgICBzY2hlZHVsZV90aW1lb3V0IChwcm9jZXNzX3RpbWVvdXQpCisgICAxLCAgICAgMSBzd2FwcGVyICAgICAgICAgIHF1ZXVlX2RlbGF5ZWRfd29ya19vbiAoZGVsYXllZF93b3JrX3RpbWVyX2ZuKQorICAgMSwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKyAgIDEsICAgICAxIHN3YXBwZXIgICAgICAgICAgbmVpZ2hfdGFibGVfaW5pdF9ub19uZXRsaW5rIChuZWlnaF9wZXJpb2RpY190aW1lcikKKyAgIDEsICAyMjkyIGlwICAgICAgICAgICAgICAgX19uZXRkZXZfd2F0Y2hkb2dfdXAgKGRldl93YXRjaGRvZykKKyAgIDEsICAgIDIzIGV2ZW50cy8xICAgICAgICAgZG9fY2FjaGVfY2xlYW4gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKzkwIHRvdGFsIGV2ZW50cywgMzAuMCBldmVudHMvc2VjCisKK1RoZSBmaXJzdCBjb2x1bW4gaXMgdGhlIG51bWJlciBvZiBldmVudHMsIHRoZSBzZWNvbmQgY29sdW1uIHRoZSBwaWQsIHRoZSB0aGlyZAorY29sdW1uIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzLiBUaGUgZm9ydGggY29sdW1uIHNob3dzIHRoZSBmdW5jdGlvbiB3aGljaAoraW5pdGlhbGl6ZWQgdGhlIHRpbWVyIGFuZCBpbiBwYXJhbnRoZXNlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2FzCitleGVjdXRlZCBvbiBleHBpcnkuCisKKyAgICBUaG9tYXMsIEluZ28KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ocnRpbWVycy9oaWdocmVzLnR4dCBiL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMvaGlnaHJlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZTlhOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMvaGlnaHJlcy50eHQKQEAgLTAsMCArMSwyNDkgQEAKK0hpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYW5kIGR5bmFtaWMgdGlja3MgZGVzaWduIG5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGFwZXIgb2YgdGhlIE9MUyAyMDA2IHRhbGsgImhydGltZXJzCithbmQgYmV5b25kIi4gVGhlIHBhcGVyIGlzIHBhcnQgb2YgdGhlIE9MUyAyMDA2IFByb2NlZWRpbmdzIFZvbHVtZSAxLCB3aGljaCBjYW4KK2JlIGZvdW5kIG9uIHRoZSBPTFMgd2Vic2l0ZToKK2h0dHA6Ly93d3cubGludXhzeW1wb3NpdW0ub3JnLzIwMDYvbGludXhzeW1wb3NpdW1fcHJvY3YxLnBkZgorCitUaGUgc2xpZGVzIHRvIHRoaXMgdGFsayBhcmUgYXZhaWxhYmxlIGZyb206CitodHRwOi8vdGdseC5kZS9wcm9qZWN0cy9ocnRpbWVycy9vbHMyMDA2LWhydGltZXJzLnBkZgorCitUaGUgc2xpZGVzIGNvbnRhaW4gZml2ZSBmaWd1cmVzIChwYWdlcyAyLCAxNSwgMTgsIDIwLCAyMiksIHdoaWNoIGlsbHVzdHJhdGUgdGhlCitjaGFuZ2VzIGluIHRoZSB0aW1lKHIpIHJlbGF0ZWQgTGludXggc3Vic3lzdGVtcy4gRmlndXJlICMxIChwLiAyKSBzaG93cyB0aGUKK2Rlc2lnbiBvZiB0aGUgTGludXggdGltZShyKSBzeXN0ZW0gYmVmb3JlIGhydGltZXJzIGFuZCBvdGhlciBidWlsZGluZyBibG9ja3MKK2dvdCBtZXJnZWQgaW50byBtYWlubGluZS4KKworTm90ZTogdGhlIHBhcGVyIGFuZCB0aGUgc2xpZGVzIGFyZSB0YWxraW5nIGFib3V0ICJjbG9jayBldmVudCBzb3VyY2UiLCB3aGlsZSB3ZQorc3dpdGNoZWQgdG8gdGhlIG5hbWUgImNsb2NrIGV2ZW50IGRldmljZXMiIGluIG1lYW50aW1lLgorCitUaGUgZGVzaWduIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYmFzaWMgYnVpbGRpbmcgYmxvY2tzOgorCistIGhydGltZXIgYmFzZSBpbmZyYXN0cnVjdHVyZQorLSB0aW1lb2ZkYXkgYW5kIGNsb2NrIHNvdXJjZSBtYW5hZ2VtZW50CistIGNsb2NrIGV2ZW50IG1hbmFnZW1lbnQKKy0gaGlnaCByZXNvbHV0aW9uIHRpbWVyIGZ1bmN0aW9uYWxpdHkKKy0gZHluYW1pYyB0aWNrcworCisKK2hydGltZXIgYmFzZSBpbmZyYXN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBocnRpbWVyIGJhc2UgaW5mcmFzdHJ1Y3R1cmUgd2FzIG1lcmdlZCBpbnRvIHRoZSAyLjYuMTYga2VybmVsLiBEZXRhaWxzIG9mCit0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBhcmUgY292ZXJlZCBpbiBEb2N1bWVudGF0aW9uL2hydGltZXJzL2hydGltZXIudHh0LiBTZWUKK2Fsc28gZmlndXJlICMyIChPTFMgc2xpZGVzIHAuIDE1KQorCitUaGUgbWFpbiBkaWZmZXJlbmNlcyB0byB0aGUgdGltZXIgd2hlZWwsIHdoaWNoIGhvbGRzIHRoZSBhcm1lZCB0aW1lcl9saXN0IHR5cGUKK3RpbWVycyBhcmU6CisgICAgICAgLSB0aW1lIG9yZGVyZWQgZW5xdWV1ZWluZyBpbnRvIGEgcmItdHJlZQorICAgICAgIC0gaW5kZXBlbmRlbnQgb2YgdGlja3MgKHRoZSBwcm9jZXNzaW5nIGlzIGJhc2VkIG9uIG5hbm9zZWNvbmRzKQorCisKK3RpbWVvZmRheSBhbmQgY2xvY2sgc291cmNlIG1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSm9obiBTdHVsdHoncyBHZW5lcmljIFRpbWUgT2YgRGF5IChHVE9EKSBmcmFtZXdvcmsgbW92ZXMgYSBsYXJnZSBwb3J0aW9uIG9mCitjb2RlIG91dCBvZiB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGFyZWFzIGludG8gYSBnZW5lcmljIG1hbmFnZW1lbnQKK2ZyYW1ld29yaywgYXMgaWxsdXN0cmF0ZWQgaW4gZmlndXJlICMzIChPTFMgc2xpZGVzIHAuIDE4KS4gVGhlIGFyY2hpdGVjdHVyZQorc3BlY2lmaWMgcG9ydGlvbiBpcyByZWR1Y2VkIHRvIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgZGV0YWlscyBvZiB0aGUgY2xvY2sKK3NvdXJjZXMsIHdoaWNoIGFyZSByZWdpc3RlcmVkIGluIHRoZSBmcmFtZXdvcmsgYW5kIHNlbGVjdGVkIG9uIGEgcXVhbGl0eSBiYXNlZAorZGVjaXNpb24uIFRoZSBsb3cgbGV2ZWwgY29kZSBwcm92aWRlcyBoYXJkd2FyZSBzZXR1cCBhbmQgcmVhZG91dCByb3V0aW5lcyBhbmQKK2luaXRpYWxpemVzIGRhdGEgc3RydWN0dXJlcywgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIGdlbmVyaWMgdGltZSBrZWVwaW5nIGNvZGUgdG8KK2NvbnZlcnQgdGhlIGNsb2NrIHRpY2tzIHRvIG5hbm9zZWNvbmQgYmFzZWQgdGltZSB2YWx1ZXMuIEFsbCBvdGhlciB0aW1lIGtlZXBpbmcKK3JlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBtb3ZlZCBpbnRvIHRoZSBnZW5lcmljIGNvZGUuIFRoZSBHVE9EIGJhc2UgcGF0Y2ggZ290CittZXJnZWQgaW50byB0aGUgMi42LjE4IGtlcm5lbC4KKworRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgR2VuZXJpYyBUaW1lIE9mIERheSBmcmFtZXdvcmsgaXMgYXZhaWxhYmxlIGluIHRoZQorT0xTIDIwMDUgUHJvY2VlZGluZ3MgVm9sdW1lIDE6CitodHRwOi8vd3d3LmxpbnV4c3ltcG9zaXVtLm9yZy8yMDA1L2xpbnV4c3ltcG9zaXVtX3Byb2N2MS5wZGYKKworVGhlIHBhcGVyICJXZSBBcmUgTm90IEdldHRpbmcgQW55IFlvdW5nZXI6IEEgTmV3IEFwcHJvYWNoIHRvIFRpbWUgYW5kCitUaW1lcnMiIHdhcyB3cml0dGVuIGJ5IEouIFN0dWx0eiwgRC5WLiBIYXJ0LCAmIE4uIEFyYXZhbXVkYW4uCisKK0ZpZ3VyZSAjMyAoT0xTIHNsaWRlcyBwLjE4KSBpbGx1c3RyYXRlcyB0aGUgdHJhbnNmb3JtYXRpb24uCisKKworY2xvY2sgZXZlbnQgbWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGlsZSBjbG9jayBzb3VyY2VzIHByb3ZpZGUgcmVhZCBhY2Nlc3MgdG8gdGhlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lCit2YWx1ZSwgY2xvY2sgZXZlbnQgZGV2aWNlcyBhcmUgdXNlZCB0byBzY2hlZHVsZSB0aGUgbmV4dCBldmVudAoraW50ZXJydXB0KHMpLiBUaGUgbmV4dCBldmVudCBpcyBjdXJyZW50bHkgZGVmaW5lZCB0byBiZSBwZXJpb2RpYywgd2l0aCBpdHMKK3BlcmlvZCBkZWZpbmVkIGF0IGNvbXBpbGUgdGltZS4gVGhlIHNldHVwIGFuZCBzZWxlY3Rpb24gb2YgdGhlIGV2ZW50IGRldmljZQorZm9yIHZhcmlvdXMgZXZlbnQgZHJpdmVuIGZ1bmN0aW9uYWxpdGllcyBpcyBoYXJkd2lyZWQgaW50byB0aGUgYXJjaGl0ZWN0dXJlCitkZXBlbmRlbnQgY29kZS4gVGhpcyByZXN1bHRzIGluIGR1cGxpY2F0ZWQgY29kZSBhY3Jvc3MgYWxsIGFyY2hpdGVjdHVyZXMgYW5kCittYWtlcyBpdCBleHRyZW1lbHkgZGlmZmljdWx0IHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIHRvIHVzZQorZXZlbnQgaW50ZXJydXB0IGRldmljZXMgb3RoZXIgdGhhbiB0aG9zZSBhbHJlYWR5IGJ1aWx0IGludG8gdGhlCithcmNoaXRlY3R1cmUuIEFub3RoZXIgaW1wbGljYXRpb24gb2YgdGhlIGN1cnJlbnQgZGVzaWduIGlzIHRoYXQgaXQgaXMgbmVjZXNzYXJ5Cit0byB0b3VjaCBhbGwgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgaW4gb3JkZXIgdG8gcHJvdmlkZSBuZXcKK2Z1bmN0aW9uYWxpdHkgbGlrZSBoaWdoIHJlc29sdXRpb24gdGltZXJzIG9yIGR5bmFtaWMgdGlja3MuCisKK1RoZSBjbG9jayBldmVudHMgc3Vic3lzdGVtIHRyaWVzIHRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtIGJ5IHByb3ZpZGluZyBhIGdlbmVyaWMKK3NvbHV0aW9uIHRvIG1hbmFnZSBjbG9jayBldmVudCBkZXZpY2VzIGFuZCB0aGVpciB1c2FnZSBmb3IgdGhlIHZhcmlvdXMgY2xvY2sKK2V2ZW50IGRyaXZlbiBrZXJuZWwgZnVuY3Rpb25hbGl0aWVzLiBUaGUgZ29hbCBvZiB0aGUgY2xvY2sgZXZlbnQgc3Vic3lzdGVtIGlzCit0byBtaW5pbWl6ZSB0aGUgY2xvY2sgZXZlbnQgcmVsYXRlZCBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IGNvZGUgdG8gdGhlIHB1cmUKK2hhcmR3YXJlIHJlbGF0ZWQgaGFuZGxpbmcgYW5kIHRvIGFsbG93IGVhc3kgYWRkaXRpb24gYW5kIHV0aWxpemF0aW9uIG9mIG5ldworY2xvY2sgZXZlbnQgZGV2aWNlcy4gSXQgYWxzbyBtaW5pbWl6ZXMgdGhlIGR1cGxpY2F0ZWQgY29kZSBhY3Jvc3MgdGhlCithcmNoaXRlY3R1cmVzIGFzIGl0IHByb3ZpZGVzIGdlbmVyaWMgZnVuY3Rpb25hbGl0eSBkb3duIHRvIHRoZSBpbnRlcnJ1cHQKK3NlcnZpY2UgaGFuZGxlciwgd2hpY2ggaXMgYWxtb3N0IGluaGVyZW50bHkgaGFyZHdhcmUgZGVwZW5kZW50LgorCitDbG9jayBldmVudCBkZXZpY2VzIGFyZSByZWdpc3RlcmVkIGVpdGhlciBieSB0aGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBib290Citjb2RlIG9yIGF0IG1vZHVsZSBpbnNlcnRpb24gdGltZS4gRWFjaCBjbG9jayBldmVudCBkZXZpY2UgZmlsbHMgYSBkYXRhCitzdHJ1Y3R1cmUgd2l0aCBjbG9jay1zcGVjaWZpYyBwcm9wZXJ0eSBwYXJhbWV0ZXJzIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMuIFRoZQorY2xvY2sgZXZlbnQgbWFuYWdlbWVudCBkZWNpZGVzLCBieSB1c2luZyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHBhcmFtZXRlcnMsIHRoZQorc2V0IG9mIHN5c3RlbSBmdW5jdGlvbnMgYSBjbG9jayBldmVudCBkZXZpY2Ugd2lsbCBiZSB1c2VkIHRvIHN1cHBvcnQuIFRoaXMKK2luY2x1ZGVzIHRoZSBkaXN0aW5jdGlvbiBvZiBwZXItQ1BVIGFuZCBwZXItc3lzdGVtIGdsb2JhbCBldmVudCBkZXZpY2VzLgorCitTeXN0ZW0tbGV2ZWwgZ2xvYmFsIGV2ZW50IGRldmljZXMgYXJlIHVzZWQgZm9yIHRoZSBMaW51eCBwZXJpb2RpYyB0aWNrLiBQZXItQ1BVCitldmVudCBkZXZpY2VzIGFyZSB1c2VkIHRvIHByb3ZpZGUgbG9jYWwgQ1BVIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBwcm9jZXNzCithY2NvdW50aW5nLCBwcm9maWxpbmcsIGFuZCBoaWdoIHJlc29sdXRpb24gdGltZXJzLgorCitUaGUgbWFuYWdlbWVudCBsYXllciBhc3NpZ25lcyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbGl3aW5nIGZ1bmN0aW9ucyB0byBhIGNsb2NrCitldmVudCBkZXZpY2U6CisgICAgICAtIHN5c3RlbSBnbG9iYWwgcGVyaW9kaWMgdGljayAoamlmZmllcyB1cGRhdGUpCisgICAgICAtIGNwdSBsb2NhbCB1cGRhdGVfcHJvY2Vzc190aW1lcworICAgICAgLSBjcHUgbG9jYWwgcHJvZmlsaW5nCisgICAgICAtIGNwdSBsb2NhbCBuZXh0IGV2ZW50IGludGVycnVwdCAobm9uIHBlcmlvZGljIG1vZGUpCisKK1RoZSBjbG9jayBldmVudCBkZXZpY2UgZGVsZWdhdGVzIHRoZSBzZWxlY3Rpb24gb2YgdGhvc2UgdGltZXIgaW50ZXJydXB0IHJlbGF0ZWQKK2Z1bmN0aW9ucyBjb21wbGV0ZWx5IHRvIHRoZSBtYW5hZ2VtZW50IGxheWVyLiBUaGUgY2xvY2sgbWFuYWdlbWVudCBsYXllciBzdG9yZXMKK2EgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgZGV2aWNlIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSwgd2hpY2ggaGFzIHRvIGJlIGNhbGxlZAorZnJvbSB0aGUgaGFyZHdhcmUgbGV2ZWwgaGFuZGxlci4gVGhpcyByZW1vdmVzIGEgbG90IG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIHRoZQorYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHRpbWVyIGludGVycnVwdCBoYW5kbGVycyBhbmQgaGFuZHMgdGhlIGNvbnRyb2wgb3ZlciB0aGUKK2Nsb2NrIGV2ZW50IGRldmljZXMgYW5kIHRoZSBhc3NpZ25tZW50IG9mIHRpbWVyIGludGVycnVwdCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkKK3RvIHRoZSBjb3JlIGNvZGUuCisKK1RoZSBjbG9jayBldmVudCBsYXllciBBUEkgaXMgcmF0aGVyIHNtYWxsLiBBc2lkZSBmcm9tIHRoZSBjbG9jayBldmVudCBkZXZpY2UKK3JlZ2lzdHJhdGlvbiBpbnRlcmZhY2UgaXQgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGV2ZW50CitpbnRlcnJ1cHQsIGNsb2NrIGV2ZW50IGRldmljZSBub3RpZmljYXRpb24gc2VydmljZSBhbmQgc3VwcG9ydCBmb3Igc3VzcGVuZCBhbmQKK3Jlc3VtZS4KKworVGhlIGZyYW1ld29yayBhZGRzIGFib3V0IDcwMCBsaW5lcyBvZiBjb2RlIHdoaWNoIHJlc3VsdHMgaW4gYSAyS0IgaW5jcmVhc2Ugb2YKK3RoZSBrZXJuZWwgYmluYXJ5IHNpemUuIFRoZSBjb252ZXJzaW9uIG9mIGkzODYgcmVtb3ZlcyBhYm91dCAxMDAgbGluZXMgb2YKK2NvZGUuIFRoZSBiaW5hcnkgc2l6ZSBkZWNyZWFzZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgNDAwIGJ5dGUuIFdlIGJlbGlldmUgdGhhdCB0aGUKK2luY3JlYXNlIG9mIGZsZXhpYmlsaXR5IGFuZCB0aGUgYXZvaWRhbmNlIG9mIGR1cGxpY2F0ZWQgY29kZSBhY3Jvc3MKK2FyY2hpdGVjdHVyZXMganVzdGlmaWVzIHRoZSBzbGlnaHQgaW5jcmVhc2Ugb2YgdGhlIGJpbmFyeSBzaXplLgorCitUaGUgY29udmVyc2lvbiBvZiBhbiBhcmNoaXRlY3R1cmUgaGFzIG5vIGZ1bmN0aW9uYWwgaW1wYWN0LCBidXQgYWxsb3dzIHRvCit1dGlsaXplIHRoZSBoaWdoIHJlc29sdXRpb24gYW5kIGR5bmFtaWMgdGljayBmdW5jdGlvbmFsaXRlcyB3aXRob3V0IGFueSBjaGFuZ2UKK3RvIHRoZSBjbG9jayBldmVudCBkZXZpY2UgYW5kIHRpbWVyIGludGVycnVwdCBjb2RlLiBBZnRlciB0aGUgY29udmVyc2lvbiB0aGUKK2VuYWJsaW5nIG9mIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYW5kIGR5bmFtaWMgdGlja3MgaXMgc2ltcGx5IHByb3ZpZGVkIGJ5CithZGRpbmcgdGhlIGtlcm5lbC90aW1lL0tjb25maWcgZmlsZSB0byB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIEtjb25maWcgYW5kCithZGRpbmcgdGhlIGR5bmFtaWMgdGljayBzcGVjaWZpYyBjYWxscyB0byB0aGUgaWRsZSByb3V0aW5lIChhIHRvdGFsIG9mIDMgbGluZXMKK2FkZGVkIHRvIHRoZSBpZGxlIGZ1bmN0aW9uIGFuZCB0aGUgS2NvbmZpZyBmaWxlKQorCitGaWd1cmUgIzQgKE9MUyBzbGlkZXMgcC4yMCkgaWxsdXN0cmF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uLgorCisKK2hpZ2ggcmVzb2x1dGlvbiB0aW1lciBmdW5jdGlvbmFsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEdXJpbmcgc3lzdGVtIGJvb3QgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyCitmdW5jdGlvbmFsaXR5LCB3aGlsZSBtYWtpbmcgaXQgcG9zc2libGUgd291bGQgYmUgZGlmZmljdWx0IGFuZCB3b3VsZCBzZXJ2ZSBubwordXNlZnVsIGZ1bmN0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsb2NrIGV2ZW50IGRldmljZSBmcmFtZXdvcmssIHRoZQorY2xvY2sgc291cmNlIGZyYW1ld29yayAoR1RPRCkgYW5kIGhydGltZXJzIGl0c2VsZiBoYXMgdG8gYmUgZG9uZSBhbmQKK2FwcHJvcHJpYXRlIGNsb2NrIHNvdXJjZXMgYW5kIGNsb2NrIGV2ZW50IGRldmljZXMgaGF2ZSB0byBiZSByZWdpc3RlcmVkIGJlZm9yZQordGhlIGhpZ2ggcmVzb2x1dGlvbiBmdW5jdGlvbmFsaXR5IGNhbiB3b3JrLiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgaHJ0aW1lcnMgYXJlCitpbml0aWFsaXplZCwgdGhlIHN5c3RlbSB3b3JrcyBpbiB0aGUgdXN1YWwgbG93IHJlc29sdXRpb24gcGVyaW9kaWMgbW9kZS4gVGhlCitjbG9jayBzb3VyY2UgYW5kIHRoZSBjbG9jayBldmVudCBkZXZpY2UgbGF5ZXJzIHByb3ZpZGUgbm90aWZpY2F0aW9uIGZ1bmN0aW9ucword2hpY2ggaW5mb3JtIGhydGltZXJzIGFib3V0IGF2YWlsYWJpbGl0eSBvZiBuZXcgaGFyZHdhcmUuIGhydGltZXJzIHZhbGlkYXRlcwordGhlIHVzYWJpbGl0eSBvZiB0aGUgcmVnaXN0ZXJlZCBjbG9jayBzb3VyY2VzIGFuZCBjbG9jayBldmVudCBkZXZpY2VzIGJlZm9yZQorc3dpdGNoaW5nIHRvIGhpZ2ggcmVzb2x1dGlvbiBtb2RlLiBUaGlzIGVuc3VyZXMgYWxzbyB0aGF0IGEga2VybmVsIHdoaWNoIGlzCitjb25maWd1cmVkIGZvciBoaWdoIHJlc29sdXRpb24gdGltZXJzIGNhbiBydW4gb24gYSBzeXN0ZW0gd2hpY2ggbGFja3MgdGhlCituZWNlc3NhcnkgaGFyZHdhcmUgc3VwcG9ydC4KKworVGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBjb2RlIGRvZXMgbm90IHN1cHBvcnQgU01QIG1hY2hpbmVzIHdoaWNoIGhhdmUgb25seQorZ2xvYmFsIGNsb2NrIGV2ZW50IGRldmljZXMuIFRoZSBzdXBwb3J0IG9mIHN1Y2ggaGFyZHdhcmUgd291bGQgaW52b2x2ZSBJUEkKK2NhbGxzIHdoZW4gYW4gaW50ZXJydXB0IGhhcHBlbnMuIFRoZSBvdmVyaGVhZCB3b3VsZCBiZSBtdWNoIGxhcmdlciB0aGFuIHRoZQorYmVuZWZpdC4gVGhpcyBpcyB0aGUgcmVhc29uIHdoeSB3ZSBjdXJyZW50bHkgZGlzYWJsZSBoaWdoIHJlc29sdXRpb24gYW5kCitkeW5hbWljIHRpY2tzIG9uIGkzODYgU01QIHN5c3RlbXMgd2hpY2ggc3RvcCB0aGUgbG9jYWwgQVBJQyBpbiBDMyBwb3dlcgorc3RhdGUuIEEgd29ya2Fyb3VuZCBpcyBhdmFpbGFibGUgYXMgYW4gaWRlYSwgYnV0IHRoZSBwcm9ibGVtIGhhcyBub3QgYmVlbgordGFja2xlZCB5ZXQuCisKK1RoZSB0aW1lIG9yZGVyZWQgaW5zZXJ0aW9uIG9mIHRpbWVycyBwcm92aWRlcyBhbGwgdGhlIGluZnJhc3RydWN0dXJlIHRvIGRlY2lkZQord2hldGhlciB0aGUgZXZlbnQgZGV2aWNlIGhhcyB0byBiZSByZXByb2dyYW1tZWQgd2hlbiBhIHRpbWVyIGlzIGFkZGVkLiBUaGUKK2RlY2lzaW9uIGlzIG1hZGUgcGVyIHRpbWVyIGJhc2UgYW5kIHN5bmNocm9uaXplZCBhY3Jvc3MgcGVyLWNwdSB0aW1lciBiYXNlcyBpbgorYSBzdXBwb3J0IGZ1bmN0aW9uLiBUaGUgZGVzaWduIGFsbG93cyB0aGUgc3lzdGVtIHRvIHV0aWxpemUgc2VwYXJhdGUgcGVyLUNQVQorY2xvY2sgZXZlbnQgZGV2aWNlcyBmb3IgdGhlIHBlci1DUFUgdGltZXIgYmFzZXMsIGJ1dCBjdXJyZW50bHkgb25seSBvbmUKK3JlcHJvZ3JhbW1hYmxlIGNsb2NrIGV2ZW50IGRldmljZSBwZXItQ1BVIGlzIHV0aWxpemVkLgorCitXaGVuIHRoZSB0aW1lciBpbnRlcnJ1cHQgaGFwcGVucywgdGhlIG5leHQgZXZlbnQgaW50ZXJydXB0IGhhbmRsZXIgaXMgY2FsbGVkCitmcm9tIHRoZSBjbG9jayBldmVudCBkaXN0cmlidXRpb24gY29kZSBhbmQgbW92ZXMgZXhwaXJlZCB0aW1lcnMgZnJvbSB0aGUKK3JlZC1ibGFjayB0cmVlIHRvIGEgc2VwYXJhdGUgZG91YmxlIGxpbmtlZCBsaXN0IGFuZCBpbnZva2VzIHRoZSBzb2Z0aXJxCitoYW5kbGVyLiBBbiBhZGRpdGlvbmFsIG1vZGUgZmllbGQgaW4gdGhlIGhydGltZXIgc3RydWN0dXJlIGFsbG93cyB0aGUgc3lzdGVtIHRvCitleGVjdXRlIGNhbGxiYWNrIGZ1bmN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBuZXh0IGV2ZW50IGludGVycnVwdCBoYW5kbGVyLiBUaGlzCitpcyByZXN0cmljdGVkIHRvIGNvZGUgd2hpY2ggY2FuIHNhZmVseSBiZSBleGVjdXRlZCBpbiB0aGUgaGFyZCBpbnRlcnJ1cHQKK2NvbnRleHQuIFRoaXMgYXBwbGllcywgZm9yIGV4YW1wbGUsIHRvIHRoZSBjb21tb24gY2FzZSBvZiBhIHdha2V1cCBmdW5jdGlvbiBhcwordXNlZCBieSBuYW5vc2xlZXAuIFRoZSBhZHZhbnRhZ2Ugb2YgZXhlY3V0aW5nIHRoZSBoYW5kbGVyIGluIHRoZSBpbnRlcnJ1cHQKK2NvbnRleHQgaXMgdGhlIGF2b2lkYW5jZSBvZiB1cCB0byB0d28gY29udGV4dCBzd2l0Y2hlcyAtIGZyb20gdGhlIGludGVycnVwdGVkCitjb250ZXh0IHRvIHRoZSBzb2Z0aXJxIGFuZCB0byB0aGUgdGFzayB3aGljaCBpcyB3b2tlbiB1cCBieSB0aGUgZXhwaXJlZAordGltZXIuCisKK09uY2UgYSBzeXN0ZW0gaGFzIHN3aXRjaGVkIHRvIGhpZ2ggcmVzb2x1dGlvbiBtb2RlLCB0aGUgcGVyaW9kaWMgdGljayBpcworc3dpdGNoZWQgb2ZmLiBUaGlzIGRpc2FibGVzIHRoZSBwZXIgc3lzdGVtIGdsb2JhbCBwZXJpb2RpYyBjbG9jayBldmVudCBkZXZpY2UgLQorZS5nLiB0aGUgUElUIG9uIGkzODYgU01QIHN5c3RlbXMuCisKK1RoZSBwZXJpb2RpYyB0aWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgYW4gcGVyLWNwdSBocnRpbWVyLiBUaGUgY2FsbGJhY2sKK2Z1bmN0aW9uIGlzIGV4ZWN1dGVkIGluIHRoZSBuZXh0IGV2ZW50IGludGVycnVwdCBjb250ZXh0IGFuZCB1cGRhdGVzIGppZmZpZXMKK2FuZCBjYWxscyB1cGRhdGVfcHJvY2Vzc190aW1lcyBhbmQgcHJvZmlsaW5nLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhydGltZXIKK2Jhc2VkIHBlcmlvZGljIHRpY2sgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgd2l0aCBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0eS4KK1RoaXMgYWxsb3dzIHRvIHVzZSBhIHNpbmdsZSBjbG9jayBldmVudCBkZXZpY2UgdG8gc2NoZWR1bGUgaGlnaCByZXNvbHV0aW9uCit0aW1lciBhbmQgcGVyaW9kaWMgZXZlbnRzIChqaWZmaWVzIHRpY2ssIHByb2ZpbGluZywgcHJvY2VzcyBhY2NvdW50aW5nKSBvbiBVUAorc3lzdGVtcy4gVGhpcyBoYXMgYmVlbiBwcm92ZWQgdG8gd29yayB3aXRoIHRoZSBQSVQgb24gaTM4NiBhbmQgdGhlIEluY3JlbWVudGVyCitvbiBQUEMuCisKK1RoZSBzb2Z0aXJxIGZvciBydW5uaW5nIHRoZSBocnRpbWVyIHF1ZXVlcyBhbmQgZXhlY3V0aW5nIHRoZSBjYWxsYmFja3MgaGFzIGJlZW4KK3NlcGFyYXRlZCBmcm9tIHRoZSB0aWNrIGJvdW5kIHRpbWVyIHNvZnRpcnEgdG8gYWxsb3cgYWNjdXJhdGUgZGVsaXZlcnkgb2YgaGlnaAorcmVzb2x1dGlvbiB0aW1lciBzaWduYWxzIHdoaWNoIGFyZSB1c2VkIGJ5IGl0aW1lciBhbmQgUE9TSVggaW50ZXJ2YWwKK3RpbWVycy4gVGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHNvZnRpcnEgY2FuIHN0aWxsIGJlIGRlbGF5ZWQgYnkgb3RoZXIgc29mdGlycXMsCitidXQgdGhlIG92ZXJhbGwgbGF0ZW5jaWVzIGhhdmUgYmVlbiBzaWduaWZpY2FudGx5IGltcHJvdmVkIGJ5IHRoaXMgc2VwYXJhdGlvbi4KKworRmlndXJlICM1IChPTFMgc2xpZGVzIHAuMjIpIGlsbHVzdHJhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKworCitkeW5hbWljIHRpY2tzCistLS0tLS0tLS0tLS0tCisKK0R5bmFtaWMgdGlja3MgYXJlIHRoZSBsb2dpY2FsIGNvbnNlcXVlbmNlIG9mIHRoZSBocnRpbWVyIGJhc2VkIHBlcmlvZGljIHRpY2sKK3JlcGxhY2VtZW50IChzY2hlZF90aWNrKS4gVGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHNjaGVkX3RpY2sgaHJ0aW1lciBpcworZXh0ZW5kZWQgYnkgdGhyZWUgZnVuY3Rpb25zOgorCistIGhydGltZXJfc3RvcF9zY2hlZF90aWNrCistIGhydGltZXJfcmVzdGFydF9zY2hlZF90aWNrCistIGhydGltZXJfdXBkYXRlX2ppZmZpZXMKKworaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2soKSBpcyBjYWxsZWQgd2hlbiBhIENQVSBnb2VzIGludG8gaWRsZSBzdGF0ZS4gVGhlIGNvZGUKK2V2YWx1YXRlcyB0aGUgbmV4dCBzY2hlZHVsZWQgdGltZXIgZXZlbnQgKGZyb20gYm90aCBocnRpbWVycyBhbmQgdGhlIHRpbWVyCit3aGVlbCkgYW5kIGluIGNhc2UgdGhhdCB0aGUgbmV4dCBldmVudCBpcyBmdXJ0aGVyIGF3YXkgdGhhbiB0aGUgbmV4dCB0aWNrIGl0CityZXByb2dyYW1zIHRoZSBzY2hlZF90aWNrIHRvIHRoaXMgZnV0dXJlIGV2ZW50LCB0byBhbGxvdyBsb25nZXIgaWRsZSBzbGVlcHMKK3dpdGhvdXQgd29ydGhsZXNzIGludGVycnVwdGlvbiBieSB0aGUgcGVyaW9kaWMgdGljay4gVGhlIGZ1bmN0aW9uIGlzIGFsc28KK2NhbGxlZCB3aGVuIGFuIGludGVycnVwdCBoYXBwZW5zIGR1cmluZyB0aGUgaWRsZSBwZXJpb2QsIHdoaWNoIGRvZXMgbm90IGNhdXNlIGEKK3Jlc2NoZWR1bGUuIFRoZSBjYWxsIGlzIG5lY2Vzc2FyeSBhcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWlnaHQgaGF2ZSBhcm1lZCBhCituZXcgdGltZXIgd2hvc2UgZXhwaXJ5IHRpbWUgaXMgYmVmb3JlIHRoZSB0aW1lIHdoaWNoIHdhcyBpZGVudGlmaWVkIGFzIHRoZQorbmVhcmVzdCBldmVudCBpbiB0aGUgcHJldmlvdXMgY2FsbCB0byBocnRpbWVyX3N0b3Bfc2NoZWRfdGljay4KKworaHJ0aW1lcl9yZXN0YXJ0X3NjaGVkX3RpY2soKSBpcyBjYWxsZWQgd2hlbiB0aGUgQ1BVIGxlYXZlcyB0aGUgaWRsZSBzdGF0ZSBiZWZvcmUKK2l0IGNhbGxzIHNjaGVkdWxlKCkuIGhydGltZXJfcmVzdGFydF9zY2hlZF90aWNrKCkgcmVzdW1lcyB0aGUgcGVyaW9kaWMgdGljaywKK3doaWNoIGlzIGtlcHQgYWN0aXZlIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2soKS4KKworaHJ0aW1lcl91cGRhdGVfamlmZmllcygpIGlzIGNhbGxlZCBmcm9tIGlycV9lbnRlcigpIHdoZW4gYW4gaW50ZXJydXB0IGhhcHBlbnMKK2luIHRoZSBpZGxlIHBlcmlvZCB0byBtYWtlIHN1cmUgdGhhdCBqaWZmaWVzIGFyZSB1cCB0byBkYXRlIGFuZCB0aGUgaW50ZXJydXB0CitoYW5kbGVyIGhhcyBub3QgdG8gZGVhbCB3aXRoIGFuIGV2ZW50dWFsbHkgc3RhbGUgamlmZnkgdmFsdWUuCisKK1RoZSBkeW5hbWljIHRpY2sgZmVhdHVyZSBwcm92aWRlcyBzdGF0aXN0aWNhbCB2YWx1ZXMgd2hpY2ggYXJlIGV4cG9ydGVkIHRvCit1c2Vyc3BhY2UgdmlhIC9wcm9jL3N0YXRzIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgZm9yIGVuaGFuY2VkIHBvd2VyCittYW5hZ2VtZW50IGNvbnRyb2wuCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBsZWF2ZXMgcm9vbSBmb3IgZnVydGhlciBkZXZlbG9wbWVudCBsaWtlIGZ1bGwgdGlja2xlc3MKK3N5c3RlbXMsIHdoZXJlIHRoZSB0aW1lIHNsaWNlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHNjaGVkdWxlciwgdmFyaWFibGUKK2ZyZXF1ZW5jeSBwcm9maWxpbmcsIGFuZCBhIGNvbXBsZXRlIHJlbW92YWwgb2YgamlmZmllcyBpbiB0aGUgZnV0dXJlLgorCisKK0FzaWRlIHRoZSBjdXJyZW50IGluaXRpYWwgc3VibWlzc2lvbiBvZiBpMzg2IHN1cHBvcnQsIHRoZSBwYXRjaHNldCBoYXMgYmVlbgorZXh0ZW5kZWQgdG8geDg2XzY0IGFuZCBBUk0gYWxyZWFkeS4gSW5pdGlhbCAod29yayBpbiBwcm9ncmVzcykgc3VwcG9ydCBpcyBhbHNvCithdmFpbGFibGUgZm9yIE1JUFMgYW5kIFBvd2VyUEMuCisKKwkgIFRob21hcywgSW5nbworCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ocnRpbWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2hydGltZXJzL2hydGltZXJzLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9ocnRpbWVycy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHJ0aW1lcnMvaHJ0aW1lcnMudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDIyYjE5OTYuLmFiZDU3NWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC02MDksNiArNjA5LDEwIEBACiAJCQloaWdobWVtIG90aGVyd2lzZS4gVGhpcyBhbHNvIHdvcmtzIHRvIHJlZHVjZSBoaWdobWVtCiAJCQlzaXplIG9uIGJpZ2dlciBib3hlcy4KIAorCWhpZ2hyZXM9CVtLTkxdIEVuYWJsZS9kaXNhYmxlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2RlLgorCQkJVmFsaWQgcGFyYW1ldGVyczogIm9uIiwgIm9mZiIKKwkJCURlZmF1bHQ6ICJvbiIKKwogCWhpc2F4PQkJW0hXLElTRE5dCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5IaVNheC4KIApAQCAtMTA3OCw2ICsxMDgyLDEwIEBACiAJCQlpbiBjZXJ0YWluIGVudmlyb25tZW50cyBzdWNoIGFzIG5ldHdvcmtlZCBzZXJ2ZXJzIG9yCiAJCQlyZWFsLXRpbWUgc3lzdGVtcy4KIAorCW5vaHo9CQlbS05MXSBCb290dGltZSBlbmFibGUvZGlzYWJsZSBkeW5hbWljIHRpY2tzCisJCQlWYWxpZCBhcmd1bWVudHM6IG9uLCBvZmYKKwkJCURlZmF1bHQ6IG9uCisKIAlub2lycWJhbGFuY2UJW0lBLTMyLFNNUCxLTkxdIERpc2FibGUga2VybmVsIGlycSBiYWxhbmNpbmcKIAogCW5vaXJxZGVidWcJW0lBLTMyXSBEaXNhYmxlcyB0aGUgY29kZSB3aGljaCBhdHRlbXB0cyB0byBkZXRlY3QgYW5kCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKaW5kZXggZWMwMWYwOC4uZTEwMTg0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtMTU5LDggKzE1OSw3IEBACiAJaW50IGlycTsKIAogCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspCi0JCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9OT1JFUVVFU1QgfCBJUlFfREVMQVlFRF9ESVNBQkxFIHwKLQkJCUlSUV9OT1BST0JFOworCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyB8PSBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkU7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJYmFkX2lycV9kZXNjLmFmZmluaXR5ID0gQ1BVX01BU0tfQUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCmluZGV4IDQwMDM5YjIuLjI3MDNhNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAkucmVhZAkJPSBpbXhfZ2V0X2N5Y2xlcywKIAkubWFzawkJPSAweEZGRkZGRkZGLAogCS5zaGlmdCAJCT0gMjAsCi0JLmlzX2NvbnRpbnVvdXMgCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbXhfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwppbmRleCAyZWM5YTllLi40NTA2OGMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJLnJlYWQJCT0gaXhwNHh4X2dldF9jeWNsZXMsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0IAkJPSAyMCwKLQkuaXNfY29udGludW91cyAJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHVuc2lnbmVkIGxvbmcgaXhwNHh4X3RpbWVyX2ZyZXEgPSBGUkVROwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKaW5kZXggNTc3M2I1NS4uN2UxMzJmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCkBAIC02Miw3ICs2Miw3IEBACiAJLnJlYWQJCT0gbmV0eF9nZXRfY3ljbGVzLAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAogCS5zaGlmdCAJCT0gMjAsCi0JLmlzX2NvbnRpbnVvdXMgCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCmluZGV4IGVlMmJlYjQuLmZjM2I4MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCS5yZWFkICAgICAgICAgICA9IHB4YV9nZXRfY3ljbGVzLAogCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soMzIpLAogCS5zaGlmdCAgICAgICAgICA9IDIwLAotCS5pc19jb250aW51b3VzICA9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHB4YV90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKaW5kZXggYTJmNzRhZi4uYzEwODMzZiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYwpAQCAtMzcsNyArMzcsNyBAQAogCS5yZWFkCQk9IHJlYWRfY3ljbGVfY291bnQsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0CQk9IDE2LAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCA1OTVmYjc3Li4xZGY0YTFmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTgsNiArMTgsMTggQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBDTE9DS1NPVVJDRV9XQVRDSERPRworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIExPQ0tERVBfU1VQUE9SVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTc0LDYgKzg2LDggQEAKIAogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgogCitzb3VyY2UgImtlcm5lbC90aW1lL0tjb25maWciCisKIGNvbmZpZyBTTVAKIAlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgogCS0tLWhlbHAtLS0KQEAgLTIwNSw3ICsyMTksNyBAQAogCiBjb25maWcgVk1JCiAJYm9vbCAiVk1JIFBhcmF2aXJ0LW9wcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUEFSQVZJUlQKKwlkZXBlbmRzIG9uIFBBUkFWSVJUICYmICFOT19IWgogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFZNSSBwcm92aWRlcyBhIHBhcmF2aXJ0dWFsaXplZCBpbnRlcmZhY2UgdG8gbXVsdGlwbGUgaHlwZXJ2aXNvcnMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCmluZGV4IGNiZTRlNjAuLjRhZTNkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogb2JqLSQoQ09ORklHX1g4Nl9DUFVJRCkJCSs9IGNwdWlkLm8KIG9iai0kKENPTkZJR19NSUNST0NPREUpCQkrPSBtaWNyb2NvZGUubwogb2JqLSQoQ09ORklHX0FQTSkJCSs9IGFwbS5vCi1vYmotJChDT05GSUdfWDg2X1NNUCkJCSs9IHNtcC5vIHNtcGJvb3Qubworb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8gdHNjX3N5bmMubwogb2JqLSQoQ09ORklHX1g4Nl9UUkFNUE9MSU5FKQkrPSB0cmFtcG9saW5lLm8KIG9iai0kKENPTkZJR19YODZfTVBQQVJTRSkJKz0gbXBwYXJzZS5vCiBvYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IGFwaWMubyBubWkubwpAQCAtMzIsNyArMzIsNiBAQAogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubwogb2JqLXkJCQkJKz0gc3lzZW50ZXIubyB2c3lzY2FsbC5vCiBvYmotJChDT05GSUdfQUNQSV9TUkFUKSAJKz0gc3JhdC5vCi1vYmotJChDT05GSUdfSFBFVF9USU1FUikgCSs9IHRpbWVfaHBldC5vCiBvYmotJChDT05GSUdfRUZJKSAJCSs9IGVmaS5vIGVmaV9zdHViLm8KIG9iai0kKENPTkZJR19ET1VCTEVGQVVMVCkgCSs9IGRvdWJsZWZhdWx0Lm8KIG9iai0kKENPTkZJR19WTTg2KQkJKz0gdm04Ni5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCBlOTRhZmY2Li5mYjNlNzIzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaV9wbXRtci5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTYxNSw2ICs2MTYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKyNpbmNsdWRlIDxhc20vaHBldC5oPgogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2hwZXQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKIHsKQEAgLTY0NSwyNCArNjQ3LDExIEBACiAJCWhwZXRfcmVzLT5lbmQgPSAoMSAqIDEwMjQpIC0gMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0Jdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyZXNzLmFkZHJlc3M7Ci0KKwlocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkcmVzcy5hZGRyZXNzOwogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKLQkJaHBldF90YmwtPmlkLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKKwkgICAgICAgaHBldF90YmwtPmlkLCBocGV0X2FkZHJlc3MpOwogCi0JcmVzX3N0YXJ0ID0gdnh0aW1lLmhwZXRfYWRkcmVzczsKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYODYgKi8KLQl7Ci0JCWV4dGVybiB1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKLQotCQlocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkcmVzcy5hZGRyZXNzOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCi0JCQlocGV0X3RibC0+aWQsIGhwZXRfYWRkcmVzcyk7Ci0KLQkJcmVzX3N0YXJ0ID0gaHBldF9hZGRyZXNzOwotCX0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYODYgKi8KKwlyZXNfc3RhcnQgPSBocGV0X2FkZHJlc3M7CiAKIAlpZiAoaHBldF9yZXMpIHsKIAkJaHBldF9yZXMtPnN0YXJ0ID0gcmVzX3N0YXJ0OwpAQCAtNjc2LDEwICs2NjUsNiBAQAogI2RlZmluZQlhY3BpX3BhcnNlX2hwZXQJTlVMTAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi1leHRlcm4gdTMyIHBtdG1yX2lvcG9ydDsKLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2ZhZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwppbmRleCBmNDE1OWUwLi45NjU1YzIzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTQ1LDEyOCArNDcsNTQ5IEBACiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIAogLyoKLSAqIGNwdV9tYXNrIHRoYXQgZGVub3RlcyB0aGUgQ1BVcyB0aGF0IG5lZWRzIHRpbWVyIGludGVycnVwdCBjb21pbmcgaW4gYXMKLSAqIElQSXMgaW4gcGxhY2Ugb2YgbG9jYWwgQVBJQyB0aW1lcnMKKyAqIFNhbml0eSBjaGVjawogICovCi1zdGF0aWMgY3B1bWFza190IHRpbWVyX2JjYXN0X2lwaTsKKyNpZiAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDBGKSAhPSAweDBGCisjIGVycm9yIFNQVVJJT1VTX0FQSUNfVkVDVE9SIGRlZmluaXRpb24gZXJyb3IKKyNlbmRpZgogCiAvKgogICogS25vYiB0byBjb250cm9sIG91ciB3aWxsaW5nbmVzcyB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMuCisgKgorICogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlCiAgKi8KLXN0YXRpYyBpbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworc3RhdGljIGludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsKIAotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2Rpc2FibGUodm9pZCkKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IC0xOwotCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2VuYWJsZSh2b2lkKQotewotCWVuYWJsZV9sb2NhbF9hcGljID0gMTsKLX0KKy8qIExvY2FsIEFQSUMgdGltZXIgdmVyaWZpY2F0aW9uIG9rICovCitzdGF0aWMgaW50IGxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rOwogCiAvKgotICogRGVidWcgbGV2ZWwKKyAqIERlYnVnIGxldmVsLCBleHBvcnRlZCBmb3IgaW9fYXBpYy5jCiAgKi8KIGludCBhcGljX3ZlcmJvc2l0eTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7CiAKK3N0YXRpYyBpbnQgbGFwaWNfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLAorCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9icm9hZGNhc3QoY3B1bWFza190IG1hc2spOwogc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKTsKIAotc3RhdGljIGludCBtb2Rlcm5fYXBpYyh2b2lkKQorLyoKKyAqIFRoZSBsb2NhbCBhcGljIHRpbWVyIGNhbiBiZSB1c2VkIGZvciBhbnkgZnVuY3Rpb24gd2hpY2ggaXMgQ1BVIGxvY2FsLgorICovCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBsYXBpY19jbG9ja2V2ZW50ID0geworCS5uYW1lCQk9ICJsYXBpYyIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCisJCQl8IENMT0NLX0VWVF9GRUFUX0MzU1RPUCB8IENMT0NLX0VWVF9GRUFUX0RVTU1ZLAorCS5zaGlmdAkJPSAzMiwKKwkuc2V0X21vZGUJPSBsYXBpY190aW1lcl9zZXR1cCwKKwkuc2V0X25leHRfZXZlbnQJPSBsYXBpY19uZXh0X2V2ZW50LAorCS5icm9hZGNhc3QJPSBsYXBpY190aW1lcl9icm9hZGNhc3QsCisJLnJhdGluZwkJPSAxMDAsCisJLmlycQkJPSAtMSwKK307CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbGFwaWNfZXZlbnRzKTsKKworLyogTG9jYWwgQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCAqLworc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKKworLyoKKyAqIEdldCB0aGUgTEFQSUMgdmVyc2lvbgorICovCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19nZXRfdmVyc2lvbih2b2lkKQogewotCXVuc2lnbmVkIGludCBsdnIsIHZlcnNpb247Ci0JLyogQU1EIHN5c3RlbXMgdXNlIG9sZCBBUElDIHZlcnNpb25zLCBzbyBjaGVjayB0aGUgQ1BVICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgotCQlib290X2NwdV9kYXRhLng4NiA+PSAweGYpCi0JCXJldHVybiAxOwotCWx2ciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04obHZyKTsKLQlyZXR1cm4gdmVyc2lvbiA+PSAweDE0OworCXJldHVybiBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogfQogCiAvKgotICogJ3doYXQgc2hvdWxkIHdlIGRvIGlmIHdlIGdldCBhIGh3IGlycSBldmVudCBvbiBhbiBpbGxlZ2FsIHZlY3RvcicuCi0gKiBlYWNoIGFyY2hpdGVjdHVyZSBoYXMgdG8gYW5zd2VyIHRoaXMgdGhlbXNlbHZlcy4KKyAqIENoZWNrLCBpZiB0aGUgQVBJQyBpcyBpbnRlZ3JhdGVkIG9yIGEgc2VwZXJhdGUgY2hpcAogICovCi12b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19pc19pbnRlZ3JhdGVkKHZvaWQpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotCS8qCi0JICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCi0JICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgotCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKLQkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQotCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCi0JICogY29tcGxldGVseS4KLQkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSwotCSAqLwotCWlmIChjcHVfaGFzX2FwaWMpCi0JCWFja19BUElDX2lycSgpOworCXJldHVybiBBUElDX0lOVEVHUkFURUQobGFwaWNfZ2V0X3ZlcnNpb24oKSk7CiB9CiAKLXZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCisvKgorICogQ2hlY2ssIHdoZXRoZXIgdGhpcyBpcyBhIG1vZGVybiBvciBhIGZpcnN0IGdlbmVyYXRpb24gQVBJQworICovCitzdGF0aWMgaW50IG1vZGVybl9hcGljKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXNtcF9pbnRyX2luaXQoKTsKLSNlbmRpZgotCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLwotCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7Ci0KLQkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7Ci0Jc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCi0Jc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7Ci0jZW5kaWYKKwkvKiBBTUQgc3lzdGVtcyB1c2Ugb2xkIEFQSUMgdmVyc2lvbnMsIHNvIGNoZWNrIHRoZSBDUFUgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2ID49IDB4ZikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGxhcGljX2dldF92ZXJzaW9uKCkgPj0gMHgxNDsKIH0KIAotLyogVXNpbmcgQVBJQyB0byBnZW5lcmF0ZSBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0PyAqLwotaW50IHVzaW5nX2FwaWNfdGltZXIgX19yZWFkX21vc3RseSA9IDA7Ci0KLXN0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7Ci0KKy8qKgorICogZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgLSBlbmFibGUgTk1JIHRocm91Z2ggbG9jYWwgdmVjdG9yIHRhYmxlIDAKKyAqLwogdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQogewotCXVuc2lnbmVkIGludCB2LCB2ZXI7CisJdW5zaWduZWQgaW50IHYgPSBBUElDX0RNX05NSTsKIAotCXZlciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2ZXIpOwotCXYgPSBBUElDX0RNX05NSTsJCQkvKiB1bm1hc2sgYW5kIHNldCB0byBOTUkgKi8KLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCS8qIExldmVsIHRyaWdnZXJlZCBmb3IgODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQogCQl2IHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2KTsKIH0KIAorLyoqCisgKiBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0IC0gR2V0IG51bWJlciBvZiBwaHlzaWNhbCBicm9hZGNhc3QgSURzCisgKi8KIGludCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KHZvaWQpCiB7Ci0JaWYgKG1vZGVybl9hcGljKCkpCi0JCXJldHVybiAweGZmOwotCWVsc2UKLQkJcmV0dXJuIDB4ZjsKKwlyZXR1cm4gbW9kZXJuX2FwaWMoKSA/IDB4ZmYgOiAweGY7CiB9CiAKLWludCBnZXRfbWF4bHZ0KHZvaWQpCisvKioKKyAqIGxhcGljX2dldF9tYXhsdnQgLSBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZlY3RvciB0YWJsZSBlbnRyaWVzCisgKi8KK2ludCBsYXBpY19nZXRfbWF4bHZ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGludCB2ID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKIAotCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7CiAJLyogODI0ODlEWHMgZG8gbm90IHJlcG9ydCAjIG9mIExWVCBlbnRyaWVzLiAqLwotCW1heGx2dCA9IEFQSUNfSU5URUdSQVRFRCh2ZXIpID8gR0VUX0FQSUNfTUFYTFZUKHYpIDogMjsKLQlyZXR1cm4gbWF4bHZ0OworCXJldHVybiBBUElDX0lOVEVHUkFURUQoR0VUX0FQSUNfVkVSU0lPTih2KSkgPyBHRVRfQVBJQ19NQVhMVlQodikgOiAyOwogfQogCisvKgorICogTG9jYWwgQVBJQyB0aW1lcgorICovCisKKy8qIENsb2NrIGRpdmlzb3IgaXMgc2V0IHRvIDE2ICovCisjZGVmaW5lIEFQSUNfRElWSVNPUiAxNgorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyLCB3aXRoIGEgdGltZW91dCBvZgorICogJ2Nsb2NrcycgQVBJQyBidXMgY2xvY2suIER1cmluZyBjYWxpYnJhdGlvbiB3ZSBhY3R1YWxseSBjYWxsCisgKiB0aGlzIGZ1bmN0aW9uIHR3aWNlIG9uIHRoZSBib290IENQVSwgb25jZSB3aXRoIGEgYm9ndXMgdGltZW91dAorICogdmFsdWUsIHNlY29uZCB0aW1lIGZvciByZWFsLiBUaGUgb3RoZXIgKG5vbmNhbGlicmF0aW5nKSBDUFVzCisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gb25seSBvbmNlLCB3aXRoIHRoZSByZWFsLCBjYWxpYnJhdGVkIHZhbHVlLgorICoKKyAqIFdlIGRvIHJlYWRzIGJlZm9yZSB3cml0ZXMgZXZlbiBpZiB1bm5lY2Vzc2FyeSwgdG8gZ2V0IGFyb3VuZCB0aGUKKyAqIFA1IEFQSUMgZG91YmxlIHdyaXRlIGJ1Zy4KKyAqLworc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcywgaW50IG9uZXNob3QsIGludCBpcnFlbikKK3sKKwl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlOworCisJbHZ0dF92YWx1ZSA9IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKKwlpZiAoIW9uZXNob3QpCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUM7CisJaWYgKCFsYXBpY19pc19pbnRlZ3JhdGVkKCkpCisJCWx2dHRfdmFsdWUgfD0gU0VUX0FQSUNfVElNRVJfQkFTRShBUElDX1RJTUVSX0JBU0VfRElWKTsKKworCWlmICghaXJxZW4pCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfTUFTS0VEOworCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCS8qCisJICogRGl2aWRlIFBJQ0xLIGJ5IDE2CisJICovCisJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19URENSLCAodG1wX3ZhbHVlCisJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCisJCQkJfCBBUElDX1REUl9ESVZfMTYpOworCisJaWYgKCFvbmVzaG90KQorCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKK30KKworLyoKKyAqIFByb2dyYW0gdGhlIG5leHQgZXZlbnQsIHJlbGF0aXZlIHRvIG5vdworICovCitzdGF0aWMgaW50IGxhcGljX25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgZGVsdGEpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0dXAgdGhlIGxhcGljIHRpbWVyIGluIHBlcmlvZGljIG9yIG9uZXNob3QgbW9kZQorICovCitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2OworCisJLyogTGFwaWMgdXNlZCBmb3IgYnJvYWRjYXN0ID8gKi8KKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJX19zZXR1cF9BUElDX0xWVFQoY2FsaWJyYXRpb25fcmVzdWx0LAorCQkJCSAgbW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywgMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJdiB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2KTsKKwkJYnJlYWs7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogTG9jYWwgQVBJQyB0aW1lciBicm9hZGNhc3QgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgbGFwaWNfdGltZXJfYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7CisjZW5kaWYKK30KKworLyoKKyAqIFNldHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyIGZvciB0aGlzIENQVS4gQ29weSB0aGUgaW5pdGlsaXplZCB2YWx1ZXMKKyAqIG9mIHRoZSBib290IENQVSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IGluIHRoZSBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXR1cF9BUElDX3RpbWVyKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbGV2dCA9ICZfX2dldF9jcHVfdmFyKGxhcGljX2V2ZW50cyk7CisKKwltZW1jcHkobGV2dCwgJmxhcGljX2Nsb2NrZXZlbnQsIHNpemVvZigqbGV2dCkpOworCWxldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGxldnQpOworfQorCisvKgorICogSW4gdGhpcyBmdW5jdGlvbnMgd2UgY2FsaWJyYXRlIEFQSUMgYnVzIGNsb2NrcyB0byB0aGUgZXh0ZXJuYWwgdGltZXIuCisgKgorICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlIHdhbnQgdG8gaGF2ZSBsb2NhbCB0aW1lcgorICogaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZCBieSB0aGUgc2FtZSBBUElDIGJ1cyBoYXZlIHRoZSB2ZXJ5IHNhbWUgYnVzCisgKiBmcmVxdWVuY3kuCisgKgorICogVGhpcyB3YXMgcHJldmlvdXNseSBkb25lIGJ5IHJlYWRpbmcgdGhlIFBJVC9IUEVUIGFuZCB3YWl0aW5nIGZvciBhIHdyYXAKKyAqIGFyb3VuZCB0byBmaW5kIG91dCwgdGhhdCBhIHRpY2sgaGFzIGVsYXBzZWQuIEkgaGF2ZSBhIGJveCwgd2hlcmUgdGhlIFBJVAorICogcmVhZG91dCBpcyBicm9rZW4sIHNvIGl0IG5ldmVyIGdldHMgb3V0IG9mIHRoZSB3YWl0IGxvb3AgYWdhaW4uIFRoaXMgd2FzCisgKiBhbHNvIHJlcG9ydGVkIGJ5IG90aGVycy4KKyAqCisgKiBNb25pdG9yaW5nIHRoZSBqaWZmaWVzIHZhbHVlIGlzIGluYWNjdXJhdGUgYW5kIHRoZSBjbG9ja2V2ZW50cworICogaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIHVzIHRvIGRvIGEgc2ltcGxlIHN1YnN0aXR1dGlvbiBvZiB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLgorICoKKyAqIFRoZSBjYWxpYnJhdGlvbiByb3V0aW5lIGFsc28gdXNlcyB0aGUgcG1fdGltZXIgd2hlbiBwb3NzaWJsZSwgYXMgdGhlIFBJVAorICogaGFwcGVucyB0byBydW4gd2F5IHRvbyBzbG93IChmYWN0b3IgMi4zIG9uIG15IFZBSU8gQ29yZUR1bywgd2hpY2ggZ29lcworICogYmFjayB0byBub3JtYWwgbGF0ZXIgaW4gdGhlIGJvb3QgcHJvY2VzcykuCisgKi8KKworI2RlZmluZSBMQVBJQ19DQUxfTE9PUFMJCShIWi8xMCkKKworc3RhdGljIF9faW5pdGRhdGEgdm9sYXRpbGUgaW50IGxhcGljX2NhbF9sb29wcyA9IC0xOworc3RhdGljIF9faW5pdGRhdGEgbG9uZyBsYXBpY19jYWxfdDEsIGxhcGljX2NhbF90MjsKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgbG9uZyBsYXBpY19jYWxfdHNjMSwgbGFwaWNfY2FsX3RzYzI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9wbTEsIGxhcGljX2NhbF9wbTI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9qMSwgbGFwaWNfY2FsX2oyOworCisvKgorICogVGVtcG9yYXJ5IGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbGFwaWNfY2FsX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2MgPSAwOworCWxvbmcgdGFwaWMgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJdW5zaWduZWQgbG9uZyBwbSA9IGFjcGlfcG1fcmVhZF9lYXJseSgpOworCisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHRzYyk7CisKKwlzd2l0Y2ggKGxhcGljX2NhbF9sb29wcysrKSB7CisJY2FzZSAwOgorCQlsYXBpY19jYWxfdDEgPSB0YXBpYzsKKwkJbGFwaWNfY2FsX3RzYzEgPSB0c2M7CisJCWxhcGljX2NhbF9wbTEgPSBwbTsKKwkJbGFwaWNfY2FsX2oxID0gamlmZmllczsKKwkJYnJlYWs7CisKKwljYXNlIExBUElDX0NBTF9MT09QUzoKKwkJbGFwaWNfY2FsX3QyID0gdGFwaWM7CisJCWxhcGljX2NhbF90c2MyID0gdHNjOworCQlpZiAocG0gPCBsYXBpY19jYWxfcG0xKQorCQkJcG0gKz0gQUNQSV9QTV9PVlJSVU47CisJCWxhcGljX2NhbF9wbTIgPSBwbTsKKwkJbGFwaWNfY2FsX2oyID0gamlmZmllczsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2V0dXAgdGhlIGJvb3QgQVBJQworICoKKyAqIENhbGlicmF0ZSBhbmQgdmVyaWZ5IHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmxldnQgPSAmX19nZXRfY3B1X3ZhcihsYXBpY19ldmVudHMpOworCWNvbnN0IGxvbmcgcG1fMTAwbXMgPSBQTVRNUl9USUNLU19QRVJfU0VDLzEwOworCWNvbnN0IGxvbmcgcG1fdGhyZXNoID0gcG1fMTAwbXMvMTAwOworCXZvaWQgKCpyZWFsX2hhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisJdW5zaWduZWQgbG9uZyBkZWx0YWo7CisJbG9uZyBkZWx0YSwgZGVsdGFwbTsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy5cbiIKKwkJICAgICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVwbGFjZSB0aGUgZ2xvYmFsIGludGVycnVwdCBoYW5kbGVyICovCisJcmVhbF9oYW5kbGVyID0gZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyOworCWdsb2JhbF9jbG9ja19ldmVudC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCisJLyoKKwkgKiBTZXR1cCB0aGUgQVBJQyBjb3VudGVyIHRvIDFlOS4gVGhlcmUgaXMgbm8gd2F5IHRoZSBsYXBpYworCSAqIGNhbiB1bmRlcmZsb3cgaW4gdGhlIDEwMG1zIGRldGVjdGlvbiB0aW1lIGZyYW1lCisJICovCisJX19zZXR1cF9BUElDX0xWVFQoMTAwMDAwMDAwMCwgMCwgMCk7CisKKwkvKiBMZXQgdGhlIGludGVycnVwdHMgcnVuICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUobGFwaWNfY2FsX2xvb3BzIDw9IExBUElDX0NBTF9MT09QUyk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVzdG9yZSB0aGUgcmVhbCBldmVudCBoYW5kbGVyICovCisJZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyID0gcmVhbF9oYW5kbGVyOworCisJLyogQnVpbGQgZGVsdGEgdDEtdDIgYXMgYXBpYyB0aW1lciBjb3VudHMgZG93biAqLworCWRlbHRhID0gbGFwaWNfY2FsX3QxIC0gbGFwaWNfY2FsX3QyOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBsYXBpYyBkZWx0YSA9ICVsZFxuIiwgZGVsdGEpOworCisJLyogQ2hlY2ssIGlmIHRoZSBQTSB0aW1lciBpcyBhdmFpbGFibGUgKi8KKwlkZWx0YXBtID0gbGFwaWNfY2FsX3BtMiAtIGxhcGljX2NhbF9wbTE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIGRlbHRhID0gJWxkXG4iLCBkZWx0YXBtKTsKKworCWlmIChkZWx0YXBtKSB7CisJCXVuc2lnbmVkIGxvbmcgbXVsdDsKKwkJdTY0IHJlczsKKworCQltdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChQTVRNUl9USUNLU19QRVJfU0VDLCAyMik7CisKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAoKCh1NjQpIGRlbHRhcG0pICogIG11bHQpID4+IDIyOworCQkJZG9fZGl2KHJlcywgMTAwMDAwMCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBUElDIGNhbGlicmF0aW9uIG5vdCBjb25zaXN0ZW50ICIKKwkJCSAgICAgICAid2l0aCBQTSBUaW1lcjogJWxkbXMgaW5zdGVhZCBvZiAxMDBtc1xuIiwKKwkJCSAgICAgICAobG9uZylyZXMpOworCQkJLyogQ29ycmVjdCB0aGUgbGFwaWMgY291bnRlciB2YWx1ZSAqLworCQkJcmVzID0gKCgodTY0KSBkZWx0YSApICogcG1fMTAwbXMpOworCQkJZG9fZGl2KHJlcywgZGVsdGFwbSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJBUElDIGRlbHRhIGFkanVzdGVkIHRvIFBNLVRpbWVyOiAiCisJCQkgICAgICAgIiVsdSAoJWxkKVxuIiwgKHVuc2lnbmVkIGxvbmcpIHJlcywgZGVsdGEpOworCQkJZGVsdGEgPSAobG9uZykgcmVzOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBzY2FsZWQgbWF0aCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KKwlsYXBpY19jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoZGVsdGEsIFRJQ0tfTlNFQyAqIExBUElDX0NBTF9MT09QUywgMzIpOworCWxhcGljX2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRiwgJmxhcGljX2Nsb2NrZXZlbnQpOworCWxhcGljX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweEYsICZsYXBpY19jbG9ja2V2ZW50KTsKKworCWNhbGlicmF0aW9uX3Jlc3VsdCA9IChkZWx0YSAqIEFQSUNfRElWSVNPUikgLyBMQVBJQ19DQUxfTE9PUFM7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBkZWx0YSAlbGRcbiIsIGRlbHRhKTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBtdWx0OiAlbGRcbiIsIGxhcGljX2Nsb2NrZXZlbnQubXVsdCk7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gY2FsaWJyYXRpb24gcmVzdWx0OiAldVxuIiwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCk7CisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJZGVsdGEgPSAobG9uZykobGFwaWNfY2FsX3RzYzIgLSBsYXBpY19jYWxfdHNjMSk7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIENQVSBjbG9jayBzcGVlZCBpcyAiCisJCQkgICAgIiVsZC4lMDRsZCBNSHouXG4iLAorCQkJICAgIChkZWx0YSAvIExBUElDX0NBTF9MT09QUykgLyAoMTAwMDAwMCAvIEhaKSwKKwkJCSAgICAoZGVsdGEgLyBMQVBJQ19DQUxfTE9PUFMpICUgKDEwMDAwMDAgLyBIWikpOworCX0KKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzICIKKwkJICAgICIldS4lMDR1IE1Iei5cbiIsCisJCSAgICBjYWxpYnJhdGlvbl9yZXN1bHQgLyAoMTAwMDAwMCAvIEhaKSwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCAlICgxMDAwMDAwIC8gSFopKTsKKworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIHZlcmlmeSBBUElDIHRpbWVyXG4iKTsKKworCS8qCisJICogU2V0dXAgdGhlIGFwaWMgdGltZXIgbWFudWFsbHkKKwkgKi8KKwlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJbGV2dC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1BFUklPRElDLCBsZXZ0KTsKKwlsYXBpY19jYWxfbG9vcHMgPSAtMTsKKworCS8qIExldCB0aGUgaW50ZXJydXB0cyBydW4gKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwl3aGlsZShsYXBpY19jYWxfbG9vcHMgPD0gTEFQSUNfQ0FMX0xPT1BTKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBTdG9wIHRoZSBsYXBpYyB0aW1lciAqLworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1NIVVRET1dOLCBsZXZ0KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIEppZmZpZXMgZGVsdGEgKi8KKwlkZWx0YWogPSBsYXBpY19jYWxfajIgLSBsYXBpY19jYWxfajE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIGppZmZpZXMgZGVsdGEgPSAlbHVcbiIsIGRlbHRhaik7CisKKwkvKiBDaGVjaywgaWYgdGhlIFBNIHRpbWVyIGlzIGF2YWlsYWJsZSAqLworCWRlbHRhcG0gPSBsYXBpY19jYWxfcG0yIC0gbGFwaWNfY2FsX3BtMTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4gUE0gdGltZXIgZGVsdGEgPSAlbGRcbiIsIGRlbHRhcG0pOworCisJbG9jYWxfYXBpY190aW1lcl92ZXJpZnlfb2sgPSAwOworCisJaWYgKGRlbHRhcG0pIHsKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCQkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgcmVzdWx0IGlzIGNvbnNpc3RlbnQgKi8KKwkJCWlmIChkZWx0YWogPCBMQVBJQ19DQUxfTE9PUFMtMiB8fAorCQkJICAgIGRlbHRhaiA+IExBUElDX0NBTF9MT09QUysyKSB7CisJCQkJLyoKKwkJCQkgKiBOb3Qgc3VyZSwgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgdGhpcyBvbmUuCisJCQkJICogV2hlbiBoaWdoIHJlc3VsdGlvbiB0aW1lcnMgYXJlIGFjdGl2ZQorCQkJCSAqIGFuZCB0aGUgbGFwaWMgdGltZXIgZG9lcyBub3Qgc3RvcCBpbiBDMworCQkJCSAqIHdlIGFyZSBmaW5lLiBPdGhlcndpc2UgbW9yZSB0cm91YmxlIG1pZ2h0CisJCQkJICogYmUgd2FpdGluZy4gLS0gdGdseAorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdsb2JhbCBldmVudCBkZXZpY2UgJXMgIgorCQkJCSAgICAgICAiaGFzIHdyb25nIGZyZXF1ZW5jeSAiCisJCQkJICAgICAgICIoJWx1IHRpY2tzIGluc3RlYWQgb2YgJWQpXG4iLAorCQkJCSAgICAgICBnbG9iYWxfY2xvY2tfZXZlbnQtPm5hbWUsIGRlbHRhaiwKKwkJCQkgICAgICAgTEFQSUNfQ0FMX0xPT1BTKTsKKwkJCX0KKwkJCWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENoZWNrLCBpZiB0aGUgamlmZmllcyByZXN1bHQgaXMgY29uc2lzdGVudCAqLworCQlpZiAoZGVsdGFqID49IExBUElDX0NBTF9MT09QUy0yICYmCisJCSAgICBkZWx0YWogPD0gTEFQSUNfQ0FMX0xPT1BTKzIpIHsKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBqaWZmaWVzIHJlc3VsdCBva1xuIik7CisJCQlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZS5cbiIpOworCQkvKiBObyBicm9hZGNhc3Qgb24gVVAgISAqLworCQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA9PSAxKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQlsYXBpY19jbG9ja2V2ZW50LmZlYXR1cmVzICY9IH5DTE9DS19FVlRfRkVBVF9EVU1NWTsKKworCS8qIFNldHVwIHRoZSBsYXBpYyBvciByZXF1ZXN0IHRoZSBicm9hZGNhc3QgKi8KKwlzZXR1cF9BUElDX3RpbWVyKCk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKHZvaWQpCit7CisJc2V0dXBfQVBJQ190aW1lcigpOworfQorCisvKgorICogVGhlIGd1dHMgb2YgdGhlIGFwaWMgdGltZXIgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIGxvY2FsX2FwaWNfdGltZXJfaW50ZXJydXB0KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmcGVyX2NwdShsYXBpY19ldmVudHMsIGNwdSk7CisKKwkvKgorCSAqIE5vcm1hbGx5IHdlIHNob3VsZCBub3QgYmUgaGVyZSB0aWxsIExBUElDIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ1dAorCSAqIGluIHNvbWUgY2FzZXMgbGlrZSBrZHVtcCwgaXRzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYSBwZW5kaW5nIExBUElDCisJICogdGltZXIgaW50ZXJydXB0IGZyb20gcHJldmlvdXMga2VybmVsJ3MgY29udGV4dCBhbmQgaXMgZGVsaXZlcmVkIGluCisJICogbmV3IGtlcm5lbCB0aGUgbW9tZW50IGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisJICoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGVhcmx5IGFuZCBMQVBJQyBpcyBzZXR1cCBtdWNoIGxhdGVyLCBoZW5jZQorCSAqIGl0cyBwb3NzaWJsZSB0aGF0IHdoZW4gd2UgZ2V0IGhlcmUgZXZ0LT5ldmVudF9oYW5kbGVyIGlzIE5VTEwuCisJICogQ2hlY2sgZm9yIGV2ZW50X2hhbmRsZXIgYmVpbmcgTlVMTCBhbmQgZGlzY2FyZCB0aGUgaW50ZXJydXB0IGFzCisJICogc3B1cmlvdXMuCisJICovCisJaWYgKCFldnQtPmV2ZW50X2hhbmRsZXIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwdXJpb3VzIExBUElDIHRpbWVyIGludGVycnVwdCBvbiBjcHUgJWRcbiIsIGNwdSk7CisJCS8qIFN3aXRjaCBpdCBvZmYgKi8KKwkJbGFwaWNfdGltZXJfc2V0dXAoQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sIGV2dCk7CisJCXJldHVybjsKKwl9CisKKwlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Cit9CisKKy8qCisgKiBMb2NhbCBBUElDIHRpbWVyIGludGVycnVwdC4gVGhpcyBpcyB0aGUgbW9zdCBuYXR1cmFsIHdheSBmb3IgZG9pbmcKKyAqIGxvY2FsIGludGVycnVwdHMsIGJ1dCBsb2NhbCB0aW1lciBpbnRlcnJ1cHRzIGNhbiBiZSBlbXVsYXRlZCBieQorICogYnJvYWRjYXN0IGludGVycnVwdHMgdG9vLiBbaW4gY2FzZSB0aGUgaHcgZG9lc24ndCBzdXBwb3J0IEFQSUMgdGltZXJzXQorICoKKyAqIFsgaWYgYSBzaW5nbGUtQ1BVIHN5c3RlbSBydW5zIGFuIFNNUCBrZXJuZWwgdGhlbiB3ZSBjYWxsIHRoZSBsb2NhbAorICogICBpbnRlcnJ1cHQgYXMgd2VsbC4gVGh1cyB3ZSBjYW5ub3QgaW5saW5lIHRoZSBsb2NhbCBpcnEgLi4uIF0KKyAqLworCit2b2lkIGZhc3RjYWxsIHNtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisKKwkvKgorCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAorCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCisJICovCisJYWNrX0FQSUNfaXJxKCk7CisJLyoKKwkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgorCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKKwkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KKwkgKi8KKwlleGl0X2lkbGUoKTsKKwlpcnFfZW50ZXIoKTsKKwlsb2NhbF9hcGljX3RpbWVyX2ludGVycnVwdCgpOworCWlycV9leGl0KCk7CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCitpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogTG9jYWwgQVBJQyBzdGFydCBhbmQgc2h1dGRvd24KKyAqLworCisvKioKKyAqIGNsZWFyX2xvY2FsX0FQSUMgLSBzaHV0ZG93biB0aGUgbG9jYWwgQVBJQworICoKKyAqIFRoaXMgaXMgY2FsbGVkLCB3aGVuIGEgQ1BVIGlzIGRpc2FibGVkIGFuZCBiZWZvcmUgcmVib290aW5nLCBzbyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBsb2NhbCBBUElDIGhhcyBubyBkYW5nbGluZyBsZWZ0b3ZlcnMuIEFsc28gdXNlZCB0byBjbGVhbm91dCBhbnkgQklPUworICogbGVmdG92ZXJzIGR1cmluZyBib290LgorICovCiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCkKIHsKLQlpbnQgbWF4bHZ0OworCWludCBtYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAJdW5zaWduZWQgbG9uZyB2OwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOwotCiAJLyoKIAkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKIAkgKiBpZiB0aGUgdmVjdG9yIGlzIHplcm8uIE1hc2sgTFZURVJSIGZpcnN0IHRvIHByZXZlbnQgdGhpcy4KQEAgLTE5MCw3ICs2MTMsNyBAQAogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFBDLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiAKLS8qIGxldHMgbm90IHRvdWNoIHRoaXMgaWYgd2UgZGlkbid0IGZyb2IgaXQgKi8KKwkvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCiAJaWYgKG1heGx2dCA+PSA1KSB7CiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKQEAgLTIxMiw4NSArNjM1LDE4IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFRITVIsIEFQSUNfTFZUX01BU0tFRCk7CiAjZW5kaWYKLQl2ID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKLQlpZiAoQVBJQ19JTlRFR1JBVEVEKHYpKSB7CS8qICE4MjQ4OURYICovCi0JCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIFBlbnRpdW0gZXJyYXRhIDNBUCBhbmQgMTFBUC4gKi8KKwkvKiBJbnRlZ3JhdGVkIEFQSUMgKCE4MjQ4OURYKSA/ICovCisJaWYgKGxhcGljX2lzX2ludGVncmF0ZWQoKSkgeworCQlpZiAobWF4bHZ0ID4gMykKKwkJCS8qIENsZWFyIEVTUiBkdWUgdG8gUGVudGl1bSBlcnJhdGEgM0FQIGFuZCAxMUFQICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAl9CiB9CiAKLXZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KLQkJICovCi0JCWNsZWFyX2xvY2FsX0FQSUMoKTsKLQkJLyoKLQkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KLQkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgIgotCQkJCSJlbmFibGluZyBBUElDIG1vZGUuXG4iKTsKLQkJb3V0YigweDcwLCAweDIyKTsKLQkJb3V0YigweDAxLCAweDIzKTsKLQl9Ci0JZW5hYmxlX2FwaWNfbW9kZSgpOwotfQotCi12b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMoaW50IHZpcnRfd2lyZV9zZXR1cCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKLQkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQwotCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKLQkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgotCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOwotCQlvdXRiKDB4NzAsIDB4MjIpOwotCQlvdXRiKDB4MDAsIDB4MjMpOwotCX0KLQllbHNlIHsKLQkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCi0JCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCi0JCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7Ci0JCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwotCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwotCQl2YWx1ZSB8PSAweGY7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOwotCi0JCWlmICghdmlydF93aXJlX3NldHVwKSB7Ci0JCQkvKiBGb3IgTFZUMCBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgZXh0ZXJuYWwgYW5kIGVuYWJsZWQgKi8KLQkJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7Ci0JCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJCUFQSUNfSU5QVVRfUE9MQVJJVFkgfCBBUElDX0xWVF9SRU1PVEVfSVJSIHwKLQkJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEICk7Ci0JCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7Ci0JCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9FWFRJTlQpOwotCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBEaXNhYmxlIExWVDAgKi8KLQkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKLQkJfQotCi0JCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KLQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQkJdmFsdWUgJj0gfigKLQkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAotCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7Ci0JCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKLQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7Ci0JfQotfQotCisvKioKKyAqIGRpc2FibGVfbG9jYWxfQVBJQyAtIGNsZWFyIGFuZCBkaXNhYmxlIHRoZSBsb2NhbCBBUElDCisgKi8KIHZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKQEAgLTMwNSw4ICs2NjEsMTMgQEAKIAl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKIAorCS8qCisJICogV2hlbiBMQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCwKKwkgKiByZXN0b3JlIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKwkgKi8KIAlpZiAoZW5hYmxlZF92aWFfYXBpY2Jhc2UpIHsKIAkJdW5zaWduZWQgaW50IGwsIGg7CisKIAkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwogCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CiAJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKQEAgLTMxNCw2ICs2NzUsMjggQEAKIH0KIAogLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdCBkaXNhYmxlIGl0IGRvd24gYmVmb3JlCisgKiByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4gIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZAorICogbm90IHBvd2VyLW9mZi4gIEFkZGl0aW9uYWxseSBjbGVhciBhbGwgTFZUIGVudHJpZXMgYmVmb3JlIGRpc2FibGVfbG9jYWxfQVBJQworICogZm9yIHRoZSBjYXNlIHdoZXJlIExpbnV4IGRpZG4ndCBlbmFibGUgdGhlIExBUElDLgorICovCit2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY3B1X2hhc19hcGljKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfbG9jYWxfQVBJQygpOworCisJaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKICAqIFRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2UncmUgbG9va2luZyBhdCBhIHJlYWwgbG9jYWwgQVBJQy4KICAqIENoZWNrIHRoZXNlIGFnYWluc3QgeW91ciBib2FyZCBpZiB0aGUgQ1BVcyBhcmVuJ3QgZ2V0dGluZwogICogc3RhcnRlZCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgpAQCAtMzQ1LDcgKzcyOCw3IEBACiAJcmVnMSA9IEdFVF9BUElDX1ZFUlNJT04ocmVnMCk7CiAJaWYgKHJlZzEgPT0gMHgwMCB8fCByZWcxID09IDB4ZmYpCiAJCXJldHVybiAwOwotCXJlZzEgPSBnZXRfbWF4bHZ0KCk7CisJcmVnMSA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAlpZiAocmVnMSA8IDB4MDIgfHwgcmVnMSA9PSAweGZmKQogCQlyZXR1cm4gMDsKIApAQCAtMzY4LDEwICs3NTEsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyoqCisgKiBzeW5jX0FyYl9JRHMgLSBzeW5jaHJvbml6ZSBBUElDIGJ1cyBhcmJpdHJhdGlvbiBJRHMKKyAqLwogdm9pZCBfX2luaXQgc3luY19BcmJfSURzKHZvaWQpCiB7Ci0JLyogVW5zdXBwb3J0ZWQgb24gUDQgLSBzZWUgSW50ZWwgRGV2LiBNYW51YWwgVm9sLiAzLCBDaC4gOC42LjEKLQkgICBBbmQgbm90IG5lZWRlZCBvbiBBTUQgKi8KKwkvKgorCSAqIFVuc3VwcG9ydGVkIG9uIFA0IC0gc2VlIEludGVsIERldi4gTWFudWFsIFZvbC4gMywgQ2guIDguNi4xIEFuZCBub3QKKwkgKiBuZWVkZWQgb24gQU1ELgorCSAqLwogCWlmIChtb2Rlcm5fYXBpYygpKQogCQlyZXR1cm47CiAJLyoKQEAgLTM4NCwxNCArNzcyLDEyIEBACiAJCQkJfCBBUElDX0RNX0lOSVQpOwogfQogCi1leHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7Ci0KIC8qCiAgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KICAqLwogdm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHZlcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJLyoKIAkgKiBEb24ndCBkbyB0aGUgc2V0dXAgbm93IGlmIHdlIGhhdmUgYSBTTVAgQklPUyBhcyB0aGUKQEAgLTQwMCw5ICs3ODYsNiBAQAogCWlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFjcHVfaGFzX2FwaWMpCiAJCXJldHVybjsKIAotCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKLQogCS8qCiAJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KIAkgKi8KQEAgLTQxNCw5ICs3OTcsMTAgQEAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwogCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7Ci0JCisKIAkvKiBUaGlzIGJpdCBpcyByZXNlcnZlZCBvbiBQNC9YZW9uIGFuZCBzaG91bGQgYmUgY2xlYXJlZCAqLwotCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKIAkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKIAllbHNlCiAJCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKQEAgLTQyOCwxNCArODEyLDE3IEBACiAJICovCiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CiAJdmFsdWUgPSBBUElDX0RNX05NSTsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQkJLyogODI0ODlEWCAqLwogCQl2YWx1ZSB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOwogCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCisvKioKKyAqIHNldHVwX2xvY2FsX0FQSUMgLSBzZXR1cCB0aGUgbG9jYWwgQVBJQworICovCiB2b2lkIF9fZGV2aW5pdCBzZXR1cF9sb2NhbF9BUElDKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGxvbmcgb2xkdmFsdWUsIHZhbHVlLCBtYXhsdnQsIGludGVncmF0ZWQ7CiAJaW50IGksIGo7CiAKIAkvKiBQb3VuZCB0aGUgRVNSIHJlYWxseSBoYXJkIG92ZXIgdGhlIGhlYWQgd2l0aCBhIGJpZyBoYW1tZXIgLSBtYmxpZ2ggKi8KQEAgLTQ0NiwxMSArODMzLDcgQEAKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJfQogCi0JdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOwotCi0JaWYgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MGYpICE9IDB4MGYpCi0JCV9fZXJyb3JfaW5fYXBpY19jKCk7CisJaW50ZWdyYXRlZCA9IGxhcGljX2lzX2ludGVncmF0ZWQoKTsKIAogCS8qCiAJICogRG91YmxlLWNoZWNrIHdoZXRoZXIgdGhpcyBBUElDIGlzIHJlYWxseSByZWdpc3RlcmVkLgpAQCAtNTIxLDEzICs5MDQsMTAgQEAKIAkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgogCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCiAJICovCi0jaWYgMQorCiAJLyogRW5hYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0wKSAqLwogCXZhbHVlICY9IH5BUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7Ci0jZWxzZQotCS8qIERpc2FibGUgZm9jdXMgcHJvY2Vzc29yIChiaXQ9PTEpICovCi0JdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwotI2VuZGlmCisKIAkvKgogCSAqIFNldCBzcHVyaW91cyBJUlEgdmVjdG9yCiAJICovCkBAIC01NjMsMTcgKzk0MywxOCBAQAogCQl2YWx1ZSA9IEFQSUNfRE1fTk1JOwogCWVsc2UKIAkJdmFsdWUgPSBBUElDX0RNX05NSSB8IEFQSUNfTFZUX01BU0tFRDsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghaW50ZWdyYXRlZCkJCS8qIDgyNDg5RFggKi8KIAkJdmFsdWUgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKIAotCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCi0JCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwlpZiAoaW50ZWdyYXRlZCAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCisJCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJb2xkdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOwogCi0JCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7ICAgICAgLy8gZW5hYmxlcyBzZW5kaW5nIGVycm9ycworCQkvKiBlbmFibGVzIHNlbmRpbmcgZXJyb3JzICovCisJCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7CiAJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCB2YWx1ZSk7CiAJCS8qCiAJCSAqIHNwZWMgc2F5cyBjbGVhciBlcnJvcnMgYWZ0ZXIgZW5hYmxpbmcgdmVjdG9yLgpAQCAtNTg2LDQ1ICs5NjcsNDE3IEBACiAJCQkJInZlY3RvcjogMHglMDhseCAgYWZ0ZXI6IDB4JTA4bHhcbiIsCiAJCQkJb2xkdmFsdWUsIHZhbHVlKTsKIAl9IGVsc2UgewotCQlpZiAoZXNyX2Rpc2FibGUpCQotCQkJLyogCi0JCQkgKiBTb21ldGhpbmcgdW50cmFjZWJsZSBpcyBjcmVhdGluZyBiYWQgaW50ZXJydXB0cyBvbiAKKwkJaWYgKGVzcl9kaXNhYmxlKQorCQkJLyoKKwkJCSAqIFNvbWV0aGluZyB1bnRyYWNlYmxlIGlzIGNyZWF0aW5nIGJhZCBpbnRlcnJ1cHRzIG9uCiAJCQkgKiBzZWNvbmRhcnkgcXVhZHMgLi4uIGZvciB0aGUgbW9tZW50LCBqdXN0IGxlYXZlIHRoZQogCQkJICogRVNSIGRpc2FibGVkIC0gd2UgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggdGhlCiAJCQkgKiBlcnJvcnMgYW55d2F5IC0gbWJsaWdoCiAJCQkgKi8KLQkJCXByaW50aygiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKLQkJZWxzZSAKLQkJCXByaW50aygiTm8gRVNSIGZvciA4MjQ4OURYLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJMZWF2aW5nIEVTUiBkaXNhYmxlZC5cbiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJObyBFU1IgZm9yIDgyNDg5RFguXG4iKTsKIAl9CiAKKwkvKiBEaXNhYmxlIHRoZSBsb2NhbCBhcGljIHRpbWVyICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwl2YWx1ZSB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHZhbHVlKTsKKwogCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwogCWFwaWNfcG1fYWN0aXZhdGUoKTsKIH0KIAogLyoKLSAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdAotICogZGlzYWJsZSBpdCBkb3duIGJlZm9yZSByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4KLSAqIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgcG93ZXItb2ZmLgotICogQWRkaXRpb25hbGx5IGNsZWFyIGFsbCBMVlQgZW50cmllcyBiZWZvcmUgZGlzYWJsZV9sb2NhbF9BUElDCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgTGludXggZGlkbid0IGVuYWJsZSB0aGUgTEFQSUMuCisgKiBEZXRlY3QgYW5kIGluaXRpYWxpemUgQVBJQwogICovCi12b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGgsIGwsIGZlYXR1cmVzOwogCi0JaWYgKCFjcHVfaGFzX2FwaWMpCi0JCXJldHVybjsKKwkvKiBEaXNhYmxlZCBieSBrZXJuZWwgb3B0aW9uPyAqLworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCXJldHVybiAtMTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljbGVhcl9sb2NhbF9BUElDKCk7CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDUgJiYgY3B1X2hhc19hcGljKSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJZGVmYXVsdDoKKwkJZ290byBub19hcGljOworCX0KIAotCWlmIChlbmFibGVkX3ZpYV9hcGljYmFzZSkKLQkJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJaWYgKCFjcHVfaGFzX2FwaWMpIHsKKwkJLyoKKwkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMgb25seSBpZgorCQkgKiAibGFwaWMiIHNwZWNpZmllZC4KKwkJICovCisJCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gIgorCQkJICAgICAgICJ5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFwibGFwaWNcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyoKKwkJICogU29tZSBCSU9TZXMgZGlzYWJsZSB0aGUgbG9jYWwgQVBJQyBpbiB0aGUgQVBJQ19CQVNFCisJCSAqIE1TUi4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluIHNvZnR3YXJlIGZvciBJbnRlbCBQNiBvciBsYXRlcgorCQkgKiBhbmQgQU1EIEs3IChNb2RlbCA+IDEpIG9yIGxhdGVyLgorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlpZiAoIShsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gcmVlbmFibGluZy5cbiIpOworCQkJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwkJCWwgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKwkJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwkJCWVuYWJsZWRfdmlhX2FwaWNiYXNlID0gMTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBBUElDIGZlYXR1cmUgYml0IHNob3VsZCBub3cgYmUgZW5hYmxlZAorCSAqIGluIGBjcHVpZCcKKwkgKi8KKwlmZWF0dXJlcyA9IGNwdWlkX2VkeCgxKTsKKwlpZiAoIShmZWF0dXJlcyAmICgxIDw8IFg4Nl9GRUFUVVJFX0FQSUMpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgZW5hYmxlIEFQSUMhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCW1wX2xhcGljX2FkZHIgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCisJCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYW5kIGVuYWJsZWQgbG9jYWwgQVBJQyFcbiIpOworCisJYXBpY19wbV9hY3RpdmF0ZSgpOworCisJcmV0dXJuIDA7CisKK25vX2FwaWM6CisJcHJpbnRrKEtFUk5fSU5GTyAiTm8gbG9jYWwgQVBJQyBwcmVzZW50IG9yIGhhcmR3YXJlIGRpc2FibGVkXG4iKTsKKwlyZXR1cm4gLTE7CiB9CiAKKy8qKgorICogaW5pdF9hcGljX21hcHBpbmdzIC0gaW5pdGlhbGl6ZSBBUElDIG1hcHBpbmdzCisgKi8KK3ZvaWQgX19pbml0IGluaXRfYXBpY19tYXBwaW5ncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYXBpY19waHlzOworCisJLyoKKwkgKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCB0aGVuIHNldCB1cCBhIGZha2UgYWxsCisJICogemVyb2VzIHBhZ2UgdG8gc2ltdWxhdGUgdGhlIGxvY2FsIEFQSUMgYW5kIGFub3RoZXIKKwkgKiBvbmUgZm9yIHRoZSBJTy1BUElDLgorCSAqLworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiBkZXRlY3RfaW5pdF9BUElDKCkpIHsKKwkJYXBpY19waHlzID0gKHVuc2lnbmVkIGxvbmcpIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwkJYXBpY19waHlzID0gX19wYShhcGljX3BoeXMpOworCX0gZWxzZQorCQlhcGljX3BoeXMgPSBtcF9sYXBpY19hZGRyOworCisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9BUElDX0JBU0UsIGFwaWNfcGh5cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hcHBlZCBBUElDIHRvICUwOGx4ICglMDhseClcbiIsIEFQSUNfQkFTRSwKKwkgICAgICAgYXBpY19waHlzKTsKKworCS8qCisJICogRmV0Y2ggdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBpbiBjYXNlIHdlIGhhdmUgYQorCSAqIGRlZmF1bHQgY29uZmlndXJhdGlvbiAob3IgdGhlIE1QIHRhYmxlIGlzIGJyb2tlbikuCisJICovCisJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9PSAtMVUpCisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwl7CisJCXVuc2lnbmVkIGxvbmcgaW9hcGljX3BoeXMsIGlkeCA9IEZJWF9JT19BUElDX0JBU0VfMDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgeworCQkJaWYgKHNtcF9mb3VuZF9jb25maWcpIHsKKwkJCQlpb2FwaWNfcGh5cyA9IG1wX2lvYXBpY3NbaV0ubXBjX2FwaWNhZGRyOworCQkJCWlmICghaW9hcGljX3BoeXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAiV0FSTklORzogYm9ndXMgemVybyBJTy1BUElDICIKKwkJCQkJICAgICAgICJhZGRyZXNzIGZvdW5kIGluIE1QVEFCTEUsICIKKwkJCQkJICAgICAgICJkaXNhYmxpbmcgSU8vQVBJQyBzdXBwb3J0IVxuIik7CisJCQkJCXNtcF9mb3VuZF9jb25maWcgPSAwOworCQkJCQlza2lwX2lvYXBpY19zZXR1cCA9IDE7CisJCQkJCWdvdG8gZmFrZV9pb2FwaWNfcGFnZTsKKwkJCQl9CisJCQl9IGVsc2UgeworZmFrZV9pb2FwaWNfcGFnZToKKwkJCQlpb2FwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJCQkJaW9hcGljX3BoeXMgPSBfX3BhKGlvYXBpY19waHlzKTsKKwkJCX0KKwkJCXNldF9maXhtYXBfbm9jYWNoZShpZHgsIGlvYXBpY19waHlzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgSU9BUElDIHRvICUwOGx4ICglMDhseClcbiIsCisJCQkgICAgICAgX19maXhfdG9fdmlydChpZHgpLCBpb2FwaWNfcGh5cyk7CisJCQlpZHgrKzsKKwkJfQorCX0KKyNlbmRpZgorfQorCisvKgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCisgKiBhIFVQIGtlcm5lbC4KKyAqLworaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQoreworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KKwkgKi8KKwlpZiAoIWNwdV9oYXNfYXBpYyAmJgorCSAgICBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCisJCSAgICAgICBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2ZXJpZnlfbG9jYWxfQVBJQygpOworCisJY29ubmVjdF9ic3BfQVBJQygpOworCisJLyoKKwkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZworCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKKwkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgorCSAqLworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKyNlbmRpZgorCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlpZiAoc21wX2ZvdW5kX2NvbmZpZykKKwkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQorCQkJc2V0dXBfSU9fQVBJQygpOworI2VuZGlmCisJc2V0dXBfYm9vdF9jbG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBUElDIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibGFwaWMiLCBwYXJzZV9sYXBpYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX25vbGFwaWMoY2hhciAqYXJnKQoreworCWVuYWJsZV9sb2NhbF9hcGljID0gLTE7CisJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKKworc3RhdGljIGludCBfX2luaXQgYXBpY19zZXRfdmVyYm9zaXR5KGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyY21wKCJkZWJ1ZyIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX0RFQlVHOworCWVsc2UgaWYgKHN0cmNtcCgidmVyYm9zZSIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX1ZFUkJPU0U7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKKworCisvKgorICogTG9jYWwgQVBJQyBpbnRlcnJ1cHRzCisgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBfbmV2ZXJfIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLwordm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCWV4aXRfaWRsZSgpOworCWlycV9lbnRlcigpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYW5kIEFDSyBpdAorCSAqIGlmIGl0IGlzIGEgdmVjdG9yZWQgb25lLiAgSnVzdCBpbiBjYXNlLi4uCisJICogU3B1cmlvdXMgaW50ZXJydXB0cyBzaG91bGQgbm90IGJlIEFDS2VkLgorCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19JU1IgKyAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgfjB4MWYpID4+IDEpKTsKKwlpZiAodiAmICgxIDw8IChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MWYpKSkKKwkJYWNrX0FQSUNfaXJxKCk7CisKKwkvKiBzZWUgc3ctZGV2LW1hbiB2b2wgMywgY2hhcHRlciA3LjQuMTMuNSAqLworCXByaW50ayhLRVJOX0lORk8gInNwdXJpb3VzIEFQSUMgaW50ZXJydXB0IG9uIENQVSMlZCwgIgorCSAgICAgICAic2hvdWxkIG5ldmVyIGhhcHBlbi5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCisgKi8KK3ZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHYsIHYxOworCisJZXhpdF9pZGxlKCk7CisJaXJxX2VudGVyKCk7CisJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCXYxID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhY2tfQVBJQ19pcnEoKTsKKwlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKworCS8qIEhlcmUgaXMgd2hhdCB0aGUgQVBJQyBlcnJvciBiaXRzIG1lYW46CisJICAgMDogU2VuZCBDUyBlcnJvcgorCSAgIDE6IFJlY2VpdmUgQ1MgZXJyb3IKKwkgICAyOiBTZW5kIGFjY2VwdCBlcnJvcgorCSAgIDM6IFJlY2VpdmUgYWNjZXB0IGVycm9yCisJICAgNDogUmVzZXJ2ZWQKKwkgICA1OiBTZW5kIGlsbGVnYWwgdmVjdG9yCisJICAgNjogUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IKKwkgICA3OiBJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MKKwkqLworCXByaW50ayAoS0VSTl9ERUJVRyAiQVBJQyBlcnJvciBvbiBDUFUlZDogJTAybHgoJTAybHgpXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIHYgLCB2MSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgQVBJQyBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9pbnRyX2luaXQoKTsKKyNlbmRpZgorCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLworCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7CisKKwkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLworCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7CisJc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKKworCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7CisjZW5kaWYKK30KKworLyoqCisgKiBjb25uZWN0X2JzcF9BUElDIC0gYXR0YWNoIHRoZSBBUElDIHRvIHRoZSBpbnRlcnJ1cHQgc3lzdGVtCisgKi8KK3ZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkJICovCisJCWNsZWFyX2xvY2FsX0FQSUMoKTsKKwkJLyoKKwkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4gIGNvbm5lY3QgQlNQJ3MKKwkJICogbG9jYWwgQVBJQyB0byBJTlQgYW5kIE5NSSBsaW5lcy4KKwkJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImxlYXZpbmcgUElDIG1vZGUsICIKKwkJCQkiZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMSwgMHgyMyk7CisJfQorCWVuYWJsZV9hcGljX21vZGUoKTsKK30KKworLyoqCisgKiBkaXNjb25uZWN0X2JzcF9BUElDIC0gZGV0YWNoIHRoZSBBUElDIGZyb20gdGhlIGludGVycnVwdCBzeXN0ZW0KKyAqIEB2aXJ0X3dpcmVfc2V0dXA6CWluZGljYXRlcywgd2hldGhlciB2aXJ0dWFsIHdpcmUgbW9kZSBpcyBzZWxlY3RlZAorICoKKyAqIFZpcnR1YWwgd2lyZSBtb2RlIGlzIG5lY2Vzc2FyeSB0byBkZWxpdmVyIGxlZ2FjeSBpbnRlcnJ1cHRzIGV2ZW4gd2hlbiB0aGUKKyAqIEFQSUMgaXMgZGlzYWJsZWQuCisgKi8KK3ZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKQoreworCWlmIChwaWNfbW9kZSkgeworCQkvKgorCQkgKiBQdXQgdGhlIGJvYXJkIGJhY2sgaW50byBQSUMgbW9kZSAoaGFzIGFuIGVmZmVjdCBvbmx5IG9uCisJCSAqIGNlcnRhaW4gb2xkZXIgYm9hcmRzKS4gIE5vdGUgdGhhdCBBUElDIGludGVycnVwdHMsIGluY2x1ZGluZworCQkgKiBJUElzLCB3b24ndCB3b3JrIGJleW9uZCB0aGlzIHBvaW50ISAgVGhlIG9ubHkgZXhjZXB0aW9uIGFyZQorCQkgKiBJTklUIElQSXMuCisJCSAqLworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJkaXNhYmxpbmcgQVBJQyBtb2RlLCAiCisJCQkJImVudGVyaW5nIFBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMCwgMHgyMyk7CisJfSBlbHNlIHsKKwkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOworCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQl2YWx1ZSB8PSAweGY7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJCWlmICghdmlydF93aXJlX3NldHVwKSB7CisJCQkvKgorCQkJICogRm9yIExWVDAgbWFrZSBpdCBlZGdlIHRyaWdnZXJlZCwgYWN0aXZlIGhpZ2gsCisJCQkgKiBleHRlcm5hbCBhbmQgZW5hYmxlZAorCQkJICovCisJCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCQkJdmFsdWUgJj0gfihBUElDX01PREVfTUFTSyB8IEFQSUNfU0VORF9QRU5ESU5HIHwKKwkJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCApOworCQkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfRVhUSU5UKTsKKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBMVlQwICovCisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZAorCQkgKiBlbmFibGVkCisJCSAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCQl2YWx1ZSAmPSB+KAorCQkJQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9OTUkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKwl9Cit9CisKKy8qCisgKiBQb3dlciBtYW5hZ2VtZW50CisgKi8KICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHN0cnVjdCB7CkBAIC02NTMsNyArMTQwNiw3IEBACiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCiAJYXBpY19wbV9zdGF0ZS5hcGljX2lkID0gYXBpY19yZWFkKEFQSUNfSUQpOwogCWFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CkBAIC02NzIsNyArMTQyNSw3IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOwogI2VuZGlmCi0JCisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZGlzYWJsZV9sb2NhbF9BUElDKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNjg4LDcgKzE0NDEsNyBAQAogCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCiAJCXJldHVybiAwOwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIApAQCAtNzcwLDY1MSArMTUyMywzIEBACiBzdGF0aWMgdm9pZCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpIHsgfQogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCi0KLS8qCi0gKiBEZXRlY3QgYW5kIGVuYWJsZSBsb2NhbCBBUElDcyBvbiBub24tU01QIGJvYXJkcy4KLSAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBLZWlyIEZyYXNlci4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqc3RyKQotewotCWlmIChzdHJjbXAoImRlYnVnIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7Ci0JZWxzZSBpZiAoc3RyY21wKCJ2ZXJib3NlIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfVkVSQk9TRTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYXBpYz0iLCBhcGljX3NldF92ZXJib3NpdHkpOwotCi1zdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQotewotCXUzMiBoLCBsLCBmZWF0dXJlczsKLQotCS8qIERpc2FibGVkIGJ5IGtlcm5lbCBvcHRpb24/ICovCi0JaWYgKGVuYWJsZV9sb2NhbF9hcGljIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0Jc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAotCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkJICAgIAotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1IHx8Ci0JCSAgICAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNSAmJiBjcHVfaGFzX2FwaWMpKQotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQlkZWZhdWx0OgotCQlnb3RvIG5vX2FwaWM7Ci0JfQotCi0JaWYgKCFjcHVfaGFzX2FwaWMpIHsKLQkJLyoKLQkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsCi0JCSAqIEFQSUMgb25seSBpZiAibGFwaWMiIHNwZWNpZmllZC4KLQkJICovCi0JCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSAiCi0JCQkgICAgICAgInlvdSBjYW4gZW5hYmxlIGl0IHdpdGggXCJsYXBpY1wiXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvKgotCQkgKiBTb21lIEJJT1NlcyBkaXNhYmxlIHRoZSBsb2NhbCBBUElDIGluIHRoZQotCQkgKiBBUElDX0JBU0UgTVNSLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgaW4KLQkJICogc29mdHdhcmUgZm9yIEludGVsIFA2IG9yIGxhdGVyIGFuZCBBTUQgSzcKLQkJICogKE1vZGVsID4gMSkgb3IgbGF0ZXIuCi0JCSAqLwotCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JCWlmICghKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSByZWVuYWJsaW5nLlxuIik7Ci0JCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOwotCQkJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwotCQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwotCQkJZW5hYmxlZF92aWFfYXBpY2Jhc2UgPSAxOwotCQl9Ci0JfQotCS8qCi0JICogVGhlIEFQSUMgZmVhdHVyZSBiaXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkCi0JICogaW4gYGNwdWlkJwotCSAqLwotCWZlYXR1cmVzID0gY3B1aWRfZWR4KDEpOwotCWlmICghKGZlYXR1cmVzICYgKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykpKSB7Ci0JCXByaW50aygiQ291bGQgbm90IGVuYWJsZSBBUElDIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLQotCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KLQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCi0JCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKLQotCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCi0JCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOwotCi0JcHJpbnRrKCJGb3VuZCBhbmQgZW5hYmxlZCBsb2NhbCBBUElDIVxuIik7Ci0KLQlhcGljX3BtX2FjdGl2YXRlKCk7Ci0KLQlyZXR1cm4gMDsKLQotbm9fYXBpYzoKLQlwcmludGsoIk5vIGxvY2FsIEFQSUMgcHJlc2VudCBvciBoYXJkd2FyZSBkaXNhYmxlZFxuIik7Ci0JcmV0dXJuIC0xOwotfQotCi12b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKLQotCS8qCi0JICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAotCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCi0JICogb25lIGZvciB0aGUgSU8tQVBJQy4KLQkgKi8KLQlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7Ci0JCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7Ci0JCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKLQl9IGVsc2UKLQkJYXBpY19waHlzID0gbXBfbGFwaWNfYWRkcjsKLQotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOwotCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLCBBUElDX0JBU0UsCi0JICAgICAgIGFwaWNfcGh5cyk7Ci0KLQkvKgotCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKLQkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgotCSAqLwotCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JewotCQl1bnNpZ25lZCBsb25nIGlvYXBpY19waHlzLCBpZHggPSBGSVhfSU9fQVBJQ19CQVNFXzA7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKLQkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7Ci0JCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKLQkJCQlpZiAoIWlvYXBpY19waHlzKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAgICAgIldBUk5JTkc6IGJvZ3VzIHplcm8gSU8tQVBJQyAiCi0JCQkJCSAgICAgICAiYWRkcmVzcyBmb3VuZCBpbiBNUFRBQkxFLCAiCi0JCQkJCSAgICAgICAiZGlzYWJsaW5nIElPL0FQSUMgc3VwcG9ydCFcbiIpOwotCQkJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKLQkJCQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOwotCQkJCQlnb3RvIGZha2VfaW9hcGljX3BhZ2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLWZha2VfaW9hcGljX3BhZ2U6Ci0JCQkJaW9hcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykKLQkJCQkJICAgICAgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwotCQkJCWlvYXBpY19waHlzID0gX19wYShpb2FwaWNfcGh5cyk7Ci0JCQl9Ci0JCQlzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBpb2FwaWNfcGh5cyk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIElPQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAotCQkJICAgICAgIF9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOwotCQkJaWR4Kys7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFRoaXMgcGFydCBzZXRzIHVwIHRoZSBBUElDIDMyIGJpdCBjbG9jayBpbiBMVlRUMSwgd2l0aCBIWiBpbnRlcnJ1cHRzCi0gKiBwZXIgc2Vjb25kLiBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHNldCB1cCB0aGUgbG9jYWwKLSAqIEFQSUMuCi0gKgotICogVGhlIEFQSUMgdGltZXIgaXMgbm90IGV4YWN0bHkgc3luYyB3aXRoIHRoZSBleHRlcm5hbCB0aW1lciBjaGlwLCBpdAotICogY2xvc2VseSBmb2xsb3dzIGJ1cyBjbG9ja3MuCi0gKi8KLQotLyoKLSAqIFRoZSB0aW1lciBjaGlwIGlzIGFscmVhZHkgc2V0IHVwIGF0IEhaIGludGVycnVwdHMgcGVyIHNlY29uZCBoZXJlLAotICogYnV0IHdlIGRvIG5vdCBhY2NlcHQgdGltZXIgaW50ZXJydXB0cyB5ZXQuIFdlIG9ubHkgYWxsb3cgdGhlIEJQCi0gKiB0byBjYWxpYnJhdGUuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXVuc2lnbmVkIGludCBjb3VudDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0KLQlvdXRiX3AoMHgwMCwgUElUX01PREUpOwotCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7Ci0JY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotLyogbmV4dCB0aWNrIGluIDgyNTQgY2FuIGJlIGNhdWdodCBieSBjYXRjaGluZyB0aW1lciB3cmFwYXJvdW5kICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF84MjU0X3dyYXBhcm91bmQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgcHJldl9jb3VudDsKLQotCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCWRvIHsKLQkJcHJldl9jb3VudCA9IGN1cnJfY291bnQ7Ci0JCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCi0JCS8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBNZXJjdXJ5L05lcHR1bmUgKi8KLQkJaWYgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCArIDB4MTAwKQotCQkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7Ci0KLQl9IHdoaWxlIChwcmV2X2NvdW50ID49IGN1cnJfY291bnQpOwotfQotCi0vKgotICogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgODI1NCB0aW1lcnMuIElmIHdlIHVzZSBvdGhlciB0aW1lcnMgbGlrZSBIUEVULAotICogd2Ugb3ZlcnJpZGUgdGhpcyBsYXRlcgotICovCi12b2lkICgqd2FpdF90aW1lcl90aWNrKSh2b2lkKSBfX2RldmluaXRkYXRhID0gd2FpdF84MjU0X3dyYXBhcm91bmQ7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGxvY2FsIEFQSUMgdGltZXIsIHdpdGggYSB0aW1lb3V0IG9mCi0gKiAnY2xvY2tzJyBBUElDIGJ1cyBjbG9jay4gRHVyaW5nIGNhbGlicmF0aW9uIHdlIGFjdHVhbGx5IGNhbGwKLSAqIHRoaXMgZnVuY3Rpb24gdHdpY2Ugb24gdGhlIGJvb3QgQ1BVLCBvbmNlIHdpdGggYSBib2d1cyB0aW1lb3V0Ci0gKiB2YWx1ZSwgc2Vjb25kIHRpbWUgZm9yIHJlYWwuIFRoZSBvdGhlciAobm9uY2FsaWJyYXRpbmcpIENQVXMKLSAqIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UsIHdpdGggdGhlIHJlYWwsIGNhbGlicmF0ZWQgdmFsdWUuCi0gKgotICogV2UgZG8gcmVhZHMgYmVmb3JlIHdyaXRlcyBldmVuIGlmIHVubmVjZXNzYXJ5LCB0byBnZXQgYXJvdW5kIHRoZQotICogUDUgQVBJQyBkb3VibGUgd3JpdGUgYnVnLgotICovCi0KLSNkZWZpbmUgQVBJQ19ESVZJU09SIDE2Ci0KLXN0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MpCi17Ci0JdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZSwgdmVyOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwotCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQotCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7Ci0KLQlpZiAoY3B1X2lzc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKSkKLQkJbHZ0dF92YWx1ZSB8PSBBUElDX0xWVF9NQVNLRUQ7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIGx2dHRfdmFsdWUpOwotCi0JLyoKLQkgKiBEaXZpZGUgUElDTEsgYnkgMTYKLQkgKi8KLQl0bXBfdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1REQ1IsICh0bXBfdmFsdWUKLQkJCQkmIH4oQVBJQ19URFJfRElWXzEgfCBBUElDX1REUl9ESVZfVE1CQVNFKSkKLQkJCQl8IEFQSUNfVERSX0RJVl8xNik7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX0FQSUNfdGltZXIodW5zaWduZWQgaW50IGNsb2NrcykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBJUlEwJ3Mgc2xpY2U6Ci0JICovCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQlfX3NldHVwX0FQSUNfTFZUVChjbG9ja3MpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBjYWxpYnJhdGUgQVBJQyBidXMgY2xvY2tzIHRvIHRoZSBleHRlcm5hbAotICogdGltZXIuIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHVzZSBqaWZmaWVzIGFuZCB0aGUgdGltZXIgaXJxCi0gKiB0byBjYWxpYnJhdGUsIHNpbmNlIHNvbWUgbGF0ZXIgYm9vdHVwIGNvZGUgZGVwZW5kcyBvbiBnZXR0aW5nCi0gKiB0aGUgZmlyc3QgaXJxPyBVZ2guCi0gKgotICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlCi0gKiB3YW50IHRvIGhhdmUgbG9jYWwgdGltZXIgaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZAotICogYnkgdGhlIHNhbWUgQVBJQyBidXMgaGF2ZSB0aGUgdmVyeSBzYW1lIGJ1cyBmcmVxdWVuY3kuCi0gKiBBbmQgd2Ugd2FudCB0byBoYXZlIGlycXMgb2ZmIGFueXdheXMsIG5vIGFjY2lkZW50YWwKLSAqIEFQSUMgaXJxIHRoYXQgd2F5LgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGNhbGlicmF0ZV9BUElDX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHQxID0gMCwgdDIgPSAwOwotCWxvbmcgdHQxLCB0dDI7Ci0JbG9uZyByZXN1bHQ7Ci0JaW50IGk7Ci0JY29uc3QgaW50IExPT1BTID0gSFovMTA7Ci0KLQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7Ci0KLQkvKgotCSAqIFB1dCB3aGF0ZXZlciBhcmJpdHJhcnkgKGJ1dCBsb25nIGVub3VnaCkgdGltZW91dAotCSAqIHZhbHVlIGludG8gdGhlIEFQSUMgY2xvY2ssIHdlIGp1c3Qgd2FudCB0byBnZXQgdGhlCi0JICogY291bnRlciBydW5uaW5nIGZvciBjYWxpYnJhdGlvbi4KLQkgKi8KLQlfX3NldHVwX0FQSUNfTFZUVCgxMDAwMDAwMDAwKTsKLQotCS8qCi0JICogVGhlIHRpbWVyIGNoaXAgY291bnRzIGRvd24gdG8gemVyby4gTGV0J3Mgd2FpdAotCSAqIGZvciBhIHdyYXBhcm91bmQgdG8gc3RhcnQgZXhhY3QgbWVhc3VyZW1lbnQ6Ci0JICogKHRoZSBjdXJyZW50IHRpY2sgbWlnaHQgaGF2ZSBiZWVuIGFscmVhZHkgaGFsZiBkb25lKQotCSAqLwotCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQkvKgotCSAqIFdlIHdyYXBwZWQgYXJvdW5kIGp1c3Qgbm93LiBMZXQncyBzdGFydDoKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDEpOwotCXR0MSA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQotCS8qCi0JICogTGV0J3Mgd2FpdCBMT09QUyB3cmFwcm91bmRzOgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBMT09QUzsgaSsrKQotCQl3YWl0X3RpbWVyX3RpY2soKTsKLQotCXR0MiA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDIpOwotCi0JLyoKLQkgKiBUaGUgQVBJQyBidXMgY2xvY2sgY291bnRlciBpcyAzMiBiaXRzIG9ubHksIGl0Ci0JICogbWlnaHQgaGF2ZSBvdmVyZmxvd24sIGJ1dCBub3RlIHRoYXQgd2UgdXNlIHNpZ25lZAotCSAqIGxvbmdzLCB0aHVzIG5vIGV4dHJhIGNhcmUgbmVlZGVkLgotCSAqCi0JICogdW5kZXJmbG93biB0byBiZSBleGFjdCwgYXMgdGhlIHRpbWVyIGNvdW50cyBkb3duIDspCi0JICovCi0KLQlyZXN1bHQgPSAodHQxLXR0MikqQVBJQ19ESVZJU09SL0xPT1BTOwotCi0JaWYgKGNwdV9oYXNfdHNjKQotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBDUFUgY2xvY2sgc3BlZWQgaXMgIgotCQkJIiVsZC4lMDRsZCBNSHouXG4iLAotCQkJKChsb25nKSh0Mi10MSkvTE9PUFMpLygxMDAwMDAwL0haKSwKLQkJCSgobG9uZykodDItdDEpL0xPT1BTKSUoMTAwMDAwMC9IWikpOwotCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gaG9zdCBidXMgY2xvY2sgc3BlZWQgaXMgIgotCQkiJWxkLiUwNGxkIE1Iei5cbiIsCi0JCXJlc3VsdC8oMTAwMDAwMC9IWiksCi0JCXJlc3VsdCUoMTAwMDAwMC9IWikpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7Ci0KLXZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiVXNpbmcgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHRzLlxuIik7Ci0JdXNpbmdfYXBpY190aW1lciA9IDE7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljYWxpYnJhdGlvbl9yZXN1bHQgPSBjYWxpYnJhdGVfQVBJQ19jbG9jaygpOwotCS8qCi0JICogTm93IHNldCB1cCB0aGUgdGltZXIgZm9yIHJlYWwuCi0JICovCi0Jc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi12b2lkIF9fZGV2aW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQotewotCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKLX0KLQotdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKLXsKLQlpZiAodXNpbmdfYXBpY190aW1lcikgewotCQl1bnNpZ25lZCBsb25nIHY7Ci0KLQkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwotCQkvKgotCQkgKiBXaGVuIGFuIGlsbGVnYWwgdmVjdG9yIHZhbHVlICgwLTE1KSBpcyB3cml0dGVuIHRvIGFuIExWVAotCQkgKiBlbnRyeSBhbmQgZGVsaXZlcnkgbW9kZSBpcyBGaXhlZCwgdGhlIEFQSUMgbWF5IHNpZ25hbCBhbgotCQkgKiBpbGxlZ2FsIHZlY3RvciBlcnJvciwgd2l0aCBvdXQgcmVnYXJkIHRvIHdoZXRoZXIgdGhlIG1hc2sKLQkJICogYml0IGlzIHNldCBvciB3aGV0aGVyIGFuIGludGVycnVwdCBpcyBhY3R1YWxseSBzZWVuIG9uIGlucHV0LgotCQkgKgotCQkgKiBCb290IHNlcXVlbmNlIG1pZ2h0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBMVlRUIGhhcwotCQkgKiAnMCcgdmVjdG9yIHZhbHVlLiBTbyBtYWtlIHN1cmUgdmVjdG9yIGZpZWxkIGlzIHNldCB0bwotCQkgKiB2YWxpZCB2YWx1ZS4KLQkJICovCi0JCXYgfD0gKEFQSUNfTFZUX01BU0tFRCB8IExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdik7Ci0JfQotfQotCi12b2lkIGVuYWJsZV9BUElDX3RpbWVyKHZvaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmICh1c2luZ19hcGljX3RpbWVyICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdjsKLQotCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiAmIH5BUElDX0xWVF9NQVNLRUQpOwotCX0KLX0KLQotdm9pZCBzd2l0Y2hfQVBJQ190aW1lcl90b19pcGkodm9pZCAqY3B1bWFzaykKLXsKLQljcHVtYXNrX3QgbWFzayA9ICooY3B1bWFza190ICopY3B1bWFzazsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JaWYgKGNwdV9pc3NldChjcHUsIG1hc2spICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWRpc2FibGVfQVBJQ190aW1lcigpOwotCQljcHVfc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSk7Ci0KLXZvaWQgc3dpdGNoX2lwaV90b19BUElDX3RpbWVyKHZvaWQgKmNwdW1hc2spCi17Ci0JY3B1bWFza190IG1hc2sgPSAqKGNwdW1hc2tfdCAqKWNwdW1hc2s7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSAmJgotCSAgICBjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWNwdV9jbGVhcihjcHUsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JCWVuYWJsZV9BUElDX3RpbWVyKCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIpOwotCi0jdW5kZWYgQVBJQ19ESVZJU09SCi0KLS8qCi0gKiBMb2NhbCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKLSAqIHByb2Nlc3Mgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcuCi0gKgotICogV2UgZG8gcHJvZmlsaW5nIGluIGV2ZXJ5IGxvY2FsIHRpY2ssIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nCi0gKiBoYXBwZW4gb25seSBldmVyeSAncHJvZmlsaW5nIG11bHRpcGxpZXInIHRpY2tzLiBUaGUgZGVmYXVsdAotICogbXVsdGlwbGllciBpcyAxIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRoZSBuZXcgbXVsdGlwbGllcgotICogdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgotICovCi0KLWlubGluZSB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCkKLXsKLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQotCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgotCSAqCi0JICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCi0JICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KLQkgKgotCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKLQkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgotCSAqLwotfQotCi0vKgotICogTG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQuIFRoaXMgaXMgdGhlIG1vc3QgbmF0dXJhbCB3YXkgZm9yIGRvaW5nCi0gKiBsb2NhbCBpbnRlcnJ1cHRzLCBidXQgbG9jYWwgdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgZW11bGF0ZWQgYnkKLSAqIGJyb2FkY2FzdCBpbnRlcnJ1cHRzIHRvby4gW2luIGNhc2UgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCBBUElDIHRpbWVyc10KLSAqCi0gKiBbIGlmIGEgc2luZ2xlLUNQVSBzeXN0ZW0gcnVucyBhbiBTTVAga2VybmVsIHRoZW4gd2UgY2FsbCB0aGUgbG9jYWwKLSAqICAgaW50ZXJydXB0IGFzIHdlbGwuIFRodXMgd2UgY2Fubm90IGlubGluZSB0aGUgbG9jYWwgaXJxIC4uLiBdCi0gKi8KLQotZmFzdGNhbGwgdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKgotCSAqIHRoZSBOTUkgZGVhZGxvY2stZGV0ZWN0b3IgdXNlcyB0aGlzLgotCSAqLwotCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzKys7Ci0KLQkvKgotCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAotCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCi0JICovCi0JYWNrX0FQSUNfaXJxKCk7Ci0JLyoKLQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgotCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKLQkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KLQkgKi8KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0JaXJxX2V4aXQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotCi0jaWZuZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHVwX2FwaWNfdGltZXJfaW50ZXJydXB0X2NhbGwodm9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JLyoKLQkgKiB0aGUgTk1JIGRlYWRsb2NrLWRldGVjdG9yIHVzZXMgdGhpcy4KLQkgKi8KLQlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOwotCi0Jc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCgpOwotfQotI2VuZGlmCi0KLXZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKQotewotCWNwdW1hc2tfdCBtYXNrOwotCi0JY3B1c19hbmQobWFzaywgY3B1X29ubGluZV9tYXAsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0jZWxzZQotCQkvKgotCQkgKiBXZSBjYW4gZGlyZWN0bHkgY2FsbCB0aGUgYXBpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcgotCQkgKiBpbiBVUCBjYXNlLiBNaW51cyBhbGwgaXJxIHJlbGF0ZWQgZnVuY3Rpb25zCi0JCSAqLwotCQl1cF9hcGljX3RpbWVyX2ludGVycnVwdF9jYWxsKCk7Ci0jZW5kaWYKLQl9Ci19Ci0KLWludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBUaGlzIGludGVycnVwdCBzaG91bGQgX25ldmVyXyBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCi0gKi8KLWZhc3RjYWxsIHZvaWQgc21wX3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHY7Ci0KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQkvKgotCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKLQkgKiBpZiBpdCBpcyBhIHZlY3RvcmVkIG9uZS4gIEp1c3QgaW4gY2FzZS4uLgotCSAqIFNwdXJpb3VzIGludGVycnVwdHMgc2hvdWxkIG5vdCBiZSBBQ0tlZC4KLQkgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfSVNSICsgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIH4weDFmKSA+PiAxKSk7Ci0JaWYgKHYgJiAoMSA8PCAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDFmKSkpCi0JCWFja19BUElDX2lycSgpOwotCi0JLyogc2VlIHN3LWRldi1tYW4gdm9sIDMsIGNoYXB0ZXIgNy40LjEzLjUgKi8KLQlwcmludGsoS0VSTl9JTkZPICJzcHVyaW91cyBBUElDIGludGVycnVwdCBvbiBDUFUjJWQsIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iLAotCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKLSAqLwotCi1mYXN0Y2FsbCB2b2lkIHNtcF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyB2LCB2MTsKLQotCWV4aXRfaWRsZSgpOwotCWlycV9lbnRlcigpOwotCS8qIEZpcnN0IHRpY2tsZSB0aGUgaGFyZHdhcmUsIG9ubHkgdGhlbiByZXBvcnQgd2hhdCB3ZW50IG9uLiAtLSBSRVcgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKLQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKLQl2MSA9IGFwaWNfcmVhZChBUElDX0VTUik7Ci0JYWNrX0FQSUNfaXJxKCk7Ci0JYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7Ci0KLQkvKiBIZXJlIGlzIHdoYXQgdGhlIEFQSUMgZXJyb3IgYml0cyBtZWFuOgotCSAgIDA6IFNlbmQgQ1MgZXJyb3IKLQkgICAxOiBSZWNlaXZlIENTIGVycm9yCi0JICAgMjogU2VuZCBhY2NlcHQgZXJyb3IKLQkgICAzOiBSZWNlaXZlIGFjY2VwdCBlcnJvcgotCSAgIDQ6IFJlc2VydmVkCi0JICAgNTogU2VuZCBpbGxlZ2FsIHZlY3RvcgotCSAgIDY6IFJlY2VpdmVkIGlsbGVnYWwgdmVjdG9yCi0JICAgNzogSWxsZWdhbCByZWdpc3RlciBhZGRyZXNzCi0JKi8KLQlwcmludGsgKEtFUk5fREVCVUcgIkFQSUMgZXJyb3Igb24gQ1BVJWQ6ICUwMmx4KCUwMmx4KVxuIiwKLQkgICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgdiAsIHYxKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCi0gKiBhIFVQIGtlcm5lbC4KLSAqLwotaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQotewotCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCi0JCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQotCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KLQkgKi8KLQlpZiAoIWNwdV9oYXNfYXBpYyAmJiBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCi0JCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwotCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl2ZXJpZnlfbG9jYWxfQVBJQygpOwotCi0JY29ubmVjdF9ic3BfQVBJQygpOwotCi0JLyoKLQkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZwotCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKLQkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgotCSAqLwotI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCi0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLSNlbmRpZgotCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7Ci0KLQlzZXR1cF9sb2NhbF9BUElDKCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlpZiAoc21wX2ZvdW5kX2NvbmZpZykKLQkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQotCQkJc2V0dXBfSU9fQVBJQygpOwotI2VuZGlmCi0Jc2V0dXBfYm9vdF9jbG9jaygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKLXsKLQlsYXBpY19lbmFibGUoKTsKLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJsYXBpYyIsIHBhcnNlX2xhcGljKTsKLQotc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9sYXBpYyhjaGFyICphcmcpCi17Ci0JbGFwaWNfZGlzYWJsZSgpOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggZjliYTBhZi4uMDY0YmJmMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMzYsNyArMjM2LDYgQEAKIAogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICosIGludCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCkBAIC0xMTc2LDI4ICsxMTc1LDYgQEAKIAlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfdGltZSh2b2lkKQotewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQlpZiAoZ290X2Nsb2NrX2RpZmYpIHsJLyogTXVzdCBrbm93IHRpbWUgem9uZSBpbiBvcmRlciB0byBzZXQgY2xvY2sgKi8KLQkJdHMudHZfc2VjID0gZ2V0X2Ntb3NfdGltZSgpICsgY2xvY2tfY21vc19kaWZmOwotCQl0cy50dl9uc2VjID0gMDsKLQkJZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0JfSAKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3RpbWVfZGlmZih2b2lkKQotewotI2lmbmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKLQkvKgotCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCi0JICovCi0JY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlnb3RfY2xvY2tfZGlmZiA9IDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIHZvaWQgcmVpbml0X3RpbWVyKHZvaWQpCiB7CiAjaWZkZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECkBAIC0xMjM3LDE5ICsxMjE0LDYgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CiAKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KLQkvKiBwcm90ZWN0IGFnYWluc3QgYWNjZXNzIHRvIHRpbWVyIGNoaXAgcmVnaXN0ZXJzICovCi0Jc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKLQotCWdldF90aW1lX2RpZmYoKTsKLQkvKgotCSAqIElycSBzcGlubG9jayBtdXN0IGJlIGRyb3BwZWQgYXJvdW5kIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUuCi0JICogV2UnbGwgdW5kbyBhbnkgdGltZXIgY2hhbmdlcyBkdWUgdG8gaW50ZXJydXB0cyBiZWxvdy4KLQkgKi8KLQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwpAQCAtMTI1OCw3ICsxMjIyLDYgQEAKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzZXRfdGltZSgpOwogCXJlaW5pdF90aW1lcigpOwogCiAJaWYgKGVyciA9PSBBUE1fTk9fRVJST1IpCkBAIC0xMjg4LDExICsxMjUxLDYgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJZGV2aWNlX3Bvd2VyX2Rvd24oUE1TR19TVVNQRU5EKTsKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0JLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCi0JZ2V0X3RpbWVfZGlmZigpOwotCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfU1RBTkRCWSk7CkBAIC0xMzg2LDcgKzEzNDQsNiBAQAogCQkJaWdub3JlX2JvdW5jZSA9IDE7CiAJCQlpZiAoKGV2ZW50ICE9IEFQTV9OT1JNQUxfUkVTVU1FKQogCQkJICAgIHx8IChpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9PSAwKSkgewotCQkJCXNldF90aW1lKCk7CiAJCQkJZGV2aWNlX3Jlc3VtZSgpOwogCQkJCXBtX3NlbmRfYWxsKFBNX1JFU1VNRSwgKHZvaWQgKikwKTsKIAkJCQlxdWV1ZV9ldmVudChldmVudCwgTlVMTCk7CkBAIC0xNDAyLDcgKzEzNTksNiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fVVBEQVRFX1RJTUU6Ci0JCQlzZXRfdGltZSgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fQ1JJVElDQUxfU1VTUEVORDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwppbmRleCA1Mjk5YzViLi42YzUyMTgyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFg4Nl9FX1BPV0VSU0FWRVIKKwl0cmlzdGF0ZSAiVklBIEM3IEVuaGFuY2VkIFBvd2VyU2F2ZXIgKEVYUEVSSU1FTlRBTCkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBWSUEgQzcgcHJvY2Vzc29ycy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCiBjb21tZW50ICJzaGFyZWQgb3B0aW9ucyIKIAogY29uZmlnIFg4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA4ZGUzYWJlLi41NjBmNzc2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubwogb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KIG9iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfWDg2X0VfUE9XRVJTQVZFUikJCSs9IGVfcG93ZXJzYXZlci5vCiBvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubwogb2JqLSQoQ09ORklHX1NDNTIwX0NQVUZSRVEpCQkrPSBzYzUyMF9mcmVxLm8KIG9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNkOThlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IERhdmUgSm9uZXMuIFRoYW5rcyEKKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjZGVmaW5lIEVQU19CUkFORF9DN00JMAorI2RlZmluZSBFUFNfQlJBTkRfQzcJMQorI2RlZmluZSBFUFNfQlJBTkRfRURFTgkyCisjZGVmaW5lIEVQU19CUkFORF9DMwkzCisKK3N0cnVjdCBlcHNfY3B1X2RhdGEgeworCXUzMiBmc2I7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGZyZXFfdGFibGVbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXBzX2NwdV9kYXRhICplcHNfY3B1W05SX0NQVVNdOworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBzX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7CisJdTMyIGxvLCBoaTsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCWNlbnRhdXIgPSBlcHNfY3B1W2NwdV07CisJaWYgKGNlbnRhdXIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwlyZXR1cm4gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGVwc19zZXRfc3RhdGUoc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1ciwKKwkJCSB1bnNpZ25lZCBpbnQgY3B1LAorCQkJIHUzMiBkZXN0X3N0YXRlKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXUzMiBsbywgaGk7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlmcmVxcy5vbGQgPSBlcHNfZ2V0KGNwdSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChkZXN0X3N0YXRlID4+IDgpICYgMHhmZik7CisJZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBXYWl0IHdoaWxlIENQVSBpcyBidXN5ICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJaSA9IDA7CisJd2hpbGUgKGxvICYgKCgxIDw8IDE2KSB8ICgxIDw8IDE3KSkpIHsKKwkJdWRlbGF5KDE2KTsKKwkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJCWkrKzsKKwkJaWYgKHVubGlrZWx5KGkgPiA2NCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHBvc3RjaGFuZ2U7CisJCX0KKwl9CisJLyogU2V0IG5ldyBtdWx0aXBsaWVyIGFuZCB2b2x0YWdlICovCisJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIGRlc3Rfc3RhdGUgJiAweGZmZmYsIDApOworCS8qIFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCQlpKys7CisJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwb3N0Y2hhbmdlOworCQl9CisJfSB3aGlsZSAobG8gJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KK3Bvc3RjaGFuZ2U6CisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlcHNfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwl1bnNpZ25lZCBpbnQgZGVzdF9zdGF0ZTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGVwc19jcHVbY3B1XSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKKworCWlmICh1bmxpa2VseShjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJJmVwc19jcHVbY3B1XS0+ZnJlcV90YWJsZVswXSwKKwkJCXRhcmdldF9mcmVxLAorCQkJcmVsYXRpb24sCisJCQkmbmV3c3RhdGUpKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYWtlIGZyZXF1ZW5jeSB0cmFuc2l0aW9uICovCisJZGVzdF9zdGF0ZSA9IGNlbnRhdXItPmZyZXFfdGFibGVbbmV3c3RhdGVdLmluZGV4ICYgMHhmZmZmOworCXJldCA9IGVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBkZXN0X3N0YXRlKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgImVwczogVGltZW91dCFcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBzX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwKKwkJCSZlcHNfY3B1W3BvbGljeS0+Y3B1XS0+ZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZXBzX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBsbywgaGk7CisJdTY0IHZhbDsKKwl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKKwl1OCBtYXhfbXVsdGlwbGllciwgbWF4X3ZvbHRhZ2U7CisJdTggbWluX211bHRpcGxpZXIsIG1pbl92b2x0YWdlOworCXU4IGJyYW5kOworCXUzMiBmc2I7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZfdGFibGU7CisJaW50IGssIHN0ZXAsIHZvbHRhZ2U7CisJaW50IHJldDsKKwlpbnQgc3RhdGVzOworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgYnJhbmQgKi8KKwlwcmludGsoImVwczogRGV0ZWN0ZWQgVklBICIpOworCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKKwlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CisJc3dpdGNoKGJyYW5kKSB7CisJY2FzZSBFUFNfQlJBTkRfQzdNOgorCQlwcmludGsoIkM3LU1cbiIpOworCQlicmVhazsKKwljYXNlIEVQU19CUkFORF9DNzoKKwkJcHJpbnRrKCJDN1xuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0VERU46CisJCXByaW50aygiRWRlblxuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0MzOgorCQlwcmludGsoIkMzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwkvKiBFbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlciAqLworCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgdmFsKTsKKwlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQl2YWwgfD0gMSA8PCAxNjsKKwkJd3Jtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQkvKiBDYW4gYmUgbG9ja2VkIGF0IDAgKi8KKwkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQkJcHJpbnRrKCJlcHM6IENhbid0IGVuYWJsZSBFbmhhbmNlZCBQb3dlclNhdmVyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogUHJpbnQgdm9sdGFnZSBhbmQgbXVsdGlwbGllciAqLworCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCWN1cnJlbnRfdm9sdGFnZSA9IGxvICYgMHhmZjsKKwlwcmludGsoImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwgY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEN1cnJlbnQgbXVsdGlwbGllciA9ICVkXG4iLCBjdXJyZW50X211bHRpcGxpZXIpOworCisJLyogUHJpbnQgbGltaXRzICovCisJbWF4X3ZvbHRhZ2UgPSBoaSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOworCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKKwlwcmludGsoImVwczogSGlnaGVzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1heF9tdWx0aXBsaWVyKTsKKwltaW5fdm9sdGFnZSA9IChoaSA+PiAxNikgJiAweGZmOworCXByaW50aygiZXBzOiBMb3dlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1pbl92b2x0YWdlICogMTYgKyA3MDApOworCW1pbl9tdWx0aXBsaWVyID0gKGhpID4+IDI0KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IExvd2VzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1pbl9tdWx0aXBsaWVyKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID09IDAgfHwgbWF4X211bHRpcGxpZXIgPT0gMAorCSAgICB8fCBtaW5fbXVsdGlwbGllciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKKwkgICAgfHwgbWF4X211bHRpcGxpZXIgPD0gbWluX211bHRpcGxpZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFjIHx8IG1heF92b2x0YWdlID4gMHgxYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsYyBGU0Igc3BlZWQgKi8KKwlmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOworCS8qIENhbGMgbnVtYmVyIG9mIHAtc3RhdGVzIHN1cHBvcnRlZCAqLworCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfQzdNKQorCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKKwllbHNlCisJCXN0YXRlcyA9IDI7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIGRhdGEgYW5kIGZyZXF1ZW5jeSB0YWJsZSBmb3IgY3VycmVudCBjcHUgKi8KKwljZW50YXVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVwc19jcHVfZGF0YSkKKwkJICAgICsgKHN0YXRlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbnRhdXIpCisJCXJldHVybiAtRU5PTUVNOworCWVwc19jcHVbMF0gPSBjZW50YXVyOworCisJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KKwljZW50YXVyLT5mc2IgPSBmc2I7CisKKwkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCisJZl90YWJsZSA9ICZjZW50YXVyLT5mcmVxX3RhYmxlWzBdOworCWlmIChicmFuZCAhPSBFUFNfQlJBTkRfQzdNKSB7CisJCWZfdGFibGVbMF0uZnJlcXVlbmN5ID0gZnNiICogbWluX211bHRpcGxpZXI7CisJCWZfdGFibGVbMF0uaW5kZXggPSAobWluX211bHRpcGxpZXIgPDwgOCkgfCBtaW5fdm9sdGFnZTsKKwkJZl90YWJsZVsxXS5mcmVxdWVuY3kgPSBmc2IgKiBtYXhfbXVsdGlwbGllcjsKKwkJZl90YWJsZVsxXS5pbmRleCA9IChtYXhfbXVsdGlwbGllciA8PCA4KSB8IG1heF92b2x0YWdlOworCQlmX3RhYmxlWzJdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0gZWxzZSB7CisJCWsgPSAwOworCQlzdGVwID0gKChtYXhfdm9sdGFnZSAtIG1pbl92b2x0YWdlKSAqIDI1NikKKwkJCS8gKG1heF9tdWx0aXBsaWVyIC0gbWluX211bHRpcGxpZXIpOworCQlmb3IgKGkgPSBtaW5fbXVsdGlwbGllcjsgaSA8PSBtYXhfbXVsdGlwbGllcjsgaSsrKSB7CisJCQl2b2x0YWdlID0gKGsgKiBzdGVwKSAvIDI1NiArIG1pbl92b2x0YWdlOworCQkJZl90YWJsZVtrXS5mcmVxdWVuY3kgPSBmc2IgKiBpOworCQkJZl90YWJsZVtrXS5pbmRleCA9IChpIDw8IDgpIHwgdm9sdGFnZTsKKwkJCWsrKzsKKwkJfQorCQlmX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0KKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDE0MDAwMDsgLyogODQ0bVYgLT4gNzAwbVYgaW4gbnMgKi8KKwlwb2xpY3ktPmN1ciA9IGZzYiAqIGN1cnJlbnRfbXVsdGlwbGllcjsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCAmY2VudGF1ci0+ZnJlcV90YWJsZVswXSk7CisJaWYgKHJldCkgeworCQlrZnJlZShjZW50YXVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cigmY2VudGF1ci0+ZnJlcV90YWJsZVswXSwgcG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwc19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1MzIgbG8sIGhpOworCisJaWYgKGVwc19jcHVbY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljZW50YXVyID0gZXBzX2NwdVtjcHVdOworCisJLyogR2V0IG1heCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwkvKiBTZXQgbWF4IGZyZXF1ZW5jeSAqLworCWVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBoaSAmIDB4ZmZmZik7CisJLyogQnllICovCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCWtmcmVlKGVwc19jcHVbY3B1XSk7CisJZXBzX2NwdVtjcHVdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGVwc19hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGVwc19kcml2ZXIgPSB7CisJLnZlcmlmeQkJPSBlcHNfdmVyaWZ5LAorCS50YXJnZXQJCT0gZXBzX3RhcmdldCwKKwkuaW5pdAkJPSBlcHNfY3B1X2luaXQsCisJLmV4aXQJCT0gZXBzX2NwdV9leGl0LAorCS5nZXQJCT0gZXBzX2dldCwKKwkubmFtZQkJPSAiZV9wb3dlcnNhdmVyIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gZXBzX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJLyogVGhpcyBkcml2ZXIgd2lsbCB3b3JrIG9ubHkgb24gQ2VudGF1ciBDNyBwcm9jZXNzb3JzIHdpdGgKKwkgKiBFbmhhbmNlZCBTcGVlZFN0ZXAvUG93ZXJTYXZlciByZWdpc3RlcnMgKi8KKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIKKwkgICAgfHwgYy0+eDg2ICE9IDYgfHwgYy0+eDg2X21vZGVsICE9IDEwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVwc19leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmZXBzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJhZmGzIEJpbHNraSA8cmFmYWxiaWxza2lAaW50ZXJpYS5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgUG93ZXJTYXZlciBkcml2ZXIgZm9yIFZJQSBDNyBDUFUncy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZXBzX2luaXQpOworbW9kdWxlX2V4aXQoZXBzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IGEzZGI5MzMuLmI1OTg3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKQEAgLTgsMTIgKzgsMTEgQEAKICAqICBWSUEgaGF2ZSBjdXJyZW50bHkgMyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgTG9uZ2hhdWwuCiAgKiAgVmVyc2lvbiAxIChMb25naGF1bCkgdXNlcyB0aGUgQkNSMiBNU1IgYXQgMHgxMTQ3LgogICogICBJdCBpcyBwcmVzZW50IG9ubHkgaW4gU2FtdWVsIDEgKEM1QSksIFNhbXVlbCAyIChDNUIpIHN0ZXBwaW5nIDAuCi0gKiAgVmVyc2lvbiAyIG9mIGxvbmdoYXVsIGlzIHRoZSBzYW1lIGFzIHYxLCBidXQgYWRkcyB2b2x0YWdlIHNjYWxpbmcuCi0gKiAgIFByZXNlbnQgaW4gU2FtdWVsIDIgKHN0ZXBwaW5ncyAxLTcgb25seSkgKEM1QiksIGFuZCBFenJhIChDNUMpCi0gKiAgIHZvbHRhZ2Ugc2NhbGluZyBzdXBwb3J0IGhhcyBjdXJyZW50bHkgYmVlbiBkaXNhYmxlZCBpbiB0aGlzIGRyaXZlcgotICogICB1bnRpbCB3ZSBoYXZlIGNvZGUgdGhhdCBnZXRzIGl0IHJpZ2h0LgorICogIFZlcnNpb24gMiBvZiBsb25naGF1bCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdjEsIGJ1dCBhZGRzCisgKiAgIExPTkdIQVVMIE1TUiBmb3IgcHVycG9zZSBvZiBib3RoIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorICogICBQcmVzZW50IGluIFNhbXVlbCAyIChzdGVwcGluZ3MgMS03IG9ubHkpIChDNUIpLCBhbmQgRXpyYSAoQzVDKS4KICAqICBWZXJzaW9uIDMgb2YgbG9uZ2hhdWwgZ290IHJlbmFtZWQgdG8gUG93ZXJzYXZlciBhbmQgcmVkZXNpZ25lZAotICogICB0byB1c2UgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KKyAqICAgdG8gdXNlIG9ubHkgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KICAqICAgSXQgaXMgcHJlc2VudCBpbiBFenJhLVQgKEM1TSksIE5laGVtaWFoIChDNVgpIGFuZCBhYm92ZS4KICAqICAgSXQncyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBmZWF0dXJlIHdpc2UgdG8gbG9uZ2hhdWwgdjIsIHRob3VnaAogICogICB0aGVyZSBpcyBwcm92aXNpb24gZm9yIHNjYWxpbmcgRlNCIHRvbywgYnV0IHRoaXMgZG9lc24ndCB3b3JrCkBAIC01MSwxMCArNTAsMTIgQEAKICNkZWZpbmUJQ1BVX0VaUkEJMwogI2RlZmluZQlDUFVfRVpSQV9UCTQKICNkZWZpbmUJQ1BVX05FSEVNSUFICTUKKyNkZWZpbmUJQ1BVX05FSEVNSUFIX0MJNgogCiAvKiBGbGFncyAqLwogI2RlZmluZSBVU0VfQUNQSV9DMwkJKDEgPDwgMSkKICNkZWZpbmUgVVNFX05PUlRIQlJJREdFCQkoMSA8PCAyKQorI2RlZmluZSBVU0VfVlQ4MjM1CQkoMSA8PCAzKQogCiBzdGF0aWMgaW50IGNwdV9tb2RlbDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtc2NhbGVzPTE2OwpAQCAtNjMsNyArNjQsOCBAQAogc3RhdGljIHN0cnVjdCBtVl9wb3MgKnZybV9tVl90YWJsZTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICptVl92cm1fdGFibGU7CiBzdHJ1Y3QgZl9tc3IgewotCXVuc2lnbmVkIGNoYXIgdnJtOworCXU4IHZybTsKKwl1OCBwb3M7CiB9Owogc3RhdGljIHN0cnVjdCBmX21zciBmX21zcl90YWJsZVszMl07CiAKQEAgLTczLDEwICs3NSwxMCBAQAogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBOVUxMOwogc3RhdGljIHU4IGxvbmdoYXVsX2ZsYWdzOworc3RhdGljIHU4IGxvbmdoYXVsX3BvczsKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyBpbnQgc2NhbGVfdm9sdGFnZTsKLXN0YXRpYyBpbnQgaWdub3JlX2xhdGVuY3k7CiAKICNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAibG9uZ2hhdWwiLCBtc2cpCiAKQEAgLTE2NCwyNiArMTY2LDQ3IEBACiBzdGF0aWMgdm9pZCBkb19wb3dlcnNhdmVyKGludCBjeF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgpCiB7CiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCXU4IGRlc3RfcG9zOwogCXUzMiB0OwogCisJZGVzdF9wb3MgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0ucG9zOworCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisJLyogU2V0dXAgbmV3IGZyZXF1ZW5jeSAqLwogCWxvbmdoYXVsLmJpdHMuUmV2aXNpb25LZXkgPSBsb25naGF1bC5iaXRzLlJldmlzaW9uSUQ7CiAJbG9uZ2hhdWwuYml0cy5Tb2Z0QnVzUmF0aW8gPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZjsKIAlsb25naGF1bC5iaXRzLlNvZnRCdXNSYXRpbzQgPSAoY2xvY2tfcmF0aW9faW5kZXggJiAweDEwKSA+PiA0OwotCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKLQotCWlmIChjYW5fc2NhbGVfdm9sdGFnZSkgeworCS8qIFNldHVwIG5ldyB2b2x0YWdlICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlKQogCQlsb25naGF1bC5iaXRzLlNvZnRWSUQgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0udnJtOwotCQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAxOwotCX0KLQogCS8qIFN5bmMgdG8gdGltZXIgdGljayAqLwogCXNhZmVfaGFsdCgpOworCS8qIFJhaXNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA8IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CisKIAkvKiBDaGFuZ2UgZnJlcXVlbmN5IG9uIG5leHQgaGFsdCBvciBzbGVlcCAqLworCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKIAl3cm1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKIAlpZiAoIWN4X2FkZHJlc3MpIHsKIAkJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQkJLyogSW52b2tlIEMxICovCiAJCWhhbHQoKTsKIAl9IGVsc2UgewogCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwpAQCAtMTkzLDEyICsyMTYsMjkgQEAKIAkJdCA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAl9CiAJLyogRGlzYWJsZSBidXMgcmF0aW8gYml0ICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsb25naGF1bC5iaXRzLlJldmlzaW9uS2V5ID0gbG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEOwogCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRCU0VMID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAwOwogCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJLyogUmVkdWNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA+IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CiB9CiAKIC8qKgpAQCAtMjU3LDI2ICsyOTcsMTkgQEAKIAkvKgogCSAqIExvbmdoYXVsIHYxLiAoU2FtdWVsW0M1QV0gYW5kIFNhbXVlbDIgc3RlcHBpbmcgMFtDNUJdKQogCSAqIFNvZnR3YXJlIGNvbnRyb2xsZWQgbXVsdGlwbGllcnMgb25seS4KLQkgKgotCSAqICpOQiogVW50aWwgd2UgZ2V0IHZvbHRhZ2Ugc2NhbGluZyB3b3JraW5nIHYxICYgdjIgYXJlIHRoZSBzYW1lIGNvZGUuCi0JICogTG9uZ2hhdWwgdjIgYXBwZWFycyBpbiBTYW11ZWwyIFN0ZXBwaW5ncyAxLT43IFtDNWJdIGFuZCBFenJhIFtDNUNdCiAJICovCiAJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgotCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKIAkJZG9fbG9uZ2hhdWwxKGNsb2NrX3JhdGlvX2luZGV4KTsKIAkJYnJlYWs7CiAKIAkvKgorCSAqIExvbmdoYXVsIHYyIGFwcGVhcnMgaW4gU2FtdWVsMiBTdGVwcGluZ3MgMS0+NyBbQzVCXSBhbmQgRXpyYSBbQzVDXQorCSAqCiAJICogTG9uZ2hhdWwgdjMgKGFrYSBQb3dlcnNhdmVyKS4gKEV6cmEtVCBbQzVNXSAmIE5laGVtaWFoIFtDNU5dKQotCSAqIFdlIGNhbiBzY2FsZSB2b2x0YWdlIHdpdGggdGhpcyB0b28sIGJ1dCB0aGF0J3MgY3VycmVudGx5Ci0JICogZGlzYWJsZWQgdW50aWwgd2UgY29tZSB1cCB3aXRoIGEgZGVjZW50ICdtYXRjaCBmcmVxIHRvIHZvbHRhZ2UnCi0JICogYWxnb3JpdGhtLgotCSAqIFdoZW4gd2UgYWRkIHZvbHRhZ2Ugc2NhbGluZywgd2Ugd2lsbCBhbHNvIG5lZWQgdG8gZG8gdGhlCi0JICogdm9sdGFnZS9mcmVxIHNldHRpbmcgaW4gb3JkZXIgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24KLQkgKiBvZiBzY2FsaW5nIChsaWtlIHdlIGRvIGluIHBvd2Vybm93LWs3LmMpCiAJICogTmVoZW1pYWggY2FuIGRvIEZTQiBzY2FsaW5nIHRvbywgYnV0IHRoaXMgaGFzIG5ldmVyIGJlZW4gcHJvdmVuCiAJICogdG8gd29yayBpbiBwcmFjdGljZS4KIAkgKi8KKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CiAJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CiAJCWlmIChsb25naGF1bF9mbGFncyAmIFVTRV9BQ1BJX0MzKSB7CiAJCQkvKiBEb24ndCBhbGxvdyB3YWtldXAgKi8KQEAgLTMwMSw2ICszMzQsNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogCisJZnJlcXMubmV3ID0gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7CiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiB9CiAKQEAgLTMxNSwzMSArMzQ5LDE5IEBACiAKICNkZWZpbmUgUk9VTkRJTkcJMHhmCiAKLXN0YXRpYyBpbnQgX2d1ZXNzKGludCBndWVzcywgaW50IG11bHQpCi17Ci0JaW50IHRhcmdldDsKLQotCXRhcmdldCA9ICgobXVsdC8xMCkqZ3Vlc3MpOwotCWlmIChtdWx0JTEwICE9IDApCi0JCXRhcmdldCArPSAoZ3Vlc3MvMik7Ci0JdGFyZ2V0ICs9IFJPVU5ESU5HLzI7Ci0JdGFyZ2V0ICY9IH5ST1VORElORzsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi0KIHN0YXRpYyBpbnQgZ3Vlc3NfZnNiKGludCBtdWx0KQogewotCWludCBzcGVlZCA9IChjcHVfa2h6LzEwMDApOworCWludCBzcGVlZCA9IGNwdV9raHogLyAxMDAwOwogCWludCBpOwotCWludCBzcGVlZHNbXSA9IHsgNjYsIDEwMCwgMTMzLCAyMDAgfTsKKwlpbnQgc3BlZWRzW10gPSB7IDY2NiwgMTAwMCwgMTMzMywgMjAwMCB9OworCWludCBmX21heCwgZl9taW47CiAKLQlzcGVlZCArPSBST1VORElORy8yOwotCXNwZWVkICY9IH5ST1VORElORzsKLQotCWZvciAoaT0wOyBpPDQ7IGkrKykgewotCQlpZiAoX2d1ZXNzKHNwZWVkc1tpXSwgbXVsdCkgPT0gc3BlZWQpCi0JCQlyZXR1cm4gc3BlZWRzW2ldOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZl9tYXggPSAoKHNwZWVkc1tpXSAqIG11bHQpICsgNTApIC8gMTAwOworCQlmX21heCArPSAoUk9VTkRJTkcgLyAyKTsKKwkJZl9taW4gPSBmX21heCAtIFJPVU5ESU5HOworCQlpZiAoKHNwZWVkIDw9IGZfbWF4KSAmJiAoc3BlZWQgPj0gZl9taW4pKQorCQkJcmV0dXJuIHNwZWVkc1tpXSAvIDEwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM0Nyw2NyArMzY5LDQwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2dldF9yYW5nZXModm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsdWU7Ci0JdW5zaWduZWQgaW50IGV6cmFfdF9tdWx0aXBsaWVyc1szMl09IHsKLQkJCTkwLCAgMzAsICA0MCwgMTAwLCAgNTUsICAzNSwgIDQ1LCAgOTUsCi0JCQk1MCwgIDcwLCAgODAsICA2MCwgMTIwLCAgNzUsICA4NSwgIDY1LAotCQkJLTEsIDExMCwgMTIwLCAgLTEsIDEzNSwgMTE1LCAxMjUsIDEwNSwKLQkJCTEzMCwgMTUwLCAxNjAsIDE0MCwgIC0xLCAxNTUsICAtMSwgMTQ1IH07CiAJdW5zaWduZWQgaW50IGosIGsgPSAwOwotCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKLQlpbnQgbXVsdCA9IDA7CisJaW50IG11bHQ7CiAKLQlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKLQljYXNlIFRZUEVfTE9OR0hBVUxfVjE6Ci0JY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgotCQkvKiBVZ2gsIExvbmdoYXVsIHYxIGRpZG4ndCBoYXZlIHRoZSBtaW4vbWF4IE1TUnMuCi0JCSAgIEFzc3VtZSBtaW49My4weCAmIG1heCA9IHdoYXRldmVyIHdlIGJvb3RlZCBhdC4gKi8KLQkJbWlubXVsdCA9IDMwOwotCQltYXhtdWx0ID0gbXVsdCA9IGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgotCQkvKiBFenJhLVQgKi8KLQkJaWYgKGNwdV9tb2RlbD09Q1BVX0VaUkFfVCkgewotCQkJbWlubXVsdCA9IDMwOwotCQkJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOwotCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWF4TUh6QlI7Ci0JCQlpZiAobG9uZ2hhdWwuYml0cy5NYXhNSHpCUjQpCi0JCQkJaW52YWx1ZSArPSAxNjsKLQkJCW1heG11bHQgPSBtdWx0ID0gZXpyYV90X211bHRpcGxpZXJzW2ludmFsdWVdOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBOZWhlbWlhaCAqLwotCQlpZiAoY3B1X21vZGVsPT1DUFVfTkVIRU1JQUgpIHsKLQkJCXJkbXNybCAoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKLQotCQkJLyoKLQkJCSAqIFRPRE86IFRoaXMgY29kZSB3b3JrcywgYnV0IHJhaXNlcyBhIGxvdCBvZiBxdWVzdGlvbnMuCi0JCQkgKiAtIFNvbWUgTmVoZW1pYWgncyBzZWVtIHRvIGhhdmUgYnJva2VuIE1pbi9NYXhNSHpCUidzLgotCQkJICogICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBoYXJkY29kZWQgbXVsdGlwbGllciBvZiA0LjB4Ci0JCQkgKiAgIGZvciB0aGUgbWluaW1pbXVtIHNwZWVkLCBhbmQgdGhlIHNwZWVkIHdlIGJvb3RlZCB1cCBhdCBmb3IgdGhlIG1heC4KLQkJCSAqICAgVGhpcyBpcyBkb25lIGluIGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpIGJ5IHJlYWRpbmcgdGhlIEVCTENSIHJlZ2lzdGVyLgotCQkJICogLSBBY2NvcmRpbmcgdG8gc29tZSBWSUEgZG9jdW1lbnRhdGlvbiBFQkxDUiBpcyBvbmx5Ci0JCQkgKiAgIGluIHByZS1OZWhlbWlhaCBDM3MuIEhvdyB0aGlzIHN0aWxsIHdvcmtzIGlzIGEgbXlzdGVyeS4KLQkJCSAqICAgV2UncmUgcG9zc2libHkgdXNpbmcgc29tZXRoaW5nIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0JCQkgKiAgIEJ1dCBpdCB3b3Jrcywgc28gd2UgZG9uJ3QgZ3J1bWJsZS4KLQkJCSAqLwotCQkJbWlubXVsdD00MDsKLQkJCW1heG11bHQgPSBtdWx0ID0gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7Ci0JCQlicmVhazsKLQkJfQorCS8qIEdldCBjdXJyZW50IGZyZXF1ZW5jeSAqLworCW11bHQgPSBsb25naGF1bF9nZXRfY3B1X211bHQoKTsKKwlpZiAobXVsdCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW52YWxpZCAocmVzZXJ2ZWQpIG11bHRpcGxpZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZzYiA9IGd1ZXNzX2ZzYihtdWx0KTsKKwlpZiAoZnNiID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIEdldCBtYXggbXVsdGlwbGllciAtIGFzIHdlIGFsd2F5cyBkaWQuCisJICogTG9uZ2hhdWwgTVNSIGlzIHVzZWZ1bGwgb25seSB3aGVuIHZvbHRhZ2Ugc2NhbGluZyBpcyBlbmFibGVkLgorCSAqIEMzIGlzIGJvb3RpbmcgYXQgbWF4IGFueXdheS4gKi8KKwltYXhtdWx0ID0gbXVsdDsKKwkvKiBHZXQgbWluIG11bHRpcGxpZXIgKi8KKwlzd2l0Y2ggKGNwdV9tb2RlbCkgeworCWNhc2UgQ1BVX05FSEVNSUFIOgorCQltaW5tdWx0ID0gNTA7CisJCWJyZWFrOworCWNhc2UgQ1BVX05FSEVNSUFIX0M6CisJCW1pbm11bHQgPSA0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWlubXVsdCA9IDMwOworCQlicmVhazsKKwl9CiAKIAlkcHJpbnRrICgiTWluTXVsdDolZC4lZHggTWF4TXVsdDolZC4lZHhcbiIsCiAJCSBtaW5tdWx0LzEwLCBtaW5tdWx0JTEwLCBtYXhtdWx0LzEwLCBtYXhtdWx0JTEwKTsKIAotCWlmIChmc2IgPT0gMCkgewotCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaGlnaGVzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWF4bXVsdCk7CiAJbG93ZXN0X3NwZWVkID0gY2FsY19zcGVlZChtaW5tdWx0KTsKIAlkcHJpbnRrICgiRlNCOiVkTUh6ICBMb3dlc3Qgc3BlZWQ6ICVzICAgSGlnaGVzdCBzcGVlZDolc1xuIiwgZnNiLApAQCAtNDU1LDYgKzQ1MCw3IEBACiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOwogCXN0cnVjdCBtVl9wb3MgbWludmlkLCBtYXh2aWQ7CiAJdW5zaWduZWQgaW50IGosIHNwZWVkLCBwb3MsIGtIel9zdGVwLCBudW12c2NhbGVzOworCWludCBtaW5fdmlkX3NwZWVkOwogCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CiAJaWYgKCEobG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEICYgMSkpIHsKQEAgLTQ2OCwxNCArNDY0LDE0IEBACiAJCW1WX3ZybV90YWJsZSA9ICZtVl92cm04NVswXTsKIAl9IGVsc2UgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk1vYmlsZSBWUk1cbiIpOworCQlpZiAoY3B1X21vZGVsIDwgQ1BVX05FSEVNSUFIKQorCQkJcmV0dXJuOwogCQl2cm1fbVZfdGFibGUgPSAmbW9iaWxldnJtX21WWzBdOwogCQltVl92cm1fdGFibGUgPSAmbVZfbW9iaWxldnJtWzBdOwogCX0KIAogCW1pbnZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1pbmltdW1WSURdOwogCW1heHZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1heGltdW1WSURdOwotCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7Ci0Ja0h6X3N0ZXAgPSAoaGlnaGVzdF9zcGVlZCAtIGxvd2VzdF9zcGVlZCkgLyBudW12c2NhbGVzOwogCiAJaWYgKG1pbnZpZC5tViA9PSAwIHx8IG1heHZpZC5tViA9PSAwIHx8IG1pbnZpZC5tViA+IG1heHZpZC5tVikgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkJvZ3VzIHZhbHVlcyBNaW46JWQuJTAzZCBNYXg6JWQuJTAzZC4gIgpAQCAtNDkxLDIwICs0ODcsNTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJNYXggVklEPSVkLiUwM2QgIE1pbiBWSUQ9JWQuJTAzZCwgJWQgcG9zc2libGUgdm9sdGFnZSBzY2FsZXNcbiIsCisJLyogSG93IG1hbnkgdm9sdGFnZSBzdGVwcyAqLworCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJIk1heCBWSUQ9JWQuJTAzZCAgIgorCQkiTWluIFZJRD0lZC4lMDNkLCAiCisJCSIlZCBwb3NzaWJsZSB2b2x0YWdlIHNjYWxlc1xuIiwKIAkJbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwLAogCQltaW52aWQubVYvMTAwMCwgbWludmlkLm1WJTEwMDAsCiAJCW51bXZzY2FsZXMpOwogCisJLyogQ2FsY3VsYXRlIG1heCBmcmVxdWVuY3kgYXQgbWluIHZvbHRhZ2UgKi8KKwlqID0gbG9uZ2hhdWwuYml0cy5NaW5NSHpCUjsKKwlpZiAobG9uZ2hhdWwuYml0cy5NaW5NSHpCUjQpCisJCWogKz0gMTY7CisJbWluX3ZpZF9zcGVlZCA9IGVibGNyX3RhYmxlW2pdOworCWlmIChtaW5fdmlkX3NwZWVkID09IC0xKQorCQlyZXR1cm47CisJc3dpdGNoIChsb25naGF1bC5iaXRzLk1pbk1IekZTQikgeworCWNhc2UgMDoKKwkJbWluX3ZpZF9zcGVlZCAqPSAxMzMzMzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltaW5fdmlkX3NwZWVkICo9IDEwMDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCW1pbl92aWRfc3BlZWQgKj0gNjY2NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisJaWYgKG1pbl92aWRfc3BlZWQgPj0gaGlnaGVzdF9zcGVlZCkKKwkJcmV0dXJuOworCS8qIENhbGN1bGF0ZSBrSHogZm9yIG9uZSB2b2x0YWdlIHN0ZXAgKi8KKwlrSHpfc3RlcCA9IChoaWdoZXN0X3NwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBudW12c2NhbGVzOworCisKIAlqID0gMDsKIAl3aGlsZSAobG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKSB7CiAJCXNwZWVkID0gbG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5OwotCQlwb3MgPSAoc3BlZWQgLSBsb3dlc3Rfc3BlZWQpIC8ga0h6X3N0ZXAgKyBtaW52aWQucG9zOworCQlpZiAoc3BlZWQgPiBtaW5fdmlkX3NwZWVkKQorCQkJcG9zID0gKHNwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBrSHpfc3RlcCArIG1pbnZpZC5wb3M7CisJCWVsc2UKKwkJCXBvcyA9IG1pbnZpZC5wb3M7CiAJCWZfbXNyX3RhYmxlW2xvbmdoYXVsX3RhYmxlW2pdLmluZGV4XS52cm0gPSBtVl92cm1fdGFibGVbcG9zXTsKKwkJZl9tc3JfdGFibGVbbG9uZ2hhdWxfdGFibGVbal0uaW5kZXhdLnBvcyA9IHBvczsKIAkJaisrOwogCX0KIAorCWxvbmdoYXVsX3BvcyA9IG1heHZpZC5wb3M7CiAJY2FuX3NjYWxlX3ZvbHRhZ2UgPSAxOworCXByaW50ayhLRVJOX0lORk8gUEZYICJWb2x0YWdlIHNjYWxpbmcgZW5hYmxlZC4gIgorCQkiVXNlIG9mIFwiY29uc2VydmF0aXZlXCIgZ292ZXJub3IgaXMgaGlnaGx5IHJlY29tbWVuZGVkLlxuIik7CiB9CiAKIApAQCAtNTczLDIwICs2MDgsNTEgQEAKIAlpZiAoZGV2ICE9IE5VTEwpIHsKIAkJLyogRW5hYmxlIGFjY2VzcyB0byBwb3J0IDB4MjIgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKLQkJaWYgKCAhKHBjaV9jbWQgJiAxPDw3KSApIHsKKwkJaWYgKCEocGNpX2NtZCAmIDE8PDcpKSB7CiAJCQlwY2lfY21kIHw9IDE8PDc7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWcsIHBjaV9jbWQpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKKwkJCWlmICghKHBjaV9jbWQgJiAxPDw3KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkJIkNhbid0IGVuYWJsZSBhY2Nlc3MgdG8gcG9ydCAweDIyLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxvbmdoYXVsX3NldHVwX3Z0ODIzNSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTggcGNpX2NtZDsKKworCS8qIEZpbmQgVlQ4MjM1IHNvdXRoYnJpZGdlICovCisJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1LCBOVUxMKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJLyogU2V0IHRyYW5zaXRpb24gdGltZSB0byBtYXggKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGVjLCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGVjLCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU0LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDcpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU0LCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU1LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgfD0gMSA8PCA3OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU1LCBwY2lfY21kKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKIAljaGFyICpjcHVuYW1lPU5VTEw7CiAJaW50IHJldDsKKwl1MzIgbG8sIGhpOworCWludCB2dDgyMzVfcHJlc2VudDsKIAogCS8qIENoZWNrIHdoYXQgd2UgaGF2ZSBvbiB0aGlzIG1vdGhlcmJvYXJkICovCiAJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKQEAgLTU5OSwxNiArNjY1LDIwIEBACiAJCWJyZWFrOwogCiAJY2FzZSA3OgotCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDA6CisJCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsIDInIFtDNUJdIjsKLQkJCS8qIE5vdGUsIHRoaXMgaXMgbm90IGEgdHlwbywgZWFybHkgU2FtdWVsMidzIGhhZCBTYW11ZWwxIHJhdGlvcy4gKi8KLQkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIHNhbXVlbDFfY2xvY2tfcmF0aW8sIHNpemVvZihzYW11ZWwxX2Nsb2NrX3JhdGlvKSk7Ci0JCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLCBzaXplb2Yoc2FtdWVsMl9lYmxjcikpOworCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkCisJCQkgKiBTYW11ZWwxIHJhdGlvcy4gKi8KKwkJCW1lbWNweShjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywKKwkJCQlzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5KGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLAorCQkJCXNpemVvZihzYW11ZWwyX2VibGNyKSk7CiAJCQlicmVhazsKIAkJY2FzZSAxIC4uLiAxNToKKwkJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YyOwogCQkJaWYgKGMtPng4Nl9tYXNrIDwgOCkgewogCQkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJCWNwdW5hbWUgPSAiQzMgJ1NhbXVlbCAyJyBbQzVCXSI7CkBAIC02MTYsOCArNjg2LDEwIEBACiAJCQkJY3B1X21vZGVsID0gQ1BVX0VaUkE7CiAJCQkJY3B1bmFtZSA9ICJDMyAnRXpyYScgW0M1Q10iOwogCQkJfQotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgZXpyYV9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmFfZWJsY3IsIHNpemVvZihlenJhX2VibGNyKSk7CisJCQltZW1jcHkoY2xvY2tfcmF0aW8sIGV6cmFfY2xvY2tfcmF0aW8sCisJCQkJc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweShlYmxjcl90YWJsZSwgZXpyYV9lYmxjciwKKwkJCQlzaXplb2YoZXpyYV9lYmxjcikpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC02MzIsMjQgKzcwNCwyNCBAQAogCQlicmVhazsKIAogCWNhc2UgOToKLQkJY3B1X21vZGVsID0gQ1BVX05FSEVNSUFIOwogCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9QT1dFUlNBVkVSOwotCQludW1zY2FsZXM9MzI7CisJCW51bXNjYWxlcyA9IDMyOworCQltZW1jcHkoY2xvY2tfcmF0aW8sCisJCSAgICAgICBuZWhlbWlhaF9jbG9ja19yYXRpbywKKwkJICAgICAgIHNpemVvZihuZWhlbWlhaF9jbG9ja19yYXRpbykpOworCQltZW1jcHkoZWJsY3JfdGFibGUsIG5laGVtaWFoX2VibGNyLCBzaXplb2YobmVoZW1pYWhfZWJsY3IpKTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDAgLi4uIDE6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBBJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYV9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYV9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2FfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEEnIFtDNVhMT0VdIjsKIAkJCWJyZWFrOwogCQljYXNlIDIgLi4uIDQ6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBCJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYl9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYl9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2JfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEInIFtDNVhMT0hdIjsKIAkJCWJyZWFrOwogCQljYXNlIDUgLi4uIDE1OgotCQkJY3B1bmFtZSA9ICJDMyAnTmVoZW1pYWggQycgW0M1Tl0iOwotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgbmVoZW1pYWhfY19jbG9ja19yYXRpbywgc2l6ZW9mKG5laGVtaWFoX2NfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIG5laGVtaWFoX2NfZWJsY3IsIHNpemVvZihuZWhlbWlhaF9jX2VibGNyKSk7CisJCQljcHVfbW9kZWwgPSBDUFVfTkVIRU1JQUhfQzsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEMnIFtDNVBdIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtNjU4LDYgKzczMCwxMyBAQAogCQljcHVuYW1lID0gIlVua25vd24iOwogCQlicmVhazsKIAl9CisJLyogQ2hlY2sgTG9uZ2hhdWwgdmVyLiAyICovCisJaWYgKGxvbmdoYXVsX3ZlcnNpb24gPT0gVFlQRV9MT05HSEFVTF9WMikgeworCQlyZG1zcihNU1JfVklBX0xPTkdIQVVMLCBsbywgaGkpOworCQlpZiAobG8gPT0gMCAmJiBoaSA9PSAwKQorCQkJLyogTG9va3MgbGlrZSBNU1IgaXNuJ3QgcHJlc2VudCAqLworCQkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfTE9OR0hBVUxfVjE7CisJfQogCiAJcHJpbnRrIChLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CiAJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CkBAIC02NzAsMTUgKzc0OSwxOCBAQAogCQlicmVhazsKIAl9OwogCisJLyogRG9lc24ndCBodXJ0ICovCisJdnQ4MjM1X3ByZXNlbnQgPSBsb25naGF1bF9zZXR1cF92dDgyMzUoKTsKKwogCS8qIEZpbmQgQUNQSSBkYXRhIGZvciBwcm9jZXNzb3IgKi8KLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgICAmbG9uZ2hhdWxfd2Fsa19jYWxsYmFjaywgTlVMTCwgKHZvaWQgKikmcHIpOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQlBQ1BJX1VJTlQzMl9NQVgsICZsb25naGF1bF93YWxrX2NhbGxiYWNrLAorCQkJCU5VTEwsICh2b2lkICopJnByKTsKIAogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgQzMgc3RhdGUgKi8KLQlpZiAoKHByICE9IE5VTEwpICYmIChsb25naGF1bF92ZXJzaW9uID09IFRZUEVfUE9XRVJTQVZFUikpIHsKKwlpZiAocHIgIT0gTlVMTCAmJiBsb25naGF1bF92ZXJzaW9uICE9IFRZUEVfTE9OR0hBVUxfVjEpIHsKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MzXTsKLQkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJgotCQkgICAoY3gtPmxhdGVuY3kgPD0gMTAwMCB8fCBpZ25vcmVfbGF0ZW5jeSAhPSAwKSApIHsKKwkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJiBjeC0+bGF0ZW5jeSA8PSAxMDAwKSB7CiAJCQlsb25naGF1bF9mbGFncyB8PSBVU0VfQUNQSV9DMzsKIAkJCWdvdG8gcHJpbnRfc3VwcG9ydF90eXBlOwogCQl9CkBAIC02ODgsOCArNzcwLDExIEBACiAJCWxvbmdoYXVsX2ZsYWdzIHw9IFVTRV9OT1JUSEJSSURHRTsKIAkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CiAJfQotCi0JLyogTm8gQUNQSSBDMyBvciB3ZSBjYW4ndCB1c2UgaXQgKi8KKwkvKiBVc2UgVlQ4MjM1IHNvdXRoYnJpZGdlIGlmIHByZXNlbnQgKi8KKwlpZiAobG9uZ2hhdWxfdmVyc2lvbiA9PSBUWVBFX1BPV0VSU0FWRVIgJiYgdnQ4MjM1X3ByZXNlbnQpIHsKKwkJbG9uZ2hhdWxfZmxhZ3MgfD0gVVNFX1ZUODIzNTsKKwkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CisJfQogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgYnVzIG1hc3RlciBhcmJpdGVyIGRpc2FibGUgKi8KIAlpZiAoKHByID09IE5VTEwpIHx8ICEocHItPmZsYWdzLmJtX2NvbnRyb2wpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlgKQEAgLTY5OCwxOCArNzgzLDE4IEBACiAJfQogCiBwcmludF9zdXBwb3J0X3R5cGU6Ci0JaWYgKCEobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7Ci0JfSBlbHNlIHsKKwlpZiAobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpCiAJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgbm9ydGhicmlkZ2Ugc3VwcG9ydC5cbiIpOwotCX0KKwllbHNlIGlmIChsb25naGF1bF9mbGFncyAmIFVTRV9WVDgyMzUpCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgVlQ4MjM1IHN1cHBvcnQuXG4iKTsKKwllbHNlCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7CiAKIAlyZXQgPSBsb25naGF1bF9nZXRfcmFuZ2VzKCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChsb25naGF1bF92ZXJzaW9uPT1UWVBFX0xPTkdIQVVMX1YyIHx8IGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfUE9XRVJTQVZFUikgJiYKLQkJIChzY2FsZV92b2x0YWdlICE9IDApKQorCWlmICgobG9uZ2hhdWxfdmVyc2lvbiAhPSBUWVBFX0xPTkdIQVVMX1YxKSAmJiAoc2NhbGVfdm9sdGFnZSAhPSAwKSkKIAkJbG9uZ2hhdWxfc2V0dXBfdm9sdGFnZXNjYWxpbmcoKTsKIAogCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CkBAIC03OTcsOCArODgyLDYgQEAKIAogbW9kdWxlX3BhcmFtIChzY2FsZV92b2x0YWdlLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzY2FsZV92b2x0YWdlLCAiU2NhbGUgdm9sdGFnZSBvZiBwcm9jZXNzb3IiKTsKLW1vZHVsZV9wYXJhbShpZ25vcmVfbGF0ZW5jeSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2xhdGVuY3ksICJTa2lwIEFDUEkgQzMgbGF0ZW5jeSB0ZXN0Iik7CiAKIE1PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdoYXVsIGRyaXZlciBmb3IgVklBIEN5cml4IHByb2Nlc3NvcnMuIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmgKaW5kZXggYmM0NjgyYS4uYmIwYTA0YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApAQCAtMjM1LDQ5ICsyMzUsMTQgQEAKIC8qCiAgKiBWSUEgQzMgTmVoZW1pYWggKi8KIAotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfY2xvY2tfcmF0aW9bMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jbG9ja19yYXRpb1szMl0gPSB7CiAJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCiAJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLwogCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwogCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwogCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCi0JNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCi0JNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCi0JNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCi0JODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCi0JNTAsICAvKiAxMDExIC0+ICA1LjB4ICovCi0JNjUsICAvKiAxMTAwIC0+ICA2LjV4ICovCi0JNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCi0JODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCi0JMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCi0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JLTEsICAvKiAwMDAxIC0+IFJFU0VSVkVEICovCi0JMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JMTA1LCAvKiAwMTAwIC0+IDEwLjV4ICovCi0JMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCi0JMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCi0JMTM1LCAvKiAwMTExIC0+IDEzLjV4ICovCi0JMTQwLCAvKiAxMDAwIC0+IDE0LjB4ICovCi0JMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCi0JMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCi0JMTMwLCAvKiAxMDExIC0+IDEzLjB4ICovCi0JMTQ1LCAvKiAxMTAwIC0+IDE0LjV4ICovCi0JMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCi0JLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSAgbmVoZW1pYWhfYl9jbG9ja19yYXRpb1szMl0gPSB7Ci0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLwotCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwotCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwotCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCiAJNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCiAJNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCiAJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCkBAIC0zMDUsODQgKzI3MCwxNCBAQAogCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwogfTsKIAotc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvWzMyXSA9IHsKLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCi0JLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KLQk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KLQk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KLQkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KLQkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KLQkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwotfTsKLQotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfZWJsY3JbMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2VibGNyWzMyXSA9IHsKIAk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KIAkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCiAJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCiAJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCiAJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KLQk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KLQk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KLQktMSwgIC8qIDAwMDEgLT4gUkVTRVJWRUQgKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KLQkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCi0gICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2JfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLwogCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwogCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwogCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwpAQCAtNDA4LDQyICszMDMsNiBAQAogCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwogCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCiAJMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2NfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCTQwLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JNDUsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLwotCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwotCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwotCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwotCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLwotCTYwLCAgLyogMTAxMSAtPiAgNi4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLwotCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLwotCTY1LCAgLyogMTExMSAtPiAgNi41eCAqLwotCTkwLCAgLyogMDAwMCAtPiAgOS4weCAqLwotCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLwotCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLwotCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLwotCTEzNSwgLyogMDEwMCAtPiAxMy41eCAqLwotCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLwotCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLwotCTEwNSwgLyogMDExMSAtPiAxMC41eCAqLwotCTEzMCwgLyogMTAwMCAtPiAxMy4weCAqLwotCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLwotCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLwotCTE0MCwgLyogMTAxMSAtPiAxNC4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwotCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCi0JMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgIC8qIGVuZCBvZiB0YWJsZSAgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggMmQ2NDkxNi4uZmUzYjY3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTI4OSw3ICsxMjg5LDExIEBACiAJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQogCQlnb3RvIG91dDsKIAotCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKKwkJa2h6ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZGRpZChkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJyZGlkKTsKKwllbHNlCisJCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisKIAogb3V0OgogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDBiMjlkNDEuLmUxMDA2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaHBldC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTYsMTcgKzcsMjc4IEBACiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKwogI2RlZmluZSBIUEVUX01BU0sJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKICNkZWZpbmUgSFBFVF9TSElGVAkyMgogCiAvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLwogI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKIAotc3RhdGljIHZvaWQgX19pb21lbSAqaHBldF9wdHI7CisvKgorICogSFBFVCBhZGRyZXNzIGlzIHNldCBpbiBhY3BpL2Jvb3QuYywgd2hlbiBhbiBBQ1BJIGVudHJ5IGV4aXN0cworICovCit1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQoreworCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKy8qCisgKiBIUEVUIGNvbW1hbmQgbGluZSBlbmFibGUgLyBkaXNhYmxlCisgKi8KK3N0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQoreworCWlmIChzdHIpIHsKKwkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKKwkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCitzdGF0aWMgaW5saW5lIGludCBpc19ocGV0X2NhcGFibGUodm9pZCkKK3sKKwlyZXR1cm4gKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpOworfQorCisvKgorICogSFBFVCB0aW1lciBpbnRlcnJ1cHQgZW5hYmxlIC8gZGlzYWJsZQorICovCitzdGF0aWMgaW50IGhwZXRfbGVnYWN5X2ludF9lbmFibGVkOworCisvKioKKyAqIGlzX2hwZXRfZW5hYmxlZCAtIGNoZWNrIHdoZXRoZXIgdGhlIGhwZXQgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAqLworaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBpc19ocGV0X2NhcGFibGUoKSAmJiBocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZDsKK30KKworLyoKKyAqIFdoZW4gdGhlIGhwZXQgZHJpdmVyICgvZGV2L2hwZXQpIGlzIGVuYWJsZWQsIHdlIG5lZWQgdG8gcmVzZXJ2ZQorICogdGltZXIgMCBhbmQgdGltZXIgMSBpbiBjYXNlIG9mIFJUQyBlbXVsYXRpb24uCisgKi8KKyNpZmRlZiBDT05GSUdfSFBFVAorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQgPSBocGV0X3ZpcnRfYWRkcmVzczsKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsKKwl1bnNpZ25lZCBpbnQgbnJ0aW1lcnMsIGk7CisJc3RydWN0IGhwZXRfZGF0YSBoZDsKKworCW5ydGltZXJzID0gKChpZCAmIEhQRVRfSURfTlVNQkVSKSA+PiBIUEVUX0lEX05VTUJFUl9TSElGVCkgKyAxOworCisJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCWhkLmhkX3BoeXNfYWRkcmVzcyA9IGhwZXRfYWRkcmVzczsKKwloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJaGQuaGRfbmlycXMgPSBucnRpbWVyczsKKwloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAwKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKworCWhkLmhkX2lycVswXSA9IEhQRVRfTEVHQUNZXzgyNTQ7CisJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCisJZm9yIChpID0gMjsgaSA8IG5ydGltZXJzOyB0aW1lcisrLCBpKyspCisJCWhkLmhkX2lycVtpXSA9ICh0aW1lci0+aHBldF9jb25maWcgJiBUbl9JTlRfUk9VVEVfQ05GX01BU0spID4+CisJCQlUbl9JTlRfUk9VVEVfQ05GX1NISUZUOworCisJaHBldF9hbGxvYygmaGQpOworCit9CisjZWxzZQorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKSB7IH0KKyNlbmRpZgorCisvKgorICogQ29tbW9uIGhwZXQgaW5mbworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKKworc3RhdGljIHZvaWQgaHBldF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKK3N0YXRpYyBpbnQgaHBldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpOworCisvKgorICogVGhlIGhwZXQgY2xvY2sgZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGhwZXRfY2xvY2tldmVudCA9IHsKKwkubmFtZQkJPSAiaHBldCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGhwZXRfc2V0X21vZGUsCisJLnNldF9uZXh0X2V2ZW50ID0gaHBldF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCitzdGF0aWMgdm9pZCBocGV0X3N0YXJ0X2NvdW50ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnICY9IH5IUEVUX0NGR19FTkFCTEU7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7CisJaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIgKyA0KTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworfQorCitzdGF0aWMgdm9pZCBocGV0X2VuYWJsZV9pbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnIHw9IEhQRVRfQ0ZHX0xFR0FDWTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZywgY21wLCBub3c7CisJdWludDY0X3QgZGVsdGE7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWRlbHRhID0gKCh1aW50NjRfdCkoTlNFQ19QRVJfU0VDL0haKSkgKiBocGV0X2Nsb2NrZXZlbnQubXVsdDsKKwkJZGVsdGEgPj49IGhwZXRfY2xvY2tldmVudC5zaGlmdDsKKwkJbm93ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCQljbXAgPSBub3cgKyAodW5zaWduZWQgbG9uZykgZGVsdGE7CisJCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROX1BFUklPRElDIHwKKwkJICAgICAgIEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUKKwkJICogY29uZmlnIHJlZ2lzdGVyIHNldHMgdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQKKwkJICogd3JpdGUgc2V0cyB0aGUgcGVyaW9kLgorCQkgKi8KKwkJaHBldF93cml0ZWwoY21wLCBIUEVUX1QwX0NNUCk7CisJCXVkZWxheSgxKTsKKwkJaHBldF93cml0ZWwoKHVuc2lnbmVkIGxvbmcpIGRlbHRhLCBIUEVUX1QwX0NNUCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX1BFUklPRElDOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDBfQ0ZHKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBocGV0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNudDsKKworCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwljbnQgKz0gZGVsdGE7CisJaHBldF93cml0ZWwoY250LCBIUEVUX1QwX0NNUCk7CisKKwlyZXR1cm4gKChsb25nKShocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSBjbnQgKSA+IDApOworfQorCisvKgorICogVHJ5IHRvIHNldHVwIHRoZSBIUEVUIHRpbWVyCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCXVpbnQ2NF90IGhwZXRfZnJlcTsKKworCWlmICghaXNfaHBldF9jYXBhYmxlKCkpCisJCXJldHVybiAwOworCisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisKKwkvKgorCSAqIFJlYWQgdGhlIHBlcmlvZCBhbmQgY2hlY2sgZm9yIGEgc2FuZSB2YWx1ZToKKwkgKi8KKwlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOworCWlmIChocGV0X3BlcmlvZCA8IEhQRVRfTUlOX1BFUklPRCB8fCBocGV0X3BlcmlvZCA+IEhQRVRfTUFYX1BFUklPRCkKKwkJZ290byBvdXRfbm9ocGV0OworCisJLyoKKwkgKiBUaGUgcGVyaW9kIGlzIGEgZmVtdG8gc2Vjb25kcyB2YWx1ZS4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlCisJICogc2NhbGVkIG1hdGggbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBuYW5vc2Vjb25kIHRvIGhwZXQgdGljaworCSAqIGNvbnZlcnNpb24uCisJICovCisJaHBldF9mcmVxID0gMTAwMDAwMDAwMDAwMDAwMFVMTDsKKwlkb19kaXYoaHBldF9mcmVxLCBocGV0X3BlcmlvZCk7CisJaHBldF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIGhwZXRfZnJlcSwKKwkJCQkgICAgICBOU0VDX1BFUl9TRUMsIDMyKTsKKwkvKiBDYWxjdWxhdGUgdGhlIG1pbiAvIG1heCBkZWx0YSAqLworCWhwZXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRkZGRkYsCisJCQkJCQkJICAgJmhwZXRfY2xvY2tldmVudCk7CisJaHBldF9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgzMCwKKwkJCQkJCQkgICAmaHBldF9jbG9ja2V2ZW50KTsKKworCS8qCisJICogUmVhZCB0aGUgSFBFVCBJRCByZWdpc3RlciB0byByZXRyaWV2ZSB0aGUgSVJRIHJvdXRpbmcKKwkgKiBpbmZvcm1hdGlvbiBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscworCSAqLworCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJLyoKKwkgKiBUaGUgbGVnYWN5IHJvdXRpbmcgbW9kZSBuZWVkcyBhdCBsZWFzdCB0d28gY2hhbm5lbHMsIHRpY2sgdGltZXIKKwkgKiBhbmQgdGhlIHJ0YyBlbXVsYXRpb24gY2hhbm5lbC4KKwkgKi8KKwlpZiAoIShpZCAmIEhQRVRfSURfTlVNQkVSKSkKKwkJZ290byBvdXRfbm9ocGV0OworI2VuZGlmCisKKwkvKiBTdGFydCB0aGUgY291bnRlciAqLworCWhwZXRfc3RhcnRfY291bnRlcigpOworCisJaWYgKGlkICYgSFBFVF9JRF9MRUdTVVApIHsKKwkJaHBldF9lbmFibGVfaW50KCk7CisJCWhwZXRfcmVzZXJ2ZV9wbGF0Zm9ybV90aW1lcnMoaWQpOworCQkvKgorCQkgKiBTdGFydCBocGV0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQKKwkJICogZ2xvYmFsIGFmdGVyIHRoZSBJT19BUElDIGhhcyBiZWVuIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaHBldF9jbG9ja2V2ZW50LmNwdW1hc2sgPWNwdW1hc2tfb2ZfY3B1KDApOworCQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmhwZXRfY2xvY2tldmVudCk7CisJCWdsb2JhbF9jbG9ja19ldmVudCA9ICZocGV0X2Nsb2NrZXZlbnQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworb3V0X25vaHBldDoKKwlpb3VubWFwKGhwZXRfdmlydF9hZGRyZXNzKTsKKwlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9jayBzb3VyY2UgcmVsYXRlZCBjb2RlCisgKi8KIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQogewotCXJldHVybiAoY3ljbGVfdClyZWFkbChocGV0X3B0cik7CisJcmV0dXJuIChjeWNsZV90KWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ocGV0ID0gewpAQCAtMjQsMjggKzI4NiwxNyBAQAogCS5yYXRpbmcJCT0gMjUwLAogCS5yZWFkCQk9IHJlYWRfaHBldCwKIAkubWFzawkJPSBIUEVUX01BU0ssCi0JLm11bHQJCT0gMCwgLyogc2V0IGJlbG93ICovCiAJLnNoaWZ0CQk9IEhQRVRfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldF9jbG9ja3NvdXJjZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7Ci0Jdm9pZCBfX2lvbWVtKiBocGV0X2Jhc2U7CiAJdTY0IHRtcDsKLQlpbnQgZXJyOwogCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwlpZiAoIWhwZXRfdmlydF9hZGRyZXNzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLwotCWhwZXRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKLQlocGV0X3B0ciA9IGhwZXRfYmFzZSArIEhQRVRfQ09VTlRFUjsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5OiAqLwotCWhwZXRfcGVyaW9kID0gcmVhZGwoaHBldF9iYXNlICsgSFBFVF9QRVJJT0QpOwotCiAJLyoKIAkgKiBocGV0IHBlcmlvZCBpcyBpbiBmZW10byBzZWNvbmRzIHBlciBjeWNsZQogCSAqIHNvIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHRvIG5zL2N5YyB1bml0cwpAQCAtNjEsMTEgKzMxMiwyMTggQEAKIAlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKIAljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKIAotCWVyciA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9ocGV0KTsKLQlpZiAoZXJyKQotCQlpb3VubWFwKGhwZXRfYmFzZSk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCisvKiBIUEVUIGluIExlZ2FjeVJlcGxhY2VtZW50IE1vZGUgZWF0cyB1cCBSVEMgaW50ZXJydXB0IGxpbmUuIFdoZW4sIEhQRVQKKyAqIGlzIGVuYWJsZWQsIHdlIHN1cHBvcnQgUlRDIGludGVycnVwdCBmdW5jdGlvbmFsaXR5IGluIHNvZnR3YXJlLgorICogUlRDIGhhcyAzIGtpbmRzIG9mIGludGVycnVwdHM6CisgKiAxKSBVcGRhdGUgSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0LCBldmVyeSBzZWMsIHdoZW4gUlRDIGNsb2NrCisgKiAgICBpcyB1cGRhdGVkCisgKiAyKSBBbGFybSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYXQgYSBzcGVjaWZpYyB0aW1lIG9mIGRheQorICogMykgUGVyaW9kaWMgSW50ZXJydXB0IC0gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0LCB3aXRoIGZyZXF1ZW5jaWVzCisgKiAgICAySHotODE5Mkh6ICgySHotNjRIeiBmb3Igbm9uLXJvb3QgdXNlcikgKGFsbCBmcmVxcyBpbiBwb3dlcnMgb2YgMikKKyAqICgxKSBhbmQgKDIpIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBwb2xsaW5nIGF0IGEgZnJlcXVlbmN5IG9mCisgKiA2NCBIei4gVGhlIGV4YWN0IGZyZXF1ZW5jeSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWNjdXJhY3kgYW5kIGludGVycnVwdAorICogb3ZlcmhlYWQuIChERUZBVUxUX1JUQ19JTlRfRlJFUSkKKyAqIEZvciAoMyksIHdlIHVzZSBpbnRlcnJ1cHRzIGF0IDY0SHogb3IgdXNlciBzcGVjaWZpZWQgcGVyaW9kaWMKKyAqIGZyZXF1ZW5jeSwgd2hpY2hldmVyIGlzIGhpZ2hlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEJNjQKKyNkZWZpbmUgREVGQVVMVF9SVENfU0hJRlQJNgorI2RlZmluZSBSVENfTlVNX0lOVFMJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9ydGNfZmxhZ3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3ByZXZfdXBkYXRlX3NlYzsKK3N0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgaHBldF9hbGFybV90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3QxX2NtcDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfZGVmYXVsdF9kZWx0YTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcGllX2RlbHRhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfbGltaXQ7CisKKy8qCisgKiBUaW1lciAxIGZvciBSVEMgZW11bGF0aW9uLiBXZSB1c2Ugb25lIHNob3QgbW9kZSwgYXMgcGVyaW9kaWMgbW9kZQorICogaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgSFBFVCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWVyIDEuCisgKgorICogaHBldF9ydGNfdGltZXJfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBydGMgaXMgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjZmcsIGNudCwgZGVsdGEsIGZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWhwZXRfZGVmYXVsdF9kZWx0YSkgeworCQl1aW50NjRfdCBjbGM7CisKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJY2xjID4+PSBocGV0X2Nsb2NrZXZlbnQuc2hpZnQgKyBERUZBVUxUX1JUQ19TSElGVDsKKwkJaHBldF9kZWZhdWx0X2RlbHRhID0gKHVuc2lnbmVkIGxvbmcpIGNsYzsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbnQgPSBkZWx0YSArIGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKKwlocGV0X3QxX2NtcCA9IGNudDsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKKwljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgorICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KKyAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgorICovCitpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyAmPSB+Yml0X21hc2s7CisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCXVuc2lnbmVkIGxvbmcgb2xkYml0cyA9IGhwZXRfcnRjX2ZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyB8PSBiaXRfbWFzazsKKworCWlmICghb2xkYml0cykKKwkJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwKKwkJCXVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaHBldF9hbGFybV90aW1lLnRtX2hvdXIgPSBocnM7CisJaHBldF9hbGFybV90aW1lLnRtX21pbiA9IG1pbjsKKwlocGV0X2FsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1aW50NjRfdCBjbGM7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmIChmcmVxIDw9IERFRkFVTFRfUlRDX0lOVF9GUkVRKQorCQlocGV0X3BpZV9saW1pdCA9IERFRkFVTFRfUlRDX0lOVF9GUkVRIC8gZnJlcTsKKwllbHNlIHsKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJZG9fZGl2KGNsYywgZnJlcSk7CisJCWNsYyA+Pj0gaHBldF9jbG9ja2V2ZW50LnNoaWZ0OworCQlocGV0X3BpZV9kZWx0YSA9ICh1bnNpZ25lZCBsb25nKSBjbGM7CisJfQorCXJldHVybiAxOworfQorCitpbnQgaHBldF9ydGNfZHJvcHBlZF9pcnEodm9pZCkKK3sKKwlyZXR1cm4gaXNfaHBldF9lbmFibGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2ZnLCBkZWx0YTsKKwlpbnQgbG9zdF9pbnRzID0gLTE7CisKKwlpZiAodW5saWtlbHkoIWhwZXRfcnRjX2ZsYWdzKSkgeworCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgY29tcGFyYXRvciB2YWx1ZSB1bnRpbCB3ZSBhcmUgYWhlYWQgb2YgdGhlCisJICogY3VycmVudCBjb3VudC4KKwkgKi8KKwlkbyB7CisJCWhwZXRfdDFfY21wICs9IGRlbHRhOworCQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOworCQlsb3N0X2ludHMrKzsKKwl9IHdoaWxlICgobG9uZykoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gaHBldF90MV9jbXApID4gMCk7CisKKwlpZiAobG9zdF9pbnRzKSB7CisJCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpCisJCQlocGV0X3BpZV9jb3VudCArPSBsb3N0X2ludHM7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3QgJWQgaW50ZXJydXB0c1xuIiwKKwkJCQlsb3N0X2ludHMpOworCX0KK30KKworaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOworCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKKworCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOworCisJaWYgKGhwZXRfcnRjX2ZsYWdzICYgKFJUQ19VSUUgfCBSVENfQUlFKSkKKwkJcnRjX2dldF9ydGNfdGltZSgmY3Vycl90aW1lKTsKKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19VSUUgJiYKKwkgICAgY3Vycl90aW1lLnRtX3NlYyAhPSBocGV0X3ByZXZfdXBkYXRlX3NlYykgeworCQlydGNfaW50X2ZsYWcgPSBSVENfVUY7CisJCWhwZXRfcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwl9CisKKwlpZiAoaHBldF9ydGNfZmxhZ3MgJiBSVENfUElFICYmCisJICAgICsraHBldF9waWVfY291bnQgPj0gaHBldF9waWVfbGltaXQpIHsKKwkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKKwkJaHBldF9waWVfY291bnQgPSAwOworCX0KKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUgJiYKKwkgICAgKGN1cnJfdGltZS50bV9zZWMgPT0gaHBldF9hbGFybV90aW1lLnRtX3NlYykgJiYKKwkgICAgKGN1cnJfdGltZS50bV9taW4gPT0gaHBldF9hbGFybV90aW1lLnRtX21pbikgJiYKKwkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGhwZXRfYWxhcm1fdGltZS50bV9ob3VyKSkKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisKKwlpZiAocnRjX2ludF9mbGFnKSB7CisJCXJ0Y19pbnRfZmxhZyB8PSAoUlRDX0lSUUYgfCAoUlRDX05VTV9JTlRTIDw8IDgpKTsKKwkJcnRjX2ludGVycnVwdChydGNfaW50X2ZsYWcsIGRldl9pZCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jCmluZGV4IDlhMDA2MGIuLmE2YmM3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBpODI1My5jICA4MjUzL1BJVCBmdW5jdGlvbnMKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KQEAgLTE5LDIwICsxOSwxMDAgQEAKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIEVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CiAKLXZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCisvKgorICogSFBFVCByZXBsYWNlcyB0aGUgUElULCB3aGVuIGVuYWJsZWQuIFNvIHdlIG5lZWQgdG8ga25vdywgd2hpY2ggb2YKKyAqIHRoZSB0d28gdGltZXJzIGlzIHVzZWQKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZ2xvYmFsX2Nsb2NrX2V2ZW50OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgUElUIHRpbWVyLgorICoKKyAqIFRoaXMgaXMgYWxzbyBjYWxsZWQgYWZ0ZXIgcmVzdW1lIHRvIGJyaW5nIHRoZSBQSVQgaW50byBvcGVyYXRpb24gYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcGl0X3RpbWVyKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCi0JdWRlbGF5KDEwKTsKLQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLwotCXVkZWxheSgxMCk7Ci0Jb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQkvKiBiaW5hcnksIG1vZGUgMiwgTFNCL01TQiwgY2ggMCAqLworCQlvdXRiX3AoMHgzNCwgUElUX01PREUpOworCQl1ZGVsYXkoMTApOworCQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCQl1ZGVsYXkoMTApOworCQlvdXRiKExBVENIID4+IDggLCBQSVRfQ0gwKTsJLyogTVNCICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJCS8qIE9uZSBzaG90IHNldHVwICovCisJCW91dGJfcCgweDM4LCBQSVRfTU9ERSk7CisJCXVkZWxheSgxMCk7CisJCWJyZWFrOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CiB9CiAKIC8qCisgKiBQcm9ncmFtIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQorICoKKyAqIERlbHRhIGlzIGdpdmVuIGluIFBJVCB0aWNrcworICovCitzdGF0aWMgaW50IHBpdF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoZGVsdGEgJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCW91dGIoZGVsdGEgPj4gOCAsIFBJVF9DSDApOwkvKiBNU0IgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9uIFVQIHRoZSBQSVQgY2FuIHNlcnZlIGFsbCBvZiB0aGUgcG9zc2libGUgdGltZXIgZnVuY3Rpb25zLiBPbiBTTVAgc3lzdGVtcworICogaXQgY2FuIGJlIHNvbGVseSB1c2VkIGZvciB0aGUgZ2xvYmFsIHRpY2suCisgKgorICogVGhlIHByb2ZpbGluZyBhbmQgdXBkYXRlIGNhcGFiaWxpdGVzIGFyZSBzd2l0Y2hlZCBvZmYgb25jZSB0aGUgbG9jYWwgYXBpYyBpcworICogcmVnaXN0ZXJlZC4gVGhpcyBtZWNoYW5pc20gcmVwbGFjZXMgdGhlIHByZXZpb3VzICNpZmRlZiBMT0NBTF9BUElDIC0KKyAqICF1c2luZ19hcGljX3RpbWVyIGRlY2lzaW9ucyBpbiBkb190aW1lcl9pbnRlcnJ1cHRfaG9vaygpCisgKi8KK3N0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgcGl0X2Nsb2NrZXZlbnQgPSB7CisJLm5hbWUJCT0gInBpdCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGluaXRfcGl0X3RpbWVyLAorCS5zZXRfbmV4dF9ldmVudCA9IHBpdF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBmYWN0b3IgYW5kIHRoZSBtaW4vbWF4IGRlbHRhcyBvZiB0aGUgY2xvY2sgZXZlbnQKKyAqIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IHNvdXJjZSB3aXRoIHRoZSBmcmFtZXdvcmsuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX3BpdF90aW1lcih2b2lkKQoreworCS8qCisJICogU3RhcnQgcGl0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQgZ2xvYmFsIGFmdGVyIHRoZQorCSAqIElPX0FQSUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisJICovCisJcGl0X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCXBpdF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoQ0xPQ0tfVElDS19SQVRFLCBOU0VDX1BFUl9TRUMsIDMyKTsKKwlwaXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRiwgJnBpdF9jbG9ja2V2ZW50KTsKKwlwaXRfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4RiwgJnBpdF9jbG9ja2V2ZW50KTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJnBpdF9jbG9ja2V2ZW50KTsKKwlnbG9iYWxfY2xvY2tfZXZlbnQgPSAmcGl0X2Nsb2NrZXZlbnQ7Cit9CisKKy8qCiAgKiBTaW5jZSB0aGUgUElUIG92ZXJmbG93cyBldmVyeSB0aWNrLCBpdHMgbm90IHZlcnkgdXNlZnVsCiAgKiB0byBqdXN0IHJlYWQgYnkgaXRzZWxmLiBTbyB1c2UgamlmZmllcyB0byBlbXVsYXRlIGEgZnJlZQogICogcnVubmluZyBjb3VudGVyOgpAQCAtNDYsNyArMTI2LDcgQEAKIAlzdGF0aWMgdTMyIG9sZF9qaWZzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgLyoKKwkvKgogCSAqIEFsdGhvdWdoIG91ciBjYWxsZXIgbWF5IGhhdmUgdGhlIHJlYWQgc2lkZSBvZiB4dGltZV9sb2NrLAogCSAqIHRoaXMgaXMgbm93IGEgc2VxbG9jaywgYW5kIHdlIGFyZSBjaGVhdGluZyBpbiB0aGlzIHJvdXRpbmUKIAkgKiBieSBoYXZpbmcgc2lkZSBlZmZlY3RzIG9uIHN0YXRlIHRoYXQgd2UgY2Fubm90IHVuZG8gaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCBjOGQ0NTgyLi4wM2FiZmRiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC00MSw2ICs0MSw3IEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGk4MjU5QV9jaGlwID0gewogCS5uYW1lCQk9ICJYVC1QSUMiLAogCS5tYXNrCQk9IGRpc2FibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlCT0gZGlzYWJsZV84MjU5QV9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfODI1OUFfaXJxLAogCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja184MjU5QSwKIH07CkBAIC00MTAsMTIgKzQxMSw2IEBACiAJaW50cl9pbml0X2hvb2soKTsKIAogCS8qCi0JICogU2V0IHRoZSBjbG9jayB0byBIWiBIeiwgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQKLQkgKiB2ZWN0b3Igbm93OgotCSAqLwotCXNldHVwX3BpdF90aW1lcigpOwotCi0JLyoKIAkgKiBFeHRlcm5hbCBGUFU/IFNldCB1cCBpcnExMyBpZiBzbywgZm9yCiAJICogb3JpZ2luYWwgYnJhaW5kYW1hZ2VkIElCTSBGRVJSIGNvdXBsaW5nLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwppbmRleCBlMzBjY2VkLi40Y2NlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwpAQCAtNDgyLDggKzQ4Miw4IEBACiAJCXBhY2thZ2VfaW5kZXggPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpOwogCQlmb3IgKGogPSAwOyBqIDwgTlJfSVJRUzsgaisrKSB7CiAJCQl1bnNpZ25lZCBsb25nIHZhbHVlX25vdywgZGVsdGE7Ci0JCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCi0JCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCS8qIElzIHRoaXMgYW4gYWN0aXZlIElSUSBvciBiYWxhbmNpbmcgZGlzYWJsZWQgPyAqLworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24gfHwgaXJxX2JhbGFuY2luZ19kaXNhYmxlZChqKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICggcGFja2FnZV9pbmRleCA9PSBpICkKIAkJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSA9IDA7CkBAIC0xMjgxLDExICsxMjgxLDkgQEAKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKIAkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKLQllbHNlIHsKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwllbHNlCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwotCX0KIAlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lycV0pOwogfQogCkBAIC0xNTg4LDcgKzE1ODYsNyBAQAogCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwogCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIFZFUlNJT046ICUwOHhcbiIsIHYpOwogCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7Ci0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCXYgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVEFTS1BSSTogJTA4eCAoJTAyeClcbiIsIHYsIHYgJiBBUElDX1RQUklfTUFTSyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lycS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwppbmRleCA1Nzg1ZDg0Li4wZjJjYTU5MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBpb19hcGljLmMuKQogICovCiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMSwxOSArMjAsMzQgQEAKIAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKIERFRklORV9QRVJfQ1BVKGlycV9jcHVzdGF0X3QsIGlycV9zdGF0KSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGlycV9zdGF0KTsKIAotI2lmbmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIC8qCiAgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KICAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgogICovCiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotfQorCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBJUlEgdHJhcCBhdCB2ZWN0b3IgJTAyeFxuIiwgaXJxKTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCS8qCisJICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCisJICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgorCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKKwkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQorCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCisJICogY29tcGxldGVseS4KKwkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSworCSAqLworCWlmIChjcHVfaGFzX2FwaWMpCisJCWFja19BUElDX2lycSgpOwogI2VuZGlmCit9CiAKICNpZmRlZiBDT05GSUdfNEtTVEFDS1MKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL25taS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwppbmRleCA1ZDhhMDdjLi44MjFkZjM0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL25taS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgpAQCAtOTczLDkgKzk3NCwxMyBAQAogCQljcHVfY2xlYXIoY3B1LCBiYWNrdHJhY2VfbWFzayk7CiAJfQogCi0Jc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXM7CisJLyoKKwkgKiBUYWtlIHRoZSBsb2NhbCBhcGljIHRpbWVyIGFuZCBQSVQvSFBFVCBpbnRvIGFjY291bnQuIFdlIGRvbid0CisJICoga25vdyB3aGljaCBvbmUgaXMgYWN0aXZlLCB3aGVuIHdlIGhhdmUgaGlnaHJlcy9keW50aWNrIG9uCisJICovCisJc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXMgKyBrc3RhdF9pcnFzKDApOwogCi0JLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCisJLyogaWYgdGhlIG5vbmUgb2YgdGhlIHRpbWVycyBpc24ndCBmaXJpbmcsIHRoaXMgY3B1IGlzbid0IGRvaW5nIG11Y2ggKi8KIAlpZiAoIXRvdWNoZWQgJiYgbGFzdF9pcnFfc3Vtc1tjcHVdID09IHN1bSkgewogCQkvKgogCQkgKiBBeWllZSwgbG9va3MgbGlrZSB0aGlzIENQVSBpcyBzdHVjayAuLi4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzg0NWQ0OC4uYmVhMzA0ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTIxMSw2ICsyMTIsNyBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgeworCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJCXZvaWQgKCppZGxlKSh2b2lkKTsKIApAQCAtMjM4LDYgKzI0MCw3IEBACiAJCQlpZGxlKCk7CiAJCQlfX2V4aXRfaWRsZSgpOwogCQl9CisJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggZjQ2YTRkMC4uNDhiZmNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC05NCwxMiArOTQsNiBAQAogRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwogCi0vKiBUU0MncyB1cHBlciAzMiBiaXRzIGNhbid0IGJlIHdyaXR0ZW4gaW4gZWFyaWxlciBDUFUgKGJlZm9yZSBwcmVzY290dCksIHRoZXJlCi0gKiBpcyBubyB3YXkgdG8gcmVzeW5jIG9uZSBBUCBhZ2FpbnN0IEJQLiBUQkQ6IGZvciBwcmVzY290dCBhbmQgYWJvdmUsIHdlCi0gKiBzaG91bGQgdXNlIElBNjQncyBhbGdvcml0aG0KLSAqLwotc3RhdGljIGludCBfX2RldmluaXRkYXRhIHRzY19zeW5jX2Rpc2FibGVkOwotCiAvKiBQZXIgQ1BVIGJvZ29taXBzIGFuZCBvdGhlciBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIEVYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwpAQCAtMjE2LDE1MSArMjEwLDYgQEAKIAk7CiB9CiAKLS8qCi0gKiBUU0Mgc3luY2hyb25pemF0aW9uLgotICoKLSAqIFdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgYWxsIENQVXMgaGF2ZSB0aGVpciBUU0MncyBzeW5jaHJvbml6ZWQsCi0gKiB0aGVuIHdlIHByaW50IGEgd2FybmluZyBpZiBub3QsIGFuZCBhbHdheXMgcmVzeW5jLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWF0b21pY190IHN0YXJ0X2ZsYWc7Ci0JYXRvbWljX3QgY291bnRfc3RhcnQ7Ci0JYXRvbWljX3QgY291bnRfc3RvcDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzW05SX0NQVVNdOwotfSB0c2MgX19jcHVpbml0ZGF0YSA9IHsKLQkuc3RhcnRfZmxhZyA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdGFydCA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdG9wID0gQVRPTUlDX0lOSVQoMCksCi19OwotCi0jZGVmaW5lIE5SX0xPT1BTIDUKLQotc3RhdGljIHZvaWQgX19pbml0IHN5bmNocm9uaXplX3RzY19icCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0MDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc3VtLCBhdmc7Ci0JbG9uZyBsb25nIGRlbHRhOwotCXVuc2lnbmVkIGludCBvbmVfdXNlYzsKLQlpbnQgYnVnZ3kgPSAwOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBhY3Jvc3MgJXUgQ1BVczogIiwgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCS8qIGNvbnZlcnQgZnJvbSBrY3ljL3NlYyB0byBjeWMvdXNlYyAqLwotCW9uZV91c2VjID0gY3B1X2toeiAvIDEwMDA7Ci0KLQlhdG9taWNfc2V0KCZ0c2Muc3RhcnRfZmxhZywgMSk7Ci0Jd21iKCk7Ci0KLQkvKgotCSAqIFdlIGxvb3AgYSBmZXcgdGltZXMgdG8gZ2V0IGEgcHJpbWVkIGluc3RydWN0aW9uIGNhY2hlLAotCSAqIHRoZW4gdGhlIGxhc3QgcGFzcyBpcyBtb3JlIG9yIGxlc3Mgc3luY2hyb25pemVkIGFuZAotCSAqIHRoZSBCUCBhbmQgQVBzIHNldCB0aGVpciBjeWNsZSBjb3VudGVycyB0byB6ZXJvIGFsbCBhdAotCSAqIG9uY2UuIFRoaXMgcmVkdWNlcyB0aGUgY2hhbmNlIG9mIGhhdmluZyByYW5kb20gb2Zmc2V0cwotCSAqIGJldHdlZW4gdGhlIHByb2Nlc3NvcnMsIGFuZCBndWFyYW50ZWVzIHRoYXQgdGhlIG1heGltdW0KLQkgKiBkZWxheSBiZXR3ZWVuIHRoZSBjeWNsZSBjb3VudGVycyBpcyBuZXZlciBiaWdnZXIgdGhhbgotCSAqIHRoZSBsYXRlbmN5IG9mIGluZm9ybWF0aW9uLXBhc3NpbmcgKGNhY2hlbGluZXMpIGJldHdlZW4KLQkgKiB0d28gQ1BVcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfTE9PUFM7IGkrKykgewotCQkvKgotCQkgKiBhbGwgQVBzIHN5bmNocm9uaXplIGJ1dCB0aGV5IGxvb3Agb24gJz09IG51bV9jcHVzJwotCQkgKi8KLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKS0xKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWF0b21pY19zZXQoJnRzYy5jb3VudF9zdG9wLCAwKTsKLQkJd21iKCk7Ci0JCS8qCi0JCSAqIHRoaXMgbGV0cyB0aGUgQVBzIHNhdmUgdGhlaXIgY3VycmVudCBUU0M6Ci0JCSAqLwotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RhcnQpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJLyoKLQkJICogV2UgY2xlYXIgdGhlIFRTQyBpbiB0aGUgbGFzdCBsb29wOgotCQkgKi8KLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQkvKgotCQkgKiBXYWl0IGZvciBhbGwgQVBzIHRvIGxlYXZlIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQ6Ci0JCSAqLwotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzYy5jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKLQkJCWNwdV9yZWxheCgpOwotCQlhdG9taWNfc2V0KCZ0c2MuY291bnRfc3RhcnQsIDApOwotCQl3bWIoKTsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0b3ApOwotCX0KLQotCXN1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpIHsKLQkJCXQwID0gdHNjLnZhbHVlc1tpXTsKLQkJCXN1bSArPSB0MDsKLQkJfQotCX0KLQlhdmcgPSBzdW07Ci0JZG9fZGl2KGF2ZywgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKCFjcHVfaXNzZXQoaSwgY3B1X2NhbGxvdXRfbWFwKSkKLQkJCWNvbnRpbnVlOwotCQlkZWx0YSA9IHRzYy52YWx1ZXNbaV0gLSBhdmc7Ci0JCWlmIChkZWx0YSA8IDApCi0JCQlkZWx0YSA9IC1kZWx0YTsKLQkJLyoKLQkJICogV2UgcmVwb3J0IGJpZ2dlciB0aGFuIDIgbWljcm9zZWNvbmRzIGNsb2NrIGRpZmZlcmVuY2VzLgotCQkgKi8KLQkJaWYgKGRlbHRhID4gMipvbmVfdXNlYykgewotCQkJbG9uZyBsb25nIHJlYWxkZWx0YTsKLQotCQkJaWYgKCFidWdneSkgewotCQkJCWJ1Z2d5ID0gMTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQl9Ci0JCQlyZWFsZGVsdGEgPSBkZWx0YTsKLQkJCWRvX2RpdihyZWFsZGVsdGEsIG9uZV91c2VjKTsKLQkJCWlmICh0c2MudmFsdWVzW2ldIDwgYXZnKQotCQkJCXJlYWxkZWx0YSA9IC1yZWFsZGVsdGE7Ci0KLQkJCWlmIChyZWFsZGVsdGEpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIyVkIGhhZCAlTGQgdXNlY3MgVFNDICIKLQkJCQkJInNrZXcsIGZpeGVkIGl0IHVwLlxuIiwgaSwgcmVhbGRlbHRhKTsKLQkJfQotCX0KLQlpZiAoIWJ1Z2d5KQotCQlwcmludGsoInBhc3NlZC5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgc3luY2hyb25pemVfdHNjX2FwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIE5vdCBldmVyeSBjcHUgaXMgb25saW5lIGF0IHRoZSB0aW1lCi0JICogdGhpcyBnZXRzIGNhbGxlZCwgc28gd2UgZmlyc3Qgd2FpdCBmb3IgdGhlIEJQIHRvCi0JICogZmluaXNoIFNNUCBpbml0aWFsaXphdGlvbjoKLQkgKi8KLQl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Muc3RhcnRfZmxhZykpCi0JCWNwdV9yZWxheCgpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0YXJ0KTsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RvcCk7Ci0JCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjLmNvdW50X3N0b3ApICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLX0KLSN1bmRlZiBOUl9MT09QUwotCiBleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CiAKIHN0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQ7CkBAIC00MzgsMjAgKzI4NywxMiBAQAogCS8qCiAJICogU2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMKIAkgKi8KLSAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKLQotCWRpc2FibGVfQVBJQ190aW1lcigpOworCXNtcF9zdG9yZV9jcHVfaW5mbyhjcHVpZCk7CiAKIAkvKgogCSAqIEFsbG93IHRoZSBtYXN0ZXIgdG8gY29udGludWUuCiAJICovCiAJY3B1X3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApOwotCi0JLyoKLQkgKiAgICAgIFN5bmNocm9uaXplIHRoZSBUU0Mgd2l0aCB0aGUgQlAKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MgJiYgY3B1X2toeiAmJiAhdHNjX3N5bmNfZGlzYWJsZWQpCi0JCXN5bmNocm9uaXplX3RzY19hcCgpOwogfQogCiBzdGF0aWMgaW50IGNwdWNvdW50OwpAQCAtNTU0LDEzICszOTUsMTcgQEAKIAlzbXBfY2FsbGluKCk7CiAJd2hpbGUgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBzbXBfY29tbWVuY2VkX21hc2spKQogCQlyZXBfbm9wKCk7CisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEJQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3RhcmdldCgpOworCiAJc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrKCk7CiAJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgewogCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKIAkJZW5hYmxlX05NSV90aHJvdWdoX0xWVDAoTlVMTCk7CiAJCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAJfQotCWVuYWJsZV9BUElDX3RpbWVyKCk7CiAJLyoKIAkgKiBsb3ctbWVtb3J5IG1hcHBpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLCBmbHVzaCB0aGVtIGZyb20KIAkgKiB0aGUgbG9jYWwgVExCcyB0b28uCkBAIC03NTIsNyArNTk3LDcgQEAKIAkvKgogCSAqIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4KIAkgKi8KLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCWlmIChtYXhsdnQgPiAzKSB7CiAJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CkBAIC04NDksNyArNjk0LDcgQEAKIAkgKi8KIAlEcHJpbnRrKCIjc3RhcnR1cCBsb29wczogJWQuXG4iLCBudW1fc3RhcnRzKTsKIAotCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAKIAlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgewogCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKQEAgLTExMjUsOCArOTcwLDYgQEAKIAlpbmZvLmNwdSA9IGNwdTsKIAlJTklUX1dPUksoJmluZm8udGFzaywgZG9fd2FybV9ib290X2NwdSk7CiAKLQl0c2Nfc3luY19kaXNhYmxlZCA9IDE7Ci0KIAkvKiBpbml0IGxvdyBtZW0gbWFwcGluZyAqLwogCWNsb25lX3BnZF9yYW5nZShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAogCQkJbWluX3QodW5zaWduZWQgbG9uZywgS0VSTkVMX1BHRF9QVFJTLCBVU0VSX1BHRF9QVFJTKSk7CkBAIC0xMTM0LDcgKzk3Nyw2IEBACiAJc2NoZWR1bGVfd29yaygmaW5mby50YXNrKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAotCXRzY19zeW5jX2Rpc2FibGVkID0gMDsKIAl6YXBfbG93X21hcHBpbmdzKCk7CiAJcmV0ID0gMDsKIGV4aXQ6CkBAIC0xMzMxLDEyICsxMTczLDYgQEAKIAlzbXBib290X3NldHVwX2lvX2FwaWMoKTsKIAogCXNldHVwX2Jvb3RfY2xvY2soKTsKLQotCS8qCi0JICogU3luY2hyb25pemUgdGhlIFRTQyB3aXRoIHRoZSBBUAotCSAqLwotCWlmIChjcHVfaGFzX3RzYyAmJiBjcHVjb3VudCAmJiBjcHVfa2h6KQotCQlzeW5jaHJvbml6ZV90c2NfYnAoKTsKIH0KIAogLyogVGhlc2UgYXJlIHdyYXBwZXJzIHRvIGludGVyZmFjZSB0byB0aGUgbmV3IGJvb3QgcHJvY2Vzcy4gIFNvbWVvbmUKQEAgLTE0NzEsOSArMTMwNywxNiBAQAogCX0KIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCXBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID0gQ1BVX1VQX1BSRVBBUkU7CiAJLyogVW5sZWFzaCB0aGUgQ1BVISAqLwogCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEFQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3NvdXJjZShjcHUpOworCiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCiAJCWNwdV9yZWxheCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IGE0ZjY3YTYuLmE1MzUwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0xNTksMTUgKzE1OSw2IEBACiAgKi8KIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JLyoKLQkgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGp1c3QgaGF2ZSBpcnFzIGxvY2FsbHkKLQkgKiBkaXNhYmxlZCBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZyBvbiB0aGUgb3RoZXIKLQkgKiBDUFUuIFdlIG5lZWQgdG8gYXZvaWQgdG8gU01QIHJhY2Ugd2l0aCBpdC4gTk9URTogd2UgZG9uJyB0IG5lZWQKLQkgKiB0aGUgaXJxIHZlcnNpb24gb2Ygd3JpdGVfbG9jayBiZWNhdXNlIGFzIGp1c3Qgc2FpZCB3ZSBoYXZlIGlycQotCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCi0JICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlpZiAodGltZXJfYWNrKSB7CiAJCS8qCkBAIC0xODYsNyArMTc3LDYgQEAKIAogCWRvX3RpbWVyX2ludGVycnVwdF9ob29rKCk7CiAKLQogCWlmIChNQ0FfYnVzKSB7CiAJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKIAkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bwpAQCAtMjAxLDE4ICsxOTEsMTEgQEAKIAkJb3V0Yl9wKCBpcnFfdnwweDgwLCAweDYxICk7CS8qIHJlc2V0IHRoZSBJUlEgKi8KIAl9CiAKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKHVzaW5nX2FwaWNfdGltZXIpCi0JCXNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoKTsKLSNlbmRpZgotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCi11bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3Vuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIyNSw3ICsyMDgsNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0woZ2V0X2Ntb3NfdGltZSk7CiAKIHN0YXRpYyB2b2lkIHN5bmNfY21vc19jbG9jayh1bnNpZ25lZCBsb25nIGR1bW15KTsKIApAQCAtMjc4LDExNCArMjYwLDE2IEBACiAJCW1vZF90aW1lcigmc3luY19jbW9zX3RpbWVyLCBqaWZmaWVzICsgMSk7CiB9CiAKLXN0YXRpYyBsb25nIGNsb2NrX2Ntb3NfZGlmZjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNsZWVwX3N0YXJ0OwotCi1zdGF0aWMgaW50IHRpbWVyX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCS8qCi0JICogRXN0aW1hdGUgdGltZSB6b25lIHNvIHRoYXQgc2V0X3RpbWUgY2FuIHVwZGF0ZSB0aGUgY2xvY2sKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGN0aW1lID0gIGdldF9jbW9zX3RpbWUoKTsKLQotCWNsb2NrX2Ntb3NfZGlmZiA9IC1jdGltZTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlzbGVlcF9zdGFydCA9IGN0aW1lOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRpbWVyX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzZWM7Ci0JdW5zaWduZWQgbG9uZyBjdGltZSA9IGdldF9jbW9zX3RpbWUoKTsKLQlsb25nIHNsZWVwX2xlbmd0aCA9IChjdGltZSAtIHNsZWVwX3N0YXJ0KSAqIEhaOwotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWlmIChzbGVlcF9sZW5ndGggPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNNT1MgY2xvY2sgc2tldyBkZXRlY3RlZCBpbiB0aW1lciByZXN1bWUhXG4iKTsKLQkJLyogVGhlIHRpbWUgYWZ0ZXIgdGhlIHJlc3VtZSBtdXN0IG5vdCBiZSBlYXJsaWVyIHRoYW4gdGhlIHRpbWUKLQkJICogYmVmb3JlIHRoZSBzdXNwZW5kIG9yIHNvbWUgbmFzdHkgdGhpbmdzIHdpbGwgaGFwcGVuCi0JCSAqLwotCQlzbGVlcF9sZW5ndGggPSAwOwotCQljdGltZSA9IHNsZWVwX3N0YXJ0OwotCX0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotCWlmIChpc19ocGV0X2VuYWJsZWQoKSkKLQkJaHBldF9yZWVuYWJsZSgpOwotI2VuZGlmCi0Jc2V0dXBfcGl0X3RpbWVyKCk7Ci0KLQlzZWMgPSBjdGltZSArIGNsb2NrX2Ntb3NfZGlmZjsKLQl0cy50dl9zZWMgPSBzZWM7Ci0JdHMudHZfbnNlYyA9IDA7Ci0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0Jd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JamlmZmllc182NCArPSBzbGVlcF9sZW5ndGg7Ci0Jd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0gewotCS5yZXN1bWUgPSB0aW1lcl9yZXN1bWUsCi0JLnN1c3BlbmQgPSB0aW1lcl9zdXNwZW5kLAotCXNldF9rc2V0X25hbWUoInRpbWVyIiksCi19OwotCi0KLS8qIFhYWCB0aGlzIGRyaXZlcmZzIHN0dWZmIHNob3VsZCBwcm9iYWJseSBnbyBlbHNld2hlcmUgbGF0ZXIgLWpvaG4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7Ci0JLmlkCT0gMCwKLQkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCB0aW1lX2luaXRfZGV2aWNlKHZvaWQpCi17Ci0JaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aW1lcl9zeXNjbGFzcyk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV90aW1lcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1kZXZpY2VfaW5pdGNhbGwodGltZV9pbml0X2RldmljZSk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgogZXh0ZXJuIHZvaWQgKCpsYXRlX3RpbWVfaW5pdCkodm9pZCk7CiAvKiBEdXBsaWNhdGUgb2YgdGltZV9pbml0KCkgYmVsb3csIHdpdGggaHBldF9lbmFibGUgcGFydCBhZGRlZCAqLwogc3RhdGljIHZvaWQgX19pbml0IGhwZXRfdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotCXRzLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKTsKLQl0cy50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQlkb19zZXR0aW1lb2ZkYXkoJnRzKTsKLQotCWlmICgoaHBldF9lbmFibGUoKSA+PSAwKSAmJiBocGV0X3VzZV90aW1lcikgewotCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOwotCX0KLQorCWlmICghaHBldF9lbmFibGUoKSkKKwkJc2V0dXBfcGl0X3RpbWVyKCk7CiAJZG9fdGltZV9pbml0KCk7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi0JaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7Ci0JCS8qCi0JCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAotCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KLQkJICovCi0JCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQl0cy50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7Ci0JdHMudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOwotCi0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0KLQlkb190aW1lX2luaXQoKTsKKwlsYXRlX3RpbWVfaW5pdCA9IGhwZXRfdGltZV9pbml0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDcwMmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKLSAqICBUaGlzIGNvZGUgbGFyZ2VseSBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCi0gKiAgU2VlIHRoYXQgZmlsZSBmb3IgY3JlZGl0cy4KLSAqCi0gKiAgMjAwMy0wNi0zMCAgICBWZW5rYXRlc2ggUGFsbGlwYWRpIC0gQWRkaXRpb25hbCBjaGFuZ2VzIGZvciBIUEVUIHN1cHBvcnQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS90aW1lci5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotCi0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLQotI2luY2x1ZGUgPGFzbS9ocGV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaHBldC5oPgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCi11bnNpZ25lZCBsb25nIGhwZXRfdGljazsJCS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLwotdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CQkvKiBocGV0IG1lbW9yeSBtYXAgcGh5c2ljYWwgYWRkcmVzcyAqLwotaW50IGhwZXRfdXNlX3RpbWVyOwotCi1zdGF0aWMgaW50IHVzZV9ocGV0OyAJCS8qIGNhbiBiZSB1c2VkIGZvciBydW50aW1lIGNoZWNrIG9mIGhwZXQgKi8KLXN0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7IAkvKiBib290dGltZSBvdmVycmlkZSBmb3IgSFBFVCB0aW1lciAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqIGhwZXRfdmlydF9hZGRyZXNzOwkvKiBocGV0IGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KLQotI2RlZmluZSBGU0VDX1RPX1VTRUMgKDEwMDAwMDAwMDBVTCkKLQotaW50IGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQotewotCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOwotfQotCi1zdGF0aWMgdm9pZCBocGV0X3dyaXRlbCh1bnNpZ25lZCBsb25nIGQsIHVuc2lnbmVkIGxvbmcgYSkKLXsKLQl3cml0ZWwoZCwgaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotLyoKLSAqIEhQRVQgY291bnRlcnMgZG9udCB3cmFwIGFyb3VuZCBvbiBldmVyeSB0aWNrLiBUaGV5IGp1c3QgY2hhbmdlIHRoZQotICogY29tcGFyYXRvciB2YWx1ZSBhbmQgY29udGludWUuIE5leHQgdGljayBjYW4gYmUgY2F1Z2h0IGJ5IGNoZWNraW5nCi0gKiBmb3IgYSBjaGFuZ2UgaW4gdGhlIGNvbXBhcmF0b3IgdmFsdWUuIFVzZWQgaW4gYXBpYy5jLgotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF9ocGV0X3RpY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfY21wX3ZhbCwgZW5kX2NtcF92YWw7Ci0KLQlzdGFydF9jbXBfdmFsID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7Ci0JZG8gewotCQllbmRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOwotCX0gd2hpbGUgKHN0YXJ0X2NtcF92YWwgPT0gZW5kX2NtcF92YWwpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spCi17Ci0JdW5zaWduZWQgaW50IGNmZzsKLQotCS8qCi0JICogU3RvcCB0aGUgdGltZXJzIGFuZCByZXNldCB0aGUgbWFpbiBjb3VudGVyLgotCSAqLwotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOwotCWNmZyAmPSB+SFBFVF9DRkdfRU5BQkxFOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOwotCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUik7Ci0JaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSICsgNCk7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpIHsKLQkJLyoKLQkJICogU2V0IHVwIHRpbWVyIDAsIGFzIHBlcmlvZGljIHdpdGggZmlyc3QgaW50ZXJydXB0IHRvIGhhcHBlbiBhdAotCQkgKiBocGV0X3RpY2ssIGFuZCBwZXJpb2QgYWxzbyBocGV0X3RpY2suCi0JCSAqLwotCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKLQkJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8Ci0JCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMF9DRkcpOwotCi0JCS8qCi0JCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKLQkJICogdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQgd3JpdGUgc2V0cyB0aGUgdGhyZXNob2xkLgotCQkgKi8KLQkJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOwotCQlocGV0X3dyaXRlbCh0aWNrLCBIUEVUX1QwX0NNUCk7Ci0JfQotCS8qCi0gCSAqIEdvIQotIAkgKi8KLQljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKLQlpZiAoaHBldF91c2VfdGltZXIpCi0JCWNmZyB8PSBIUEVUX0NGR19MRUdBQ1k7Ci0JY2ZnIHw9IEhQRVRfQ0ZHX0VOQUJMRTsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2hlY2sgd2hldGhlciBIUEVUIHdhcyBmb3VuZCBieSBBQ1BJIGJvb3QgcGFyc2UuIElmIHllcyBzZXR1cCBIUEVUCi0gKiBjb3VudGVyIDAgZm9yIGtlcm5lbCBiYXNlIHRpbWVyLgotICovCi1pbnQgX19pbml0IGhwZXRfZW5hYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCXVuc2lnbmVkIGxvbmcgdGlja19mc2VjX2xvdywgdGlja19mc2VjX2hpZ2g7IC8qIHRpY2sgaW4gZmVtdG8gc2VjICovCi0JdW5zaWduZWQgbG9uZyBocGV0X3RpY2tfcmVtOwotCi0JaWYgKGJvb3RfaHBldF9kaXNhYmxlKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIWhwZXRfYWRkcmVzcykgewotCQlyZXR1cm4gLTE7Ci0JfQotCWhwZXRfdmlydF9hZGRyZXNzID0gaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOwotCS8qCi0JICogUmVhZCB0aGUgcGVyaW9kLCBjb21wdXRlIHRpY2sgYW5kIHF1b3RpZW50LgotCSAqLwotCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKLQotCS8qCi0JICogV2UgYXJlIGNoZWNraW5nIGZvciB2YWx1ZSAnMScgb3IgbW9yZSBpbiBudW1iZXIgZmllbGQgaWYKLQkgKiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQyBpcyBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgYW4KLQkgKiBhZGRpdGlvbmFsIHRpbWVyIGZvciBSVEMgZW11bGF0aW9uLgotCSAqIEhvd2V2ZXIsIHdlIGNhbiBkbyB3aXRoIG9uZSB0aW1lciBvdGhlcndpc2UgdXNpbmcgdGhlCi0JICogdGhlIHNpbmdsZSBIUEVUIHRpbWVyIGZvciBzeXN0ZW0gdGltZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotCWlmICghKGlkICYgSFBFVF9JRF9OVU1CRVIpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0jZW5kaWYKLQotCi0JaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKLQlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIDY0IGJpdCBtYXRoCi0JICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKLQkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKLQkgKi8KLQlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAotCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKLQlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKLQkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7Ci0KLQlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKLQkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KLQotCWhwZXRfdXNlX3RpbWVyID0gaWQgJiBIUEVUX0lEX0xFR1NVUDsKLQotCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpIHsKLQkJaW91bm1hcChocGV0X3ZpcnRfYWRkcmVzcyk7Ci0JCWhwZXRfdmlydF9hZGRyZXNzID0gTlVMTDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXVzZV9ocGV0ID0gMTsKLQotI2lmZGVmCUNPTkZJR19IUEVUCi0JewotCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOwotCQl1bnNpZ25lZCBpbnQgCQludGltZXI7Ci0KLQkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOwotCi0JCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7Ci0JCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7Ci0JCW50aW1lcisrOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgotCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgotCQkgKi8KLQkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOwotCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7Ci0JCWhkLmhkX25pcnFzID0gbnRpbWVyOwotCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7Ci0jaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7Ci0jZW5kaWYKLQkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKLQkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOwotCQlpZiAobnRpbWVyID4gMikgewotCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKLQkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOwotCQkJaW50CQkJaTsKLQotCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOwotCi0JCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKLQkJCQl0aW1lcisrLCBpKyspCi0JCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCi0JCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KLQkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKLQotCQl9Ci0KLQkJaHBldF9hbGxvYygmaGQpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKGhwZXRfdXNlX3RpbWVyKQotCQl3YWl0X3RpbWVyX3RpY2sgPSB3YWl0X2hwZXRfdGljazsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1pbnQgaHBldF9yZWVuYWJsZSh2b2lkKQotewotCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Ci19Ci0KLWludCBpc19ocGV0X2VuYWJsZWQodm9pZCkKLXsKLQlyZXR1cm4gdXNlX2hwZXQ7Ci19Ci0KLWludCBpc19ocGV0X2NhcGFibGUodm9pZCkKLXsKLQlpZiAoIWJvb3RfaHBldF9kaXNhYmxlICYmIGhwZXRfYWRkcmVzcykKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQotewotCWlmIChzdHIpIHsKLQkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKLQkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImhwZXQ9IiwgaHBldF9zZXR1cCk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotLyogSFBFVCBpbiBMZWdhY3lSZXBsYWNlbWVudCBNb2RlIGVhdHMgdXAgUlRDIGludGVycnVwdCBsaW5lLiBXaGVuLCBIUEVUCi0gKiBpcyBlbmFibGVkLCB3ZSBzdXBwb3J0IFJUQyBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBpbiBzb2Z0d2FyZS4KLSAqIFJUQyBoYXMgMyBraW5kcyBvZiBpbnRlcnJ1cHRzOgotICogMSkgVXBkYXRlIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCwgZXZlcnkgc2VjLCB3aGVuIFJUQyBjbG9jawotICogICAgaXMgdXBkYXRlZAotICogMikgQWxhcm0gSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGF0IGEgc3BlY2lmaWMgdGltZSBvZiBkYXkKLSAqIDMpIFBlcmlvZGljIEludGVycnVwdCAtIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdCwgd2l0aCBmcmVxdWVuY2llcwotICogICAgMkh6LTgxOTJIeiAoMkh6LTY0SHogZm9yIG5vbi1yb290IHVzZXIpIChhbGwgZnJlcXMgaW4gcG93ZXJzIG9mIDIpCi0gKiAoMSkgYW5kICgyKSBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgcG9sbGluZyBhdCBhIGZyZXF1ZW5jeSBvZgotICogNjQgSHouIFRoZSBleGFjdCBmcmVxdWVuY3kgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBpbnRlcnJ1cHQKLSAqIG92ZXJoZWFkLiAoREVGQVVMVF9SVENfSU5UX0ZSRVEpCi0gKiBGb3IgKDMpLCB3ZSB1c2UgaW50ZXJydXB0cyBhdCA2NEh6IG9yIHVzZXIgc3BlY2lmaWVkIHBlcmlvZGljCi0gKiBmcmVxdWVuY3ksIHdoaWNoZXZlciBpcyBoaWdoZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotCi0jZGVmaW5lIERFRkFVTFRfUlRDX0lOVF9GUkVRIAk2NAotI2RlZmluZSBSVENfTlVNX0lOVFMgCQkxCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIFVJRV9vbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfdXBkYXRlX3NlYzsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgQUlFX29uOwotc3RhdGljIHN0cnVjdCBydGNfdGltZSBhbGFybV90aW1lOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfb247Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2NvdW50OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3J0Y19pbnRfZnJlcTsgLyogUlRDIGludGVycnVwdCBmcmVxdWVuY3kgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaHBldF90MV9jbXA7IC8qIGNhY2hlZCBjb21wYXJhdG9yIHJlZ2lzdGVyICovCi0KLS8qCi0gKiBUaW1lciAxIGZvciBSVEMsIHdlIGRvIG5vdCB1c2UgcGVyaW9kaWMgaW50ZXJydXB0IGZlYXR1cmUsCi0gKiBldmVuIGlmIEhQRVQgc3VwcG9ydHMgcGVyaW9kaWMgaW50ZXJydXB0cyBvbiBUaW1lciAxLgotICogVGhlIHJlYXNvbiBiZWluZywgdG8gc2V0IHVwIGEgcGVyaW9kaWMgaW50ZXJydXB0IGluIEhQRVQsIHdlIG5lZWQgdG8KLSAqIHN0b3AgdGhlIG1haW4gY291bnRlci4gQW5kIGlmIHdlIGRvIHRoYXQgZXZlcnl0aW1lIHNvbWVvbmUgZGlhYmxlcy9lbmFibGVzCi0gKiBSVEMsIHdlIHdpbGwgaGF2ZSBhZHZlcnNlIGVmZmVjdCBvbiBtYWluIGtlcm5lbCB0aW1lciBydW5uaW5nIG9uIFRpbWVyIDAuCi0gKiBTbywgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW11bGF0ZSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIHNvZnR3YXJlLgotICoKLSAqIGhwZXRfcnRjX3RpbWVyX2luaXQoKSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBkdXJpbmcgc3Vic2VxdWVudAotICogaW50ZXJ1cHB0cyByZWluaXQgaGFwcGVucyB0aHJvdWdoIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpLgotICovCi1pbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTZXQgdGhlIGNvdW50ZXIgMSBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOwotCWVsc2UKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQljbnQgKz0gKChocGV0X3RpY2sqSFopL2hwZXRfcnRjX2ludF9mcmVxKTsKLQlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKLQlocGV0X3QxX2NtcCA9IGNudDsKLQotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOwotCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKLQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudCwgdGlja3NfcGVyX2ludCwgbG9zdF9pbnRzOwotCi0JaWYgKHVubGlrZWx5KCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkpIHsKLQkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7Ci0JZWxzZQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotCi0JLyogSXQgaXMgbW9yZSBhY2N1cmF0ZSB0byB1c2UgdGhlIGNvbXBhcmF0b3IgdmFsdWUgdGhhbiBjdXJyZW50IGNvdW50LiovCi0JdGlja3NfcGVyX2ludCA9IGhwZXRfdGljayAqIEhaIC8gaHBldF9ydGNfaW50X2ZyZXE7Ci0JaHBldF90MV9jbXAgKz0gdGlja3NfcGVyX2ludDsKLQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOwotCi0JLyoKLQkgKiBJZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2FzIGRlbGF5ZWQgdG9vIGxvbmcsIHRoZSB3cml0ZSBhYm92ZSB0cmllcwotCSAqIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGludGVycnVwdCBpbiB0aGUgcGFzdCBhbmQgdGhlIGhhcmR3YXJlIHdvdWxkCi0JICogbm90IGludGVycnVwdCB1bnRpbCB0aGUgY291bnRlciBoYWQgd3JhcHBlZCBhcm91bmQuCi0JICogU28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBjb21wYXJhdG9yIHdhc24ndCBzZXQgdG8gYSBwYXN0IHRpbWUuCi0JICovCi0JY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWlmICh1bmxpa2VseSgoaW50KShjbnQgLSBocGV0X3QxX2NtcCkgPiAwKSkgewotCQlsb3N0X2ludHMgPSAoY250IC0gaHBldF90MV9jbXApIC8gdGlja3NfcGVyX2ludCArIDE7Ci0JCS8qIE1ha2Ugc3VyZSB0aGF0LCBldmVuIHdpdGggdGhlIHRpbWUgbmVlZGVkIHRvIGV4ZWN1dGUKLQkJICogdGhpcyBjb2RlLCB0aGUgbmV4dCBzY2hlZHVsZWQgaW50ZXJydXB0IGhhcyBiZWVuIG1vdmVkCi0JCSAqIGJhY2sgdG8gdGhlIGZ1dHVyZTogKi8KLQkJbG9zdF9pbnRzKys7Ci0KLQkJaHBldF90MV9jbXAgKz0gbG9zdF9pbnRzICogdGlja3NfcGVyX2ludDsKLQkJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKLQotCQlpZiAoUElFX29uKQotCQkJUElFX2NvdW50ICs9IGxvc3RfaW50czsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwKLQkJICAgICAgIGhwZXRfcnRjX2ludF9mcmVxKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgotICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KLSAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgotICovCi1pbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYml0X21hc2sgJiBSVENfVUlFKQotCQlVSUVfb24gPSAwOwotCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpCi0JCVBJRV9vbiA9IDA7Ci0JaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkKLQkJQUlFX29uID0gMDsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKLXsKLQlpbnQgdGltZXJfaW5pdF9yZXFkID0gMDsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkKLQkJdGltZXJfaW5pdF9yZXFkID0gMTsKLQotCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpIHsKLQkJVUlFX29uID0gMTsKLQl9Ci0JaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkgewotCQlQSUVfb24gPSAxOwotCQlQSUVfY291bnQgPSAwOwotCX0KLQlpZiAoYml0X21hc2sgJiBSVENfQUlFKSB7Ci0JCUFJRV9vbiA9IDE7Ci0JfQotCi0JaWYgKHRpbWVyX2luaXRfcmVxZCkKLQkJaHBldF9ydGNfdGltZXJfaW5pdCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlhbGFybV90aW1lLnRtX2hvdXIgPSBocnM7Ci0JYWxhcm1fdGltZS50bV9taW4gPSBtaW47Ci0JYWxhcm1fdGltZS50bV9zZWMgPSBzZWM7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JUElFX2ZyZXEgPSBmcmVxOwotCVBJRV9jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfcnRjX2Ryb3BwZWRfaXJxKHZvaWQpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOwotCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKLQlpbnQgY2FsbF9ydGNfaW50ZXJydXB0ID0gMDsKLQotCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOwotCi0JaWYgKFVJRV9vbiB8IEFJRV9vbikgewotCQlydGNfZ2V0X3J0Y190aW1lKCZjdXJyX3RpbWUpOwotCX0KLQlpZiAoVUlFX29uKSB7Ci0JCWlmIChjdXJyX3RpbWUudG1fc2VjICE9IHByZXZfdXBkYXRlX3NlYykgewotCQkJLyogU2V0IHVwZGF0ZSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyA9IFJUQ19VRjsKLQkJCXByZXZfdXBkYXRlX3NlYyA9IGN1cnJfdGltZS50bV9zZWM7Ci0JCX0KLQl9Ci0JaWYgKFBJRV9vbikgewotCQlQSUVfY291bnQrKzsKLQkJaWYgKFBJRV9jb3VudCA+PSBocGV0X3J0Y19pbnRfZnJlcS9QSUVfZnJlcSkgewotCQkJLyogU2V0IHBlcmlvZGljIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKLQkJCVBJRV9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0JaWYgKEFJRV9vbikgewotCQlpZiAoKGN1cnJfdGltZS50bV9zZWMgPT0gYWxhcm1fdGltZS50bV9zZWMpICYmCi0JCSAgICAoY3Vycl90aW1lLnRtX21pbiA9PSBhbGFybV90aW1lLnRtX21pbikgJiYKLQkJICAgIChjdXJyX3RpbWUudG1faG91ciA9PSBhbGFybV90aW1lLnRtX2hvdXIpKSB7Ci0JCQkvKiBTZXQgYWxhcm0gaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgfD0gUlRDX0FGOwotCQl9Ci0JfQotCWlmIChjYWxsX3J0Y19pbnRlcnJ1cHQpIHsKLQkJcnRjX2ludF9mbGFnIHw9IChSVENfSVJRRiB8IChSVENfTlVNX0lOVFMgPDwgOCkpOwotCQlydGNfaW50ZXJydXB0KHJ0Y19pbnRfZmxhZywgZGV2X2lkKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RzYy5jCmluZGV4IDQ2Zjc1MmEuLjMwODJhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90c2MuYwpAQCAtNjAsMTIgKzYwLDYgQEAKIAlyZXR1cm4gdHNjX3Vuc3RhYmxlOwogfQogCi12b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpCi17Ci0JdHNjX3Vuc3RhYmxlID0gMTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKLQogLyogQWNjZWxsZXJhdG9ycyBmb3Igc2NoZWRfY2xvY2soKQogICogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCiAgKiAgYmFzaWMgZXF1YXRpb246CkBAIC0yMjIsMzQgKzIxNiw2IEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKLQotc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJY3B1ZnJlcV9nZXQoY3B1KTsKLQotCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLX0KLQotLyoKLSAqIGlmIHdlIG5vdGljZSBjcHVmcmVxIG9kZG5lc3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCi0gKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKLSAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpCi17Ci0JaWYgKGNwdWZyZXFfaW5pdCAmJiAhY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQpIHsKLQkJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAxOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2tpbmcgaWYgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VkLlxuIik7Ci0JCXNjaGVkdWxlX3dvcmsoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yayk7Ci0JfQotfQotCiAvKgogICogaWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgc2NhbGVkLCBUU0MtYmFzZWQgZGVsYXlzIHdpbGwgbmVlZCBhIGRpZmZlcmVudAogICogbG9vcHNfcGVyX2ppZmZ5IHZhbHVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5LgpAQCAtMzEzLDE3ICsyNzksOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQogewotCWludCByZXQ7Ci0KLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOwotCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKLQkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLQlpZiAoIXJldCkKLQkJY3B1ZnJlcV9pbml0ID0gMTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJCQkJIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiB9Ci0KIGNvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOwogCiAjZW5kaWYKQEAgLTMzMSw3ICsyODksNiBAQAogLyogY2xvY2sgc291cmNlIGNvZGUgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90c2Nfa2h6ID0gMDsKLXN0YXRpYyBpbnQgdHNjX3VwZGF0ZV9jYWxsYmFjayh2b2lkKTsKIAogc3RhdGljIGN5Y2xlX3QgcmVhZF90c2Modm9pZCkKIHsKQEAgLTM0OSwzNyArMzA2LDI4IEBACiAJLm1hc2sJCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5tdWx0CQkJPSAwLCAvKiB0byBiZSBzZXQgKi8KIAkuc2hpZnQJCQk9IDIyLAotCS51cGRhdGVfY2FsbGJhY2sJPSB0c2NfdXBkYXRlX2NhbGxiYWNrLAotCS5pc19jb250aW51b3VzCQk9IDEsCisJLmZsYWdzCQkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUyB8CisJCQkJICBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlksCiB9OwogCi1zdGF0aWMgaW50IHRzY191cGRhdGVfY2FsbGJhY2sodm9pZCkKK3ZvaWQgbWFya190c2NfdW5zdGFibGUodm9pZCkKIHsKLQlpbnQgY2hhbmdlID0gMDsKLQotCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoZSBzYWZlIGNsb2Nrc291cmNlOiAqLwotCWlmIChjbG9ja3NvdXJjZV90c2MucmF0aW5nICE9IDAgJiYgY2hlY2tfdHNjX3Vuc3RhYmxlKCkpIHsKLQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0JCWNsb2Nrc291cmNlX3Jlc2VsZWN0KCk7Ci0JCWNoYW5nZSA9IDE7CisJaWYgKCF0c2NfdW5zdGFibGUpIHsKKwkJdHNjX3Vuc3RhYmxlID0gMTsKKwkJLyogQ2FuIGJlIGNhbGxlZCBiZWZvcmUgcmVnaXN0cmF0aW9uICovCisJCWlmIChjbG9ja3NvdXJjZV90c2MubXVsdCkKKwkJCWNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoJmNsb2Nrc291cmNlX3RzYywgMCk7CisJCWVsc2UKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOwogCX0KLQotCS8qIG9ubHkgdXBkYXRlIGlmIHRzY19raHogaGFzIGNoYW5nZWQ6ICovCi0JaWYgKGN1cnJlbnRfdHNjX2toeiAhPSB0c2Nfa2h6KSB7Ci0JCWN1cnJlbnRfdHNjX2toeiA9IHRzY19raHo7Ci0JCWNsb2Nrc291cmNlX3RzYy5tdWx0ID0gY2xvY2tzb3VyY2Vfa2h6Mm11bHQoY3VycmVudF90c2Nfa2h6LAotCQkJCQkJCWNsb2Nrc291cmNlX3RzYy5zaGlmdCk7Ci0JCWNoYW5nZSA9IDE7Ci0JfQotCi0JcmV0dXJuIGNoYW5nZTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKIAogc3RhdGljIGludCBfX2luaXQgZG1pX21hcmtfdHNjX3Vuc3RhYmxlKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewogCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IG1hcmtpbmcgVFNDIHVuc3RhYmxlLlxuIiwKIAkJICAgICAgIGQtPmlkZW50KTsKLQltYXJrX3RzY191bnN0YWJsZSgpOworCXRzY191bnN0YWJsZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Niw2NiArMzQ0LDQ1IEBACiAJIHt9CiB9OwogCi0jZGVmaW5lIFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMICgxMCpNU0VDX1BFUl9TRUMpIC8qIDEwc2VjIGluIE1TICovCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdmVyaWZ5X3RzY19mcmVxX3RpbWVyOwotCi0vKiBYWFggLSBQcm9iYWJseSBzaG91bGQgYWRkIGxvY2tpbmcgKi8KLXN0YXRpYyB2b2lkIHZlcmlmeV90c2NfZnJlcSh1bnNpZ25lZCBsb25nIHVudXNlZCkKLXsKLQlzdGF0aWMgdTY0IGxhc3RfdHNjOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKLQotCXU2NCBub3dfdHNjLCBpbnRlcnZhbF90c2M7Ci0JdW5zaWduZWQgbG9uZyBub3dfamlmZmllcywgaW50ZXJ2YWxfamlmZmllczsKLQotCi0JaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKQotCQlyZXR1cm47Ci0KLQlyZHRzY2xsKG5vd190c2MpOwotCW5vd19qaWZmaWVzID0gamlmZmllczsKLQotCWlmICghbGFzdF9qaWZmaWVzKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWludGVydmFsX2ppZmZpZXMgPSBub3dfamlmZmllcyAtIGxhc3RfamlmZmllczsKLQlpbnRlcnZhbF90c2MgPSBub3dfdHNjIC0gbGFzdF90c2M7Ci0JaW50ZXJ2YWxfdHNjICo9IEhaOwotCWRvX2RpdihpbnRlcnZhbF90c2MsIGNwdV9raHoqMTAwMCk7Ci0KLQlpZiAoaW50ZXJ2YWxfdHNjIDwgKGludGVydmFsX2ppZmZpZXMgKiAzIC8gNCkpIHsKLQkJcHJpbnRrKCJUU0MgYXBwZWFycyB0byBiZSBydW5uaW5nIHNsb3dseS4gIgotCQkJIk1hcmtpbmcgaXQgYXMgdW5zdGFibGVcbiIpOwotCQltYXJrX3RzY191bnN0YWJsZSgpOwotCQlyZXR1cm47Ci0JfQotCi1vdXQ6Ci0JbGFzdF90c2MgPSBub3dfdHNjOwotCWxhc3RfamlmZmllcyA9IG5vd19qaWZmaWVzOwotCS8qIHNldCB1cyB1cCB0byBnbyBvZmYgb24gdGhlIG5leHQgaW50ZXJ2YWw6ICovCi0JbW9kX3RpbWVyKCZ2ZXJpZnlfdHNjX2ZyZXFfdGltZXIsCi0JCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMKSk7Ci19Ci0KIC8qCiAgKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAogICogb3ZlciBhbGwgQ1BVcy4KICAqLwotc3RhdGljIF9faW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCitfX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQogeworCWlmICghY3B1X2hhc190c2MgfHwgdHNjX3Vuc3RhYmxlKQorCQlyZXR1cm4gMTsKIAkvKgogCSAqIEludGVsIHN5c3RlbXMgYXJlIG5vcm1hbGx5IGFsbCBzeW5jaHJvbml6ZWQuCiAJICogRXhjZXB0aW9ucyBtdXN0IG1hcmsgVFNDIGFzIHVuc3RhYmxlOgogCSAqLwotCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLSAJCXJldHVybiAwOwotCi0JLyogYXNzdW1lIG11bHRpIHNvY2tldCBzeXN0ZW1zIGFyZSBub3Qgc3luY2hyb25pemVkOiAqLwotIAlyZXR1cm4gbnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDE7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSB7CisJCS8qIGFzc3VtZSBtdWx0aSBzb2NrZXQgc3lzdGVtcyBhcmUgbm90IHN5bmNocm9uaXplZDogKi8KKwkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKQorCQkJdHNjX3Vuc3RhYmxlID0gMTsKKwl9CisJcmV0dXJuIHRzY191bnN0YWJsZTsKIH0KIAorLyoKKyAqIEdlb2RlX0xYIC0gdGhlIE9MUEMgQ1BVIGhhcyBhIHBvc3NpYmx5IGEgdmVyeSByZWxpYWJsZSBUU0MKKyAqLworI2lmZGVmIENPTkZJR19NR0VPREVfTFgKKy8qIFJUU0MgY291bnRzIGR1cmluZyBzdXNwZW5kICovCisjZGVmaW5lIFJUU0NfU1VTUCAweDEwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZG1zcmwoTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAsIHZhbCk7CisJaWYgKCh2YWwgJiBSVFNDX1NVU1ApKQorCQljbG9ja3NvdXJjZV90c2MuZmxhZ3MgJj0gfkNMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpIHsgfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjX2Nsb2Nrc291cmNlKHZvaWQpCiB7CiAKQEAgLTQ2MywyMCArMzkwLDE2IEBACiAJCS8qIGNoZWNrIGJsYWNrbGlzdCAqLwogCQlkbWlfY2hlY2tfc3lzdGVtKGJhZF90c2NfZG1pX3RhYmxlKTsKIAotCQlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpIC8qIG1hcmsgdW5zdGFibGUgaWYgdW5zeW5jZWQgKi8KLQkJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisJCXVuc3luY2hyb25pemVkX3RzYygpOworCQljaGVja19nZW9kZV90c2NfcmVsaWFibGUoKTsKIAkJY3VycmVudF90c2Nfa2h6ID0gdHNjX2toejsKIAkJY2xvY2tzb3VyY2VfdHNjLm11bHQgPSBjbG9ja3NvdXJjZV9raHoybXVsdChjdXJyZW50X3RzY19raHosCiAJCQkJCQkJY2xvY2tzb3VyY2VfdHNjLnNoaWZ0KTsKIAkJLyogbG93ZXIgdGhlIHJhdGluZyBpZiB3ZSBhbHJlYWR5IGtub3cgaXRzIHVuc3RhYmxlOiAqLwotCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpCisJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkgewogCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0KLQkJaW5pdF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKLQkJdmVyaWZ5X3RzY19mcmVxX3RpbWVyLmZ1bmN0aW9uID0gdmVyaWZ5X3RzY19mcmVxOwotCQl2ZXJpZnlfdHNjX2ZyZXFfdGltZXIuZXhwaXJlcyA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUU0NfRlJFUV9DSEVDS19JTlRFUlZBTCk7Ci0JCWFkZF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKKwkJCWNsb2Nrc291cmNlX3RzYy5mbGFncyAmPSB+Q0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVM7CisJCX0KIAogCQlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3RzYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDI0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYyIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1pdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKaW5kZXggMmUyZDhkYi4uNzZkMmFkYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCS5tYXNrCQkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKIAkubXVsdAkJCT0gMCwgLyogdG8gYmUgc2V0ICovCiAJLnNoaWZ0CQkJPSAyMiwKLQkuaXNfY29udGludW91cwkJPSAxLAorCS5mbGFncwkJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCBjYzJmNTE5Li5jNzg4MTYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCkBAIC03OSw3ICs3OSwxMiBAQAogewogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEwICA9IHsgdGltZXJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0geworCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAorCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZSA9ICJ0aW1lciIKK307CiAKIC8qKgogICogdGltZV9pbml0X2hvb2sgLSBkbyBhbnkgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGZvciB0aGUgc3lzdGVtIHRpbWVyLgpAQCAtOTAsNiArOTUsNyBAQAogICoqLwogdm9pZCBfX2luaXQgdGltZV9pbml0X2hvb2sodm9pZCkKIHsKKwlpcnEwLm1hc2sgPSBjcHVtYXNrX29mX2NwdSgwKTsKIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCmluZGV4IDU0NWZjYmMuLmU1ZTU2YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taXBzID0gewogCS5uYW1lCQk9ICJNSVBTIiwKIAkubWFzawkJPSAweGZmZmZmZmZmLAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9taXBzX2Nsb2Nrc291cmNlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwppbmRleCAzOWRiMTI4Li41ZTVjMGU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKQEAgLTMwNSw4ICszMDUsNiBAQAogCWxldmVsID0gISEobGV2ZWxfbWFza1todyA+PiA1XSAmICgxVUwgPDwgKGh3ICYgMHgxZikpKTsKIAlpZiAobGV2ZWwpCiAJCWRlc2MtPnN0YXR1cyB8PSBJUlFfTEVWRUw7Ci0JZWxzZQotCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnBtYWNfcGljLCBsZXZlbCA/CiAJCQkJIGhhbmRsZV9sZXZlbF9pcnEgOiBoYW5kbGVfZWRnZV9pcnEpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCAzYjkxZjI3Li5lZTlmZDdiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJLm1hc2sJCT0gLTFVTEwsCiAJLm11bHQJCT0gMTAwMCwKIAkuc2hpZnQJCT0gMTIsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCmluZGV4IDkyNWE2NTIuLmIyZTFmZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKQEAgLTk3LDIwICs5NywyMiBAQAogCiBzdGF0aWMgaW50IG5lZWRfcG9sbChzdHJ1Y3QgcG9sbGZkcyAqcG9sbHMsIGludCBuKQogewotCWlmKG4gPD0gcG9sbHMtPnNpemUpewotCQlwb2xscy0+dXNlZCA9IG47CisJc3RydWN0IHBvbGxmZCAqbmV3OworCisJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7Ci0JfQotCWtmcmVlKHBvbGxzLT5wb2xsKTsKLQlwb2xscy0+cG9sbCA9IHVtX2ttYWxsb2NfYXRvbWljKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOwotCWlmKHBvbGxzLT5wb2xsID09IE5VTEwpeworCisJbmV3ID0gdW1fa21hbGxvY19hdG9taWMobiAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJaWYobmV3ID09IE5VTEwpewogCQlwcmludGsoIm5lZWRfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcG9sbGZkc1xuIik7Ci0JCXBvbGxzLT5zaXplID0gMDsKLQkJcG9sbHMtPnVzZWQgPSAwOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwltZW1jcHkobmV3LCBwb2xscy0+cG9sbCwgcG9sbHMtPnVzZWQgKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWtmcmVlKHBvbGxzLT5wb2xsKTsKKworCXBvbGxzLT5wb2xsID0gbmV3OwogCXBvbGxzLT5zaXplID0gbjsKLQlwb2xscy0+dXNlZCA9IG47CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3MSwxNSArMTczLDE1IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQluID0gY3VycmVudF9wb2xsLnVzZWQgKyAxOwotCWVyciA9IG5lZWRfcG9sbCgmbmV4dF9wb2xsLCBuKTsKKwluID0gY3VycmVudF9wb2xsLnVzZWQ7CisJZXJyID0gbmVlZF9wb2xsKCZuZXh0X3BvbGwsIG4gKyAxKTsKIAlpZihlcnIpCiAJCWdvdG8gb3V0OwogCi0JZm9yKGkgPSAwOyBpIDwgY3VycmVudF9wb2xsLnVzZWQ7IGkrKykKLQkJbmV4dF9wb2xsLnBvbGxbaV0gPSBjdXJyZW50X3BvbGwucG9sbFtpXTsKLQotCW5leHRfcG9sbC5wb2xsW24gLSAxXSA9ICpwOworCW1lbWNweShuZXh0X3BvbGwucG9sbCwgY3VycmVudF9wb2xsLnBvbGwsCisJICAgICAgIGN1cnJlbnRfcG9sbC51c2VkICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXh0X3BvbGwucG9sbFtuXSA9ICpwOworCW5leHRfcG9sbC51c2VkID0gbiArIDE7CiAJdXBkYXRlX3RocmVhZCgpOwogIG91dDoKIAlzaWdpb191bmxvY2soKTsKQEAgLTIxNCw2ICsyMTYsNyBAQAogCQlpZihwLT5mZCAhPSBmZCkKIAkJCW5leHRfcG9sbC5wb2xsW24rK10gPSAqcDsKIAl9CisJbmV4dF9wb2xsLnVzZWQgPSBjdXJyZW50X3BvbGwudXNlZCAtIDE7CiAKIAl1cGRhdGVfdGhyZWFkKCk7CiAgb3V0OgpAQCAtMzMxLDEwICszMzQsOSBAQAogCiAJc2lnaW9fbG9jaygpOwogCWVyciA9IG5lZWRfcG9sbCgmYWxsX3NpZ2lvX2ZkcywgYWxsX3NpZ2lvX2Zkcy51c2VkICsgMSk7Ci0JaWYoZXJyKXsKLQkJcHJpbnRrKCJtYXliZV9zaWdpb19icm9rZW4gLSBmYWlsZWQgdG8gYWRkIHBvbGxmZFxuIik7CisJaWYoZXJyKQogCQlnb3RvIG91dDsKLQl9CisKIAlhbGxfc2lnaW9fZmRzLnBvbGxbYWxsX3NpZ2lvX2Zkcy51c2VkKytdID0KIAkJKChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCAgCT0gZmQsCiAJCQkJICAgLmV2ZW50cyAJPSByZWFkID8gUE9MTElOIDogUE9MTE9VVCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IDc5ODJjYmMuLjU2ZWIxNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtMjQsNiArMjQsMTQgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX1RJTUVfVlNZU0NBTEwKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBaT05FX0RNQTMyCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGFlMzk5NDUuLmJiNDdlODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiAJCXB0cmFjZS5vIHRpbWUubyBpb3BvcnQubyBsZHQubyBzZXR1cC5vIGk4MjU5Lm8gc3lzX3g4Nl82NC5vIFwKIAkJeDg2NjRfa3N5bXMubyBpMzg3Lm8gc3lzY2FsbC5vIHZzeXNjYWxsLm8gXAogCQlzZXR1cDY0Lm8gYm9vdGZsYWcubyBlODIwLm8gcmVib290Lm8gcXVpcmtzLm8gaTgyMzcubyBcCi0JCXBjaS1kbWEubyBwY2ktbm9tbXUubyBhbHRlcm5hdGl2ZS5vCisJCXBjaS1kbWEubyBwY2ktbm9tbXUubyBhbHRlcm5hdGl2ZS5vIGhwZXQubyB0c2MubwogCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfWDg2X01DRSkJCSs9IG1jZS5vIHRoZXJtX3Rocm90Lm8KQEAgLTE5LDcgKzE5LDcgQEAKIG9iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KIG9iai0kKENPTkZJR19NSUNST0NPREUpCQkrPSBtaWNyb2NvZGUubwogb2JqLSQoQ09ORklHX1g4Nl9DUFVJRCkJCSs9IGNwdWlkLm8KLW9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIHRyYW1wb2xpbmUubyB0c2Nfc3luYy5vCiBvYmoteQkJCQkrPSBhcGljLm8gIG5taS5vCiBvYmoteQkJCQkrPSBpb19hcGljLm8gbXBwYXJzZS5vIFwKIAkJZ2VuYXBpYy5vIGdlbmFwaWNfY2x1c3Rlci5vIGdlbmFwaWNfZmxhdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwppbmRleCAxMjRiMmQyLi43MjM0MTdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vaWRsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAogaW50IGFwaWNfbWFwcGVkOwpAQCAtNzYzLDcgKzc2NCw3IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJLyogd2FpdCBmb3IgaXJxIHNsaWNlICovCi0gCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzICYmIGhwZXRfdXNlX3RpbWVyKSB7CisgCWlmIChocGV0X2FkZHJlc3MgJiYgaHBldF91c2VfdGltZXIpIHsKICAJCWludCB0cmlnZ2VyID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7CiAgCQl3aGlsZSAoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpID49IHRyaWdnZXIpCiAgCQkJLyogZG8gbm90aGluZyAqLyA7CkBAIC03ODUsNyArNzg2LDcgQEAKIAkvKiBUdXJuIG9mZiBQSVQgaW50ZXJydXB0IGlmIHdlIHVzZSBBUElDIHRpbWVyIGFzIG1haW4gdGltZXIuCiAJICAgT25seSB3b3JrcyB3aXRoIHRoZSBQTSB0aW1lciByaWdodCBub3cKIAkgICBUQkQgZml4IGl0IGZvciBIUEVUIHRvby4gKi8KLQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1BNVE1SICYmCisJaWYgKChwbXRtcl9pb3BvcnQgIT0gMCkgJiYKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpID09IGJvb3RfY3B1X2lkICYmCiAJCWFwaWNfcnVuc19tYWluX3RpbWVyID09IDEgJiYKIAkJIWNwdV9pc3NldChib290X2NwdV9pZCwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaHBldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTBlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaHBldC5jCkBAIC0wLDAgKzEsNTExIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvaHBldC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworaW50IG5vaHBldCBfX2luaXRkYXRhOworCit1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKK3Vuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CS8qIGZzZWNzIC8gSFBFVCBjbG9jayAqLwordW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CS8qIEhQRVQgY2xvY2tzIC8gaW50ZXJydXB0ICovCisKK2ludCBocGV0X3VzZV90aW1lcjsJCS8qIFVzZSBjb3VudGVyIG9mIGhwZXQgZm9yIHRpbWUga2VlcGluZywKKwkJCQkgKiBvdGhlcndpc2UgUElUCisJCQkJICovCisKKyNpZmRlZglDT05GSUdfSFBFVAorc3RhdGljIF9faW5pdCBpbnQgbGF0ZV9ocGV0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaHBldF9kYXRhCWhkOworCXVuc2lnbmVkIGludCAJCW50aW1lcjsKKworCWlmICghaHBldF9hZGRyZXNzKQorICAgICAgICAJcmV0dXJuIDA7CisKKwltZW1zZXQoJmhkLCAwLCBzaXplb2YoaGQpKTsKKworCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7CisJbnRpbWVyID0gKG50aW1lciAmIEhQRVRfSURfTlVNQkVSKSA+PiBIUEVUX0lEX05VTUJFUl9TSElGVDsKKwludGltZXIrKzsKKworCS8qCisJICogUmVnaXN0ZXIgd2l0aCBkcml2ZXIuCisJICogVGltZXIwIGFuZCBUaW1lcjEgaXMgdXNlZCBieSBwbGF0Zm9ybS4KKwkgKi8KKwloZC5oZF9waHlzX2FkZHJlc3MgPSBocGV0X2FkZHJlc3M7CisJaGQuaGRfYWRkcmVzcyA9ICh2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChGSVhfSFBFVF9CQVNFKTsKKwloZC5oZF9uaXJxcyA9IG50aW1lcjsKKwloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAwKTsKKyNpZmRlZglDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCWhwZXRfcmVzZXJ2ZV90aW1lcigmaGQsIDEpOworI2VuZGlmCisJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKKwloZC5oZF9pcnFbMV0gPSBIUEVUX0xFR0FDWV9SVEM7CisJaWYgKG50aW1lciA+IDIpIHsKKwkJc3RydWN0IGhwZXQJCSpocGV0OworCQlzdHJ1Y3QgaHBldF90aW1lcgkqdGltZXI7CisJCWludAkJCWk7CisKKwkJaHBldCA9IChzdHJ1Y3QgaHBldCAqKSBmaXhfdG9fdmlydChGSVhfSFBFVF9CQVNFKTsKKwkJdGltZXIgPSAmaHBldC0+aHBldF90aW1lcnNbMl07CisJCWZvciAoaSA9IDI7IGkgPCBudGltZXI7IHRpbWVyKyssIGkrKykKKwkJCWhkLmhkX2lycVtpXSA9ICh0aW1lci0+aHBldF9jb25maWcgJgorCQkJCQlUbl9JTlRfUk9VVEVfQ05GX01BU0spID4+CisJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKKworCX0KKworCWhwZXRfYWxsb2MoJmhkKTsKKwlyZXR1cm4gMDsKK30KK2ZzX2luaXRjYWxsKGxhdGVfaHBldF9pbml0KTsKKyNlbmRpZgorCitpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spCit7CisJdW5zaWduZWQgaW50IGNmZzsKKworLyoKKyAqIFN0b3AgdGhlIHRpbWVycyBhbmQgcmVzZXQgdGhlIG1haW4gY291bnRlci4KKyAqLworCisJY2ZnID0gaHBldF9yZWFkbChIUEVUX0NGRyk7CisJY2ZnICY9IH4oSFBFVF9DRkdfRU5BQkxFIHwgSFBFVF9DRkdfTEVHQUNZKTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIpOworCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUiArIDQpOworCisvKgorICogU2V0IHVwIHRpbWVyIDAsIGFzIHBlcmlvZGljIHdpdGggZmlyc3QgaW50ZXJydXB0IHRvIGhhcHBlbiBhdCBocGV0X3RpY2ssCisgKiBhbmQgcGVyaW9kIGFsc28gaHBldF90aWNrLgorICovCisJaWYgKGhwZXRfdXNlX3RpbWVyKSB7CisJCWhwZXRfd3JpdGVsKEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8IEhQRVRfVE5fU0VUVkFMIHwKKwkJICAgIEhQRVRfVE5fMzJCSVQsIEhQRVRfVDBfQ0ZHKTsKKwkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7IC8qIG5leHQgaW50ZXJydXB0ICovCisJCWhwZXRfd3JpdGVsKGhwZXRfdGljaywgSFBFVF9UMF9DTVApOyAvKiBwZXJpb2QgKi8KKwkJY2ZnIHw9IEhQRVRfQ0ZHX0xFR0FDWTsKKwl9CisvKgorICogR28hCisgKi8KKworCWNmZyB8PSBIUEVUX0NGR19FTkFCTEU7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfYXJjaF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlkOworCisJaWYgKCFocGV0X2FkZHJlc3MpCisJCXJldHVybiAtMTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0hQRVRfQkFTRSwgaHBldF9hZGRyZXNzKTsKKwlfX3NldF9maXhtYXAoVlNZU0NBTExfSFBFVCwgaHBldF9hZGRyZXNzLCBQQUdFX0tFUk5FTF9WU1lTQ0FMTF9OT0NBQ0hFKTsKKworLyoKKyAqIFJlYWQgdGhlIHBlcmlvZCwgY29tcHV0ZSB0aWNrIGFuZCBxdW90aWVudC4KKyAqLworCisJaWQgPSBocGV0X3JlYWRsKEhQRVRfSUQpOworCisJaWYgKCEoaWQgJiBIUEVUX0lEX1ZFTkRPUikgfHwgIShpZCAmIEhQRVRfSURfTlVNQkVSKSkKKwkJcmV0dXJuIC0xOworCisJaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKKwlpZiAoaHBldF9wZXJpb2QgPCAxMDAwMDAgfHwgaHBldF9wZXJpb2QgPiAxMDAwMDAwMDApCisJCXJldHVybiAtMTsKKworCWhwZXRfdGljayA9IChGU0VDX1BFUl9USUNLICsgaHBldF9wZXJpb2QgLyAyKSAvIGhwZXRfcGVyaW9kOworCisJaHBldF91c2VfdGltZXIgPSAoaWQgJiBIUEVUX0lEX0xFR1NVUCk7CisKKwlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOworfQorCitpbnQgaHBldF9yZWVuYWJsZSh2b2lkKQoreworCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Cit9CisKKy8qCisgKiBjYWxpYnJhdGVfdHNjKCkgY2FsaWJyYXRlcyB0aGUgcHJvY2Vzc29yIFRTQyBpbiBhIHZlcnkgc2ltcGxlIHdheSwgY29tcGFyaW5nCisgKiBpdCB0byB0aGUgSFBFVCB0aW1lciBvZiBrbm93biBmcmVxdWVuY3kuCisgKi8KKworI2RlZmluZSBUSUNLX0NPVU5UIDEwMDAwMDAwMAorI2RlZmluZSBUSUNLX01JTiAgIDUwMDAKKworLyoKKyAqIFNvbWUgcGxhdGZvcm1zIHRha2UgcGVyaW9kaWMgU01JIGludGVycnVwdHMgd2l0aCA1bXMgZHVyYXRpb24uIE1ha2Ugc3VyZSBub25lCisgKiBvY2N1cnMgYmV0d2VlbiB0aGUgcmVhZHMgb2YgdGhlIGhwZXQgJiBUU0MuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZWFkX2hwZXRfdHNjKGludCAqaHBldCwgaW50ICp0c2MpCit7CisJaW50IHRzYzEsIHRzYzIsIGhwZXQxOworCisJZG8geworCQl0c2MxID0gZ2V0X2N5Y2xlc19zeW5jKCk7CisJCWhwZXQxID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCQl0c2MyID0gZ2V0X2N5Y2xlc19zeW5jKCk7CisJfSB3aGlsZSAodHNjMiAtIHRzYzEgPiBUSUNLX01JTik7CisJKmhwZXQgPSBocGV0MTsKKwkqdHNjID0gdHNjMjsKK30KKwordW5zaWduZWQgaW50IF9faW5pdCBocGV0X2NhbGlicmF0ZV90c2Modm9pZCkKK3sKKwlpbnQgdHNjX3N0YXJ0LCBocGV0X3N0YXJ0OworCWludCB0c2Nfbm93LCBocGV0X25vdzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmVhZF9ocGV0X3RzYygmaHBldF9zdGFydCwgJnRzY19zdGFydCk7CisKKwlkbyB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXJlYWRfaHBldF90c2MoJmhwZXRfbm93LCAmdHNjX25vdyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9IHdoaWxlICgodHNjX25vdyAtIHRzY19zdGFydCkgPCBUSUNLX0NPVU5UICYmCisJCShocGV0X25vdyAtIGhwZXRfc3RhcnQpIDwgVElDS19DT1VOVCk7CisKKwlyZXR1cm4gKHRzY19ub3cgLSB0c2Nfc3RhcnQpICogMTAwMDAwMDAwMEwKKwkJLyAoKGhwZXRfbm93IC0gaHBldF9zdGFydCkgKiBocGV0X3BlcmlvZCAvIDEwMDApOworfQorCisjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKy8qIEhQRVQgaW4gTGVnYWN5UmVwbGFjZW1lbnQgTW9kZSBlYXRzIHVwIFJUQyBpbnRlcnJ1cHQgbGluZS4gV2hlbiwgSFBFVAorICogaXMgZW5hYmxlZCwgd2Ugc3VwcG9ydCBSVEMgaW50ZXJydXB0IGZ1bmN0aW9uYWxpdHkgaW4gc29mdHdhcmUuCisgKiBSVEMgaGFzIDMga2luZHMgb2YgaW50ZXJydXB0czoKKyAqIDEpIFVwZGF0ZSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQsIGV2ZXJ5IHNlYywgd2hlbiBSVEMgY2xvY2sKKyAqICAgIGlzIHVwZGF0ZWQKKyAqIDIpIEFsYXJtIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCBhdCBhIHNwZWNpZmljIHRpbWUgb2YgZGF5CisgKiAzKSBQZXJpb2RpYyBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIHdpdGggZnJlcXVlbmNpZXMKKyAqICAgIDJIei04MTkySHogKDJIei02NEh6IGZvciBub24tcm9vdCB1c2VyKSAoYWxsIGZyZXFzIGluIHBvd2VycyBvZiAyKQorICogKDEpIGFuZCAoMikgYWJvdmUgYXJlIGltcGxlbWVudGVkIHVzaW5nIHBvbGxpbmcgYXQgYSBmcmVxdWVuY3kgb2YKKyAqIDY0IEh6LiBUaGUgZXhhY3QgZnJlcXVlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW50ZXJydXB0CisgKiBvdmVyaGVhZC4gKERFRkFVTFRfUlRDX0lOVF9GUkVRKQorICogRm9yICgzKSwgd2UgdXNlIGludGVycnVwdHMgYXQgNjRIeiBvciB1c2VyIHNwZWNpZmllZCBwZXJpb2RpYworICogZnJlcXVlbmN5LCB3aGljaGV2ZXIgaXMgaGlnaGVyLgorICovCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0CisjZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgVUlFX29uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl91cGRhdGVfc2VjOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBBSUVfb247CitzdGF0aWMgc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RpbWU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9vbjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfY291bnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcnRjX2ludF9mcmVxOyAvKiBSVEMgaW50ZXJydXB0IGZyZXF1ZW5jeSAqLworc3RhdGljIHVuc2lnbmVkIGludCBocGV0X3QxX2NtcDsgLyogY2FjaGVkIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKi8KKworaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBocGV0X2FkZHJlc3MgIT0gMDsKK30KKworLyoKKyAqIFRpbWVyIDEgZm9yIFJUQywgd2UgZG8gbm90IHVzZSBwZXJpb2RpYyBpbnRlcnJ1cHQgZmVhdHVyZSwKKyAqIGV2ZW4gaWYgSFBFVCBzdXBwb3J0cyBwZXJpb2RpYyBpbnRlcnJ1cHRzIG9uIFRpbWVyIDEuCisgKiBUaGUgcmVhc29uIGJlaW5nLCB0byBzZXQgdXAgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gSFBFVCwgd2UgbmVlZCB0bworICogc3RvcCB0aGUgbWFpbiBjb3VudGVyLiBBbmQgaWYgd2UgZG8gdGhhdCBldmVyeXRpbWUgc29tZW9uZSBkaWFibGVzL2VuYWJsZXMKKyAqIFJUQywgd2Ugd2lsbCBoYXZlIGFkdmVyc2UgZWZmZWN0IG9uIG1haW4ga2VybmVsIHRpbWVyIHJ1bm5pbmcgb24gVGltZXIgMC4KKyAqIFNvLCBmb3IgdGhlIHRpbWUgYmVpbmcsIHNpbXVsYXRlIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gc29mdHdhcmUuCisgKgorICogaHBldF9ydGNfdGltZXJfaW5pdCgpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGR1cmluZyBzdWJzZXF1ZW50CisgKiBpbnRlcnVwcHRzIHJlaW5pdCBoYXBwZW5zIHRocm91Z2ggaHBldF9ydGNfdGltZXJfcmVpbml0KCkuCisgKi8KK2ludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNmZywgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIFNldCB0aGUgY291bnRlciAxIGFuZCBlbmFibGUgdGhlIGludGVycnVwdHMuCisJICovCisJaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCisJCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7CisJZWxzZQorCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCWNudCArPSAoKGhwZXRfdGljaypIWikvaHBldF9ydGNfaW50X2ZyZXEpOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCWhwZXRfdDFfY21wID0gY250OworCisJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJY2ZnICY9IH5IUEVUX1ROX1BFUklPRElDOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fMzJCSVQ7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaHBldF9ydGNfdGltZXJfcmVpbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNmZywgY250LCB0aWNrc19wZXJfaW50LCBsb3N0X2ludHM7CisKKwlpZiAodW5saWtlbHkoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKSkgeworCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwkvKiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHVzZSB0aGUgY29tcGFyYXRvciB2YWx1ZSB0aGFuIGN1cnJlbnQgY291bnQuKi8KKwl0aWNrc19wZXJfaW50ID0gaHBldF90aWNrICogSFogLyBocGV0X3J0Y19pbnRfZnJlcTsKKwlocGV0X3QxX2NtcCArPSB0aWNrc19wZXJfaW50OworCWhwZXRfd3JpdGVsKGhwZXRfdDFfY21wLCBIUEVUX1QxX0NNUCk7CisKKwkvKgorCSAqIElmIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3YXMgZGVsYXllZCB0b28gbG9uZywgdGhlIHdyaXRlIGFib3ZlIHRyaWVzCisJICogdG8gc2NoZWR1bGUgdGhlIG5leHQgaW50ZXJydXB0IGluIHRoZSBwYXN0IGFuZCB0aGUgaGFyZHdhcmUgd291bGQKKwkgKiBub3QgaW50ZXJydXB0IHVudGlsIHRoZSBjb3VudGVyIGhhZCB3cmFwcGVkIGFyb3VuZC4KKwkgKiBTbyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIGNvbXBhcmF0b3Igd2Fzbid0IHNldCB0byBhIHBhc3QgdGltZS4KKwkgKi8KKwljbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJaWYgKHVubGlrZWx5KChpbnQpKGNudCAtIGhwZXRfdDFfY21wKSA+IDApKSB7CisJCWxvc3RfaW50cyA9IChjbnQgLSBocGV0X3QxX2NtcCkgLyB0aWNrc19wZXJfaW50ICsgMTsKKwkJLyogTWFrZSBzdXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgdGltZSBuZWVkZWQgdG8gZXhlY3V0ZQorCQkgKiB0aGlzIGNvZGUsIHRoZSBuZXh0IHNjaGVkdWxlZCBpbnRlcnJ1cHQgaGFzIGJlZW4gbW92ZWQKKwkJICogYmFjayB0byB0aGUgZnV0dXJlOiAqLworCQlsb3N0X2ludHMrKzsKKworCQlocGV0X3QxX2NtcCArPSBsb3N0X2ludHMgKiB0aWNrc19wZXJfaW50OworCQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOworCisJCWlmIChQSUVfb24pCisJCQlQSUVfY291bnQgKz0gbG9zdF9pbnRzOworCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwKKwkJCSAgICAgICBocGV0X3J0Y19pbnRfZnJlcSk7CisJfQorfQorCisvKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGZyb20gcnRjIGRyaXZlci4KKyAqIFJldHVybiAwIGlmIEhQRVQgaXMgbm90IGJlaW5nIHVzZWQuCisgKiBPdGhlcndpc2UgZG8gdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGFuZCByZXR1cm4gMS4KKyAqLworaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkKKwkJVUlFX29uID0gMDsKKwlpZiAoYml0X21hc2sgJiBSVENfUElFKQorCQlQSUVfb24gPSAwOworCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpCisJCUFJRV9vbiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaW50IHRpbWVyX2luaXRfcmVxZCA9IDA7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpCisJCXRpbWVyX2luaXRfcmVxZCA9IDE7CisKKwlpZiAoYml0X21hc2sgJiBSVENfVUlFKSB7CisJCVVJRV9vbiA9IDE7CisJfQorCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpIHsKKwkJUElFX29uID0gMTsKKwkJUElFX2NvdW50ID0gMDsKKwl9CisJaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkgeworCQlBSUVfb24gPSAxOworCX0KKworCWlmICh0aW1lcl9pbml0X3JlcWQpCisJCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfYWxhcm1fdGltZSh1bnNpZ25lZCBjaGFyIGhycywgdW5zaWduZWQgY2hhciBtaW4sIHVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJYWxhcm1fdGltZS50bV9ob3VyID0gaHJzOworCWFsYXJtX3RpbWUudG1fbWluID0gbWluOworCWFsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCVBJRV9mcmVxID0gZnJlcTsKKwlQSUVfY291bnQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydGNfdGltZSBjdXJyX3RpbWU7CisJdW5zaWduZWQgbG9uZyBydGNfaW50X2ZsYWcgPSAwOworCWludCBjYWxsX3J0Y19pbnRlcnJ1cHQgPSAwOworCisJaHBldF9ydGNfdGltZXJfcmVpbml0KCk7CisKKwlpZiAoVUlFX29uIHwgQUlFX29uKSB7CisJCXJ0Y19nZXRfcnRjX3RpbWUoJmN1cnJfdGltZSk7CisJfQorCWlmIChVSUVfb24pIHsKKwkJaWYgKGN1cnJfdGltZS50bV9zZWMgIT0gcHJldl91cGRhdGVfc2VjKSB7CisJCQkvKiBTZXQgdXBkYXRlIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnID0gUlRDX1VGOworCQkJcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwkJfQorCX0KKwlpZiAoUElFX29uKSB7CisJCVBJRV9jb3VudCsrOworCQlpZiAoUElFX2NvdW50ID49IGhwZXRfcnRjX2ludF9mcmVxL1BJRV9mcmVxKSB7CisJCQkvKiBTZXQgcGVyaW9kaWMgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgfD0gUlRDX1BGOworCQkJUElFX2NvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoQUlFX29uKSB7CisJCWlmICgoY3Vycl90aW1lLnRtX3NlYyA9PSBhbGFybV90aW1lLnRtX3NlYykgJiYKKwkJICAgIChjdXJyX3RpbWUudG1fbWluID09IGFsYXJtX3RpbWUudG1fbWluKSAmJgorCQkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGFsYXJtX3RpbWUudG1faG91cikpIHsKKwkJCS8qIFNldCBhbGFybSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisJCX0KKwl9CisJaWYgKGNhbGxfcnRjX2ludGVycnVwdCkgeworCQlydGNfaW50X2ZsYWcgfD0gKFJUQ19JUlFGIHwgKFJUQ19OVU1fSU5UUyA8PCA4KSk7CisJCXJ0Y19pbnRlcnJ1cHQocnRjX2ludF9mbGFnLCBkZXZfaWQpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbm9ocGV0X3NldHVwKGNoYXIgKnMpCit7CisJbm9ocGV0ID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9ocGV0Iiwgbm9ocGV0X3NldHVwKTsKKworI2RlZmluZSBIUEVUX01BU0sJMHhGRkZGRkZGRgorI2RlZmluZSBIUEVUX1NISUZUCTIyCisKKy8qIEZTRUMgPSAxMF4tMTUgTlNFQyA9IDEwXi05ICovCisjZGVmaW5lIEZTRUNfUEVSX05TRUMJMTAwMDAwMAorCitzdGF0aWMgdm9pZCAqaHBldF9wdHI7CisKK3N0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQoreworCXJldHVybiAoY3ljbGVfdClyZWFkbChocGV0X3B0cik7Cit9CisKK3N0YXRpYyBjeWNsZV90IF9fdnN5c2NhbGxfZm4gdnJlYWRfaHBldCh2b2lkKQoreworCXJldHVybiByZWFkbCgodm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoVlNZU0NBTExfSFBFVCkgKyAweGYwKTsKK30KKworc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2hwZXQgPSB7CisJLm5hbWUJCT0gImhwZXQiLAorCS5yYXRpbmcJCT0gMjUwLAorCS5yZWFkCQk9IHJlYWRfaHBldCwKKwkubWFzawkJPSAoY3ljbGVfdClIUEVUX01BU0ssCisJLm11bHQJCT0gMCwgLyogc2V0IGJlbG93ICovCisJLnNoaWZ0CQk9IEhQRVRfU0hJRlQsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorCS52cmVhZAkJPSB2cmVhZF9ocGV0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ocGV0X2Nsb2Nrc291cmNlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKKwl2b2lkIF9faW9tZW0gKmhwZXRfYmFzZTsKKwl1NjQgdG1wOworCisJaWYgKCFocGV0X2FkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY2FsY3VsYXRlIHRoZSBocGV0IGFkZHJlc3M6ICovCisJaHBldF9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOworCWhwZXRfcHRyID0gaHBldF9iYXNlICsgSFBFVF9DT1VOVEVSOworCisJLyogY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3k6ICovCisJaHBldF9wZXJpb2QgPSByZWFkbChocGV0X2Jhc2UgKyBIUEVUX1BFUklPRCk7CisKKwkvKgorCSAqIGhwZXQgcGVyaW9kIGlzIGluIGZlbXRvIHNlY29uZHMgcGVyIGN5Y2xlCisJICogc28gd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdG8gbnMvY3ljIHVuaXRzCisJICogYXByb3hpbWF0ZWQgYnkgbXVsdC8yXnNoaWZ0CisJICoKKwkgKiAgZnNlYy9jeWMgKiAxbnNlYy8xMDAwMDAwZnNlYyA9IG5zZWMvY3ljID0gbXVsdC8yXnNoaWZ0CisJICogIGZzZWMvY3ljICogMW5zLzEwMDAwMDBmc2VjICogMl5zaGlmdCA9IG11bHQKKwkgKiAgZnNlYy9jeWMgKiAyXnNoaWZ0ICogMW5zZWMvMTAwMDAwMGZzZWMgPSBtdWx0CisJICogIChmc2VjL2N5YyA8PCBzaGlmdCkvMTAwMDAwMCA9IG11bHQKKwkgKiAgKGhwZXRfcGVyaW9kIDw8IHNoaWZ0KS9GU0VDX1BFUl9OU0VDID0gbXVsdAorCSAqLworCXRtcCA9ICh1NjQpaHBldF9wZXJpb2QgPDwgSFBFVF9TSElGVDsKKwlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKKwljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKKworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jCmluZGV4IGQ3M2M3OWUuLjAxZTJjZjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jCkBAIC0xMDMsNiArMTAzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlBX2NoaXAgPSB7CiAJLm5hbWUJCT0gIlhULVBJQyIsCiAJLm1hc2sJCT0gZGlzYWJsZV84MjU5QV9pcnEsCisJLmRpc2FibGUJPSBkaXNhYmxlXzgyNTlBX2lycSwKIAkudW5tYXNrCQk9IGVuYWJsZV84MjU5QV9pcnEsCiAJLm1hc2tfYWNrCT0gbWFza19hbmRfYWNrXzgyNTlBLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDU2NmU2NGQuLjk1MDY4MmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtODEwLDExICs4MTAsOSBAQAogCQkJdHJpZ2dlciA9PSBJT0FQSUNfTEVWRUwpCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgICAgICBoYW5kbGVfZmFzdGVvaV9pcnEsICJmYXN0ZW9pIik7Ci0JZWxzZSB7Ci0JCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9ERUxBWUVEX0RJU0FCTEU7CisJZWxzZQogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKIAkJCQkJICAgICAgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwotCX0KIH0KIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9JT19BUElDX2lycShpbnQgYXBpYywgaW50IHBpbiwgaW50IGlkeCwgaW50IGlycSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcG10aW1lci5jCmluZGV4IDc1NTQ0NTguLmFlOGY5MTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYwpAQCAtMjQsMTUgKzI0LDYgQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CiAKLS8qIFRoZSBJL08gcG9ydCB0aGUgUE1UTVIgcmVzaWRlcyBhdC4KLSAqIFRoZSBsb2NhdGlvbiBpcyBkZXRlY3RlZCBkdXJpbmcgc2V0dXBfYXJjaCgpLAotICogaW4gYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyAqLwotdTMyIHBtdG1yX2lvcG9ydCBfX3JlYWRfbW9zdGx5OwotCi0vKiB2YWx1ZSBvZiB0aGUgUG93ZXIgdGltZXIgYXQgbGFzdCB0aW1lciBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB1MzIgb2Zmc2V0X2RlbGF5Owotc3RhdGljIHUzMiBsYXN0X3BtdG1yX3RpY2s7Ci0KICNkZWZpbmUgQUNQSV9QTV9NQVNLIDB4RkZGRkZGIC8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KIAogc3RhdGljIGlubGluZSB1MzIgY3ljMnVzKHUzMiBjeWNsZXMpCkBAIC00OCwzOCArMzksNiBAQAogCXJldHVybiAoY3ljbGVzID4+IDEwKTsKIH0KIAotaW50IHBtdGltZXJfbWFya19vZmZzZXQodm9pZCkKLXsKLQlzdGF0aWMgaW50IGZpcnN0X3J1biA9IDE7Ci0JdW5zaWduZWQgbG9uZyB0c2M7Ci0JdTMyIGxvc3Q7Ci0KLQl1MzIgdGljayA9IGlubChwbXRtcl9pb3BvcnQpOwotCXUzMiBkZWx0YTsKLQotCWRlbHRhID0gY3ljMnVzKCh0aWNrIC0gbGFzdF9wbXRtcl90aWNrKSAmIEFDUElfUE1fTUFTSyk7Ci0KLQlsYXN0X3BtdG1yX3RpY2sgPSB0aWNrOwotCW1vbm90b25pY19iYXNlICs9IGRlbHRhICogTlNFQ19QRVJfVVNFQzsKLQotCWRlbHRhICs9IG9mZnNldF9kZWxheTsKLQotCWxvc3QgPSBkZWx0YSAvIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0Jb2Zmc2V0X2RlbGF5ID0gZGVsdGEgJSAoVVNFQ19QRVJfU0VDIC8gSFopOwotCi0JcmR0c2NsbCh0c2MpOwotCXZ4dGltZS5sYXN0X3RzYyA9IHRzYyAtIG9mZnNldF9kZWxheSAqICh1NjQpY3B1X2toeiAvIDEwMDA7Ci0KLQkvKiBkb24ndCBjYWxjdWxhdGUgZGVsYXkgZm9yIGZpcnN0IHJ1biwKLQkgICBvciBpZiB3ZSd2ZSBnb3QgbGVzcyB0aGVuIGEgdGljayAqLwotCWlmIChmaXJzdF9ydW4gfHwgKGxvc3QgPCAxKSkgewotCQlmaXJzdF9ydW4gPSAwOwotCQlvZmZzZXRfZGVsYXkgPSAwOwotCX0KLQotCXJldHVybiBsb3N0IC0gMTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIHBtdGltZXJfd2FpdF90aWNrKHZvaWQpCiB7CiAJdTMyIGEsIGI7CkBAIC0xMDEsMjMgKzYwLDYgQEAKIAl9IHdoaWxlIChjeWMydXMoYiAtIGEpIDwgdXMpOwogfQogCi12b2lkIHBtdGltZXJfcmVzdW1lKHZvaWQpCi17Ci0JbGFzdF9wbXRtcl90aWNrID0gaW5sKHBtdG1yX2lvcG9ydCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkb19nZXR0aW1lb2Zmc2V0X3BtKHZvaWQpCi17Ci0JdTMyIG5vdywgb2Zmc2V0LCBkZWx0YSA9IDA7Ci0KLQlvZmZzZXQgPSBsYXN0X3BtdG1yX3RpY2s7Ci0Jbm93ID0gaW5sKHBtdG1yX2lvcG9ydCk7Ci0JZGVsdGEgPSAobm93IC0gb2Zmc2V0KSAmIEFDUElfUE1fTUFTSzsKLQotCXJldHVybiBvZmZzZXRfZGVsYXkgKyBjeWMydXMoZGVsdGEpOwotfQotCi0KIHN0YXRpYyBpbnQgX19pbml0IG5vcG10aW1lcl9zZXR1cChjaGFyICpzKQogewogCXBtdG1yX2lvcG9ydCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCBkYWYxOTMzLi4zNTQ0MzcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTE0OCwyMTcgKzE0OCw2IEBACiAJcHJpbnRfY3B1X2luZm8oYyk7CiB9CiAKLS8qCi0gKiBOZXcgRnVua3kgVFNDIHN5bmMgYWxnb3JpdGhtIGJvcnJvd2VkIGZyb20gSUE2NC4KLSAqIE1haW4gYWR2YW50YWdlIGlzIHRoYXQgaXQgZG9lc24ndCByZXNldCB0aGUgVFNDcyBmdWxseSBhbmQKLSAqIGluIGdlbmVyYWwgbG9va3MgbW9yZSByb2J1c3QgYW5kIGl0IHdvcmtzIGJldHRlciB0aGFuIG15IGVhcmxpZXIKLSAqIGF0dGVtcHRzLiBJIGJlbGlldmUgaXQgd2FzIHdyaXR0ZW4gYnkgRGF2aWQgTW9zYmVyZ2VyLiBTb21lIG1pbm9yCi0gKiBhZGp1c3RtZW50cyBmb3IgeDg2LTY0IGJ5IG1lIC1BSwotICoKLSAqIE9yaWdpbmFsIGNvbW1lbnQgcmVwcm9kdWNlZCBiZWxvdy4KLSAqCi0gKiBTeW5jaHJvbml6ZSBUU0Mgb2YgdGhlIGN1cnJlbnQgKHNsYXZlKSBDUFUgd2l0aCB0aGUgVFNDIG9mIHRoZQotICogTUFTVEVSIENQVSAobm9ybWFsbHkgdGhlIHRpbWUta2VlcGVyIENQVSkuICBXZSB1c2UgYSBjbG9zZWQgbG9vcCB0bwotICogZWxpbWluYXRlIHRoZSBwb3NzaWJpbGl0eSBvZiB1bmFjY291bnRlZC1mb3IgZXJyb3JzIChzdWNoIGFzCi0gKiBnZXR0aW5nIGEgbWFjaGluZSBjaGVjayBpbiB0aGUgbWlkZGxlIG9mIGEgY2FsaWJyYXRpb24gc3RlcCkuICBUaGUKLSAqIGJhc2ljIGlkZWEgaXMgZm9yIHRoZSBzbGF2ZSB0byBhc2sgdGhlIG1hc3RlciB3aGF0IGl0YyB2YWx1ZSBpdCBoYXMKLSAqIGFuZCB0byByZWFkIGl0cyBvd24gaXRjIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hc3RlciByZXNwb25kcy4gIEVhY2gKLSAqIGl0ZXJhdGlvbiBnaXZlcyB1cyB0aHJlZSB0aW1lc3RhbXBzOgotICoKLSAqCXNsYXZlCQltYXN0ZXIKLSAqCi0gKgl0MCAtLS1cCi0gKiAgICAgICAgICAgICAtLS1cCi0gKgkJICAgLS0tPgotICoJCQl0bQotICoJCSAgIC8tLS0KLSAqCSAgICAgICAvLS0tCi0gKgl0MSA8LS0tCi0gKgotICoKLSAqIFRoZSBnb2FsIGlzIHRvIGFkanVzdCB0aGUgc2xhdmUncyBUU0Mgc3VjaCB0aGF0IHRtIGZhbGxzIGV4YWN0bHkKLSAqIGhhbGYtd2F5IGJldHdlZW4gdDAgYW5kIHQxLiAgSWYgd2UgYWNoaWV2ZSB0aGlzLCB0aGUgY2xvY2tzIGFyZQotICogc3luY2hyb25pemVkIHByb3ZpZGVkIHRoZSBpbnRlcmNvbm5lY3QgYmV0d2VlbiB0aGUgc2xhdmUgYW5kIHRoZQotICogbWFzdGVyIGlzIHN5bW1ldHJpYy4gIEV2ZW4gaWYgdGhlIGludGVyY29ubmVjdCB3ZXJlIGFzeW1tZXRyaWMsIHdlCi0gKiB3b3VsZCBzdGlsbCBrbm93IHRoYXQgdGhlIHN5bmNocm9uaXphdGlvbiBlcnJvciBpcyBzbWFsbGVyIHRoYW4gdGhlCi0gKiByb3VuZHRyaXAgbGF0ZW5jeSAodDAgLSB0MSkuCi0gKgotICogV2hlbiB0aGUgaW50ZXJjb25uZWN0IGlzIHF1aWV0IGFuZCBzeW1tZXRyaWMsIHRoaXMgbGV0cyB1cwotICogc3luY2hyb25pemUgdGhlIFRTQyB0byB3aXRoaW4gb25lIG9yIHR3byBjeWNsZXMuICBIb3dldmVyLCB3ZSBjYW4KLSAqIG9ubHkgKmd1YXJhbnRlZSogdGhhdCB0aGUgc3luY2hyb25pemF0aW9uIGlzIGFjY3VyYXRlIHRvIHdpdGhpbiBhCi0gKiByb3VuZC10cmlwIHRpbWUsIHdoaWNoIGlzIHR5cGljYWxseSBpbiB0aGUgcmFuZ2Ugb2Ygc2V2ZXJhbCBodW5kcmVkCi0gKiBjeWNsZXMgKGUuZy4sIH41MDAgY3ljbGVzKS4gIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIFRTQ3MKLSAqIGFyZSB1c3VhbGx5IGFsbW9zdCBwZXJmZWN0bHkgc3luY2hyb25pemVkLCBidXQgd2Ugc2hvdWxkbid0IGFzc3VtZQotICogdGhhdCB0aGUgYWNjdXJhY3kgaXMgbXVjaCBiZXR0ZXIgdGhhbiBoYWxmIGEgbWljcm8gc2Vjb25kIG9yIHNvLgotICoKLSAqIFt0aGVyZSBhcmUgb3RoZXIgZXJyb3JzIGxpa2UgdGhlIGxhdGVuY3kgb2YgUkRUU0MgYW5kIG9mIHRoZQotICogV1JNU1IuIFRoZXNlIGNhbiBhbHNvIGFjY291bnQgdG8gaHVuZHJlZHMgb2YgY3ljbGVzLiBTbyBpdCdzCi0gKiBwcm9iYWJseSB3b3JzZS4gSXQgY2xhaW1zIDE1MyBjeWNsZXMgZXJyb3Igb24gYSBkdWFsIE9wdGVyb24sCi0gKiBidXQgSSBzdXNwZWN0IHRoZSBudW1iZXJzIGFyZSBhY3R1YWxseSBzb21ld2hhdCB3b3JzZSAtQUtdCi0gKi8KLQotI2RlZmluZSBNQVNURVIJMAotI2RlZmluZSBTTEFWRQkoU01QX0NBQ0hFX0JZVEVTLzgpCi0KLS8qIEludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGNwdV9yZWxheCgpIHdoaWxlIFRTQyBzeW5jaHJvbml6YXRpb24KLSAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBnbyBpbnRvIGZ1bmt5IHBvd2VyIHNhdmUgbW9kaSBvciBjYXVzZQotICAgaHlwZXJ2aXNvcnMgdG8gc2NoZWR1bGUgdXMgYXdheS4gIEdvaW5nIHRvIHNsZWVwIHdvdWxkIGxpa2VseSBhZmZlY3QKLSAgIGxhdGVuY3kgYW5kIGxvdyBsYXRlbmN5IGlzIHRoZSBwcmltYXJ5IG9iamVjdGl2ZSBoZXJlLiAtQUsgKi8KLSNkZWZpbmUgbm9fY3B1X3JlbGF4KCkgYmFycmllcigpCi0KLXN0YXRpYyBfX2NwdWluaXRkYXRhIERFRklORV9TUElOTE9DSyh0c2Nfc3luY19sb2NrKTsKLXN0YXRpYyB2b2xhdGlsZSBfX2NwdWluaXRkYXRhIHVuc2lnbmVkIGxvbmcgZ29bU0xBVkUgKyAxXTsKLXN0YXRpYyBpbnQgbm90c2NzeW5jIF9fY3B1aW5pdGRhdGE7Ci0KLSN1bmRlZiBERUJVR19UU0NfU1lOQwotCi0jZGVmaW5lIE5VTV9ST1VORFMJNjQJLyogbWFnaWMgdmFsdWUgKi8KLSNkZWZpbmUgTlVNX0lURVJTCTUJLyogbGlrZXdpc2UgKi8KLQotLyogQ2FsbGJhY2sgb24gYm9vdCBDUFUgKi8KLXN0YXRpYyBfX2NwdWluaXQgdm9pZCBzeW5jX21hc3Rlcih2b2lkICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaTsKLQotCWdvW01BU1RFUl0gPSAwOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9ST1VORFMqTlVNX0lURVJTOyArK2kpIHsKLQkJCXdoaWxlICghZ29bTUFTVEVSXSkKLQkJCQlub19jcHVfcmVsYXgoKTsKLQkJCWdvW01BU1RFUl0gPSAwOwotCQkJcmR0c2NsbChnb1tTTEFWRV0pOwotCQl9Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBieSB3aGljaCBvdXIgdHNjIGRpZmZlcnMgZnJvbSB0aGUgdHNjCi0gKiBvbiB0aGUgbWFzdGVyICh0aW1lLWtlZXBlcikgQ1BVLiAgQSBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGVzIG91cgotICogdHNjIGlzIGFoZWFkIG9mIHRoZSBtYXN0ZXIsIG5lZ2F0aXZlIHRoYXQgaXQgaXMgYmVoaW5kLgotICovCi1zdGF0aWMgaW5saW5lIGxvbmcKLWdldF9kZWx0YShsb25nICpydCwgbG9uZyAqbWFzdGVyKQotewotCXVuc2lnbmVkIGxvbmcgYmVzdF90MCA9IDAsIGJlc3RfdDEgPSB+MFVMLCBiZXN0X3RtID0gMDsKLQl1bnNpZ25lZCBsb25nIHRjZW50ZXIsIHQwLCB0MSwgdG07Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lURVJTOyArK2kpIHsKLQkJcmR0c2NsbCh0MCk7Ci0JCWdvW01BU1RFUl0gPSAxOwotCQl3aGlsZSAoISh0bSA9IGdvW1NMQVZFXSkpCi0JCQlub19jcHVfcmVsYXgoKTsKLQkJZ29bU0xBVkVdID0gMDsKLQkJcmR0c2NsbCh0MSk7Ci0KLQkJaWYgKHQxIC0gdDAgPCBiZXN0X3QxIC0gYmVzdF90MCkKLQkJCWJlc3RfdDAgPSB0MCwgYmVzdF90MSA9IHQxLCBiZXN0X3RtID0gdG07Ci0JfQotCi0JKnJ0ID0gYmVzdF90MSAtIGJlc3RfdDA7Ci0JKm1hc3RlciA9IGJlc3RfdG0gLSBiZXN0X3QwOwotCi0JLyogYXZlcmFnZSBiZXN0X3QwIGFuZCBiZXN0X3QxIHdpdGhvdXQgb3ZlcmZsb3c6ICovCi0JdGNlbnRlciA9IChiZXN0X3QwLzIgKyBiZXN0X3QxLzIpOwotCWlmIChiZXN0X3QwICUgMiArIGJlc3RfdDEgJSAyID09IDIpCi0JCSsrdGNlbnRlcjsKLQlyZXR1cm4gdGNlbnRlciAtIGJlc3RfdG07Ci19Ci0KLXN0YXRpYyBfX2NwdWluaXQgdm9pZCBzeW5jX3RzYyh1bnNpZ25lZCBpbnQgbWFzdGVyKQotewotCWludCBpLCBkb25lID0gMDsKLQlsb25nIGRlbHRhLCBhZGosIGFkanVzdF9sYXRlbmN5ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBydCwgbWFzdGVyX3RpbWVfc3RhbXAsIGJvdW5kOwotI2lmZGVmIERFQlVHX1RTQ19TWU5DCi0Jc3RhdGljIHN0cnVjdCBzeW5jZGVidWcgewotCQlsb25nIHJ0OwkvKiByb3VuZHRyaXAgdGltZSAqLwotCQlsb25nIG1hc3RlcjsJLyogbWFzdGVyJ3MgdGltZXN0YW1wICovCi0JCWxvbmcgZGlmZjsJLyogZGlmZmVyZW5jZSBiZXR3ZWVuIG1pZHBvaW50IGFuZCBtYXN0ZXIncyB0aW1lc3RhbXAgKi8KLQkJbG9uZyBsYXQ7CS8qIGVzdGltYXRlIG9mIHRzYyBhZGp1c3RtZW50IGxhdGVuY3kgKi8KLQl9IHRbTlVNX1JPVU5EU10gX19jcHVpbml0ZGF0YTsKLSNlbmRpZgotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkOiBTeW5jaW5nIFRTQyB0byBDUFUgJXUuXG4iLAotCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1hc3Rlcik7Ci0KLQlnb1tNQVNURVJdID0gMTsKLQotCS8qIEl0IGlzIGRhbmdlcm91cyB0byBicm9hZGNhc3QgSVBJIGFzIGNwdXMgYXJlIGNvbWluZyB1cCwKLQkgKiBhcyB0aGV5IG1heSBub3QgYmUgcmVhZHkgdG8gYWNjZXB0IHRoZW0uICBTbyBzaW5jZQotCSAqIHdlIG9ubHkgbmVlZCB0byBzZW5kIHRoZSBpcGkgdG8gdGhlIGJvb3QgY3B1IGRpcmVjdAotCSAqIHRoZSBtZXNzYWdlLCBhbmQgYXZvaWQgdGhlIHJhY2UuCi0JICovCi0Jc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKG1hc3Rlciwgc3luY19tYXN0ZXIsIE5VTEwsIDEsIDApOwotCi0Jd2hpbGUgKGdvW01BU1RFUl0pCS8qIHdhaXQgZm9yIG1hc3RlciB0byBiZSByZWFkeSAqLwotCQlub19jcHVfcmVsYXgoKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0c2Nfc3luY19sb2NrLCBmbGFncyk7Ci0JewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JPVU5EUzsgKytpKSB7Ci0JCQlkZWx0YSA9IGdldF9kZWx0YSgmcnQsICZtYXN0ZXJfdGltZV9zdGFtcCk7Ci0JCQlpZiAoZGVsdGEgPT0gMCkgewotCQkJCWRvbmUgPSAxOwkvKiBsZXQncyBsb2NrIG9uIHRvIHRoaXMuLi4gKi8KLQkJCQlib3VuZCA9IHJ0OwotCQkJfQotCi0JCQlpZiAoIWRvbmUpIHsKLQkJCQl1bnNpZ25lZCBsb25nIHQ7Ci0JCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCWFkanVzdF9sYXRlbmN5ICs9IC1kZWx0YTsKLQkJCQkJYWRqID0gLWRlbHRhICsgYWRqdXN0X2xhdGVuY3kvNDsKLQkJCQl9IGVsc2UKLQkJCQkJYWRqID0gLWRlbHRhOwotCi0JCQkJcmR0c2NsbCh0KTsKLQkJCQl3cm1zcmwoTVNSX0lBMzJfVFNDLCB0ICsgYWRqKTsKLQkJCX0KLSNpZmRlZiBERUJVR19UU0NfU1lOQwotCQkJdFtpXS5ydCA9IHJ0OwotCQkJdFtpXS5tYXN0ZXIgPSBtYXN0ZXJfdGltZV9zdGFtcDsKLQkJCXRbaV0uZGlmZiA9IGRlbHRhOwotCQkJdFtpXS5sYXQgPSBhZGp1c3RfbGF0ZW5jeS80OwotI2VuZGlmCi0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNjX3N5bmNfbG9jaywgZmxhZ3MpOwotCi0jaWZkZWYgREVCVUdfVFNDX1NZTkMKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JPVU5EUzsgKytpKQotCQlwcmludGsoInJ0PSU1bGQgbWFzdGVyPSU1bGQgZGlmZj0lNWxkIGFkamxhdD0lNWxkXG4iLAotCQkgICAgICAgdFtpXS5ydCwgdFtpXS5tYXN0ZXIsIHRbaV0uZGlmZiwgdFtpXS5sYXQpOwotI2VuZGlmCi0KLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJDUFUgJWQ6IHN5bmNocm9uaXplZCBUU0Mgd2l0aCBDUFUgJXUgKGxhc3QgZGlmZiAlbGQgY3ljbGVzLCAiCi0JICAgICAgICJtYXhlcnIgJWx1IGN5Y2xlcylcbiIsCi0JICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgbWFzdGVyLCBkZWx0YSwgcnQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgdHNjX3N5bmNfd2FpdCh2b2lkKQotewotCS8qCi0JICogV2hlbiB0aGUgQ1BVIGhhcyBzeW5jaHJvbml6ZWQgVFNDcyBhc3N1bWUgdGhlIEJJT1MKLSAgCSAqIG9yIHRoZSBoYXJkd2FyZSBhbHJlYWR5IHN5bmNlZC4gIE90aGVyd2lzZSB3ZSBjb3VsZAotCSAqIG1lc3MgdXAgYSBwb3NzaWJsZSBwZXJmZWN0IHN5bmNocm9uaXphdGlvbiB3aXRoIGEKLQkgKiBub3QtcXVpdGUtcGVyZmVjdCBhbGdvcml0aG0uCi0JICovCi0JaWYgKG5vdHNjc3luYyB8fCAhY3B1X2hhc190c2MgfHwgIXVuc3luY2hyb25pemVkX3RzYygpKQotCQlyZXR1cm47Ci0Jc3luY190c2MoMCk7Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IG5vdHNjc3luY19zZXR1cChjaGFyICpzKQotewotCW5vdHNjc3luYyA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJub3RzY3N5bmMiLCBub3RzY3N5bmNfc2V0dXApOwotCiBzdGF0aWMgYXRvbWljX3QgaW5pdF9kZWFzc2VydGVkIF9fY3B1aW5pdGRhdGE7CiAKIC8qCkBAIC01NDYsNiArMzM1LDExIEBACiAJLyogb3RoZXJ3aXNlIGdjYyB3aWxsIG1vdmUgdXAgdGhlIHNtcF9wcm9jZXNzb3JfaWQgYmVmb3JlIHRoZSBjcHVfaW5pdCAqLwogCWJhcnJpZXIoKTsKIAorCS8qCisgIAkgKiBDaGVjayBUU0Mgc3luYyBmaXJzdDoKKyAJICovCisJY2hlY2tfdHNjX3N5bmNfdGFyZ2V0KCk7CisKIAlEcHJpbnRrKCJjcHUgJWQ6IHNldHRpbmcgdXAgYXBpYyBjbG9ja1xuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsgCQogCXNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKCk7CiAKQEAgLTU2NSwxNCArMzU5LDYgQEAKIAkgKi8KIAlzZXRfY3B1X3NpYmxpbmdfbWFwKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKLQkvKiAKLSAgCSAqIFdhaXQgZm9yIFRTQyBzeW5jIHRvIG5vdCBzY2hlZHVsZSB0aGluZ3MgYmVmb3JlLgotCSAqIFdlIHN0aWxsIHByb2Nlc3MgaW50ZXJydXB0cywgd2hpY2ggY291bGQgc2VlIGFuIGluY29uc2lzdGVudAotCSAqIHRpbWUgaW4gdGhhdCB3aW5kb3cgdW5mb3J0dW5hdGVseS4gCi0JICogRG8gdGhpcyBoZXJlIGJlY2F1c2UgVFNDIHN5bmMgaGFzIGdsb2JhbCB1bnByb3RlY3RlZCBzdGF0ZS4KLSAJICovCi0JdHNjX3N5bmNfd2FpdCgpOwotCiAJLyoKIAkgKiBXZSBuZWVkIHRvIGhvbGQgY2FsbF9sb2NrLCBzbyB0aGVyZSBpcyBubyBpbmNvbnNpc3RlbmN5CiAJICogYmV0d2VlbiB0aGUgdGltZSBzbXBfY2FsbF9mdW5jdGlvbigpIGRldGVybWluZXMgbnVtYmVyIG9mCkBAIC01OTIsNiArMzc4LDcgQEAKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKIAlzcGluX3VubG9jaygmdmVjdG9yX2xvY2spOworCiAJdW5sb2NrX2lwaV9jYWxsX2xvY2soKTsKIAogCWNwdV9pZGxlKCk7CkBAIC0xMTY4LDYgKzk1NSwxMSBAQAogCS8qIFVubGVhc2ggdGhlIENQVSEgKi8KIAlEcHJpbnRrKCJ3YWl0aW5nIGZvciBjcHUgJWRcbiIsIGNwdSk7CiAKKwkvKgorICAJICogTWFrZSBzdXJlIGFuZCBjaGVjayBUU0Mgc3luYzoKKyAJICovCisJY2hlY2tfdHNjX3N5bmNfc291cmNlKGNwdSk7CisKIAl3aGlsZSAoIWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKSkKIAkJY3B1X3JlbGF4KCk7CiAKQEAgLTExOTAsNyArOTgyLDYgQEAKIAlzbXBfY2xlYW51cF9ib290KCk7CiAJc2V0dXBfaW9hcGljX2Rlc3QoKTsKIAljaGVja19ubWlfd2F0Y2hkb2coKTsKLQl0aW1lX2luaXRfZ3RvZCgpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwppbmRleCAzY2M2ODg2Li5hODdjNTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKQEAgLTQyLDEwICs0Miw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKLXN0YXRpYyB2b2lkIGNwdWZyZXFfZGVsYXllZF9nZXQodm9pZCk7Ci0jZW5kaWYKIGV4dGVybiB2b2lkIGk4MjU0X3RpbWVyX3Jlc3VtZSh2b2lkKTsKIGV4dGVybiBpbnQgdXNpbmdfYXBpY190aW1lcjsKIApAQCAtNTUsMTI4ICs1Myw3IEBACiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIAotaW50IG5vaHBldCBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgbm90c2MgX19pbml0ZGF0YSA9IDA7Ci0KLSNkZWZpbmUgVVNFQ19QRVJfVElDSyAoVVNFQ19QRVJfU0VDIC8gSFopCi0jZGVmaW5lIE5TRUNfUEVSX1RJQ0sgKE5TRUNfUEVSX1NFQyAvIEhaKQotI2RlZmluZSBGU0VDX1BFUl9USUNLIChGU0VDX1BFUl9TRUMgLyBIWikKLQotI2RlZmluZSBOU19TQ0FMRQkxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCi0jZGVmaW5lIFVTX1NDQUxFCTMyIC8qIDJeMzIsIGFyYml0cmFscmlseSBjaG9zZW4gKi8KLQotdW5zaWduZWQgaW50IGNwdV9raHo7CQkJCQkvKiBUU0MgY2xvY2tzIC8gdXNlYywgbm90IHVzZWQgaGVyZSAqLwotRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcGVyaW9kOwkJCS8qIGZzZWNzIC8gSFBFVCBjbG9jayAqLwotdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CQkJCS8qIEhQRVQgY2xvY2tzIC8gaW50ZXJydXB0ICovCi1pbnQgaHBldF91c2VfdGltZXI7CQkJCS8qIFVzZSBjb3VudGVyIG9mIGhwZXQgZm9yIHRpbWUga2VlcGluZywgb3RoZXJ3aXNlIFBJVCAqLwotdW5zaWduZWQgbG9uZyB2eHRpbWVfaHogPSBQSVRfVElDS19SQVRFOwotaW50IHJlcG9ydF9sb3N0X3RpY2tzOwkJCQkvKiBjb21tYW5kIGxpbmUgb3B0aW9uICovCi11bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7Ci0KLXN0cnVjdCB2eHRpbWVfZGF0YSBfX3Z4dGltZSBfX3NlY3Rpb25fdnh0aW1lOwkvKiBmb3IgdnN5c2NhbGxzICovCi0KIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19qaWZmaWVzIF9fc2VjdGlvbl9qaWZmaWVzID0gSU5JVElBTF9KSUZGSUVTOwotc3RydWN0IHRpbWVzcGVjIF9feHRpbWUgX19zZWN0aW9uX3h0aW1lOwotc3RydWN0IHRpbWV6b25lIF9fc3lzX3R6IF9fc2VjdGlvbl9zeXNfdHo7Ci0KLS8qCi0gKiBkb19nZXR0aW1lb2Zmc2V0KCkgcmV0dXJucyBtaWNyb3NlY29uZHMgc2luY2UgbGFzdCB0aW1lciBpbnRlcnJ1cHQgd2FzCi0gKiB0cmlnZ2VyZWQgYnkgaGFyZHdhcmUuIEEgbWVtb3J5IHJlYWQgb2YgSFBFVCBpcyBzbG93ZXIgdGhhbiBhIHJlZ2lzdGVyIHJlYWQKLSAqIG9mIFRTQywgYnV0IG11Y2ggbW9yZSByZWxpYWJsZS4gSXQncyBhbHNvIHN5bmNocm9uaXplZCB0byB0aGUgdGltZXIKLSAqIGludGVycnVwdC4gTm90ZSB0aGF0IGRvX2dldHRpbWVvZmZzZXQoKSBtYXkgcmV0dXJuIG1vcmUgdGhhbiBocGV0X3RpY2ssIGlmIGEKLSAqIHRpbWVyIGludGVycnVwdCBoYXMgaGFwcGVuZWQgYWxyZWFkeSwgYnV0IHZ4dGltZS50cmlnZ2VyIHdhc24ndCB1cGRhdGVkIHlldC4KLSAqIFRoaXMgaXMgbm90IGEgcHJvYmxlbSwgYmVjYXVzZSBqaWZmaWVzIGhhc24ndCB1cGRhdGVkIGVpdGhlci4gVGhleSBhcmUgYm91bmQKLSAqIHRvZ2V0aGVyIGJ5IHh0aW1lX2xvY2suCi0gKi8KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZG9fZ2V0dGltZW9mZnNldF90c2Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JdW5zaWduZWQgbG9uZyB4OwotCXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQlpZiAodCA8IHZ4dGltZS5sYXN0X3RzYykgCi0JCXQgPSB2eHRpbWUubGFzdF90c2M7IC8qIGhhY2sgKi8KLQl4ID0gKCh0IC0gdnh0aW1lLmxhc3RfdHNjKSAqIHZ4dGltZS50c2NfcXVvdCkgPj4gVVNfU0NBTEU7Ci0JcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRvX2dldHRpbWVvZmZzZXRfaHBldCh2b2lkKQotewotCS8qIGNhcCBjb3VudGVyIHJlYWQgdG8gb25lIHRpY2sgdG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzICovCi0JdW5zaWduZWQgbG9uZyBjb3VudGVyID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gdnh0aW1lLmxhc3Q7Ci0JcmV0dXJuIChtaW4oY291bnRlcixocGV0X3RpY2spICogdnh0aW1lLnF1b3QpID4+IFVTX1NDQUxFOwotfQotCi11bnNpZ25lZCBpbnQgKCpkb19nZXR0aW1lb2Zmc2V0KSh2b2lkKSA9IGRvX2dldHRpbWVvZmZzZXRfdHNjOwotCi0vKgotICogVGhpcyB2ZXJzaW9uIG9mIGdldHRpbWVvZmRheSgpIGhhcyBtaWNyb3NlY29uZCByZXNvbHV0aW9uIGFuZCBiZXR0ZXIgdGhhbgotICogbWljcm9zZWNvbmQgcHJlY2lzaW9uLCBhcyB3ZSdyZSB1c2luZyBhdCBsZWFzdCBhIDEwIE1IeiAodXN1YWxseSAxNC4zMTgxOAotICogTUh6KSBIUEVUIHRpbWVyLgotICovCi0KLXZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKLXsKLQl1bnNpZ25lZCBsb25nIHNlcTsKLSAJdW5zaWduZWQgaW50IHNlYywgdXNlYzsKLQotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0KLQkJc2VjID0geHRpbWUudHZfc2VjOwotCQl1c2VjID0geHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7Ci0KLQkJLyogaTM4NiBkb2VzIHNvbWUgY29ycmVjdGlvbiBoZXJlIHRvIGtlZXAgdGhlIGNsb2NrIAotCQkgICBtb25vdG9ub3VzIGV2ZW4gd2hlbiBudHBkIGlzIGZpeGluZyBkcmlmdC4KLQkJICAgQnV0IHRoZXkgZGlkbid0IHdvcmsgZm9yIG1lLCB0aGVyZSBpcyBhIG5vbiBtb25vdG9uaWMKLQkJICAgY2xvY2sgYW55d2F5cyB3aXRoIG50cC4KLQkJICAgSSBkcm9wcGVkIGFsbCBjb3JyZWN0aW9ucyBub3cgdW50aWwgYSByZWFsIHNvbHV0aW9uIGNhbgotCQkgICBiZSBmb3VuZC4gTm90ZSB3aGVuIHlvdSBmaXggaXQgaGVyZSB5b3UgbmVlZCB0byBkbyB0aGUgc2FtZQotCQkgICBpbiBhcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYyBhbmQgZXhwb3J0IGFsbCBuZWVkZWQKLQkJICAgdmFyaWFibGVzIGluIHZtbGludXgubGRzLiAtQUsgKi8gCi0JCXVzZWMgKz0gZG9fZ2V0dGltZW9mZnNldCgpOwotCi0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7Ci0KLQl0di0+dHZfc2VjID0gc2VjICsgdXNlYyAvIFVTRUNfUEVSX1NFQzsKLQl0di0+dHZfdXNlYyA9IHVzZWMgJSBVU0VDX1BFUl9TRUM7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKLQotLyoKLSAqIHNldHRpbWVvZmRheSgpIGZpcnN0IHVuZG9lcyB0aGUgY29ycmVjdGlvbiB0aGF0IGdldHRpbWVvZmRheSB3b3VsZCBkbwotICogb24gdGhlIHRpbWUsIGFuZCB0aGVuIHNhdmVzIGl0LiBUaGlzIGlzIHVnbHksIGJ1dCBoYXMgYmVlbiBsaWtlIHRoaXMgZm9yCi0gKiBhZ2VzIGFscmVhZHkuCi0gKi8KLQotaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQotewotCXRpbWVfdCB3dG1fc2VjLCBzZWMgPSB0di0+dHZfc2VjOwotCWxvbmcgd3RtX25zZWMsIG5zZWMgPSB0di0+dHZfbnNlYzsKLQotCWlmICgodW5zaWduZWQgbG9uZyl0di0+dHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd3JpdGVfc2VxbG9ja19pcnEoJnh0aW1lX2xvY2spOwotCi0JbnNlYyAtPSBkb19nZXR0aW1lb2Zmc2V0KCkgKiBOU0VDX1BFUl9VU0VDOwotCi0Jd3RtX3NlYyAgPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyAoeHRpbWUudHZfc2VjIC0gc2VjKTsKLQl3dG1fbnNlYyA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgKyAoeHRpbWUudHZfbnNlYyAtIG5zZWMpOwotCi0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwotCi0JbnRwX2NsZWFyKCk7Ci0KLQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQljbG9ja193YXNfc2V0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKIAogdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMjY3LDg0ICsxNDQsOSBAQAogfQogCiAKLS8qIG1vbm90b25pY19jbG9jaygpOiByZXR1cm5zICMgb2YgbmFub3NlY29uZHMgcGFzc2VkIHNpbmNlIHRpbWVfaW5pdCgpCi0gKgkJTm90ZTogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byByZXR1cm4gYWNjdXJhdGUKLSAqCQl0aW1lIGV2ZW4gaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwbGUgdGltZXIgdGlja3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpOwotdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgc2VxOwotIAl1MzIgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGJhc2U7Ci0KLQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX0hQRVQpIHsKLQkJZG8gewotCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0KLQkJCWxhc3Rfb2Zmc2V0ID0gdnh0aW1lLmxhc3Q7Ci0JCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7Ci0JCQl0aGlzX29mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7Ci0JCW9mZnNldCA9ICh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKLQkJb2Zmc2V0ICo9IE5TRUNfUEVSX1RJQ0sgLyBocGV0X3RpY2s7Ci0JfSBlbHNlIHsKLQkJZG8gewotCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0KLQkJCWxhc3Rfb2Zmc2V0ID0gdnh0aW1lLmxhc3RfdHNjOwotCQkJYmFzZSA9IG1vbm90b25pY19iYXNlOwotCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQkJdGhpc19vZmZzZXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQkJb2Zmc2V0ID0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Ci0JfQotCXJldHVybiBiYXNlICsgb2Zmc2V0OwotfQotRVhQT1JUX1NZTUJPTChtb25vdG9uaWNfY2xvY2spOwotCi1zdGF0aWMgbm9pbmxpbmUgdm9pZCBoYW5kbGVfbG9zdF90aWNrcyhpbnQgbG9zdCkKLXsKLQlzdGF0aWMgbG9uZyBsb3N0X2NvdW50OwotCXN0YXRpYyBpbnQgd2FybmVkOwotCWlmIChyZXBvcnRfbG9zdF90aWNrcykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0aW1lLmM6IExvc3QgJWQgdGltZXIgdGljayhzKSEgIiwgbG9zdCk7Ci0JCXByaW50X3N5bWJvbCgicmlwICVzKVxuIiwgZ2V0X2lycV9yZWdzKCktPnJpcCk7Ci0JfQotCi0JaWYgKGxvc3RfY291bnQgPT0gMTAwMCAmJiAhd2FybmVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIndhcm5pbmc6IG1hbnkgbG9zdCB0aWNrcy5cbiIKLQkJICAgICAgIEtFUk5fV0FSTklORyAiWW91ciB0aW1lIHNvdXJjZSBzZWVtcyB0byBiZSBpbnN0YWJsZSBvciAiCi0JCSAgIAkJInNvbWUgZHJpdmVyIGlzIGhvZ2dpbmcgaW50ZXJ1cHRzXG4iKTsKLQkJcHJpbnRfc3ltYm9sKCJyaXAgJXNcbiIsIGdldF9pcnFfcmVncygpLT5yaXApOwotCQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1RTQyAmJiB2eHRpbWUuaHBldF9hZGRyZXNzKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWxsaW5nIGJhY2sgdG8gSFBFVFxuIik7Ci0JCQlpZiAoaHBldF91c2VfdGltZXIpCi0JCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIAotCQkJCQkJCWhwZXRfdGljazsKLQkJCWVsc2UKLQkJCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQkJCXZ4dGltZS5tb2RlID0gVlhUSU1FX0hQRVQ7Ci0JCQlkb19nZXR0aW1lb2Zmc2V0ID0gZG9fZ2V0dGltZW9mZnNldF9ocGV0OwotCQl9Ci0JCS8qIGVsc2Ugc2hvdWxkIGZhbGwgYmFjayB0byBQSVQsIGJ1dCBjb2RlIG1pc3NpbmcuICovCi0JCXdhcm5lZCA9IDE7Ci0JfSBlbHNlCi0JCWxvc3RfY291bnQrKzsKLQotI2lmZGVmIENPTkZJR19DUFVfRlJFUQotCS8qIEluIHNvbWUgY2FzZXMgdGhlIENQVSBjYW4gY2hhbmdlIGZyZXF1ZW5jeSB3aXRob3V0IHVzIG5vdGljaW5nCi0JICAgR2l2ZSBjcHVmcmVxIGEgY2hhbmdlIHRvIGNhdGNoIHVwLiAqLwotCWlmICgobG9zdF9jb3VudCsxKSAlIDI1ID09IDApCi0JCWNwdWZyZXFfZGVsYXllZF9nZXQoKTsKLSNlbmRpZgotfQotCiB2b2lkIG1haW5fdGltZXJfaGFuZGxlcih2b2lkKQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y191cGRhdGUgPSAwOwotCXVuc2lnbmVkIGxvbmcgdHNjOwotCWludCBkZWxheSA9IDAsIG9mZnNldCA9IDAsIGxvc3QgPSAwOwotCiAvKgogICogSGVyZSB3ZSBhcmUgaW4gdGhlIHRpbWVyIGlycSBoYW5kbGVyLiBXZSBoYXZlIGlycXMgbG9jYWxseSBkaXNhYmxlZCAoc28gd2UKICAqIGRvbid0IG5lZWQgc3Bpbl9sb2NrX2lycXNhdmUoKSkgYnV0IHdlIGRvbid0IGtub3cgaWYgdGhlIHRpbWVyX2JoIGlzIHJ1bm5pbmcKQEAgLTM1NCw3MiArMTU2LDExIEBACiAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIAotCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzKQotCQlvZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpIHsKLQkJLyogaWYgd2UncmUgdXNpbmcgdGhlIGhwZXQgdGltZXIgZnVuY3Rpb25hbGl0eSwKLQkJICogd2UgY2FuIG1vcmUgYWNjdXJhdGVseSBrbm93IHRoZSBjb3VudGVyIHZhbHVlCi0JCSAqIHdoZW4gdGhlIHRpbWVyIGludGVycnVwdCBvY2N1cmVkLgotCQkgKi8KLQkJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7Ci0JCWRlbGF5ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gb2Zmc2V0OwotCX0gZWxzZSBpZiAoIXBtdG1yX2lvcG9ydCkgewotCQlzcGluX2xvY2soJmk4MjUzX2xvY2spOwotCQlvdXRiX3AoMHgwMCwgMHg0Myk7Ci0JCWRlbGF5ID0gaW5iX3AoMHg0MCk7Ci0JCWRlbGF5IHw9IGluYigweDQwKSA8PCA4OwotCQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7Ci0JCWRlbGF5ID0gTEFUQ0ggLSAxIC0gZGVsYXk7Ci0JfQotCi0JdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0KLQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX0hQRVQpIHsKLQkJaWYgKG9mZnNldCAtIHZ4dGltZS5sYXN0ID4gaHBldF90aWNrKSB7Ci0JCQlsb3N0ID0gKG9mZnNldCAtIHZ4dGltZS5sYXN0KSAvIGhwZXRfdGljayAtIDE7Ci0JCX0KLQotCQltb25vdG9uaWNfYmFzZSArPSAKLQkJCShvZmZzZXQgLSB2eHRpbWUubGFzdCkgKiBOU0VDX1BFUl9USUNLIC8gaHBldF90aWNrOwotCi0JCXZ4dGltZS5sYXN0ID0gb2Zmc2V0OwotI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKLQl9IGVsc2UgaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9QTVRNUikgewotCQlsb3N0ID0gcG10aW1lcl9tYXJrX29mZnNldCgpOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJb2Zmc2V0ID0gKCgodHNjIC0gdnh0aW1lLmxhc3RfdHNjKSAqCi0JCQkgICB2eHRpbWUudHNjX3F1b3QpID4+IFVTX1NDQUxFKSAtIFVTRUNfUEVSX1RJQ0s7Ci0KLQkJaWYgKG9mZnNldCA8IDApCi0JCQlvZmZzZXQgPSAwOwotCi0JCWlmIChvZmZzZXQgPiBVU0VDX1BFUl9USUNLKSB7Ci0JCQlsb3N0ID0gb2Zmc2V0IC8gVVNFQ19QRVJfVElDSzsKLQkJCW9mZnNldCAlPSBVU0VDX1BFUl9USUNLOwotCQl9Ci0KLQkJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModHNjIC0gdnh0aW1lLmxhc3RfdHNjKTsKLQotCQl2eHRpbWUubGFzdF90c2MgPSB0c2MgLSB2eHRpbWUucXVvdCAqIGRlbGF5IC8gdnh0aW1lLnRzY19xdW90OwotCi0JCWlmICgoKCh0c2MgLSB2eHRpbWUubGFzdF90c2MpICoKLQkJICAgICAgdnh0aW1lLnRzY19xdW90KSA+PiBVU19TQ0FMRSkgPCBvZmZzZXQpCi0JCQl2eHRpbWUubGFzdF90c2MgPSB0c2MgLQotCQkJCSgoKGxvbmcpIG9mZnNldCA8PCBVU19TQ0FMRSkgLyB2eHRpbWUudHNjX3F1b3QpIC0gMTsKLQl9Ci0KLQlpZiAobG9zdCA+IDApCi0JCWhhbmRsZV9sb3N0X3RpY2tzKGxvc3QpOwotCWVsc2UKLQkJbG9zdCA9IDA7Ci0KIC8qCiAgKiBEbyB0aGUgdGltZXIgc3R1ZmYuCiAgKi8KIAotCWRvX3RpbWVyKGxvc3QgKyAxKTsKKwlkb190aW1lcigxKTsKICNpZm5kZWYgQ09ORklHX1NNUAogCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogI2VuZGlmCkBAIC00NjAsNDAgKzIwMSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGN5YzJuc19zY2FsZSBfX3JlYWRfbW9zdGx5OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGNwdV9raHopCi17Ci0JY3ljMm5zX3NjYWxlID0gKE5TRUNfUEVSX01TRUMgPDwgTlNfU0NBTEUpIC8gY3B1X2toejsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKLXsKLQlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gTlNfU0NBTEU7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYSA9IDA7Ci0KLSNpZiAwCi0JLyogRG9uJ3QgZG8gYSBIUEVUIHJlYWQgaGVyZS4gVXNpbmcgVFNDIGFsd2F5cyBpcyBtdWNoIGZhc3RlcgotCSAgIGFuZCBIUEVUIG1heSBub3QgYmUgbWFwcGVkIHlldCB3aGVuIHRoZSBzY2hlZHVsZXIgZmlyc3QgcnVucy4KLSAgICAgICAgICAgRGlzYWR2YW50YWdlIGlzIGEgc21hbGwgZHJpZnQgYmV0d2VlbiBDUFVzIGluIHNvbWUgY29uZmlndXJhdGlvbnMsCi0JICAgYnV0IHRoYXQgc2hvdWxkIGJlIHRvbGVyYWJsZS4gKi8KLQlpZiAoX192eHRpbWUubW9kZSA9PSBWWFRJTUVfSFBFVCkKLQkJcmV0dXJuIChocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgKiB2eHRpbWUucXVvdCkgPj4gVVNfU0NBTEU7Ci0jZW5kaWYKLQotCS8qIENvdWxkIGRvIENQVSBjb3JlIHN5bmMgaGVyZS4gT3B0ZXJvbiBjYW4gZXhlY3V0ZSByZHRzYyBzcGVjdWxhdGl2ZWx5LAotCSAgIHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBjb21wbGV0ZWx5IGV4YWN0IGFuZCBtYXkgbm90IGJlIG1vbm90b25vdXMgYmV0d2VlbgotCSAgIENQVXMuIEJ1dCB0aGUgZXJyb3JzIHNob3VsZCBiZSB0b28gc21hbGwgdG8gbWF0dGVyIGZvciBzY2hlZHVsaW5nCi0JICAgcHVycG9zZXMuICovCi0KLQlyZHRzY2xsKGEpOwotCXJldHVybiBjeWNsZXNfMl9ucyhhKTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKQogewogCXVuc2lnbmVkIGludCB5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWM7CkBAIC01NDUsMTY0ICsyNTIsNiBAQAogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKIH0KIAotI2lmZGVmIENPTkZJR19DUFVfRlJFUQotCi0vKiBGcmVxdWVuY3kgc2NhbGluZyBzdXBwb3J0LiBBZGp1c3QgdGhlIFRTQyBiYXNlZCB0aW1lciB3aGVuIHRoZSBjcHUgZnJlcXVlbmN5Ci0gICBjaGFuZ2VzLgotICAgCi0gICBSRUQtUEVOOiBPbiBTTVAgd2UgYXNzdW1lIGFsbCBDUFVzIHJ1biB3aXRoIHRoZSBzYW1lIGZyZXF1ZW5jeS4gIEl0J3MKLSAgIG5vdCB0aGF0IGltcG9ydGFudCBiZWNhdXNlIGN1cnJlbnQgT3B0ZXJvbiBzZXR1cHMgZG8gbm90IHN1cHBvcnQKLSAgIHNjYWxpbmcgb24gU01QIGFueXJvYWRzLgotCi0gICBTaG91bGQgZml4IHVwIGxhc3RfdHNjIHRvby4gQ3VycmVudGx5IGdldHRpbWVvZmRheSBpbiB0aGUKLSAgIGZpcnN0IHRpY2sgYWZ0ZXIgdGhlIGNoYW5nZSB3aWxsIGJlIHNsaWdodGx5IHdyb25nLiAqLwotCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOwotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOwotc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqdikKLXsKLQl1bnNpZ25lZCBpbnQgY3B1OwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWNwdWZyZXFfZ2V0KGNwdSk7Ci0JfQotCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLX0KLQotLyogaWYgd2Ugbm90aWNlIGxvc3QgdGlja3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCi0gKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKLSAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCi0gKi8KLXN0YXRpYyB2b2lkIGNwdWZyZXFfZGVsYXllZF9nZXQodm9pZCkKLXsKLQlzdGF0aWMgaW50IHdhcm5lZDsKLQlpZiAoY3B1ZnJlcV9pbml0ICYmICFjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCkgewotCQljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDE7Ci0JCWlmICghd2FybmVkKSB7Ci0JCQl3YXJuZWQgPSAxOwotCQkJcHJpbnRrKEtFUk5fREVCVUcgCi0JIkxvc2luZyBzb21lIHRpY2tzLi4uIGNoZWNraW5nIGlmIENQVSBmcmVxdWVuY3kgY2hhbmdlZC5cbiIpOwotCQl9Ci0JCXNjaGVkdWxlX3dvcmsoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yayk7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50ICByZWZfZnJlcSA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnlfcmVmID0gMDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2toel9yZWYgPSAwOwotCi1zdGF0aWMgaW50IHRpbWVfY3B1ZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCQkgdm9pZCAqZGF0YSkKLXsKLSAgICAgICAgc3RydWN0IGNwdWZyZXFfZnJlcXMgKmZyZXEgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgKmxwaiwgZHVtbXk7Ci0KLQlpZiAoY3B1X2hhcygmY3B1X2RhdGFbZnJlcS0+Y3B1XSwgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKSkKLQkJcmV0dXJuIDA7Ci0KLQlscGogPSAmZHVtbXk7Ci0JaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkKLSNpZmRlZiBDT05GSUdfU01QCi0JCWxwaiA9ICZjcHVfZGF0YVtmcmVxLT5jcHVdLmxvb3BzX3Blcl9qaWZmeTsKLSNlbHNlCi0JCWxwaiA9ICZib290X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeTsKLSNlbmRpZgotCi0JaWYgKCFyZWZfZnJlcSkgewotCQlyZWZfZnJlcSA9IGZyZXEtPm9sZDsKLQkJbG9vcHNfcGVyX2ppZmZ5X3JlZiA9ICpscGo7Ci0JCWNwdV9raHpfcmVmID0gY3B1X2toejsKLQl9Ci0gICAgICAgIGlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8Ci0gICAgICAgICAgICAodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBmcmVxLT5vbGQgPiBmcmVxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpKSB7Ci0gICAgICAgICAgICAgICAgKmxwaiA9Ci0JCWNwdWZyZXFfc2NhbGUobG9vcHNfcGVyX2ppZmZ5X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7Ci0KLQkJY3B1X2toeiA9IGNwdWZyZXFfc2NhbGUoY3B1X2toel9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOwotCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQotCQkJdnh0aW1lLnRzY19xdW90ID0gKFVTRUNfUEVSX01TRUMgPDwgVVNfU0NBTEUpIC8gY3B1X2toejsKLQl9Ci0JCi0Jc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6X3JlZik7Ci0KLQlyZXR1cm4gMDsKLX0KLSAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrID0gewotICAgICAgICAgLm5vdGlmaWVyX2NhbGwgID0gdGltZV9jcHVmcmVxX25vdGlmaWVyCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQotewotCUlOSVRfV09SSygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrLCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCk7Ci0JaWYgKCFjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCi0JCQkJICAgICAgIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUikpCi0JCWNwdWZyZXFfaW5pdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOwotCi0jZW5kaWYKLQotLyoKLSAqIGNhbGlicmF0ZV90c2MoKSBjYWxpYnJhdGVzIHRoZSBwcm9jZXNzb3IgVFNDIGluIGEgdmVyeSBzaW1wbGUgd2F5LCBjb21wYXJpbmcKLSAqIGl0IHRvIHRoZSBIUEVUIHRpbWVyIG9mIGtub3duIGZyZXF1ZW5jeS4KLSAqLwotCi0jZGVmaW5lIFRJQ0tfQ09VTlQgMTAwMDAwMDAwCi0jZGVmaW5lIFRJQ0tfTUlOICAgNTAwMAotI2RlZmluZSBNQVhfUkVBRF9SRVRSSUVTIDUKLQotLyoKLSAqIFNvbWUgcGxhdGZvcm1zIHRha2UgcGVyaW9kaWMgU01JIGludGVycnVwdHMgd2l0aCA1bXMgZHVyYXRpb24uIE1ha2Ugc3VyZSBub25lCi0gKiBvY2N1cnMgYmV0d2VlbiB0aGUgcmVhZHMgb2YgdGhlIGhwZXQgJiBUU0MuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFkX2hwZXRfdHNjKGludCAqaHBldCwgaW50ICp0c2MpCi17Ci0JaW50IHRzYzEsIHRzYzIsIGhwZXQxLCByZXRyaWVzID0gMDsKLQlzdGF0aWMgaW50IG1zZzsKLQotCWRvIHsKLQkJdHNjMSA9IGdldF9jeWNsZXNfc3luYygpOwotCQlocGV0MSA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQkJdHNjMiA9IGdldF9jeWNsZXNfc3luYygpOwotCX0gd2hpbGUgKHRzYzIgLSB0c2MxID4gVElDS19NSU4gJiYgcmV0cmllcysrIDwgTUFYX1JFQURfUkVUUklFUyk7Ci0JaWYgKHJldHJpZXMgPj0gTUFYX1JFQURfUkVUUklFUyAmJiAhbXNnKyspCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJocGV0LmM6IGV4Y2VlZGVkIG1heCByZXRyaWVzIHRvIHJlYWQgSFBFVCAmIFRTQ1xuIik7Ci0JKmhwZXQgPSBocGV0MTsKLQkqdHNjID0gdHNjMjsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBocGV0X2NhbGlicmF0ZV90c2Modm9pZCkKLXsKLQlpbnQgdHNjX3N0YXJ0LCBocGV0X3N0YXJ0OwotCWludCB0c2Nfbm93LCBocGV0X25vdzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQlyZWFkX2hwZXRfdHNjKCZocGV0X3N0YXJ0LCAmdHNjX3N0YXJ0KTsKLQotCWRvIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJcmVhZF9ocGV0X3RzYygmaHBldF9ub3csICZ0c2Nfbm93KTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0gd2hpbGUgKCh0c2Nfbm93IC0gdHNjX3N0YXJ0KSA8IFRJQ0tfQ09VTlQgJiYKLQkJIChocGV0X25vdyAtIGhwZXRfc3RhcnQpIDwgVElDS19DT1VOVCk7Ci0KLQlyZXR1cm4gKHRzY19ub3cgLSB0c2Nfc3RhcnQpICogMTAwMDAwMDAwMEwKLQkJLyAoKGhwZXRfbm93IC0gaHBldF9zdGFydCkgKiBocGV0X3BlcmlvZCAvIDEwMDApOwotfQotCiAKIC8qCiAgKiBwaXRfY2FsaWJyYXRlX3RzYygpIHVzZXMgdGhlIHNwZWFrZXIgb3V0cHV0IChjaGFubmVsIDIpIG9mCkBAIC03MzMsMTI0ICsyODIsNiBAQAogCXJldHVybiAoZW5kIC0gc3RhcnQpIC8gNTA7CiB9CiAKLSNpZmRlZglDT05GSUdfSFBFVAotc3RhdGljIF9faW5pdCBpbnQgbGF0ZV9ocGV0X2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgaHBldF9kYXRhCWhkOwotCXVuc2lnbmVkIGludCAJCW50aW1lcjsKLQotCWlmICghdnh0aW1lLmhwZXRfYWRkcmVzcykKLSAgICAgICAgCXJldHVybiAwOwotCi0JbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOwotCi0JbnRpbWVyID0gaHBldF9yZWFkbChIUEVUX0lEKTsKLQludGltZXIgPSAobnRpbWVyICYgSFBFVF9JRF9OVU1CRVIpID4+IEhQRVRfSURfTlVNQkVSX1NISUZUOwotCW50aW1lcisrOwotCi0JLyoKLQkgKiBSZWdpc3RlciB3aXRoIGRyaXZlci4KLQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgotCSAqLwotCWhkLmhkX3BoeXNfYWRkcmVzcyA9IHZ4dGltZS5ocGV0X2FkZHJlc3M7Ci0JaGQuaGRfYWRkcmVzcyA9ICh2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChGSVhfSFBFVF9CQVNFKTsKLQloZC5oZF9uaXJxcyA9IG50aW1lcjsKLQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKLQlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAwKTsKLSNpZmRlZglDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotCWhwZXRfcmVzZXJ2ZV90aW1lcigmaGQsIDEpOwotI2VuZGlmCi0JaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKLQloZC5oZF9pcnFbMV0gPSBIUEVUX0xFR0FDWV9SVEM7Ci0JaWYgKG50aW1lciA+IDIpIHsKLQkJc3RydWN0IGhwZXQJCSpocGV0OwotCQlzdHJ1Y3QgaHBldF90aW1lcgkqdGltZXI7Ci0JCWludAkJCWk7Ci0KLQkJaHBldCA9IChzdHJ1Y3QgaHBldCAqKSBmaXhfdG9fdmlydChGSVhfSFBFVF9CQVNFKTsKLQkJdGltZXIgPSAmaHBldC0+aHBldF90aW1lcnNbMl07Ci0JCWZvciAoaSA9IDI7IGkgPCBudGltZXI7IHRpbWVyKyssIGkrKykKLQkJCWhkLmhkX2lycVtpXSA9ICh0aW1lci0+aHBldF9jb25maWcgJgotCQkJCQlUbl9JTlRfUk9VVEVfQ05GX01BU0spID4+Ci0JCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKLQotCX0KLQotCWhwZXRfYWxsb2MoJmhkKTsKLQlyZXR1cm4gMDsKLX0KLWZzX2luaXRjYWxsKGxhdGVfaHBldF9pbml0KTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKQotewotCXVuc2lnbmVkIGludCBjZmc7Ci0KLS8qCi0gKiBTdG9wIHRoZSB0aW1lcnMgYW5kIHJlc2V0IHRoZSBtYWluIGNvdW50ZXIuCi0gKi8KLQotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOwotCWNmZyAmPSB+KEhQRVRfQ0ZHX0VOQUJMRSB8IEhQRVRfQ0ZHX0xFR0FDWSk7Ci0JaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7Ci0JaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSKTsKLQlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIgKyA0KTsKLQotLyoKLSAqIFNldCB1cCB0aW1lciAwLCBhcyBwZXJpb2RpYyB3aXRoIGZpcnN0IGludGVycnVwdCB0byBoYXBwZW4gYXQgaHBldF90aWNrLAotICogYW5kIHBlcmlvZCBhbHNvIGhwZXRfdGljay4KLSAqLwotCWlmIChocGV0X3VzZV90aW1lcikgewotCQlocGV0X3dyaXRlbChIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fUEVSSU9ESUMgfCBIUEVUX1ROX1NFVFZBTCB8Ci0JCSAgICBIUEVUX1ROXzMyQklULCBIUEVUX1QwX0NGRyk7Ci0JCWhwZXRfd3JpdGVsKGhwZXRfdGljaywgSFBFVF9UMF9DTVApOyAvKiBuZXh0IGludGVycnVwdCAqLwotCQlocGV0X3dyaXRlbChocGV0X3RpY2ssIEhQRVRfVDBfQ01QKTsgLyogcGVyaW9kICovCi0JCWNmZyB8PSBIUEVUX0NGR19MRUdBQ1k7Ci0JfQotLyoKLSAqIEdvIQotICovCi0KLQljZmcgfD0gSFBFVF9DRkdfRU5BQkxFOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBldF9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCi0JaWYgKCF2eHRpbWUuaHBldF9hZGRyZXNzKQotCQlyZXR1cm4gLTE7Ci0Jc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9IUEVUX0JBU0UsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOwotCV9fc2V0X2ZpeG1hcChWU1lTQ0FMTF9IUEVULCB2eHRpbWUuaHBldF9hZGRyZXNzLCBQQUdFX0tFUk5FTF9WU1lTQ0FMTF9OT0NBQ0hFKTsKLQotLyoKLSAqIFJlYWQgdGhlIHBlcmlvZCwgY29tcHV0ZSB0aWNrIGFuZCBxdW90aWVudC4KLSAqLwotCi0JaWQgPSBocGV0X3JlYWRsKEhQRVRfSUQpOwotCi0JaWYgKCEoaWQgJiBIUEVUX0lEX1ZFTkRPUikgfHwgIShpZCAmIEhQRVRfSURfTlVNQkVSKSkKLQkJcmV0dXJuIC0xOwotCi0JaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKLQlpZiAoaHBldF9wZXJpb2QgPCAxMDAwMDAgfHwgaHBldF9wZXJpb2QgPiAxMDAwMDAwMDApCi0JCXJldHVybiAtMTsKLQotCWhwZXRfdGljayA9IChGU0VDX1BFUl9USUNLICsgaHBldF9wZXJpb2QgLyAyKSAvIGhwZXRfcGVyaW9kOwotCi0JaHBldF91c2VfdGltZXIgPSAoaWQgJiBIUEVUX0lEX0xFR1NVUCk7Ci0KLQlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOwotfQotCi1zdGF0aWMgaW50IGhwZXRfcmVlbmFibGUodm9pZCkKLXsKLQlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOwotfQotCiAjZGVmaW5lIFBJVF9NT0RFIDB4NDMKICNkZWZpbmUgUElUX0NIMCAgMHg0MAogCkBAIC04NzgsNyArMzA5LDcgQEAKIHZvaWQgX19pbml0IHN0b3BfdGltZXJfaW50ZXJydXB0KHZvaWQpCiB7CiAJY2hhciAqbmFtZTsKLQlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcykgeworCWlmIChocGV0X2FkZHJlc3MpIHsKIAkJbmFtZSA9ICJIUEVUIjsKIAkJaHBldF90aW1lcl9zdG9wX3NldF9nbygwKTsKIAl9IGVsc2UgewpAQCAtODg4LDEyICszMTksNiBAQAogCXByaW50ayhLRVJOX0lORk8gInRpbWVyOiAlcyBpbnRlcnJ1cHQgc3RvcHBlZC5cbiIsIG5hbWUpOwogfQogCi1pbnQgX19pbml0IHRpbWVfc2V0dXAoY2hhciAqc3RyKQotewotCXJlcG9ydF9sb3N0X3RpY2tzID0gMTsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCA9IHsKIAl0aW1lcl9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsIENQVV9NQVNLX05PTkUsICJ0aW1lciIsIE5VTEwsIE5VTEwKIH07CkBAIC05MDEsMTI0ICszMjYsNDEgQEAKIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewogCWlmIChub2hwZXQpCi0JCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSAwOwotCisJCWhwZXRfYWRkcmVzcyA9IDA7CiAJeHRpbWUudHZfc2VjID0gZ2V0X2Ntb3NfdGltZSgpOwogCXh0aW1lLnR2X25zZWMgPSAwOwogCiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogCSAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKIAotCWlmICghaHBldF9pbml0KCkpCi0gICAgICAgICAgICAgICAgdnh0aW1lX2h6ID0gKEZTRUNfUEVSX1NFQyArIGhwZXRfcGVyaW9kIC8gMikgLyBocGV0X3BlcmlvZDsKLQllbHNlCi0JCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSAwOworCWlmIChocGV0X2FyY2hfaW5pdCgpKQorCQlocGV0X2FkZHJlc3MgPSAwOwogCiAJaWYgKGhwZXRfdXNlX3RpbWVyKSB7CiAJCS8qIHNldCB0aWNrX25zZWMgdG8gdXNlIHRoZSBwcm9wZXIgcmF0ZSBmb3IgSFBFVCAqLwogCSAgCXRpY2tfbnNlYyA9IFRJQ0tfTlNFQ19IUEVUOwogCQljcHVfa2h6ID0gaHBldF9jYWxpYnJhdGVfdHNjKCk7CiAJCXRpbWVuYW1lID0gIkhQRVQiOwotI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKLQl9IGVsc2UgaWYgKHBtdG1yX2lvcG9ydCAmJiAhdnh0aW1lLmhwZXRfYWRkcmVzcykgewotCQl2eHRpbWVfaHogPSBQTV9USU1FUl9GUkVRVUVOQ1k7Ci0JCXRpbWVuYW1lID0gIlBNIjsKLQkJcGl0X2luaXQoKTsKLQkJY3B1X2toeiA9IHBpdF9jYWxpYnJhdGVfdHNjKCk7Ci0jZW5kaWYKIAl9IGVsc2UgewogCQlwaXRfaW5pdCgpOwogCQljcHVfa2h6ID0gcGl0X2NhbGlicmF0ZV90c2MoKTsKIAkJdGltZW5hbWUgPSAiUElUIjsKIAl9CiAKLQl2eHRpbWUubW9kZSA9IFZYVElNRV9UU0M7Ci0Jdnh0aW1lLnF1b3QgPSAoVVNFQ19QRVJfU0VDIDw8IFVTX1NDQUxFKSAvIHZ4dGltZV9oejsKLQl2eHRpbWUudHNjX3F1b3QgPSAoVVNFQ19QRVJfTVNFQyA8PCBVU19TQ0FMRSkgLyBjcHVfa2h6OwotCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwotCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7Ci0Jc2V0dXBfaXJxKDAsICZpcnEwKTsKLQotI2lmbmRlZiBDT05GSUdfU01QCi0JdGltZV9pbml0X2d0b2QoKTsKLSNlbmRpZgotfQotCi0vKgotICogTWFrZSBhbiBlZHVjYXRlZCBndWVzcyBpZiB0aGUgVFNDIGlzIHRydXN0d29ydGh5IGFuZCBzeW5jaHJvbml6ZWQKLSAqIG92ZXIgYWxsIENQVXMuCi0gKi8KLV9fY3B1aW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChhcGljX2lzX2NsdXN0ZXJlZF9ib3goKSkKLQkJcmV0dXJuIDE7Ci0jZW5kaWYKLQkvKiBNb3N0IGludGVsIHN5c3RlbXMgaGF2ZSBzeW5jaHJvbml6ZWQgVFNDcyBleGNlcHQgZm9yCi0JICAgbXVsdGkgbm9kZSBzeXN0ZW1zICovCi0gCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgewotI2lmZGVmIENPTkZJR19BQ1BJCi0JCS8qIEJ1dCBUU0MgZG9lc24ndCB0aWNrIGluIEMzIHNvIGRvbid0IHVzZSBpdCB0aGVyZSAqLwotCQlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIubGVuZ3RoID4gMCAmJiBhY3BpX2dibF9GQURULkMzbGF0ZW5jeSA8IDEwMDApCi0JCQlyZXR1cm4gMTsKLSNlbmRpZgotIAkJcmV0dXJuIDA7Ci0JfQotCi0gCS8qIEFzc3VtZSBtdWx0aSBzb2NrZXQgc3lzdGVtcyBhcmUgbm90IHN5bmNocm9uaXplZCAqLwotIAlyZXR1cm4gbnVtX3ByZXNlbnRfY3B1cygpID4gMTsKLX0KLQotLyoKLSAqIERlY2lkZSB3aGF0IG1vZGUgZ2V0dGltZW9mZGF5IHNob3VsZCB1c2UuCi0gKi8KLXZvaWQgdGltZV9pbml0X2d0b2Qodm9pZCkKLXsKLQljaGFyICp0aW1ldHlwZTsKLQogCWlmICh1bnN5bmNocm9uaXplZF90c2MoKSkKLQkJbm90c2MgPSAxOworCQltYXJrX3RzY191bnN0YWJsZSgpOwogCi0gCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9SRFRTQ1ApKQorCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9SRFRTQ1ApKQogCQl2Z2V0Y3B1X21vZGUgPSBWR0VUQ1BVX1JEVFNDUDsKIAllbHNlCiAJCXZnZXRjcHVfbW9kZSA9IFZHRVRDUFVfTFNMOwogCi0JaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MgJiYgbm90c2MpIHsKLQkJdGltZXR5cGUgPSBocGV0X3VzZV90aW1lciA/ICJIUEVUIiA6ICJQSVQvSFBFVCI7Ci0JCWlmIChocGV0X3VzZV90aW1lcikKLQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7Ci0JCWVsc2UKLQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCQl2eHRpbWUubW9kZSA9IFZYVElNRV9IUEVUOwotCQlkb19nZXR0aW1lb2Zmc2V0ID0gZG9fZ2V0dGltZW9mZnNldF9ocGV0OwotI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKLQkvKiBVc2luZyBQTSBmb3IgZ2V0dGltZW9mZGF5IGlzIHF1aXRlIHNsb3csIGJ1dCB3ZSBoYXZlIG5vIG90aGVyCi0JICAgY2hvaWNlIGJlY2F1c2UgdGhlIFRTQyBpcyB0b28gdW5yZWxpYWJsZSBvbiBzb21lIHN5c3RlbXMuICovCi0JfSBlbHNlIGlmIChwbXRtcl9pb3BvcnQgJiYgIXZ4dGltZS5ocGV0X2FkZHJlc3MgJiYgbm90c2MpIHsKLQkJdGltZXR5cGUgPSAiUE0iOwotCQlkb19nZXR0aW1lb2Zmc2V0ID0gZG9fZ2V0dGltZW9mZnNldF9wbTsKLQkJdnh0aW1lLm1vZGUgPSBWWFRJTUVfUE1UTVI7Ci0JCXN5c2N0bF92c3lzY2FsbCA9IDA7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGluZyB2c3lzY2FsbCBkdWUgdG8gdXNlIG9mIFBNIHRpbWVyXG4iKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCXRpbWV0eXBlID0gaHBldF91c2VfdGltZXIgPyAiSFBFVC9UU0MiIDogIlBJVC9UU0MiOwotCQl2eHRpbWUubW9kZSA9IFZYVElNRV9UU0M7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAidGltZS5jOiBVc2luZyAlbGQuJTA2bGQgTUh6IFdBTEwgJXMgR1RPRCAlcyB0aW1lci5cbiIsCi0JICAgICAgIHZ4dGltZV9oeiAvIDEwMDAwMDAsIHZ4dGltZV9oeiAlIDEwMDAwMDAsIHRpbWVuYW1lLCB0aW1ldHlwZSk7CisJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6KTsKIAlwcmludGsoS0VSTl9JTkZPICJ0aW1lLmM6IERldGVjdGVkICVkLiUwM2QgTUh6IHByb2Nlc3Nvci5cbiIsCiAJCWNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7Ci0Jdnh0aW1lLnF1b3QgPSAoVVNFQ19QRVJfU0VDIDw8IFVTX1NDQUxFKSAvIHZ4dGltZV9oejsKLQl2eHRpbWUudHNjX3F1b3QgPSAoVVNFQ19QRVJfTVNFQyA8PCBVU19TQ0FMRSkgLyBjcHVfa2h6OwotCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwotCi0Jc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6KTsKKwlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCi1fX3NldHVwKCJyZXBvcnRfbG9zdF90aWNrcyIsIHRpbWVfc2V0dXApOwogCiBzdGF0aWMgbG9uZyBjbG9ja19jbW9zX2RpZmY7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zdGFydDsKQEAgLTEwNTUsNyArMzk3LDcgQEAKIAkJc2xlZXBfbGVuZ3RoID0gMDsKIAkJY3RpbWUgPSBzbGVlcF9zdGFydDsKIAl9Ci0JaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MpCisJaWYgKGhwZXRfYWRkcmVzcykKIAkJaHBldF9yZWVuYWJsZSgpOwogCWVsc2UKIAkJaTgyNTRfdGltZXJfcmVzdW1lKCk7CkBAIC0xMDY0LDIwICs0MDYsOCBAQAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jayxmbGFncyk7CiAJeHRpbWUudHZfc2VjID0gc2VjOwogCXh0aW1lLnR2X25zZWMgPSAwOwotCWlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfSFBFVCkgewotCQlpZiAoaHBldF91c2VfdGltZXIpCi0JCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCQllbHNlCi0JCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi0JfSBlbHNlIGlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfUE1UTVIpIHsKLQkJcG10aW1lcl9yZXN1bWUoKTsKLSNlbmRpZgotCX0gZWxzZQotCQl2eHRpbWUubGFzdF90c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jayxmbGFncyk7CiAJamlmZmllcyArPSBzbGVlcF9sZW5ndGg7Ci0JbW9ub3RvbmljX2Jhc2UgKz0gc2xlZXBfbGVuZ3RoICogKE5TRUNfUEVSX1NFQy9IWik7CisJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssZmxhZ3MpOwogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExMDMsMjcwICs0MzMsMyBAQAogfQogCiBkZXZpY2VfaW5pdGNhbGwodGltZV9pbml0X2RldmljZSk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotLyogSFBFVCBpbiBMZWdhY3lSZXBsYWNlbWVudCBNb2RlIGVhdHMgdXAgUlRDIGludGVycnVwdCBsaW5lLiBXaGVuLCBIUEVUCi0gKiBpcyBlbmFibGVkLCB3ZSBzdXBwb3J0IFJUQyBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBpbiBzb2Z0d2FyZS4KLSAqIFJUQyBoYXMgMyBraW5kcyBvZiBpbnRlcnJ1cHRzOgotICogMSkgVXBkYXRlIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCwgZXZlcnkgc2VjLCB3aGVuIFJUQyBjbG9jawotICogICAgaXMgdXBkYXRlZAotICogMikgQWxhcm0gSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGF0IGEgc3BlY2lmaWMgdGltZSBvZiBkYXkKLSAqIDMpIFBlcmlvZGljIEludGVycnVwdCAtIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdCwgd2l0aCBmcmVxdWVuY2llcwotICogICAgMkh6LTgxOTJIeiAoMkh6LTY0SHogZm9yIG5vbi1yb290IHVzZXIpIChhbGwgZnJlcXMgaW4gcG93ZXJzIG9mIDIpCi0gKiAoMSkgYW5kICgyKSBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgcG9sbGluZyBhdCBhIGZyZXF1ZW5jeSBvZgotICogNjQgSHouIFRoZSBleGFjdCBmcmVxdWVuY3kgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBpbnRlcnJ1cHQKLSAqIG92ZXJoZWFkLiAoREVGQVVMVF9SVENfSU5UX0ZSRVEpCi0gKiBGb3IgKDMpLCB3ZSB1c2UgaW50ZXJydXB0cyBhdCA2NEh6IG9yIHVzZXIgc3BlY2lmaWVkIHBlcmlvZGljCi0gKiBmcmVxdWVuY3ksIHdoaWNoZXZlciBpcyBoaWdoZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KLQotI2RlZmluZSBERUZBVUxUX1JUQ19JTlRfRlJFUSAJNjQKLSNkZWZpbmUgUlRDX05VTV9JTlRTIAkJMQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBVSUVfb247Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X3VwZGF0ZV9zZWM7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIEFJRV9vbjsKLXN0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgYWxhcm1fdGltZTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX29uOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9jb3VudDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9ydGNfaW50X2ZyZXE7IC8qIFJUQyBpbnRlcnJ1cHQgZnJlcXVlbmN5ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGhwZXRfdDFfY21wOyAvKiBjYWNoZWQgY29tcGFyYXRvciByZWdpc3RlciAqLwotCi1pbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpCi17Ci0JcmV0dXJuIHZ4dGltZS5ocGV0X2FkZHJlc3MgIT0gMDsKLX0KLQotLyoKLSAqIFRpbWVyIDEgZm9yIFJUQywgd2UgZG8gbm90IHVzZSBwZXJpb2RpYyBpbnRlcnJ1cHQgZmVhdHVyZSwKLSAqIGV2ZW4gaWYgSFBFVCBzdXBwb3J0cyBwZXJpb2RpYyBpbnRlcnJ1cHRzIG9uIFRpbWVyIDEuCi0gKiBUaGUgcmVhc29uIGJlaW5nLCB0byBzZXQgdXAgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gSFBFVCwgd2UgbmVlZCB0bwotICogc3RvcCB0aGUgbWFpbiBjb3VudGVyLiBBbmQgaWYgd2UgZG8gdGhhdCBldmVyeXRpbWUgc29tZW9uZSBkaWFibGVzL2VuYWJsZXMKLSAqIFJUQywgd2Ugd2lsbCBoYXZlIGFkdmVyc2UgZWZmZWN0IG9uIG1haW4ga2VybmVsIHRpbWVyIHJ1bm5pbmcgb24gVGltZXIgMC4KLSAqIFNvLCBmb3IgdGhlIHRpbWUgYmVpbmcsIHNpbXVsYXRlIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gc29mdHdhcmUuCi0gKgotICogaHBldF9ydGNfdGltZXJfaW5pdCgpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGR1cmluZyBzdWJzZXF1ZW50Ci0gKiBpbnRlcnVwcHRzIHJlaW5pdCBoYXBwZW5zIHRocm91Z2ggaHBldF9ydGNfdGltZXJfcmVpbml0KCkuCi0gKi8KLWludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGNmZywgY250OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQkvKgotCSAqIFNldCB0aGUgY291bnRlciAxIGFuZCBlbmFibGUgdGhlIGludGVycnVwdHMuCi0JICovCi0JaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7Ci0JZWxzZQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWNudCArPSAoKGhwZXRfdGljaypIWikvaHBldF9ydGNfaW50X2ZyZXEpOwotCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOwotCWhwZXRfdDFfY21wID0gY250OwotCi0JY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JY2ZnICY9IH5IUEVUX1ROX1BFUklPRElDOwotCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fMzJCSVQ7Ci0JaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaHBldF9ydGNfdGltZXJfcmVpbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGNmZywgY250LCB0aWNrc19wZXJfaW50LCBsb3N0X2ludHM7Ci0KLQlpZiAodW5saWtlbHkoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKSkgewotCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKLQkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKLQkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKLQllbHNlCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7Ci0KLQkvKiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHVzZSB0aGUgY29tcGFyYXRvciB2YWx1ZSB0aGFuIGN1cnJlbnQgY291bnQuKi8KLQl0aWNrc19wZXJfaW50ID0gaHBldF90aWNrICogSFogLyBocGV0X3J0Y19pbnRfZnJlcTsKLQlocGV0X3QxX2NtcCArPSB0aWNrc19wZXJfaW50OwotCWhwZXRfd3JpdGVsKGhwZXRfdDFfY21wLCBIUEVUX1QxX0NNUCk7Ci0KLQkvKgotCSAqIElmIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3YXMgZGVsYXllZCB0b28gbG9uZywgdGhlIHdyaXRlIGFib3ZlIHRyaWVzCi0JICogdG8gc2NoZWR1bGUgdGhlIG5leHQgaW50ZXJydXB0IGluIHRoZSBwYXN0IGFuZCB0aGUgaGFyZHdhcmUgd291bGQKLQkgKiBub3QgaW50ZXJydXB0IHVudGlsIHRoZSBjb3VudGVyIGhhZCB3cmFwcGVkIGFyb3VuZC4KLQkgKiBTbyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIGNvbXBhcmF0b3Igd2Fzbid0IHNldCB0byBhIHBhc3QgdGltZS4KLQkgKi8KLQljbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JaWYgKHVubGlrZWx5KChpbnQpKGNudCAtIGhwZXRfdDFfY21wKSA+IDApKSB7Ci0JCWxvc3RfaW50cyA9IChjbnQgLSBocGV0X3QxX2NtcCkgLyB0aWNrc19wZXJfaW50ICsgMTsKLQkJLyogTWFrZSBzdXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgdGltZSBuZWVkZWQgdG8gZXhlY3V0ZQotCQkgKiB0aGlzIGNvZGUsIHRoZSBuZXh0IHNjaGVkdWxlZCBpbnRlcnJ1cHQgaGFzIGJlZW4gbW92ZWQKLQkJICogYmFjayB0byB0aGUgZnV0dXJlOiAqLwotCQlsb3N0X2ludHMrKzsKLQotCQlocGV0X3QxX2NtcCArPSBsb3N0X2ludHMgKiB0aWNrc19wZXJfaW50OwotCQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOwotCi0JCWlmIChQSUVfb24pCi0JCQlQSUVfY291bnQgKz0gbG9zdF9pbnRzOwotCi0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwKLQkJCSAgICAgICBocGV0X3J0Y19pbnRfZnJlcSk7Ci0JfQotfQotCi0vKgotICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGZyb20gcnRjIGRyaXZlci4KLSAqIFJldHVybiAwIGlmIEhQRVQgaXMgbm90IGJlaW5nIHVzZWQuCi0gKiBPdGhlcndpc2UgZG8gdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGFuZCByZXR1cm4gMS4KLSAqLwotaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkKLQkJVUlFX29uID0gMDsKLQlpZiAoYml0X21hc2sgJiBSVENfUElFKQotCQlQSUVfb24gPSAwOwotCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpCi0JCUFJRV9vbiA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCi17Ci0JaW50IHRpbWVyX2luaXRfcmVxZCA9IDA7Ci0KLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQotCWlmICghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpCi0JCXRpbWVyX2luaXRfcmVxZCA9IDE7Ci0KLQlpZiAoYml0X21hc2sgJiBSVENfVUlFKSB7Ci0JCVVJRV9vbiA9IDE7Ci0JfQotCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpIHsKLQkJUElFX29uID0gMTsKLQkJUElFX2NvdW50ID0gMDsKLQl9Ci0JaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkgewotCQlBSUVfb24gPSAxOwotCX0KLQotCWlmICh0aW1lcl9pbml0X3JlcWQpCi0JCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfYWxhcm1fdGltZSh1bnNpZ25lZCBjaGFyIGhycywgdW5zaWduZWQgY2hhciBtaW4sIHVuc2lnbmVkIGNoYXIgc2VjKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JYWxhcm1fdGltZS50bV9ob3VyID0gaHJzOwotCWFsYXJtX3RpbWUudG1fbWluID0gbWluOwotCWFsYXJtX3RpbWUudG1fc2VjID0gc2VjOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKLXsKLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQotCVBJRV9mcmVxID0gZnJlcTsKLQlQSUVfY291bnQgPSAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBydGNfdGltZSBjdXJyX3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBydGNfaW50X2ZsYWcgPSAwOwotCWludCBjYWxsX3J0Y19pbnRlcnJ1cHQgPSAwOwotCi0JaHBldF9ydGNfdGltZXJfcmVpbml0KCk7Ci0KLQlpZiAoVUlFX29uIHwgQUlFX29uKSB7Ci0JCXJ0Y19nZXRfcnRjX3RpbWUoJmN1cnJfdGltZSk7Ci0JfQotCWlmIChVSUVfb24pIHsKLQkJaWYgKGN1cnJfdGltZS50bV9zZWMgIT0gcHJldl91cGRhdGVfc2VjKSB7Ci0JCQkvKiBTZXQgdXBkYXRlIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnID0gUlRDX1VGOwotCQkJcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKLQkJfQotCX0KLQlpZiAoUElFX29uKSB7Ci0JCVBJRV9jb3VudCsrOwotCQlpZiAoUElFX2NvdW50ID49IGhwZXRfcnRjX2ludF9mcmVxL1BJRV9mcmVxKSB7Ci0JCQkvKiBTZXQgcGVyaW9kaWMgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgfD0gUlRDX1BGOwotCQkJUElFX2NvdW50ID0gMDsKLQkJfQotCX0KLQlpZiAoQUlFX29uKSB7Ci0JCWlmICgoY3Vycl90aW1lLnRtX3NlYyA9PSBhbGFybV90aW1lLnRtX3NlYykgJiYKLQkJICAgIChjdXJyX3RpbWUudG1fbWluID09IGFsYXJtX3RpbWUudG1fbWluKSAmJgotCQkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGFsYXJtX3RpbWUudG1faG91cikpIHsKLQkJCS8qIFNldCBhbGFybSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7Ci0JCX0KLQl9Ci0JaWYgKGNhbGxfcnRjX2ludGVycnVwdCkgewotCQlydGNfaW50X2ZsYWcgfD0gKFJUQ19JUlFGIHwgKFJUQ19OVU1fSU5UUyA8PCA4KSk7Ci0JCXJ0Y19pbnRlcnJ1cHQocnRjX2ludF9mbGFnLCBkZXZfaWQpOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgbm9ocGV0X3NldHVwKGNoYXIgKnMpIAoteyAKLQlub2hwZXQgPSAxOwotCXJldHVybiAxOwotfSAKLQotX19zZXR1cCgibm9ocGV0Iiwgbm9ocGV0X3NldHVwKTsKLQotaW50IF9faW5pdCBub3RzY19zZXR1cChjaGFyICpzKQotewotCW5vdHNjID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgibm90c2MiLCBub3RzY19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ODMxOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90c2MuYwpAQCAtMCwwICsxLDIyNiBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKworc3RhdGljIGludCBub3RzYyBfX2luaXRkYXRhID0gMDsKKwordW5zaWduZWQgaW50IGNwdV9raHo7CQkvKiBUU0MgY2xvY2tzIC8gdXNlYywgbm90IHVzZWQgaGVyZSAqLworRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjeWMybnNfc2NhbGUgX19yZWFkX21vc3RseTsKKwordm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcga2h6KQoreworCWN5YzJuc19zY2FsZSA9IChOU0VDX1BFUl9NU0VDIDw8IE5TX1NDQUxFKSAvIGtoejsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQoreworCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBOU19TQ0FMRTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhID0gMDsKKworCS8qIENvdWxkIGRvIENQVSBjb3JlIHN5bmMgaGVyZS4gT3B0ZXJvbiBjYW4gZXhlY3V0ZSByZHRzYyBzcGVjdWxhdGl2ZWx5LAorCSAqIHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBjb21wbGV0ZWx5IGV4YWN0IGFuZCBtYXkgbm90IGJlIG1vbm90b25vdXMKKwkgKiBiZXR3ZWVuIENQVXMuIEJ1dCB0aGUgZXJyb3JzIHNob3VsZCBiZSB0b28gc21hbGwgdG8gbWF0dGVyIGZvcgorCSAqIHNjaGVkdWxpbmcgcHVycG9zZXMuCisJICovCisKKwlyZHRzY2xsKGEpOworCXJldHVybiBjeWNsZXNfMl9ucyhhKTsKK30KKworc3RhdGljIGludCB0c2NfdW5zdGFibGU7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RzY191bnN0YWJsZSh2b2lkKQoreworCXJldHVybiB0c2NfdW5zdGFibGU7Cit9CisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCisKKy8qIEZyZXF1ZW5jeSBzY2FsaW5nIHN1cHBvcnQuIEFkanVzdCB0aGUgVFNDIGJhc2VkIHRpbWVyIHdoZW4gdGhlIGNwdSBmcmVxdWVuY3kKKyAqIGNoYW5nZXMuCisgKgorICogUkVELVBFTjogT24gU01QIHdlIGFzc3VtZSBhbGwgQ1BVcyBydW4gd2l0aCB0aGUgc2FtZSBmcmVxdWVuY3kuICBJdCdzCisgKiBub3QgdGhhdCBpbXBvcnRhbnQgYmVjYXVzZSBjdXJyZW50IE9wdGVyb24gc2V0dXBzIGRvIG5vdCBzdXBwb3J0CisgKiBzY2FsaW5nIG9uIFNNUCBhbnlyb2Fkcy4KKyAqCisgKiBTaG91bGQgZml4IHVwIGxhc3RfdHNjIHRvby4gQ3VycmVudGx5IGdldHRpbWVvZmRheSBpbiB0aGUKKyAqIGZpcnN0IHRpY2sgYWZ0ZXIgdGhlIGNoYW5nZSB3aWxsIGJlIHNsaWdodGx5IHdyb25nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKKworc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp2KQoreworCXVuc2lnbmVkIGludCBjcHU7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJY3B1ZnJlcV9nZXQoY3B1KTsKKwl9CisJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50ICByZWZfZnJlcSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnlfcmVmID0gMDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2toel9yZWYgPSAwOworCitzdGF0aWMgaW50IHRpbWVfY3B1ZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcSA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyAqbHBqLCBkdW1teTsKKworCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtmcmVxLT5jcHVdLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKQorCQlyZXR1cm4gMDsKKworCWxwaiA9ICZkdW1teTsKKwlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQorI2lmZGVmIENPTkZJR19TTVAKKwkJbHBqID0gJmNwdV9kYXRhW2ZyZXEtPmNwdV0ubG9vcHNfcGVyX2ppZmZ5OworI2Vsc2UKKwkJbHBqID0gJmJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5OworI2VuZGlmCisKKwlpZiAoIXJlZl9mcmVxKSB7CisJCXJlZl9mcmVxID0gZnJlcS0+b2xkOworCQlsb29wc19wZXJfamlmZnlfcmVmID0gKmxwajsKKwkJY3B1X2toel9yZWYgPSBjcHVfa2h6OworCX0KKwlpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgZnJlcS0+b2xkIDwgZnJlcS0+bmV3KSB8fAorCQkodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBmcmVxLT5vbGQgPiBmcmVxLT5uZXcpIHx8CisJCSh2YWwgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpKSB7CisJCSpscGogPQorCQljcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworCisJCWNwdV9raHogPSBjcHVmcmVxX3NjYWxlKGNwdV9raHpfcmVmLCByZWZfZnJlcSwgZnJlcS0+bmV3KTsKKwkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkKKwkJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisJfQorCisJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6X3JlZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gdGltZV9jcHVmcmVxX25vdGlmaWVyCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQoreworCUlOSVRfV09SSygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrLCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCk7CisJaWYgKCFjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJICAgICAgIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUikpCisJCWNwdWZyZXFfaW5pdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOworCisjZW5kaWYKKworc3RhdGljIGludCB0c2NfdW5zdGFibGUgPSAwOworCisvKgorICogTWFrZSBhbiBlZHVjYXRlZCBndWVzcyBpZiB0aGUgVFNDIGlzIHRydXN0d29ydGh5IGFuZCBzeW5jaHJvbml6ZWQKKyAqIG92ZXIgYWxsIENQVXMuCisgKi8KK19fY3B1aW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCit7CisJaWYgKHRzY191bnN0YWJsZSkKKwkJcmV0dXJuIDE7CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKGFwaWNfaXNfY2x1c3RlcmVkX2JveCgpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCS8qIE1vc3QgaW50ZWwgc3lzdGVtcyBoYXZlIHN5bmNocm9uaXplZCBUU0NzIGV4Y2VwdCBmb3IKKwkgICBtdWx0aSBub2RlIHN5c3RlbXMgKi8KKyAJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7CisjaWZkZWYgQ09ORklHX0FDUEkKKwkJLyogQnV0IFRTQyBkb2Vzbid0IHRpY2sgaW4gQzMgc28gZG9uJ3QgdXNlIGl0IHRoZXJlICovCisJCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5sZW5ndGggPiAwICYmIGFjcGlfZ2JsX0ZBRFQuQzNsYXRlbmN5IDwgMTAwMCkKKwkJCXJldHVybiAxOworI2VuZGlmCisgCQlyZXR1cm4gMDsKKwl9CisKKyAJLyogQXNzdW1lIG11bHRpIHNvY2tldCBzeXN0ZW1zIGFyZSBub3Qgc3luY2hyb25pemVkICovCisgCXJldHVybiBudW1fcHJlc2VudF9jcHVzKCkgPiAxOworfQorCitpbnQgX19pbml0IG5vdHNjX3NldHVwKGNoYXIgKnMpCit7CisJbm90c2MgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub3RzYyIsIG5vdHNjX3NldHVwKTsKKworCisvKiBjbG9jayBzb3VyY2UgY29kZTogKi8KK3N0YXRpYyBjeWNsZV90IHJlYWRfdHNjKHZvaWQpCit7CisJY3ljbGVfdCByZXQgPSAoY3ljbGVfdClnZXRfY3ljbGVzX3N5bmMoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY3ljbGVfdCBfX3ZzeXNjYWxsX2ZuIHZyZWFkX3RzYyh2b2lkKQoreworCWN5Y2xlX3QgcmV0ID0gKGN5Y2xlX3QpZ2V0X2N5Y2xlc19zeW5jKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV90c2MgPSB7CisJLm5hbWUJCQk9ICJ0c2MiLAorCS5yYXRpbmcJCQk9IDMwMCwKKwkucmVhZAkJCT0gcmVhZF90c2MsCisJLm1hc2sJCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5zaGlmdAkJCT0gMjIsCisJLmZsYWdzCQkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUyB8CisJCQkJICBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlksCisJLnZyZWFkCQkJPSB2cmVhZF90c2MsCit9OworCit2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpCit7CisJaWYgKCF0c2NfdW5zdGFibGUpIHsKKwkJdHNjX3Vuc3RhYmxlID0gMTsKKwkJLyogQ2hhbmdlIG9ubHkgdGhlIHJhdGluZywgd2hlbiBub3QgcmVnaXN0ZXJlZCAqLworCQlpZiAoY2xvY2tzb3VyY2VfdHNjLm11bHQpCisJCQljbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nKCZjbG9ja3NvdXJjZV90c2MsIDApOworCQllbHNlCisJCQljbG9ja3NvdXJjZV90c2MucmF0aW5nID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYXJrX3RzY191bnN0YWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjX2Nsb2Nrc291cmNlKHZvaWQpCit7CisJaWYgKCFub3RzYykgeworCQljbG9ja3NvdXJjZV90c2MubXVsdCA9IGNsb2Nrc291cmNlX2toejJtdWx0KGNwdV9raHosCisJCQkJCQkJY2xvY2tzb3VyY2VfdHNjLnNoaWZ0KTsKKwkJaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKQorCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7CisKKwkJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV90c2MpOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoaW5pdF90c2NfY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RzY19zeW5jLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRmMGRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RzY19zeW5jLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBhcmNoL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYzogY2hlY2sgVFNDIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKgorICogV2UgY2hlY2sgd2hldGhlciBhbGwgYm9vdCBDUFVzIGhhdmUgdGhlaXIgVFNDJ3Mgc3luY2hyb25pemVkLAorICogcHJpbnQgYSB3YXJuaW5nIGlmIG5vdCBhbmQgdHVybiBvZmYgdGhlIFRTQyBjbG9jay1zb3VyY2UuCisgKgorICogVGhlIHdhcnAtY2hlY2sgaXMgcG9pbnQtdG8tcG9pbnQgYmV0d2VlbiB0d28gQ1BVcywgdGhlIENQVQorICogaW5pdGlhdGluZyB0aGUgYm9vdHVwIGlzIHRoZSAnc291cmNlIENQVScsIHRoZSBmcmVzaGx5IGJvb3RpbmcKKyAqIENQVSBpcyB0aGUgJ3RhcmdldCBDUFUnLgorICoKKyAqIE9ubHkgdHdvIENQVXMgbWF5IHBhcnRpY2lwYXRlIC0gdGhleSBjYW4gZW50ZXIgaW4gYW55IG9yZGVyLgorICogKCBUaGUgc2VyaWFsIG5hdHVyZSBvZiB0aGUgYm9vdCBsb2dpYyBhbmQgdGhlIENQVSBob3RwbHVnIGxvY2sKKyAqICAgcHJvdGVjdHMgYWdhaW5zdCBtb3JlIHRoYW4gMiBDUFVzIGVudGVyaW5nIHRoaXMgY29kZS4gKQorICovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorCisvKgorICogRW50cnkvZXhpdCBjb3VudGVycyB0aGF0IG1ha2Ugc3VyZSB0aGF0IGJvdGggQ1BVcworICogcnVuIHRoZSBtZWFzdXJlbWVudCBjb2RlIGF0IG9uY2U6CisgKi8KK3N0YXRpYyBfX2NwdWluaXRkYXRhIGF0b21pY190IHN0YXJ0X2NvdW50Oworc3RhdGljIF9fY3B1aW5pdGRhdGEgYXRvbWljX3Qgc3RvcF9jb3VudDsKKworLyoKKyAqIFdlIHVzZSBhIHJhdyBzcGlubG9jayBpbiB0aGlzIGV4Y2VwdGlvbmFsIGNhc2UsIGJlY2F1c2UKKyAqIHdlIHdhbnQgdG8gaGF2ZSB0aGUgZmFzdGVzdCwgaW5saW5lZCwgbm9uLWRlYnVnIHZlcnNpb24KKyAqIG9mIGEgY3JpdGljYWwgc2VjdGlvbiwgdG8gYmUgYWJsZSB0byBwcm92ZSBUU0MgdGltZS13YXJwczoKKyAqLworc3RhdGljIF9fY3B1aW5pdGRhdGEgcmF3X3NwaW5sb2NrX3Qgc3luY19sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIF9fY3B1aW5pdGRhdGEgY3ljbGVzX3QgbGFzdF90c2M7CitzdGF0aWMgX19jcHVpbml0ZGF0YSBjeWNsZXNfdCBtYXhfd2FycDsKK3N0YXRpYyBfX2NwdWluaXRkYXRhIGludCBucl93YXJwczsKKworLyoKKyAqIFRTQy13YXJwIG1lYXN1cmVtZW50IGxvb3AgcnVubmluZyBvbiBib3RoIENQVXM6CisgKi8KK3N0YXRpYyBfX2NwdWluaXQgdm9pZCBjaGVja190c2Nfd2FycCh2b2lkKQoreworCWN5Y2xlc190IHN0YXJ0LCBub3csIHByZXYsIGVuZDsKKwlpbnQgaTsKKworCXN0YXJ0ID0gZ2V0X2N5Y2xlc19zeW5jKCk7CisJLyoKKwkgKiBUaGUgbWVhc3VyZW1lbnQgcnVucyBmb3IgMjAgbXNlY3M6CisJICovCisJZW5kID0gc3RhcnQgKyBjcHVfa2h6ICogMjBVTEw7CisJbm93ID0gc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQkvKgorCQkgKiBXZSB0YWtlIHRoZSBnbG9iYWwgbG9jaywgbWVhc3VyZSBUU0MsIHNhdmUgdGhlCisJCSAqIHByZXZpb3VzIFRTQyB0aGF0IHdhcyBtZWFzdXJlZCAocG9zc2libHkgb24KKwkJICogYW5vdGhlciBDUFUpIGFuZCB1cGRhdGUgdGhlIHByZXZpb3VzIFRTQyB0aW1lc3RhbXAuCisJCSAqLworCQlfX3Jhd19zcGluX2xvY2soJnN5bmNfbG9jayk7CisJCXByZXYgPSBsYXN0X3RzYzsKKwkJbm93ID0gZ2V0X2N5Y2xlc19zeW5jKCk7CisJCWxhc3RfdHNjID0gbm93OworCQlfX3Jhd19zcGluX3VubG9jaygmc3luY19sb2NrKTsKKworCQkvKgorCQkgKiBCZSBuaWNlIGV2ZXJ5IG5vdyBhbmQgdGhlbiAoYW5kIGFsc28gY2hlY2sgd2hldGhlcgorCQkgKiBtZWFzdXJlbWVudCBpcyBkb25lIFt3ZSBhbHNvIGluc2VydCBhIDEwMCBtaWxsaW9uCisJCSAqIGxvb3BzIHNhZmV0eSBleGl0LCBzbyB3ZSBkb250IGxvY2sgdXAgaW4gY2FzZSB0aGUKKwkJICogVFNDIHJlYWRvdXQgaXMgdG90YWxseSBicm9rZW5dKToKKwkJICovCisJCWlmICh1bmxpa2VseSghKGkgJiA3KSkpIHsKKwkJCWlmIChub3cgPiBlbmQgfHwgaSA+IDEwMDAwMDAwMCkKKwkJCQlicmVhazsKKwkJCWNwdV9yZWxheCgpOworCQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CisJCX0KKwkJLyoKKwkJICogT3V0c2lkZSB0aGUgY3JpdGljYWwgc2VjdGlvbiB3ZSBjYW4gbm93IHNlZSB3aGV0aGVyCisJCSAqIHdlIHNhdyBhIHRpbWUtd2FycCBvZiB0aGUgVFNDIGdvaW5nIGJhY2t3YXJkczoKKwkJICovCisJCWlmICh1bmxpa2VseShwcmV2ID4gbm93KSkgeworCQkJX19yYXdfc3Bpbl9sb2NrKCZzeW5jX2xvY2spOworCQkJbWF4X3dhcnAgPSBtYXgobWF4X3dhcnAsIHByZXYgLSBub3cpOworCQkJbnJfd2FycHMrKzsKKwkJCV9fcmF3X3NwaW5fdW5sb2NrKCZzeW5jX2xvY2spOworCQl9CisKKwl9Cit9CisKKy8qCisgKiBTb3VyY2UgQ1BVIGNhbGxzIGludG8gdGhpcyAtIGl0IHdhaXRzIGZvciB0aGUgZnJlc2hseSBib290ZWQKKyAqIHRhcmdldCBDUFUgdG8gYXJyaXZlIGFuZCB0aGVuIHN0YXJ0cyB0aGUgbWVhc3VyZW1lbnQ6CisgKi8KK3ZvaWQgX19jcHVpbml0IGNoZWNrX3RzY19zeW5jX3NvdXJjZShpbnQgY3B1KQoreworCWludCBjcHVzID0gMjsKKworCS8qCisJICogTm8gbmVlZCB0byBjaGVjayBpZiB3ZSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgVFNDIGlzIG5vdAorCSAqIHN5bmNocm9uaXplZDoKKwkgKi8KKwlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gImNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24gW0NQVSMlZCAtPiBDUFUjJWRdOiIsCisJCQkgIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKKworCS8qCisJICogUmVzZXQgaXQgLSBpbiBjYXNlIHRoaXMgaXMgYSBzZWNvbmQgYm9vdHVwOgorCSAqLworCWF0b21pY19zZXQoJnN0b3BfY291bnQsIDApOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdGFyZ2V0IHRvIGFycml2ZToKKwkgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnN0YXJ0X2NvdW50KSAhPSBjcHVzLTEpCisJCWNwdV9yZWxheCgpOworCS8qCisJICogVHJpZ2dlciB0aGUgdGFyZ2V0IHRvIGNvbnRpbnVlIGludG8gdGhlIG1lYXN1cmVtZW50IHRvbzoKKwkgKi8KKwlhdG9taWNfaW5jKCZzdGFydF9jb3VudCk7CisKKwljaGVja190c2Nfd2FycCgpOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZzdG9wX2NvdW50KSAhPSBjcHVzLTEpCisJCWNwdV9yZWxheCgpOworCisJLyoKKwkgKiBSZXNldCBpdCAtIGp1c3QgaW4gY2FzZSB3ZSBib290IGFub3RoZXIgQ1BVIGxhdGVyOgorCSAqLworCWF0b21pY19zZXQoJnN0YXJ0X2NvdW50LCAwKTsKKworCWlmIChucl93YXJwcykgeworCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1lYXN1cmVkICVMZCBjeWNsZXMgVFNDIHdhcnAgYmV0d2VlbiBDUFVzLCIKKwkJCQkgICAgIiB0dXJuaW5nIG9mZiBUU0MgY2xvY2suXG4iLCBtYXhfd2FycCk7CisJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisJCW5yX3dhcnBzID0gMDsKKwkJbWF4X3dhcnAgPSAwOworCQlsYXN0X3RzYyA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgcGFzc2VkLlxuIik7CisJfQorCisJLyoKKwkgKiBMZXQgdGhlIHRhcmdldCBjb250aW51ZSB3aXRoIHRoZSBib290dXA6CisJICovCisJYXRvbWljX2luYygmc3RvcF9jb3VudCk7Cit9CisKKy8qCisgKiBGcmVzaGx5IGJvb3RlZCBDUFVzIGNhbGwgaW50byB0aGlzOgorICovCit2b2lkIF9fY3B1aW5pdCBjaGVja190c2Nfc3luY190YXJnZXQodm9pZCkKK3sKKwlpbnQgY3B1cyA9IDI7CisKKwlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpCisJCXJldHVybjsKKworCS8qCisJICogUmVnaXN0ZXIgdGhpcyBDUFUncyBwYXJ0aWNpcGF0aW9uIGFuZCB3YWl0IGZvciB0aGUKKwkgKiBzb3VyY2UgQ1BVIHRvIHN0YXJ0IHRoZSBtZWFzdXJlbWVudDoKKwkgKi8KKwlhdG9taWNfaW5jKCZzdGFydF9jb3VudCk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZzdGFydF9jb3VudCkgIT0gY3B1cykKKwkJY3B1X3JlbGF4KCk7CisKKwljaGVja190c2Nfd2FycCgpOworCisJLyoKKwkgKiBPaywgd2UgYXJlIGRvbmU6CisJICovCisJYXRvbWljX2luYygmc3RvcF9jb3VudCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBzb3VyY2UgQ1BVIHRvIHByaW50IHN0dWZmOgorCSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmc3RvcF9jb3VudCkgIT0gY3B1cykKKwkJY3B1X3JlbGF4KCk7Cit9CisjdW5kZWYgTlJfTE9PUFMKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBjMzYwYzQyLi5iNzMyMTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtODgsMzEgKzg4LDI1IEBACiAgIF9fdnN5c2NhbGxfMCA9IFZTWVNDQUxMX1ZJUlRfQUREUjsKIAogICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7Ci0gIC54dGltZV9sb2NrIDogQVQoVkxPQUQoLnh0aW1lX2xvY2spKSB7ICooLnh0aW1lX2xvY2spIH0KLSAgeHRpbWVfbG9jayA9IFZWSVJUKC54dGltZV9sb2NrKTsKLQotICAudnh0aW1lIDogQVQoVkxPQUQoLnZ4dGltZSkpIHsgKigudnh0aW1lKSB9Ci0gIHZ4dGltZSA9IFZWSVJUKC52eHRpbWUpOworICAudnN5c2NhbGxfZm4gOiBBVChWTE9BRCgudnN5c2NhbGxfZm4pKSB7ICooLnZzeXNjYWxsX2ZuKSB9CisgIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKKyAgLnZzeXNjYWxsX2d0b2RfZGF0YSA6IEFUKFZMT0FEKC52c3lzY2FsbF9ndG9kX2RhdGEpKQorCQl7ICooLnZzeXNjYWxsX2d0b2RfZGF0YSkgfQorICB2c3lzY2FsbF9ndG9kX2RhdGEgPSBWVklSVCgudnN5c2NhbGxfZ3RvZF9kYXRhKTsKIAogICAudmdldGNwdV9tb2RlIDogQVQoVkxPQUQoLnZnZXRjcHVfbW9kZSkpIHsgKigudmdldGNwdV9tb2RlKSB9CiAgIHZnZXRjcHVfbW9kZSA9IFZWSVJUKC52Z2V0Y3B1X21vZGUpOwogCi0gIC5zeXNfdHogOiBBVChWTE9BRCguc3lzX3R6KSkgeyAqKC5zeXNfdHopIH0KLSAgc3lzX3R6ID0gVlZJUlQoLnN5c190eik7Ci0KLSAgLnN5c2N0bF92c3lzY2FsbCA6IEFUKFZMT0FEKC5zeXNjdGxfdnN5c2NhbGwpKSB7ICooLnN5c2N0bF92c3lzY2FsbCkgfQotICBzeXNjdGxfdnN5c2NhbGwgPSBWVklSVCguc3lzY3RsX3ZzeXNjYWxsKTsKLQotICAueHRpbWUgOiBBVChWTE9BRCgueHRpbWUpKSB7ICooLnh0aW1lKSB9Ci0gIHh0aW1lID0gVlZJUlQoLnh0aW1lKTsKLQogICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7CiAgIC5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7ICooLmppZmZpZXMpIH0KICAgamlmZmllcyA9IFZWSVJUKC5qaWZmaWVzKTsKIAotICAudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkgeyAqKC52c3lzY2FsbF8xKSB9Ci0gIC52c3lzY2FsbF8yIEFERFIoLnZzeXNjYWxsXzApICsgMjA0ODogQVQoVkxPQUQoLnZzeXNjYWxsXzIpKSB7ICooLnZzeXNjYWxsXzIpIH0KLSAgLnZzeXNjYWxsXzMgQUREUigudnN5c2NhbGxfMCkgKyAzMDcyOiBBVChWTE9BRCgudnN5c2NhbGxfMykpIHsgKigudnN5c2NhbGxfMykgfQorICAudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkKKwkJeyAqKC52c3lzY2FsbF8xKSB9CisgIC52c3lzY2FsbF8yIEFERFIoLnZzeXNjYWxsXzApICsgMjA0ODogQVQoVkxPQUQoLnZzeXNjYWxsXzIpKQorCQl7ICooLnZzeXNjYWxsXzIpIH0KKyAgLnZzeXNjYWxsXzMgQUREUigudnN5c2NhbGxfMCkgKyAzMDcyOiBBVChWTE9BRCgudnN5c2NhbGxfMykpCisJCXsgKigudnN5c2NhbGxfMykgfQogCiAgIC4gPSBWU1lTQ0FMTF9WSVJUX0FERFIgKyA0MDk2OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCmluZGV4IDMxM2RjNmEuLjE4MGZmOTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDQsNTYgKzQ2LDQxIEBACiAjZGVmaW5lIF9fdnN5c2NhbGwobnIpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsX19zZWN0aW9uX18oIi52c3lzY2FsbF8iICNucikpKQogI2RlZmluZSBfX3N5c2NhbGxfY2xvYmJlciAicjExIiwicmN4IiwibWVtb3J5IgogCi1pbnQgX19zeXNjdGxfdnN5c2NhbGwgX19zZWN0aW9uX3N5c2N0bF92c3lzY2FsbCA9IDE7Ci1zZXFsb2NrX3QgX194dGltZV9sb2NrIF9fc2VjdGlvbl94dGltZV9sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKK3N0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGFfdCB7CisJc2VxbG9ja190IGxvY2s7CisJaW50IHN5c2N0bF9lbmFibGVkOworCXN0cnVjdCB0aW1ldmFsIHdhbGxfdGltZV90djsKKwlzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCWN5Y2xlX3Qgb2Zmc2V0X2Jhc2U7CisJc3RydWN0IGNsb2Nrc291cmNlIGNsb2NrOworfTsKIGludCBfX3ZnZXRjcHVfbW9kZSBfX3NlY3Rpb25fdmdldGNwdV9tb2RlOwogCi0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgdGltZXZhbF9ub3JtYWxpemUoc3RydWN0IHRpbWV2YWwgKiB0dikKK3N0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGFfdCBfX3ZzeXNjYWxsX2d0b2RfZGF0YSBfX3NlY3Rpb25fdnN5c2NhbGxfZ3RvZF9kYXRhID0KIHsKLQl0aW1lX3QgX19zZWM7CisJLmxvY2sgPSBTRVFMT0NLX1VOTE9DS0VELAorCS5zeXNjdGxfZW5hYmxlZCA9IDEsCit9OwogCi0JX19zZWMgPSB0di0+dHZfdXNlYyAvIDEwMDAwMDA7Ci0JaWYgKF9fc2VjKSB7Ci0JCXR2LT50dl91c2VjICU9IDEwMDAwMDA7Ci0JCXR2LT50dl9zZWMgKz0gX19zZWM7Ci0JfQordm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVzcGVjICp3YWxsX3RpbWUsIHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2ssIGZsYWdzKTsKKwkvKiBjb3B5IHZzeXNjYWxsIGRhdGEgKi8KKwl2c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2sgPSAqY2xvY2s7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV90di50dl9zZWMgPSB3YWxsX3RpbWUtPnR2X3NlYzsKKwl2c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3R2LnR2X3VzZWMgPSB3YWxsX3RpbWUtPnR2X25zZWMvMTAwMDsKKwl2c3lzY2FsbF9ndG9kX2RhdGEuc3lzX3R6ID0gc3lzX3R6OworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ2c3lzY2FsbF9ndG9kX2RhdGEubG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2KQotewotCWxvbmcgc2VxdWVuY2UsIHQ7Ci0JdW5zaWduZWQgbG9uZyBzZWMsIHVzZWM7Ci0KLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFiZWdpbigmX194dGltZV9sb2NrKTsKLQkJCi0JCXNlYyA9IF9feHRpbWUudHZfc2VjOwotCQl1c2VjID0gX194dGltZS50dl9uc2VjIC8gMTAwMDsKLQotCQlpZiAoX192eHRpbWUubW9kZSAhPSBWWFRJTUVfSFBFVCkgewotCQkJdCA9IGdldF9jeWNsZXNfc3luYygpOwotCQkJaWYgKHQgPCBfX3Z4dGltZS5sYXN0X3RzYykKLQkJCQl0ID0gX192eHRpbWUubGFzdF90c2M7Ci0JCQl1c2VjICs9ICgodCAtIF9fdnh0aW1lLmxhc3RfdHNjKSAqCi0JCQkJIF9fdnh0aW1lLnRzY19xdW90KSA+PiAzMjsKLQkJCS8qIFNlZSBjb21tZW50IGluIHg4Nl82NCBkb19nZXR0aW1lb2ZkYXkuICovCi0JCX0gZWxzZSB7Ci0JCQl1c2VjICs9ICgocmVhZGwoKHZvaWQgX19pb21lbSAqKQotCQkJCSAgIGZpeF90b192aXJ0KFZTWVNDQUxMX0hQRVQpICsgMHhmMCkgLQotCQkJCSAgX192eHRpbWUubGFzdCkgKiBfX3Z4dGltZS5xdW90KSA+PiAzMjsKLQkJfQotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJl9feHRpbWVfbG9jaywgc2VxdWVuY2UpKTsKLQotCXR2LT50dl9zZWMgPSBzZWMgKyB1c2VjIC8gMTAwMDAwMDsKLQl0di0+dHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotfQotCi0vKiBSRUQtUEVOIG1heSB3YW50IHRvIHJlYWRkIHNlcSBsb2NraW5nLCBidXQgdGhlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHdyaXRlLW9uY2UuICovCisvKiBSRUQtUEVOIG1heSB3YW50IHRvIHJlYWRkIHNlcSBsb2NraW5nLCBidXQgdGhlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlCisgKiB3cml0ZS1vbmNlLgorICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fZ2V0X3R6KHN0cnVjdCB0aW1lem9uZSAqIHR6KQogewotCSp0eiA9IF9fc3lzX3R6OworCSp0eiA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c190ejsKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKQEAgLTEwMSw3ICs4OCw4IEBACiAJaW50IHJldDsKIAlhc20gdm9sYXRpbGUoInZzeXNjMjogc3lzY2FsbCIKIAkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChfX05SX2dldHRpbWVvZmRheSksIkQiICh0diksIlMiICh0eikgOiBfX3N5c2NhbGxfY2xvYmJlciApOworCQk6ICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCJEIiAodHYpLCJTIiAodHopCisJCTogX19zeXNjYWxsX2Nsb2JiZXIgKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTQsMTAgKzEwMiw0NCBAQAogCXJldHVybiBzZWNzOwogfQogCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2KQoreworCWN5Y2xlX3Qgbm93LCBiYXNlLCBtYXNrLCBjeWNsZV9kZWx0YTsKKwl1bnNpZ25lZCBsb25nIHNlcSwgbXVsdCwgc2hpZnQsIG5zZWNfZGVsdGE7CisJY3ljbGVfdCAoKnZyZWFkKSh2b2lkKTsKKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJl9fdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2spOworCisJCXZyZWFkID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2sudnJlYWQ7CisJCWlmICh1bmxpa2VseSghX192c3lzY2FsbF9ndG9kX2RhdGEuc3lzY3RsX2VuYWJsZWQgfHwgIXZyZWFkKSkgeworCQkJZ2V0dGltZW9mZGF5KHR2LDApOworCQkJcmV0dXJuOworCQl9CisJCW5vdyA9IHZyZWFkKCk7CisJCWJhc2UgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5jeWNsZV9sYXN0OworCQltYXNrID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2subWFzazsKKwkJbXVsdCA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm11bHQ7CisJCXNoaWZ0ID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suc2hpZnQ7CisKKwkJKnR2ID0gX192c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3R2OworCisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmX192c3lzY2FsbF9ndG9kX2RhdGEubG9jaywgc2VxKSk7CisKKwkvKiBjYWxjdWxhdGUgaW50ZXJ2YWw6ICovCisJY3ljbGVfZGVsdGEgPSAobm93IC0gYmFzZSkgJiBtYXNrOworCS8qIGNvbnZlcnQgdG8gbnNlY3M6ICovCisJbnNlY19kZWx0YSA9IChjeWNsZV9kZWx0YSAqIG11bHQpID4+IHNoaWZ0OworCisJLyogY29udmVydCB0byB1c2VjcyBhbmQgYWRkIHRvIHRpbWVzcGVjOiAqLworCXR2LT50dl91c2VjICs9IG5zZWNfZGVsdGEgLyBOU0VDX1BFUl9VU0VDOworCXdoaWxlICh0di0+dHZfdXNlYyA+IFVTRUNfUEVSX1NFQykgeworCQl0di0+dHZfc2VjICs9IDE7CisJCXR2LT50dl91c2VjIC09IFVTRUNfUEVSX1NFQzsKKwl9Cit9CisKIGludCBfX3ZzeXNjYWxsKDApIHZnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiB0diwgc3RydWN0IHRpbWV6b25lICogdHopCiB7Ci0JaWYgKCFfX3N5c2N0bF92c3lzY2FsbCkKLQkJcmV0dXJuIGdldHRpbWVvZmRheSh0dix0eik7CiAJaWYgKHR2KQogCQlkb192Z2V0dGltZW9mZGF5KHR2KTsKIAlpZiAodHopCkBAIC0xMjksMTEgKzE1MSwxMSBAQAogICogdW5saWtlbHkgKi8KIHRpbWVfdCBfX3ZzeXNjYWxsKDEpIHZ0aW1lKHRpbWVfdCAqdCkKIHsKLQlpZiAoIV9fc3lzY3RsX3ZzeXNjYWxsKQorCWlmICh1bmxpa2VseSghX192c3lzY2FsbF9ndG9kX2RhdGEuc3lzY3RsX2VuYWJsZWQpKQogCQlyZXR1cm4gdGltZV9zeXNjYWxsKHQpOwogCWVsc2UgaWYgKHQpCi0JCSp0ID0gX194dGltZS50dl9zZWM7CQkKLQlyZXR1cm4gX194dGltZS50dl9zZWM7CisJCSp0ID0gX192c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3R2LnR2X3NlYzsKKwlyZXR1cm4gX192c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3R2LnR2X3NlYzsKIH0KIAogLyogRmFzdCB3YXkgdG8gZ2V0IGN1cnJlbnQgQ1BVIGFuZCBub2RlLgpAQCAtMjEwLDcgKzIzMiw3IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoIXN5c2N0bF92c3lzY2FsbCkgeworCWlmICghdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c2N0bF9lbmFibGVkKSB7CiAJCXdyaXRldyhTWVNDQUxMLCBtYXAxKTsKIAkJd3JpdGV3KFNZU0NBTEwsIG1hcDIpOwogCX0gZWxzZSB7CkBAIC0yMzIsNyArMjU0LDggQEAKIAogc3RhdGljIGN0bF90YWJsZSBrZXJuZWxfdGFibGUyW10gPSB7CiAJeyAuY3RsX25hbWUgPSA5OSwgLnByb2NuYW1lID0gInZzeXNjYWxsNjQiLAotCSAgLmRhdGEgPSAmc3lzY3RsX3ZzeXNjYWxsLCAubWF4bGVuID0gc2l6ZW9mKGludCksIC5tb2RlID0gMDY0NCwKKwkgIC5kYXRhID0gJnZzeXNjYWxsX2d0b2RfZGF0YS5zeXNjdGxfZW5hYmxlZCwgLm1heGxlbiA9IHNpemVvZihpbnQpLAorCSAgLm1vZGUgPSAwNjQ0LAogCSAgLnN0cmF0ZWd5ID0gdnN5c2NhbGxfc3lzY3RsX25vc3RyYXQsCiAJICAucHJvY19oYW5kbGVyID0gdnN5c2NhbGxfc3lzY3RsX2NoYW5nZSB9LAogCXt9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDZjNjc1MWIuLjgyMDZmYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0zOSw2ICszOSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogbmVlZF9yZXNjaGVkKCkgKi8KICNpbmNsdWRlIDxsaW51eC9sYXRlbmN5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorCisvKgorICogSW5jbHVkZSB0aGUgYXBpYyBkZWZpbml0aW9ucyBmb3IgeDg2IHRvIGhhdmUgdGhlIEFQSUMgdGltZXIgcmVsYXRlZCBkZWZpbmVzCisgKiBhdmFpbGFibGUgYWxzbyBmb3IgVVAgKG9uIFNNUCBpdCBnZXRzIG1hZ2ljYWxseSBpbmNsdWRlZCB2aWEgbGludXgvc21wLmgpLgorICogYXNtL2FjcGkuaCBpcyBub3QgYW4gb3B0aW9uLCBhcyBpdCB3b3VsZCByZXF1aXJlIG1vcmUgaW5jbHVkZSBtYWdpYy4gQWxzbworICogY3JlYXRpbmcgYW4gZW1wdHkgYXNtLWlhNjQvYXBpYy5oIHdvdWxkIGp1c3QgdHJhZGUgcGVzdCB2cy4gY2hvbGVyYS4KKyAqLworI2lmZGVmIENPTkZJR19YODYKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjM4LDYgKzI0OSw4MSBAQAogCX0KIH0KIAorI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCisKKy8qCisgKiBTb21lIEJJT1MgaW1wbGVtZW50YXRpb25zIHN3aXRjaCB0byBDMyBpbiB0aGUgcHVibGlzaGVkIEMyIHN0YXRlLgorICogVGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtIG9uIEFNRCBib3hlbiwgYnV0IG90aGVyIHZlbmRvcnMKKyAqIGFyZSBhZmZlY3RlZCB0b28uIFdlIHBpY2sgdGhlIG1vc3QgY29uc2VydmF0aXZlIGFwcHJvYWNoOiB3ZSBhc3N1bWUKKyAqIHRoYXQgdGhlIGxvY2FsIEFQSUMgc3RvcHMgaW4gYm90aCBDMiBhbmQgQzMuCisgKi8KK3N0YXRpYyB2b2lkIGFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaW50IHN0YXRlLCBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCit7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwd3IgPSAmcHItPnBvd2VyOworCisJLyoKKwkgKiBDaGVjaywgaWYgb25lIG9mIHRoZSBwcmV2aW91cyBzdGF0ZXMgYWxyZWFkeSBtYXJrZWQgdGhlIGxhcGljCisJICogdW5zdGFibGUKKwkgKi8KKwlpZiAocHdyLT50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBzdGF0ZSkKKwkJcmV0dXJuOworCisJaWYgKGN4LT50eXBlID49IEFDUElfU1RBVEVfQzIpCisJCXByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9wcm9wYWdhdGVfdGltZXJfYnJvYWRjYXN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKKwl1bnNpZ25lZCBsb25nIHJlYXNvbjsKKworCXJlYXNvbiA9IHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBJTlRfTUFYID8KKwkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT04gOiBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkY7CisKKwljbG9ja2V2ZW50c19ub3RpZnkocmVhc29uLCAmcHItPmlkKTsKKyNlbHNlCisJY3B1bWFza190IG1hc2sgPSBjcHVtYXNrX29mX2NwdShwci0+aWQpOworCisJaWYgKHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBJTlRfTUFYKQorCQlvbl9lYWNoX2NwdShzd2l0Y2hfQVBJQ190aW1lcl90b19pcGksICZtYXNrLCAxLCAxKTsKKwllbHNlCisJCW9uX2VhY2hfY3B1KHN3aXRjaF9pcGlfdG9fQVBJQ190aW1lciwgJm1hc2ssIDEsIDEpOworI2VuZGlmCit9CisKKy8qIFBvd2VyKEMpIFN0YXRlIHRpbWVyIGJyb2FkY2FzdCBjb250cm9sICovCitzdGF0aWMgdm9pZCBhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LAorCQkJCSAgICAgICBpbnQgYnJvYWRjYXN0KQoreworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCisKKwlpbnQgc3RhdGUgPSBjeCAtIHByLT5wb3dlci5zdGF0ZXM7CisKKwlpZiAoc3RhdGUgPj0gcHItPnBvd2VyLnRpbWVyX2Jyb2FkY2FzdF9vbl9zdGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIHJlYXNvbjsKKworCQlyZWFzb24gPSBicm9hZGNhc3QgPyAgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIgOgorCQkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVDsKKwkJY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgJnByLT5pZCk7CisJfQorI2VuZGlmCit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIGFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaW50IHN0YXRlLCBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3N0YXRlKSB7IH0KK3N0YXRpYyB2b2lkIGFjcGlfcHJvcGFnYXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKSB7IH0KK3N0YXRpYyB2b2lkIGFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCQkJICAgICAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gsCisJCQkJICAgICAgIGludCBicm9hZGNhc3QpCit7Cit9CisKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CkBAIC0zODIsNiArNDY4LDcgQEAKIAkJLyogR2V0IHN0YXJ0IHRpbWUgKHRpY2tzKSAqLwogCQl0MSA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMyICovCisJCWFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHByLCBjeCwgMSk7CiAJCWFjcGlfY3N0YXRlX2VudGVyKGN4KTsKIAkJLyogR2V0IGVuZCB0aW1lICh0aWNrcykgKi8KIAkJdDIgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CkBAIC0zOTYsNiArNDgzLDcgQEAKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwogCQlzbGVlcF90aWNrcyA9CiAJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMyX09WRVJIRUFEOworCQlhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVEFURV9DMzoKQEAgLTQxNyw2ICs1MDUsNyBAQAogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOwogCQkvKiBJbnZva2UgQzMgKi8KKwkJYWNwaV9zdGF0ZV90aW1lcl9icm9hZGNhc3QocHIsIGN4LCAxKTsKIAkJYWNwaV9jc3RhdGVfZW50ZXIoY3gpOwogCQkvKiBHZXQgZW5kIHRpbWUgKHRpY2tzKSAqLwogCQl0MiA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKQEAgLTQzNiw2ICs1MjUsNyBAQAogCQkvKiBDb21wdXRlIHRpbWUgKHRpY2tzKSB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgYXNsZWVwICovCiAJCXNsZWVwX3RpY2tzID0KIAkJICAgIHRpY2tzX2VsYXBzZWQodDEsIHQyKSAtIGN4LT5sYXRlbmN5X3RpY2tzIC0gQzNfT1ZFUkhFQUQ7CisJCWFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHByLCBjeCwgMCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTkwNCwxMSArOTk0LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpbnQgd29ya2luZyA9IDA7CiAKLSNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMwotCWludCB0aW1lcl9icm9hZGNhc3QgPSAwOwotCWNwdW1hc2tfdCBtYXNrID0gY3B1bWFza19vZl9jcHUocHItPmlkKTsKLQlvbl9lYWNoX2NwdShzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIsICZtYXNrLCAxLCAxKTsKLSNlbmRpZgorCXByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPSBJTlRfTUFYOwogCiAJZm9yIChpID0gMTsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKSB7CiAJCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tpXTsKQEAgLTkyMCwyMSArMTAwNiwxNCBAQAogCiAJCWNhc2UgQUNQSV9TVEFURV9DMjoKIAkJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeV9jMihjeCk7Ci0jaWZkZWYgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMKLQkJCS8qIFNvbWUgQU1EIHN5c3RlbXMgZmFrZSBDMyBhcyBDMiwgYnV0IHN0aWxsCi0JCQkgICBoYXZlIHRpbWVyIHRyb3VibGVzICovCi0JCQlpZiAoY3gtPnZhbGlkICYmIAotCQkJCWJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKLQkJCQl0aW1lcl9icm9hZGNhc3QrKzsKLSNlbmRpZgorCQkJaWYgKGN4LT52YWxpZCkKKwkJCQlhY3BpX3RpbWVyX2NoZWNrX3N0YXRlKGksIHByLCBjeCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfU1RBVEVfQzM6CiAJCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnlfYzMocHIsIGN4KTsKLSNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMwogCQkJaWYgKGN4LT52YWxpZCkKLQkJCQl0aW1lcl9icm9hZGNhc3QrKzsKLSNlbmRpZgorCQkJCWFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaSwgcHIsIGN4KTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTk0MiwxMCArMTAyMSw3IEBACiAJCQl3b3JraW5nKys7CiAJfQogCi0jaWZkZWYgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMKLQlpZiAodGltZXJfYnJvYWRjYXN0KQotCQlvbl9lYWNoX2NwdShzd2l0Y2hfQVBJQ190aW1lcl90b19pcGksICZtYXNrLCAxLCAxKTsKLSNlbmRpZgorCWFjcGlfcHJvcGFnYXRlX3RpbWVyX2Jyb2FkY2FzdChwcik7CiAKIAlyZXR1cm4gKHdvcmtpbmcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKaW5kZXggM2U1ODE2MC4uYTBkMDRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlCkBAIC0xLDYgKzEsNyBAQAogYWdwZ2FydC15IDo9IGJhY2tlbmQubyBmcm9udGVuZC5vIGdlbmVyaWMubyBpc29jaC5vCiAKIG9iai0kKENPTkZJR19BR1ApCQkrPSBhZ3BnYXJ0Lm8KK29iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXRfaW9jdGwubwogb2JqLSQoQ09ORklHX0FHUF9BTEkpCQkrPSBhbGktYWdwLm8KIG9iai0kKENPTkZJR19BR1BfQVRJKQkJKz0gYXRpLWFncC5vCiBvYmotJChDT05GSUdfQUdQX0FNRCkJCSs9IGFtZC1rNy1hZ3AubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaCBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKaW5kZXggMWQ1OWUyYS4uOWJkNjhkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCkBAIC0xMTQsNiArMTE0LDcgQEAKIAl2b2lkICgqZnJlZV9ieV90eXBlKShzdHJ1Y3QgYWdwX21lbW9yeSAqKTsKIAl2b2lkICooKmFncF9hbGxvY19wYWdlKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOwogCXZvaWQgKCphZ3BfZGVzdHJveV9wYWdlKSh2b2lkICopOworICAgICAgICBpbnQgKCphZ3BfdHlwZV90b19tYXNrX3R5cGUpIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIGludCk7CiB9OwogCiBzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhIHsKQEAgLTIxOCw2ICsyMTksNyBAQAogI2RlZmluZSBJODEwX1BURV9NQUlOX1VOQ0FDSEVECTB4MDAwMDAwMDAKICNkZWZpbmUgSTgxMF9QVEVfTE9DQUwJCTB4MDAwMDAwMDIKICNkZWZpbmUgSTgxMF9QVEVfVkFMSUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRCAgMHgwMDAwMDAwNgogI2RlZmluZSBJODEwX1NNUkFNX01JU0NDCTB4NzAKICNkZWZpbmUgSTgxMF9HRlhfTUVNX1dJTl9TSVpFCTB4MDAwMTAwMDAKICNkZWZpbmUgSTgxMF9HRlhfTUVNX1dJTl8zMk0JMHgwMDAxMDAwMApAQCAtMjcwLDggKzI3MiwxNiBAQAogdm9pZCBnZXRfYWdwX3ZlcnNpb24oc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKTsKIHVuc2lnbmVkIGxvbmcgYWdwX2dlbmVyaWNfbWFza19tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAogCXVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHR5cGUpOworaW50IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJCQkgIGludCB0eXBlKTsKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9nZW5lcmljX2ZpbmRfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAorLyogZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHVzZXItcG9wdWxhdGVkIEFHUCBtZW1vcnkgdHlwZXMgKi8KK3N0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZ2VuZXJpY19hbGxvY191c2VyKHNpemVfdCBwYWdlX2NvdW50LCBpbnQgdHlwZSk7Cit2b2lkIGFncF9hbGxvY19wYWdlX2FycmF5KHNpemVfdCBzaXplLCBzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKTsKK3ZvaWQgYWdwX2ZyZWVfcGFnZV9hcnJheShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKTsKKworCiAvKiBnZW5lcmljIHJvdXRpbmVzIGZvciBhZ3A+PTMgKi8KIGludCBhZ3AzX2dlbmVyaWNfZmV0Y2hfc2l6ZSh2b2lkKTsKIHZvaWQgYWdwM19nZW5lcmljX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pOwpAQCAtMjg4LDYgKzI5OCw4IEBACiBleHRlcm4gaW50IGFncF9vZmY7CiBleHRlcm4gaW50IGFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdDsKIAorbG9uZyBjb21wYXRfYWdwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKIC8qIENoaXBzZXQgaW5kZXBlbmRhbnQgcmVnaXN0ZXJzIChmcm9tIEFHUCBTcGVjKSAqLwogI2RlZmluZSBBR1BfQVBCQVNFCTB4MTAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbGktYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FsaS1hZ3AuYwppbmRleCA1YTMxZWM3Li45ODE3N2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FsaS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FsaS1hZ3AuYwpAQCAtMjE0LDYgKzIxNCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhbGlfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGFsaV9tMTU0MV9icmlkZ2UgPSB7CkBAIC0yMzcsNiArMjM4LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gbTE1NDFfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IG0xNTQxX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYwppbmRleCBiNGUwMGEzLi5iMGFjZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMKQEAgLTkxLDYgKzkxLDkgQEAKIAlpbnQgbnVtX2VudHJpZXMsIHN0YXR1czsKIAl2b2lkICp0ZW1wOwogCisJaWYgKHR5cGUgPj0gQUdQX1VTRVJfVFlQRVMgfHwgbWVtLT50eXBlID49IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CiAJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKIAlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQpAQCAtMTQyLDYgKzE0NSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFscGhhX2JyaWRnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kLWs3LWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMKaW5kZXggYzg1YzhjYS4uM2Q4ZDQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMKQEAgLTM4MSw2ICszODEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIGFtZF9hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKaW5kZXggOTNkMjIwOS4uNjM2ZDk4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCkBAIC02MiwxMiArNjIsMTggQEAKIHsKIAlpbnQgaSwgaiwgbnVtX2VudHJpZXM7CiAJbG9uZyBsb25nIHRtcDsKKwlpbnQgbWFza190eXBlOworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IG1lbS0+YnJpZGdlOwogCXUzMiBwdGU7CiAKIAludW1fZW50cmllcyA9IGFncF9udW1fZW50cmllcygpOwogCi0JaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCiAJCXJldHVybiAtRUlOVkFMOworCW1hc2tfdHlwZSA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYnJpZGdlLCB0eXBlKTsKKwlpZiAobWFza190eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCiAKIAkvKiBNYWtlIHN1cmUgd2UgY2FuIGZpdCB0aGUgcmFuZ2UgaW4gdGhlIGdhdHQgdGFibGUuICovCiAJLyogRklYTUU6IGNvdWxkIHdyYXAgKi8KQEAgLTkwLDcgKzk2LDcgQEAKIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJdG1wID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAotCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSk7CisJCQltZW0tPm1lbW9yeVtpXSwgbWFza190eXBlKTsKIAogCQlCVUdfT04odG1wICYgMHhmZmZmZmYwMDAwMDAwZmZjVUxMKTsKIAkJcHRlID0gKHRtcCAmIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gMjg7CkBAIC0yNDcsNiArMjUzLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogLyogU29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIGZvciB0aGUgYXBlcnR1cmUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2F0aS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCmluZGV4IDk5ODdkYzIuLjc3YzlhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC00MzEsNiArNDMxLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2JhY2tlbmQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jCmluZGV4IGQ1OWUwMzcuLmViZGQ2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jCkBAIC00Myw3ICs0Myw3IEBACiAgKiBmaXggc29tZSByZWFsIHN0dXBpZGl0eS4gSXQncyBvbmx5IGJ5IGNoYW5jZSB3ZSBjYW4gYnVtcAogICogcGFzdCAwLjk5IGF0IGFsbCBkdWUgdG8gc29tZSBib29sZWFuIGxvZ2ljIGVycm9yLiAqLwogI2RlZmluZSBBR1BHQVJUX1ZFUlNJT05fTUFKT1IgMAotI2RlZmluZSBBR1BHQVJUX1ZFUlNJT05fTUlOT1IgMTAxCisjZGVmaW5lIEFHUEdBUlRfVkVSU0lPTl9NSU5PUiAxMDIKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWdwX3ZlcnNpb24gYWdwX2N1cnJlbnRfdmVyc2lvbiA9CiB7CiAJLm1ham9yID0gQUdQR0FSVF9WRVJTSU9OX01BSk9SLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNGIxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBBR1BHQVJUIGRyaXZlciBmcm9udGVuZCBjb21wYXRpYmlsaXR5IGlvY3RscworICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERhdmUgSm9uZXMKKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FncGdhcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImFncC5oIgorI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5oIgorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfaW5mb193cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfaW5mbzMyIHVzZXJpbmZvOworCXN0cnVjdCBhZ3Bfa2Vybl9pbmZvIGtlcm5pbmZvOworCisJYWdwX2NvcHlfaW5mbyhhZ3BfYnJpZGdlLCAma2VybmluZm8pOworCisJdXNlcmluZm8udmVyc2lvbi5tYWpvciA9IGtlcm5pbmZvLnZlcnNpb24ubWFqb3I7CisJdXNlcmluZm8udmVyc2lvbi5taW5vciA9IGtlcm5pbmZvLnZlcnNpb24ubWlub3I7CisJdXNlcmluZm8uYnJpZGdlX2lkID0ga2VybmluZm8uZGV2aWNlLT52ZW5kb3IgfAorCSAgICAoa2VybmluZm8uZGV2aWNlLT5kZXZpY2UgPDwgMTYpOworCXVzZXJpbmZvLmFncF9tb2RlID0ga2VybmluZm8ubW9kZTsKKwl1c2VyaW5mby5hcGVyX2Jhc2UgPSAoY29tcGF0X2xvbmdfdClrZXJuaW5mby5hcGVyX2Jhc2U7CisJdXNlcmluZm8uYXBlcl9zaXplID0ga2VybmluZm8uYXBlcl9zaXplOworCXVzZXJpbmZvLnBnX3RvdGFsID0gdXNlcmluZm8ucGdfc3lzdGVtID0ga2VybmluZm8ubWF4X21lbW9yeTsKKwl1c2VyaW5mby5wZ191c2VkID0ga2VybmluZm8uY3VycmVudF9tZW1vcnk7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJnVzZXJpbmZvLCBzaXplb2YodXNlcmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfYWdwaW9jX3Jlc2VydmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX3JlZ2lvbjMyIHVyZXNlcnZlOworCXN0cnVjdCBhZ3BfcmVnaW9uIGtyZXNlcnZlOworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmNsaWVudF9wcml2OworCisJREJHKCIiKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVyZXNlcnZlLCBhcmcsIHNpemVvZih1cmVzZXJ2ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgodW5zaWduZWQpIHVyZXNlcnZlLnNlZ19jb3VudCA+PSB+MFUvc2l6ZW9mKHN0cnVjdCBhZ3Bfc2VnbWVudDMyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlrcmVzZXJ2ZS5waWQgPSB1cmVzZXJ2ZS5waWQ7CisJa3Jlc2VydmUuc2VnX2NvdW50ID0gdXJlc2VydmUuc2VnX2NvdW50OworCisJY2xpZW50ID0gYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChrcmVzZXJ2ZS5waWQpOworCisJaWYgKGtyZXNlcnZlLnNlZ19jb3VudCA9PSAwKSB7CisJCS8qIHJlbW92ZSBhIGNsaWVudCAqLworCQljbGllbnRfcHJpdiA9IGFncF9maW5kX3ByaXZhdGUoa3Jlc2VydmUucGlkKTsKKworCQlpZiAoY2xpZW50X3ByaXYgIT0gTlVMTCkgeworCQkJc2V0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmY2xpZW50X3ByaXYtPmFjY2Vzc19mbGFncyk7CisJCQlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQl9CisJCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQkJLyogY2xpZW50IGlzIGFscmVhZHkgcmVtb3ZlZCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGFncF9yZW1vdmVfY2xpZW50KGtyZXNlcnZlLnBpZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFncF9zZWdtZW50MzIgKnVzZWdtZW50OworCQlzdHJ1Y3QgYWdwX3NlZ21lbnQgKmtzZWdtZW50OworCQlpbnQgc2VnOworCisJCWlmICh1cmVzZXJ2ZS5zZWdfY291bnQgPj0gMTYzODQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl1c2VnbWVudCA9IGttYWxsb2Moc2l6ZW9mKCp1c2VnbWVudCkgKiB1cmVzZXJ2ZS5zZWdfY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIXVzZWdtZW50KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJa3NlZ21lbnQgPSBrbWFsbG9jKHNpemVvZigqa3NlZ21lbnQpICoga3Jlc2VydmUuc2VnX2NvdW50LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrc2VnbWVudCkgeworCQkJa2ZyZWUodXNlZ21lbnQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIodXNlZ21lbnQsICh2b2lkIF9fdXNlciAqKSB1cmVzZXJ2ZS5zZWdfbGlzdCwKKwkJCQkgICBzaXplb2YoKnVzZWdtZW50KSAqIHVyZXNlcnZlLnNlZ19jb3VudCkpIHsKKwkJCWtmcmVlKHVzZWdtZW50KTsKKwkJCWtmcmVlKGtzZWdtZW50KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJZm9yIChzZWcgPSAwOyBzZWcgPCB1cmVzZXJ2ZS5zZWdfY291bnQ7IHNlZysrKSB7CisJCQlrc2VnbWVudFtzZWddLnBnX3N0YXJ0ID0gdXNlZ21lbnRbc2VnXS5wZ19zdGFydDsKKwkJCWtzZWdtZW50W3NlZ10ucGdfY291bnQgPSB1c2VnbWVudFtzZWddLnBnX2NvdW50OworCQkJa3NlZ21lbnRbc2VnXS5wcm90ID0gdXNlZ21lbnRbc2VnXS5wcm90OworCQl9CisKKwkJa2ZyZWUodXNlZ21lbnQpOworCQlrcmVzZXJ2ZS5zZWdfbGlzdCA9IGtzZWdtZW50OworCisJCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQkJLyogQ3JlYXRlIHRoZSBjbGllbnQgYW5kIGFkZCB0aGUgc2VnbWVudCAqLworCQkJY2xpZW50ID0gYWdwX2NyZWF0ZV9jbGllbnQoa3Jlc2VydmUucGlkKTsKKworCQkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoa3NlZ21lbnQpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJY2xpZW50X3ByaXYgPSBhZ3BfZmluZF9wcml2YXRlKGtyZXNlcnZlLnBpZCk7CisKKwkJCWlmIChjbGllbnRfcHJpdiAhPSBOVUxMKSB7CisJCQkJc2V0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmY2xpZW50X3ByaXYtPmFjY2Vzc19mbGFncyk7CisJCQkJc2V0X2JpdChBR1BfRkZfSVNfVkFMSUQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWdwX2NyZWF0ZV9zZWdtZW50KGNsaWVudCwgJmtyZXNlcnZlKTsKKwl9CisJLyogV2lsbCBuZXZlciByZWFsbHkgaGFwcGVuICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2FncGlvY19hbGxvY2F0ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisJc3RydWN0IGFncF9hbGxvY2F0ZTMyIGFsbG9jOworCisJREJHKCIiKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFsbG9jLCBhcmcsIHNpemVvZihhbGxvYykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbW9yeSA9IGFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChhbGxvYy5wZ19jb3VudCwgYWxsb2MudHlwZSk7CisKKwlpZiAobWVtb3J5ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWxsb2Mua2V5ID0gbWVtb3J5LT5rZXk7CisJYWxsb2MucGh5c2ljYWwgPSBtZW1vcnktPnBoeXNpY2FsOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZhbGxvYywgc2l6ZW9mKGFsbG9jKSkpIHsKKwkJYWdwX2ZyZWVfbWVtb3J5X3dyYXAobWVtb3J5KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfYmluZF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfYmluZDMyIGJpbmRfaW5mbzsKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCisJREJHKCIiKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmRfaW5mbywgYXJnLCBzaXplb2YoYmluZF9pbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtb3J5ID0gYWdwX2ZpbmRfbWVtX2J5X2tleShiaW5kX2luZm8ua2V5KTsKKworCWlmIChtZW1vcnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYWdwX2JpbmRfbWVtb3J5KG1lbW9yeSwgYmluZF9pbmZvLnBnX3N0YXJ0KTsKK30KKworc3RhdGljIGludCBjb21wYXRfYWdwaW9jX3VuYmluZF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisJc3RydWN0IGFncF91bmJpbmQzMiB1bmJpbmQ7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmdW5iaW5kLCBhcmcsIHNpemVvZih1bmJpbmQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfZmluZF9tZW1fYnlfa2V5KHVuYmluZC5rZXkpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhZ3BfdW5iaW5kX21lbW9yeShtZW1vcnkpOworfQorCitsb25nIGNvbXBhdF9hZ3BfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpjdXJyX3ByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldF92YWwgPSAtRU5PVFRZOworCisJbXV0ZXhfbG9jaygmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKworCWlmICgoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciA9PSBOVUxMKSAmJgorCSAgICAoY21kICE9IEFHUElPQ19BQ1FVSVJFMzIpKSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGlvY3RsX291dDsKKwl9CisJaWYgKChhZ3BfZmUuYmFja2VuZF9hY3F1aXJlZCAhPSBUUlVFKSAmJgorCSAgICAoY21kICE9IEFHUElPQ19BQ1FVSVJFMzIpKSB7CisJCXJldF92YWwgPSAtRUJVU1k7CisJCWdvdG8gaW9jdGxfb3V0OworCX0KKwlpZiAoY21kICE9IEFHUElPQ19BQ1FVSVJFMzIpIHsKKwkJaWYgKCEodGVzdF9iaXQoQUdQX0ZGX0lTX0NPTlRST0xMRVIsICZjdXJyX3ByaXYtPmFjY2Vzc19mbGFncykpKSB7CisJCQlyZXRfdmFsID0gLUVQRVJNOworCQkJZ290byBpb2N0bF9vdXQ7CisJCX0KKwkJLyogVXNlIHRoZSBvcmlnaW5hbCBwaWQgb2YgdGhlIGNvbnRyb2xsZXIsCisJCSAqIGluIGNhc2UgaXQncyB0aHJlYWRlZCAqLworCisJCWlmIChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLT5waWQgIT0gY3Vycl9wcml2LT5teV9waWQpIHsKKwkJCXJldF92YWwgPSAtRUJVU1k7CisJCQlnb3RvIGlvY3RsX291dDsKKwkJfQorCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBR1BJT0NfSU5GTzMyOgorCQlyZXRfdmFsID0gY29tcGF0X2FncGlvY19pbmZvX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19BQ1FVSVJFMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfYWNxdWlyZV93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVMRUFTRTMyOgorCQlyZXRfdmFsID0gYWdwaW9jX3JlbGVhc2Vfd3JhcChjdXJyX3ByaXYpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX1NFVFVQMzI6CisJCXJldF92YWwgPSBhZ3Bpb2Nfc2V0dXBfd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX1JFU0VSVkUzMjoKKwkJcmV0X3ZhbCA9IGNvbXBhdF9hZ3Bpb2NfcmVzZXJ2ZV93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUFJPVEVDVDMyOgorCQlyZXRfdmFsID0gYWdwaW9jX3Byb3RlY3Rfd3JhcChjdXJyX3ByaXYpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FMTE9DQVRFMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX2FsbG9jYXRlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19ERUFMTE9DQVRFMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfZGVhbGxvY2F0ZV93cmFwKGN1cnJfcHJpdiwgKGludCkgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19CSU5EMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX2JpbmRfd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX1VOQklORDMyOgorCQlyZXRfdmFsID0gY29tcGF0X2FncGlvY191bmJpbmRfd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwl9CisKK2lvY3RsX291dDoKKwlEQkcoImlvY3RsIHJldHVybnMgJWRcbiIsIHJldF92YWwpOworCW11dGV4X3VubG9jaygmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaCBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MzlkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRQorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0FHUF9DT01QQVRfSU9DVExfSAorI2RlZmluZSBfQUdQX0NPTVBBVF9JT0NUTF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BnYXJ0Lmg+CisKKyNkZWZpbmUgQUdQSU9DX0lORk8zMiAgICAgICBfSU9SIChBR1BJT0NfQkFTRSwgMCwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQUdQSU9DX0FDUVVJUkUzMiAgICBfSU8gIChBR1BJT0NfQkFTRSwgMSkKKyNkZWZpbmUgQUdQSU9DX1JFTEVBU0UzMiAgICBfSU8gIChBR1BJT0NfQkFTRSwgMikKKyNkZWZpbmUgQUdQSU9DX1NFVFVQMzIgICAgICBfSU9XIChBR1BJT0NfQkFTRSwgMywgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQUdQSU9DX1JFU0VSVkUzMiAgICBfSU9XIChBR1BJT0NfQkFTRSwgNCwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQUdQSU9DX1BST1RFQ1QzMiAgICBfSU9XIChBR1BJT0NfQkFTRSwgNSwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQUdQSU9DX0FMTE9DQVRFMzIgICBfSU9XUihBR1BJT0NfQkFTRSwgNiwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQUdQSU9DX0RFQUxMT0NBVEUzMiBfSU9XIChBR1BJT0NfQkFTRSwgNywgY29tcGF0X2ludF90KQorI2RlZmluZSBBR1BJT0NfQklORDMyICAgICAgIF9JT1cgKEFHUElPQ19CQVNFLCA4LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfVU5CSU5EMzIgICAgIF9JT1cgKEFHUElPQ19CQVNFLCA5LCBjb21wYXRfdXB0cl90KQorCitzdHJ1Y3QgYWdwX2luZm8zMiB7CisJc3RydWN0IGFncF92ZXJzaW9uIHZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhlIGRyaXZlciAgICAgICAgKi8KKwl1MzIgYnJpZGdlX2lkOwkJLyogYnJpZGdlIHZlbmRvci9kZXZpY2UgICAgICAgICAqLworCXUzMiBhZ3BfbW9kZTsJCS8qIG1vZGUgaW5mbyBvZiBicmlkZ2UgICAgICAgICAgKi8KKwljb21wYXRfbG9uZ190IGFwZXJfYmFzZTsJLyogYmFzZSBvZiBhcGVydHVyZSAgICAgICAgICAgICAqLworCWNvbXBhdF9zaXplX3QgYXBlcl9zaXplOwkvKiBzaXplIG9mIGFwZXJ0dXJlICAgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBwZ190b3RhbDsJLyogbWF4IHBhZ2VzIChzd2FwICsgc3lzdGVtKSAgICAqLworCWNvbXBhdF9zaXplX3QgcGdfc3lzdGVtOwkvKiBtYXggcGFnZXMgKHN5c3RlbSkgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBwZ191c2VkOwkJLyogY3VycmVudCBwYWdlcyB1c2VkICAgICAgICAgICAqLworfTsKKworLyoKKyAqIFRoZSAicHJvdCIgZG93biBiZWxvdyBuZWVkcyBzdGlsbCBhICJzbGVlcCIgZmxhZyBzb21laG93IC4uLgorICovCitzdHJ1Y3QgYWdwX3NlZ21lbnQzMiB7CisJY29tcGF0X29mZl90IHBnX3N0YXJ0OwkJLyogc3RhcnRpbmcgcGFnZSB0byBwb3B1bGF0ZSAgICAqLworCWNvbXBhdF9zaXplX3QgcGdfY291bnQ7CS8qIG51bWJlciBvZiBwYWdlcyAgICAgICAgICAgICAgKi8KKwljb21wYXRfaW50X3QgcHJvdDsJCS8qIHByb3QgZmxhZ3MgZm9yIG1tYXAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBhZ3BfcmVnaW9uMzIgeworCWNvbXBhdF9waWRfdCBwaWQ7CQkvKiBwaWQgb2YgcHJvY2VzcyAgICAgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBzZWdfY291bnQ7CS8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgKi8KKwlzdHJ1Y3QgYWdwX3NlZ21lbnQzMiAqc2VnX2xpc3Q7Cit9OworCitzdHJ1Y3QgYWdwX2FsbG9jYXRlMzIgeworCWNvbXBhdF9pbnRfdCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBwZ19jb3VudDsJLyogbnVtYmVyIG9mIHBhZ2VzICAgICAgICAgICAgICAqLworCXUzMiB0eXBlOwkJLyogMCA9PSBub3JtYWwsIG90aGVyIGRldnNwZWMgICAqLworCXUzMiBwaHlzaWNhbDsgICAgICAgICAgIC8qIGRldmljZSBzcGVjaWZpYyAoc29tZSBkZXZpY2VzCisJCQkJICogbmVlZCBhIHBoeXMgYWRkcmVzcyBvZiB0aGUKKwkJCQkgKiBhY3R1YWwgcGFnZSBiZWhpbmQgdGhlIGdhdHQKKwkJCQkgKiB0YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGFncF9iaW5kMzIgeworCWNvbXBhdF9pbnRfdCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJY29tcGF0X29mZl90IHBnX3N0YXJ0OwkJLyogc3RhcnRpbmcgcGFnZSB0byBwb3B1bGF0ZSAgICAqLworfTsKKworc3RydWN0IGFncF91bmJpbmQzMiB7CisJY29tcGF0X2ludF90IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwl1MzIgcHJpb3JpdHk7CQkvKiBwcmlvcml0eSBmb3IgcGFnaW5nIG91dCAgICAgICovCit9OworCitleHRlcm4gc3RydWN0IGFncF9mcm9udF9kYXRhIGFncF9mZTsKKworaW50IGFncGlvY19hY3F1aXJlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpOworaW50IGFncGlvY19yZWxlYXNlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpOworaW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpOworaW50IGFncGlvY19zZXR1cF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKTsKK2ludCBhZ3Bpb2NfZGVhbGxvY2F0ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCBpbnQgYXJnKTsKK3N0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICphZ3BfZmluZF9wcml2YXRlKHBpZF90IHBpZCk7CitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2NyZWF0ZV9jbGllbnQocGlkX3QgaWQpOworaW50IGFncF9yZW1vdmVfY2xpZW50KHBpZF90IGlkKTsKK2ludCBhZ3BfY3JlYXRlX3NlZ21lbnQoc3RydWN0IGFncF9jbGllbnQgKmNsaWVudCwgc3RydWN0IGFncF9yZWdpb24gKnJlZ2lvbik7Cit2b2lkIGFncF9mcmVlX21lbW9yeV93cmFwKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChzaXplX3QgcGdfY291bnQsIHUzMiB0eXBlKTsKK3N0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZmluZF9tZW1fYnlfa2V5KGludCBrZXkpOworc3RydWN0IGFncF9jbGllbnQgKmFncF9maW5kX2NsaWVudF9ieV9waWQocGlkX3QgaWQpOworCisjZW5kaWYgLyogX0FHUF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKaW5kZXggMzBmNzMwZi4uNjU4Y2IxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCkBAIC0zMzUsNiArMzM1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYWdwX2VmZmljZW9uX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCmluZGV4IDBmMmVkMmEuLjY3OWQ3ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKQEAgLTQxLDkgKzQxLDkgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgImFncC5oIgogCi1zdGF0aWMgc3RydWN0IGFncF9mcm9udF9kYXRhIGFncF9mZTsKK3N0cnVjdCBhZ3BfZnJvbnRfZGF0YSBhZ3BfZmU7CiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KQorc3RydWN0IGFncF9tZW1vcnkgKmFncF9maW5kX21lbV9ieV9rZXkoaW50IGtleSkKIHsKIAlzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycjsKIApAQCAtMTU5LDcgKzE1OSw3IEBACiAJcmV0dXJuIHZtX2dldF9wYWdlX3Byb3QocHJvdF9iaXRzKTsKIH0KIAotc3RhdGljIGludCBhZ3BfY3JlYXRlX3NlZ21lbnQoc3RydWN0IGFncF9jbGllbnQgKmNsaWVudCwgc3RydWN0IGFncF9yZWdpb24gKnJlZ2lvbikKK2ludCBhZ3BfY3JlYXRlX3NlZ21lbnQoc3RydWN0IGFncF9jbGllbnQgKmNsaWVudCwgc3RydWN0IGFncF9yZWdpb24gKnJlZ2lvbikKIHsKIAlzdHJ1Y3QgYWdwX3NlZ21lbnRfcHJpdiAqKnJldF9zZWc7CiAJc3RydWN0IGFncF9zZWdtZW50X3ByaXYgKnNlZzsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCiAvKiBGaWxlIHByaXZhdGUgbGlzdCByb3V0aW5lcyAqLwogCi1zdGF0aWMgc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmFncF9maW5kX3ByaXZhdGUocGlkX3QgcGlkKQorc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmFncF9maW5kX3ByaXZhdGUocGlkX3QgcGlkKQogewogCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpjdXJyOwogCkBAIC0yNjYsMTMgKzI2NiwxMyBAQAogICogV3JhcHBlcnMgZm9yIGFncF9mcmVlX21lbW9yeSAmIGFncF9hbGxvY2F0ZV9tZW1vcnkKICAqIFRoZXNlIG1ha2Ugc3VyZSB0aGF0IGludGVybmFsIGxpc3RzIGFyZSBrZXB0IHVwZGF0ZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGFncF9mcmVlX21lbW9yeV93cmFwKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpCit2b2lkIGFncF9mcmVlX21lbW9yeV93cmFwKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpCiB7CiAJYWdwX3JlbW92ZV9mcm9tX3Bvb2wobWVtb3J5KTsKIAlhZ3BfZnJlZV9tZW1vcnkobWVtb3J5KTsKIH0KIAotc3RhdGljIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoc2l6ZV90IHBnX2NvdW50LCB1MzIgdHlwZSkKK3N0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoc2l6ZV90IHBnX2NvdW50LCB1MzIgdHlwZSkKIHsKIAlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OwogCkBAIC00ODQsNyArNDg0LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBhZ3BfY2xpZW50ICphZ3BfZmluZF9jbGllbnRfYnlfcGlkKHBpZF90IGlkKQorc3RydWN0IGFncF9jbGllbnQgKmFncF9maW5kX2NsaWVudF9ieV9waWQocGlkX3QgaWQpCiB7CiAJc3RydWN0IGFncF9jbGllbnQgKnRlbXA7CiAKQEAgLTUwOSw3ICs1MDksNyBAQAogCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPm51bV9jbGllbnRzKys7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2NyZWF0ZV9jbGllbnQocGlkX3QgaWQpCitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2NyZWF0ZV9jbGllbnQocGlkX3QgaWQpCiB7CiAJc3RydWN0IGFncF9jbGllbnQgKm5ld19jbGllbnQ7CiAKQEAgLTUyMiw3ICs1MjIsNyBAQAogCXJldHVybiBuZXdfY2xpZW50OwogfQogCi1zdGF0aWMgaW50IGFncF9yZW1vdmVfY2xpZW50KHBpZF90IGlkKQoraW50IGFncF9yZW1vdmVfY2xpZW50KHBpZF90IGlkKQogewogCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGFncF9jbGllbnQgKnByZXZfY2xpZW50OwpAQCAtNzQ2LDcgKzc0Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWdwaW9jX2FjcXVpcmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKK2ludCBhZ3Bpb2NfYWNxdWlyZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQogewogCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcjsKIApAQCAtNzg5LDE0ICs3ODksMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfcmVsZWFzZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQoraW50IGFncGlvY19yZWxlYXNlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCiB7CiAJREJHKCIiKTsKIAlhZ3BfY29udHJvbGxlcl9yZWxlYXNlX2N1cnJlbnQoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciwgcHJpdik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWdwaW9jX3NldHVwX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCitpbnQgYWdwaW9jX3NldHVwX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IGFncF9zZXR1cCBtb2RlOwogCkBAIC04NzYsNyArODc2LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfcHJvdGVjdF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQoraW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCiB7CiAJREJHKCIiKTsKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KQEAgLTg5Miw2ICs4OTIsOSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmYWxsb2MsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfYWxsb2NhdGUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwlpZiAoYWxsb2MudHlwZSA+PSBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltZW1vcnkgPSBhZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoYWxsb2MucGdfY291bnQsIGFsbG9jLnR5cGUpOwogCiAJaWYgKG1lbW9yeSA9PSBOVUxMKQpAQCAtOTA3LDcgKzkxMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWdwaW9jX2RlYWxsb2NhdGVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgaW50IGFyZykKK2ludCBhZ3Bpb2NfZGVhbGxvY2F0ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCBpbnQgYXJnKQogewogCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CiAKQEAgLTEwNDMsNiArMTA0Niw5IEBACiAJLnJlYWQJCT0gYWdwX3JlYWQsCiAJLndyaXRlCQk9IGFncF93cml0ZSwKIAkuaW9jdGwJCT0gYWdwX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gY29tcGF0X2FncF9pb2N0bCwKKyNlbmRpZgogCS5tbWFwCQk9IGFncF9tbWFwLAogCS5vcGVuCQk9IGFncF9vcGVuLAogCS5yZWxlYXNlCT0gYWdwX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCmluZGV4IDM0OTFkNmYuLjc5MjMzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCkBAIC0xMDEsNiArMTAxLDYzIEBACiAJcmV0dXJuIC0xOwogfQogCisvKgorICogVXNlIGttYWxsb2MgaWYgcG9zc2libGUgZm9yIHRoZSBwYWdlIGxpc3QuIE90aGVyd2lzZSBmYWxsIGJhY2sgdG8KKyAqIHZtYWxsb2MuIFRoaXMgc3BlZWRzIHRoaW5ncyB1cCBhbmQgYWxzbyBzYXZlcyBtZW1vcnkgZm9yIHNtYWxsIEFHUAorICogcmVnaW9ucy4KKyAqLworCit2b2lkIGFncF9hbGxvY19wYWdlX2FycmF5KHNpemVfdCBzaXplLCBzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCW1lbS0+bWVtb3J5ID0gTlVMTDsKKwltZW0tPnZtYWxsb2NfZmxhZyA9IDA7CisKKwlpZiAoc2l6ZSA8PSAyKlBBR0VfU0laRSkKKwkJbWVtLT5tZW1vcnkgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAobWVtLT5tZW1vcnkgPT0gTlVMTCkgeworCQltZW0tPm1lbW9yeSA9IHZtYWxsb2Moc2l6ZSk7CisJCW1lbS0+dm1hbGxvY19mbGFnID0gMTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFncF9hbGxvY19wYWdlX2FycmF5KTsKKwordm9pZCBhZ3BfZnJlZV9wYWdlX2FycmF5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJaWYgKG1lbS0+dm1hbGxvY19mbGFnKSB7CisJCXZmcmVlKG1lbS0+bWVtb3J5KTsKKwl9IGVsc2UgeworCQlrZnJlZShtZW0tPm1lbW9yeSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChhZ3BfZnJlZV9wYWdlX2FycmF5KTsKKworCitzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfdXNlcl9tZW1vcnkodW5zaWduZWQgbG9uZyBudW1fYWdwX3BhZ2VzKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisJdW5zaWduZWQgbG9uZyBhbGxvY19zaXplID0gbnVtX2FncF9wYWdlcypzaXplb2Yoc3RydWN0IHBhZ2UgKik7CisKKwluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWdwX21lbW9yeSksIEdGUF9LRVJORUwpOworCWlmIChuZXcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXctPmtleSA9IGFncF9nZXRfa2V5KCk7CisKKwlpZiAobmV3LT5rZXkgPCAwKSB7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWFncF9hbGxvY19wYWdlX2FycmF5KGFsbG9jX3NpemUsIG5ldyk7CisKKwlpZiAobmV3LT5tZW1vcnkgPT0gTlVMTCkgeworCQlhZ3BfZnJlZV9rZXkobmV3LT5rZXkpOworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmV3LT5udW1fc2NyYXRjaF9wYWdlcyA9IDA7CisJcmV0dXJuIG5ldzsKK30KIAogc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfbWVtb3J5KGludCBzY3JhdGNoX3BhZ2VzKQogewpAQCAtMTE2LDcgKzE3Myw4IEBACiAJCWtmcmVlKG5ldyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQluZXctPm1lbW9yeSA9IHZtYWxsb2MoUEFHRV9TSVpFICogc2NyYXRjaF9wYWdlcyk7CisKKwlhZ3BfYWxsb2NfcGFnZV9hcnJheShQQUdFX1NJWkUgKiBzY3JhdGNoX3BhZ2VzLCBuZXcpOwogCiAJaWYgKG5ldy0+bWVtb3J5ID09IE5VTEwpIHsKIAkJYWdwX2ZyZWVfa2V5KG5ldy0+a2V5KTsKQEAgLTEyNCw2ICsxODIsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbmV3LT5udW1fc2NyYXRjaF9wYWdlcyA9IHNjcmF0Y2hfcGFnZXM7CisJbmV3LT50eXBlID0gQUdQX05PUk1BTF9NRU1PUlk7CiAJcmV0dXJuIG5ldzsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2NyZWF0ZV9tZW1vcnkpOwpAQCAtMTQ2LDYgKzIwNSwxMSBAQAogCWlmIChjdXJyLT5pc19ib3VuZCA9PSBUUlVFKQogCQlhZ3BfdW5iaW5kX21lbW9yeShjdXJyKTsKIAorCWlmIChjdXJyLT50eXBlID49IEFHUF9VU0VSX1RZUEVTKSB7CisJCWFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZShjdXJyKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChjdXJyLT50eXBlICE9IDApIHsKIAkJY3Vyci0+YnJpZGdlLT5kcml2ZXItPmZyZWVfYnlfdHlwZShjdXJyKTsKIAkJcmV0dXJuOwpAQCAtMTU3LDcgKzIyMSw3IEBACiAJCWZsdXNoX2FncF9tYXBwaW5ncygpOwogCX0KIAlhZ3BfZnJlZV9rZXkoY3Vyci0+a2V5KTsKLQl2ZnJlZShjdXJyLT5tZW1vcnkpOworCWFncF9mcmVlX3BhZ2VfYXJyYXkoY3Vycik7CiAJa2ZyZWUoY3Vycik7CiB9CiBFWFBPUlRfU1lNQk9MKGFncF9mcmVlX21lbW9yeSk7CkBAIC0xODgsNiArMjUyLDEzIEBACiAJaWYgKChhdG9taWNfcmVhZCgmYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApICsgcGFnZV9jb3VudCkgPiBicmlkZ2UtPm1heF9tZW1vcnlfYWdwKQogCQlyZXR1cm4gTlVMTDsKIAorCWlmICh0eXBlID49IEFHUF9VU0VSX1RZUEVTKSB7CisJCW5ldyA9IGFncF9nZW5lcmljX2FsbG9jX3VzZXIocGFnZV9jb3VudCwgdHlwZSk7CisJCWlmIChuZXcpCisJCQluZXctPmJyaWRnZSA9IGJyaWRnZTsKKwkJcmV0dXJuIG5ldzsKKwl9CisKIAlpZiAodHlwZSAhPSAwKSB7CiAJCW5ldyA9IGJyaWRnZS0+ZHJpdmVyLT5hbGxvY19ieV90eXBlKHBhZ2VfY291bnQsIHR5cGUpOwogCQlpZiAobmV3KQpAQCAtOTYwLDYgKzEwMzEsNyBAQAogCW9mZl90IGo7CiAJdm9pZCAqdGVtcDsKIAlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJaW50IG1hc2tfdHlwZTsKIAogCWJyaWRnZSA9IG1lbS0+YnJpZGdlOwogCWlmICghYnJpZGdlKQpAQCAtOTk1LDcgKzEwNjcsMTEgQEAKIAludW1fZW50cmllcyAtPSBhZ3BfbWVtb3J5X3Jlc2VydmVkL1BBR0VfU0laRTsKIAlpZiAobnVtX2VudHJpZXMgPCAwKSBudW1fZW50cmllcyA9IDA7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJaWYgKHR5cGUgIT0gbWVtLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2tfdHlwZSA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYnJpZGdlLCB0eXBlKTsKKwlpZiAobWFza190eXBlICE9IDApIHsKIAkJLyogVGhlIGdlbmVyaWMgcm91dGluZXMga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDE4LDcgKzEwOTQsOCBAQAogCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKLQkJd3JpdGVsKGJyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShicmlkZ2UsIG1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLCBicmlkZ2UtPmdhdHRfdGFibGUraik7CisJCXdyaXRlbChicmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYnJpZGdlLCBtZW0tPm1lbW9yeVtpXSwgbWFza190eXBlKSwKKwkJICAgICAgIGJyaWRnZS0+Z2F0dF90YWJsZStqKTsKIAl9CiAJcmVhZGwoYnJpZGdlLT5nYXR0X3RhYmxlK2otMSk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCkBAIC0xMDMyLDYgKzExMDksNyBAQAogewogCXNpemVfdCBpOwogCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwlpbnQgbWFza190eXBlOwogCiAJYnJpZGdlID0gbWVtLT5icmlkZ2U7CiAJaWYgKCFicmlkZ2UpCkBAIC0xMDQwLDcgKzExMTgsMTEgQEAKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0JaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXNrX3R5cGUgPSBicmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGJyaWRnZSwgdHlwZSk7CisJaWYgKG1hc2tfdHlwZSAhPSAwKSB7CiAJCS8qIFRoZSBnZW5lcmljIHJvdXRpbmVzIGtub3cgbm90aGluZyBvZiBtZW1vcnkgdHlwZXMgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA1NiwyMiArMTEzOCw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5KTsKIAotCiBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZShzaXplX3QgcGFnZV9jb3VudCwgaW50IHR5cGUpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUpOwogCi0KIHZvaWQgYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKHN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyKQogewotCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJYWdwX2ZyZWVfcGFnZV9hcnJheShjdXJyKTsKIAlhZ3BfZnJlZV9rZXkoY3Vyci0+a2V5KTsKIAlrZnJlZShjdXJyKTsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKTsKIAorc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX3VzZXIoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisJaW50IGk7CisJaW50IHBhZ2VzOworCisJcGFnZXMgPSAocGFnZV9jb3VudCArIEVOVFJJRVNfUEVSX1BBR0UgLSAxKSAvIEVOVFJJRVNfUEVSX1BBR0U7CisJbmV3ID0gYWdwX2NyZWF0ZV91c2VyX21lbW9yeShwYWdlX2NvdW50KTsKKwlpZiAobmV3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykKKwkJbmV3LT5tZW1vcnlbaV0gPSAwOworCW5ldy0+cGFnZV9jb3VudCA9IDA7CisJbmV3LT50eXBlID0gdHlwZTsKKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gcGFnZXM7CisKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY191c2VyKTsKIAogLyoKICAqIEJhc2ljIFBhZ2UgQWxsb2NhdGlvbiBSb3V0aW5lcyAtCkBAIC0xMTY1LDYgKzEyNjUsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfbWFza19tZW1vcnkpOwogCitpbnQgYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCSAgaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAwOworCXJldHVybiB0eXBlOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSk7CisKIC8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgQUdQdjMgc3BlYywKICAqIHdoaWNoIGNvdmVycyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgaGFkIHByZXZpb3VzbHkgYmVlbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKaW5kZXggOTA3ZmI2Ni4uODQ3ZGVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCkBAIC00MzgsNiArNDM4LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKaW5kZXggOTE3Njk0NC4uM2U3NjE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pNDYwLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYwpAQCAtMjkzLDYgKzI5Myw5IEBACiAJcHJfZGVidWcoImk0NjBfaW5zZXJ0X21lbW9yeV9zbWFsbF9pb19wYWdlKG1lbT0lcCwgcGdfc3RhcnQ9JWxkLCB0eXBlPSVkLCBwYWRkcjA9MHglbHgpXG4iLAogCQkgbWVtLCBwZ19zdGFydCwgdHlwZSwgbWVtLT5tZW1vcnlbMF0pOwogCisJaWYgKHR5cGUgPj0gQUdQX1VTRVJfVFlQRVMgfHwgbWVtLT50eXBlID49IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlvX3BnX3N0YXJ0ID0gSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRSAqIHBnX3N0YXJ0OwogCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKQEAgLTM5Niw2ICszOTksOSBAQAogCXN0cnVjdCBscF9kZXNjICpzdGFydCwgKmVuZCwgKmxwOwogCXZvaWQgKnRlbXA7CiAKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUyB8fCBtZW0tPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV84KHRlbXApLT5udW1fZW50cmllczsKIApAQCAtNTcyLDYgKzU3OCw3IEBACiAjZW5kaWYKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IGEzMDExZGUuLjA2YjBiYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSAiYWdwLmgiCkBAIC0yNCw2ICsyNSw5IEBACiAgICAgICAgICAgICAgICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHX0hCKQogCiAKK2V4dGVybiBpbnQgYWdwX21lbW9yeV9yZXNlcnZlZDsKKworCiAvKiBJbnRlbCA4MTUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgSU5URUxfODE1X0FQQ09OVAkweDUxCiAjZGVmaW5lIElOVEVMXzgxNV9BVFRCQVNFX01BU0sJfjB4MUZGRkZGRkYKQEAgLTY4LDEyICs3MiwxNSBAQAogCiAjZGVmaW5lIEFHUF9EQ0FDSEVfTUVNT1JZCTEKICNkZWZpbmUgQUdQX1BIWVNfTUVNT1JZCQkyCisjZGVmaW5lIElOVEVMX0FHUF9DQUNIRURfTUVNT1JZIDMKIAogc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfaTgxMF9tYXNrc1tdID0KIHsKIAl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKIAl7Lm1hc2sgPSAoSTgxMF9QVEVfVkFMSUQgfCBJODEwX1BURV9MT0NBTCksIC50eXBlID0gQUdQX0RDQUNIRV9NRU1PUll9LAotCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9CisJey5tYXNrID0gSTgxMF9QVEVfVkFMSUQsIC50eXBlID0gMH0sCisJey5tYXNrID0gSTgxMF9QVEVfVkFMSUQgfCBJODMwX1BURV9TWVNURU1fQ0FDSEVELAorCSAudHlwZSA9IElOVEVMX0FHUF9DQUNIRURfTUVNT1JZfQogfTsKIAogc3RhdGljIHN0cnVjdCBfaW50ZWxfaTgxMF9wcml2YXRlIHsKQEAgLTExNywxMyArMTI0LDE1IEBACiAKIAljdXJyZW50X3NpemUgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgxMF9wcml2YXRlLmk4MTBfZGV2LCBJODEwX01NQUREUiwgJnRlbXApOwotCXRlbXAgJj0gMHhmZmY4MDAwMDsKLQotCWludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMgPSBpb3JlbWFwKHRlbXAsIDEyOCAqIDQwOTYpOwogCWlmICghaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVtYXAgbWVtb3J5LlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgxMF9wcml2YXRlLmk4MTBfZGV2LCBJODEwX01NQUREUiwgJnRlbXApOworCQl0ZW1wICY9IDB4ZmZmODAwMDA7CisKKwkJaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwgMTI4ICogNDA5Nik7CisJCWlmICghaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlbWFwIG1lbW9yeS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAl9CiAKIAlpZiAoKHJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9EUkFNX0NUTCkKQEAgLTIwMSw2MiArMjEwLDc5IEBACiAJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKIH0KIAorc3RhdGljIGludCBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJCQkJaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPCBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIHR5cGU7CisJZWxzZSBpZiAodHlwZSA9PSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZKQorCQlyZXR1cm4gSU5URUxfQUdQX0NBQ0hFRF9NRU1PUlk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpbnRlbF9pODEwX2luc2VydF9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAogCQkJCWludCB0eXBlKQogewogCWludCBpLCBqLCBudW1fZW50cmllczsKIAl2b2lkICp0ZW1wOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBtYXNrX3R5cGU7CiAKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CiAJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKIAogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF9lcnI7CisKIAogCWZvciAoaiA9IHBnX3N0YXJ0OyBqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KTsgaisrKSB7Ci0JCWlmICghUEdFX0VNUFRZKGFncF9icmlkZ2UsIHJlYWRsKGFncF9icmlkZ2UtPmdhdHRfdGFibGUraikpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7Ci0JCWlmICgodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkgJiYgKG1lbS0+dHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkpIHsKLQkJCS8qIHNwZWNpYWwgaW5zZXJ0ICovCi0JCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkgewotCQkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQkJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KTsgaSsrKSB7Ci0JCQkJd3JpdGVsKChpKjQwOTYpfEk4MTBfUFRFX0xPQ0FMfEk4MTBfUFRFX1ZBTElELCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwotCQkJfQotCQkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoaS0xKSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLwotCi0JCQlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOwotCQkJcmV0dXJuIDA7CisJCWlmICghUEdFX0VNUFRZKGFncF9icmlkZ2UsIHJlYWRsKGFncF9icmlkZ2UtPmdhdHRfdGFibGUraikpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dF9lcnI7CiAJCX0KLQkJaWYgKCh0eXBlID09IEFHUF9QSFlTX01FTU9SWSkgJiYgKG1lbS0+dHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpKQotCQkJZ290byBpbnNlcnQ7Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KIAotaW5zZXJ0OgotCWlmICghbWVtLT5pc19mbHVzaGVkKSB7Ci0JCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOwotCX0KKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCisJCWdvdG8gb3V0X2VycjsKIAotCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKLQkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAotCQkJaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhqKjQpKTsKKwltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKKworCXN3aXRjaCAobWFza190eXBlKSB7CisJY2FzZSBBR1BfRENBQ0hFX01FTU9SWToKKwkJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCisJCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwkJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBpKyspIHsKKwkJCXdyaXRlbCgoaSo0MDk2KXxJODEwX1BURV9MT0NBTHxJODEwX1BURV9WQUxJRCwKKwkJCSAgICAgICBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOworCQl9CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOworCQlicmVhazsKKwljYXNlIEFHUF9QSFlTX01FTU9SWToKKwljYXNlIEFHUF9OT1JNQUxfTUVNT1JZOgorCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKKwkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJCQkJCSAgICAgICBtZW0tPm1lbW9yeVtpXSwKKwkJCQkJCQkgICAgICAgbWFza190eXBlKSwKKwkJCSAgICAgICBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOworCQl9CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CiAJfQotCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAogCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7Ci0JcmV0dXJuIDA7CitvdXQ6CisJcmV0ID0gMDsKK291dF9lcnI6CisJbWVtLT5pc19mbHVzaGVkID0gMTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2k4MTBfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCkBAIC0zMzcsMTIgKzM2MywxMSBAQAogCQluZXctPnR5cGUgPSBBR1BfRENBQ0hFX01FTU9SWTsKIAkJbmV3LT5wYWdlX2NvdW50ID0gcGdfY291bnQ7CiAJCW5ldy0+bnVtX3NjcmF0Y2hfcGFnZXMgPSAwOwotCQl2ZnJlZShuZXctPm1lbW9yeSk7CisJCWFncF9mcmVlX3BhZ2VfYXJyYXkobmV3KTsKIAkJcmV0dXJuIG5ldzsKIAl9CiAJaWYgKHR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKQogCQlyZXR1cm4gYWxsb2NfYWdwcGh5c21lbV9pOHh4KHBnX2NvdW50LCB0eXBlKTsKLQogCXJldHVybiBOVUxMOwogfQogCkBAIC0zNTcsNyArMzgyLDcgQEAKIAkJCQkgZ2FydF90b192aXJ0KGN1cnItPm1lbW9yeVswXSkpOwogCQkJZ2xvYmFsX2ZsdXNoX3RsYigpOwogCQl9Ci0JCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJCWFncF9mcmVlX3BhZ2VfYXJyYXkoY3Vycik7CiAJfQogCWtmcmVlKGN1cnIpOwogfQpAQCAtNjE5LDkgKzY0NCwxMSBAQAogewogCWludCBpLGosbnVtX2VudHJpZXM7CiAJdm9pZCAqdGVtcDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgbWFza190eXBlOwogCiAJaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwogCW51bV9lbnRyaWVzID0gQV9TSVpFX0ZJWCh0ZW1wKS0+bnVtX2VudHJpZXM7CkBAIC02MzEsMzQgKzY1OCw0MSBAQAogCQkJCXBnX3N0YXJ0LGludGVsX2k4MzBfcHJpdmF0ZS5ndHRfZW50cmllcyk7CiAKIAkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgdG8gaW5zZXJ0IGludG8gbG9jYWwvc3RvbGVuIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKIAogCS8qIFRoZSBpODMwIGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKIAkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCiAJICovCiAKLQlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKLQkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCisJCWdvdG8gb3V0X2VycjsKIAotCWlmICghbWVtLT5pc19mbHVzaGVkKSB7CisJbWFza190eXBlID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSk7CisKKwlpZiAobWFza190eXBlICE9IDAgJiYgbWFza190eXBlICE9IEFHUF9QSFlTX01FTU9SWSAmJgorCSAgICBtYXNrX3R5cGUgIT0gSU5URUxfQUdQX0NBQ0hFRF9NRU1PUlkpCisJCWdvdG8gb3V0X2VycjsKKworCWlmICghbWVtLT5pc19mbHVzaGVkKQogCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKLQkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKLQl9CiAKIAlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CiAJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCi0JCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKSwKLQkJCWludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CisJCQkJCQkgICAgICAgbWVtLT5tZW1vcnlbaV0sIG1hc2tfdHlwZSksCisJCSAgICAgICBpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOwogCX0KIAlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKChqLTEpKjQpKTsKLQogCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7Ci0JcmV0dXJuIDA7CisKK291dDoKKwlyZXQgPSAwOworb3V0X2VycjoKKwltZW0tPmlzX2ZsdXNoZWQgPSAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfaTgzMF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLG9mZl90IHBnX3N0YXJ0LApAQCAtNjg3LDcgKzcyMSw2IEBACiB7CiAJaWYgKHR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKQogCQlyZXR1cm4gYWxsb2NfYWdwcGh5c21lbV9pOHh4KHBnX2NvdW50LCB0eXBlKTsKLQogCS8qIGFsd2F5cyByZXR1cm4gTlVMTCBmb3Igb3RoZXIgYWxsb2NhdGlvbiB0eXBlcyBmb3Igbm93ICovCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03MzQsOSArNzY3LDExIEBACiB7CiAJaW50IGksaixudW1fZW50cmllczsKIAl2b2lkICp0ZW1wOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBtYXNrX3R5cGU7CiAKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CiAJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKQEAgLTc0NiwzMyArNzgxLDQxIEBACiAJCQkJcGdfc3RhcnQsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKTsKIAogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRyeWluZyB0byBpbnNlcnQgaW50byBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOwogCi0JLyogVGhlIGk4MzAgY2FuJ3QgY2hlY2sgdGhlIEdUVCBmb3IgZW50cmllcyBzaW5jZSBpdHMgcmVhZCBvbmx5LAorCS8qIFRoZSBpOTE1IGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKIAkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCiAJICovCiAKLQlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKLQkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCisJCWdvdG8gb3V0X2VycjsKIAotCWlmICghbWVtLT5pc19mbHVzaGVkKSB7CisJbWFza190eXBlID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSk7CisKKwlpZiAobWFza190eXBlICE9IDAgJiYgbWFza190eXBlICE9IEFHUF9QSFlTX01FTU9SWSAmJgorCSAgICBtYXNrX3R5cGUgIT0gSU5URUxfQUdQX0NBQ0hFRF9NRU1PUlkpCisJCWdvdG8gb3V0X2VycjsKKworCWlmICghbWVtLT5pc19mbHVzaGVkKQogCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKLQkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKLQl9CiAKIAlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CiAJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCi0JCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKSwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtqKTsKKwkJCW1lbS0+bWVtb3J5W2ldLCBtYXNrX3R5cGUpLCBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0K2opOwogCX0KLQlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUuZ3R0K2otMSk7CiAKKwlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUuZ3R0K2otMSk7CiAJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKKworIG91dDoKKwlyZXQgPSAwOworIG91dF9lcnI6CisJbWVtLT5pc19mbHVzaGVkID0gMTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2k5MTVfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSxvZmZfdCBwZ19zdGFydCwKQEAgLTgwMyw3ICs4NDYsNyBAQAogICovCiBzdGF0aWMgaW50IGludGVsX2k5eHhfZmV0Y2hfc2l6ZSh2b2lkKQogewotCWludCBudW1fc2l6ZXMgPSBzaXplb2YoaW50ZWxfaTgzMF9zaXplcykgLyBzaXplb2YoKmludGVsX2k4MzBfc2l6ZXMpOworCWludCBudW1fc2l6ZXMgPSBBUlJBWV9TSVpFKGludGVsX2k4MzBfc2l6ZXMpOwogCWludCBhcGVyX3NpemU7IC8qIHNpemUgaW4gbWVnYWJ5dGVzICovCiAJaW50IGk7CiAKQEAgLTEzODQsNiArMTQyNyw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODEwX2RyaXZlciA9IHsKQEAgLTE0MDgsNiArMTQ1Miw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MTVfZHJpdmVyID0gewpAQCAtMTQzMSw2ICsxNDc2LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MzBfZHJpdmVyID0gewpAQCAtMTQ1NSw2ICsxNTAxLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gaW50ZWxfaTgzMF90eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODIwX2RyaXZlciA9IHsKQEAgLTE0NzgsNiArMTUyNSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODMwbXBfZHJpdmVyID0gewpAQCAtMTUwMSw2ICsxNTQ5LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84NDBfZHJpdmVyID0gewpAQCAtMTUyNCw2ICsxNTczLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84NDVfZHJpdmVyID0gewpAQCAtMTU0Nyw2ICsxNTk3LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84NTBfZHJpdmVyID0gewpAQCAtMTU3MCw2ICsxNjIxLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84NjBfZHJpdmVyID0gewpAQCAtMTU5Myw2ICsxNjQ1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF85MTVfZHJpdmVyID0gewpAQCAtMTYxNyw2ICsxNjcwLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gaW50ZWxfaTgzMF90eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfaTk2NV9kcml2ZXIgPSB7CkBAIC0xNjQxLDYgKzE2OTUsNyBAQAogICAgICAgIC5mcmVlX2J5X3R5cGUgICAgICAgICAgID0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAgICAgICAgLmFncF9hbGxvY19wYWdlICAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogICAgICAgIC5hZ3BfZGVzdHJveV9wYWdlICAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorICAgICAgIC5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gaW50ZWxfaTgzMF90eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfNzUwNV9kcml2ZXIgPSB7CkBAIC0xNjY0LDYgKzE3MTksNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgaW50IGZpbmRfaTgxMCh1MTYgZGV2aWNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9udmlkaWEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYwppbmRleCBkZjdmMzdiLi4yNTYzMjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYwpAQCAtMzEwLDYgKzMxMCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFncF9udmlkaWFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3BhcmlzYy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCmluZGV4IDE3YzUwYjAuLmI3YjQ1OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCmluZGV4IDkwMjY0OGQuLjkyZDFkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCkBAIC0yNjUsNiArMjY1LDcgQEAKIAkuZnJlZV9ieV90eXBlID0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZSA9IHNnaV90aW9jYV9hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlID0gMSwKIAkubmVlZHNfc2NyYXRjaF9wYWdlID0gMCwKIAkubnVtX2FwZXJ0dXJlX3NpemVzID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMKaW5kZXggYTAwZmQ0OC4uNjAzNDJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMKQEAgLTE0MCw2ICsxNDAsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIHNpc19hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zd29ya3MtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYwppbmRleCA0ZjJkN2Q5Li45ZjVhZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYwpAQCAtNDQ0LDYgKzQ0NCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFncF9zZXJ2ZXJ3b3Jrc19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCmluZGV4IGRmZmMxOTMuLjZjNDU3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYwpAQCAtNTEwLDYgKzUxMCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSAxLAogfTsKIApAQCAtNTM0LDYgKzUzNSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSAxLAogCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSAxLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKaW5kZXggMmRlZDdhMjguLjJlN2MwNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jCkBAIC0xOTEsNiArMTkxLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB2aWFfZHJpdmVyID0gewpAQCAtMjE0LDYgKzIxNSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2RldmljZV9pZHMgdmlhX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKaW5kZXggMWFhOTNhNy4uYWU3NmE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCisrKyBiL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYwpAQCAtMTE3LDcgKzExNyw3IEBACiBfX3NldHVwKCJoY2hlY2tfZHVtcF90YXNrcyIsIGhhbmdjaGVja19wYXJzZV9kdW1wX3Rhc2tzKTsKICNlbmRpZiAvKiBub3QgTU9EVUxFICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX1MzOTApCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKICMgZGVmaW5lIEhBVkVfTU9OT1RPTklDCiAjIGRlZmluZSBUSU1FUl9GUkVRIDEwMDAwMDAwMDBVTEwKICNlbGlmIGRlZmluZWQoQ09ORklHX0lBNjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCmluZGV4IGJlNzNjODAuLjFkOGM0YWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3lzcnEuYworKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtMTU4LDYgKzE1OSwxNyBAQAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TWU5DLAogfTsKIAorc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Nob3dfdGltZXJzKGludCBrZXksIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3lzcnFfdGltZXJfbGlzdF9zaG93KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dfdGltZXJzX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dfdGltZXJzLAorCS5oZWxwX21zZwk9ICJzaG93LWFsbC10aW1lcnMoUSkiLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgUGVuZGluZyBUaW1lcnMiLAorfTsKKwogc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX21vdW50cm8oaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAllbWVyZ2VuY3lfcmVtb3VudCgpOwpAQCAtMzM1LDcgKzM0Nyw3IEBACiAJLyogbzogVGhpcyB3aWxsIG9mdGVuIGJlIHJlZ2lzdGVyZWQgYXMgJ09mZicgYXQgaW5pdCB0aW1lICovCiAJTlVMTCwJCQkJLyogbyAqLwogCSZzeXNycV9zaG93cmVnc19vcCwJCS8qIHAgKi8KLQlOVUxMLAkJCQkvKiBxICovCisJJnN5c3JxX3Nob3dfdGltZXJzX29wLAkJLyogcSAqLwogCSZzeXNycV91bnJhd19vcCwJCS8qIHIgKi8KIAkmc3lzcnFfc3luY19vcCwJCQkvKiBzICovCiAJJnN5c3JxX3Nob3dzdGF0ZV9vcCwJCS8qIHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKaW5kZXggYjZiY2RiYi4uY2NhYTZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKQEAgLTE2LDE1ICsxNiwxMyBAQAogICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0vKiBOdW1iZXIgb2YgUE1UTVIgdGlja3MgZXhwZWN0ZWQgZHVyaW5nIGNhbGlicmF0aW9uIHJ1biAqLwotI2RlZmluZSBQTVRNUl9USUNLU19QRVJfU0VDIDM1Nzk1NDUKLQogLyoKICAqIFRoZSBJL08gcG9ydCB0aGUgUE1UTVIgcmVzaWRlcyBhdC4KICAqIFRoZSBsb2NhdGlvbiBpcyBkZXRlY3RlZCBkdXJpbmcgc2V0dXBfYXJjaCgpLApAQCAtMzIsMTUgKzMwLDEzIEBACiAgKi8KIHUzMiBwbXRtcl9pb3BvcnQgX19yZWFkX21vc3RseTsKIAotI2RlZmluZSBBQ1BJX1BNX01BU0sgQ0xPQ0tTT1VSQ0VfTUFTSygyNCkgLyogbGltaXQgaXQgdG8gMjQgYml0cyAqLwotCiBzdGF0aWMgaW5saW5lIHUzMiByZWFkX3BtdG1yKHZvaWQpCiB7CiAJLyogbWFzayB0aGUgb3V0cHV0IHRvIDI0IGJpdHMgKi8KIAlyZXR1cm4gaW5sKHBtdG1yX2lvcG9ydCkgJiBBQ1BJX1BNX01BU0s7CiB9CiAKLXN0YXRpYyBjeWNsZV90IGFjcGlfcG1fcmVhZF92ZXJpZmllZCh2b2lkKQordTMyIGFjcGlfcG1fcmVhZF92ZXJpZmllZCh2b2lkKQogewogCXUzMiB2MSA9IDAsIHYyID0gMCwgdjMgPSAwOwogCkBAIC01Nyw3ICs1MywxMiBAQAogCX0gd2hpbGUgKHVubGlrZWx5KCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCiAJCQkgIHx8ICh2MyA+IHYxICYmIHYzIDwgdjIpKSk7CiAKLQlyZXR1cm4gKGN5Y2xlX3QpdjI7CisJcmV0dXJuIHYyOworfQorCitzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWRfc2xvdyh2b2lkKQoreworCXJldHVybiAoY3ljbGVfdClhY3BpX3BtX3JlYWRfdmVyaWZpZWQoKTsKIH0KIAogc3RhdGljIGN5Y2xlX3QgYWNwaV9wbV9yZWFkKHZvaWQpCkBAIC03Miw3ICs3Myw4IEBACiAJLm1hc2sJCT0gKGN5Y2xlX3QpQUNQSV9QTV9NQVNLLAogCS5tdWx0CQk9IDAsIC8qdG8gYmUgY2FsdWNsYXRlZCovCiAJLnNoaWZ0CQk9IDIyLAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCisKIH07CiAKIApAQCAtODcsNyArODksNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wbV9uZWVkX3dvcmthcm91bmQodm9pZCkKIHsKLQljbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQgPSBhY3BpX3BtX3JlYWRfdmVyaWZpZWQ7CisJY2xvY2tzb3VyY2VfYWNwaV9wbS5yZWFkID0gYWNwaV9wbV9yZWFkX3Nsb3c7CiAJY2xvY2tzb3VyY2VfYWNwaV9wbS5yYXRpbmcgPSAxMTA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvY3ljbG9uZS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMKaW5kZXggYmY0ZDNkNS4uNGYzOTI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAkubWFzawkJPSBDWUNMT05FX1RJTUVSX01BU0ssCiAJLm11bHQJCT0gMTAsCiAJLnNoaWZ0CQk9IDAsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfY3ljbG9uZV9jbG9ja3NvdXJjZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zY3gyMDBfaHJ0LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYwppbmRleCAyMjkxNWNjLi5iOTJkYTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYwpAQCAtNTcsNyArNTcsNyBAQAogCS5yYXRpbmcJCT0gMjUwLAogCS5yZWFkCQk9IHJlYWRfaHJ0LAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJLyogbXVsdCwgc2hpZnQgYXJlIHNldCBiYXNlZCBvbiBtaHoyNyBmbGFnICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDQ5MTc3OWEuLmQxNTVlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0xNiw3ICsxNiw3IEBACiBpZiBDUFVfRlJFUQogCiBjb25maWcgQ1BVX0ZSRVFfVEFCTEUKLSAgICAgICBkZWZfdHJpc3RhdGUgbQorICAgICAgIHRyaXN0YXRlCiAKIGNvbmZpZyBDUFVfRlJFUV9ERUJVRwogCWJvb2wgIkVuYWJsZSBDUFVmcmVxIGRlYnVnZ2luZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGE0NWNjODkuLmY1MmZhY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNDEsOCArNDEsNjcgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfY3B1X2RhdGFbTlJfQ1BVU107CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwdWZyZXFfZHJpdmVyX2xvY2spOwogCisvKgorICogY3B1X3BvbGljeV9yd3NlbSBpcyBhIHBlciBDUFUgcmVhZGVyLXdyaXRlciBzZW1hcGhvcmUgZGVzaWduZWQgdG8gY3VyZQorICogYWxsIGNwdWZyZXEvaG90cGx1Zy93b3JrcXVldWUvZXRjIHJlbGF0ZWQgbG9jayBpc3N1ZXMuCisgKgorICogVGhlIHJ1bGVzIGZvciB0aGlzIHNlbWFwaG9yZToKKyAqIC0gQW55IHJvdXRpbmUgdGhhdCB3YW50cyB0byByZWFkIGZyb20gdGhlIHBvbGljeSBzdHJ1Y3R1cmUgd2lsbAorICogICBkbyBhIGRvd25fcmVhZCBvbiB0aGlzIHNlbWFwaG9yZS4KKyAqIC0gQW55IHJvdXRpbmUgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBwb2xpY3kgc3RydWN0dXJlIGFuZC9vciBtYXkgdGFrZSBhd2F5CisgKiAgIHRoZSBwb2xpY3kgYWx0b2dldGhlciAoZWcuIENQVSBob3RwbHVnKSwgd2lsbCBob2xkIHRoaXMgbG9jayBpbiB3cml0ZQorICogICBtb2RlIGJlZm9yZSBkb2luZyBzby4KKyAqCisgKiBBZGRpdGlvbmFsIHJ1bGVzOgorICogLSBBbGwgaG9sZGVycyBvZiB0aGUgbG9jayBzaG91bGQgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIENQVSB0aGV5CisgKiAgIGFyZSBjb25jZXJuZWQgd2l0aCBhcmUgb25saW5lIGFmdGVyIHRoZXkgZ2V0IHRoZSBsb2NrLgorICogLSBHb3Zlcm5vciByb3V0aW5lcyB0aGF0IGNhbiBiZSBjYWxsZWQgaW4gY3B1ZnJlcSBob3RwbHVnIHBhdGggc2hvdWxkIG5vdAorICogICB0YWtlIHRoaXMgc2VtIGFzIHRvcCBsZXZlbCBob3RwbHVnIG5vdGlmaWVyIGhhbmRsZXIgdGFrZXMgdGhpcy4KKyAqLworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcG9saWN5X2NwdSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJ3X3NlbWFwaG9yZSwgY3B1X3BvbGljeV9yd3NlbSk7CisKKyNkZWZpbmUgbG9ja19wb2xpY3lfcndzZW0obW9kZSwgY3B1KQkJCQkJXAoraW50IGxvY2tfcG9saWN5X3J3c2VtXyMjbW9kZQkJCQkJCVwKKyhpbnQgY3B1KQkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsJCQlcCisJQlVHX09OKHBvbGljeV9jcHUgPT0gLTEpOwkJCQkJXAorCWRvd25fIyNtb2RlKCZwZXJfY3B1KGNwdV9wb2xpY3lfcndzZW0sIHBvbGljeV9jcHUpKTsJCVwKKwlpZiAodW5saWtlbHkoIWNwdV9vbmxpbmUoY3B1KSkpIHsJCQkJXAorCQl1cF8jI21vZGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOwlcCisJCXJldHVybiAtMTsJCQkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiAwOwkJCQkJCQlcCit9CisKK2xvY2tfcG9saWN5X3J3c2VtKHJlYWQsIGNwdSk7CitFWFBPUlRfU1lNQk9MX0dQTChsb2NrX3BvbGljeV9yd3NlbV9yZWFkKTsKKworbG9ja19wb2xpY3lfcndzZW0od3JpdGUsIGNwdSk7CitFWFBPUlRfU1lNQk9MX0dQTChsb2NrX3BvbGljeV9yd3NlbV93cml0ZSk7CisKK3ZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGludCBjcHUpCit7CisJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSk7CisJQlVHX09OKHBvbGljeV9jcHUgPT0gLTEpOworCXVwX3JlYWQoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKTsKKwordm9pZCB1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGludCBjcHUpCit7CisJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSk7CisJQlVHX09OKHBvbGljeV9jcHUgPT0gLTEpOworCXVwX3dyaXRlKCZwZXJfY3B1KGNwdV9wb2xpY3lfcndzZW0sIHBvbGljeV9jcHUpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUpOworCisKIC8qIGludGVybmFsIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbnQgX19jcHVmcmVxX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCB1bnNpZ25lZCBpbnQgZXZlbnQpOworc3RhdGljIHVuc2lnbmVkIGludCBfX2NwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpOwogc3RhdGljIHZvaWQgaGFuZGxlX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKioKQEAgLTQxNSwxMiArNDc0LDggQEAKIAlpZiAocmV0ICE9IDEpCQkJCQkJCVwKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCQkJCQkJCQkJXAotCWxvY2tfY3B1X2hvdHBsdWcoKTsJCQkJCQlcCi0JbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsJCQkJCVwKIAlyZXQgPSBfX2NwdWZyZXFfc2V0X3BvbGljeShwb2xpY3ksICZuZXdfcG9saWN5KTsJCVwKIAlwb2xpY3ktPnVzZXJfcG9saWN5Lm9iamVjdCA9IHBvbGljeS0+b2JqZWN0OwkJCVwKLQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CQkJCQlcCi0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CQkJCQkJXAogCQkJCQkJCQkJXAogCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsJCQkJCVwKIH0KQEAgLTQzNCw3ICs0ODksNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19jcHVpbmZvX2N1cl9mcmVxIChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKiBwb2xpY3ksCiAJCQkJCQkJY2hhciAqYnVmKQogewotCXVuc2lnbmVkIGludCBjdXJfZnJlcSA9IGNwdWZyZXFfZ2V0KHBvbGljeS0+Y3B1KTsKKwl1bnNpZ25lZCBpbnQgY3VyX2ZyZXEgPSBfX2NwdWZyZXFfZ2V0KHBvbGljeS0+Y3B1KTsKIAlpZiAoIWN1cl9mcmVxKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICI8dW5rbm93bj4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY3VyX2ZyZXEpOwpAQCAtNDc5LDE4ICs1MzQsMTIgQEAKIAkJCQkJCSZuZXdfcG9saWN5LmdvdmVybm9yKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NrX2NwdV9ob3RwbHVnKCk7Ci0KIAkvKiBEbyBub3QgdXNlIGNwdWZyZXFfc2V0X3BvbGljeSBoZXJlIG9yIHRoZSB1c2VyX3BvbGljeS5tYXgKIAkgICB3aWxsIGJlIHdyb25nbHkgb3ZlcnJpZGRlbiAqLwotCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CiAJcmV0ID0gX19jcHVmcmVxX3NldF9wb2xpY3kocG9saWN5LCAmbmV3X3BvbGljeSk7CiAKIAlwb2xpY3ktPnVzZXJfcG9saWN5LnBvbGljeSA9IHBvbGljeS0+cG9saWN5OwogCXBvbGljeS0+dXNlcl9wb2xpY3kuZ292ZXJub3IgPSBwb2xpY3ktPmdvdmVybm9yOwotCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKLQotCXVubG9ja19jcHVfaG90cGx1ZygpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTU5NSwxMSArNjQ0LDE3IEBACiAJcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KHBvbGljeS0+Y3B1KTsKIAlpZiAoIXBvbGljeSkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobG9ja19wb2xpY3lfcndzZW1fcmVhZChwb2xpY3ktPmNwdSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChmYXR0ci0+c2hvdykKIAkJcmV0ID0gZmF0dHItPnNob3cocG9saWN5LCBidWYpOwogCWVsc2UKIAkJcmV0ID0gLUVJTzsKIAorCXVubG9ja19wb2xpY3lfcndzZW1fcmVhZChwb2xpY3ktPmNwdSk7CisKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjEzLDExICs2NjgsMTcgQEAKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChmYXR0ci0+c3RvcmUpCiAJCXJldCA9IGZhdHRyLT5zdG9yZShwb2xpY3ksIGJ1ZiwgY291bnQpOwogCWVsc2UKIAkJcmV0ID0gLUVJTzsKIAorCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUocG9saWN5LT5jcHUpOworCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY5MSw4ICs3NTIsMTAgQEAKIAlwb2xpY3ktPmNwdSA9IGNwdTsKIAlwb2xpY3ktPmNwdXMgPSBjcHVtYXNrX29mX2NwdShjcHUpOwogCi0JbXV0ZXhfaW5pdCgmcG9saWN5LT5sb2NrKTsKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCS8qIEluaXRpYWxseSBzZXQgQ1BVIGl0c2VsZiBhcyB0aGUgcG9saWN5X2NwdSAqLworCXBlcl9jcHUocG9saWN5X2NwdSwgY3B1KSA9IGNwdTsKKwlsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOworCiAJaW5pdF9jb21wbGV0aW9uKCZwb2xpY3ktPmtvYmpfdW5yZWdpc3Rlcik7CiAJSU5JVF9XT1JLKCZwb2xpY3ktPnVwZGF0ZSwgaGFuZGxlX3VwZGF0ZSk7CiAKQEAgLTcwMiw3ICs3NjUsNyBAQAogCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5pbml0KHBvbGljeSk7CiAJaWYgKHJldCkgewogCQlkcHJpbnRrKCJpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwotCQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtNzE2LDYgKzc3OSwxNCBAQAogCQkgKi8KIAkJbWFuYWdlZF9wb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoaik7CiAJCWlmICh1bmxpa2VseShtYW5hZ2VkX3BvbGljeSkpIHsKKworCQkJLyogU2V0IHByb3BlciBwb2xpY3lfY3B1ICovCisJCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CisJCQlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSBtYW5hZ2VkX3BvbGljeS0+Y3B1OworCisJCQlpZiAobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSA8IDApCisJCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OworCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQkJbWFuYWdlZF9wb2xpY3ktPmNwdXMgPSBwb2xpY3ktPmNwdXM7CiAJCQljcHVmcmVxX2NwdV9kYXRhW2NwdV0gPSBtYW5hZ2VkX3BvbGljeTsKQEAgLTcyNiwxMyArNzk3LDEzIEBACiAJCQkJCQkmbWFuYWdlZF9wb2xpY3ktPmtvYmosCiAJCQkJCQkiY3B1ZnJlcSIpOwogCQkJaWYgKHJldCkgewotCQkJCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKwkJCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OwogCQkJfQogCiAJCQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKLQkJCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKIAkJCXJldCA9IDA7CisJCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7IC8qIGNhbGwgZHJpdmVyLT5leGl0KCkgKi8KIAkJfQogCX0KQEAgLTc0Niw3ICs4MTcsNyBAQAogCiAJcmV0ID0ga29iamVjdF9yZWdpc3RlcigmcG9saWN5LT5rb2JqKTsKIAlpZiAocmV0KSB7Ci0JCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CiAJfQogCS8qIHNldCB1cCBmaWxlcyBmb3IgdGhpcyBjcHUgZGV2aWNlICovCkBAIC03NjEsOCArODMyLDEwIEBACiAJCXN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosICZzY2FsaW5nX2N1cl9mcmVxLmF0dHIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQlmb3JfZWFjaF9jcHVfbWFzayhqLCBwb2xpY3ktPmNwdXMpCisJZm9yX2VhY2hfY3B1X21hc2soaiwgcG9saWN5LT5jcHVzKSB7CiAJCWNwdWZyZXFfY3B1X2RhdGFbal0gPSBwb2xpY3k7CisJCXBlcl9jcHUocG9saWN5X2NwdSwgaikgPSBwb2xpY3ktPmNwdTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCiAJLyogc3ltbGluayBhZmZlY3RlZCBDUFVzICovCkBAIC03NzgsMTQgKzg1MSwxNCBAQAogCQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmY3B1X3N5c19kZXYtPmtvYmosICZwb2xpY3ktPmtvYmosCiAJCQkJCSJjcHVmcmVxIik7CiAJCWlmIChyZXQpIHsKLQkJCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKwkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyOwogCQl9CiAJfQogCiAJcG9saWN5LT5nb3Zlcm5vciA9IE5VTEw7IC8qIHRvIGFzc3VyZSB0aGF0IHRoZSBzdGFydGluZyBzZXF1ZW5jZSBpcwogCQkJCSAgKiBydW4gaW4gY3B1ZnJlcV9zZXRfcG9saWN5ICovCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAogCS8qIHNldCBkZWZhdWx0IHBvbGljeSAqLwogCXJldCA9IGNwdWZyZXFfc2V0X3BvbGljeSgmbmV3X3BvbGljeSk7CkBAIC04MjYsMTEgKzg5OSwxMyBAQAogCiAKIC8qKgotICogY3B1ZnJlcV9yZW1vdmVfZGV2IC0gcmVtb3ZlIGEgQ1BVIGRldmljZQorICogX19jcHVmcmVxX3JlbW92ZV9kZXYgLSByZW1vdmUgYSBDUFUgZGV2aWNlCiAgKgogICogUmVtb3ZlcyB0aGUgY3B1ZnJlcSBpbnRlcmZhY2UgZm9yIGEgQ1BVIGRldmljZS4KKyAqIENhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIHBvbGljeV9yd3NlbSBpbiB3cml0ZSBtb2RlIGZvciB0aGlzIENQVS4KKyAqIFRoaXMgcm91dGluZSBmcmVlcyB0aGUgcndzZW0gYmVmb3JlIHJldHVybmluZy4KICAqLwotc3RhdGljIGludCBjcHVmcmVxX3JlbW92ZV9kZXYgKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3N0YXRpYyBpbnQgX19jcHVmcmVxX3JlbW92ZV9kZXYgKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTg0OSw2ICs5MjQsNyBAQAogCWlmICghZGF0YSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAljcHVmcmVxX2NwdV9kYXRhW2NwdV0gPSBOVUxMOwpAQCAtODY1LDYgKzk0MSw3IEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZzeXNfZGV2LT5rb2JqLCAiY3B1ZnJlcSIpOwogCQljcHVmcmVxX2NwdV9wdXQoZGF0YSk7CiAJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCXJldHVybiAwOwogCX0KICNlbmRpZgpAQCAtODczLDYgKzk1MCw3IEBACiAJaWYgKCFrb2JqZWN0X2dldCgmZGF0YS0+a29iaikpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTkwNiwxMCArOTg0LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogI2VuZGlmCiAKLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAlpZiAoY3B1ZnJlcV9kcml2ZXItPnRhcmdldCkKIAkJX19jcHVmcmVxX2dvdmVybm9yKGRhdGEsIENQVUZSRVFfR09WX1NUT1ApOwotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJmRhdGEtPmtvYmopOwogCkBAIC05MzMsNiArMTAxMSwxOCBAQAogfQogCiAKK3N0YXRpYyBpbnQgY3B1ZnJlcV9yZW1vdmVfZGV2IChzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHN5c19kZXYtPmlkOworCWludCByZXR2YWw7CisJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkpKQorCQlCVUcoKTsKKworCXJldHZhbCA9IF9fY3B1ZnJlcV9yZW1vdmVfZGV2KHN5c19kZXYpOworCXJldHVybiByZXR2YWw7Cit9CisKKwogc3RhdGljIHZvaWQgaGFuZGxlX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPQpAQCAtOTgwLDkgKzEwNzAsMTIgQEAKIAl1bnNpZ25lZCBpbnQgcmV0X2ZyZXEgPSAwOwogCiAJaWYgKHBvbGljeSkgewotCQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCQlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fcmVhZChjcHUpKSkKKwkJCXJldHVybiByZXRfZnJlcTsKKwogCQlyZXRfZnJlcSA9IHBvbGljeS0+Y3VyOwotCQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGNwdSk7CiAJCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCX0KIApAQCAtOTkxLDI0ICsxMDg0LDEzIEBACiBFWFBPUlRfU1lNQk9MKGNwdWZyZXFfcXVpY2tfZ2V0KTsKIAogCi0vKioKLSAqIGNwdWZyZXFfZ2V0IC0gZ2V0IHRoZSBjdXJyZW50IENQVSBmcmVxdWVuY3kgKGluIGtIeikKLSAqIEBjcHU6IENQVSBudW1iZXIKLSAqCi0gKiBHZXQgdGhlIENQVSBjdXJyZW50IChzdGF0aWMpIENQVSBmcmVxdWVuY3kKLSAqLwotdW5zaWduZWQgaW50IGNwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKIHsKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZGF0YVtjcHVdOwogCXVuc2lnbmVkIGludCByZXRfZnJlcSA9IDA7CiAKLQlpZiAoIXBvbGljeSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIWNwdWZyZXFfZHJpdmVyLT5nZXQpCi0JCWdvdG8gb3V0OwotCi0JbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKKwkJcmV0dXJuIChyZXRfZnJlcSk7CiAKIAlyZXRfZnJlcSA9IGNwdWZyZXFfZHJpdmVyLT5nZXQoY3B1KTsKIApAQCAtMTAyMiwxMSArMTEwNCwzMyBAQAogCQl9CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCXJldHVybiAocmV0X2ZyZXEpOworfQogCi1vdXQ6CisvKioKKyAqIGNwdWZyZXFfZ2V0IC0gZ2V0IHRoZSBjdXJyZW50IENQVSBmcmVxdWVuY3kgKGluIGtIeikKKyAqIEBjcHU6IENQVSBudW1iZXIKKyAqCisgKiBHZXQgdGhlIENQVSBjdXJyZW50IChzdGF0aWMpIENQVSBmcmVxdWVuY3kKKyAqLwordW5zaWduZWQgaW50IGNwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgaW50IHJldF9mcmVxID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOworCisJaWYgKCFwb2xpY3kpCisJCWdvdG8gb3V0OworCisJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3JlYWQoY3B1KSkpCisJCWdvdG8gb3V0X3BvbGljeTsKKworCXJldF9mcmVxID0gX19jcHVmcmVxX2dldChjcHUpOworCisJdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGNwdSk7CisKK291dF9wb2xpY3k6CiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7Ci0KK291dDoKIAlyZXR1cm4gKHJldF9mcmVxKTsKIH0KIEVYUE9SVF9TWU1CT0woY3B1ZnJlcV9nZXQpOwpAQCAtMTI3OCw3ICsxMzgyLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrX2NwdV9ob3RwbHVnIGhlbGQgKi8KIGludCBfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQpAQCAtMTMwNCwyMCArMTQwNywxOSBAQAogCWlmICghcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldCA9IF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uKTsKIAotCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKHBvbGljeS0+Y3B1KTsKIAogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX2RyaXZlcl90YXJnZXQpOwogCi1pbnQgY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoraW50IF9fY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCWludCByZXQgPSAwOwogCkBAIC0xMzI1LDIwICsxNDI3LDE1IEBACiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKLQogCWlmIChjcHVfb25saW5lKHBvbGljeS0+Y3B1KSAmJiBjcHVmcmVxX2RyaXZlci0+Z2V0YXZnKQogCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+Z2V0YXZnKHBvbGljeS0+Y3B1KTsKIAotCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKLQogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX2RyaXZlcl9nZXRhdmcpOworRVhQT1JUX1NZTUJPTF9HUEwoX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcpOwogCiAvKgotICogTG9ja2luZzogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9ja19jcHVfaG90cGx1ZygpIGxvY2sgaGVsZAogICogd2hlbiAiZXZlbnQiIGlzIENQVUZSRVFfR09WX0xJTUlUUwogICovCiAKQEAgLTE0MjAsOSArMTUxNyw3IEBACiAJaWYgKCFjcHVfcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJmNwdV9wb2xpY3ktPmxvY2spOwogCW1lbWNweShwb2xpY3ksIGNwdV9wb2xpY3ksIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kpKTsKLQltdXRleF91bmxvY2soJmNwdV9wb2xpY3ktPmxvY2spOwogCiAJY3B1ZnJlcV9jcHVfcHV0KGNwdV9wb2xpY3kpOwogCXJldHVybiAwOwpAQCAtMTQzMyw3ICsxNTI4LDYgQEAKIC8qCiAgKiBkYXRhICAgOiBjdXJyZW50IHBvbGljeS4KICAqIHBvbGljeSA6IHBvbGljeSB0byBiZSBzZXQuCi0gKiBMb2NraW5nOiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrX2NwdV9ob3RwbHVnKCkgbG9jayBoZWxkCiAgKi8KIHN0YXRpYyBpbnQgX19jcHVmcmVxX3NldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpkYXRhLAogCQkJCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQpAQCAtMTUzOSwxMCArMTYzMyw5IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2tfY3B1X2hvdHBsdWcoKTsKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fd3JpdGUocG9saWN5LT5jcHUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBsb2NrIHRoaXMgQ1BVICovCi0JbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXQgPSBfX2NwdWZyZXFfc2V0X3BvbGljeShkYXRhLCBwb2xpY3kpOwogCWRhdGEtPnVzZXJfcG9saWN5Lm1pbiA9IGRhdGEtPm1pbjsKQEAgLTE1NTAsOSArMTY0Myw4IEBACiAJZGF0YS0+dXNlcl9wb2xpY3kucG9saWN5ID0gZGF0YS0+cG9saWN5OwogCWRhdGEtPnVzZXJfcG9saWN5LmdvdmVybm9yID0gZGF0YS0+Z292ZXJub3I7CiAKLQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUocG9saWN5LT5jcHUpOwogCi0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAJY3B1ZnJlcV9jcHVfcHV0KGRhdGEpOwogCiAJcmV0dXJuIHJldDsKQEAgLTE1NzYsOCArMTY2OCw4IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZHByaW50aygidXBkYXRpbmcgcG9saWN5IGZvciBDUFUgJXVcbiIsIGNwdSk7CiAJbWVtY3B5KCZwb2xpY3ksIGRhdGEsIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kpKTsKQEAgLTE2MDIsOCArMTY5NCw4IEBACiAKIAlyZXQgPSBfX2NwdWZyZXFfc2V0X3BvbGljeShkYXRhLCAmcG9saWN5KTsKIAotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOworCiAJY3B1ZnJlcV9jcHVfcHV0KGRhdGEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNjEzLDMxICsxNzA1LDI4IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewogCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwogCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2OworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwogCiAJc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7Ci0KIAlpZiAoc3lzX2RldikgewogCQlzd2l0Y2ggKGFjdGlvbikgewogCQljYXNlIENQVV9PTkxJTkU6CiAJCQljcHVmcmVxX2FkZF9kZXYoc3lzX2Rldik7CiAJCQlicmVhazsKIAkJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQkJLyoKLQkJCSAqIFdlIGF0dGVtcHQgdG8gcHV0IHRoaXMgY3B1IGluIGxvd2VzdCBmcmVxdWVuY3kKLQkJCSAqIHBvc3NpYmxlIGJlZm9yZSBnb2luZyBkb3duLiBUaGlzIHdpbGwgcGVybWl0Ci0JCQkgKiBoYXJkd2FyZS1tYW5hZ2VkIFAtU3RhdGUgdG8gc3dpdGNoIG90aGVyIHJlbGF0ZWQKLQkJCSAqIHRocmVhZHMgdG8gbWluIG9yIGhpZ2hlciBzcGVlZHMgaWYgcG9zc2libGUuCi0JCQkgKi8KKwkJCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpKSkKKwkJCQlCVUcoKTsKKwogCQkJcG9saWN5ID0gY3B1ZnJlcV9jcHVfZGF0YVtjcHVdOwogCQkJaWYgKHBvbGljeSkgewotCQkJCWNwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIHBvbGljeS0+bWluLAorCQkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5taW4sCiAJCQkJCQlDUFVGUkVRX1JFTEFUSU9OX0gpOwogCQkJfQorCQkJX19jcHVmcmVxX3JlbW92ZV9kZXYoc3lzX2Rldik7CiAJCQlicmVhazsKLQkJY2FzZSBDUFVfREVBRDoKLQkJCWNwdWZyZXFfcmVtb3ZlX2RldihzeXNfZGV2KTsKKwkJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJCQljcHVmcmVxX2FkZF9kZXYoc3lzX2Rldik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE3NTEsMyArMTg0MCwxNiBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfY29yZV9pbml0KHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpID0gLTE7CisJCWluaXRfcndzZW0oJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgY3B1KSk7CisJfQorCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKGNwdWZyZXFfY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKaW5kZXggMDVkNmMyMi4uMjZmNDQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKQEAgLTQyOSwxNCArNDI5LDEyIEBACiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeyAKIAlpbnQgaTsKLQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCiAJCWRic19jaGVja19jcHUoaSk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkYnNfd29yaywgCiAJCQl1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpKTsKIAltdXRleF91bmxvY2soJmRic19tdXRleCk7Ci0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiB9IAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCmluZGV4IGY2OTc0NDkuLmQ2MGJjYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwpAQCAtNTIsMTkgKzUyLDIwIEBACiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogU2FtcGxpbmcgdHlwZXMgKi8KLWVudW0gZGJzX3NhbXBsZSB7REJTX05PUk1BTF9TQU1QTEUsIERCU19TVUJfU0FNUExFfTsKK2VudW0ge0RCU19OT1JNQUxfU0FNUExFLCBEQlNfU1VCX1NBTVBMRX07CiAKIHN0cnVjdCBjcHVfZGJzX2luZm9fcyB7CiAJY3B1dGltZTY0X3QgcHJldl9jcHVfaWRsZTsKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV93YWxsOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3VyX3BvbGljeTsKICAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwotCWVudW0gZGJzX3NhbXBsZSBzYW1wbGVfdHlwZTsKLQl1bnNpZ25lZCBpbnQgZW5hYmxlOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKIAl1bnNpZ25lZCBpbnQgZnJlcV9sbzsKIAl1bnNpZ25lZCBpbnQgZnJlcV9sb19qaWZmaWVzOwogCXVuc2lnbmVkIGludCBmcmVxX2hpX2ppZmZpZXM7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOjEsCisJICAgICAgICAgICAgIHNhbXBsZV90eXBlOjE7CiB9Owogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfZGJzX2luZm9fcywgY3B1X2Ric19pbmZvKTsKIApAQCAtNDAyLDcgKzQwMyw3IEBACiAJaWYgKGxvYWQgPCAoZGJzX3R1bmVyc19pbnMudXBfdGhyZXNob2xkIC0gMTApKSB7CiAJCXVuc2lnbmVkIGludCBmcmVxX25leHQsIGZyZXFfY3VyOwogCi0JCWZyZXFfY3VyID0gY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHBvbGljeSk7CisJCWZyZXFfY3VyID0gX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcocG9saWN5KTsKIAkJaWYgKCFmcmVxX2N1cikKIAkJCWZyZXFfY3VyID0gcG9saWN5LT5jdXI7CiAKQEAgLTQyMyw5ICs0MjQsMTEgQEAKIAogc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGNwdSk7Ci0JZW51bSBkYnNfc2FtcGxlIHNhbXBsZV90eXBlID0gZGJzX2luZm8tPnNhbXBsZV90eXBlOworCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwdV9kYnNfaW5mb19zLCB3b3JrLndvcmspOworCXVuc2lnbmVkIGludCBjcHUgPSBkYnNfaW5mby0+Y3B1OworCWludCBzYW1wbGVfdHlwZSA9IGRic19pbmZvLT5zYW1wbGVfdHlwZTsKKwogCS8qIFdlIHdhbnQgYWxsIENQVXMgdG8gZG8gc2FtcGxpbmcgbmVhcmx5IG9uIHNhbWUgamlmZnkgKi8KIAlpbnQgZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpOwogCkBAIC00MzQsMTUgKzQzNywxOSBAQAogCiAJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OwogCi0JaWYgKCFkYnNfaW5mby0+ZW5hYmxlKQorCWlmIChsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpIDwgMCkKIAkJcmV0dXJuOworCisJaWYgKCFkYnNfaW5mby0+ZW5hYmxlKSB7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKKwkJcmV0dXJuOworCX0KKwogCS8qIENvbW1vbiBOT1JNQUxfU0FNUExFIHNldHVwICovCiAJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX05PUk1BTF9TQU1QTEU7CiAJaWYgKCFkYnNfdHVuZXJzX2lucy5wb3dlcnNhdmVfYmlhcyB8fAogCSAgICBzYW1wbGVfdHlwZSA9PSBEQlNfTk9STUFMX1NBTVBMRSkgewotCQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJCWRic19jaGVja19jcHUoZGJzX2luZm8pOwotCQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJaWYgKGRic19pbmZvLT5mcmVxX2xvKSB7CiAJCQkvKiBTZXR1cCB0aW1lciBmb3IgU1VCX1NBTVBMRSAqLwogCQkJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX1NVQl9TQU1QTEU7CkBAIC00NTQsMjYgKzQ2MSwyNyBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgIAlDUFVGUkVRX1JFTEFUSU9OX0gpOwogCX0KIAlxdWV1ZV9kZWxheWVkX3dvcmtfb24oY3B1LCBrb25kZW1hbmRfd3EsICZkYnNfaW5mby0+d29yaywgZGVsYXkpOworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRic190aW1lcl9pbml0KHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQoc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbykKIHsKLQlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmRic19pbmZvID0gJnBlcl9jcHUoY3B1X2Ric19pbmZvLCBjcHUpOwogCS8qIFdlIHdhbnQgYWxsIENQVXMgdG8gZG8gc2FtcGxpbmcgbmVhcmx5IG9uIHNhbWUgamlmZnkgKi8KIAlpbnQgZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpOwogCWRlbGF5IC09IGppZmZpZXMgJSBkZWxheTsKIAorCWRic19pbmZvLT5lbmFibGUgPSAxOwogCW9uZGVtYW5kX3Bvd2Vyc2F2ZV9iaWFzX2luaXQoKTsKLQlJTklUX0RFTEFZRURfV09SS19OQVIoJmRic19pbmZvLT53b3JrLCBkb19kYnNfdGltZXIpOwogCWRic19pbmZvLT5zYW1wbGVfdHlwZSA9IERCU19OT1JNQUxfU0FNUExFOwotCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihjcHUsIGtvbmRlbWFuZF93cSwgJmRic19pbmZvLT53b3JrLCBkZWxheSk7CisJSU5JVF9ERUxBWUVEX1dPUktfTkFSKCZkYnNfaW5mby0+d29yaywgZG9fZGJzX3RpbWVyKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmtfb24oZGJzX2luZm8tPmNwdSwga29uZGVtYW5kX3dxLCAmZGJzX2luZm8tPndvcmssCisJICAgICAgICAgICAgICAgICAgICAgIGRlbGF5KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRic190aW1lcl9leGl0KHN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8pCiB7CiAJZGJzX2luZm8tPmVuYWJsZSA9IDA7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmZGJzX2luZm8tPndvcmspOwotCWZsdXNoX3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwogfQogCiBzdGF0aWMgaW50IGNwdWZyZXFfZ292ZXJub3JfZGJzKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LApAQCAtNTAyLDIxICs1MTAsOSBAQAogCiAJCW11dGV4X2xvY2soJmRic19tdXRleCk7CiAJCWRic19lbmFibGUrKzsKLQkJaWYgKGRic19lbmFibGUgPT0gMSkgewotCQkJa29uZGVtYW5kX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgia29uZGVtYW5kIik7Ci0JCQlpZiAoIWtvbmRlbWFuZF93cSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgIkNyZWF0aW9uIG9mIGtvbmRlbWFuZCBmYWlsZWRcbiIpOwotCQkJCWRic19lbmFibGUtLTsKLQkJCQltdXRleF91bmxvY2soJmRic19tdXRleCk7Ci0JCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCQl9Ci0JCX0KIAogCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOwogCQlpZiAocmMpIHsKLQkJCWlmIChkYnNfZW5hYmxlID09IDEpCi0JCQkJZGVzdHJveV93b3JrcXVldWUoa29uZGVtYW5kX3dxKTsKIAkJCWRic19lbmFibGUtLTsKIAkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJCXJldHVybiByYzsKQEAgLTUzMCw3ICs1MjYsNyBAQAogCQkJal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGopOwogCQkJal9kYnNfaW5mby0+cHJldl9jcHVfd2FsbCA9IGdldF9qaWZmaWVzXzY0KCk7CiAJCX0KLQkJdGhpc19kYnNfaW5mby0+ZW5hYmxlID0gMTsKKwkJdGhpc19kYnNfaW5mby0+Y3B1ID0gY3B1OwogCQkvKgogCQkgKiBTdGFydCB0aGUgdGltZXJzY2hlZHVsZSB3b3JrLCB3aGVuIHRoaXMgZ292ZXJub3IKIAkJICogaXMgdXNlZCBmb3IgZmlyc3QgdGltZQpAQCAtNTUwLDcgKzU0Niw3IEBACiAKIAkJCWRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUgPSBkZWZfc2FtcGxpbmdfcmF0ZTsKIAkJfQotCQlkYnNfdGltZXJfaW5pdChwb2xpY3ktPmNwdSk7CisJCWRic190aW1lcl9pbml0KHRoaXNfZGJzX2luZm8pOwogCiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJYnJlYWs7CkBAIC01NjAsOSArNTU2LDYgQEAKIAkJZGJzX3RpbWVyX2V4aXQodGhpc19kYnNfaW5mbyk7CiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOwogCQlkYnNfZW5hYmxlLS07Ci0JCWlmIChkYnNfZW5hYmxlID09IDApCi0JCQlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwotCiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAogCQlicmVhazsKQEAgLTU5MSwxMiArNTg0LDE4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZ292X2Ric19pbml0KHZvaWQpCiB7CisJa29uZGVtYW5kX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgia29uZGVtYW5kIik7CisJaWYgKCFrb25kZW1hbmRfd3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDcmVhdGlvbiBvZiBrb25kZW1hbmQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKCZjcHVmcmVxX2dvdl9kYnMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3B1ZnJlcV9nb3ZfZGJzX2V4aXQodm9pZCkKIHsKIAljcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X2Ricyk7CisJZGVzdHJveV93b3JrcXVldWUoa29uZGVtYW5kX3dxKTsKIH0KIAogCkBAIC02MDgsMyArNjA3LDQgQEAKIAogbW9kdWxlX2luaXQoY3B1ZnJlcV9nb3ZfZGJzX2luaXQpOwogbW9kdWxlX2V4aXQoY3B1ZnJlcV9nb3ZfZGJzX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwppbmRleCA5MWFkMzQyLi5kMWM3Y2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKQEAgLTM3MCwxMiArMzcwLDEwIEBACiAJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZub3RpZmllcl90cmFuc19ibG9jaywKIAkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiAJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIpOwotCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQljcHVmcmVxX3N0YXRfY3B1X2NhbGxiYWNrKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyLAogCQkJCQkJQ1BVX0RFQUQsICh2b2lkICopKGxvbmcpY3B1KTsKIAl9Ci0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiB9CiAKIE1PRFVMRV9BVVRIT1IgKCJab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV91c2Vyc3BhY2UuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCmluZGV4IDJhNGViMGIuLjg2MDM0NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jCkBAIC03MSw3ICs3MSw2IEBACiAKIAlkcHJpbnRrKCJjcHVmcmVxX3NldCBmb3IgY3B1ICV1LCBmcmVxICV1IGtIelxuIiwgcG9saWN5LT5jcHUsIGZyZXEpOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOwogCW11dGV4X2xvY2soJnVzZXJzcGFjZV9tdXRleCk7CiAJaWYgKCFjcHVfaXNfbWFuYWdlZFtwb2xpY3ktPmNwdV0pCiAJCWdvdG8gZXJyOwpAQCAtOTQsNyArOTMsNiBAQAogCiAgZXJyOgogCW11dGV4X3VubG9jaygmdXNlcnNwYWNlX211dGV4KTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGNkMjUxZWYuLjBhMjZlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIAkJCXRzLT5zcGktPmRldi5idXNfaWQsIHRzLT50Yy5pZ25vcmUsIFJ0KTsKICNlbmRpZgogCQlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCi0JCQkgICAgICBIUlRJTUVSX1JFTCk7CisJCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTc4LDcgKzU3OCw4IEBACiAjZW5kaWYKIAl9CiAKLQlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksIEhSVElNRVJfUkVMKTsKKwlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCisJCQlIUlRJTUVSX01PREVfUkVMKTsKIH0KIAogc3RhdGljIGludCBhZHM3ODQ2X2RlYm91bmNlKHZvaWQgKmFkcywgaW50IGRhdGFfaWR4LCBpbnQgKnZhbCkKQEAgLTY2Nyw3ICs2NjgsNyBAQAogCQkJCXN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgYWRzNzg0Nl90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaGFuZGxlKQorc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFkczc4NDZfdGltZXIoc3RydWN0IGhydGltZXIgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgYWRzNzg0NgkqdHMgPSBjb250YWluZXJfb2YoaGFuZGxlLCBzdHJ1Y3QgYWRzNzg0NiwgdGltZXIpOwogCWludAkJc3RhdHVzID0gMDsKQEAgLTcyNCw3ICs3MjUsNyBAQAogCQkJZGlzYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKIAkJCXRzLT5wZW5kaW5nID0gMTsKIAkJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfREVMQVkpLAotCQkJCQlIUlRJTUVSX1JFTCk7CisJCQkJCUhSVElNRVJfTU9ERV9SRUwpOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7CkBAIC04NjIsNyArODYzLDcgQEAKIAl0cy0+c3BpID0gc3BpOwogCXRzLT5pbnB1dCA9IGlucHV0X2RldjsKIAotCWhydGltZXJfaW5pdCgmdHMtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfUkVMKTsKKwlocnRpbWVyX2luaXQoJnRzLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAl0cy0+dGltZXIuZnVuY3Rpb24gPSBhZHM3ODQ2X3RpbWVyOwogCiAJc3Bpbl9sb2NrX2luaXQoJnRzLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L01ha2VmaWxlIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvTWFrZWZpbGUKaW5kZXggODM1YjgwNi4uMDc3ZTI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiAKIG9iai0kKENPTkZJR19HSUdBU0VUX00xMDUpICs9IHVzYl9naWdhc2V0Lm8gZ2lnYXNldC5vCiBvYmotJChDT05GSUdfR0lHQVNFVF9CQVNFKSArPSBiYXNfZ2lnYXNldC5vIGdpZ2FzZXQubwotb2JqLSQoQ09ORklHX0dJR0FTRVRfTTEwNSkgKz0gc2VyX2dpZ2FzZXQubyBnaWdhc2V0Lm8KK29iai0kKENPTkZJR19HSUdBU0VUX00xMDEpICs9IHNlcl9naWdhc2V0Lm8gZ2lnYXNldC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwppbmRleCBjY2VmNTZkLi5lZDM0MjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKQEAgLTc5MSw2ICs3OTEsOCBAQAogCiAJaW5mbyA9IGZiaW5mby0+cGFyOwogCWluZm8tPmZiID0gZmJpbmZvOworCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmYmluZm8pOwogCiAJZHByaW50aygiZGV2aW5pdFxuIik7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IGIzNjA5YjcuLjQwM2UzYmEgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC00NjcsNiArNDY3LDcgQEAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzI7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX3hhdHRyX2NhY2hlOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICplY3J5cHRmc19sb3dlcl9wYWdlX2NhY2hlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICplY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlOwogCiBpbnQgZWNyeXB0ZnNfaW50ZXJwb3NlKHN0cnVjdCBkZW50cnkgKmhpZGRlbl9kZW50cnksCiAJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICp0aGlzX2RlbnRyeSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IDgxMTU2ZTkuLmI1NTBkZWEgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtMTYzOCw2ICsxNjM4LDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0cnVjdCBrbWVtX2NhY2hlICplY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlOworCiAvKioKICAqIGVjcnlwdGZzX2dlbmVyYXRlX2tleV9wYWNrZXRfc2V0CiAgKiBAZGVzdDogVmlydHVhbCBhZGRyZXNzIGZyb20gd2hpY2ggdG8gd3JpdGUgdGhlIGtleSByZWNvcmQgc2V0CkBAIC0xNjY0LDUwICsxNjY2LDU1IEBACiAJCSZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCiAJCQllY3J5cHRmc19kZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OwogCXNpemVfdCB3cml0dGVuOwotCXN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkIGtleV9yZWM7CisJc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQgKmtleV9yZWM7CiAJaW50IHJjID0gMDsKIAogCSgqbGVuKSA9IDA7CisJa2V5X3JlYyA9IGttZW1fY2FjaGVfYWxsb2MoZWNyeXB0ZnNfa2V5X3JlY29yZF9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXlfcmVjKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCWlmIChtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2spIHsKIAkJYXV0aF90b2sgPSBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2s7CiAJCWlmIChhdXRoX3Rvay0+dG9rZW5fdHlwZSA9PSBFQ1JZUFRGU19QQVNTV09SRCkgewogCQkJcmMgPSB3cml0ZV90YWdfM19wYWNrZXQoKGRlc3RfYmFzZSArICgqbGVuKSksCiAJCQkJCQltYXgsIGF1dGhfdG9rLAotCQkJCQkJY3J5cHRfc3RhdCwgJmtleV9yZWMsCisJCQkJCQljcnlwdF9zdGF0LCBrZXlfcmVjLAogCQkJCQkJJndyaXR0ZW4pOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yICIKIAkJCQkJCSJ3cml0aW5nIHRhZyAzIHBhY2tldFxuIik7Ci0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KIAkJCSgqbGVuKSArPSB3cml0dGVuOwogCQkJLyogV3JpdGUgYXV0aCB0b2sgc2lnbmF0dXJlIHBhY2tldCAqLwogCQkJcmMgPSB3cml0ZV90YWdfMTFfcGFja2V0KAogCQkJCShkZXN0X2Jhc2UgKyAoKmxlbikpLAogCQkJCShtYXggLSAoKmxlbikpLAotCQkJCWtleV9yZWMuc2lnLCBFQ1JZUFRGU19TSUdfU0laRSwgJndyaXR0ZW4pOworCQkJCWtleV9yZWMtPnNpZywgRUNSWVBURlNfU0lHX1NJWkUsICZ3cml0dGVuKTsKIAkJCWlmIChyYykgewogCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIHdyaXRpbmcgIgogCQkJCQkJImF1dGggdG9rIHNpZ25hdHVyZSBwYWNrZXRcbiIpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIGlmIChhdXRoX3Rvay0+dG9rZW5fdHlwZSA9PSBFQ1JZUFRGU19QUklWQVRFX0tFWSkgewogCQkJcmMgPSB3cml0ZV90YWdfMV9wYWNrZXQoZGVzdF9iYXNlICsgKCpsZW4pLAogCQkJCQkJbWF4LCBhdXRoX3RvaywKIAkJCQkJCWNyeXB0X3N0YXQsbW91bnRfY3J5cHRfc3RhdCwKLQkJCQkJCSZrZXlfcmVjLCAmd3JpdHRlbik7CisJCQkJCQlrZXlfcmVjLCAmd3JpdHRlbik7CiAJCQlpZiAocmMpIHsKIAkJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRXJyb3IgIgogCQkJCQkJIndyaXRpbmcgdGFnIDEgcGFja2V0XG4iKTsKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQogCQkJKCpsZW4pICs9IHdyaXR0ZW47CiAJCX0gZWxzZSB7CiAJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgIgogCQkJCQkiYXV0aGVudGljYXRpb24gdG9rZW4gdHlwZVxuIik7CiAJCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAl9IGVsc2UKIAkJQlVHKCk7CkBAIC0xNzE3LDYgKzE3MjQsOSBAQAogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciB3cml0aW5nIGJvdW5kYXJ5IGJ5dGVcbiIpOwogCQlyYyA9IC1FSU87CiAJfQorCitvdXRfZnJlZToKKwlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfa2V5X3JlY29yZF9jYWNoZSwga2V5X3JlYyk7CiBvdXQ6CiAJaWYgKHJjKQogCQkoKmxlbikgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWFpbi5jIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCmluZGV4IDI2ZmU0MDUuLjgwMDQ0ZDEgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTY1MSw2ICs2NTEsMTEgQEAKIAkJLm5hbWUgPSAiZWNyeXB0ZnNfbG93ZXJfcGFnZV9jYWNoZSIsCiAJCS5zaXplID0gUEFHRV9DQUNIRV9TSVpFLAogCX0sCisJeworCQkuY2FjaGUgPSAmZWNyeXB0ZnNfa2V5X3JlY29yZF9jYWNoZSwKKwkJLm5hbWUgPSAiZWNyeXB0ZnNfa2V5X3JlY29yZF9jYWNoZSIsCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkKSwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgZWNyeXB0ZnNfZnJlZV9rbWVtX2NhY2hlcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwppbmRleCA0N2Q3ZTdiLi4zYmFmMjUzIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYworKysgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwpAQCAtMTY5LDcgKzE2OSw4IEBACiAJaWYgKCFuZXdfaWQpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5OyB1bmFibGUgIgotCQkJCSJ0byByZWdpc3RlciBkYWVtb24gWyVkXSBmb3IgdXNlclxuIiwgcGlkLCB1aWQpOworCQkJCSJ0byByZWdpc3RlciBkYWVtb24gWyVkXSBmb3IgdXNlciBbJWRdXG4iLAorCQkJCXBpZCwgdWlkKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCWlmICghZWNyeXB0ZnNfZmluZF9kYWVtb25faWQodWlkLCAmb2xkX2lkKSkgewpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggMTYxZTIyMi4uZWU2MGNjNCAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC0yNjg4LDEwICsyNjg4LDExIEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBlcnIgPSAtRU5PTUVNOworCWludCBlcnI7CiAJY2hhciAqa2FkZHI7CiAKIHJldHJ5OgorCWVyciA9IC1FTk9NRU07CiAJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgMCwgZ2ZwX21hc2spOwogCWlmICghcGFnZSkKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCA1ZDk0NTU1Li44MzI2NzNiIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtNjEsOSArNjEsMTEgQEAKIAogLyogZmxhZ3MgdXNlZCB0byBzaW11bGF0ZSBwb3NpeCBkZWZhdWx0IEFDTHMgKi8KICNkZWZpbmUgTkZTNF9JTkhFUklUQU5DRV9GTEFHUyAoTkZTNF9BQ0VfRklMRV9JTkhFUklUX0FDRSBcCi0JCXwgTkZTNF9BQ0VfRElSRUNUT1JZX0lOSEVSSVRfQUNFIHwgTkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRSkKKwkJfCBORlM0X0FDRV9ESVJFQ1RPUllfSU5IRVJJVF9BQ0UpCiAKLSNkZWZpbmUgTkZTNF9TVVBQT1JURURfRkxBR1MgKE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQorI2RlZmluZSBORlM0X1NVUFBPUlRFRF9GTEFHUyAoTkZTNF9JTkhFUklUQU5DRV9GTEFHUyBcCisJCXwgTkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRSBcCisJCXwgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKIAogI2RlZmluZSBNQVNLX0VRVUFMKG1hc2sxLCBtYXNrMikgXAogCSggKChtYXNrMSkgJiBORlM0X0FDRV9NQVNLX0FMTCkgPT0gKChtYXNrMikgJiBORlM0X0FDRV9NQVNLX0FMTCkgKQpAQCAtODcsMTIgKzg5LDE5IEBACiB9CiAKIHN0YXRpYyB1MzIKLWRlbnlfbWFzayh1MzIgYWxsb3dfbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQorZGVueV9tYXNrX2Zyb21fcG9zaXgodW5zaWduZWQgc2hvcnQgcGVybSwgdTMyIGZsYWdzKQogewotCXUzMiByZXQgPSB+YWxsb3dfbWFzayAmIH5ORlM0X01BU0tfVU5TVVBQOwotCWlmICghKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKLQkJcmV0ICY9IH5ORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7Ci0JcmV0dXJuIHJldDsKKwl1MzIgbWFzayA9IDA7CisKKwlpZiAocGVybSAmIEFDTF9SRUFEKQorCQltYXNrIHw9IE5GUzRfUkVBRF9NT0RFOworCWlmIChwZXJtICYgQUNMX1dSSVRFKQorCQltYXNrIHw9IE5GUzRfV1JJVEVfTU9ERTsKKwlpZiAoKHBlcm0gJiBBQ0xfV1JJVEUpICYmIChmbGFncyAmIE5GUzRfQUNMX0RJUikpCisJCW1hc2sgfD0gTkZTNF9BQ0VfREVMRVRFX0NISUxEOworCWlmIChwZXJtICYgQUNMX0VYRUNVVEUpCisJCW1hc2sgfD0gTkZTNF9FWEVDVVRFX01PREU7CisJcmV0dXJuIG1hc2s7CiB9CiAKIC8qIFhYWDogbW9kaWZ5IGZ1bmN0aW9ucyB0byByZXR1cm4gTkZTIGVycm9yczsgdGhleSdyZSBvbmx5IGV2ZXIKQEAgLTEyNiwxMDggKzEzNSwxNTEgQEAKIH07CiAKIHN0YXRpYyBzaG9ydCBhY2UydHlwZShzdHJ1Y3QgbmZzNF9hY2UgKik7Ci1zdGF0aWMgaW50IF9wb3NpeF90b19uZnN2NF9vbmUoc3RydWN0IHBvc2l4X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpfbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqLCB1bnNpZ25lZCBpbnQpOwotaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOwotc3RhdGljIGludCBuZnM0X2FjbF9zcGxpdChzdHJ1Y3QgbmZzNF9hY2wgKiwgc3RydWN0IG5mczRfYWNsICopOworc3RhdGljIHZvaWQgX3Bvc2l4X3RvX25mc3Y0X29uZShzdHJ1Y3QgcG9zaXhfYWNsICosIHN0cnVjdCBuZnM0X2FjbCAqLAorCQkJCXVuc2lnbmVkIGludCk7Cit2b2lkIG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOwogCiBzdHJ1Y3QgbmZzNF9hY2wgKgogbmZzNF9hY2xfcG9zaXhfdG9fbmZzdjQoc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IHBvc2l4X2FjbCAqZHBhY2wsCiAJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG5mczRfYWNsICphY2w7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKKwlpbnQgc2l6ZSA9IDA7CiAKLQlpZiAoKHBhY2wgIT0gTlVMTCAmJgotCQkocG9zaXhfYWNsX3ZhbGlkKHBhY2wpIDwgMCB8fCBwYWNsLT5hX2NvdW50ID09IDApKSB8fAotCSAgICAoZHBhY2wgIT0gTlVMTCAmJgotCQkocG9zaXhfYWNsX3ZhbGlkKGRwYWNsKSA8IDAgfHwgZHBhY2wtPmFfY291bnQgPT0gMCkpKQotCQlnb3RvIG91dF9lcnI7Ci0KLQlhY2wgPSBuZnM0X2FjbF9uZXcoKTsKLQlpZiAoYWNsID09IE5VTEwpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9lcnI7CisJaWYgKHBhY2wpIHsKKwkJaWYgKHBvc2l4X2FjbF92YWxpZChwYWNsKSA8IDApCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJc2l6ZSArPSAyKnBhY2wtPmFfY291bnQ7CisJfQorCWlmIChkcGFjbCkgeworCQlpZiAocG9zaXhfYWNsX3ZhbGlkKGRwYWNsKSA8IDApCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJc2l6ZSArPSAyKmRwYWNsLT5hX2NvdW50OwogCX0KIAotCWlmIChwYWNsICE9IE5VTEwpIHsKLQkJZXJyb3IgPSBfcG9zaXhfdG9fbmZzdjRfb25lKHBhY2wsIGFjbCwKLQkJCQkJCWZsYWdzICYgfk5GUzRfQUNMX1RZUEVfREVGQVVMVCk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIG91dF9hY2w7Ci0JfQorCS8qIEFsbG9jYXRlIGZvciB3b3JzdCBjYXNlOiBvbmUgKGRlbnksIGFsbG93KSBwYWlyIGVhY2g6ICovCisJYWNsID0gbmZzNF9hY2xfbmV3KHNpemUpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlpZiAoZHBhY2wgIT0gTlVMTCkgewotCQllcnJvciA9IF9wb3NpeF90b19uZnN2NF9vbmUoZHBhY2wsIGFjbCwKLQkJCQkJCWZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0X2FjbDsKLQl9CisJaWYgKHBhY2wpCisJCV9wb3NpeF90b19uZnN2NF9vbmUocGFjbCwgYWNsLCBmbGFncyAmIH5ORlM0X0FDTF9UWVBFX0RFRkFVTFQpOwogCi0JcmV0dXJuIGFjbDsKLQotb3V0X2FjbDoKLQluZnM0X2FjbF9mcmVlKGFjbCk7Ci1vdXRfZXJyOgotCWFjbCA9IEVSUl9QVFIoZXJyb3IpOworCWlmIChkcGFjbCkKKwkJX3Bvc2l4X3RvX25mc3Y0X29uZShkcGFjbCwgYWNsLCBmbGFncyB8IE5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CiAKIAlyZXR1cm4gYWNsOwogfQogCi1zdGF0aWMgaW50Ci1uZnM0X2FjbF9hZGRfcGFpcihzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgaW50IGVmbGFnLCB1MzIgbWFzaywgaW50IHdob3R5cGUsCi0JCXVpZF90IG93bmVyLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JaW50IGVycm9yOworc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5IHsKKwl1bnNpZ25lZCBzaG9ydCBvd25lcjsKKwl1bnNpZ25lZCBzaG9ydCB1c2VyczsKKwl1bnNpZ25lZCBzaG9ydCBncm91cDsKKwl1bnNpZ25lZCBzaG9ydCBncm91cHM7CisJdW5zaWduZWQgc2hvcnQgb3RoZXI7CisJdW5zaWduZWQgc2hvcnQgbWFzazsKK307CiAKLQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSwKLQkJCQkgZWZsYWcsIG1hc2ssIHdob3R5cGUsIG93bmVyKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0JZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQllZmxhZywgZGVueV9tYXNrKG1hc2ssIGZsYWdzKSwgd2hvdHlwZSwgb3duZXIpOwotCXJldHVybiBlcnJvcjsKK3N0YXRpYyB2b2lkCitzdW1tYXJpemVfcG9zaXhfYWNsKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5ICpwYXMpCit7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKKwlwYXMtPnVzZXJzID0gMDsKKwlwYXMtPmdyb3VwcyA9IDA7CisJcGFzLT5tYXNrID0gMDc7CisKKwlwZSA9IGFjbC0+YV9lbnRyaWVzICsgYWNsLT5hX2NvdW50OworCisJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKKwkJc3dpdGNoIChwYS0+ZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJCXBhcy0+b3duZXIgPSBwYS0+ZV9wZXJtOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJCXBhcy0+Z3JvdXAgPSBwYS0+ZV9wZXJtOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCQlwYXMtPnVzZXJzIHw9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9HUk9VUDoKKwkJCQlwYXMtPmdyb3VwcyB8PSBwYS0+ZV9wZXJtOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJcGFzLT5vdGhlciA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9NQVNLOgorCQkJCXBhcy0+bWFzayA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCX0KKwl9CisJLyogV2UnbGwgb25seSBjYXJlIGFib3V0IGVmZmVjdGl2ZSBwZXJtaXNzaW9uczogKi8KKwlwYXMtPnVzZXJzICY9IHBhcy0+bWFzazsKKwlwYXMtPmdyb3VwICY9IHBhcy0+bWFzazsKKwlwYXMtPmdyb3VwcyAmPSBwYXMtPm1hc2s7CiB9CiAKIC8qIFdlIGFzc3VtZSB0aGUgYWNsIGhhcyBiZWVuIHZlcmlmaWVkIHdpdGggcG9zaXhfYWNsX3ZhbGlkLiAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIF9wb3NpeF90b19uZnN2NF9vbmUoc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IG5mczRfYWNsICphY2wsCiAJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZSwgKmdyb3VwX293bmVyX2VudHJ5OwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0JdTMyIG1hc2ssIG1hc2tfbWFzazsKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKmdyb3VwX293bmVyX2VudHJ5OworCXN0cnVjdCBuZnM0X2FjZSAqYWNlOworCXN0cnVjdCBwb3NpeF9hY2xfc3VtbWFyeSBwYXM7CisJdW5zaWduZWQgc2hvcnQgZGVueTsKIAlpbnQgZWZsYWcgPSAoKGZsYWdzICYgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKSA/CiAJCQkJCU5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgOiAwKTsKIAogCUJVR19PTihwYWNsLT5hX2NvdW50IDwgMyk7Ci0JcGUgPSBwYWNsLT5hX2VudHJpZXMgKyBwYWNsLT5hX2NvdW50OwotCXBhID0gcGUgLSAyOyAvKiBpZiBtYXNrIGVudHJ5IGV4aXN0cywgaXQncyBzZWNvbmQgZnJvbSB0aGUgbGFzdC4gKi8KLQlpZiAocGEtPmVfdGFnID09IEFDTF9NQVNLKQotCQltYXNrX21hc2sgPSBkZW55X21hc2sobWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKSwgZmxhZ3MpOwotCWVsc2UKLQkJbWFza19tYXNrID0gMDsKKwlzdW1tYXJpemVfcG9zaXhfYWNsKHBhY2wsICZwYXMpOwogCiAJcGEgPSBwYWNsLT5hX2VudHJpZXM7Ci0JQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfVVNFUl9PQkopOwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MgfCBORlM0X0FDTF9PV05FUik7Ci0JZXJyb3IgPSBuZnM0X2FjbF9hZGRfcGFpcihhY2wsIGVmbGFnLCBtYXNrLCBORlM0X0FDTF9XSE9fT1dORVIsIDAsIGZsYWdzKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dDsKKwlhY2UgPSBhY2wtPmFjZXMgKyBhY2wtPm5hY2VzOworCisJLyogV2UgY291bGQgZGVueSBldmVyeXRoaW5nIG5vdCBncmFudGVkIGJ5IHRoZSBvd25lcjogKi8KKwlkZW55ID0gfnBhcy5vd25lcjsKKwkvKgorCSAqIGJ1dCBpdCBpcyBlcXVpdmFsZW50IChhbmQgc2ltcGxlcikgdG8gZGVueSBvbmx5IHdoYXQgaXMgbm90CisJICogZ3JhbnRlZCBieSBsYXRlciBlbnRyaWVzOgorCSAqLworCWRlbnkgJj0gcGFzLnVzZXJzIHwgcGFzLmdyb3VwIHwgcGFzLmdyb3VwcyB8IHBhcy5vdGhlcjsKKwlpZiAoZGVueSkgeworCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFOworCQlhY2UtPmZsYWcgPSBlZmxhZzsKKwkJYWNlLT5hY2Nlc3NfbWFzayA9IGRlbnlfbWFza19mcm9tX3Bvc2l4KGRlbnksIGZsYWdzKTsKKwkJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX09XTkVSOworCQlhY2UrKzsKKwkJYWNsLT5uYWNlcysrOworCX0KKworCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCWFjZS0+ZmxhZyA9IGVmbGFnOworCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MgfCBORlM0X0FDTF9PV05FUik7CisJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX09XTkVSOworCWFjZSsrOworCWFjbC0+bmFjZXMrKzsKIAlwYSsrOwogCiAJd2hpbGUgKHBhLT5lX3RhZyA9PSBBQ0xfVVNFUikgewotCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQllZmxhZywgIG1hc2tfbWFzaywgTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIG91dDsKLQotCi0JCWVycm9yID0gbmZzNF9hY2xfYWRkX3BhaXIoYWNsLCBlZmxhZywgbWFzaywKLQkJCQlORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkLCBmbGFncyk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIG91dDsKKwkJZGVueSA9IH4ocGEtPmVfcGVybSAmIHBhcy5tYXNrKTsKKwkJZGVueSAmPSBwYXMuZ3JvdXBzIHwgcGFzLmdyb3VwIHwgcGFzLm90aGVyOworCQlpZiAoZGVueSkgeworCQkJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRTsKKwkJCWFjZS0+ZmxhZyA9IGVmbGFnOworCQkJYWNlLT5hY2Nlc3NfbWFzayA9IGRlbnlfbWFza19mcm9tX3Bvc2l4KGRlbnksIGZsYWdzKTsKKwkJCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19OQU1FRDsKKwkJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCQlhY2UrKzsKKwkJCWFjbC0+bmFjZXMrKzsKKwkJfQorCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRTsKKwkJYWNlLT5mbGFnID0gZWZsYWc7CisJCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSAmIHBhcy5tYXNrLAorCQkJCQkJICAgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fTkFNRUQ7CisJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CiAJCXBhKys7CiAJfQogCkBAIC0yMzYsNjcgKzI4OCw2NSBAQAogCiAJLyogYWxsb3cgQUNFcyAqLwogCi0JaWYgKHBhY2wtPmFfY291bnQgPiAzKSB7Ci0JCUJVR19PTihwYS0+ZV90YWcgIT0gQUNMX0dST1VQX09CSik7Ci0JCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCi0JCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrX21hc2ssCi0JCQkJTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OwotCX0KIAlncm91cF9vd25lcl9lbnRyeSA9IHBhOwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAotCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrLAotCQkJTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dDsKKworCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCWFjZS0+ZmxhZyA9IGVmbGFnOworCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGFzLmdyb3VwLCBmbGFncyk7CisJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX0dST1VQOworCWFjZSsrOworCWFjbC0+bmFjZXMrKzsKIAlwYSsrOwogCiAJd2hpbGUgKHBhLT5lX3RhZyA9PSBBQ0xfR1JPVVApIHsKLQkJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7Ci0JCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCi0JCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrX21hc2ssCi0JCQkJTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIG91dDsKLQotCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSwKLQkJICAgIAkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrLAotCQkgICAgCQlORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OworCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRTsKKwkJYWNlLT5mbGFnID0gZWZsYWcgfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQOworCQlhY2UtPmFjY2Vzc19tYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0gJiBwYXMubWFzaywKKwkJCQkJCSAgIGZsYWdzKTsKKwkJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX05BTUVEOworCQlhY2UtPndobyA9IHBhLT5lX2lkOworCQlhY2UrKzsKKwkJYWNsLT5uYWNlcysrOwogCQlwYSsrOwogCX0KIAogCS8qIGRlbnkgQUNFcyAqLwogCiAJcGEgPSBncm91cF9vd25lcl9lbnRyeTsKLQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAotCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLAotCQkJZGVueV9tYXNrKG1hc2ssIGZsYWdzKSwgTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dDsKKworCWRlbnkgPSB+cGFzLmdyb3VwICYgcGFzLm90aGVyOworCWlmIChkZW55KSB7CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEU7CisJCWFjZS0+ZmxhZyA9IGVmbGFnIHwgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUDsKKwkJYWNlLT5hY2Nlc3NfbWFzayA9IGRlbnlfbWFza19mcm9tX3Bvc2l4KGRlbnksIGZsYWdzKTsKKwkJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX0dST1VQOworCQlhY2UrKzsKKwkJYWNsLT5uYWNlcysrOworCX0KIAlwYSsrOworCiAJd2hpbGUgKHBhLT5lX3RhZyA9PSBBQ0xfR1JPVVApIHsKLQkJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7Ci0JCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCi0JCSAgICAJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywKLQkJICAgIAkJZGVueV9tYXNrKG1hc2ssIGZsYWdzKSwgTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIG91dDsKKwkJZGVueSA9IH4ocGEtPmVfcGVybSAmIHBhcy5tYXNrKTsKKwkJZGVueSAmPSBwYXMub3RoZXI7CisJCWlmIChkZW55KSB7CisJCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFOworCQkJYWNlLT5mbGFnID0gZWZsYWcgfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQOworCQkJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChkZW55LCBmbGFncyk7CisJCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fTkFNRUQ7CisJCQlhY2UtPndobyA9IHBhLT5lX2lkOworCQkJYWNlKys7CisJCQlhY2wtPm5hY2VzKys7CisJCX0KIAkJcGErKzsKIAl9CiAKIAlpZiAocGEtPmVfdGFnID09IEFDTF9NQVNLKQogCQlwYSsrOwotCUJVR19PTihwYS0+ZV90YWcgIT0gQUNMX09USEVSKTsKLQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9wYWlyKGFjbCwgZWZsYWcsIG1hc2ssIE5GUzRfQUNMX1dIT19FVkVSWU9ORSwgMCwgZmxhZ3MpOwotCi1vdXQ6Ci0JcmV0dXJuIGVycm9yOworCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCWFjZS0+ZmxhZyA9IGVmbGFnOworCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19FVkVSWU9ORTsKKwlhY2wtPm5hY2VzKys7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNDIsNDYgKzM5Miw2IEBACiAJcmV0dXJuOwogfQogCi1pbnQKLW5mczRfYWNsX25mc3Y0X3RvX3Bvc2l4KHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICoqcGFjbCwKLQkJc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IG5mczRfYWNsICpkYWNsOwotCWludCBlcnJvciA9IC1FTk9NRU07Ci0KLQkqcGFjbCA9IE5VTEw7Ci0JKmRwYWNsID0gTlVMTDsKLQotCWRhY2wgPSBuZnM0X2FjbF9uZXcoKTsKLQlpZiAoZGFjbCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCWVycm9yID0gbmZzNF9hY2xfc3BsaXQoYWNsLCBkYWNsKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2FjbDsKLQotCSpwYWNsID0gX25mc3Y0X3RvX3Bvc2l4X29uZShhY2wsIGZsYWdzKTsKLQlpZiAoSVNfRVJSKCpwYWNsKSkgewotCQllcnJvciA9IFBUUl9FUlIoKnBhY2wpOwotCQkqcGFjbCA9IE5VTEw7Ci0JCWdvdG8gb3V0X2FjbDsKLQl9Ci0KLQkqZHBhY2wgPSBfbmZzdjRfdG9fcG9zaXhfb25lKGRhY2wsIGZsYWdzKTsKLQlpZiAoSVNfRVJSKCpkcGFjbCkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKCpkcGFjbCk7Ci0JCSpkcGFjbCA9IE5VTEw7Ci0JfQotb3V0X2FjbDoKLQlpZiAoZXJyb3IpIHsKLQkJcG9zaXhfYWNsX3JlbGVhc2UoKnBhY2wpOwotCQkqcGFjbCA9IE5VTEw7Ci0JfQotCW5mczRfYWNsX2ZyZWUoZGFjbCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogV2hpbGUgcHJvY2Vzc2luZyB0aGUgTkZTdjQgQUNFLCB0aGlzIG1haW50YWlucyBiaXRtYXNrcyByZXByZXNlbnRpbmcKICAqIHdoaWNoIHBlcm1pc3Npb24gYml0cyBoYXZlIGJlZW4gYWxsb3dlZCBhbmQgd2hpY2ggZGVuaWVkIHRvIGEgZ2l2ZW4KQEAgLTQwNiw2ICs0MTYsNyBAQAogICogY2FsY3VsYXRlZCBzbyBmYXI6ICovCiAKIHN0cnVjdCBwb3NpeF9hY2xfc3RhdGUgeworCWludCBlbXB0eTsKIAlzdHJ1Y3QgcG9zaXhfYWNlX3N0YXRlIG93bmVyOwogCXN0cnVjdCBwb3NpeF9hY2Vfc3RhdGUgZ3JvdXA7CiAJc3RydWN0IHBvc2l4X2FjZV9zdGF0ZSBvdGhlcjsKQEAgLTQyMSw2ICs0MzIsNyBAQAogCWludCBhbGxvYzsKIAogCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2xfc3RhdGUpKTsKKwlzdGF0ZS0+ZW1wdHkgPSAxOwogCS8qCiAJICogSW4gdGhlIHdvcnN0IGNhc2UsIGVhY2ggaW5kaXZpZHVhbCBhY2wgY291bGQgYmUgZm9yIGEgZGlzdGluY3QKIAkgKiBuYW1lZCB1c2VyIG9yIGdyb3VwLCBidXQgd2UgZG9uJ3Qgbm8gd2hpY2gsIHNvIHdlIGFsbG9jYXRlCkBAIC00ODgsNiArNTAwLDIwIEBACiAJaW50IG5hY2U7CiAJaW50IGksIGVycm9yID0gMDsKIAorCS8qCisJICogQUNMcyB3aXRoIG5vIEFDRXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgaW4gdGhlIGluaGVyaXRhYmxlCisJICogYW5kIGVmZmVjdGl2ZSBjYXNlczogd2hlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGFibGUgQUNFcywgd2UKKwkgKiBzZXQgYSB6ZXJvLWxlbmd0aCBkZWZhdWx0IHBvc2l4IGFjbDoKKwkgKi8KKwlpZiAoc3RhdGUtPmVtcHR5ICYmIChmbGFncyAmIE5GUzRfQUNMX1RZUEVfREVGQVVMVCkpIHsKKwkJcGFjbCA9IHBvc2l4X2FjbF9hbGxvYygwLCBHRlBfS0VSTkVMKTsKKwkJcmV0dXJuIHBhY2wgPyBwYWNsIDogRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJLyoKKwkgKiBXaGVuIHRoZXJlIGFyZSBubyBlZmZlY3RpdmUgQUNFcywgdGhlIGZvbGxvd2luZyB3aWxsIGVuZAorCSAqIHVwIHNldHRpbmcgYSAzLWVsZW1lbnQgZWZmZWN0aXZlIHBvc2l4IEFDTCB3aXRoIGFsbAorCSAqIHBlcm1pc3Npb25zIHplcm8uCisJICovCiAJbmFjZSA9IDQgKyBzdGF0ZS0+dXNlcnMtPm4gKyBzdGF0ZS0+Z3JvdXBzLT5uOwogCXBhY2wgPSBwb3NpeF9hY2xfYWxsb2MobmFjZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWNsKQpAQCAtNjAzLDYgKzYyOSw4IEBACiAJdTMyIG1hc2sgPSBhY2UtPmFjY2Vzc19tYXNrOwogCWludCBpOwogCisJc3RhdGUtPmVtcHR5ID0gMDsKKwogCXN3aXRjaCAoYWNlMnR5cGUoYWNlKSkgewogCWNhc2UgQUNMX1VTRVJfT0JKOgogCQlpZiAoYWNlLT50eXBlID09IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFKSB7CkBAIC02NjYsNzUgKzY5NCw2MiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgotX25mc3Y0X3RvX3Bvc2l4X29uZShzdHJ1Y3QgbmZzNF9hY2wgKm40YWNsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoc3RydWN0IG5mczRfYWNsICphY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsLAorCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKipkcGFjbCwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwb3NpeF9hY2xfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqcGFjbDsKKwlzdHJ1Y3QgcG9zaXhfYWNsX3N0YXRlIGVmZmVjdGl2ZV9hY2xfc3RhdGUsIGRlZmF1bHRfYWNsX3N0YXRlOwogCXN0cnVjdCBuZnM0X2FjZSAqYWNlOwogCWludCByZXQ7CiAKLQlyZXQgPSBpbml0X3N0YXRlKCZzdGF0ZSwgbjRhY2wtPm5hY2VzKTsKKwlyZXQgPSBpbml0X3N0YXRlKCZlZmZlY3RpdmVfYWNsX3N0YXRlLCBhY2wtPm5hY2VzKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShhY2UsICZuNGFjbC0+YWNlX2hlYWQsIGxfYWNlKQotCQlwcm9jZXNzX29uZV92NF9hY2UoJnN0YXRlLCBhY2UpOwotCi0JcGFjbCA9IHBvc2l4X3N0YXRlX3RvX2FjbCgmc3RhdGUsIGZsYWdzKTsKLQotCWZyZWVfc3RhdGUoJnN0YXRlKTsKLQotCWlmICghSVNfRVJSKHBhY2wpKQotCQlzb3J0X3BhY2wocGFjbCk7Ci0JcmV0dXJuIHBhY2w7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBzdHJ1Y3QgbmZzNF9hY2wgKmRhY2wpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaCwgKm47Ci0Jc3RydWN0IG5mczRfYWNlICphY2U7Ci0JaW50IGVycm9yID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShoLCBuLCAmYWNsLT5hY2VfaGVhZCkgewotCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOwotCisJCXJldHVybiByZXQ7CisJcmV0ID0gaW5pdF9zdGF0ZSgmZGVmYXVsdF9hY2xfc3RhdGUsIGFjbC0+bmFjZXMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VzdGF0ZTsKKwlyZXQgPSAtRUlOVkFMOworCWZvciAoYWNlID0gYWNsLT5hY2VzOyBhY2UgPCBhY2wtPmFjZXMgKyBhY2wtPm5hY2VzOyBhY2UrKykgewogCQlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFICYmCiAJCSAgICBhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCisJCQlnb3RvIG91dF9kc3RhdGU7CiAJCWlmIChhY2UtPmZsYWcgJiB+TkZTNF9TVVBQT1JURURfRkxBR1MpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzd2l0Y2ggKGFjZS0+ZmxhZyAmIE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MpIHsKLQkJY2FzZSAwOgotCQkJLyogTGVhdmUgdGhpcyBhY2UgaW4gdGhlIGVmZmVjdGl2ZSBhY2w6ICovCisJCQlnb3RvIG91dF9kc3RhdGU7CisJCWlmICgoYWNlLT5mbGFnICYgTkZTNF9JTkhFUklUQU5DRV9GTEFHUykgPT0gMCkgeworCQkJcHJvY2Vzc19vbmVfdjRfYWNlKCZlZmZlY3RpdmVfYWNsX3N0YXRlLCBhY2UpOwogCQkJY29udGludWU7Ci0JCWNhc2UgTkZTNF9JTkhFUklUQU5DRV9GTEFHUzoKLQkJCS8qIEFkZCB0aGlzIGFjZSB0byB0aGUgZGVmYXVsdCBhY2wgYW5kIHJlbW92ZSBpdAotCQkJICogZnJvbSB0aGUgZWZmZWN0aXZlIGFjbDogKi8KLQkJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShkYWNsLCBhY2UtPnR5cGUsIGFjZS0+ZmxhZywKLQkJCQlhY2UtPmFjY2Vzc19tYXNrLCBhY2UtPndob3R5cGUsIGFjZS0+d2hvKTsKLQkJCWlmIChlcnJvcikKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQlsaXN0X2RlbChoKTsKLQkJCWtmcmVlKGFjZSk7Ci0JCQlhY2wtPm5hY2VzLS07Ci0JCQlicmVhazsKLQkJY2FzZSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTICYgfk5GUzRfQUNFX0lOSEVSSVRfT05MWV9BQ0U6Ci0JCQkvKiBBZGQgdGhpcyBhY2UgdG8gdGhlIGRlZmF1bHQsIGJ1dCBsZWF2ZSBpdCBpbgotCQkJICogdGhlIGVmZmVjdGl2ZSBhY2wgYXMgd2VsbDogKi8KLQkJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShkYWNsLCBhY2UtPnR5cGUsIGFjZS0+ZmxhZywKLQkJCQlhY2UtPmFjY2Vzc19tYXNrLCBhY2UtPndob3R5cGUsIGFjZS0+d2hvKTsKLQkJCWlmIChlcnJvcikKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwogCQl9CisJCWlmICghKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJCWdvdG8gb3V0X2RzdGF0ZTsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHdoZW4gb25seSBvbmUgb2YgRklMRV9JTkhFUklUIG9yIERJUkVDVE9SWV9JTkhFUklUCisJCSAqIGlzIHNldCwgd2UncmUgZWZmZWN0aXZlbHkgdHVybmluZyBvbiB0aGUgb3RoZXIuICBUaGF0J3MgT0ssCisJCSAqIGFjY29yZGluZyB0byByZmMgMzUzMC4KKwkJICovCisJCXByb2Nlc3Nfb25lX3Y0X2FjZSgmZGVmYXVsdF9hY2xfc3RhdGUsIGFjZSk7CisKKwkJaWYgKCEoYWNlLT5mbGFnICYgTkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRSkpCisJCQlwcm9jZXNzX29uZV92NF9hY2UoJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGFjZSk7CiAJfQotCXJldHVybiAwOworCSpwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZlZmZlY3RpdmVfYWNsX3N0YXRlLCBmbGFncyk7CisJaWYgKElTX0VSUigqcGFjbCkpIHsKKwkJcmV0ID0gUFRSX0VSUigqcGFjbCk7CisJCWdvdG8gb3V0X2RzdGF0ZTsKKwl9CisJKmRwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZkZWZhdWx0X2FjbF9zdGF0ZSwKKwkJCQkJCWZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKKwlpZiAoSVNfRVJSKCpkcGFjbCkpIHsKKwkJcmV0ID0gUFRSX0VSUigqZHBhY2wpOworCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7CisJCWdvdG8gb3V0X2RzdGF0ZTsKKwl9CisJc29ydF9wYWNsKCpwYWNsKTsKKwlzb3J0X3BhY2woKmRwYWNsKTsKKwlyZXQgPSAwOworb3V0X2RzdGF0ZToKKwlmcmVlX3N0YXRlKCZkZWZhdWx0X2FjbF9zdGF0ZSk7CitvdXRfZXN0YXRlOgorCWZyZWVfc3RhdGUoJmVmZmVjdGl2ZV9hY2xfc3RhdGUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzaG9ydApAQCAtNzU5LDQ4ICs3NzQsMjIgQEAKIEVYUE9SVF9TWU1CT0wobmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgpOwogCiBzdHJ1Y3QgbmZzNF9hY2wgKgotbmZzNF9hY2xfbmV3KHZvaWQpCituZnM0X2FjbF9uZXcoaW50IG4pCiB7CiAJc3RydWN0IG5mczRfYWNsICphY2w7CiAKLQlpZiAoKGFjbCA9IGttYWxsb2Moc2l6ZW9mKCphY2wpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlhY2wgPSBrbWFsbG9jKHNpemVvZigqYWNsKSArIG4qc2l6ZW9mKHN0cnVjdCBuZnM0X2FjZSksIEdGUF9LRVJORUwpOworCWlmIChhY2wgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0KIAlhY2wtPm5hY2VzID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmYWNsLT5hY2VfaGVhZCk7Ci0KIAlyZXR1cm4gYWNsOwogfQogCiB2b2lkCi1uZnM0X2FjbF9mcmVlKHN0cnVjdCBuZnM0X2FjbCAqYWNsKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7Ci0Jc3RydWN0IG5mczRfYWNlICphY2U7Ci0KLQlpZiAoIWFjbCkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZhY2wtPmFjZV9oZWFkKSkgewotCQloID0gYWNsLT5hY2VfaGVhZC5uZXh0OwotCQlsaXN0X2RlbChoKTsKLQkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKLQkJa2ZyZWUoYWNlKTsKLQl9Ci0KLQlrZnJlZShhY2wpOwotCi0JcmV0dXJuOwotfQotCi1pbnQKIG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICphY2wsIHUzMiB0eXBlLCB1MzIgZmxhZywgdTMyIGFjY2Vzc19tYXNrLAogCQlpbnQgd2hvdHlwZSwgdWlkX3Qgd2hvKQogewotCXN0cnVjdCBuZnM0X2FjZSAqYWNlOwotCi0JaWYgKChhY2UgPSBrbWFsbG9jKHNpemVvZigqYWNlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCXN0cnVjdCBuZnM0X2FjZSAqYWNlID0gYWNsLT5hY2VzICsgYWNsLT5uYWNlczsKIAogCWFjZS0+dHlwZSA9IHR5cGU7CiAJYWNlLT5mbGFnID0gZmxhZzsKQEAgLTgwOCwxMCArNzk3LDcgQEAKIAlhY2UtPndob3R5cGUgPSB3aG90eXBlOwogCWFjZS0+d2hvID0gd2hvOwogCi0JbGlzdF9hZGRfdGFpbCgmYWNlLT5sX2FjZSwgJmFjbC0+YWNlX2hlYWQpOwogCWFjbC0+bmFjZXMrKzsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTg2NSw3ICs4NTEsNiBAQAogfQogCiBFWFBPUlRfU1lNQk9MKG5mczRfYWNsX25ldyk7Ci1FWFBPUlRfU1lNQk9MKG5mczRfYWNsX2ZyZWUpOwogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9hZGRfYWNlKTsKIEVYUE9SVF9TWU1CT0wobmZzNF9hY2xfZ2V0X3dob3R5cGUpOwogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF93cml0ZV93aG8pOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggZjU3NjU1YS4uZmIxNGQ2OCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC0zODcsNyArMzg3LDYgQEAKIAkJLmFkZHJlc3MJPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsCiAJCS5hZGRyc2l6ZQk9IHNpemVvZihhZGRyKSwKIAkJLnRpbWVvdXQJPSAmdGltZXBhcm1zLAotCQkuc2VydmVybmFtZQk9IGNscC0+Y2xfbmFtZS5kYXRhLAogCQkucHJvZ3JhbQk9IHByb2dyYW0sCiAJCS52ZXJzaW9uCT0gbmZzX2NiX3ZlcnNpb25bMV0tPm51bWJlciwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAkvKiBYWFg6IG5lZWQgQVVUSF9HU1MuLi4gKi8KQEAgLTM5Nyw2ICszOTYsNyBAQAogCQkucnBjX3Byb2MgICAgICAgPSAmbmZzNF9jYl9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ0JfTlVMTF0sCiAJCS5ycGNfYXJncCAgICAgICA9IGNscCwKIAl9OworCWNoYXIgY2xpZW50bmFtZVsxNl07CiAJaW50IHN0YXR1czsKIAogCWlmIChhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkpCkBAIC00MTksNiArNDE5LDExIEBACiAJbWVtc2V0KHByb2dyYW0tPnN0YXRzLCAwLCBzaXplb2YoY2ItPmNiX3N0YXQpKTsKIAlwcm9ncmFtLT5zdGF0cy0+cHJvZ3JhbSA9IHByb2dyYW07CiAKKwkvKiBKdXN0IGhlcmUgdG8gbWFrZSBzb21lIHByaW50aydzIG1vcmUgdXNlZnVsOiAqLworCXNucHJpbnRmKGNsaWVudG5hbWUsIHNpemVvZihjbGllbnRuYW1lKSwKKwkJIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyLnNpbl9hZGRyKSk7CisJYXJncy5zZXJ2ZXJuYW1lID0gY2xpZW50bmFtZTsKKwogCS8qIENyZWF0ZSBSUEMgY2xpZW50ICovCiAJY2ItPmNiX2NsaWVudCA9IHJwY19jcmVhdGUoJmFyZ3MpOwogCWlmIChJU19FUlIoY2ItPmNiX2NsaWVudCkpIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggMGVmYmE1NS4uNWQwOTBmMSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTE5OSwyNCArMTk5LDIyIEBACiAKIHN0YXRpYyBjaGFyICpzYXZlbWVtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIF9fYmUzMiAqcCwgaW50IG5ieXRlcykKIHsKLQl2b2lkICpuZXcgPSBOVUxMOwogCWlmIChwID09IGFyZ3AtPnRtcCkgewotCQluZXcgPSBrbWFsbG9jKG5ieXRlcywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3KSByZXR1cm4gTlVMTDsKLQkJcCA9IG5ldzsKKwkJcCA9IGttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIE5VTEw7CiAJCW1lbWNweShwLCBhcmdwLT50bXAsIG5ieXRlcyk7CiAJfSBlbHNlIHsKIAkJQlVHX09OKHAgIT0gYXJncC0+dG1wcCk7CiAJCWFyZ3AtPnRtcHAgPSBOVUxMOwogCX0KIAlpZiAoZGVmZXJfZnJlZShhcmdwLCBrZnJlZSwgcCkpIHsKLQkJa2ZyZWUobmV3KTsKKwkJa2ZyZWUocCk7CiAJCXJldHVybiBOVUxMOwogCX0gZWxzZQogCQlyZXR1cm4gKGNoYXIgKilwOwogfQogCi0KIHN0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9iaXRtYXAoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgdTMyICpibXZhbCkKIHsKQEAgLTI1NSw3ICsyNTMsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyoKLQkgKiBBY2NvcmRpbmcgdG8gc3BlYywgdW5zdXBwb3J0ZWQgYXR0cmlidXRlcyByZXR1cm4gRVJSX05PVFNVUFA7CisJICogQWNjb3JkaW5nIHRvIHNwZWMsIHVuc3VwcG9ydGVkIGF0dHJpYnV0ZXMgcmV0dXJuIEVSUl9BVFRSTk9UU1VQUDsKIAkgKiByZWFkLW9ubHkgYXR0cmlidXRlcyByZXR1cm4gRVJSX0lOVkFMLgogCSAqLwogCWlmICgoYm12YWxbMF0gJiB+TkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDApIHx8IChibXZhbFsxXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMSkpCkBAIC0yNzMsNDIgKzI3MSw0MiBAQAogCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9TSVpFOwogCX0KIAlpZiAoYm12YWxbMF0gJiBGQVRUUjRfV09SRDBfQUNMKSB7Ci0JCWludCBuYWNlLCBpOwotCQlzdHJ1Y3QgbmZzNF9hY2UgYWNlOworCQlpbnQgbmFjZTsKKwkJc3RydWN0IG5mczRfYWNlICphY2U7CiAKIAkJUkVBRF9CVUYoNCk7IGxlbiArPSA0OwogCQlSRUFEMzIobmFjZSk7CiAKLQkJKmFjbCA9IG5mczRfYWNsX25ldygpOworCQlpZiAobmFjZSA+IE5GUzRfQUNMX01BWCkKKwkJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisKKwkJKmFjbCA9IG5mczRfYWNsX25ldyhuYWNlKTsKIAkJaWYgKCphY2wgPT0gTlVMTCkgewogCQkJaG9zdF9lcnIgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfbmZzZXJyOwogCQl9Ci0JCWRlZmVyX2ZyZWUoYXJncCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpbmZzNF9hY2xfZnJlZSwgKmFjbCk7CisJCWRlZmVyX2ZyZWUoYXJncCwga2ZyZWUsICphY2wpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuYWNlOyBpKyspIHsKKwkJKCphY2wpLT5uYWNlcyA9IG5hY2U7CisJCWZvciAoYWNlID0gKCphY2wpLT5hY2VzOyBhY2UgPCAoKmFjbCktPmFjZXMgKyBuYWNlOyBhY2UrKykgewogCQkJUkVBRF9CVUYoMTYpOyBsZW4gKz0gMTY7Ci0JCQlSRUFEMzIoYWNlLnR5cGUpOwotCQkJUkVBRDMyKGFjZS5mbGFnKTsKLQkJCVJFQUQzMihhY2UuYWNjZXNzX21hc2spOworCQkJUkVBRDMyKGFjZS0+dHlwZSk7CisJCQlSRUFEMzIoYWNlLT5mbGFnKTsKKwkJCVJFQUQzMihhY2UtPmFjY2Vzc19tYXNrKTsKIAkJCVJFQUQzMihkdW1teTMyKTsKIAkJCVJFQURfQlVGKGR1bW15MzIpOwogCQkJbGVuICs9IFhEUl9RVUFETEVOKGR1bW15MzIpIDw8IDI7CiAJCQlSRUFETUVNKGJ1ZiwgZHVtbXkzMik7Ci0JCQlhY2Uud2hvdHlwZSA9IG5mczRfYWNsX2dldF93aG90eXBlKGJ1ZiwgZHVtbXkzMik7CisJCQlhY2UtPndob3R5cGUgPSBuZnM0X2FjbF9nZXRfd2hvdHlwZShidWYsIGR1bW15MzIpOwogCQkJaG9zdF9lcnIgPSAwOwotCQkJaWYgKGFjZS53aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCkKLQkJCQlhY2Uud2hvID0gMDsKLQkJCWVsc2UgaWYgKGFjZS5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKKwkJCWlmIChhY2UtPndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQorCQkJCWFjZS0+d2hvID0gMDsKKwkJCWVsc2UgaWYgKGFjZS0+ZmxhZyAmIE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVApCiAJCQkJaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwKLQkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS53aG8pOworCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLT53aG8pOwogCQkJZWxzZQogCQkJCWhvc3RfZXJyID0gbmZzZF9tYXBfbmFtZV90b191aWQoYXJncC0+cnFzdHAsCi0JCQkJCQlidWYsIGR1bW15MzIsICZhY2Uud2hvKTsKLQkJCWlmIChob3N0X2VycikKLQkJCQlnb3RvIG91dF9uZnNlcnI7Ci0JCQlob3N0X2VyciA9IG5mczRfYWNsX2FkZF9hY2UoKmFjbCwgYWNlLnR5cGUsIGFjZS5mbGFnLAotCQkJCSBhY2UuYWNjZXNzX21hc2ssIGFjZS53aG90eXBlLCBhY2Uud2hvKTsKKwkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS0+d2hvKTsKIAkJCWlmIChob3N0X2VycikKIAkJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KQEAgLTE1OTYsNyArMTU5NCw2IEBACiAJfQogCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQUNMKSB7CiAJCXN0cnVjdCBuZnM0X2FjZSAqYWNlOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICpoOwogCiAJCWlmIChhY2wgPT0gTlVMTCkgewogCQkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQpAQCAtMTYwOSw5ICsxNjA2LDcgQEAKIAkJCWdvdG8gb3V0X3Jlc291cmNlOwogCQlXUklURTMyKGFjbC0+bmFjZXMpOwogCi0JCWxpc3RfZm9yX2VhY2goaCwgJmFjbC0+YWNlX2hlYWQpIHsKLQkJCWFjZSA9IGxpc3RfZW50cnkoaCwgc3RydWN0IG5mczRfYWNlLCBsX2FjZSk7Ci0KKwkJZm9yIChhY2UgPSBhY2wtPmFjZXM7IGFjZSA8IGFjbC0+YWNlcyArIGFjbC0+bmFjZXM7IGFjZSsrKSB7CiAJCQlpZiAoKGJ1ZmxlbiAtPSA0KjMpIDwgMCkKIAkJCQlnb3RvIG91dF9yZXNvdXJjZTsKIAkJCVdSSVRFMzIoYWNlLT50eXBlKTsKQEAgLTE4MjEsNyArMTgxNiw3IEBACiAJc3RhdHVzID0gbmZzX29rOwogCiBvdXQ6Ci0JbmZzNF9hY2xfZnJlZShhY2wpOworCWtmcmVlKGFjbCk7CiAJaWYgKGZocCA9PSAmdGVtcGZoKQogCQlmaF9wdXQoJnRlbXBmaCk7CiAJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IDgyODMyMzYuLjdlNmFhMjQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNDY2LDcgKzQ2NiwxMCBAQAogCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKIAlyZXR1cm4gKGVycm9yKTsKIG91dF9uZnNlcnI6Ci0JZXJyb3IgPSBuZnNlcnJubyhob3N0X2Vycm9yKTsKKwlpZiAoaG9zdF9lcnJvciA9PSAtRU9QTk9UU1VQUCkKKwkJZXJyb3IgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CisJZWxzZQorCQllcnJvciA9IG5mc2Vycm5vKGhvc3RfZXJyb3IpOwogCWdvdG8gb3V0OwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggNzc5OGQyYS4uOTE2YzAxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtNzksNiArNzksNyBAQAogCXUzMiBibV9hY3Rpdml0eTsKIAlpbnQgY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4IHN0YXRlc1tBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVJdOworCWludCB0aW1lcl9icm9hZGNhc3Rfb25fc3RhdGU7CiB9OwogCiAvKiBQZXJmb3JtYW5jZSBNYW5hZ2VtZW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCmluZGV4IDNhNjEyMDYuLmNjNmIxNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCkBAIC05NSw5ICs5NSw3IEBACiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19FT0ksIDApOwogfQogCi1leHRlcm4gdm9pZCAoKndhaXRfdGltZXJfdGljaykodm9pZCk7Ci0KLWV4dGVybiBpbnQgZ2V0X21heGx2dCh2b2lkKTsKK2V4dGVybiBpbnQgbGFwaWNfZ2V0X21heGx2dCh2b2lkKTsKIGV4dGVybiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCk7CiBleHRlcm4gdm9pZCBjb25uZWN0X2JzcF9BUElDICh2b2lkKTsKIGV4dGVybiB2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMgKGludCB2aXJ0X3dpcmVfc2V0dXApOwpAQCAtMTEzLDE0ICsxMTEsOSBAQAogZXh0ZXJuIHZvaWQgc2V0dXBfYm9vdF9BUElDX2Nsb2NrICh2b2lkKTsKIGV4dGVybiB2b2lkIHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrICh2b2lkKTsKIGV4dGVybiBpbnQgQVBJQ19pbml0X3VuaXByb2Nlc3NvciAodm9pZCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBlbmFibGVfQVBJQ190aW1lcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgKHZvaWQgKiBkdW1teSk7CiAKLXZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKTsKLXZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spOwotdm9pZCBzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIodm9pZCAqY3B1bWFzayk7CiAjZGVmaW5lIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCTEKIAogZXh0ZXJuIGludCB0aW1lcl9vdmVyXzgyNTQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2hwZXQuaCBiL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCmluZGV4IGU0N2JlOWEuLmZjMDNjZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCkBAIC05MCwxNiArOTAsMTkgQEAKICNkZWZpbmUgSFBFVF9NSU5fUEVSSU9EICgxMDAwMDBVTCkKICNkZWZpbmUgSFBFVF9USUNLX1JBVEUgIChIWiAqIDEwMDAwMFVMKQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7ICAJLyogaHBldCBjbGtzIGNvdW50IHBlciB0aWNrICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CS8qIGhwZXQgbWVtb3J5IG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCi1leHRlcm4gaW50IGhwZXRfdXNlX3RpbWVyOworZXh0ZXJuIGludCBpc19ocGV0X2VuYWJsZWQodm9pZCk7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLworZXh0ZXJuIGludCBocGV0X3VzZV90aW1lcjsKIGV4dGVybiBpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgaHBldF9lbmFibGUodm9pZCk7Ci1leHRlcm4gaW50IGhwZXRfcmVlbmFibGUodm9pZCk7Ci1leHRlcm4gaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgaXNfaHBldF9jYXBhYmxlKHZvaWQpOwogZXh0ZXJuIGludCBocGV0X3JlYWRsKHVuc2lnbmVkIGxvbmcgYSk7CisjZWxzZQorZXh0ZXJuIGludCBocGV0X2VuYWJsZSh2b2lkKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKIGV4dGVybiBpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spOwpAQCAtMTEwLDUgKzExMywxMCBAQAogZXh0ZXJuIGludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpOwogZXh0ZXJuIGlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogI2VuZGlmIC8qIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDICovCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZXRfZW5hYmxlKHZvaWQpIHsgcmV0dXJuIDA7IH0KKwogI2VuZGlmIC8qIENPTkZJR19IUEVUX1RJTUVSICovCiAjZW5kaWYgLyogX0kzODZfSFBFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmggYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmgKaW5kZXggMDE1ZDhkZi4uNmNiMGRkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaTgyNTMuaApAQCAtMSw2ICsxLDIxIEBACiAjaWZuZGVmIF9fQVNNX0k4MjUzX0hfXwogI2RlZmluZSBfX0FTTV9JODI1M19IX18KIAorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKwogZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKworLyoqCisgKiBwaXRfaW50ZXJydXB0X2hvb2sgLSBob29rIGludG8gdGltZXIgdGljaworICogQHJlZ3M6CXN0YW5kYXJkIHJlZ2lzdGVycyBmcm9tIGludGVycnVwdAorICoKKyAqIENhbGwgdGhlIGdsb2JhbCBjbG9jayBldmVudCBoYW5kbGVyLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIHBpdF9pbnRlcnJ1cHRfaG9vayh2b2lkKQoreworCWdsb2JhbF9jbG9ja19ldmVudC0+ZXZlbnRfaGFuZGxlcihnbG9iYWxfY2xvY2tfZXZlbnQpOworfQorCiAjZW5kaWYJLyogX19BU01fSTgyNTNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaAppbmRleCA3ZDYwNmUzLi41NmU1Njg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmgKQEAgLTEsODYgKzEsMTYgQEAKIC8qIGRlZmluZXMgZm9yIGlubGluZSBhcmNoIHNldHVwIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KIAotI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKIC8qKgogICogZG9fdGltZXJfaW50ZXJydXB0X2hvb2sgLSBob29rIGludG8gdGltZXIgdGljawotICogQHJlZ3M6CXN0YW5kYXJkIHJlZ2lzdGVycyBmcm9tIGludGVycnVwdAogICoKLSAqIERlc2NyaXB0aW9uOgotICoJVGhpcyBob29rIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGltZXIgaW50ZXJydXB0IGlzIGFjaydkLgotICoJSXQncyBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gYWxsb3cgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IHBvc3Nlc3MKLSAqCWluZGl2aWR1YWwgcGVyIENQVSBjbG9ja3MgKGxpa2UgdGhlIENQVSBBUElDcyBzdXBwbHkpIHRvIGJyb2FkY2FzdCB0aGUKLSAqCXRpbWVyIGludGVycnVwdCBhcyBhIG1lYW5zIG9mIHRyaWdnZXJpbmcgcmVzY2hlZHVsZXMgZXRjLgorICogQ2FsbCB0aGUgcGl0IGNsb2NrIGV2ZW50IGhhbmRsZXIuIHNlZSBhc20vaTgyNTMuaAogICoqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0X2hvb2sodm9pZCkKIHsKLQlkb190aW1lcigxKTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0vKgotICogSW4gdGhlIFNNUCBjYXNlIHdlIHVzZSB0aGUgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQgdG8gZG8gdGhlCi0gKiBwcm9maWxpbmcsIGV4Y2VwdCB3aGVuIHdlIHNpbXVsYXRlIFNNUCBtb2RlIG9uIGEgdW5pcHJvY2Vzc29yCi0gKiBzeXN0ZW0sIGluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGNhbGwgdGhlIGxvY2FsIGludGVycnVwdCBoYW5kbGVyLgotICovCi0jaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLSNlbHNlCi0JaWYgKCF1c2luZ19hcGljX3RpbWVyKQotCQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0jZW5kaWYKLX0KLQotCi0vKiB5b3UgY2FuIHNhZmVseSB1bmRlZmluZSB0aGlzIGlmIHlvdSBkb24ndCBoYXZlIHRoZSBOZXB0dW5lIGNoaXBzZXQgKi8KLQotI2RlZmluZSBCVUdHWV9ORVBUVU5fVElNRVIKLQotLyoqCi0gKiBkb190aW1lcl9vdmVyZmxvdyAtIHByb2Nlc3MgYSBkZXRlY3RlZCB0aW1lciBvdmVyZmxvdyBjb25kaXRpb24KLSAqIEBjb3VudDoJaGFyZHdhcmUgdGltZXIgaW50ZXJydXB0IGNvdW50IG9uIG92ZXJmbG93Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKglUaGlzIGNhbGwgaXMgaW52b2tlZCB3aGVuIHRoZSBqaWZmaWVzIGNvdW50IGhhcyBub3QgaW5jcmVtZW50ZWQgYnV0Ci0gKgl0aGUgaGFyZHdhcmUgdGltZXIgaW50ZXJydXB0IGhhcy4gIEl0IG1lYW5zIHRoYXQgYSB0aW1lciB0aWNrIGludGVycnVwdAotICoJY2FtZSBhbG9uZyB3aGlsZSB0aGUgcHJldmlvdXMgb25lIHdhcyBwZW5kaW5nLCB0aHVzIGEgdGljayB3YXMgbWlzc2VkCi0gKiovCi1zdGF0aWMgaW5saW5lIGludCBkb190aW1lcl9vdmVyZmxvdyhpbnQgY291bnQpCi17Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2soJmk4MjU5QV9sb2NrKTsKLQkvKgotCSAqIFRoaXMgaXMgdHJpY2t5IHdoZW4gSS9PIEFQSUNzIGFyZSB1c2VkOwotCSAqIHNlZSBkb190aW1lcl9pbnRlcnJ1cHQoKS4KLQkgKi8KLQlpID0gaW5iKDB4MjApOwotCXNwaW5fdW5sb2NrKCZpODI1OUFfbG9jayk7Ci0JCi0JLyogYXNzdW1wdGlvbiBhYm91dCB0aW1lciBiZWluZyBJUlEwICovCi0JaWYgKGkgJiAweDAxKSB7Ci0JCS8qCi0JCSAqIFdlIGNhbm5vdCBkZXRlY3QgbG9zdCB0aW1lciBpbnRlcnJ1cHRzIC4uLiAKLQkJICogd2VsbCwgdGhhdCdzIHdoeSB3ZSBjYWxsIHRoZW0gbG9zdCwgZG9uJ3Qgd2U/IDopCi0JCSAqIFtobW0sIG9uIHRoZSBQZW50aXVtIGFuZCBBbHBoYSB3ZSBjYW4gLi4uIHNvcnQgb2ZdCi0JCSAqLwotCQljb3VudCAtPSBMQVRDSDsKLQl9IGVsc2UgewotI2lmZGVmIEJVR0dZX05FUFRVTl9USU1FUgotCQkvKgotCQkgKiBmb3IgdGhlIE5lcHR1biBidWcgd2Uga25vdyB0aGF0IHRoZSAnbGF0Y2gnCi0JCSAqIGNvbW1hbmQgZG9lc24ndCBsYXRjaCB0aGUgaGlnaCBhbmQgbG93IHZhbHVlCi0JCSAqIG9mIHRoZSBjb3VudGVyIGF0b21pY2FsbHkuIFRodXMgd2UgaGF2ZSB0byAKLQkJICogc3Vic3RyYWN0IDI1NiBmcm9tIHRoZSBjb3VudGVyIAotCQkgKiAuLi4gZnVubnksIGlzbnQgaXQ/IDopCi0JCSAqLwotCQkKLQkJY291bnQgLT0gMjU2OwotI2Vsc2UKLQkJcHJpbnRrKCJkb19zbG93X2dldHRpbWVvZmZzZXQoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIpOwotI2VuZGlmCi0JfQotCXJldHVybiBjb3VudDsKKwlwaXRfaW50ZXJydXB0X2hvb2soKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL2RvX3RpbWVyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9kb190aW1lci5oCmluZGV4IDA0ZTY5YzEuLjYwZjlkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL2RvX3RpbWVyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvZG9fdGltZXIuaApAQCAtMSwyNSArMSwxOCBAQAogLyogZGVmaW5lcyBmb3IgaW5saW5lIGFyY2ggc2V0dXAgZnVuY3Rpb25zICovCi0jaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAKKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgorCisvKioKKyAqIGRvX3RpbWVyX2ludGVycnVwdF9ob29rIC0gaG9vayBpbnRvIHRpbWVyIHRpY2sKKyAqIEByZWdzOiAgICAgc3RhbmRhcmQgcmVnaXN0ZXJzIGZyb20gaW50ZXJydXB0CisgKgorICogQ2FsbCB0aGUgcGl0IGNsb2NrIGV2ZW50IGhhbmRsZXIuIHNlZSBhc20vaTgyNTMuaAorICoqLwogc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKHZvaWQpCiB7Ci0JZG9fdGltZXIoMSk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGVfdm0oaXJxX3JlZ3MpKTsKLSNlbmRpZgotCisJcGl0X2ludGVycnVwdF9ob29rKCk7CiAJdm95YWdlcl90aW1lcl9pbnRlcnJ1cHQoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZG9fdGltZXJfb3ZlcmZsb3coaW50IGNvdW50KQotewotCS8qIGNhbid0IHJlYWQgdGhlIElTUiwganVzdCBhc3N1bWUgMSB0aWNrCi0JICAgb3ZlcmZsb3cgKi8KLQlpZihjb3VudCA+IExBVENIIHx8IGNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZPWUFHRVIgUFJPQkxFTTogY291bnQgaXMgJWQsIGxhdGNoIGlzICVkXG4iLCBjb3VudCwgTEFUQ0gpOwotCQljb3VudCA9IExBVENIOwotCX0KLQljb3VudCAtPSBMQVRDSDsKLQotCXJldHVybiBjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oCmluZGV4IDc3MGJmNmQuLmYyMTM0OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaApAQCAtMjMsNyArMjMsNiBAQAogZXh0ZXJuIGludCBtcGNfZGVmYXVsdF90eXBlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKIGV4dGVybiBpbnQgcGljX21vZGU7Ci1leHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiAKICNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfbGFwaWMgKHU4IGlkLCB1OCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21zci5oCmluZGV4IDYwOWEzODkuLjZkYjQwZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tc3IuaApAQCAtMzA3LDQgKzMwNyw3IEBACiAjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwJMHgzOGYKICNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwJMHgzOTAKIAorLyogR2VvZGUgZGVmaW5lZCBNU1JzICovCisjZGVmaW5lIE1TUl9HRU9ERV9CVVNDT05UX0NPTkYwICAgICAgICAgMHgxOTAwCisKICNlbmRpZiAvKiBfX0FTTV9NU1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90c2MuaCBiL2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKaW5kZXggYzEzOTMzMS4uZTk5Nzg5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90c2MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCkBAIC0xLDQ4ICsxIEBACi0vKgotICogbGludXgvaW5jbHVkZS9hc20taTM4Ni90c2MuaAotICoKLSAqIGkzODYgVFNDIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKi8KLSNpZm5kZWYgX0FTTV9pMzg2X1RTQ19ICi0jZGVmaW5lIF9BU01faTM4Nl9UU0NfSAotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCi0vKgotICogU3RhbmRhcmQgd2F5IHRvIGFjY2VzcyB0aGUgY3ljbGUgY291bnRlciBvbiBpNTg2KyBDUFVzLgotICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCi0gKgotICogSWYgeW91IHJlYWxseSBoYXZlIGEgU01QIG1hY2hpbmUgd2l0aCBpNDg2IGNoaXBzIG9yIG9sZGVyLAotICogY29tcGlsZSBmb3IgdGhhdCwgYW5kIHRoaXMgd2lsbCBqdXN0IGFsd2F5cyByZXR1cm4gemVyby4KLSAqIFRoYXQncyBvaywgaXQganVzdCBtZWFucyB0aGF0IHRoZSBuaWNlciBzY2hlZHVsaW5nIGhldXJpc3RpY3MKLSAqIHdvbid0IHdvcmsgZm9yIHlvdS4KLSAqCi0gKiBXZSBvbmx5IHVzZSB0aGUgbG93IDMyIGJpdHMsIGFuZCB3ZSdkIHNpbXBseSBiZXR0ZXIgbWFrZSBzdXJlCi0gKiB0aGF0IHdlIHJlc2NoZWR1bGUgYmVmb3JlIHRoYXQgd3JhcHMuIFNjaGVkdWxpbmcgYXQgbGVhc3QgZXZlcnkKLSAqIGZvdXIgYmlsbGlvbiBjeWNsZXMganVzdCBiYXNpY2FsbHkgc291bmRzIGxpa2UgYSBnb29kIGlkZWEsCi0gKiByZWdhcmRsZXNzIG9mIGhvdyBmYXN0IHRoZSBtYWNoaW5lIGlzLgotICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfdDsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OwotZXh0ZXJuIHVuc2lnbmVkIGludCB0c2Nfa2h6OwotCi1zdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gMDsKLQotI2lmbmRlZiBDT05GSUdfWDg2X1RTQwotCWlmICghY3B1X2hhc190c2MpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19YODZfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfWDg2X1RTQykKLQlyZHRzY2xsKHJldCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi1leHRlcm4gdm9pZCB0c2NfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpOwotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20teDg2XzY0L3RzYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ocGV0LmgKaW5kZXggYjM5MDk4NC4uNTlhNjZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaHBldC5oCkBAIC01Niw4ICs1NiwxNSBAQAogZXh0ZXJuIGludCBpc19ocGV0X2VuYWJsZWQodm9pZCk7CiBleHRlcm4gaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGFwaWNfaXNfY2x1c3RlcmVkX2JveCh2b2lkKTsKK2V4dGVybiBpbnQgaHBldF9hcmNoX2luaXQodm9pZCk7CitleHRlcm4gaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKTsKK2V4dGVybiBpbnQgaHBldF9yZWVuYWJsZSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaHBldF9jYWxpYnJhdGVfdHNjKHZvaWQpOwogCiBleHRlcm4gaW50IGhwZXRfdXNlX3RpbWVyOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CiAKICNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwogZXh0ZXJuIGludCBocGV0X21hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IGE2ZDJmZjUuLmY1NGYzYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCkBAIC00NSwxMSArNDUsNyBAQAogI2Vsc2UKICNkZWZpbmUgcG10bXJfaW9wb3J0IDAKICNlbmRpZgotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKLWV4dGVybiBpbnQgc3lzY3RsX3ZzeXNjYWxsOwogZXh0ZXJuIGludCBub2hwZXQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB2eHRpbWVfaHo7Ci1leHRlcm4gdm9pZCB0aW1lX2luaXRfZ3RvZCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZWFybHlfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDEsMikpKTsKIApAQCAtOTEsOCArODcsNiBAQAogCiBleHRlcm4gaW50IHVuaGFuZGxlZF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpOwogCi1leHRlcm4gaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKTsKLQogZXh0ZXJuIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0YWJsZV9zdGFydCwgdGFibGVfZW5kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RpbWV4LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAppbmRleCBiOWU1MzIwLi44YzY4MDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaApAQCAtMTIsMzggKzEyLDIxIEBACiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90c2MuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQlQSVRfVElDS19SQVRFCS8qIFVuZGVybHlpbmcgSFogKi8KIAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzX3Q7Ci0KLXN0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OwotCi0JcmR0c2NsbChyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIExpa2UgZ2V0X2N5Y2xlcywgYnV0IG1ha2Ugc3VyZSB0aGUgQ1BVIGlzIHN5bmNocm9uaXplZC4gKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlc19zeW5jKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJldDsKLQl1bnNpZ25lZCBlYXg7Ci0JLyogRG9uJ3QgZG8gYW4gYWRkaXRpb25hbCBzeW5jIG9uIENQVXMgd2hlcmUgd2Uga25vdwotCSAgIFJEVFNDIGlzIGFscmVhZHkgc3luY2hyb25vdXMuICovCi0JYWx0ZXJuYXRpdmVfaW8oImNwdWlkIiwgQVNNX05PUDIsIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsCi0JCQkgICI9YSIgKGVheCksICIwIiAoMSkgOiAiZWJ4IiwiZWN4IiwiZWR4IiwibWVtb3J5Iik7Ci0JcmR0c2NsbChyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3B1X2toejsKLQogZXh0ZXJuIGludCByZWFkX2N1cnJlbnRfdGltZXIodW5zaWduZWQgbG9uZyAqdGltZXJfdmFsdWUpOwogI2RlZmluZSBBUkNIX0hBU19SRUFEX0NVUlJFTlRfVElNRVIJMQogCi1leHRlcm4gc3RydWN0IHZ4dGltZV9kYXRhIHZ4dGltZTsKKyNkZWZpbmUgVVNFQ19QRVJfVElDSyAoVVNFQ19QRVJfU0VDIC8gSFopCisjZGVmaW5lIE5TRUNfUEVSX1RJQ0sgKE5TRUNfUEVSX1NFQyAvIEhaKQorI2RlZmluZSBGU0VDX1BFUl9USUNLIChGU0VDX1BFUl9TRUMgLyBIWikKIAorI2RlZmluZSBOU19TQ0FMRSAgICAgICAgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLworI2RlZmluZSBVU19TQ0FMRSAgICAgICAgMzIgLyogMl4zMiwgYXJiaXRyYWxyaWx5IGNob3NlbiAqLworCitleHRlcm4gdm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBraHopOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdHNjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwYTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90c2MuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teDg2XzY0L3RzYy5oCisgKgorICogeDg2XzY0IFRTQyByZWxhdGVkIGZ1bmN0aW9ucworICovCisjaWZuZGVmIF9BU01feDg2XzY0X1RTQ19ICisjZGVmaW5lIF9BU01feDg2XzY0X1RTQ19ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBTdGFuZGFyZCB3YXkgdG8gYWNjZXNzIHRoZSBjeWNsZSBjb3VudGVyLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfdDsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OworZXh0ZXJuIHVuc2lnbmVkIGludCB0c2Nfa2h6OworCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gMDsKKworI2lmbmRlZiBDT05GSUdfWDg2X1RTQworCWlmICghY3B1X2hhc190c2MpCisJCXJldHVybiAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfWDg2X1RTQykKKwlyZHRzY2xsKHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBMaWtlIGdldF9jeWNsZXMsIGJ1dCBtYWtlIHN1cmUgdGhlIENQVSBpcyBzeW5jaHJvbml6ZWQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXNfc3luYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7CisjaWZkZWYgWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQworCXVuc2lnbmVkIGVheDsKKworCS8qCisJICogRG9uJ3QgZG8gYW4gYWRkaXRpb25hbCBzeW5jIG9uIENQVXMgd2hlcmUgd2Uga25vdworCSAqIFJEVFNDIGlzIGFscmVhZHkgc3luY2hyb25vdXM6CisJICovCisJYWx0ZXJuYXRpdmVfaW8oImNwdWlkIiwgQVNNX05PUDIsIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsCisJCQkgICI9YSIgKGVheCksICIwIiAoMSkgOiAiZWJ4IiwiZWN4IiwiZWR4IiwibWVtb3J5Iik7CisjZWxzZQorCXN5bmNfY29yZSgpOworI2VuZGlmCisJcmR0c2NsbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworZXh0ZXJuIHZvaWQgdHNjX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpOworCisvKgorICogQm9vdC10aW1lIGNoZWNrIHdoZXRoZXIgdGhlIFRTQ3MgYXJlIHN5bmNocm9uaXplZCBhY3Jvc3MKKyAqIGFsbCBDUFVzL2NvcmVzOgorICovCitleHRlcm4gdm9pZCBjaGVja190c2Nfc3luY19zb3VyY2UoaW50IGNwdSk7CitleHRlcm4gdm9pZCBjaGVja190c2Nfc3luY190YXJnZXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAppbmRleCAwYzc4NDcxLi44MmI0YWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaApAQCAtMTYsNDYgKzE2LDI3IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KIAotI2RlZmluZSBfX3NlY3Rpb25fdnh0aW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLnZ4dGltZSIpLCBhbGlnbmVkKDE2KSkpCiAjZGVmaW5lIF9fc2VjdGlvbl92Z2V0Y3B1X21vZGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudmdldGNwdV9tb2RlIiksIGFsaWduZWQoMTYpKSkKICNkZWZpbmUgX19zZWN0aW9uX2ppZmZpZXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIuamlmZmllcyIpLCBhbGlnbmVkKDE2KSkpCi0jZGVmaW5lIF9fc2VjdGlvbl9zeXNfdHogX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIuc3lzX3R6IiksIGFsaWduZWQoMTYpKSkKLSNkZWZpbmUgX19zZWN0aW9uX3N5c2N0bF92c3lzY2FsbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi5zeXNjdGxfdnN5c2NhbGwiKSwgYWxpZ25lZCgxNikpKQotI2RlZmluZSBfX3NlY3Rpb25feHRpbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIueHRpbWUiKSwgYWxpZ25lZCgxNikpKQotI2RlZmluZSBfX3NlY3Rpb25feHRpbWVfbG9jayBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi54dGltZV9sb2NrIiksIGFsaWduZWQoMTYpKSkKIAotI2RlZmluZSBWWFRJTUVfVFNDCTEKLSNkZWZpbmUgVlhUSU1FX0hQRVQJMgotI2RlZmluZSBWWFRJTUVfUE1UTVIJMworLyogRGVmaW5pdGlvbnMgZm9yIENPTkZJR19HRU5FUklDX1RJTUUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgX19zZWN0aW9uX3ZzeXNjYWxsX2d0b2RfZGF0YSBfX2F0dHJpYnV0ZV9fIFwKKwkoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudnN5c2NhbGxfZ3RvZF9kYXRhIiksYWxpZ25lZCgxNikpKQorI2RlZmluZSBfX3ZzeXNjYWxsX2ZuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsX19zZWN0aW9uX18oIi52c3lzY2FsbF9mbiIpKSkKIAogI2RlZmluZSBWR0VUQ1BVX1JEVFNDUAkxCiAjZGVmaW5lIFZHRVRDUFVfTFNMCTIKIAotc3RydWN0IHZ4dGltZV9kYXRhIHsKLQlsb25nIGhwZXRfYWRkcmVzczsJLyogSFBFVCBiYXNlIGFkZHJlc3MgKi8KLQlpbnQgbGFzdDsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHNjOwotCWxvbmcgcXVvdDsKLQlsb25nIHRzY19xdW90OwotCWludCBtb2RlOwotfTsKLQogI2RlZmluZSBocGV0X3JlYWRsKGEpICAgICAgICAgICByZWFkbCgoY29uc3Qgdm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSkgKyBhKQogI2RlZmluZSBocGV0X3dyaXRlbChkLGEpICAgICAgICB3cml0ZWwoZCwgKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpICsgYSkKIAotLyogdnN5c2NhbGwgc3BhY2UgKHJlYWRvbmx5KSAqLwotZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSBfX3Z4dGltZTsKIGV4dGVybiBpbnQgX192Z2V0Y3B1X21vZGU7Ci1leHRlcm4gc3RydWN0IHRpbWVzcGVjIF9feHRpbWU7CiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ppZmZpZXM7Ci1leHRlcm4gc3RydWN0IHRpbWV6b25lIF9fc3lzX3R6OwotZXh0ZXJuIHNlcWxvY2tfdCBfX3h0aW1lX2xvY2s7CiAKIC8qIGtlcm5lbCBzcGFjZSAod3JpdGVhYmxlKSAqLwotZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSB2eHRpbWU7CiBleHRlcm4gaW50IHZnZXRjcHVfbW9kZTsKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotZXh0ZXJuIGludCBzeXNjdGxfdnN5c2NhbGw7CitleHRlcm4gc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YV90IHZzeXNjYWxsX2d0b2RfZGF0YTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpX3BtdG1yLmggYi9pbmNsdWRlL2xpbnV4L2FjcGlfcG10bXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBlZjFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpX3BtdG1yLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfQUNQSV9QTVRNUl9IXworI2RlZmluZSBfQUNQSV9QTVRNUl9IXworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisKKy8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKyNkZWZpbmUgQUNQSV9QTV9NQVNLIENMT0NLU09VUkNFX01BU0soMjQpCisKKy8qIE92ZXJydW4gdmFsdWUgKi8KKyNkZWZpbmUgQUNQSV9QTV9PVlJSVU4JKDE8PDI0KQorCisjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgorCitleHRlcm4gdTMyIGFjcGlfcG1fcmVhZF92ZXJpZmllZCh2b2lkKTsKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworCitzdGF0aWMgaW5saW5lIHUzMiBhY3BpX3BtX3JlYWRfZWFybHkodm9pZCkKK3sKKwlpZiAoIXBtdG1yX2lvcG9ydCkKKwkJcmV0dXJuIDA7CisJLyogbWFzayB0aGUgb3V0cHV0IHRvIDI0IGJpdHMgKi8KKwlyZXR1cm4gYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKCkgJiBBQ1BJX1BNX01BU0s7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFjcGlfcG1fcmVhZF9lYXJseSh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaCBiL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaAppbmRleCBhNWM4YmI1Li5hYmM1MjFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCkBAIC04NywxMCArODcsMTUgQEAKIAl1MzIgcGh5c2ljYWw7CiAJdTggaXNfYm91bmQ7CiAJdTggaXNfZmx1c2hlZDsKKyAgICAgICAgdTggdm1hbGxvY19mbGFnOwogfTsKIAogI2RlZmluZSBBR1BfTk9STUFMX01FTU9SWSAwCiAKKyNkZWZpbmUgQUdQX1VTRVJfVFlQRVMgKDEgPDwgMTYpCisjZGVmaW5lIEFHUF9VU0VSX01FTU9SWSAoQUdQX1VTRVJfVFlQRVMpCisjZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlkgKEFHUF9VU0VSX1RZUEVTICsgMSkKKwogZXh0ZXJuIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhZ3BfYnJpZGdlczsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE3ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qICBsaW51eC9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgY2xvY2tjaGlwcy4KKyAqCisgKiAgSWYgeW91IGFyZSBub3QgYSBjbG9ja2NoaXAsIG9yIHRoZSB0aW1lIG9mIGRheSBjb2RlLCB5b3Ugc2hvdWxkCisgKiAgbm90IGJlIGluY2x1ZGluZyB0aGlzIGZpbGUhCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NMT0NLQ0hJUFNfSAorI2RlZmluZSBfTElOVVhfQ0xPQ0tDSElQU19ICisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlOworCisvKiBDbG9jayBldmVudCBtb2RlIGNvbW1hbmRzICovCitlbnVtIGNsb2NrX2V2ZW50X21vZGUgeworCUNMT0NLX0VWVF9NT0RFX1VOVVNFRCA9IDAsCisJQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sCisJQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsCisJQ0xPQ0tfRVZUX01PREVfT05FU0hPVCwKK307CisKKy8qIENsb2NrIGV2ZW50IG5vdGlmaWNhdGlvbiB2YWx1ZXMgKi8KK2VudW0gY2xvY2tfZXZlbnRfbm9maXRpZXJzIHsKKwlDTE9DS19FVlRfTk9USUZZX0FERCwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PTiwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkYsCisJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsCisJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwKKwlDTE9DS19FVlRfTk9USUZZX1NVU1BFTkQsCisJQ0xPQ0tfRVZUX05PVElGWV9SRVNVTUUsCisJQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwKK307CisKKy8qCisgKiBDbG9jayBldmVudCBmZWF0dXJlcworICovCisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX1BFUklPRElDCQkweDAwMDAwMQorI2RlZmluZSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCQkweDAwMDAwMgorLyoKKyAqIHg4Nig2NCkgc3BlY2lmaWMgbWlzZmVhdHVyZXM6CisgKgorICogLSBDbG9ja2V2ZW50IHNvdXJjZSBzdG9wcyBpbiBDMyBTdGF0ZSBhbmQgbmVlZHMgYnJvYWRjYXN0IHN1cHBvcnQuCisgKiAtIExvY2FsIEFQSUMgdGltZXIgaXMgdXNlZCBhcyBhIGR1bW15IGRldmljZS4KKyAqLworI2RlZmluZSBDTE9DS19FVlRfRkVBVF9DM1NUT1AJCTB4MDAwMDA0CisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX0RVTU1ZCQkweDAwMDAwOAorCisvKioKKyAqIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgLSBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgorICogQG5hbWU6CQlwdHIgdG8gY2xvY2sgZXZlbnQgbmFtZQorICogQGhpbnRzOgkJdXNhZ2UgaGludHMKKyAqIEBtYXhfZGVsdGFfbnM6CW1heGltdW0gZGVsdGEgdmFsdWUgaW4gbnMKKyAqIEBtaW5fZGVsdGFfbnM6CW1pbmltdW0gZGVsdGEgdmFsdWUgaW4gbnMKKyAqIEBtdWx0OgkJbmFub3NlY29uZCB0byBjeWNsZXMgbXVsdGlwbGllcgorICogQHNoaWZ0OgkJbmFub3NlY29uZHMgdG8gY3ljbGVzIGRpdmlzb3IgKHBvd2VyIG9mIHR3bykKKyAqIEByYXRpbmc6CQl2YXJpYWJsZSB0byByYXRlIGNsb2NrIGV2ZW50IGRldmljZXMKKyAqIEBpcnE6CQlpcnEgbnVtYmVyIChvbmx5IGZvciBub24gY3B1IGxvY2FsIGRldmljZXMpCisgKiBAY3B1bWFzazoJCWNwdW1hc2sgdG8gaW5kaWNhdGUgZm9yIHdoaWNoIGNwdXMgdGhpcyBkZXZpY2Ugd29ya3MKKyAqIEBzZXRfbmV4dF9ldmVudDoJc2V0IG5leHQgZXZlbnQKKyAqIEBzZXRfbW9kZToJCXNldCBtb2RlIGZ1bmN0aW9uCisgKiBAZXZ0aGFuZGxlcjoJCUFzc2lnbmVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYmUgY2FsbGVkIGJ5IHRoZSBsb3cKKyAqCQkJbGV2ZWwgaGFuZGxlciBvZiB0aGUgZXZlbnQgc291cmNlCisgKiBAYnJvYWRjYXN0OgkJZnVuY3Rpb24gdG8gYnJvYWRjYXN0IGV2ZW50cworICogQGxpc3Q6CQlsaXN0IGhlYWQgZm9yIHRoZSBtYW5hZ2VtZW50IGNvZGUKKyAqIEBtb2RlOgkJb3BlcmF0aW5nIG1vZGUgYXNzaWduZWQgYnkgdGhlIG1hbmFnZW1lbnQgY29kZQorICogQG5leHRfZXZlbnQ6CQlsb2NhbCBzdG9yYWdlIGZvciB0aGUgbmV4dCBldmVudCBpbiBvbmVzaG90IG1vZGUKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSB7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJdW5zaWduZWQgaW50CQlmZWF0dXJlczsKKwl1bnNpZ25lZCBsb25nCQltYXhfZGVsdGFfbnM7CisJdW5zaWduZWQgbG9uZwkJbWluX2RlbHRhX25zOworCXVuc2lnbmVkIGxvbmcJCW11bHQ7CisJaW50CQkJc2hpZnQ7CisJaW50CQkJcmF0aW5nOworCWludAkJCWlycTsKKwljcHVtYXNrX3QJCWNwdW1hc2s7CisJaW50CQkJKCpzZXRfbmV4dF9ldmVudCkodW5zaWduZWQgbG9uZyBldnQsCisJCQkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJdm9pZAkJCSgqc2V0X21vZGUpKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCQkgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwl2b2lkCQkJKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCXZvaWQJCQkoKmJyb2FkY2FzdCkoY3B1bWFza190IG1hc2spOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwllbnVtIGNsb2NrX2V2ZW50X21vZGUJbW9kZTsKKwlrdGltZV90CQkJbmV4dF9ldmVudDsKK307CisKKy8qCisgKiBDYWxjdWxhdGUgYSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIHNjYWxlZCBtYXRoLCB3aGljaCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAqIG5hbm9zZWNvbmRzIGJhc2VkIHZhbHVlcyB0byBjbG9jayB0aWNrczoKKyAqCisgKiBjbG9ja190aWNrcyA9IChuYW5vc2Vjb25kcyAqIGZhY3RvcikgPj4gc2hpZnQuCisgKgorICogZGl2X3NjIGlzIHRoZSByZWFycmFuZ2VkIGVxdWF0aW9uIHRvIGNhbGN1bGF0ZSBhIGZhY3RvciBmcm9tIGEgZ2l2ZW4gY2xvY2sKKyAqIHRpY2tzIC8gbmFub3NlY29uZHMgcmF0aW86CisgKgorICogZmFjdG9yID0gKGNsb2NrX3RpY2tzIDw8IHNoaWZ0KSAvIG5hbm9zZWNvbmRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkaXZfc2ModW5zaWduZWQgbG9uZyB0aWNrcywgdW5zaWduZWQgbG9uZyBuc2VjLAorCQkJCSAgIGludCBzaGlmdCkKK3sKKwl1aW50NjRfdCB0bXAgPSAoKHVpbnQ2NF90KXRpY2tzKSA8PCBzaGlmdDsKKworCWRvX2Rpdih0bXAsIG5zZWMpOworCXJldHVybiAodW5zaWduZWQgbG9uZykgdG1wOworfQorCisvKiBDbG9jayBldmVudCBsYXllciBmdW5jdGlvbnMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGNsb2NrZXZlbnRfZGVsdGEybnModW5zaWduZWQgbG9uZyBsYXRjaCwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KTsKK2V4dGVybgorc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAorCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spOworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3NldF9tb2RlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkgZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUpOworZXh0ZXJuIGludCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCSAgICAga3RpbWVfdCBleHBpcmVzLCBrdGltZV90IG5vdyk7CisKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX3Jlc3VtZV9ldmVudHModm9pZCkgeyB9CisjZGVmaW5lIGNsb2NrZXZlbnRzX25vdGlmeShyZWFzb24sIGFyZykgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKaW5kZXggMTYyMmQyMy4uZGFhNDk0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaApAQCAtMTIsMTEgKzEyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qIGNsb2Nrc291cmNlIGN5Y2xlIGJhc2UgdHlwZSAqLwogdHlwZWRlZiB1NjQgY3ljbGVfdDsKK3N0cnVjdCBjbG9ja3NvdXJjZTsKIAogLyoqCiAgKiBzdHJ1Y3QgY2xvY2tzb3VyY2UgLSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBmb3IgYSBmcmVlIHJ1bm5pbmcgY291bnRlcgpAQCAtNDQsOCArNDYsOCBAQAogICoJCQlzdWJ0cmFjdGlvbiBvZiBub24gNjQgYml0IGNvdW50ZXJzCiAgKiBAbXVsdDoJCWN5Y2xlIHRvIG5hbm9zZWNvbmQgbXVsdGlwbGllcgogICogQHNoaWZ0OgkJY3ljbGUgdG8gbmFub3NlY29uZCBkaXZpc29yIChwb3dlciBvZiB0d28pCi0gKiBAdXBkYXRlX2NhbGxiYWNrOgljYWxsZWQgd2hlbiBzYWZlIHRvIGFsdGVyIGNsb2Nrc291cmNlIHZhbHVlcwotICogQGlzX2NvbnRpbnVvdXM6CWRlZmluZXMgaWYgY2xvY2tzb3VyY2UgaXMgZnJlZS1ydW5uaW5nLgorICogQGZsYWdzOgkJZmxhZ3MgZGVzY3JpYmluZyBzcGVjaWFsIHByb3BlcnRpZXMKKyAqIEB2cmVhZDoJCXZzeXNjYWxsIGJhc2VkIHJlYWQKICAqIEBjeWNsZV9pbnRlcnZhbDoJVXNlZCBpbnRlcm5hbGx5IGJ5IHRpbWVrZWVwaW5nIGNvcmUsIHBsZWFzZSBpZ25vcmUuCiAgKiBAeHRpbWVfaW50ZXJ2YWw6CVVzZWQgaW50ZXJuYWxseSBieSB0aW1la2VlcGluZyBjb3JlLCBwbGVhc2UgaWdub3JlLgogICovCkBAIC01NywxNSArNTksMzAgQEAKIAljeWNsZV90IG1hc2s7CiAJdTMyIG11bHQ7CiAJdTMyIHNoaWZ0OwotCWludCAoKnVwZGF0ZV9jYWxsYmFjaykodm9pZCk7Ci0JaW50IGlzX2NvbnRpbnVvdXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljeWNsZV90ICgqdnJlYWQpKHZvaWQpOwogCiAJLyogdGltZWtlZXBpbmcgc3BlY2lmaWMgZGF0YSwgaWdub3JlICovCiAJY3ljbGVfdCBjeWNsZV9sYXN0LCBjeWNsZV9pbnRlcnZhbDsKIAl1NjQgeHRpbWVfbnNlYywgeHRpbWVfaW50ZXJ2YWw7CiAJczY0IGVycm9yOworCisjaWZkZWYgQ09ORklHX0NMT0NLU09VUkNFX1dBVENIRE9HCisJLyogV2F0Y2hkb2cgcmVsYXRlZCBkYXRhLCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHdkX2xpc3Q7CisJY3ljbGVfdCB3ZF9sYXN0OworI2VuZGlmCiB9OwogCisvKgorICogQ2xvY2sgc291cmNlIGZsYWdzIGJpdHM6OgorICovCisjZGVmaW5lIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTCQkweDAxCisjZGVmaW5lIENMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWQkJMHgwMgorCisjZGVmaW5lIENMT0NLX1NPVVJDRV9XQVRDSERPRwkJCTB4MTAKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTCQkweDIwCisKIC8qIHNpbXBsaWZ5IGluaXRpYWxpemF0aW9uIG9mIG1hc2sgZmllbGQgKi8KICNkZWZpbmUgQ0xPQ0tTT1VSQ0VfTUFTSyhiaXRzKSAoY3ljbGVfdCkoYml0czw2NCA/ICgoMVVMTDw8Yml0cyktMSkgOiAtMSkKIApAQCAtMTc4LDggKzE5NSwxNiBAQAogCiAKIC8qIHVzZWQgdG8gaW5zdGFsbCBhIG5ldyBjbG9ja3NvdXJjZSAqLwotaW50IGNsb2Nrc291cmNlX3JlZ2lzdGVyKHN0cnVjdCBjbG9ja3NvdXJjZSopOwotdm9pZCBjbG9ja3NvdXJjZV9yZXNlbGVjdCh2b2lkKTsKLXN0cnVjdCBjbG9ja3NvdXJjZSogY2xvY2tzb3VyY2VfZ2V0X25leHQodm9pZCk7CitleHRlcm4gaW50IGNsb2Nrc291cmNlX3JlZ2lzdGVyKHN0cnVjdCBjbG9ja3NvdXJjZSopOworZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSogY2xvY2tzb3VyY2VfZ2V0X25leHQodm9pZCk7CitleHRlcm4gdm9pZCBjbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIGludCByYXRpbmcpOworCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTAorZXh0ZXJuIHZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBjbG9ja3NvdXJjZSAqYyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCit7Cit9CisjZW5kaWYKIAogI2VuZGlmIC8qIF9MSU5VWF9DTE9DS1NPVVJDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDdmMDA4ZjYuLjA4OTllMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC04NCw5ICs4NCw2IEBACiAgICAgICAgIHVuc2lnbmVkIGludAkJcG9saWN5OyAvKiBzZWUgYWJvdmUgKi8KIAlzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vcgkqZ292ZXJub3I7IC8qIHNlZSBiZWxvdyAqLwogCi0gCXN0cnVjdCBtdXRleAkJbG9jazsgICAvKiBDUFUgLT5zZXRwb2xpY3kgb3IgLT50YXJnZXQgbWF5Ci0JCQkJCSAgIG9ubHkgYmUgY2FsbGVkIG9uY2UgYSB0aW1lICovCi0KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdXBkYXRlOyAvKiBpZiB1cGRhdGVfcG9saWN5KCkgbmVlZHMgdG8gYmUKIAkJCQkJICogY2FsbGVkLCBidXQgeW91J3JlIGluIElSUSBjb250ZXh0ICovCiAKQEAgLTE3MiwxMSArMTY5LDE2IEBACiAJCQkJICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKTsKIAogCi1leHRlcm4gaW50IGNwdWZyZXFfZHJpdmVyX2dldGF2ZyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CitleHRlcm4gaW50IF9fY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKIAogaW50IGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmdvdmVybm9yKTsKIHZvaWQgY3B1ZnJlcV91bnJlZ2lzdGVyX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpnb3Zlcm5vcik7CiAKK2ludCBsb2NrX3BvbGljeV9yd3NlbV9yZWFkKGludCBjcHUpOworaW50IGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGludCBjcHUpOwordm9pZCB1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoaW50IGNwdSk7Cit2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgQ1BVRlJFUSBEUklWRVIgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmggYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAppbmRleCA2MTI0NzJhLi43ODAzMDE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaApAQCAtMTA2LDcgKzEwNiw3IEBACiAgKiBhbHdheXMgYmFsYW5jZWQsIHNvIHRoZSBpbnRlcnJ1cHRlZCB2YWx1ZSBvZiAtPmhhcmRpcnFfY29udGV4dAogICogd2lsbCBhbHdheXMgYmUgcmVzdG9yZWQuCiAgKi8KLSNkZWZpbmUgaXJxX2VudGVyKCkJCQkJCVwKKyNkZWZpbmUgX19pcnFfZW50ZXIoKQkJCQkJXAogCWRvIHsJCQkJCQlcCiAJCWFjY291bnRfc3lzdGVtX3Z0aW1lKGN1cnJlbnQpOwkJXAogCQlhZGRfcHJlZW1wdF9jb3VudChIQVJESVJRX09GRlNFVCk7CVwKQEAgLTExNCw2ICsxMTQsMTEgQEAKIAl9IHdoaWxlICgwKQogCiAvKgorICogRW50ZXIgaXJxIGNvbnRleHQgKG9uIE5PX0haLCB1cGRhdGUgamlmZmllcyk6CisgKi8KK2V4dGVybiB2b2lkIGlycV9lbnRlcih2b2lkKTsKKworLyoKICAqIEV4aXQgaXJxIGNvbnRleHQgd2l0aG91dCBwcm9jZXNzaW5nIHNvZnRpcnFzOgogICovCiAjZGVmaW5lIF9faXJxX2V4aXQoKQkJCQkJXApAQCAtMTI4LDcgKzEzMyw3IEBACiAgKi8KIGV4dGVybiB2b2lkIGlycV9leGl0KHZvaWQpOwogCi0jZGVmaW5lIG5taV9lbnRlcigpCQlkbyB7IGxvY2tkZXBfb2ZmKCk7IGlycV9lbnRlcigpOyB9IHdoaWxlICgwKQorI2RlZmluZSBubWlfZW50ZXIoKQkJZG8geyBsb2NrZGVwX29mZigpOyBfX2lycV9lbnRlcigpOyB9IHdoaWxlICgwKQogI2RlZmluZSBubWlfZXhpdCgpCQlkbyB7IF9faXJxX2V4aXQoKTsgbG9ja2RlcF9vbigpOyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogTElOVVhfSEFSRElSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IGZjYTkzMDIuLjM3ZjkyNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0yMSwyMiArMjEsNzIgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlOworc3RydWN0IGhydGltZXJfY3B1X2Jhc2U7CisKIC8qCiAgKiBNb2RlIGFyZ3VtZW50cyBvZiB4eHhfaHJ0aW1lciBmdW5jdGlvbnM6CiAgKi8KIGVudW0gaHJ0aW1lcl9tb2RlIHsKLQlIUlRJTUVSX0FCUywJLyogVGltZSB2YWx1ZSBpcyBhYnNvbHV0ZSAqLwotCUhSVElNRVJfUkVMLAkvKiBUaW1lIHZhbHVlIGlzIHJlbGF0aXZlIHRvIG5vdyAqLworCUhSVElNRVJfTU9ERV9BQlMsCS8qIFRpbWUgdmFsdWUgaXMgYWJzb2x1dGUgKi8KKwlIUlRJTUVSX01PREVfUkVMLAkvKiBUaW1lIHZhbHVlIGlzIHJlbGF0aXZlIHRvIG5vdyAqLwogfTsKIAorLyoKKyAqIFJldHVybiB2YWx1ZXMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICovCiBlbnVtIGhydGltZXJfcmVzdGFydCB7Ci0JSFJUSU1FUl9OT1JFU1RBUlQsCi0JSFJUSU1FUl9SRVNUQVJULAorCUhSVElNRVJfTk9SRVNUQVJULAkvKiBUaW1lciBpcyBub3QgcmVzdGFydGVkICovCisJSFJUSU1FUl9SRVNUQVJULAkvKiBUaW1lciBtdXN0IGJlIHJlc3RhcnRlZCAqLwogfTsKIAotI2RlZmluZSBIUlRJTUVSX0lOQUNUSVZFCSgodm9pZCAqKTFVTCkKKy8qCisgKiBocnRpbWVyIGNhbGxiYWNrIG1vZGVzOgorICoKKyAqCUhSVElNRVJfQ0JfU09GVElSUToJCUNhbGxiYWNrIG11c3QgcnVuIGluIHNvZnRpcnEgY29udGV4dAorICoJSFJUSU1FUl9DQl9JUlFTQUZFOgkJQ2FsbGJhY2sgbWF5IHJ1biBpbiBoYXJkaXJxIGNvbnRleHQKKyAqCUhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJUOglDYWxsYmFjayBtYXkgcnVuIGluIGhhcmRpcnEgY29udGV4dCBhbmQKKyAqCQkJCQlkb2VzIG5vdCByZXN0YXJ0IHRoZSB0aW1lcgorICoJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE6CUNhbGxiYWNrIG11c3QgcnVuIGluIHNvZnRpcnEgY29udGV4dAorICoJCQkJCVNwZWNpYWwgbW9kZSBmb3IgdGljayBlbXVsdGF0aW9uCisgKi8KK2VudW0gaHJ0aW1lcl9jYl9tb2RlIHsKKwlIUlRJTUVSX0NCX1NPRlRJUlEsCisJSFJUSU1FUl9DQl9JUlFTQUZFLAorCUhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJULAorCUhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJRLAorfTsKIAotc3RydWN0IGhydGltZXJfYmFzZTsKKy8qCisgKiBWYWx1ZXMgdG8gdHJhY2sgc3RhdGUgb2YgdGhlIHRpbWVyCisgKgorICogUG9zc2libGUgc3RhdGVzOgorICoKKyAqIDB4MDAJCWluYWN0aXZlCisgKiAweDAxCQllbnF1ZXVlZCBpbnRvIHJidHJlZQorICogMHgwMgkJY2FsbGJhY2sgZnVuY3Rpb24gcnVubmluZworICogMHgwNAkJY2FsbGJhY2sgcGVuZGluZyAoaGlnaCByZXNvbHV0aW9uIG1vZGUpCisgKgorICogU3BlY2lhbCBjYXNlOgorICogMHgwMwkJY2FsbGJhY2sgZnVuY3Rpb24gcnVubmluZyBhbmQgZW5xdWV1ZWQKKyAqCQkod2FzIHJlcXVldWVkIG9uIGFub3RoZXIgQ1BVKQorICogVGhlICJjYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nIGFuZCBlbnF1ZXVlZCIgc3RhdHVzIGlzIG9ubHkgcG9zc2libGUgb24KKyAqIFNNUC4gSXQgaGFwcGVucyBmb3IgZXhhbXBsZSB3aGVuIGEgcG9zaXggdGltZXIgZXhwaXJlZCBhbmQgdGhlIGNhbGxiYWNrCisgKiBxdWV1ZWQgYSBzaWduYWwuIEJldHdlZW4gZHJvcHBpbmcgdGhlIGxvY2sgd2hpY2ggcHJvdGVjdHMgdGhlIHBvc2l4IHRpbWVyCisgKiBhbmQgcmVhY3F1aXJpbmcgdGhlIGJhc2UgbG9jayBvZiB0aGUgaHJ0aW1lciwgYW5vdGhlciBDUFUgY2FuIGRlbGl2ZXIgdGhlCisgKiBzaWduYWwgYW5kIHJlYXJtIHRoZSB0aW1lci4gV2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgY2FsbGJhY2sgcnVubmluZyBzdGF0ZSwKKyAqIGFzIG90aGVyd2lzZSB0aGUgdGltZXIgY291bGQgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIHNvZnRpcnEgY29kZSBmaW5pc2hlcyB0aGUKKyAqIHRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIuCisgKgorICogVGhlIEhSVElNRVJfU1RBVEVfRU5RVUVVRSBiaXQgaXMgYWx3YXlzIG9yJ2VkIHRvIHRoZSBjdXJyZW50IHN0YXRlIHRvCisgKiBwcmVzZXJ2ZSB0aGUgSFJUSU1FUl9TVEFURV9DQUxMQkFDSyBiaXQgaW4gdGhlIGFib3ZlIHNjZW5hcmlvLgorICoKKyAqIEFsbCBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgcHJvdGVjdGVkIGJ5IGNwdV9iYXNlLT5sb2NrLgorICovCisjZGVmaW5lIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUJMHgwMAorI2RlZmluZSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVECTB4MDEKKyNkZWZpbmUgSFJUSU1FUl9TVEFURV9DQUxMQkFDSwkweDAyCisjZGVmaW5lIEhSVElNRVJfU1RBVEVfUEVORElORwkweDA0CiAKIC8qKgogICogc3RydWN0IGhydGltZXIgLSB0aGUgYmFzaWMgaHJ0aW1lciBzdHJ1Y3R1cmUKQEAgLTQ2LDE0ICs5NiwzNCBAQAogICoJCXdoaWNoIHRoZSB0aW1lciBpcyBiYXNlZC4KICAqIEBmdW5jdGlvbjoJdGltZXIgZXhwaXJ5IGNhbGxiYWNrIGZ1bmN0aW9uCiAgKiBAYmFzZToJcG9pbnRlciB0byB0aGUgdGltZXIgYmFzZSAocGVyIGNwdSBhbmQgcGVyIGNsb2NrKQorICogQHN0YXRlOglzdGF0ZSBpbmZvcm1hdGlvbiAoU2VlIGJpdCB2YWx1ZXMgYWJvdmUpCisgKiBAY2JfbW9kZToJaGlnaCByZXNvbHV0aW9uIHRpbWVyIGZlYXR1cmUgdG8gc2VsZWN0IHRoZSBjYWxsYmFjayBleGVjdXRpb24KKyAqCQkgbW9kZQorICogQGNiX2VudHJ5OglsaXN0IGhlYWQgdG8gZW5xdWV1ZSBhbiBleHBpcmVkIHRpbWVyIGludG8gdGhlIGNhbGxiYWNrIGxpc3QKKyAqIEBzdGFydF9zaXRlOgl0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBzaXRlIHdoZXJlIHRoZSB0aW1lcgorICoJCXdhcyBzdGFydGVkCisgKiBAc3RhcnRfY29tbTogdGltZXIgc3RhdGlzdGljcyBmaWVsZCB0byBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB3aGljaAorICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCisgKiBAc3RhcnRfcGlkOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBwaWQgb2YgdGhlIHRhc2sgd2hpY2gKKyAqCQlzdGFydGVkIHRoZSB0aW1lcgogICoKLSAqIFRoZSBocnRpbWVyIHN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGluaXRfaHJ0aW1lcl8jQ0xPQ0tUWVBFKCkKKyAqIFRoZSBocnRpbWVyIHN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGhydGltZXJfaW5pdCgpCiAgKi8KIHN0cnVjdCBocnRpbWVyIHsKLQlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsKLQlrdGltZV90CQkJZXhwaXJlczsKLQlpbnQJCQkoKmZ1bmN0aW9uKShzdHJ1Y3QgaHJ0aW1lciAqKTsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlCSpiYXNlOworCXN0cnVjdCByYl9ub2RlCQkJbm9kZTsKKwlrdGltZV90CQkJCWV4cGlyZXM7CisJZW51bSBocnRpbWVyX3Jlc3RhcnQJCSgqZnVuY3Rpb24pKHN0cnVjdCBocnRpbWVyICopOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UJKmJhc2U7CisJdW5zaWduZWQgbG9uZwkJCXN0YXRlOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwllbnVtIGhydGltZXJfY2JfbW9kZQkJY2JfbW9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljYl9lbnRyeTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUworCXZvaWQJCQkJKnN0YXJ0X3NpdGU7CisJY2hhcgkJCQlzdGFydF9jb21tWzE2XTsKKwlpbnQJCQkJc3RhcnRfcGlkOworI2VuZGlmCiB9OwogCiAvKioKQEAgLTcwLDM3ICsxNDAsMTE0IEBACiAKIC8qKgogICogc3RydWN0IGhydGltZXJfYmFzZSAtIHRoZSB0aW1lciBiYXNlIGZvciBhIHNwZWNpZmljIGNsb2NrCi0gKiBAaW5kZXg6CQljbG9jayB0eXBlIGluZGV4IGZvciBwZXJfY3B1IHN1cHBvcnQgd2hlbiBtb3ZpbmcgYSB0aW1lcgotICoJCQl0byBhIGJhc2Ugb24gYW5vdGhlciBjcHUuCi0gKiBAbG9jazoJCWxvY2sgcHJvdGVjdGluZyB0aGUgYmFzZSBhbmQgYXNzb2NpYXRlZCB0aW1lcnMKKyAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhCisgKgkJCXRpbWVyIHRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KICAqIEBhY3RpdmU6CQlyZWQgYmxhY2sgdHJlZSByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgdGltZXJzCiAgKiBAZmlyc3Q6CQlwb2ludGVyIHRvIHRoZSB0aW1lciBub2RlIHdoaWNoIGV4cGlyZXMgZmlyc3QKICAqIEByZXNvbHV0aW9uOgkJdGhlIHJlc29sdXRpb24gb2YgdGhlIGNsb2NrLCBpbiBuYW5vc2Vjb25kcwogICogQGdldF90aW1lOgkJZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgY2xvY2sKICAqIEBnZXRfc29mdGlycV90aW1lOglmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHNvZnRpcnEKLSAqIEBjdXJyX3RpbWVyOgkJdGhlIHRpbWVyIHdoaWNoIGlzIGV4ZWN1dGluZyBhIGNhbGxiYWNrIHJpZ2h0IG5vdwogICogQHNvZnRpcnFfdGltZToJdGhlIHRpbWUgd2hlbiBydW5uaW5nIHRoZSBocnRpbWVyIHF1ZXVlIGluIHRoZSBzb2Z0aXJxCi0gKiBAbG9ja19rZXk6CQl0aGUgbG9ja19jbGFzc19rZXkgZm9yIHVzZSB3aXRoIGxvY2tkZXAKKyAqIEBjYl9wZW5kaW5nOgkJbGlzdCBvZiB0aW1lcnMgd2hlcmUgdGhlIGNhbGxiYWNrIGlzIHBlbmRpbmcKKyAqIEBvZmZzZXQ6CQlvZmZzZXQgb2YgdGhpcyBjbG9jayB0byB0aGUgbW9ub3RvbmljIGJhc2UKKyAqIEByZXByb2dyYW06CQlmdW5jdGlvbiB0byByZXByb2dyYW0gdGhlIHRpbWVyIGV2ZW50CiAgKi8KLXN0cnVjdCBocnRpbWVyX2Jhc2Ugeworc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSB7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UJKmNwdV9iYXNlOwogCWNsb2NraWRfdAkJaW5kZXg7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKIAlzdHJ1Y3QgcmJfcm9vdAkJYWN0aXZlOwogCXN0cnVjdCByYl9ub2RlCQkqZmlyc3Q7CiAJa3RpbWVfdAkJCXJlc29sdXRpb247CiAJa3RpbWVfdAkJCSgqZ2V0X3RpbWUpKHZvaWQpOwogCWt0aW1lX3QJCQkoKmdldF9zb2Z0aXJxX3RpbWUpKHZvaWQpOwotCXN0cnVjdCBocnRpbWVyCQkqY3Vycl90aW1lcjsKIAlrdGltZV90CQkJc29mdGlycV90aW1lOwotCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBsb2NrX2tleTsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJa3RpbWVfdAkJCW9mZnNldDsKKwlpbnQJCQkoKnJlcHJvZ3JhbSkoc3RydWN0IGhydGltZXIgKnQsCisJCQkJCSAgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYiwKKwkJCQkJICAgICBrdGltZV90IG4pOworI2VuZGlmCiB9OwogCisjZGVmaW5lIEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTIDIKKworLyoKKyAqIHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlIC0gdGhlIHBlciBjcHUgY2xvY2sgYmFzZXMKKyAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSBiYXNlIGFuZCBhc3NvY2lhdGVkIGNsb2NrIGJhc2VzCisgKgkJCWFuZCB0aW1lcnMKKyAqIEBsb2NrX2tleToJCXRoZSBsb2NrX2NsYXNzX2tleSBmb3IgdXNlIHdpdGggbG9ja2RlcAorICogQGNsb2NrX2Jhc2U6CQlhcnJheSBvZiBjbG9jayBiYXNlcyBmb3IgdGhpcyBjcHUKKyAqIEBjdXJyX3RpbWVyOgkJdGhlIHRpbWVyIHdoaWNoIGlzIGV4ZWN1dGluZyBhIGNhbGxiYWNrIHJpZ2h0IG5vdworICogQGV4cGlyZXNfbmV4dDoJYWJzb2x1dGUgdGltZSBvZiB0aGUgbmV4dCBldmVudCB3aGljaCB3YXMgc2NoZWR1bGVkCisgKgkJCXZpYSBjbG9ja19zZXRfbmV4dF9ldmVudCgpCisgKiBAaHJlc19hY3RpdmU6CVN0YXRlIG9mIGhpZ2ggcmVzb2x1dGlvbiBtb2RlCisgKiBAY2hlY2tfY2xvY2tzOglJbmRpY3RhdG9yLCB3aGVuIHNldCBldmFsdWF0ZSB0aW1lIHNvdXJjZSBhbmQgY2xvY2sKKyAqCQkJZXZlbnQgZGV2aWNlcyB3aGV0aGVyIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIGNhbiBiZQorICoJCQlhY3RpdmF0ZWQuCisgKiBAY2JfcGVuZGluZzoJCUV4cGlyZWQgdGltZXJzIGFyZSBtb3ZlZCBmcm9tIHRoZSByYnRyZWUgdG8gdGhpcworICoJCQlsaXN0IGluIHRoZSB0aW1lciBpbnRlcnJ1cHQuIFRoZSBsaXN0IGlzIHByb2Nlc3NlZAorICoJCQlpbiB0aGUgc29mdGlycS4KKyAqIEBucl9ldmVudHM6CQlUb3RhbCBudW1iZXIgb2YgdGltZXIgaW50ZXJydXB0IGV2ZW50cworICovCitzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSB7CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3RydWN0IGxvY2tfY2xhc3Nfa2V5CQlsb2NrX2tleTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlCWNsb2NrX2Jhc2VbSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVNdOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlrdGltZV90CQkJCWV4cGlyZXNfbmV4dDsKKwlpbnQJCQkJaHJlc19hY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZAkJY2JfcGVuZGluZzsKKwl1bnNpZ25lZCBsb25nCQkJbnJfZXZlbnRzOworI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZTsKKworZXh0ZXJuIHZvaWQgY2xvY2tfd2FzX3NldCh2b2lkKTsKK2V4dGVybiB2b2lkIGhydGltZXJfaW50ZXJydXB0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBJbiBoaWdoIHJlc29sdXRpb24gbW9kZSB0aGUgdGltZSByZWZlcmVuY2UgbXVzdCBiZSByZWFkIGFjY3VyYXRlCisgKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBocnRpbWVyX2NiX2dldF90aW1lKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPmJhc2UtPmdldF90aW1lKCk7Cit9CisKKy8qCisgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2tzLiBUaGUgcmVzb2x1dGlvbiB2YWx1ZSBpcyByZXR1cm5lZCBpbgorICogdGhlIGNsb2NrX2dldHJlcygpIHN5c3RlbSBjYWxsIHRvIGdpdmUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgYW4KKyAqIGlkZWEgb2YgdGhlIChpbilhY2N1cmFjeSBvZiB0aW1lcnMuIFRpbWVyIHZhbHVlcyBhcmUgcm91bmRlZCB1cCB0bworICogdGhpcyByZXNvbHV0aW9uIHZhbHVlcy4KKyAqLworIyBkZWZpbmUgS1RJTUVfSElHSF9SRVMJCShrdGltZV90KSB7IC50djY0ID0gMSB9CisjIGRlZmluZSBLVElNRV9NT05PVE9OSUNfUkVTCUtUSU1FX0hJR0hfUkVTCisKKyNlbHNlCisKKyMgZGVmaW5lIEtUSU1FX01PTk9UT05JQ19SRVMJS1RJTUVfTE9XX1JFUworCiAvKgogICogY2xvY2tfd2FzX3NldCgpIGlzIGEgTk9QIGZvciBub24tIGhpZ2gtcmVzb2x1dGlvbiBzeXN0ZW1zLiBUaGUKICAqIHRpbWUtc29ydGVkIG9yZGVyIGd1YXJhbnRlZXMgdGhhdCBhIHRpbWVyIGRvZXMgbm90IGV4cGlyZSBlYXJseSBhbmQKICAqIGlzIGV4cGlyZWQgaW4gdGhlIG5leHQgc29mdGlycSB3aGVuIHRoZSBjbG9jayB3YXMgYWR2YW5jZWQuCiAgKi8KLSNkZWZpbmUgY2xvY2tfd2FzX3NldCgpCQlkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tfd2FzX3NldCh2b2lkKSB7IH0KKworLyoKKyAqIEluIG5vbiBoaWdoIHJlc29sdXRpb24gbW9kZSB0aGUgdGltZSByZWZlcmVuY2UgaXMgdGFrZW4gZnJvbQorICogdGhlIGJhc2Ugc29mdGlycSB0aW1lIHZhcmlhYmxlLgorICovCitzdGF0aWMgaW5saW5lIGt0aW1lX3QgaHJ0aW1lcl9jYl9nZXRfdGltZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyLT5iYXNlLT5zb2Z0aXJxX3RpbWU7Cit9CisKKyNlbmRpZgorCitleHRlcm4ga3RpbWVfdCBrdGltZV9nZXQodm9pZCk7CitleHRlcm4ga3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKTsKIAogLyogRXhwb3J0ZWQgdGltZXIgZnVuY3Rpb25zOiAqLwogCkBAIC0xMTQsMTkgKzI2MSwzMyBAQAogZXh0ZXJuIGludCBocnRpbWVyX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogZXh0ZXJuIGludCBocnRpbWVyX3RyeV90b19jYW5jZWwoc3RydWN0IGhydGltZXIgKnRpbWVyKTsKIAotI2RlZmluZSBocnRpbWVyX3Jlc3RhcnQodGltZXIpIGhydGltZXJfc3RhcnQoKHRpbWVyKSwgKHRpbWVyKS0+ZXhwaXJlcywgSFJUSU1FUl9BQlMpCitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX3Jlc3RhcnQoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXJldHVybiBocnRpbWVyX3N0YXJ0KHRpbWVyLCB0aW1lci0+ZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCUyk7Cit9CiAKIC8qIFF1ZXJ5IHRpbWVyczogKi8KIGV4dGVybiBrdGltZV90IGhydGltZXJfZ2V0X3JlbWFpbmluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogZXh0ZXJuIGludCBocnRpbWVyX2dldF9yZXMoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKTsKIAotI2lmZGVmIENPTkZJR19OT19JRExFX0haCiBleHRlcm4ga3RpbWVfdCBocnRpbWVyX2dldF9uZXh0X2V2ZW50KHZvaWQpOwotI2VuZGlmCiAKKy8qCisgKiBBIHRpbWVyIGlzIGFjdGl2ZSwgd2hlbiBpdCBpcyBlbnF1ZXVlZCBpbnRvIHRoZSByYnRyZWUgb3IgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBpcyBydW5uaW5nLgorICovCiBzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2FjdGl2ZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0JcmV0dXJuIHJiX3BhcmVudCgmdGltZXItPm5vZGUpICE9ICZ0aW1lci0+bm9kZTsKKwlyZXR1cm4gdGltZXItPnN0YXRlICE9IEhSVElNRVJfU1RBVEVfSU5BQ1RJVkU7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2ssIHdoZXRoZXIgdGhlIHRpbWVyIGlzIG9uIG9uZSBvZiB0aGUgcXVldWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfaXNfcXVldWVkKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPnN0YXRlICYKKwkJKEhSVElNRVJfU1RBVEVfRU5RVUVVRUQgfCBIUlRJTUVSX1NUQVRFX1BFTkRJTkcpOwogfQogCiAvKiBGb3J3YXJkIGEgaHJ0aW1lciBzbyBpdCBleHBpcmVzIGFmdGVyIG5vdzogKi8KQEAgLTE0OSw0ICszMTAsNTMgQEAKIC8qIEJvb3R1cCBpbml0aWFsaXphdGlvbjogKi8KIGV4dGVybiB2b2lkIF9faW5pdCBocnRpbWVyc19pbml0KHZvaWQpOwogCisjaWYgQklUU19QRVJfTE9ORyA8IDY0CitleHRlcm4gdW5zaWduZWQgbG9uZyBrdGltZV9kaXZucyhjb25zdCBrdGltZV90IGt0LCBzNjQgZGl2KTsKKyNlbHNlIC8qIEJJVFNfUEVSX0xPTkcgPCA2NCAqLworIyBkZWZpbmUga3RpbWVfZGl2bnMoa3QsIGRpdikJCSh1bnNpZ25lZCBsb25nKSgoa3QpLnR2NjQgLyAoZGl2KSkKKyNlbmRpZgorCisvKiBTaG93IHBlbmRpbmcgdGltZXJzOiAqLworZXh0ZXJuIHZvaWQgc3lzcnFfdGltZXJfbGlzdF9zaG93KHZvaWQpOworCisvKgorICogVGltZXItc3RhdGlzdGljcyBpbmZvOgorICovCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisKK2V4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKKwkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSk7Cit9CisKK2V4dGVybiB2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkJCQkgdm9pZCAqYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXRpbWVyLT5zdGFydF9zaXRlID0gTlVMTDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKK30KKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IDVhOGJhMGIuLmU1ZWExNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtNDIsNiArNDIsOCBAQAogICogSVJRRl9TSEFSRUQgLSBhbGxvdyBzaGFyaW5nIHRoZSBpcnEgYW1vbmcgc2V2ZXJhbCBkZXZpY2VzCiAgKiBJUlFGX1BST0JFX1NIQVJFRCAtIHNldCBieSBjYWxsZXJzIHdoZW4gdGhleSBleHBlY3Qgc2hhcmluZyBtaXNtYXRjaGVzIHRvIG9jY3VyCiAgKiBJUlFGX1RJTUVSIC0gRmxhZyB0byBtYXJrIHRoaXMgaW50ZXJydXB0IGFzIHRpbWVyIGludGVycnVwdAorICogSVJRRl9QRVJDUFUgLSBJbnRlcnJ1cHQgaXMgcGVyIGNwdQorICogSVJRRl9OT0JBTEFOQ0lORyAtIEZsYWcgdG8gZXhjbHVkZSB0aGlzIGludGVycnVwdCBmcm9tIGlycSBiYWxhbmNpbmcKICAqLwogI2RlZmluZSBJUlFGX0RJU0FCTEVECQkweDAwMDAwMDIwCiAjZGVmaW5lIElSUUZfU0FNUExFX1JBTkRPTQkweDAwMDAwMDQwCkBAIC00OSw2ICs1MSw3IEBACiAjZGVmaW5lIElSUUZfUFJPQkVfU0hBUkVECTB4MDAwMDAxMDAKICNkZWZpbmUgSVJRRl9USU1FUgkJMHgwMDAwMDIwMAogI2RlZmluZSBJUlFGX1BFUkNQVQkJMHgwMDAwMDQwMAorI2RlZmluZSBJUlFGX05PQkFMQU5DSU5HCTB4MDAwMDA4MDAKIAogLyoKICAqIE1pZ3JhdGlvbiBoZWxwZXJzLiBTY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gMS8yMDA3CkBAIC0yMzksNiArMjQyLDkgQEAKIAlCTE9DS19TT0ZUSVJRLAogCVRBU0tMRVRfU09GVElSUSwKIAlTQ0hFRF9TT0ZUSVJRLAorI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlIUlRJTUVSX1NPRlRJUlEsCisjZW5kaWYKIH07CiAKIC8qIHNvZnRpcnEgbWFzayBhbmQgYWN0aXZlIGZpZWxkcyBtb3ZlZCB0byBpcnFfY3B1c3RhdF90IGluCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA1NTA0YjY3Li4xOTM5ZDQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTMxLDcgKzMxLDcgQEAKIC8qCiAgKiBJUlEgbGluZSBzdGF0dXMuCiAgKgotICogQml0cyAwLTE2IGFyZSByZXNlcnZlZCBmb3IgdGhlIElSUUZfKiBiaXRzIGluIGxpbnV4L2ludGVycnVwdC5oCisgKiBCaXRzIDAtNyBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBJUlFGXyogYml0cyBpbiBsaW51eC9pbnRlcnJ1cHQuaAogICoKICAqIElSUSB0eXBlcwogICovCkBAIC00NSwyOCArNDUsMzAgQEAKICNkZWZpbmUgSVJRX1RZUEVfUFJPQkUJCTB4MDAwMDAwMTAJLyogUHJvYmluZyBpbiBwcm9ncmVzcyAqLwogCiAvKiBJbnRlcm5hbCBmbGFncyAqLwotI2RlZmluZSBJUlFfSU5QUk9HUkVTUwkJMHgwMDAxMDAwMAkvKiBJUlEgaGFuZGxlciBhY3RpdmUgLSBkbyBub3QgZW50ZXIhICovCi0jZGVmaW5lIElSUV9ESVNBQkxFRAkJMHgwMDAyMDAwMAkvKiBJUlEgZGlzYWJsZWQgLSBkbyBub3QgZW50ZXIhICovCi0jZGVmaW5lIElSUV9QRU5ESU5HCQkweDAwMDQwMDAwCS8qIElSUSBwZW5kaW5nIC0gcmVwbGF5IG9uIGVuYWJsZSAqLwotI2RlZmluZSBJUlFfUkVQTEFZCQkweDAwMDgwMDAwCS8qIElSUSBoYXMgYmVlbiByZXBsYXllZCBidXQgbm90IGFja2VkIHlldCAqLwotI2RlZmluZSBJUlFfQVVUT0RFVEVDVAkJMHgwMDEwMDAwMAkvKiBJUlEgaXMgYmVpbmcgYXV0b2RldGVjdGVkICovCi0jZGVmaW5lIElSUV9XQUlUSU5HCQkweDAwMjAwMDAwCS8qIElSUSBub3QgeWV0IHNlZW4gLSBmb3IgYXV0b2RldGVjdGlvbiAqLwotI2RlZmluZSBJUlFfTEVWRUwJCTB4MDA0MDAwMDAJLyogSVJRIGxldmVsIHRyaWdnZXJlZCAqLwotI2RlZmluZSBJUlFfTUFTS0VECQkweDAwODAwMDAwCS8qIElSUSBtYXNrZWQgLSBzaG91bGRuJ3QgYmUgc2VlbiBhZ2FpbiAqLwotI2RlZmluZSBJUlFfUEVSX0NQVQkJMHgwMTAwMDAwMAkvKiBJUlEgaXMgcGVyIENQVSAqLworI2RlZmluZSBJUlFfSU5QUk9HUkVTUwkJMHgwMDAwMDEwMAkvKiBJUlEgaGFuZGxlciBhY3RpdmUgLSBkbyBub3QgZW50ZXIhICovCisjZGVmaW5lIElSUV9ESVNBQkxFRAkJMHgwMDAwMDIwMAkvKiBJUlEgZGlzYWJsZWQgLSBkbyBub3QgZW50ZXIhICovCisjZGVmaW5lIElSUV9QRU5ESU5HCQkweDAwMDAwNDAwCS8qIElSUSBwZW5kaW5nIC0gcmVwbGF5IG9uIGVuYWJsZSAqLworI2RlZmluZSBJUlFfUkVQTEFZCQkweDAwMDAwODAwCS8qIElSUSBoYXMgYmVlbiByZXBsYXllZCBidXQgbm90IGFja2VkIHlldCAqLworI2RlZmluZSBJUlFfQVVUT0RFVEVDVAkJMHgwMDAwMTAwMAkvKiBJUlEgaXMgYmVpbmcgYXV0b2RldGVjdGVkICovCisjZGVmaW5lIElSUV9XQUlUSU5HCQkweDAwMDAyMDAwCS8qIElSUSBub3QgeWV0IHNlZW4gLSBmb3IgYXV0b2RldGVjdGlvbiAqLworI2RlZmluZSBJUlFfTEVWRUwJCTB4MDAwMDQwMDAJLyogSVJRIGxldmVsIHRyaWdnZXJlZCAqLworI2RlZmluZSBJUlFfTUFTS0VECQkweDAwMDA4MDAwCS8qIElSUSBtYXNrZWQgLSBzaG91bGRuJ3QgYmUgc2VlbiBhZ2FpbiAqLworI2RlZmluZSBJUlFfUEVSX0NQVQkJMHgwMDAxMDAwMAkvKiBJUlEgaXMgcGVyIENQVSAqLworI2RlZmluZSBJUlFfTk9QUk9CRQkJMHgwMDAyMDAwMAkvKiBJUlEgaXMgbm90IHZhbGlkIGZvciBwcm9iaW5nICovCisjZGVmaW5lIElSUV9OT1JFUVVFU1QJCTB4MDAwNDAwMDAJLyogSVJRIGNhbm5vdCBiZSByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgSVJRX05PQVVUT0VOCQkweDAwMDgwMDAwCS8qIElSUSB3aWxsIG5vdCBiZSBlbmFibGVkIG9uIHJlcXVlc3QgaXJxICovCisjZGVmaW5lIElSUV9XQUtFVVAJCTB4MDAxMDAwMDAJLyogSVJRIHRyaWdnZXJzIHN5c3RlbSB3YWtldXAgKi8KKyNkZWZpbmUgSVJRX01PVkVfUEVORElORwkweDAwMjAwMDAwCS8qIG5lZWQgdG8gcmUtdGFyZ2V0IElSUSBkZXN0aW5hdGlvbiAqLworI2RlZmluZSBJUlFfTk9fQkFMQU5DSU5HCTB4MDA0MDAwMDAJLyogSVJRIGlzIGV4Y2x1ZGVkIGZyb20gYmFsYW5jaW5nICovCisKICNpZmRlZiBDT05GSUdfSVJRX1BFUl9DUFUKICMgZGVmaW5lIENIRUNLX0lSUV9QRVJfQ1BVKHZhcikgKCh2YXIpICYgSVJRX1BFUl9DUFUpCisjIGRlZmluZSBJUlFfTk9fQkFMQU5DSU5HX01BU0sJKElSUV9QRVJfQ1BVIHwgSVJRX05PX0JBTEFOQ0lORykKICNlbHNlCiAjIGRlZmluZSBDSEVDS19JUlFfUEVSX0NQVSh2YXIpIDAKKyMgZGVmaW5lIElSUV9OT19CQUxBTkNJTkdfTUFTSwlJUlFfTk9fQkFMQU5DSU5HCiAjZW5kaWYKIAotI2RlZmluZSBJUlFfTk9QUk9CRQkJMHgwMjAwMDAwMAkvKiBJUlEgaXMgbm90IHZhbGlkIGZvciBwcm9iaW5nICovCi0jZGVmaW5lIElSUV9OT1JFUVVFU1QJCTB4MDQwMDAwMDAJLyogSVJRIGNhbm5vdCBiZSByZXF1ZXN0ZWQgKi8KLSNkZWZpbmUgSVJRX05PQVVUT0VOCQkweDA4MDAwMDAwCS8qIElSUSB3aWxsIG5vdCBiZSBlbmFibGVkIG9uIHJlcXVlc3QgaXJxICovCi0jZGVmaW5lIElSUV9ERUxBWUVEX0RJU0FCTEUJMHgxMDAwMDAwMAkvKiBJUlEgZGlzYWJsZSAobWFza2luZykgaGFwcGVucyBkZWxheWVkLiAqLwotI2RlZmluZSBJUlFfV0FLRVVQCQkweDIwMDAwMDAwCS8qIElSUSB0cmlnZ2VycyBzeXN0ZW0gd2FrZXVwICovCi0jZGVmaW5lIElSUV9NT1ZFX1BFTkRJTkcJMHg0MDAwMDAwMAkvKiBuZWVkIHRvIHJlLXRhcmdldCBJUlEgZGVzdGluYXRpb24gKi8KLQogc3RydWN0IHByb2NfZGlyX2VudHJ5Owogc3RydWN0IG1zaV9kZXNjOwogCkBAIC0xMjcsNiArMTI5LDcgQEAKICAqCiAgKiBAaGFuZGxlX2lycToJCWhpZ2hsZXZlbCBpcnEtZXZlbnRzIGhhbmRsZXIgW2lmIE5VTEwsIF9fZG9fSVJRKCldCiAgKiBAY2hpcDoJCWxvdyBsZXZlbCBpbnRlcnJ1cHQgaGFyZHdhcmUgYWNjZXNzCisgKiBAbXNpX2Rlc2M6CQlNU0kgZGVzY3JpcHRvcgogICogQGhhbmRsZXJfZGF0YToJcGVyLUlSUSBkYXRhIGZvciB0aGUgaXJxX2NoaXAgbWV0aG9kcwogICogQGNoaXBfZGF0YToJCXBsYXRmb3JtLXNwZWNpZmljIHBlci1jaGlwIHByaXZhdGUgZGF0YSBmb3IgdGhlIGNoaXAKICAqCQkJbWV0aG9kcywgdG8gYWxsb3cgc2hhcmVkIGNoaXAgaW1wbGVtZW50YXRpb25zCkBAIC0yMzUsMTEgKzIzOCwyMSBAQAogCiAjZW5kaWYgLyogQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEgKi8KIAorZXh0ZXJuIGludCBpcnFfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBjcHVtYXNrKTsKK2V4dGVybiBpbnQgaXJxX2Nhbl9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSk7CisKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIAogI2RlZmluZSBtb3ZlX25hdGl2ZV9pcnEoeCkKICNkZWZpbmUgbW92ZV9tYXNrZWRfaXJxKHgpCiAKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9jYW5fc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEpIHsgcmV0dXJuIDA7IH0KKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmZGVmIENPTkZJR19JUlFCQUxBTkNFCkBAIC0yNjEsNiArMjc0LDExIEBACiAKIGV4dGVybiBpbnQgbm9faXJxX2FmZmluaXR5OwogCitzdGF0aWMgaW5saW5lIGludCBpcnFfYmFsYW5jaW5nX2Rpc2FibGVkKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIGlycV9kZXNjW2lycV0uc3RhdHVzICYgSVJRX05PX0JBTEFOQ0lOR19NQVNLOworfQorCiAvKiBIYW5kbGUgaXJxIGFjdGlvbiBjaGFpbnM6ICovCiBleHRlcm4gaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmggYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAppbmRleCAwZWM2ZTI4Li5jMDgwZjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaApAQCAtMTQyLDEzICsxNDIsMTMgQEAKICAqCiAgKiBBbmQgc29tZSBub3Qgc28gb2J2aW91cy4KICAqCi0gKiBOb3RlIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gTUFYX0xPTkcsIGJlY2F1c2UKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBMT05HX01BWCwgYmVjYXVzZQogICogZm9yIHZhcmlvdXMgdGltZW91dCByZWFzb25zIHdlIG9mdGVuIGVuZCB1cCBoYXZpbmcKICAqIHRvIHdhaXQgImppZmZpZXMrMSIgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQgd2Ugd2FpdAogICogYXQgX2xlYXN0XyAiamlmZmllcyIgLSBzbyAiamlmZmllcysxIiBoYWQgYmV0dGVyIHN0aWxsCiAgKiBiZSBwb3NpdGl2ZS4KICAqLwotI2RlZmluZSBNQVhfSklGRllfT0ZGU0VUICgofjBVTCA+PiAxKS0xKQorI2RlZmluZSBNQVhfSklGRllfT0ZGU0VUICgoTE9OR19NQVggPj4gMSktMSkKIAogLyoKICAqIFdlIHdhbnQgdG8gZG8gcmVhbGlzdGljIGNvbnZlcnNpb25zIG9mIHRpbWUgc28gd2UgbmVlZCB0byB1c2UgdGhlIHNhbWUKQEAgLTI1OSwyMDcgKzI1OSwyMyBAQAogI2VuZGlmCiAKIC8qCi0gKiBDb252ZXJ0IGppZmZpZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBiYWNrLgotICoKLSAqIEF2b2lkIHVubmVjZXNzYXJ5IG11bHRpcGxpY2F0aW9ucy9kaXZpc2lvbnMgaW4gdGhlCi0gKiB0d28gbW9zdCBjb21tb24gSFogY2FzZXM6CisgKiBDb252ZXJ0IHZhcmlvdXMgdGltZSB1bml0cyB0byBlYWNoIG90aGVyOgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKLXsKLSNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKLQlyZXR1cm4gKE1TRUNfUEVSX1NFQyAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IE1TRUNfUEVSX1NFQyAmJiAhKEhaICUgTVNFQ19QRVJfU0VDKQotCXJldHVybiAoaiArIChIWiAvIE1TRUNfUEVSX1NFQykgLSAxKS8oSFogLyBNU0VDX1BFUl9TRUMpOwotI2Vsc2UKLQlyZXR1cm4gKGogKiBNU0VDX1BFUl9TRUMpIC8gSFo7Ci0jZW5kaWYKLX0KK2V4dGVybiB1bnNpZ25lZCBpbnQgamlmZmllc190b19tc2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopOworZXh0ZXJuIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX3VzZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtc2Vjc190b19qaWZmaWVzKGNvbnN0IHVuc2lnbmVkIGludCBtKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVzZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IHUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGltZXNwZWNfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGppZmZpZXNfdG9fdGltZXNwZWMoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLAorCQkJCXN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGltZXZhbF90b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp2YWx1ZSk7CitleHRlcm4gdm9pZCBqaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLAorCQkJICAgICAgIHN0cnVjdCB0aW1ldmFsICp2YWx1ZSk7CitleHRlcm4gY2xvY2tfdCBqaWZmaWVzX3RvX2Nsb2NrX3QobG9uZyB4KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNsb2NrX3RfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHgpOworZXh0ZXJuIHU2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpOworZXh0ZXJuIHU2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX3VzZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKLXsKLSNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKLQlyZXR1cm4gKFVTRUNfUEVSX1NFQyAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IFVTRUNfUEVSX1NFQyAmJiAhKEhaICUgVVNFQ19QRVJfU0VDKQotCXJldHVybiAoaiArIChIWiAvIFVTRUNfUEVSX1NFQykgLSAxKS8oSFogLyBVU0VDX1BFUl9TRUMpOwotI2Vsc2UKLQlyZXR1cm4gKGogKiBVU0VDX1BFUl9TRUMpIC8gSFo7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1zZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IG0pCi17Ci0JaWYgKG0gPiBqaWZmaWVzX3RvX21zZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQotCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKLSNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKLQlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOwotI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKLQlyZXR1cm4gbSAqIChIWiAvIE1TRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAobSAqIEhaICsgTVNFQ19QRVJfU0VDIC0gMSkgLyBNU0VDX1BFUl9TRUM7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHVzZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IHUpCi17Ci0JaWYgKHUgPiBqaWZmaWVzX3RvX3VzZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQotCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKLSNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKLQlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOwotI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKLQlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAodSAqIEhaICsgVVNFQ19QRVJfU0VDIC0gMSkgLyBVU0VDX1BFUl9TRUM7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFRoZSBUSUNLX05TRUMgLSAxIHJvdW5kcyB1cCB0aGUgdmFsdWUgdG8gdGhlIG5leHQgcmVzb2x1dGlvbi4gIE5vdGUKLSAqIHRoYXQgYSByZW1haW5kZXIgc3VidHJhY3QgaGVyZSB3b3VsZCBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGFzIHRoZQotICogcmVzb2x1dGlvbiB2YWx1ZXMgZG9uJ3QgZmFsbCBvbiBzZWNvbmQgYm91bmRyaWVzLiAgSS5lLiB0aGUgbGluZToKLSAqIG5zZWMgLT0gbnNlYyAlIFRJQ0tfTlNFQzsgaXMgTk9UIGEgY29ycmVjdCByZXNvbHV0aW9uIHJvdW5kaW5nLgotICoKLSAqIFJhdGhlciwgd2UganVzdCBzaGlmdCB0aGUgYml0cyBvZmYgdGhlIHJpZ2h0LgotICoKLSAqIFRoZSA+PiAoTlNFQ19KSUZGSUVfU0MgLSBTRUNfSklGRklFX1NDKSBjb252ZXJ0cyB0aGUgc2NhbGVkIG5zZWMKLSAqIHZhbHVlIHRvIGEgc2NhbGVkIHNlY29uZCB2YWx1ZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotdGltZXNwZWNfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgc2VjID0gdmFsdWUtPnR2X3NlYzsKLQlsb25nIG5zZWMgPSB2YWx1ZS0+dHZfbnNlYyArIFRJQ0tfTlNFQyAtIDE7Ci0KLQlpZiAoc2VjID49IE1BWF9TRUNfSU5fSklGRklFUyl7Ci0JCXNlYyA9IE1BWF9TRUNfSU5fSklGRklFUzsKLQkJbnNlYyA9IDA7Ci0JfQotCXJldHVybiAoKCh1NjQpc2VjICogU0VDX0NPTlZFUlNJT04pICsKLQkJKCgodTY0KW5zZWMgKiBOU0VDX0NPTlZFUlNJT04pID4+Ci0JCSAoTlNFQ19KSUZGSUVfU0MgLSBTRUNfSklGRklFX1NDKSkpID4+IFNFQ19KSUZGSUVfU0M7Ci0KLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotamlmZmllc190b190aW1lc3BlYyhjb25zdCB1bnNpZ25lZCBsb25nIGppZmZpZXMsIHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpCi17Ci0JLyoKLQkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKLQkgKiBvbmUgZGl2aWRlLgotCSAqLwotCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOwotCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ2YWx1ZS0+dHZfbnNlYyk7Ci19Ci0KLS8qIFNhbWUgZm9yICJ0aW1ldmFsIgotICoKLSAqIFdlbGwsIGFsbW9zdC4gIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVhbCBzeXN0ZW0gcmVzb2x1dGlvbiBpcwotICogaW4gbmFub3NlY29uZHMgYW5kIHRoZSB2YWx1ZSBiZWluZyBjb252ZXJ0ZWQgaXMgaW4gbWljcm8gc2Vjb25kcy4KLSAqIEFsc28gZm9yIHNvbWUgbWFjaGluZXMgKHRob3NlIHRoYXQgdXNlIEhaID0gMTAyNCwgaW4tcGFydGljdWxhciksCi0gKiB0aGVyZSBpcyBhIExBUkdFIGVycm9yIGluIHRoZSB0aWNrIHNpemUgaW4gbWljcm9zZWNvbmRzLgotCi0gKiBUaGUgc29sdXRpb24gd2UgdXNlIGlzIHRvIGRvIHRoZSByb3VuZGluZyBBRlRFUiB3ZSBjb252ZXJ0IHRoZQotICogbWljcm9zZWNvbmQgcGFydC4gIFRodXMgdGhlIFVTRUNfUk9VTkQsIHRoZSBiaXRzIHRvIGJlIHNoaWZ0ZWQgb2ZmLgotICogSW5zdHJ1Y3Rpb24gd2lzZSwgdGhpcyBzaG91bGQgY29zdCBvbmx5IGFuIGFkZGl0aW9uYWwgYWRkIHdpdGggY2FycnkKLSAqIGluc3RydWN0aW9uIGFib3ZlIHRoZSB3YXkgaXQgd2FzIGRvbmUgYWJvdmUuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLXRpbWV2YWxfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOwotCWxvbmcgdXNlYyA9IHZhbHVlLT50dl91c2VjOwotCi0JaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpewotCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7Ci0JCXVzZWMgPSAwOwotCX0KLQlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCi0JCSgoKHU2NCl1c2VjICogVVNFQ19DT05WRVJTSU9OICsgVVNFQ19ST1VORCkgPj4KLQkJIChVU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotamlmZmllc190b190aW1ldmFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWV2YWwgKnZhbHVlKQotewotCS8qCi0JICogQ29udmVydCBqaWZmaWVzIHRvIG5hbm9zZWNvbmRzIGFuZCBzZXBhcmF0ZSB3aXRoCi0JICogb25lIGRpdmlkZS4KLQkgKi8KLQl1NjQgbnNlYyA9ICh1NjQpamlmZmllcyAqIFRJQ0tfTlNFQzsKLQlsb25nIHR2X3VzZWM7Ci0KLQl2YWx1ZS0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdHZfdXNlYyk7Ci0JdHZfdXNlYyAvPSBOU0VDX1BFUl9VU0VDOwotCXZhbHVlLT50dl91c2VjID0gdHZfdXNlYzsKLX0KLQotLyoKLSAqIENvbnZlcnQgamlmZmllcy9qaWZmaWVzXzY0IHRvIGNsb2NrX3QgYW5kIGJhY2suCi0gKi8KLXN0YXRpYyBpbmxpbmUgY2xvY2tfdCBqaWZmaWVzX3RvX2Nsb2NrX3QobG9uZyB4KQotewotI2lmIChUSUNLX05TRUMgJSAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpID09IDAKLQlyZXR1cm4geCAvIChIWiAvIFVTRVJfSFopOwotI2Vsc2UKLQl1NjQgdG1wID0gKHU2NCl4ICogVElDS19OU0VDOwotCWRvX2Rpdih0bXAsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7Ci0JcmV0dXJuIChsb25nKXRtcDsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2xvY2tfdF90b19qaWZmaWVzKHVuc2lnbmVkIGxvbmcgeCkKLXsKLSNpZiAoSFogJSBVU0VSX0haKT09MAotCWlmICh4ID49IH4wVUwgLyAoSFogLyBVU0VSX0haKSkKLQkJcmV0dXJuIH4wVUw7Ci0JcmV0dXJuIHggKiAoSFogLyBVU0VSX0haKTsKLSNlbHNlCi0JdTY0IGppZjsKLQotCS8qIERvbid0IHdvcnJ5IGFib3V0IGxvc3Mgb2YgcHJlY2lzaW9uIGhlcmUgLi4gKi8KLQlpZiAoeCA+PSB+MFVMIC8gSFogKiBVU0VSX0haKQotCQlyZXR1cm4gfjBVTDsKLQotCS8qIC4uIGJ1dCBkbyB0cnkgdG8gY29udGFpbiBpdCBoZXJlICovCi0JamlmID0geCAqICh1NjQpIEhaOwotCWRvX2RpdihqaWYsIFVTRVJfSFopOwotCXJldHVybiBqaWY7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB1NjQgamlmZmllc182NF90b19jbG9ja190KHU2NCB4KQotewotI2lmIChUSUNLX05TRUMgJSAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpID09IDAKLQlkb19kaXYoeCwgSFogLyBVU0VSX0haKTsKLSNlbHNlCi0JLyoKLQkgKiBUaGVyZSBhcmUgYmV0dGVyIHdheXMgdGhhdCBkb24ndCBvdmVyZmxvdyBlYXJseSwKLQkgKiBidXQgZXZlbiB0aGlzIGRvZXNuJ3Qgb3ZlcmZsb3cgaW4gaHVuZHJlZHMgb2YgeWVhcnMKLQkgKiBpbiA2NCBiaXRzLCBzby4uCi0JICovCi0JeCAqPSBUSUNLX05TRUM7Ci0JZG9fZGl2KHgsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7Ci0jZW5kaWYKLQlyZXR1cm4geDsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgbnNlY190b19jbG9ja190KHU2NCB4KQotewotI2lmIChOU0VDX1BFUl9TRUMgJSBVU0VSX0haKSA9PSAwCi0JZG9fZGl2KHgsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7Ci0jZWxpZiAoVVNFUl9IWiAlIDUxMikgPT0gMAotCXggKj0gVVNFUl9IWi81MTI7Ci0JZG9fZGl2KHgsIChOU0VDX1BFUl9TRUMgLyA1MTIpKTsKLSNlbHNlCi0JLyoKLSAgICAgICAgICogbWF4IHJlbGF0aXZlIGVycm9yIDUuN2UtOCAoMS44cyBwZXIgeWVhcikgZm9yIFVTRVJfSFogPD0gMTAyNCwKLSAgICAgICAgICogb3ZlcmZsb3cgYWZ0ZXIgNjQuOTkgeWVhcnMuCi0gICAgICAgICAqIGV4YWN0IGZvciBIWj02MCwgNzIsIDkwLCAxMjAsIDE0NCwgMTgwLCAzMDAsIDYwMCwgOTAwLCAuLi4KLSAgICAgICAgICovCi0JeCAqPSA5OwotCWRvX2Rpdih4LCAodW5zaWduZWQgbG9uZykoKDl1bGwgKiBOU0VDX1BFUl9TRUMgKyAoVVNFUl9IWi8yKSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIC8gVVNFUl9IWikpOwotI2VuZGlmCi0JcmV0dXJuIHg7Ci19CisjZGVmaW5lIFRJTUVTVEFNUF9TSVpFCTMwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdGltZS5oIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCmluZGV4IDc0NDRhNjMuLmM2OGM3YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKQEAgLTI2MSw4ICsyNjEsNyBAQAogICogaWRlYSBvZiB0aGUgKGluKWFjY3VyYWN5IG9mIHRpbWVycy4gVGltZXIgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvCiAgKiB0aGlzIHJlc29sdXRpb24gdmFsdWVzLgogICovCi0jZGVmaW5lIEtUSU1FX1JFQUxUSU1FX1JFUwkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KLSNkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KKyNkZWZpbmUgS1RJTUVfTE9XX1JFUwkJKGt0aW1lX3QpeyAudHY2NCA9IFRJQ0tfTlNFQyB9CiAKIC8qIEdldCB0aGUgbW9ub3RvbmljIHRpbWUgaW4gdGltZXNwZWMgZm9ybWF0OiAqLwogZXh0ZXJuIHZvaWQga3RpbWVfZ2V0X3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBkYjA1MTgyLi4xYmU1YmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtMTA1LDEyICsxMDUsMTEgQEAKIAl1aW50MzJfdAlhY2Nlc3NfbWFzazsKIAlpbnQJCXdob3R5cGU7CiAJdWlkX3QJCXdobzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxfYWNlOwogfTsKIAogc3RydWN0IG5mczRfYWNsIHsKIAl1aW50MzJfdAluYWNlczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjZV9oZWFkOworCXN0cnVjdCBuZnM0X2FjZQlhY2VzWzBdOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGRhdGFbTkZTNF9WRVJJRklFUl9TSVpFXTsgfSBuZnM0X3ZlcmlmaWVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oIGIvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oCmluZGV4IDIyYWZmNGQuLjQwOWI2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNF9hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczRfYWNsLmgKQEAgLTM5LDkgKzM5LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KIAotc3RydWN0IG5mczRfYWNsICpuZnM0X2FjbF9uZXcodm9pZCk7Ci12b2lkIG5mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICopOwotaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOworLyogTWF4aW11bSBBQ0wgd2UnbGwgYWNjZXB0IGZyb20gY2xpZW50OyBjaG9zZW4gKHNvbWV3aGF0IGFyYml0cmFyaWx5KSB0bworICogZml0IGluIGEgcGFnZTogKi8KKyNkZWZpbmUgTkZTNF9BQ0xfTUFYIDE3MAorCitzdHJ1Y3QgbmZzNF9hY2wgKm5mczRfYWNsX25ldyhpbnQpOwordm9pZCBuZnM0X2FjbF9hZGRfYWNlKHN0cnVjdCBuZnM0X2FjbCAqLCB1MzIsIHUzMiwgdTMyLCBpbnQsIHVpZF90KTsKIGludCBuZnM0X2FjbF9nZXRfd2hvdHlwZShjaGFyICosIHUzMik7CiBpbnQgbmZzNF9hY2xfd3JpdGVfd2hvKGludCB3aG8sIGNoYXIgKnApOwogaW50IG5mczRfYWNsX3Blcm1pc3Npb24oc3RydWN0IG5mczRfYWNsICphY2wsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGljay5oIGIvaW5jbHVkZS9saW51eC90aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3MjUyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdGljay5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAgbGludXgvaW5jbHVkZS9saW51eC90aWNrLmgKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRpY2sgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RJQ0tfSAorI2RlZmluZSBfTElOVVhfVElDS19ICisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCitlbnVtIHRpY2tfZGV2aWNlX21vZGUgeworCVRJQ0tERVZfTU9ERV9QRVJJT0RJQywKKwlUSUNLREVWX01PREVfT05FU0hPVCwKK307CisKK3N0cnVjdCB0aWNrX2RldmljZSB7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ZGV2OworCWVudW0gdGlja19kZXZpY2VfbW9kZSBtb2RlOworfTsKKworZW51bSB0aWNrX25vaHpfbW9kZSB7CisJTk9IWl9NT0RFX0lOQUNUSVZFLAorCU5PSFpfTU9ERV9MT1dSRVMsCisJTk9IWl9NT0RFX0hJR0hSRVMsCit9OworCisvKioKKyAqIHN0cnVjdCB0aWNrX3NjaGVkIC0gc2NoZWQgdGljayBlbXVsYXRpb24gYW5kIG5vIGlkbGUgdGljayBjb250cm9sL3N0YXRzCisgKiBAc2NoZWRfdGltZXI6CWhydGltZXIgdG8gc2NoZWR1bGUgdGhlIHBlcmlvZGljIHRpY2sgaW4gaGlnaAorICoJCQlyZXNvbHV0aW9uIG1vZGUKKyAqIEBpZGxlX3RpY2s6CQlTdG9yZSB0aGUgbGFzdCBpZGxlIHRpY2sgZXhwaXJ5IHRpbWUgd2hlbiB0aGUgdGljaworICoJCQl0aW1lciBpcyBtb2RpZmllZCBmb3IgaWRsZSBzbGVlcHMuIFRoaXMgaXMgbmVjZXNzYXJ5CisgKgkJCXRvIHJlc3VtZSB0aGUgdGljayB0aW1lciBvcGVyYXRpb24gaW4gdGhlIHRpbWVsaW5lCisgKgkJCXdoZW4gdGhlIENQVSByZXR1cm5zIGZyb20gaWRsZQorICogQHRpY2tfc3RvcHBlZDoJSW5kaWNhdG9yIHRoYXQgdGhlIGlkbGUgdGljayBoYXMgYmVlbiBzdG9wcGVkCisgKiBAaWRsZV9qaWZmaWVzOglqaWZmaWVzIGF0IHRoZSBlbnRyeSB0byBpZGxlIGZvciBpZGxlIHRpbWUgYWNjb3VudGluZworICogQGlkbGVfY2FsbHM6CQlUb3RhbCBudW1iZXIgb2YgaWRsZSBjYWxscworICogQGlkbGVfc2xlZXBzOglOdW1iZXIgb2YgaWRsZSBjYWxscywgd2hlcmUgdGhlIHNjaGVkIHRpY2sgd2FzIHN0b3BwZWQKKyAqIEBpZGxlX2VudHJ5dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIGNhbGwgd2FzIGVudGVyZWQKKyAqIEBpZGxlX3NsZWVwdGltZToJU3VtIG9mIHRoZSB0aW1lIHNsZXB0IGluIGlkbGUgd2l0aCBzY2hlZCB0aWNrIHN0b3BwZWQKKyAqLworc3RydWN0IHRpY2tfc2NoZWQgeworCXN0cnVjdCBocnRpbWVyCQkJc2NoZWRfdGltZXI7CisJdW5zaWduZWQgbG9uZwkJCWNoZWNrX2Nsb2NrczsKKwllbnVtIHRpY2tfbm9oel9tb2RlCQlub2h6X21vZGU7CisJa3RpbWVfdAkJCQlpZGxlX3RpY2s7CisJaW50CQkJCXRpY2tfc3RvcHBlZDsKKwl1bnNpZ25lZCBsb25nCQkJaWRsZV9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX2NhbGxzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX3NsZWVwczsKKwlrdGltZV90CQkJCWlkbGVfZW50cnl0aW1lOworCWt0aW1lX3QJCQkJaWRsZV9zbGVlcHRpbWU7CisJdW5zaWduZWQgbG9uZwkJCWxhc3RfamlmZmllczsKKwl1bnNpZ25lZCBsb25nCQkJbmV4dF9qaWZmaWVzOworCWt0aW1lX3QJCQkJaWRsZV9leHBpcmVzOworfTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2RldmljZShpbnQgY3B1KTsKKworIyBpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCitleHRlcm4gaW50IHRpY2tfaW5pdF9oaWdocmVzKHZvaWQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jYW5jZWxfc2NoZWRfdGltZXIoaW50IGNwdSkgeyB9CisjIGVuZGlmIC8qIEhJR0hSRVMgKi8KKworIyBpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKTsKKworIyAgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIGNwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKTsKKyMgIGVuZGlmCisKKyMgZW5kaWYgLyogQlJPQURDQVNUICovCisKKyMgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCk7CitleHRlcm4gaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopOworZXh0ZXJuIHN0cnVjdCB0aWNrX3NjaGVkICp0aWNrX2dldF90aWNrX3NjaGVkKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KSB7IHJldHVybiAwOyB9CisjIGVuZGlmCisKKyNlbHNlIC8qIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQorI2VuZGlmIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLworCisjIGlmZGVmIENPTkZJR19OT19IWgorZXh0ZXJuIHZvaWQgdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljayh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCk7CisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzKHZvaWQpIHsgfQorIyBlbmRpZiAvKiAhTk9fSFogKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGVjZWIxYTUuLjhlYThkZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC05Miw2ICs5Miw3IEBACiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljOwogZXh0ZXJuIHNlcWxvY2tfdCB4dGltZV9sb2NrIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpOwogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCBmYjVlZGFhLi43MTkxMTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfVElNRVJfSAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIApAQCAtMTUsNiArMTYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAlzdHJ1Y3QgdHZlY190X2Jhc2VfcyAqYmFzZTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl2b2lkICpzdGFydF9zaXRlOworCWNoYXIgc3RhcnRfY29tbVsxNl07CisJaW50IHN0YXJ0X3BpZDsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHN0cnVjdCB0dmVjX3RfYmFzZV9zIGJvb3RfdHZlY19iYXNlczsKQEAgLTYxLDcgKzY3LDY1IEBACiBleHRlcm4gaW50IF9fbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIGV4dGVybiBpbnQgbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIAorLyoKKyAqIFJldHVybiB3aGVuIHRoZSBuZXh0IHRpbWVyLXdoZWVsIHRpbWVvdXQgb2NjdXJzIChpbiBhYnNvbHV0ZSBqaWZmaWVzKSwKKyAqIGxvY2tzIHRoZSB0aW1lciBiYXNlOgorICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKTsKKy8qCisgKiBSZXR1cm4gd2hlbiB0aGUgbmV4dCB0aW1lci13aGVlbCB0aW1lb3V0IG9jY3VycyAoaW4gYWJzb2x1dGUgamlmZmllcyksCisgKiBsb2NrcyB0aGUgdGltZXIgYmFzZSBhbmQgZG9lcyB0aGUgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBnaXZlbgorICogamlmZmllLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBub3cpOworCisvKgorICogVGltZXItc3RhdGlzdGljcyBpbmZvOgorICovCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisKK2V4dGVybiB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCk7CisKK2V4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOworfQorCitleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCQkJICAgICAgIHZvaWQgKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCV9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7Cit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZGVsYXllZF93b3JrX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgX19kYXRhKTsKIAogLyoqCiAgKiBhZGRfdGltZXIgLSBzdGFydCBhIHRpbWVyCkBAIC05Niw3ICsxNjAsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF90aW1lcnModm9pZCk7CiBleHRlcm4gdm9pZCBydW5fbG9jYWxfdGltZXJzKHZvaWQpOwogc3RydWN0IGhydGltZXI7Ci1leHRlcm4gaW50IGl0X3JlYWxfZm4oc3RydWN0IGhydGltZXIgKik7CitleHRlcm4gZW51bSBocnRpbWVyX3Jlc3RhcnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqKTsKIAogdW5zaWduZWQgbG9uZyBfX3JvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqLCBpbnQgY3B1KTsKIHVuc2lnbmVkIGxvbmcgX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKHVuc2lnbmVkIGxvbmcgaiwgaW50IGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKaW5kZXggOWEyNGU1MC4uZGE5MjlkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1leC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtMjg2LDYgKzI4NiwxMyBAQAogCiAjZGVmaW5lIFRJQ0tfTEVOR1RIX1NISUZUCTMyCiAKKyNpZmRlZiBDT05GSUdfTk9fSFoKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgICgyKQorI2Vsc2UKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgIChIWikKKyNlbmRpZgorI2RlZmluZSBOVFBfSU5URVJWQUxfTEVOR1RIIChOU0VDX1BFUl9TRUMvTlRQX0lOVEVSVkFMX0ZSRVEpCisKIC8qIFJldHVybnMgaG93IGxvbmcgdGlja3MgYXJlIGF0IHByZXNlbnQsIGluIG5zIC8gMl4oU0hJRlRfU0NBTEUtMTApLiAqLwogZXh0ZXJuIHU2NCBjdXJyZW50X3RpY2tfbGVuZ3RoKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDI0MjFlMTUuLjk1MzUwMGIgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC01MTUsNiArNTE2LDcgQEAKICAqIGVuYWJsZSB0aGVtCiAgKi8KIAlsb2NrX2tlcm5lbCgpOworCXRpY2tfaW5pdCgpOwogCWJvb3RfY3B1X2luaXQoKTsKIAlwYWdlX2FkZHJlc3NfaW5pdCgpOwogCXByaW50ayhLRVJOX05PVElDRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCAwYjYyOTNkLi5kMTU0Y2M3IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTg1OCw3ICs4NTgsNyBAQAogCWluaXRfc2lncGVuZGluZygmc2lnLT5zaGFyZWRfcGVuZGluZyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNpZy0+cG9zaXhfdGltZXJzKTsKIAotCWhydGltZXJfaW5pdCgmc2lnLT5yZWFsX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfUkVMKTsKKwlocnRpbWVyX2luaXQoJnNpZy0+cmVhbF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzaWctPml0X3JlYWxfaW5jci50djY0ID0gMDsKIAlzaWctPnJlYWxfdGltZXIuZnVuY3Rpb24gPSBpdF9yZWFsX2ZuOwogCXNpZy0+dHNrID0gdHNrOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA1YTczN2RlLi5lNzQ5ZTdkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAogCWlmIChzZWMgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpIHsKIAkJdG8gPSAmdGltZW91dDsKLQkJaHJ0aW1lcl9pbml0KCZ0by0+dGltZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX0FCUyk7CisJCWhydGltZXJfaW5pdCgmdG8tPnRpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJCWhydGltZXJfaW5pdF9zbGVlcGVyKHRvLCBjdXJyZW50KTsKIAkJdG8tPnRpbWVyLmV4cGlyZXMgPSBrdGltZV9zZXQoc2VjLCBuc2VjKTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBmNDRlNDk5Li40NzZjYjBjIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTEsOCArMSw5IEBACiAvKgogICogIGxpbnV4L2tlcm5lbC9ocnRpbWVyLmMKICAqCi0gKiAgQ29weXJpZ2h0KEMpIDIwMDUsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgotICogIENvcHlyaWdodChDKSAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDYsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYtMjAwNyAgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCiAgKgogICogIEhpZ2gtcmVzb2x1dGlvbiBrZXJuZWwgdGltZXJzCiAgKgpAQCAtMzEsMTIgKzMyLDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTQ1LDcgKzUxLDcgQEAKICAqCiAgKiByZXR1cm5zIHRoZSB0aW1lIGluIGt0aW1lX3QgZm9ybWF0CiAgKi8KLXN0YXRpYyBrdGltZV90IGt0aW1lX2dldCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCkBAIC01OSw3ICs2NSw3IEBACiAgKgogICogcmV0dXJucyB0aGUgdGltZSBpbiBrdGltZV90IGZvcm1hdAogICovCi1zdGF0aWMga3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQogewogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAKQEAgLTc5LDIxICs4NSwyMiBAQAogICogVGhpcyBlbnN1cmVzIHRoYXQgd2UgY2FwdHVyZSBlcnJvbmVvdXMgYWNjZXNzZXMgdG8gdGhlc2UgY2xvY2sgaWRzCiAgKiByYXRoZXIgdGhhbiBtb3ZpbmcgdGhlbSBpbnRvIHRoZSByYW5nZSBvZiB2YWxpZCBjbG9jayBpZCdzLgogICovCi0KLSNkZWZpbmUgTUFYX0hSVElNRVJfQkFTRVMgMgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGhydGltZXJfYmFzZSwgaHJ0aW1lcl9iYXNlc1tNQVhfSFJUSU1FUl9CQVNFU10pID0KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlLCBocnRpbWVyX2Jhc2VzKSA9CiB7CisKKwkuY2xvY2tfYmFzZSA9CiAJewotCQkuaW5kZXggPSBDTE9DS19SRUFMVElNRSwKLQkJLmdldF90aW1lID0gJmt0aW1lX2dldF9yZWFsLAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX1JFQUxUSU1FX1JFUywKLQl9LAotCXsKLQkJLmluZGV4ID0gQ0xPQ0tfTU9OT1RPTklDLAotCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0LAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX01PTk9UT05JQ19SRVMsCi0JfSwKKwkJeworCQkJLmluZGV4ID0gQ0xPQ0tfUkVBTFRJTUUsCisJCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0X3JlYWwsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJCXsKKwkJCS5pbmRleCA9IENMT0NLX01PTk9UT05JQywKKwkJCS5nZXRfdGltZSA9ICZrdGltZV9nZXQsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJfQogfTsKIAogLyoqCkBAIC0xMjUsMjAgKzEzMiwzNSBAQAogICogR2V0IHRoZSBjb2Fyc2UgZ3JhaW5lZCB0aW1lIGF0IHRoZSBzb2Z0aXJxIGJhc2VkIG9uIHh0aW1lIGFuZAogICogd2FsbF90b19tb25vdG9uaWMuCiAgKi8KLXN0YXRpYyB2b2lkIGhydGltZXJfZ2V0X3NvZnRpcnFfdGltZShzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKQogewogCWt0aW1lX3QgeHRpbSwgdG9tb25vOworCXN0cnVjdCB0aW1lc3BlYyB4dHM7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAKIAlkbyB7CiAJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCQl4dGltID0gdGltZXNwZWNfdG9fa3RpbWUoeHRpbWUpOwotCQl0b21vbm8gPSB0aW1lc3BlY190b19rdGltZSh3YWxsX3RvX21vbm90b25pYyk7Ci0KKyNpZmRlZiBDT05GSUdfTk9fSFoKKwkJZ2V0bnN0aW1lb2ZkYXkoJnh0cyk7CisjZWxzZQorCQl4dHMgPSB4dGltZTsKKyNlbmRpZgogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCi0JYmFzZVtDTE9DS19SRUFMVElNRV0uc29mdGlycV90aW1lID0geHRpbTsKLQliYXNlW0NMT0NLX01PTk9UT05JQ10uc29mdGlycV90aW1lID0ga3RpbWVfYWRkKHh0aW0sIHRvbW9ubyk7CisJeHRpbSA9IHRpbWVzcGVjX3RvX2t0aW1lKHh0cyk7CisJdG9tb25vID0gdGltZXNwZWNfdG9fa3RpbWUod2FsbF90b19tb25vdG9uaWMpOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnNvZnRpcnFfdGltZSA9IHh0aW07CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19NT05PVE9OSUNdLnNvZnRpcnFfdGltZSA9CisJCWt0aW1lX2FkZCh4dGltLCB0b21vbm8pOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBydW5uaW5nIHRoZSBjYWxsYmFjaworICogZnVuY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9jYWxsYmFja19ydW5uaW5nKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPnN0YXRlICYgSFJUSU1FUl9TVEFURV9DQUxMQkFDSzsKIH0KIAogLyoKQEAgLTE0Nyw4ICsxNjksNiBAQAogICovCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IChiKS0+Y3Vycl90aW1lciA9ICh0KTsgfSB3aGlsZSAoMCkKLQogLyoKICAqIFdlIGFyZSB1c2luZyBoYXNoZWQgbG9ja2luZzogaG9sZGluZyBwZXJfY3B1KGhydGltZXJfYmFzZXMpW25dLmxvY2sKICAqIG1lYW5zIHRoYXQgYWxsIHRpbWVycyB3aGljaCBhcmUgdGllZCB0byB0aGlzIGJhc2UgdmlhIHRpbWVyLT5iYXNlIGFyZQpAQCAtMTYxLDE5ICsxODEsMjAgQEAKICAqIHBvc3NpYmxlIHRvIHNldCB0aW1lci0+YmFzZSA9IE5VTEwgYW5kIGRyb3AgdGhlIGxvY2s6IHRoZSB0aW1lciByZW1haW5zCiAgKiBsb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorc3RhdGljCitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCiAJZm9yICg7OykgewogCQliYXNlID0gdGltZXItPmJhc2U7CiAJCWlmIChsaWtlbHkoYmFzZSAhPSBOVUxMKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssICpmbGFncyk7CiAJCQlpZiAobGlrZWx5KGJhc2UgPT0gdGltZXItPmJhc2UpKQogCQkJCXJldHVybiBiYXNlOwogCQkJLyogVGhlIHRpbWVyIGhhcyBtaWdyYXRlZCB0byBhbm90aGVyIENQVTogKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIAkJfQogCQljcHVfcmVsYXgoKTsKIAl9CkBAIC0xODIsMTIgKzIwMywxNCBAQAogLyoKICAqIFN3aXRjaCB0aGUgdGltZXIgYmFzZSB0byB0aGUgY3VycmVudCBDUFUgd2hlbiBwb3NzaWJsZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICoKLXN3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICoKK3N3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpuZXdfY3B1X2Jhc2U7CiAKLQluZXdfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpW2Jhc2UtPmluZGV4XTsKKwluZXdfY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwluZXdfYmFzZSA9ICZuZXdfY3B1X2Jhc2UtPmNsb2NrX2Jhc2VbYmFzZS0+aW5kZXhdOwogCiAJaWYgKGJhc2UgIT0gbmV3X2Jhc2UpIHsKIAkJLyoKQEAgLTE5OSwxMyArMjIyLDEzIEBACiAJCSAqIGNvbXBsZXRlZC4gVGhlcmUgaXMgbm8gY29uZmxpY3QgYXMgd2UgaG9sZCB0aGUgbG9jayB1bnRpbAogCQkgKiB0aGUgdGltZXIgaXMgZW5xdWV1ZWQuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoYmFzZS0+Y3Vycl90aW1lciA9PSB0aW1lcikpCisJCWlmICh1bmxpa2VseShocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKSkKIAkJCXJldHVybiBiYXNlOwogCiAJCS8qIFNlZSB0aGUgY29tbWVudCBpbiBsb2NrX3RpbWVyX2Jhc2UoKSAqLwogCQl0aW1lci0+YmFzZSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQkJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiYXNlLT5jcHVfYmFzZS0+bG9jayk7CisJCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmNwdV9iYXNlLT5sb2NrKTsKIAkJdGltZXItPmJhc2UgPSBuZXdfYmFzZTsKIAl9CiAJcmV0dXJuIG5ld19iYXNlOwpAQCAtMjEzLDE5ICsyMzYsMTcgQEAKIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGhydGltZXJfYmFzZSAqCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKgogbG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlID0gdGltZXItPmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCAqZmxhZ3MpOwogCiAJcmV0dXJuIGJhc2U7CiB9CiAKLSNkZWZpbmUgc3dpdGNoX2hydGltZXJfYmFzZSh0LCBiKQkoYikKKyMgZGVmaW5lIHN3aXRjaF9ocnRpbWVyX2Jhc2UodCwgYikJKGIpCiAKICNlbmRpZgkvKiAhQ09ORklHX1NNUCAqLwogCkBAIC0yNTYsMTUgKzI3NywxMiBAQAogCiAJcmV0dXJuIGt0aW1lX2FkZChrdCwgdG1wKTsKIH0KLQotI2Vsc2UgLyogQ09ORklHX0tUSU1FX1NDQUxBUiAqLwotCiAjIGVuZGlmIC8qICFDT05GSUdfS1RJTUVfU0NBTEFSICovCiAKIC8qCiAgKiBEaXZpZGUgYSBrdGltZSB2YWx1ZSBieSBhIG5hbm9zZWNvbmQgdmFsdWUKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKK3Vuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKIHsKIAl1NjQgZGNsYywgaW5jLCBkbnM7CiAJaW50IHNmdCA9IDA7CkBAIC0yODEsMTggKzI5OSwzMTEgQEAKIAogCXJldHVybiAodW5zaWduZWQgbG9uZykgZGNsYzsKIH0KLQotI2Vsc2UgLyogQklUU19QRVJfTE9ORyA8IDY0ICovCi0jIGRlZmluZSBrdGltZV9kaXZucyhrdCwgZGl2KQkJKHVuc2lnbmVkIGxvbmcpKChrdCkudHY2NCAvIChkaXYpKQogI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPj0gNjQgKi8KIAorLyogSGlnaCByZXNvbHV0aW9uIHRpbWVyIHJlbGF0ZWQgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGVuYWJsZWQgPworICovCitzdGF0aWMgaW50IGhydGltZXJfaHJlc19lbmFibGVkIF9fcmVhZF9tb3N0bHkgID0gMTsKKworLyoKKyAqIEVuYWJsZSAvIERpc2FibGUgaGlnaCByZXNvbHV0aW9uIG1vZGUKKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0dXBfaHJ0aW1lcl9ocmVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImhpZ2hyZXM9Iiwgc2V0dXBfaHJ0aW1lcl9ocmVzKTsKKworLyoKKyAqIGhydGltZXJfaGlnaF9yZXNfZW5hYmxlZCAtIHF1ZXJ5LCBpZiB0aGUgaGlnaHJlcyBtb2RlIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19ocmVzX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gaHJ0aW1lcl9ocmVzX2VuYWJsZWQ7Cit9CisKKy8qCisgKiBJcyB0aGUgaGlnaCByZXNvbHV0aW9uIG1vZGUgYWN0aXZlID8KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKQoreworCXJldHVybiBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpLmhyZXNfYWN0aXZlOworfQorCisvKgorICogUmVwcm9ncmFtIHRoZSBldmVudCBzb3VyY2Ugd2l0aCBjaGVja2luZyBib3RoIHF1ZXVlcyBmb3IgdGhlCisgKiBuZXh0IGV2ZW50CisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5sb2NrIGhlbGQKKyAqLworc3RhdGljIHZvaWQgaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlKQoreworCWludCBpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKKwlrdGltZV90IGV4cGlyZXM7CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKywgYmFzZSsrKSB7CisJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJY29udGludWU7CisJCXRpbWVyID0gcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKTsKKwkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwkJaWYgKGV4cGlyZXMudHY2NCA8IGNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCkKKwkJCWNwdV9iYXNlLT5leHBpcmVzX25leHQgPSBleHBpcmVzOworCX0KKworCWlmIChjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgIT0gS1RJTUVfTUFYKQorCQl0aWNrX3Byb2dyYW1fZXZlbnQoY3B1X2Jhc2UtPmV4cGlyZXNfbmV4dCwgMSk7Cit9CisKKy8qCisgKiBTaGFyZWQgcmVwcm9ncmFtbWluZyBmb3IgY2xvY2tfcmVhbHRpbWUgYW5kIGNsb2NrX21vbm90b25pYworICoKKyAqIFdoZW4gYSB0aW1lciBpcyBlbnF1ZXVlZCBhbmQgZXhwaXJlcyBlYXJsaWVyIHRoYW4gdGhlIGFscmVhZHkgZW5xdWV1ZWQKKyAqIHRpbWVycywgd2UgaGF2ZSB0byBjaGVjaywgd2hldGhlciBpdCBleHBpcmVzIGVhcmxpZXIgdGhhbiB0aGUgdGltZXIgZm9yCisgKiB3aGljaCB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIHdhcyBhcm1lZC4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5jcHVfYmFzZS5sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCBocnRpbWVyX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJa3RpbWVfdCAqZXhwaXJlc19uZXh0ID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcykuZXhwaXJlc19uZXh0OworCWt0aW1lX3QgZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwlpbnQgcmVzOworCisJLyoKKwkgKiBXaGVuIHRoZSBjYWxsYmFjayBpcyBydW5uaW5nLCB3ZSBkbyBub3QgcmVwcm9ncmFtIHRoZSBjbG9jayBldmVudAorCSAqIGRldmljZS4gVGhlIHRpbWVyIGNhbGxiYWNrIGlzIGVpdGhlciBydW5uaW5nIG9uIGEgZGlmZmVyZW50IENQVSBvcgorCSAqIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBpbiB0aGUgaHJ0aW1lcl9pbnRlcnVwdCBjb250ZXh0LiBUaGUKKwkgKiByZXByb2dyYW1taW5nIGlzIGhhbmRsZWQgZWl0aGVyIGJ5IHRoZSBzb2Z0aXJxLCB3aGljaCBjYWxsZWQgdGhlCisJICogY2FsbGJhY2sgb3IgYXQgdGhlIGVuZCBvZiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQuCisJICovCisJaWYgKGhydGltZXJfY2FsbGJhY2tfcnVubmluZyh0aW1lcikpCisJCXJldHVybiAwOworCisJaWYgKGV4cGlyZXMudHY2NCA+PSBleHBpcmVzX25leHQtPnR2NjQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDbG9ja2V2ZW50cyByZXR1cm5zIC1FVElNRSwgd2hlbiB0aGUgZXZlbnQgd2FzIGluIHRoZSBwYXN0LgorCSAqLworCXJlcyA9IHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKTsKKwlpZiAoIUlTX0VSUl9WQUxVRShyZXMpKQorCQkqZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBSZXRyaWdnZXIgbmV4dCBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgY2xvY2sgd2FzIHNldAorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdmlhIG9uX2VhY2hfY3B1KCkKKyAqLworc3RhdGljIHZvaWQgcmV0cmlnZ2VyX25leHRfZXZlbnQodm9pZCAqYXJnKQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlOworCXN0cnVjdCB0aW1lc3BlYyByZWFsdGltZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzZXE7CisKKwlpZiAoIWhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJcmV0dXJuOworCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnJlYWx0aW1lX29mZnNldCwKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYywKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJLyogQWRqdXN0IENMT0NLX1JFQUxUSU1FIG9mZnNldCAqLworCXNwaW5fbG9jaygmYmFzZS0+bG9jayk7CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19SRUFMVElNRV0ub2Zmc2V0ID0KKwkJdGltZXNwZWNfdG9fa3RpbWUocmVhbHRpbWVfb2Zmc2V0KTsKKworCWhydGltZXJfZm9yY2VfcmVwcm9ncmFtKGJhc2UpOworCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKK30KKworLyoKKyAqIENsb2NrIHJlYWx0aW1lIHdhcyBzZXQKKyAqCisgKiBDaGFuZ2UgdGhlIG9mZnNldCBvZiB0aGUgcmVhbHRpbWUgY2xvY2sgdnMuIHRoZSBtb25vdG9uaWMKKyAqIGNsb2NrLgorICoKKyAqIFdlIG1pZ2h0IGhhdmUgdG8gcmVwcm9ncmFtIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50ZXJydXB0LiBPbgorICogU01QIHdlIGNhbGwgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIHJldHJpZ2dlciBfYWxsXyBoaWdoCisgKiByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdHMuIE9uIFVQIHdlIGp1c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZAorICogY2FsbCB0aGUgaGlnaCByZXNvbHV0aW9uIGludGVycnVwdCBjb2RlLgorICovCit2b2lkIGNsb2NrX3dhc19zZXQodm9pZCkKK3sKKwkvKiBSZXRyaWdnZXIgdGhlIENQVSBsb2NhbCBldmVudHMgZXZlcnl3aGVyZSAqLworCW9uX2VhY2hfY3B1KHJldHJpZ2dlcl9uZXh0X2V2ZW50LCBOVUxMLCAwLCAxKTsKK30KKworLyoKKyAqIENoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBvbiB0aGUgY2FsbGJhY2sgcGVuZGluZyBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfY2JfcGVuZGluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfUEVORElORzsKK30KKworLyoKKyAqIFJlbW92ZSBhIHRpbWVyIGZyb20gdGhlIGNhbGxiYWNrIHBlbmRpbmcgbGlzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJbGlzdF9kZWxfaW5pdCgmdGltZXItPmNiX2VudHJ5KTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGhpZ2ggcmVzb2x1dGlvbiByZWxhdGVkIHBhcnRzIG9mIGNwdV9iYXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfaHJlcyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkKK3sKKwliYXNlLT5leHBpcmVzX25leHQudHY2NCA9IEtUSU1FX01BWDsKKwliYXNlLT5ocmVzX2FjdGl2ZSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmJhc2UtPmNiX3BlbmRpbmcpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaGlnaCByZXNvbHV0aW9uIHJlbGF0ZWQgcGFydHMgb2YgYSBocnRpbWVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5jYl9lbnRyeSk7Cit9CisKKy8qCisgKiBXaGVuIEhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGFjdGl2ZSwgdHJ5IHRvIHJlcHJvZ3JhbS4gTm90ZSwgdGhhdCBpbiBjYXNlCisgKiB0aGUgc3RhdGUgaGFzIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sgc2V0LCBubyByZXByb2dyYW1taW5nIGFuZCBubyBleHBpcnkKKyAqIGNoZWNrIGhhcHBlbnMuIFRoZSB0aW1lciBnZXRzIGVucXVldWVkIGludG8gdGhlIHJidHJlZS4gVGhlIHJlcHJvZ3JhbW1pbmcKKyAqIGFuZCBleHBpcnkgY2hlY2sgaXMgZG9uZSBpbiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQgb3IgaW4gdGhlIHNvZnRpcnEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXIgKnRpbWVyLAorCQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKK3sKKwlpZiAoYmFzZS0+Y3B1X2Jhc2UtPmhyZXNfYWN0aXZlICYmIGhydGltZXJfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkgeworCisJCS8qIFRpbWVyIGlzIGV4cGlyZWQsIGFjdCB1cG9uIHRoZSBjYWxsYmFjayBtb2RlICovCisJCXN3aXRjaCh0aW1lci0+Y2JfbW9kZSkgeworCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJUOgorCQkJLyoKKwkJCSAqIFdlIGNhbiBjYWxsIHRoZSBjYWxsYmFjayBmcm9tIGhlcmUuIE5vIHJlc3RhcnQKKwkJCSAqIGhhcHBlbnMsIHNvIG5vIGRhbmdlciBvZiByZWN1cnNpb24KKwkJCSAqLworCQkJQlVHX09OKHRpbWVyLT5mdW5jdGlvbih0aW1lcikgIT0gSFJUSU1FUl9OT1JFU1RBUlQpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE6CisJCQkvKgorCQkJICogVGhpcyBpcyBzb2xlbHkgZm9yIHRoZSBzY2hlZCB0aWNrIGVtdWxhdGlvbiB3aXRoCisJCQkgKiBkeW5hbWljIHRpY2sgc3VwcG9ydCB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QKKwkJCSAqIHJlc3RhcnQgdGhlIHRpY2sgcmlnaHQgb24gdGhlIGVkZ2UgYW5kIGVuZCB1cCB3aXRoCisJCQkgKiB0aGUgdGljayB0aW1lciBpbiB0aGUgc29mdGlycSAhIFRoZSBjYWxsaW5nIHNpdGUKKwkJCSAqIHRha2VzIGNhcmUgb2YgdGhpcy4KKwkJCSAqLworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFOgorCQljYXNlIEhSVElNRVJfQ0JfU09GVElSUToKKwkJCS8qCisJCQkgKiBNb3ZlIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIHRoZSBzb2Z0aXJxIHBlbmRpbmcgbGlzdCAhCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkgICAgICAmYmFzZS0+Y3B1X2Jhc2UtPmNiX3BlbmRpbmcpOworCQkJdGltZXItPnN0YXRlID0gSFJUSU1FUl9TVEFURV9QRU5ESU5HOworCQkJcmFpc2Vfc29mdGlycShIUlRJTUVSX1NPRlRJUlEpOworCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICovCitzdGF0aWMgdm9pZCBocnRpbWVyX3N3aXRjaF90b19ocmVzKHZvaWQpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmJhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJhc2UtPmhyZXNfYWN0aXZlKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAodGlja19pbml0X2hpZ2hyZXMoKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisJYmFzZS0+aHJlc19hY3RpdmUgPSAxOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnJlc29sdXRpb24gPSBLVElNRV9ISUdIX1JFUzsKKwliYXNlLT5jbG9ja19iYXNlW0NMT0NLX01PTk9UT05JQ10ucmVzb2x1dGlvbiA9IEtUSU1FX0hJR0hfUkVTOworCisJdGlja19zZXR1cF9zY2hlZF90aW1lcigpOworCisJLyogIlJldHJpZ2dlciIgdGhlIGludGVycnVwdCB0byBnZXQgdGhpbmdzIGdvaW5nICovCisJcmV0cmlnZ2VyX25leHRfZXZlbnQoTlVMTCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIG9uIENQVSAlZFxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2lzX2hyZXNfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9zd2l0Y2hfdG9faHJlcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkgeyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyICp0aW1lciwKKwkJCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2NiX3BlbmRpbmcoc3RydWN0IGhydGltZXIgKnRpbWVyKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfaW5pdF9ocmVzKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHZvaWQgKmFkZHIpCit7CisJaWYgKHRpbWVyLT5zdGFydF9zaXRlKQorCQlyZXR1cm47CisKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IGFkZHI7CisJbWVtY3B5KHRpbWVyLT5zdGFydF9jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwl0aW1lci0+c3RhcnRfcGlkID0gY3VycmVudC0+cGlkOworfQorI2VuZGlmCisKIC8qCiAgKiBDb3VudGVycGFydCB0byBsb2NrX3RpbWVyX2Jhc2UgYWJvdmU6CiAgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgdW5sb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5sb2NrLCAqZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIH0KIAogLyoqCkBAIC0zNDIsNyArNjUzLDggQEAKICAqIFRoZSB0aW1lciBpcyBpbnNlcnRlZCBpbiBleHBpcnkgb3JkZXIuIEluc2VydGlvbiBpbnRvIHRoZQogICogcmVkIGJsYWNrIHRyZWUgaXMgTyhsb2cobikpLiBNdXN0IGhvbGQgdGhlIGJhc2UgbG9jay4KICAqLwotc3RhdGljIHZvaWQgZW5xdWV1ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyB2b2lkIGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgaW50IHJlcHJvZ3JhbSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmYmFzZS0+YWN0aXZlLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC0zNjgsMzkgKzY4MCw4NSBAQAogCSAqIEluc2VydCB0aGUgdGltZXIgdG8gdGhlIHJidHJlZSBhbmQgY2hlY2sgd2hldGhlciBpdAogCSAqIHJlcGxhY2VzIHRoZSBmaXJzdCBwZW5kaW5nIHRpbWVyCiAJICovCisJaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKKwkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KSB7CisJCS8qCisJCSAqIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBXaGVuIHRoZSB0aW1lciBpcyBhbHJlYWR5CisJCSAqIGV4cGlyZWQgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSBoYXMgZWl0aGVyIGNhbGxlZCB0aGUKKwkJICogY2FsbGJhY2sgb3IgYWRkZWQgaXQgdG8gdGhlIHBlbmRpbmcgbGlzdCBhbmQgcmFpc2VkIHRoZQorCQkgKiBzb2Z0aXJxLgorCQkgKgorCQkgKiBUaGlzIGlzIGEgTk9QIGZvciAhSElHSFJFUworCQkgKi8KKwkJaWYgKHJlcHJvZ3JhbSAmJiBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkKKwkJCXJldHVybjsKKworCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwl9CisKIAlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOwogCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCi0JaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKLQkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KQotCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwkvKgorCSAqIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQgaXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8gcHJlc2VydmUgdGhlCisJICogc3RhdGUgb2YgYSBwb3NzaWJseSBydW5uaW5nIGNhbGxiYWNrLgorCSAqLworCXRpbWVyLT5zdGF0ZSB8PSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEOwogfQogCiAvKgogICogX19yZW1vdmVfaHJ0aW1lciAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyCiAgKgogICogQ2FsbGVyIG11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2RlIHJlcHJvZ3JhbXMgdGhlIGNsb2NrIGV2ZW50IGRldmljZSB3aGVuIHRoZQorICogdGltZXIgaXMgdGhlIG9uZSB3aGljaCBleHBpcmVzIG5leHQuIFRoZSBjYWxsZXIgY2FuIGRpc2FibGUgdGhpcyBieSBzZXR0aW5nCisgKiByZXByb2dyYW0gdG8gemVyby4gVGhpcyBpcyB1c2VmdWwsIHdoZW4gdGhlIGNvbnRleHQgZG9lcyBhIHJlcHJvZ3JhbW1pbmcKKyAqIGFueXdheSAoZS5nLiB0aW1lciBpbnRlcnJ1cHQpCiAgKi8KLXN0YXRpYyB2b2lkIF9fcmVtb3ZlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgX19yZW1vdmVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3RhdGUsIGludCByZXByb2dyYW0pCiB7Ci0JLyoKLQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKLQkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKQotCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKLQlyYl9lcmFzZSgmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCXJiX3NldF9wYXJlbnQoJnRpbWVyLT5ub2RlLCAmdGltZXItPm5vZGUpOworCS8qIEhpZ2ggcmVzLiBjYWxsYmFjayBsaXN0LiBOT1AgZm9yICFISUdIUkVTICovCisJaWYgKGhydGltZXJfY2JfcGVuZGluZyh0aW1lcikpCisJCWhydGltZXJfcmVtb3ZlX2NiX3BlbmRpbmcodGltZXIpOworCWVsc2UgeworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKKwkJICogZmlyc3QgZW50cnkgcG9pbnRlciBpZiBuZWNlc3NhcnkuCisJCSAqLworCQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKSB7CisJCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKKwkJCS8qIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBpZiBlbmFibGVkICovCisJCQlpZiAocmVwcm9ncmFtICYmIGhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJCQlocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShiYXNlLT5jcHVfYmFzZSk7CisJCX0KKwkJcmJfZXJhc2UoJnRpbWVyLT5ub2RlLCAmYmFzZS0+YWN0aXZlKTsKKwl9CisJdGltZXItPnN0YXRlID0gbmV3c3RhdGU7CiB9CiAKIC8qCiAgKiByZW1vdmUgaHJ0aW1lciwgY2FsbGVkIHdpdGggYmFzZSBsb2NrIGhlbGQKICAqLwogc3RhdGljIGlubGluZSBpbnQKLXJlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3JlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKLQlpZiAoaHJ0aW1lcl9hY3RpdmUodGltZXIpKSB7Ci0JCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UpOworCWlmIChocnRpbWVyX2lzX3F1ZXVlZCh0aW1lcikpIHsKKwkJaW50IHJlcHJvZ3JhbTsKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGFuZCBmb3JjZSByZXByb2dyYW1taW5nIHdoZW4gaGlnaAorCQkgKiByZXNvbHV0aW9uIG1vZGUgaXMgYWN0aXZlIGFuZCB0aGUgdGltZXIgaXMgb24gdGhlIGN1cnJlbnQKKwkJICogQ1BVLiBJZiB3ZSByZW1vdmUgYSB0aW1lciBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtbWluZyBpcworCQkgKiBza2lwcGVkLiBUaGUgaW50ZXJydXB0IGV2ZW50IG9uIHRoaXMgQ1BVIGlzIGZpcmVkIGFuZAorCQkgKiByZXByb2dyYW1taW5nIGhhcHBlbnMgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGlzIGEKKwkJICogcmFyZSBjYXNlIGFuZCBsZXNzIGV4cGVuc2l2ZSB0aGFuIGEgc21wIGNhbGwuCisJCSAqLworCQl0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8odGltZXIpOworCQlyZXByb2dyYW0gPSBiYXNlLT5jcHVfYmFzZSA9PSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9JTkFDVElWRSwKKwkJCQkgcmVwcm9ncmFtKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNDE5LDcgKzc3Nyw3IEBACiBpbnQKIGhydGltZXJfc3RhcnQoc3RydWN0IGhydGltZXIgKnRpbWVyLCBrdGltZV90IHRpbSwgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlLCAqbmV3X2Jhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgKm5ld19iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIApAQCAtNDMxLDcgKzc4OSw3IEBACiAJLyogU3dpdGNoIHRoZSB0aW1lciBiYXNlLCBpZiBuZWNlc3Nhcnk6ICovCiAJbmV3X2Jhc2UgPSBzd2l0Y2hfaHJ0aW1lcl9iYXNlKHRpbWVyLCBiYXNlKTsKIAotCWlmIChtb2RlID09IEhSVElNRVJfUkVMKSB7CisJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkgewogCQl0aW0gPSBrdGltZV9hZGQodGltLCBuZXdfYmFzZS0+Z2V0X3RpbWUoKSk7CiAJCS8qCiAJCSAqIENPTkZJR19USU1FX0xPV19SRVMgaXMgYSB0ZW1wb3Jhcnkgd2F5IGZvciBhcmNoaXRlY3R1cmVzCkBAIC00NDYsNyArODA0LDkgQEAKIAl9CiAJdGltZXItPmV4cGlyZXMgPSB0aW07CiAKLQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwl0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKKworCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIGJhc2UgPT0gbmV3X2Jhc2UpOwogCiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIApAQCAtNDY2LDEzICs4MjYsMTMgQEAKICAqLwogaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IC0xOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCi0JaWYgKGJhc2UtPmN1cnJfdGltZXIgIT0gdGltZXIpCisJaWYgKCFocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKQogCQlyZXQgPSByZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CiAKIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwpAQCAtNTA4LDE5ICs4NjgsMTkgQEAKICAqLwoga3RpbWVfdCBocnRpbWVyX2dldF9yZW1haW5pbmcoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWt0aW1lX3QgcmVtOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwotCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOworCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+Z2V0X3RpbWUoKSk7CiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAogCXJldHVybiByZW07CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZW1haW5pbmcpOwogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qKgogICogaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCAtIGdldCB0aGUgdGltZSB1bnRpbCBuZXh0IGV4cGlyeSBldmVudAogICoKQEAgLTUyOSwyNiArODg5LDMxIEBACiAgKi8KIGt0aW1lX3QgaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKIAlrdGltZV90IGRlbHRhLCBtaW5kZWx0YSA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IUlRJTUVSX0JBU0VTOyBpKyssIGJhc2UrKykgewotCQlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFiYXNlLT5maXJzdCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwotCQkJY29udGludWU7CisJaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyssIGJhc2UrKykgeworCQkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCisJCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJCWNvbnRpbnVlOworCisJCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCQlkZWx0YS50djY0ID0gdGltZXItPmV4cGlyZXMudHY2NDsKKwkJCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKKwkJCWlmIChkZWx0YS50djY0IDwgbWluZGVsdGEudHY2NCkKKwkJCQltaW5kZWx0YS50djY0ID0gZGVsdGEudHY2NDsKIAkJfQotCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7Ci0JCWRlbHRhLnR2NjQgPSB0aW1lci0+ZXhwaXJlcy50djY0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5sb2NrLCBmbGFncyk7Ci0JCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKLQkJaWYgKGRlbHRhLnR2NjQgPCBtaW5kZWx0YS50djY0KQotCQkJbWluZGVsdGEudHY2NCA9IGRlbHRhLnR2NjQ7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChtaW5kZWx0YS50djY0IDwgMCkKIAkJbWluZGVsdGEudHY2NCA9IDA7CiAJcmV0dXJuIG1pbmRlbHRhOwpAQCAtNTY0LDE3ICs5MjksMjMgQEAKIHZvaWQgaHJ0aW1lcl9pbml0KHN0cnVjdCBocnRpbWVyICp0aW1lciwgY2xvY2tpZF90IGNsb2NrX2lkLAogCQkgIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCiAJbWVtc2V0KHRpbWVyLCAwLCBzaXplb2Yoc3RydWN0IGhydGltZXIpKTsKIAotCWJhc2VzID0gX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAKLQlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX0FCUykKKwlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX01PREVfQUJTKQogCQljbG9ja19pZCA9IENMT0NLX01PTk9UT05JQzsKIAotCXRpbWVyLT5iYXNlID0gJmJhc2VzW2Nsb2NrX2lkXTsKLQlyYl9zZXRfcGFyZW50KCZ0aW1lci0+bm9kZSwgJnRpbWVyLT5ub2RlKTsKKwl0aW1lci0+YmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtjbG9ja19pZF07CisJaHJ0aW1lcl9pbml0X3RpbWVyX2hyZXModGltZXIpOworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJdGltZXItPnN0YXJ0X3NpdGUgPSBOVUxMOworCXRpbWVyLT5zdGFydF9waWQgPSAtMTsKKwltZW1zZXQodGltZXItPnN0YXJ0X2NvbW0sIDAsIFRBU0tfQ09NTV9MRU4pOworI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2luaXQpOwogCkBAIC01ODgsMjEgKzk1OSwxNTkgQEAKICAqLwogaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCi0JYmFzZXMgPSBfX3Jhd19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKLQkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlc1t3aGljaF9jbG9ja10ucmVzb2x1dGlvbik7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJKnRwID0ga3RpbWVfdG9fdGltZXNwZWMoY3B1X2Jhc2UtPmNsb2NrX2Jhc2Vbd2hpY2hfY2xvY2tdLnJlc29sdXRpb24pOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZXMpOwogCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdAorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICovCit2b2lkIGhydGltZXJfaW50ZXJydXB0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOworCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3c7CisJaW50IGksIHJhaXNlID0gMDsKKworCUJVR19PTighY3B1X2Jhc2UtPmhyZXNfYWN0aXZlKTsKKwljcHVfYmFzZS0+bnJfZXZlbnRzKys7CisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKyByZXRyeToKKwlub3cgPSBrdGltZV9nZXQoKTsKKworCWV4cGlyZXNfbmV4dC50djY0ID0gS1RJTUVfTUFYOworCisJYmFzZSA9IGNwdV9iYXNlLT5jbG9ja19iYXNlOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJa3RpbWVfdCBiYXNlbm93OworCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCQlzcGluX2xvY2soJmNwdV9iYXNlLT5sb2NrKTsKKworCQliYXNlbm93ID0ga3RpbWVfYWRkKG5vdywgYmFzZS0+b2Zmc2V0KTsKKworCQl3aGlsZSAoKG5vZGUgPSBiYXNlLT5maXJzdCkpIHsKKwkJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisKKwkJCWlmIChiYXNlbm93LnR2NjQgPCB0aW1lci0+ZXhwaXJlcy50djY0KSB7CisJCQkJa3RpbWVfdCBleHBpcmVzOworCisJCQkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywKKwkJCQkJCSAgICBiYXNlLT5vZmZzZXQpOworCQkJCWlmIChleHBpcmVzLnR2NjQgPCBleHBpcmVzX25leHQudHY2NCkKKwkJCQkJZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTW92ZSBzb2Z0aXJxIGNhbGxiYWNrcyB0byB0aGUgcGVuZGluZyBsaXN0ICovCisJCQlpZiAodGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9TT0ZUSVJRKSB7CisJCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKKwkJCQkJCSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcsIDApOworCQkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKKwkJCQlyYWlzZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UsCisJCQkJCSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJCS8qCisJCQkgKiBOb3RlOiBXZSBjbGVhciB0aGUgQ0FMTEJBQ0sgYml0IGFmdGVyCisJCQkgKiBlbnF1ZXVlX2hydGltZXIgdG8gYXZvaWQgcmVwcm9ncmFtbWluZyBvZgorCQkJICogdGhlIGV2ZW50IGhhcmR3YXJlLiBUaGlzIGhhcHBlbnMgYXQgdGhlIGVuZAorCQkJICogb2YgdGhpcyBmdW5jdGlvbiBhbnl3YXkuCisJCQkgKi8KKwkJCWlmICh0aW1lci0+ZnVuY3Rpb24odGltZXIpICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CisJCQkJQlVHX09OKHRpbWVyLT5zdGF0ZSAhPSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLKTsKKwkJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOworCQkJfQorCQkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQl9CisJCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7CisJCWJhc2UrKzsKKwl9CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0ID0gZXhwaXJlc19uZXh0OworCisJLyogUmVwcm9ncmFtbWluZyBuZWNlc3NhcnkgPyAqLworCWlmIChleHBpcmVzX25leHQudHY2NCAhPSBLVElNRV9NQVgpIHsKKwkJaWYgKHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDApKQorCQkJZ290byByZXRyeTsKKwl9CisKKwkvKiBSYWlzZSBzb2Z0aXJxID8gKi8KKwlpZiAocmFpc2UpCisJCXJhaXNlX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRKTsKK30KKworc3RhdGljIHZvaWQgcnVuX2hydGltZXJfc29mdGlycShzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisKKwlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNwdV9iYXNlLT5jYl9wZW5kaW5nKSkgeworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKKwkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCQlpbnQgcmVzdGFydDsKKworCQl0aW1lciA9IGxpc3RfZW50cnkoY3B1X2Jhc2UtPmNiX3BlbmRpbmcubmV4dCwKKwkJCQkgICBzdHJ1Y3QgaHJ0aW1lciwgY2JfZW50cnkpOworCisJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJZm4gPSB0aW1lci0+ZnVuY3Rpb247CisJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIHRpbWVyLT5iYXNlLCBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJcmVzdGFydCA9IGZuKHRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQlpZiAocmVzdGFydCA9PSBIUlRJTUVSX1JFU1RBUlQpIHsKKwkJCUJVR19PTihocnRpbWVyX2FjdGl2ZSh0aW1lcikpOworCQkJLyoKKwkJCSAqIEVucXVldWUgdGhlIHRpbWVyLCBhbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudAorCQkJICogZGV2aWNlCisJCQkgKi8KKwkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgdGltZXItPmJhc2UsIDEpOworCQl9IGVsc2UgaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVhcm1lZCBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtCisJCQkgKiB0aGUgZXZlbnQgZGV2aWNlLgorCQkJICovCisJCQlpZiAodGltZXItPmJhc2UtPmZpcnN0ID09ICZ0aW1lci0+bm9kZSkKKwkJCQlocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgdGltZXItPmJhc2UpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOworfQorCisjZW5kaWYJLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCiAvKgogICogRXhwaXJlIHRoZSBwZXIgYmFzZSBocnRpbWVyLXF1ZXVlOgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnVuX2hydGltZXJfcXVldWUoc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBydW5faHJ0aW1lcl9xdWV1ZShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UsCisJCQkJICAgICBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtpbmRleF07CiAKIAlpZiAoIWJhc2UtPmZpcnN0KQogCQlyZXR1cm47CkBAIC02MTAsNTMgKzExMTksNzIgQEAKIAlpZiAoYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSkKIAkJYmFzZS0+c29mdGlycV90aW1lID0gYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSgpOwogCi0Jc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJd2hpbGUgKChub2RlID0gYmFzZS0+Zmlyc3QpKSB7CiAJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKLQkJaW50ICgqZm4pKHN0cnVjdCBocnRpbWVyICopOworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKIAkJaW50IHJlc3RhcnQ7CiAKIAkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CiAJCWlmIChiYXNlLT5zb2Z0aXJxX3RpbWUudHY2NCA8PSB0aW1lci0+ZXhwaXJlcy50djY0KQogCQkJYnJlYWs7CiAKKwkJdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHRpbWVyKTsKKwogCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKLQkJc2V0X2N1cnJfdGltZXIoYmFzZSwgdGltZXIpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9DQUxMQkFDSywgMCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJCXJlc3RhcnQgPSBmbih0aW1lcik7CiAKLQkJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmNwdV9iYXNlLT5sb2NrKTsKIAorCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfQ0FMTEJBQ0s7CiAJCWlmIChyZXN0YXJ0ICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CiAJCQlCVUdfT04oaHJ0aW1lcl9hY3RpdmUodGltZXIpKTsKLQkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CisJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOwogCQl9CiAJfQotCXNldF9jdXJyX3RpbWVyKGJhc2UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CiB9CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aW1lciBzb2Z0aXJxIGV2ZXJ5IGppZmZ5LCBleHBpcmUgaHJ0aW1lcnM6CisgKgorICogRm9yIEhSVCBpdHMgdGhlIGZhbGwgYmFjayBjb2RlIHRvIHJ1biB0aGUgc29mdGlycSBpbiB0aGUgdGltZXIKKyAqIHNvZnRpcnEgY29udGV4dCBpbiBjYXNlIHRoZSBocnRpbWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCBvciBoYXMKKyAqIG5vdCBiZWVuIGRvbmUgeWV0LgogICovCiB2b2lkIGhydGltZXJfcnVuX3F1ZXVlcyh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCWludCBpOwogCi0JaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKGJhc2UpOworCWlmIChocnRpbWVyX2hyZXNfYWN0aXZlKCkpCisJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKQotCQlydW5faHJ0aW1lcl9xdWV1ZSgmYmFzZVtpXSk7CisJLyoKKwkgKiBUaGlzIF9pc18gdWdseTogV2UgaGF2ZSB0byBjaGVjayBpbiB0aGUgc29mdGlycSBjb250ZXh0LAorCSAqIHdoZXRoZXIgd2UgY2FuIHN3aXRjaCB0byBoaWdocmVzIGFuZCAvIG9yIG5vaHogbW9kZS4gVGhlCisJICogY2xvY2tzb3VyY2Ugc3dpdGNoIGhhcHBlbnMgaW4gdGhlIHRpbWVyIGludGVycnVwdCB3aXRoCisJICogeHRpbWVfbG9jayBoZWxkLiBOb3RpZmljYXRpb24gZnJvbSB0aGVyZSBvbmx5IHNldHMgdGhlCisJICogY2hlY2sgYml0IGluIHRoZSB0aWNrX29uZXNob3QgY29kZSwgb3RoZXJ3aXNlIHdlIG1pZ2h0CisJICogZGVhZGxvY2sgdnMuIHh0aW1lX2xvY2suCisJICovCisJaWYgKHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoIWhydGltZXJfaXNfaHJlc19lbmFibGVkKCkpKQorCQlocnRpbWVyX3N3aXRjaF90b19ocmVzKCk7CisKKwlocnRpbWVyX2dldF9zb2Z0aXJxX3RpbWUoY3B1X2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCXJ1bl9ocnRpbWVyX3F1ZXVlKGNwdV9iYXNlLCBpKTsKIH0KIAogLyoKICAqIFNsZWVwIHJlbGF0ZWQgZnVuY3Rpb25zOgogICovCi1zdGF0aWMgaW50IGhydGltZXJfd2FrZXVwKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBocnRpbWVyX3dha2V1cChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGhydGltZXJfc2xlZXBlciAqdCA9CiAJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGhydGltZXJfc2xlZXBlciwgdGltZXIpOwpAQCAtNjczLDYgKzEyMDEsOSBAQAogewogCXNsLT50aW1lci5mdW5jdGlvbiA9IGhydGltZXJfd2FrZXVwOwogCXNsLT50YXNrID0gdGFzazsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJc2wtPnRpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfTk9fUkVTVEFSVDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IF9fc2NoZWQgZG9fbmFub3NsZWVwKHN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnQsIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCkBAIC02ODMsMTAgKzEyMTQsMTEgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaHJ0aW1lcl9zdGFydCgmdC0+dGltZXIsIHQtPnRpbWVyLmV4cGlyZXMsIG1vZGUpOwogCi0JCXNjaGVkdWxlKCk7CisJCWlmIChsaWtlbHkodC0+dGFzaykpCisJCQlzY2hlZHVsZSgpOwogCiAJCWhydGltZXJfY2FuY2VsKCZ0LT50aW1lcik7Ci0JCW1vZGUgPSBIUlRJTUVSX0FCUzsKKwkJbW9kZSA9IEhSVElNRVJfTU9ERV9BQlM7CiAKIAl9IHdoaWxlICh0LT50YXNrICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CiAKQEAgLTcwMiwxMCArMTIzNCwxMCBAQAogCiAJcmVzdGFydC0+Zm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKLQlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfQUJTKTsKKwlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfTU9ERV9BQlMpOwogCXQudGltZXIuZXhwaXJlcy50djY0ID0gKCh1NjQpcmVzdGFydC0+YXJnMyA8PCAzMikgfCAodTY0KSByZXN0YXJ0LT5hcmcyOwogCi0JaWYgKGRvX25hbm9zbGVlcCgmdCwgSFJUSU1FUl9BQlMpKQorCWlmIChkb19uYW5vc2xlZXAoJnQsIEhSVElNRVJfTU9ERV9BQlMpKQogCQlyZXR1cm4gMDsKIAogCXJtdHAgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSByZXN0YXJ0LT5hcmcxOwpAQCAtNzM4LDcgKzEyNzAsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEFic29sdXRlIHRpbWVycyBkbyBub3QgdXBkYXRlIHRoZSBybXRwIHZhbHVlIGFuZCByZXN0YXJ0OiAqLwotCWlmIChtb2RlID09IEhSVElNRVJfQUJTKQorCWlmIChtb2RlID09IEhSVElNRVJfTU9ERV9BQlMpCiAJCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiAKIAlpZiAocm10cCkgewpAQCAtNzcxLDcgKzEzMDMsNyBAQAogCWlmICghdGltZXNwZWNfdmFsaWQoJnR1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX1JFTCwgQ0xPQ0tfTU9OT1RPTklDKTsKKwlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX01PREVfUkVMLCBDTE9DS19NT05PVE9OSUMpOwogfQogCiAvKgpAQCAtNzc5LDU2ICsxMzExLDYwIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2hydGltZXJzX2NwdShpbnQgY3B1KQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJnBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgY3B1KTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrLCBiYXNlKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJmJhc2UtPmxvY2spOwotCQlsb2NrZGVwX3NldF9jbGFzcygmYmFzZS0+bG9jaywgJmJhc2UtPmxvY2tfa2V5KTsKLQl9CisJc3Bpbl9sb2NrX2luaXQoJmNwdV9iYXNlLT5sb2NrKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmY3B1X2Jhc2UtPmxvY2ssICZjcHVfYmFzZS0+bG9ja19rZXkpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCWNwdV9iYXNlLT5jbG9ja19iYXNlW2ldLmNwdV9iYXNlID0gY3B1X2Jhc2U7CisKKwlocnRpbWVyX2luaXRfaHJlcyhjcHVfYmFzZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVyX2xpc3Qoc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsCi0JCQkJc3RydWN0IGhydGltZXJfYmFzZSAqbmV3X2Jhc2UpCitzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpvbGRfYmFzZSwKKwkJCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpuZXdfYmFzZSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKIAl3aGlsZSAoKG5vZGUgPSByYl9maXJzdCgmb2xkX2Jhc2UtPmFjdGl2ZSkpKSB7CiAJCXRpbWVyID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhydGltZXIsIG5vZGUpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBvbGRfYmFzZSk7CisJCUJVR19PTihocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUsIDApOwogCQl0aW1lci0+YmFzZSA9IG5ld19iYXNlOwotCQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwkJLyoKKwkJICogRW5xdWV1ZSB0aGUgdGltZXIuIEFsbG93IHJlcHJvZ3JhbW1pbmcgb2YgdGhlIGV2ZW50IGRldmljZQorCQkgKi8KKwkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMSk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJzKGludCBjcHUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKIAlpbnQgaTsKIAogCUJVR19PTihjcHVfb25saW5lKGNwdSkpOwotCW9sZF9iYXNlID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOwotCW5ld19iYXNlID0gZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJb2xkX2Jhc2UgPSAmcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOworCW5ld19iYXNlID0gJmdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJdGlja19jYW5jZWxfc2NoZWRfdGltZXIoY3B1KTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hSVElNRVJfQkFTRVM7IGkrKykgeworCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOworCXNwaW5fbG9jaygmb2xkX2Jhc2UtPmxvY2spOwogCi0JCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOwotCQlzcGluX2xvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQotCQlCVUdfT04ob2xkX2Jhc2UtPmN1cnJfdGltZXIpOwotCi0JCW1pZ3JhdGVfaHJ0aW1lcl9saXN0KG9sZF9iYXNlLCBuZXdfYmFzZSk7Ci0KLQkJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJm5ld19iYXNlLT5sb2NrKTsKLQkJb2xkX2Jhc2UrKzsKLQkJbmV3X2Jhc2UrKzsKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKykgeworCQltaWdyYXRlX2hydGltZXJfbGlzdCgmb2xkX2Jhc2UtPmNsb2NrX2Jhc2VbaV0sCisJCQkJICAgICAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbaV0pOwogCX0KKwlzcGluX3VubG9jaygmb2xkX2Jhc2UtPmxvY2spOworCXNwaW5fdW5sb2NrKCZuZXdfYmFzZS0+bG9jayk7CiAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcHV0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CkBAIC04NDgsNiArMTM4NCw3IEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAljYXNlIENQVV9ERUFEOgorCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwgJmNwdSk7CiAJCW1pZ3JhdGVfaHJ0aW1lcnMoY3B1KTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTg2OCw1ICsxNDA1LDggQEAKIAlocnRpbWVyX2NwdV9ub3RpZnkoJmhydGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHJ0aW1lcnNfbmIpOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlvcGVuX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRLCBydW5faHJ0aW1lcl9zb2Z0aXJxLCBOVUxMKTsKKyNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDQ3NWU4YTcuLjAxMzNmNGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIC8qKgogICoJc2V0X2lycV9kYXRhIC0gc2V0IGlycSB0eXBlIGRhdGEgZm9yIGFuIGlycQogICoJQGlycToJSW50ZXJydXB0IG51bWJlcgotICoJQGRhdGE6CVBvaW50ZXIgdG8gaW50ZXJydXB0IHNwZWNpZmljIGRhdGEKKyAqCUBlbnRyeToJUG9pbnRlciB0byBNU0kgZGVzY3JpcHRvciBkYXRhCiAgKgogICoJU2V0IHRoZSBoYXJkd2FyZSBpcnEgY29udHJvbGxlciBkYXRhIGZvciBhbiBpcnEKICAqLwpAQCAtMjMwLDEwICsyMzAsNiBAQAogICovCiBzdGF0aWMgdm9pZCBkZWZhdWx0X2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQotCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9ERUxBWUVEX0RJU0FCTEUpKQotCQlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CiB9CiAKIC8qCkBAIC0yOTgsMTMgKzI5NCwxOCBAQAogCiAJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKIAkJZ290byBvdXRfdW5sb2NrOwotCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9SRVBMQVkgfCBJUlFfV0FJVElORyk7CiAJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CiAKIAlhY3Rpb24gPSBkZXNjLT5hY3Rpb247Ci0JaWYgKHVubGlrZWx5KCFhY3Rpb24gfHwgKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkpKQorCWlmICh1bmxpa2VseSghYWN0aW9uIHx8IChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKSkgeworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKKwkJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HKTsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCisJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HIHwgSVJRX1BFTkRJTkcpOwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKIAlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAKQEAgLTM5NiwxMSArMzk3LDEzIEBACiAKIAkvKgogCSAqIElmIGl0cyBkaXNhYmxlZCBvciBubyBhY3Rpb24gYXZhaWxhYmxlCi0JICoga2VlcCBpdCBtYXNrZWQgYW5kIGdldCBvdXQgb2YgaGVyZQorCSAqIHRoZW4gbWFzayBpdCBhbmQgZ2V0IG91dCBvZiBoZXJlOgogCSAqLwogCWFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKIAlpZiAodW5saWtlbHkoIWFjdGlvbiB8fCAoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01NjIsMTAgKzU2NSw4IEBACiAKIAkvKiBVbmluc3RhbGw/ICovCiAJaWYgKGhhbmRsZSA9PSBoYW5kbGVfYmFkX2lycSkgewotCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKLQkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKLQkJCWRlc2MtPmNoaXAtPmFjayhpcnEpOwotCQl9CisJCWlmIChkZXNjLT5jaGlwICE9ICZub19pcnFfY2hpcCkKKwkJCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOwogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwogCQlkZXNjLT5kZXB0aCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggYWNjNWQ5Zi4uNTU5N2MxNSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC0zOCw2ICszOCw0NiBAQAogfQogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogCisvKioKKyAqCWlycV9jYW5fc2V0X2FmZmluaXR5IC0gQ2hlY2sgaWYgdGhlIGFmZmluaXR5IG9mIGEgZ2l2ZW4gaXJxIGNhbiBiZSBzZXQKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gY2hlY2sKKyAqCisgKi8KK2ludCBpcnFfY2FuX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJaWYgKENIRUNLX0lSUV9QRVJfQ1BVKGRlc2MtPnN0YXR1cykgfHwgIWRlc2MtPmNoaXAgfHwKKwkgICAgIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglpcnFfc2V0X2FmZmluaXR5IC0gU2V0IHRoZSBpcnEgYWZmaW5pdHkgb2YgYSBnaXZlbiBpcnEKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gc2V0IGFmZmluaXR5CisgKglAY3B1bWFzazoJY3B1bWFzaworICoKKyAqLworaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlpZiAoIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisJc2V0X3BlbmRpbmdfaXJxKGlycSwgY3B1bWFzayk7CisjZWxzZQorCWRlc2MtPmFmZmluaXR5ID0gY3B1bWFzazsKKwlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogLyoqCkBAIC0yODEsNiArMzIxLDEwIEBACiAJaWYgKG5ldy0+ZmxhZ3MgJiBJUlFGX1BFUkNQVSkKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogI2VuZGlmCisJLyogRXhjbHVkZSBJUlEgZnJvbSBiYWxhbmNpbmcgKi8KKwlpZiAobmV3LT5mbGFncyAmIElSUUZfTk9CQUxBTkNJTkcpCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfTk9fQkFMQU5DSU5HOworCiAJaWYgKCFzaGFyZWQpIHsKIAkJaXJxX2NoaXBfc2V0X2RlZmF1bHRzKGRlc2MtPmNoaXApOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IDZkM2JlMDYuLjJkYjkxZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0xNiwyNiArMTYsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKLXZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKLXsKLQlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBtYXNrX3ZhbCk7Ci0KLQkvKgotCSAqIFNhdmUgdGhlc2UgYXdheSBmb3IgbGF0ZXIgdXNlLiBSZS1wcm9nYW0gd2hlbiB0aGUKLQkgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZwotCSAqLwotCXNldF9wZW5kaW5nX2lycShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbHNlCi12b2lkIHByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCi17Ci0Jc2V0X2JhbGFuY2VfaXJxX2FmZmluaXR5KGlycSwgbWFza192YWwpOwotCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBtYXNrX3ZhbDsKLQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGlycV9hZmZpbml0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewpAQCAtNTUsNyArMzUsNyBAQAogCWNwdW1hc2tfdCBuZXdfdmFsdWUsIHRtcDsKIAogCWlmICghaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkgfHwgbm9faXJxX2FmZmluaXR5IHx8Ci0JCQkJQ0hFQ0tfSVJRX1BFUl9DUFUoaXJxX2Rlc2NbaXJxXS5zdGF0dXMpKQorCSAgICBpcnFfYmFsYW5jaW5nX2Rpc2FibGVkKGlycSkpCiAJCXJldHVybiAtRUlPOwogCiAJZXJyID0gY3B1bWFza19wYXJzZV91c2VyKGJ1ZmZlciwgY291bnQsIG5ld192YWx1ZSk7CkBAIC03Myw3ICs1Myw3IEBACiAJCSAgIGNvZGUgdG8gc2V0IGRlZmF1bHQgU01QIGFmZmluaXR5LiAqLwogCQlyZXR1cm4gc2VsZWN0X3NtcF9hZmZpbml0eShpcnEpID8gLUVJTlZBTCA6IGZ1bGxfY291bnQ7CiAKLQlwcm9jX3NldF9pcnFfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOworCWlycV9zZXRfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOwogCiAJcmV0dXJuIGZ1bGxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXRpbWVyLmMgYi9rZXJuZWwvaXRpbWVyLmMKaW5kZXggMjA0ZWQ3OS4uMzA3YzZhNiAxMDA2NDQKLS0tIGEva2VybmVsL2l0aW1lci5jCisrKyBiL2tlcm5lbC9pdGltZXIuYwpAQCAtMTI4LDE4ICsxMjgsMTMgQEAKIC8qCiAgKiBUaGUgdGltZXIgaXMgYXV0b21hZ2ljYWxseSByZXN0YXJ0ZWQsIHdoZW4gaW50ZXJ2YWwgIT0gMAogICovCi1pbnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitlbnVtIGhydGltZXJfcmVzdGFydCBpdF9yZWFsX2ZuKHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnID0KIAkgICAgY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCwgcmVhbF90aW1lcik7CiAKIAlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0FMUk0sIFNFTkRfU0lHX1BSSVYsIHNpZy0+dHNrKTsKIAotCWlmIChzaWctPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKLQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCB0aW1lci0+YmFzZS0+c29mdGlycV90aW1lLAotCQkJCXNpZy0+aXRfcmVhbF9pbmNyKTsKLQkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKLQl9CiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCkBAIC0yMzEsMTEgKzIyNiwxNCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQkJZ290byBhZ2FpbjsKIAkJfQotCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyID0KLQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKIAkJZXhwaXJlcyA9IHRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X3ZhbHVlKTsKLQkJaWYgKGV4cGlyZXMudHY2NCAhPSAwKQotCQkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9SRUwpOworCQlpZiAoZXhwaXJlcy50djY0ICE9IDApIHsKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQorCQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKKwkJCWhydGltZXJfc3RhcnQodGltZXIsIGV4cGlyZXMsIEhSVElNRVJfTU9ERV9SRUwpOworCQl9IGVsc2UKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IudHY2NCA9IDA7CisKIAkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQlicmVhazsKIAljYXNlIElUSU1FUl9WSVJUVUFMOgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKaW5kZXggN2MzZTFlNi4uNjU3Zjc3NiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJICogc2hvdWxkIGJlIGFibGUgdG8gc2VlIGl0LgogCQkgKi8KIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CiAJCWlmIChwKSB7CiAJCQlpZiAoQ1BVQ0xPQ0tfUEVSVEhSRUFEKHdoaWNoX2Nsb2NrKSkgewpAQCAtMzEyLDEyICszMTIsMTcgQEAKIAkJCQkJZXJyb3IgPSBjcHVfY2xvY2tfc2FtcGxlKHdoaWNoX2Nsb2NrLAogCQkJCQkJCQkgcCwgJnJ0bik7CiAJCQkJfQotCQkJfSBlbHNlIGlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKLQkJCQllcnJvciA9IGNwdV9jbG9ja19zYW1wbGVfZ3JvdXAod2hpY2hfY2xvY2ssCi0JCQkJCQkJICAgICAgIHAsICZydG4pOworCQkJfSBlbHNlIHsKKwkJCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQkJCWlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKKwkJCQkJZXJyb3IgPQorCQkJCQkgICAgY3B1X2Nsb2NrX3NhbXBsZV9ncm91cCh3aGljaF9jbG9jaywKKwkJCQkJCQkgICAgICAgICAgIHAsICZydG4pOworCQkJCX0KKwkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJCQl9CiAJCX0KLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggYTFiZjYxNi4uNDQzMThjYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCQkgICAgc3RydWN0IGl0aW1lcnNwZWMgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7CiBzdGF0aWMgaW50IGNvbW1vbl90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7CiAKLXN0YXRpYyBpbnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpOworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBvc2l4X3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBrX2l0aW1lciAqbG9ja190aW1lcih0aW1lcl90IHRpbWVyX2lkLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiAKQEAgLTMzNCwxMiArMzM0LDEyIEBACiAKICAqIFRoaXMgY29kZSBpcyBmb3IgQ0xPQ0tfUkVBTFRJTUUqIGFuZCBDTE9DS19NT05PVE9OSUMqIHRpbWVycy4KICAqLwotc3RhdGljIGludCBwb3NpeF90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXN0cnVjdCBrX2l0aW1lciAqdGltcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaV9wcml2YXRlID0gMDsKLQlpbnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJZW51bSBocnRpbWVyX3Jlc3RhcnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CiAKIAl0aW1yID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qga19pdGltZXIsIGl0LnJlYWwudGltZXIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1yLT5pdF9sb2NrLCBmbGFncyk7CkBAIC0zNTYsNyArMzU2LDcgQEAKIAkJaWYgKHRpbXItPml0LnJlYWwuaW50ZXJ2YWwudHY2NCAhPSAwKSB7CiAJCQl0aW1yLT5pdF9vdmVycnVuICs9CiAJCQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLAotCQkJCQkJdGltZXItPmJhc2UtPnNvZnRpcnFfdGltZSwKKwkJCQkJCWhydGltZXJfY2JfZ2V0X3RpbWUodGltZXIpLAogCQkJCQkJdGltci0+aXQucmVhbC5pbnRlcnZhbCk7CiAJCQlyZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CiAJCQkrK3RpbXItPml0X3JlcXVldWVfcGVuZGluZzsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmICghbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyAmJiAhbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X25zZWMpCiAJCXJldHVybiAwOwogCi0JbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfQUJTIDogSFJUSU1FUl9SRUw7CisJbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMOwogCWhydGltZXJfaW5pdCgmdGltci0+aXQucmVhbC50aW1lciwgdGltci0+aXRfY2xvY2ssIG1vZGUpOwogCXRpbXItPml0LnJlYWwudGltZXIuZnVuY3Rpb24gPSBwb3NpeF90aW1lcl9mbjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJLyogU0lHRVZfTk9ORSB0aW1lcnMgYXJlIG5vdCBxdWV1ZWQgISBTZWUgY29tbW9uX3RpbWVyX2dldCAqLwogCWlmICgoKHRpbXItPml0X3NpZ2V2X25vdGlmeSAmIH5TSUdFVl9USFJFQURfSUQpID09IFNJR0VWX05PTkUpKSB7CiAJCS8qIFNldHVwIGNvcnJlY3QgZXhwaXJ5IHRpbWUgZm9yIHJlbGF0aXZlIHRpbWVycyAqLwotCQlpZiAobW9kZSA9PSBIUlRJTUVSX1JFTCkKKwkJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkKIAkJCXRpbWVyLT5leHBpcmVzID0ga3RpbWVfYWRkKHRpbWVyLT5leHBpcmVzLAogCQkJCQkJICAgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOwogCQlyZXR1cm4gMDsKQEAgLTk1MCw3ICs5NTAsOCBAQAogCQkJIHN0cnVjdCB0aW1lc3BlYyAqdHNhdmUsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCiB7CiAJcmV0dXJuIGhydGltZXJfbmFub3NsZWVwKHRzYXZlLCBybXRwLCBmbGFncyAmIFRJTUVSX0FCU1RJTUUgPwotCQkJCSBIUlRJTUVSX0FCUyA6IEhSVElNRVJfUkVMLCB3aGljaF9jbG9jayk7CisJCQkJIEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMLAorCQkJCSB3aGljaF9jbG9jayk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZwpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNGFiMTdkYS4uMTgwOTc4YyAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAkvKiBTZXR1cCB0aGUgdGltZXIsIHdoZW4gdGltZW91dCAhPSBOVUxMICovCiAJaWYgKHVubGlrZWx5KHRpbWVvdXQpKQogCQlocnRpbWVyX3N0YXJ0KCZ0aW1lb3V0LT50aW1lciwgdGltZW91dC0+dGltZXIuZXhwaXJlcywKLQkJCSAgICAgIEhSVElNRVJfQUJTKTsKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwogCiAJZm9yICg7OykgewogCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4MDcyZTU2Li5lMmE3ZDRiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC00NTYsMjYgKzQ1Niw1MCBAQAogaW50IGRlcXVldWVfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqbWFzaywgc2lnaW5mb190ICppbmZvKQogewogCWludCBzaWduciA9IF9fZGVxdWV1ZV9zaWduYWwoJnRzay0+cGVuZGluZywgbWFzaywgaW5mbyk7Ci0JaWYgKCFzaWducikKKwlpZiAoIXNpZ25yKSB7CiAJCXNpZ25yID0gX19kZXF1ZXVlX3NpZ25hbCgmdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLAogCQkJCQkgbWFzaywgaW5mbyk7CisJCS8qCisJCSAqIGl0aW1lciBzaWduYWwgPworCQkgKgorCQkgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYworCQkgKiBpdGltZXJzIGluIHRoZSBzaWduYWwgZGVsaXZlcnkgcGF0aCB0byBwcmV2ZW50IERvUworCQkgKiBhdHRhY2tzIGluIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY2FzZS4gVGhpcyBpcworCQkgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKKwkJICogaXRpbWVycywgYXMgdGhlIFNJR0FMUk0gaXMgYSBsZWdhY3kgc2lnbmFsIGFuZCBvbmx5CisJCSAqIHF1ZXVlZCBvbmNlLiBDaGFuZ2luZyB0aGUgcmVzdGFydCBiZWhhdmlvdXIgdG8KKwkJICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKKwkJICogcmVkdWNpbmcgdGhlIHRpbWVyIG5vaXNlIG9uIGhlYXZ5IGxvYWRlZCAhaGlnaHJlcworCQkgKiBzeXN0ZW1zIHRvby4KKwkJICovCisJCWlmICh1bmxpa2VseShzaWduciA9PSBTSUdBTFJNKSkgeworCQkJc3RydWN0IGhydGltZXIgKnRtciA9ICZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcjsKKworCQkJaWYgKCFocnRpbWVyX2lzX3F1ZXVlZCh0bXIpICYmCisJCQkgICAgdHNrLT5zaWduYWwtPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKKwkJCQlocnRpbWVyX2ZvcndhcmQodG1yLCB0bXItPmJhc2UtPmdldF90aW1lKCksCisJCQkJCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyKTsKKwkJCQlocnRpbWVyX3Jlc3RhcnQodG1yKTsKKwkJCX0KKwkJfQorCX0KIAlyZWNhbGNfc2lncGVuZGluZ190c2sodHNrKTsKLSAJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7Ci0gCQkvKgotIAkJICogU2V0IGEgbWFya2VyIHRoYXQgd2UgaGF2ZSBkZXF1ZXVlZCBhIHN0b3Agc2lnbmFsLiAgT3VyCi0gCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZwotIAkJICogc3RvcCBzaWduYWwgaXQgaXMgYWJvdXQgdG8gcHJvY2VzcyBpcyBubyBsb25nZXIgaW4gdGhlCi0gCQkgKiBwZW5kaW5nIGJpdG1hc2tzLCBidXQgbXVzdCBzdGlsbCBiZSBjbGVhcmVkIGJ5IGEgU0lHQ09OVAotIAkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKLSAJCSAqIHNoYXJlZCBmbGFnIGFmdGVyIHdlJ3ZlIHNldCBpdC4gIE5vdGUgdGhhdCB0aGlzIGZsYWcgbWF5Ci0gCQkgKiByZW1haW4gc2V0IGFmdGVyIHRoZSBzaWduYWwgd2UgcmV0dXJuIGlzIGlnbm9yZWQgb3IKLSAJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQotIAkJICogaXMgdG8gYWxlcnQgc3RvcC1zaWduYWwgcHJvY2Vzc2luZyBjb2RlIHdoZW4gYW5vdGhlcgotIAkJICogcHJvY2Vzc29yIGhhcyBjb21lIGFsb25nIGFuZCBjbGVhcmVkIHRoZSBmbGFnLgotIAkJICovCi0gCQlpZiAoISh0c2stPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpCi0gCQkJdHNrLT5zaWduYWwtPmZsYWdzIHw9IFNJR05BTF9TVE9QX0RFUVVFVUVEOwotIAl9CisJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7CisJCS8qCisJCSAqIFNldCBhIG1hcmtlciB0aGF0IHdlIGhhdmUgZGVxdWV1ZWQgYSBzdG9wIHNpZ25hbC4gIE91cgorCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZworCQkgKiBzdG9wIHNpZ25hbCBpdCBpcyBhYm91dCB0byBwcm9jZXNzIGlzIG5vIGxvbmdlciBpbiB0aGUKKwkJICogcGVuZGluZyBiaXRtYXNrcywgYnV0IG11c3Qgc3RpbGwgYmUgY2xlYXJlZCBieSBhIFNJR0NPTlQKKwkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKKwkJICogc2hhcmVkIGZsYWcgYWZ0ZXIgd2UndmUgc2V0IGl0LiAgTm90ZSB0aGF0IHRoaXMgZmxhZyBtYXkKKwkJICogcmVtYWluIHNldCBhZnRlciB0aGUgc2lnbmFsIHdlIHJldHVybiBpcyBpZ25vcmVkIG9yCisJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQorCQkgKiBpcyB0byBhbGVydCBzdG9wLXNpZ25hbCBwcm9jZXNzaW5nIGNvZGUgd2hlbiBhbm90aGVyCisJCSAqIHByb2Nlc3NvciBoYXMgY29tZSBhbG9uZyBhbmQgY2xlYXJlZCB0aGUgZmxhZy4KKwkJICovCisJCWlmICghKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSkKKwkJCXRzay0+c2lnbmFsLT5mbGFncyB8PSBTSUdOQUxfU1RPUF9ERVFVRVVFRDsKKwl9CiAJaWYgKCBzaWduciAmJgogCSAgICAgKChpbmZvLT5zaV9jb2RlICYgX19TSV9NQVNLKSA9PSBfX1NJX1RJTUVSKSAmJgogCSAgICAgaW5mby0+c2lfc3lzX3ByaXZhdGUpewpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggOTE4ZTUyZC4uOGI3NTAwOCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogLyoKQEAgLTI3Myw2ICsyNzQsMTggQEAKIAogI2VuZGlmCiAKKy8qCisgKiBFbnRlciBhbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBpcnFfZW50ZXIodm9pZCkKK3sKKwlfX2lycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19OT19IWgorCWlmIChpZGxlX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQl0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXMoKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQKICMgZGVmaW5lIGludm9rZV9zb2Z0aXJxKCkJX19kb19zb2Z0aXJxKCkKICNlbHNlCkBAIC0yODksNiArMzAyLDEyIEBACiAJc3ViX3ByZWVtcHRfY291bnQoSVJRX0VYSVRfT0ZGU0VUKTsKIAlpZiAoIWluX2ludGVycnVwdCgpICYmIGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQogCQlpbnZva2Vfc29mdGlycSgpOworCisjaWZkZWYgQ09ORklHX05PX0haCisJLyogTWFrZSBzdXJlIHRoYXQgdGltZXIgd2hlZWwgdXBkYXRlcyBhcmUgcHJvcGFnYXRlZCAqLworCWlmICghaW5faW50ZXJydXB0KCkgJiYgaWRsZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJiAhbmVlZF9yZXNjaGVkKCkpCisJCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soKTsKKyNlbmRpZgogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggMGUwMTdiZmYuLmM2YzgwZWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTQ3MCw2ICs0NzAsMjYwIEBACiAJcmV0dXJuIHR2OwogfQogCisvKgorICogQ29udmVydCBqaWZmaWVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYmFjay4KKyAqCisgKiBBdm9pZCB1bm5lY2Vzc2FyeSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zIGluIHRoZQorICogdHdvIG1vc3QgY29tbW9uIEhaIGNhc2VzOgorICovCit1bnNpZ25lZCBpbnQgamlmZmllc190b19tc2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gTVNFQ19QRVJfU0VDICYmICEoTVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChNU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBNU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogTVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fbXNlY3MpOworCit1bnNpZ25lZCBpbnQgamlmZmllc190b191c2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gVVNFQ19QRVJfU0VDICYmICEoVVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChVU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBVU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gVVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogVVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fdXNlY3MpOworCisvKgorICogV2hlbiB3ZSBjb252ZXJ0IHRvIGppZmZpZXMgdGhlbiB3ZSBpbnRlcnByZXQgaW5jb21pbmcgdmFsdWVzCisgKiB0aGUgZm9sbG93aW5nIHdheToKKyAqCisgKiAtIG5lZ2F0aXZlIHZhbHVlcyBtZWFuICdpbmZpbml0ZSB0aW1lb3V0JyAoTUFYX0pJRkZZX09GRlNFVCkKKyAqCisgKiAtICd0b28gbGFyZ2UnIHZhbHVlcyBbdGhhdCB3b3VsZCByZXN1bHQgaW4gbGFyZ2VyIHRoYW4KKyAqICAgTUFYX0pJRkZZX09GRlNFVCB2YWx1ZXNdIG1lYW4gJ2luZmluaXRlIHRpbWVvdXQnIHRvby4KKyAqCisgKiAtIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBqaWZmaWVzIGJ5IGVpdGhlciBtdWx0aXBseWluZworICogICB0aGUgaW5wdXQgdmFsdWUgYnkgYSBmYWN0b3Igb3IgZGl2aWRpbmcgaXQgd2l0aCBhIGZhY3RvcgorICoKKyAqIFdlIG11c3QgYWxzbyBiZSBjYXJlZnVsIGFib3V0IDMyLWJpdCBvdmVyZmxvd3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgbSkKK3sKKwkvKgorCSAqIE5lZ2F0aXZlIHZhbHVlLCBtZWFucyBpbmZpbml0ZSB0aW1lb3V0OgorCSAqLworCWlmICgoaW50KW0gPCAwKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQorCS8qCisJICogSFogaXMgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIDEwMDAsIGFuZCAxMDAwIGlzIGEgbmljZQorCSAqIHJvdW5kIG11bHRpcGxlIG9mIEhaLCBkaXZpZGUgd2l0aCB0aGUgZmFjdG9yIGJldHdlZW4gdGhlbSwKKwkgKiBidXQgcm91bmQgdXB3YXJkczoKKwkgKi8KKwlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwkvKgorCSAqIEhaIGlzIGxhcmdlciB0aGFuIDEwMDAsIGFuZCBIWiBpcyBhIG5pY2Ugcm91bmQgbXVsdGlwbGUgb2YKKwkgKiAxMDAwIC0gc2ltcGx5IG11bHRpcGx5IHdpdGggdGhlIGZhY3RvciBiZXR3ZWVuIHRoZW0uCisJICoKKwkgKiBCdXQgZmlyc3QgbWFrZSBzdXJlIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgY2Fubm90CisJICogb3ZlcmZsb3c6CisJICovCisJaWYgKG0gPiBqaWZmaWVzX3RvX21zZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworCXJldHVybiBtICogKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJLyoKKwkgKiBHZW5lcmljIGNhc2UgLSBtdWx0aXBseSwgcm91bmQgYW5kIGRpdmlkZS4gQnV0IGZpcnN0CisJICogY2hlY2sgdGhhdCBpZiB3ZSBhcmUgZG9pbmcgYSBuZXQgbXVsdGlwbGljYXRpb24sIHRoYXQKKwkgKiB3ZSB3b3VsZG50IG92ZXJmbG93OgorCSAqLworCWlmIChIWiA+IE1TRUNfUEVSX1NFQyAmJiBtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKKwkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7CisKKwlyZXR1cm4gKG0gKiBIWiArIE1TRUNfUEVSX1NFQyAtIDEpIC8gTVNFQ19QRVJfU0VDOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKG1zZWNzX3RvX2ppZmZpZXMpOworCit1bnNpZ25lZCBsb25nIHVzZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IHUpCit7CisJaWYgKHUgPiBqaWZmaWVzX3RvX3VzZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7CisjZWxzZQorCXJldHVybiAodSAqIEhaICsgVVNFQ19QRVJfU0VDIC0gMSkgLyBVU0VDX1BFUl9TRUM7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wodXNlY3NfdG9famlmZmllcyk7CisKKy8qCisgKiBUaGUgVElDS19OU0VDIC0gMSByb3VuZHMgdXAgdGhlIHZhbHVlIHRvIHRoZSBuZXh0IHJlc29sdXRpb24uICBOb3RlCisgKiB0aGF0IGEgcmVtYWluZGVyIHN1YnRyYWN0IGhlcmUgd291bGQgbm90IGRvIHRoZSByaWdodCB0aGluZyBhcyB0aGUKKyAqIHJlc29sdXRpb24gdmFsdWVzIGRvbid0IGZhbGwgb24gc2Vjb25kIGJvdW5kcmllcy4gIEkuZS4gdGhlIGxpbmU6CisgKiBuc2VjIC09IG5zZWMgJSBUSUNLX05TRUM7IGlzIE5PVCBhIGNvcnJlY3QgcmVzb2x1dGlvbiByb3VuZGluZy4KKyAqCisgKiBSYXRoZXIsIHdlIGp1c3Qgc2hpZnQgdGhlIGJpdHMgb2ZmIHRoZSByaWdodC4KKyAqCisgKiBUaGUgPj4gKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykgY29udmVydHMgdGhlIHNjYWxlZCBuc2VjCisgKiB2YWx1ZSB0byBhIHNjYWxlZCBzZWNvbmQgdmFsdWUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWVzcGVjX3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlYyA9IHZhbHVlLT50dl9zZWM7CisJbG9uZyBuc2VjID0gdmFsdWUtPnR2X25zZWMgKyBUSUNLX05TRUMgLSAxOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCW5zZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCluc2VjICogTlNFQ19DT05WRVJTSU9OKSA+PgorCQkgKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykpKSA+PiBTRUNfSklGRklFX1NDOworCit9CitFWFBPUlRfU1lNQk9MKHRpbWVzcGVjX3RvX2ppZmZpZXMpOworCit2b2lkCitqaWZmaWVzX3RvX3RpbWVzcGVjKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwkvKgorCSAqIENvbnZlcnQgamlmZmllcyB0byBuYW5vc2Vjb25kcyBhbmQgc2VwYXJhdGUgd2l0aAorCSAqIG9uZSBkaXZpZGUuCisJICovCisJdTY0IG5zZWMgPSAodTY0KWppZmZpZXMgKiBUSUNLX05TRUM7CisJdmFsdWUtPnR2X3NlYyA9IGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnZhbHVlLT50dl9uc2VjKTsKK30KK0VYUE9SVF9TWU1CT0woamlmZmllc190b190aW1lc3BlYyk7CisKKy8qIFNhbWUgZm9yICJ0aW1ldmFsIgorICoKKyAqIFdlbGwsIGFsbW9zdC4gIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVhbCBzeXN0ZW0gcmVzb2x1dGlvbiBpcworICogaW4gbmFub3NlY29uZHMgYW5kIHRoZSB2YWx1ZSBiZWluZyBjb252ZXJ0ZWQgaXMgaW4gbWljcm8gc2Vjb25kcy4KKyAqIEFsc28gZm9yIHNvbWUgbWFjaGluZXMgKHRob3NlIHRoYXQgdXNlIEhaID0gMTAyNCwgaW4tcGFydGljdWxhciksCisgKiB0aGVyZSBpcyBhIExBUkdFIGVycm9yIGluIHRoZSB0aWNrIHNpemUgaW4gbWljcm9zZWNvbmRzLgorCisgKiBUaGUgc29sdXRpb24gd2UgdXNlIGlzIHRvIGRvIHRoZSByb3VuZGluZyBBRlRFUiB3ZSBjb252ZXJ0IHRoZQorICogbWljcm9zZWNvbmQgcGFydC4gIFRodXMgdGhlIFVTRUNfUk9VTkQsIHRoZSBiaXRzIHRvIGJlIHNoaWZ0ZWQgb2ZmLgorICogSW5zdHJ1Y3Rpb24gd2lzZSwgdGhpcyBzaG91bGQgY29zdCBvbmx5IGFuIGFkZGl0aW9uYWwgYWRkIHdpdGggY2FycnkKKyAqIGluc3RydWN0aW9uIGFib3ZlIHRoZSB3YXkgaXQgd2FzIGRvbmUgYWJvdmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWV2YWxfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOworCWxvbmcgdXNlYyA9IHZhbHVlLT50dl91c2VjOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCXVzZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCl1c2VjICogVVNFQ19DT05WRVJTSU9OICsgVVNFQ19ST1VORCkgPj4KKwkJIChVU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKK30KKwordm9pZCBqaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJLyoKKwkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKKwkgKiBvbmUgZGl2aWRlLgorCSAqLworCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOworCWxvbmcgdHZfdXNlYzsKKworCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0dl91c2VjKTsKKwl0dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7CisJdmFsdWUtPnR2X3VzZWMgPSB0dl91c2VjOworfQorCisvKgorICogQ29udmVydCBqaWZmaWVzL2ppZmZpZXNfNjQgdG8gY2xvY2tfdCBhbmQgYmFjay4KKyAqLworY2xvY2tfdCBqaWZmaWVzX3RvX2Nsb2NrX3QobG9uZyB4KQoreworI2lmIChUSUNLX05TRUMgJSAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpID09IDAKKwlyZXR1cm4geCAvIChIWiAvIFVTRVJfSFopOworI2Vsc2UKKwl1NjQgdG1wID0gKHU2NCl4ICogVElDS19OU0VDOworCWRvX2Rpdih0bXAsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7CisJcmV0dXJuIChsb25nKXRtcDsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChqaWZmaWVzX3RvX2Nsb2NrX3QpOworCit1bnNpZ25lZCBsb25nIGNsb2NrX3RfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHgpCit7CisjaWYgKEhaICUgVVNFUl9IWik9PTAKKwlpZiAoeCA+PSB+MFVMIC8gKEhaIC8gVVNFUl9IWikpCisJCXJldHVybiB+MFVMOworCXJldHVybiB4ICogKEhaIC8gVVNFUl9IWik7CisjZWxzZQorCXU2NCBqaWY7CisKKwkvKiBEb24ndCB3b3JyeSBhYm91dCBsb3NzIG9mIHByZWNpc2lvbiBoZXJlIC4uICovCisJaWYgKHggPj0gfjBVTCAvIEhaICogVVNFUl9IWikKKwkJcmV0dXJuIH4wVUw7CisKKwkvKiAuLiBidXQgZG8gdHJ5IHRvIGNvbnRhaW4gaXQgaGVyZSAqLworCWppZiA9IHggKiAodTY0KSBIWjsKKwlkb19kaXYoamlmLCBVU0VSX0haKTsKKwlyZXR1cm4gamlmOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGNsb2NrX3RfdG9famlmZmllcyk7CisKK3U2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAorCWRvX2Rpdih4LCBIWiAvIFVTRVJfSFopOworI2Vsc2UKKwkvKgorCSAqIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0aGF0IGRvbid0IG92ZXJmbG93IGVhcmx5LAorCSAqIGJ1dCBldmVuIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbiBodW5kcmVkcyBvZiB5ZWFycworCSAqIGluIDY0IGJpdHMsIHNvLi4KKwkgKi8KKwl4ICo9IFRJQ0tfTlNFQzsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbmRpZgorCXJldHVybiB4OworfQorCitFWFBPUlRfU1lNQk9MKGppZmZpZXNfNjRfdG9fY2xvY2tfdCk7CisKK3U2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKE5TRUNfUEVSX1NFQyAlIFVTRVJfSFopID09IDAKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbGlmIChVU0VSX0haICUgNTEyKSA9PSAwCisJeCAqPSBVU0VSX0haLzUxMjsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIDUxMikpOworI2Vsc2UKKwkvKgorICAgICAgICAgKiBtYXggcmVsYXRpdmUgZXJyb3IgNS43ZS04ICgxLjhzIHBlciB5ZWFyKSBmb3IgVVNFUl9IWiA8PSAxMDI0LAorICAgICAgICAgKiBvdmVyZmxvdyBhZnRlciA2NC45OSB5ZWFycy4KKyAgICAgICAgICogZXhhY3QgZm9yIEhaPTYwLCA3MiwgOTAsIDEyMCwgMTQ0LCAxODAsIDMwMCwgNjAwLCA5MDAsIC4uLgorICAgICAgICAgKi8KKwl4ICo9IDk7CisJZG9fZGl2KHgsICh1bnNpZ25lZCBsb25nKSgoOXVsbCAqIE5TRUNfUEVSX1NFQyArIChVU0VSX0haLzIpKSAvCisJCQkJICBVU0VSX0haKSk7CisjZW5kaWYKKwlyZXR1cm4geDsKK30KKwogI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiB1NjQgZ2V0X2ppZmZpZXNfNjQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL0tjb25maWcgYi9rZXJuZWwvdGltZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgVGltZXIgc3Vic3lzdGVtIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjCitjb25maWcgVElDS19PTkVTSE9UCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTk9fSFoKKwlib29sICJUaWNrbGVzcyBTeXN0ZW0gKER5bmFtaWMgVGlja3MpIgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhIHRpY2tsZXNzIHN5c3RlbTogdGltZXIgaW50ZXJydXB0cyB3aWxsCisJICBvbmx5IHRyaWdnZXIgb24gYW4gYXMtbmVlZGVkIGJhc2lzIGJvdGggd2hlbiB0aGUgc3lzdGVtIGlzCisJICBidXN5IGFuZCB3aGVuIHRoZSBzeXN0ZW0gaXMgaWRsZS4KKworY29uZmlnIEhJR0hfUkVTX1RJTUVSUworCWJvb2wgIkhpZ2ggUmVzb2x1dGlvbiBUaW1lciBTdXBwb3J0IgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBoaWdoIHJlc29sdXRpb24gdGltZXIgc3VwcG9ydC4gSWYgeW91cgorCSAgaGFyZHdhcmUgaXMgbm90IGNhcGFibGUgdGhlbiB0aGlzIG9wdGlvbiBvbmx5IGluY3JlYXNlcworCSAgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBpbWFnZS4KKwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCA2MWEzOTA3Li45M2JjY2JhIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMSArMSw4IEBACi1vYmoteSArPSBudHAubyBjbG9ja3NvdXJjZS5vIGppZmZpZXMubworb2JqLXkgKz0gbnRwLm8gY2xvY2tzb3VyY2UubyBqaWZmaWVzLm8gdGltZXJfbGlzdC5vCisKK29iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTKQkJKz0gY2xvY2tldmVudHMubworb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCitvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IHRpY2stYnJvYWRjYXN0Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1vbmVzaG90Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1zY2hlZC5vCitvYmotJChDT05GSUdfVElNRVJfU1RBVFMpCQkJKz0gdGltZXJfc3RhdHMubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MzJlYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB3aGljaCBtYW5hZ2UgY2xvY2sgZXZlbnQgZGV2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworLyogVGhlIHJlZ2lzdGVyZWQgY2xvY2sgZXZlbnQgZGV2aWNlcyAqLworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50X2RldmljZXMpOworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisKKy8qIE5vdGlmaWNhdGlvbiBmb3IgY2xvY2sgZXZlbnRzICovCitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQoY2xvY2tldmVudHNfY2hhaW4pOworCisvKiBQcm90ZWN0aW9uIGZvciB0aGUgYWJvdmUgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tldmVudHNfbG9jayk7CisKKy8qKgorICogY2xvY2tldmVudHNfZGVsdGEybnMgLSBDb252ZXJ0IGEgbGF0Y2ggdmFsdWUgKGRldmljZSB0aWNrcykgdG8gbmFub3NlY29uZHMKKyAqIEBsYXRjaDoJdmFsdWUgdG8gY29udmVydAorICogQGV2dDoJcG9pbnRlciB0byBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIE1hdGggaGVscGVyLCByZXR1cm5zIGxhdGNoIHZhbHVlIGNvbnZlcnRlZCB0byBuYW5vc2Vjb25kcyAoYm91bmQgY2hlY2tlZCkKKyAqLwordW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X2RlbHRhMm5zKHVuc2lnbmVkIGxvbmcgbGF0Y2gsCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJdTY0IGNsYyA9ICgodTY0KSBsYXRjaCA8PCBldnQtPnNoaWZ0KTsKKworCWRvX2RpdihjbGMsIGV2dC0+bXVsdCk7CisJaWYgKGNsYyA8IDEwMDApCisJCWNsYyA9IDEwMDA7CisJaWYgKGNsYyA+IExPTkdfTUFYKQorCQljbGMgPSBMT05HX01BWDsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgY2xjOworfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3NldF9tb2RlIC0gc2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBvZiBhIGNsb2NrIGV2ZW50IGRldmljZQorICogQGRldjoJZGV2aWNlIHRvIG1vZGlmeQorICogQG1vZGU6CW5ldyBtb2RlCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICEKKyAqLwordm9pZCBjbG9ja2V2ZW50c19zZXRfbW9kZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJIGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlKQoreworCWlmIChkZXYtPm1vZGUgIT0gbW9kZSkgeworCQlkZXYtPnNldF9tb2RlKG1vZGUsIGRldik7CisJCWRldi0+bW9kZSA9IG1vZGU7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQgLSBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4KKyAqIEBleHBpcmVzOglhYnNvbHV0ZSBleHBpcnkgdGltZSAobW9ub3RvbmljIGNsb2NrKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVRJTUUgd2hlbiB0aGUgZXZlbnQgaXMgaW4gdGhlIHBhc3QuCisgKi8KK2ludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwga3RpbWVfdCBleHBpcmVzLAorCQkJICAgICAga3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsYzsKKwlpbnQ2NF90IGRlbHRhOworCisJZGVsdGEgPSBrdGltZV90b19ucyhrdGltZV9zdWIoZXhwaXJlcywgbm93KSk7CisKKwlpZiAoZGVsdGEgPD0gMCkKKwkJcmV0dXJuIC1FVElNRTsKKworCWRldi0+bmV4dF9ldmVudCA9IGV4cGlyZXM7CisKKwlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWx0YSA+IGRldi0+bWF4X2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWF4X2RlbHRhX25zOworCWlmIChkZWx0YSA8IGRldi0+bWluX2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWluX2RlbHRhX25zOworCisJY2xjID0gZGVsdGEgKiBkZXYtPm11bHQ7CisJY2xjID4+PSBkZXYtPnNoaWZ0OworCisJcmV0dXJuIGRldi0+c2V0X25leHRfZXZlbnQoKHVuc2lnbmVkIGxvbmcpIGNsYywgZGV2KTsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWdpc3Rlcl9ub3RpZmllciAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnRzIGNoYW5nZSBsaXN0ZW5lcgorICovCitpbnQgY2xvY2tldmVudHNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyZXQgPSByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIGNsb2NrIGV2ZW50cyBjaGFuZ2UgbGlzdGVuZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyYXdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmY2xvY2tldmVudHNfY2hhaW4sIG5iKTsKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb3RpZnkgYWJvdXQgYSBjbG9jayBldmVudCBjaGFuZ2UuIENhbGxlZCB3aXRoIGNsb2NrZXZlbnRzX2xvY2sKKyAqIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2RvX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqZGV2KQoreworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjbG9ja2V2ZW50c19jaGFpbiwgcmVhc29uLCBkZXYpOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGEgbm90aWZ5IGFkZCB0byBtYWtlIGRldmljZXMgYXZhaWxibGUgd2hpY2ggd2VyZQorICogcmVsZWFzZWQgZnJvbSB0aGUgbm90aWZpZXIgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbG9ja2V2ZW50c19yZWxlYXNlZCkpIHsKKwkJZGV2ID0gbGlzdF9lbnRyeShjbG9ja2V2ZW50c19yZWxlYXNlZC5uZXh0LAorCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZjbG9ja2V2ZW50X2RldmljZXMpOworCQljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiBAZGV2OglkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCUJVR19PTihkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCAmY2xvY2tldmVudF9kZXZpY2VzKTsKKwljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb29wIGhhbmRsZXIgd2hlbiB3ZSBzaHV0IGRvd24gYW4gZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2hhbmRsZV9ub29wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UgLSByZWxlYXNlIGFuZCByZXF1ZXN0IGNsb2NrIGRldmljZXMKKyAqIEBvbGQ6CWRldmljZSB0byByZWxlYXNlIChjYW4gYmUgTlVMTCkKKyAqIEBuZXc6CWRldmljZSB0byByZXF1ZXN0IChjYW4gYmUgTlVMTCkKKyAqCisgKiBDYWxsZWQgZnJvbSB0aGUgbm90aWZpZXIgY2hhaW4uIGNsb2NrZXZlbnRzX2xvY2sgaXMgaGVsZCBhbHJlYWR5CisgKi8KK3ZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBDYWxsZXIgcmVsZWFzZXMgYSBjbG9jayBldmVudCBkZXZpY2UuIFdlIHF1ZXVlIGl0IGludG8gdGhlCisJICogcmVsZWFzZWQgbGlzdCBhbmQgZG8gYSBub3RpZnkgYWRkIGxhdGVyLgorCSAqLworCWlmIChvbGQpIHsKKwkJb2xkLT5ldmVudF9oYW5kbGVyID0gY2xvY2tldmVudHNfaGFuZGxlX25vb3A7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG9sZCwgQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKwkJbGlzdF9kZWwoJm9sZC0+bGlzdCk7CisJCWxpc3RfYWRkKCZvbGQtPmxpc3QsICZjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisJfQorCisJaWYgKG5ldykgeworCQlCVUdfT04obmV3LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ldywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAorCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY3VyLCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja2V2ZW50X2RldmljZXMpIHsKKwkJY3VyID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCisJCWlmICgoY3VyLT5mZWF0dXJlcyAmIGZlYXR1cmVzKSA9PSBmZWF0dXJlcyAmJgorCQkgICAgY3B1c19lcXVhbChjcHVtYXNrLCBjdXItPmNwdW1hc2spKSB7CisJCQlpZiAoIWRldiB8fCBkZXYtPnJhdGluZyA8IGN1ci0+cmF0aW5nKQorCQkJCWRldiA9IGN1cjsKKwkJfQorCX0KKworCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShOVUxMLCBkZXYpOworCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZQorICovCit2b2lkIGNsb2NrZXZlbnRzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKGRldiwgTlVMTCk7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cworICovCit2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoreworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisJY2xvY2tldmVudHNfZG9fbm90aWZ5KHJlYXNvbiwgYXJnKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFEOgorCQkvKgorCQkgKiBVbnJlZ2lzdGVyIHRoZSBjbG9jayBldmVudCBkZXZpY2VzIHdoaWNoIHdlcmUKKwkJICogcmVsZWFzZWQgZnJvbSB0aGUgdXNlcnMgaW4gdGhlIG5vdGlmeSBjaGFpbi4KKwkJICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmY2xvY2tldmVudHNfcmVsZWFzZWQpKSB7CisJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXY7CisKKwkJCWRldiA9IGxpc3RfZW50cnkoY2xvY2tldmVudHNfcmVsZWFzZWQubmV4dCwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsb2NrZXZlbnRzX25vdGlmeSk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworLyoqCisgKiBjbG9ja2V2ZW50c19zaG93X3JlZ2lzdGVyZWQgLSBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgY2xvY2tldmVudHMKKyAqIEBkZXY6CXVudXNlZAorICogQGJ1ZjoJY2hhciBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggY2xvY2sgZXZlbnRzIGxpc3QKKyAqCisgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgcmVnaXN0ZXJlZCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNsb2NrZXZlbnRzX3Nob3dfcmVnaXN0ZXJlZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWNoYXIgKnAgPSBidWY7CisJaW50IGNwdTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2NrZXZlbnRfZGV2aWNlcykgeworCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZTsKKworCQljZSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJcCArPSBzcHJpbnRmKHAsICIlLTIwcyBGOiUwNHggTTolZCIsIGNlLT5uYW1lLAorCQkJICAgICBjZS0+ZmVhdHVyZXMsIGNlLT5tb2RlKTsKKwkJcCArPSBzcHJpbnRmKHAsICIgQzoiKTsKKwkJaWYgKCFjcHVzX2VxdWFsKGNlLT5jcHVtYXNrLCBjcHVfcG9zc2libGVfbWFwKSkgeworCQkJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjZS0+Y3B1bWFzaykKKwkJCQlwICs9IHNwcmludGYocCwgIiAlZCIsIGNwdSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRklYTUU6IEFkZCB0aGUgY3B1IHdoaWNoIGlzIGhhbmRsaW5nIHRoaXMgc3Vja2VyCisJCQkgKi8KKwkJfQorCQlwICs9IHNwcmludGYocCwgIlxuIik7CisJfQorCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKKy8qCisgKiBTeXNmcyBzZXR1cCBiaXRzOgorICovCitzdGF0aWMgU1lTREVWX0FUVFIocmVnaXN0ZXJlZCwgMDYwMCwKKwkJICAgY2xvY2tldmVudHNfc2hvd19yZWdpc3RlcmVkLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgY2xvY2tldmVudHNfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiY2xvY2tldmVudHMiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbG9ja2V2ZW50c19zeXNfZGV2aWNlID0geworCS5pZAk9IDAsCisJLmNscwk9ICZjbG9ja2V2ZW50c19zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsb2NrZXZlbnRzX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX3N5c2NsYXNzKTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbG9ja2V2ZW50c19zeXNfZGV2aWNlKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9jcmVhdGVfZmlsZSgKKwkJCQkmY2xvY2tldmVudHNfc3lzX2RldmljZSwKKwkJCQkmYXR0cl9yZWdpc3RlcmVkKTsKKwlyZXR1cm4gZXJyb3I7Cit9CitkZXZpY2VfaW5pdGNhbGwoY2xvY2tldmVudHNfc3lzZnNfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGQ5ZWYxNzYuLjE5M2EwNzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3Igc3Bpbl91bmxvY2tfaXJxKCkgdXNpbmcgcHJlZW1wdF9jb3VudCgpIG02OGsgKi8KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKIC8qIFhYWCAtIFdvdWxkIGxpa2UgYSBiZXR0ZXIgd2F5IGZvciBpbml0aWFsaXppbmcgY3Vycl9jbG9ja3NvdXJjZSAqLwogZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9qaWZmaWVzOwpAQCAtNDgsNiArNDksNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpjdXJyX2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2ppZmZpZXM7CiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpuZXh0X2Nsb2Nrc291cmNlOworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2tzb3VyY2Vfb3ZlcnJpZGU7CiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrc291cmNlX2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NvdXJjZV9sb2NrKTsKIHN0YXRpYyBjaGFyIG92ZXJyaWRlX25hbWVbMzJdOwpAQCAtNjIsOSArNjQsMTIzIEBACiAJZmluaXNoZWRfYm9vdGluZyA9IDE7CiAJcmV0dXJuIDA7CiB9Ci0KIGxhdGVfaW5pdGNhbGwoY2xvY2tzb3VyY2VfZG9uZV9ib290aW5nKTsKIAorI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRworc3RhdGljIExJU1RfSEVBRCh3YXRjaGRvZ19saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgKndhdGNoZG9nOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGRvZ19sb2NrKTsKK3N0YXRpYyBjeWNsZV90IHdhdGNoZG9nX2xhc3Q7CisvKgorICogSW50ZXJ2YWw6IDAuNXNlYyBUcmVzaG9sZDogMC4wNjI1cworICovCisjZGVmaW5lIFdBVENIRE9HX0lOVEVSVkFMIChIWiA+PiAxKQorI2RlZmluZSBXQVRDSERPR19UUkVTSE9MRCAoTlNFQ19QRVJfU0VDID4+IDQpCisKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX3JhdGV3ZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQ2NF90IGRlbHRhKQoreworCWlmIChkZWx0YSA+IC1XQVRDSERPR19UUkVTSE9MRCAmJiBkZWx0YSA8IFdBVENIRE9HX1RSRVNIT0xEKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJDbG9ja3NvdXJjZSAlcyB1bnN0YWJsZSAoZGVsdGEgPSAlTGQgbnMpXG4iLAorCSAgICAgICBjcy0+bmFtZSwgZGVsdGEpOworCWNzLT5mbGFncyAmPSB+KENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUyB8IENMT0NLX1NPVVJDRV9XQVRDSERPRyk7CisJY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhjcywgMCk7CisJY3MtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJbGlzdF9kZWwoJmNzLT53ZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgY2xvY2tzb3VyY2Vfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsICp0bXA7CisJY3ljbGVfdCBjc25vdywgd2Rub3c7CisJaW50NjRfdCB3ZF9uc2VjLCBjc19uc2VjOworCisJc3Bpbl9sb2NrKCZ3YXRjaGRvZ19sb2NrKTsKKworCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQoKTsKKwl3ZF9uc2VjID0gY3ljMm5zKHdhdGNoZG9nLCAod2Rub3cgLSB3YXRjaGRvZ19sYXN0KSAmIHdhdGNoZG9nLT5tYXNrKTsKKwl3YXRjaGRvZ19sYXN0ID0gd2Rub3c7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3MsIHRtcCwgJndhdGNoZG9nX2xpc3QsIHdkX2xpc3QpIHsKKwkJY3Nub3cgPSBjcy0+cmVhZCgpOworCQkvKiBJbml0aWFsaXplZCA/ICovCisJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKKwkJCWlmICgoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMpICYmCisJCQkgICAgKHdhdGNoZG9nLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSkgeworCQkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfVkFMSURfRk9SX0hSRVM7CisJCQkJLyoKKwkJCQkgKiBXZSBqdXN0IG1hcmtlZCB0aGUgY2xvY2tzb3VyY2UgYXMKKwkJCQkgKiBoaWdocmVzLWNhcGFibGUsIG5vdGlmeSB0aGUgcmVzdCBvZiB0aGUKKwkJCQkgKiBzeXN0ZW0gYXMgd2VsbCBzbyB0aGF0IHdlIHRyYW5zaXRpb24KKwkJCQkgKiBpbnRvIGhpZ2gtcmVzIG1vZGU6CisJCQkJICovCisJCQkJdGlja19jbG9ja19ub3RpZnkoKTsKKwkJCX0KKwkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQl9IGVsc2UgeworCQkJY3NfbnNlYyA9IGN5YzJucyhjcywgKGNzbm93IC0gY3MtPndkX2xhc3QpICYgY3MtPm1hc2spOworCQkJY3MtPndkX2xhc3QgPSBjc25vdzsKKwkJCS8qIENoZWNrIHRoZSBkZWx0YS4gTWlnaHQgcmVtb3ZlIGZyb20gdGhlIGxpc3QgISAqLworCQkJY2xvY2tzb3VyY2VfcmF0ZXdkKGNzLCBjc19uc2VjIC0gd2RfbnNlYyk7CisJCX0KKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJndhdGNoZG9nX2xpc3QpKSB7CisJCV9fbW9kX3RpbWVyKCZ3YXRjaGRvZ190aW1lciwKKwkJCSAgICB3YXRjaGRvZ190aW1lci5leHBpcmVzICsgV0FUQ0hET0dfSU5URVJWQUwpOworCX0KKwlzcGluX3VubG9jaygmd2F0Y2hkb2dfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBjbG9ja3NvdXJjZV9jaGVja193YXRjaGRvZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3NlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworCWlmIChjcy0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlkpIHsKKwkJaW50IHN0YXJ0ZWQgPSAhbGlzdF9lbXB0eSgmd2F0Y2hkb2dfbGlzdCk7CisKKwkJbGlzdF9hZGQoJmNzLT53ZF9saXN0LCAmd2F0Y2hkb2dfbGlzdCk7CisJCWlmICghc3RhcnRlZCAmJiB3YXRjaGRvZykgeworCQkJd2F0Y2hkb2dfbGFzdCA9IHdhdGNoZG9nLT5yZWFkKCk7CisJCQl3YXRjaGRvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIFdBVENIRE9HX0lOVEVSVkFMOworCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCX0KKwl9IGVsc2UgaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSB7CisJCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworCisJCWlmICghd2F0Y2hkb2cgfHwgY3MtPnJhdGluZyA+IHdhdGNoZG9nLT5yYXRpbmcpIHsKKwkJCWlmICh3YXRjaGRvZykKKwkJCQlkZWxfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKKwkJCXdhdGNoZG9nID0gY3M7CisJCQlpbml0X3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOworCisJCQkvKiBSZXNldCB3YXRjaGRvZyBjeWNsZXMgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3NlLCAmd2F0Y2hkb2dfbGlzdCwgd2RfbGlzdCkKKwkJCQljc2UtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQkvKiBTdGFydCBpZiBsaXN0IGlzIG5vdCBlbXB0eSAqLworCQkJaWYgKCFsaXN0X2VtcHR5KCZ3YXRjaGRvZ19saXN0KSkgeworCQkJCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCgpOworCQkJCXdhdGNoZG9nX3RpbWVyLmV4cGlyZXMgPQorCQkJCQlqaWZmaWVzICsgV0FUQ0hET0dfSU5URVJWQUw7CisJCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKQorCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworfQorI2VuZGlmCisKIC8qKgogICogY2xvY2tzb3VyY2VfZ2V0X25leHQgLSBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjbG9ja3NvdXJjZQogICoKQEAgLTg0LDYwICsyMDAsNTQgQEAKIH0KIAogLyoqCi0gKiBzZWxlY3RfY2xvY2tzb3VyY2UgLSBGaW5kcyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgorICogc2VsZWN0X2Nsb2Nrc291cmNlIC0gU2VsZWN0cyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgogICoKICAqIFByaXZhdGUgZnVuY3Rpb24uIE11c3QgaG9sZCBjbG9ja3NvdXJjZV9sb2NrIHdoZW4gY2FsbGVkLgogICoKLSAqIExvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZXMsIHJldHVybmluZwotICogdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHJhdGluZyB2YWx1ZS4gSWYgdGhlcmUgaXMgYSBjbG9ja3NvdXJjZQotICogbmFtZSB0aGF0IG1hdGNoZXMgdGhlIG92ZXJyaWRlIHN0cmluZywgaXQgcmV0dXJucyB0aGF0IGNsb2Nrc291cmNlLgorICogU2VsZWN0IHRoZSBjbG9ja3NvdXJjZSB3aXRoIHRoZSBiZXN0IHJhdGluZywgb3IgdGhlIGNsb2Nrc291cmNlLAorICogd2hpY2ggaXMgc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIG92ZXJyaWRlLgogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpzZWxlY3RfY2xvY2tzb3VyY2Uodm9pZCkKIHsKLQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmJlc3QgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2Nrc291cmNlX2xpc3QpIHsKLQkJc3RydWN0IGNsb2Nrc291cmNlICpzcmM7CisJaWYgKGxpc3RfZW1wdHkoJmNsb2Nrc291cmNlX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKCFiZXN0KQotCQkJYmVzdCA9IHNyYzsKKwlpZiAoY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpCisJCW5leHQgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwllbHNlCisJCW5leHQgPSBsaXN0X2VudHJ5KGNsb2Nrc291cmNlX2xpc3QubmV4dCwgc3RydWN0IGNsb2Nrc291cmNlLAorCQkJCSAgbGlzdCk7CiAKLQkJLyogY2hlY2sgZm9yIG92ZXJyaWRlOiAqLwotCQlpZiAoc3RybGVuKHNyYy0+bmFtZSkgPT0gc3RybGVuKG92ZXJyaWRlX25hbWUpICYmCi0JCSAgICAhc3RyY21wKHNyYy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpIHsKLQkJCWJlc3QgPSBzcmM7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBwaWNrIHRoZSBoaWdoZXN0IHJhdGluZzogKi8KLQkJaWYgKHNyYy0+cmF0aW5nID4gYmVzdC0+cmF0aW5nKQotCQkgCWJlc3QgPSBzcmM7Ci0JfQorCWlmIChuZXh0ID09IGN1cnJfY2xvY2tzb3VyY2UpCisJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGJlc3Q7CisJcmV0dXJuIG5leHQ7CiB9CiAKLS8qKgotICogaXNfcmVnaXN0ZXJlZF9zb3VyY2UgLSBDaGVja3MgaWYgY2xvY2tzb3VyY2UgaXMgcmVnaXN0ZXJlZAotICogQGM6CQlwb2ludGVyIHRvIGEgY2xvY2tzb3VyY2UKLSAqCi0gKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbi4gTXVzdCBob2xkIGNsb2Nrc291cmNlX2xvY2sgd2hlbiBjYWxsZWQuCi0gKgotICogUmV0dXJucyBvbmUgaWYgdGhlIGNsb2Nrc291cmNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgemVybyBvdGhlcndpc2UuCisvKgorICogRW5xdWV1ZSB0aGUgY2xvY2tzb3VyY2Ugc29ydGVkIGJ5IHJhdGluZwogICovCi1zdGF0aWMgaW50IGlzX3JlZ2lzdGVyZWRfc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqYykKK3N0YXRpYyBpbnQgY2xvY2tzb3VyY2VfZW5xdWV1ZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCiB7Ci0JaW50IGxlbiA9IHN0cmxlbihjLT5uYW1lKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqZW50cnkgPSAmY2xvY2tzb3VyY2VfbGlzdDsKIAogCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tzb3VyY2VfbGlzdCkgewotCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKnNyYzsKKwkJc3RydWN0IGNsb2Nrc291cmNlICpjczsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKHN0cmxlbihzcmMtPm5hbWUpID09IGxlbiAmJgkhc3RyY21wKHNyYy0+bmFtZSwgYy0+bmFtZSkpCi0JCQlyZXR1cm4gMTsKKwkJY3MgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKKwkJaWYgKGNzID09IGMpCisJCQlyZXR1cm4gLUVCVVNZOworCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBwbGFjZSwgd2hlcmUgdG8gaW5zZXJ0ICovCisJCWlmIChjcy0+cmF0aW5nID49IGMtPnJhdGluZykKKwkJCWVudHJ5ID0gdG1wOwogCX0KKwlsaXN0X2FkZCgmYy0+bGlzdCwgZW50cnkpOworCisJaWYgKHN0cmxlbihjLT5uYW1lKSA9PSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSkgJiYKKwkgICAgIXN0cmNtcChjLT5uYW1lLCBvdmVycmlkZV9uYW1lKSkKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBjOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTAsNDIgKzI2MCwzNSBAQAogICovCiBpbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlICpjKQogewotCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7Ci0JLyogY2hlY2sgaWYgY2xvY2tzb3VyY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCi0JaWYgKGlzX3JlZ2lzdGVyZWRfc291cmNlKGMpKSB7Ci0JCXByaW50aygicmVnaXN0ZXJfY2xvY2tzb3VyY2U6IENhbm5vdCByZWdpc3RlciAlcy4gIgotCQkgICAgICAgIkFscmVhZHkgcmVnaXN0ZXJlZCEiLCBjLT5uYW1lKTsKLQkJcmV0ID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCS8qIHJlZ2lzdGVyIGl0ICovCi0gCQlsaXN0X2FkZCgmYy0+bGlzdCwgJmNsb2Nrc291cmNlX2xpc3QpOwotCQkvKiBzY2FuIHRoZSByZWdpc3RlcmVkIGNsb2Nrc291cmNlcywgYW5kIHBpY2sgdGhlIGJlc3Qgb25lICovCisJcmV0ID0gY2xvY2tzb3VyY2VfZW5xdWV1ZShjKTsKKwlpZiAoIXJldCkKIAkJbmV4dF9jbG9ja3NvdXJjZSA9IHNlbGVjdF9jbG9ja3NvdXJjZSgpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCWNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKGMpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNsb2Nrc291cmNlX3JlZ2lzdGVyKTsKIAogLyoqCi0gKiBjbG9ja3NvdXJjZV9yZXNlbGVjdCAtIFJlc2NhbiBsaXN0IGZvciBuZXh0IGNsb2Nrc291cmNlCisgKiBjbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nIC0gQ2hhbmdlIHRoZSByYXRpbmcgb2YgYSByZWdpc3RlcmVkIGNsb2Nrc291cmNlCiAgKgotICogQSBxdWljayBoZWxwZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBpZiBhIGNsb2Nrc291cmNlIGNoYW5nZXMgaXRzCi0gKiByYXRpbmcuIEZvcmNlcyB0aGUgY2xvY2tzb3VyY2UgbGlzdCB0byBiZSByZS1zY2FubmVkIGZvciB0aGUgYmVzdAotICogY2xvY2tzb3VyY2UuCiAgKi8KLXZvaWQgY2xvY2tzb3VyY2VfcmVzZWxlY3Qodm9pZCkKK3ZvaWQgY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQgcmF0aW5nKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZjcy0+bGlzdCk7CisJY3MtPnJhdGluZyA9IHJhdGluZzsKKwljbG9ja3NvdXJjZV9lbnF1ZXVlKGNzKTsKIAluZXh0X2Nsb2Nrc291cmNlID0gc2VsZWN0X2Nsb2Nrc291cmNlKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChjbG9ja3NvdXJjZV9yZXNlbGVjdCk7CiAKICNpZmRlZiBDT05GSUdfU1lTRlMKIC8qKgpAQCAtMjIxLDcgKzMyNCwxMSBAQAogc3RhdGljIHNzaXplX3Qgc3lzZnNfb3ZlcnJpZGVfY2xvY2tzb3VyY2Uoc3RydWN0IHN5c19kZXZpY2UgKmRldiwKIAkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm92ciA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXNpemVfdCByZXQgPSBjb3VudDsKKwlpbnQgbGVuOworCiAJLyogc3RyaW5ncyBmcm9tIHN5c2ZzIHdyaXRlIGFyZSBub3QgMCB0ZXJtaW5hdGVkISAqLwogCWlmIChjb3VudCA+PSBzaXplb2Yob3ZlcnJpZGVfbmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI5LDE3ICszMzYsMzIgQEAKIAkvKiBzdHJpcCBvZiBcbjogKi8KIAlpZiAoYnVmW2NvdW50LTFdID09ICdcbicpCiAJCWNvdW50LS07Ci0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKIAotCS8qIGNvcHkgdGhlIG5hbWUgZ2l2ZW46ICovCi0JbWVtY3B5KG92ZXJyaWRlX25hbWUsIGJ1ZiwgY291bnQpOworCWlmIChjb3VudCA+IDApCisJCW1lbWNweShvdmVycmlkZV9uYW1lLCBidWYsIGNvdW50KTsKIAlvdmVycmlkZV9uYW1lW2NvdW50XSA9IDA7CiAKLQkvKiB0cnkgdG8gc2VsZWN0IGl0OiAqLwotCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwlsZW4gPSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSk7CisJaWYgKGxlbikgeworCQlvdnIgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwkJLyogdHJ5IHRvIHNlbGVjdCBpdDogKi8KKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja3NvdXJjZV9saXN0KSB7CisJCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzOworCisJCQljcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tzb3VyY2UsIGxpc3QpOworCQkJaWYgKHN0cmxlbihjcy0+bmFtZSkgPT0gbGVuICYmCisJCQkgICAgIXN0cmNtcChjcy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpCisJCQkJb3ZyID0gY3M7CisJCX0KKwl9CisKKwkvKiBSZXNlbGVjdCwgd2hlbiB0aGUgb3ZlcnJpZGUgbmFtZSBoYXMgY2hhbmdlZCAqLworCWlmIChvdnIgIT0gY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpIHsKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBvdnI7CisJCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnEoJmNsb2Nrc291cmNlX2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKaW5kZXggYTk5YjJhNi4uM2JlOGRhOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvamlmZmllcy5jCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtNjIsNyArNjIsNiBAQAogCS5tYXNrCQk9IDB4ZmZmZmZmZmYsIC8qMzJiaXRzKi8KIAkubXVsdAkJPSBOU0VDX1BFUl9KSUZGWSA8PCBKSUZGSUVTX1NISUZULCAvKiBkZXRhaWxzIGFib3ZlICovCiAJLnNoaWZ0CQk9IEpJRkZJRVNfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAwLCAvKiB0aWNrIGJhc2VkLCBub3QgZnJlZSBydW5uaW5nICovCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2ppZmZpZXNfY2xvY2tzb3VyY2Uodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggM2FmZWFhMy4uZWIxMjUwOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2RlZmluZSBNQVhfVElDS0FESgkJNTAwCQkvKiBtaWNyb3NlY3MgKi8KICNkZWZpbmUgTUFYX1RJQ0tBREpfU0NBTEVECSgoKHU2NCkoTUFYX1RJQ0tBREogKiBOU0VDX1BFUl9VU0VDKSA8PCBcCi0JCQkJICBUSUNLX0xFTkdUSF9TSElGVCkgLyBIWikKKwkJCQkgIFRJQ0tfTEVOR1RIX1NISUZUKSAvIE5UUF9JTlRFUlZBTF9GUkVRKQogCiAvKgogICogcGhhc2UtbG9jayBsb29wIHZhcmlhYmxlcwpAQCAtNDYsMTMgKzQ2LDE3IEBACiAKIHN0YXRpYyB2b2lkIG50cF91cGRhdGVfZnJlcXVlbmN5KHZvaWQpCiB7Ci0JdGlja19sZW5ndGhfYmFzZSA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKSA8PCBUSUNLX0xFTkdUSF9TSElGVDsKLQl0aWNrX2xlbmd0aF9iYXNlICs9IChzNjQpQ0xPQ0tfVElDS19BREpVU1QgPDwgVElDS19MRU5HVEhfU0hJRlQ7Ci0JdGlja19sZW5ndGhfYmFzZSArPSAoczY0KXRpbWVfZnJlcSA8PCAoVElDS19MRU5HVEhfU0hJRlQgLSBTSElGVF9OU0VDKTsKKwl1NjQgc2Vjb25kX2xlbmd0aCA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKQorCQkJCTw8IFRJQ0tfTEVOR1RIX1NISUZUOworCXNlY29uZF9sZW5ndGggKz0gKHM2NClDTE9DS19USUNLX0FESlVTVCA8PCBUSUNLX0xFTkdUSF9TSElGVDsKKwlzZWNvbmRfbGVuZ3RoICs9IChzNjQpdGltZV9mcmVxIDw8IChUSUNLX0xFTkdUSF9TSElGVCAtIFNISUZUX05TRUMpOwogCi0JZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIEhaKTsKKwl0aWNrX2xlbmd0aF9iYXNlID0gc2Vjb25kX2xlbmd0aDsKIAotCXRpY2tfbnNlYyA9IHRpY2tfbGVuZ3RoX2Jhc2UgPj4gVElDS19MRU5HVEhfU0hJRlQ7CisJZG9fZGl2KHNlY29uZF9sZW5ndGgsIEhaKTsKKwl0aWNrX25zZWMgPSBzZWNvbmRfbGVuZ3RoID4+IFRJQ0tfTEVOR1RIX1NISUZUOworCisJZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIE5UUF9JTlRFUlZBTF9GUkVRKTsKIH0KIAogLyoqCkBAIC0xNjIsNyArMTY2LDcgQEAKIAkJCXRpY2tfbGVuZ3RoIC09IE1BWF9USUNLQURKX1NDQUxFRDsKIAkJfSBlbHNlIHsKIAkJCXRpY2tfbGVuZ3RoICs9IChzNjQpKHRpbWVfYWRqdXN0ICogTlNFQ19QRVJfVVNFQyAvCi0JCQkJCSAgICAgSFopIDw8IFRJQ0tfTEVOR1RIX1NISUZUOworCQkJCQlOVFBfSU5URVJWQUxfRlJFUSkgPDwgVElDS19MRU5HVEhfU0hJRlQ7CiAJCQl0aW1lX2FkanVzdCA9IDA7CiAJCX0KIAl9CkBAIC0yMzksNyArMjQzLDggQEAKIAkJICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAJCSAgICBnb3RvIGxlYXZlOwogCQl9Ci0JCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpID4+IChTSElGVF9VU0VDIC0gU0hJRlRfTlNFQyk7CisJCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpCisJCQkJPj4gKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKIAkgICAgfQogCiAJICAgIGlmICh0eGMtPm1vZGVzICYgQURKX01BWEVSUk9SKSB7CkBAIC0zMDksNyArMzE0LDggQEAKIAkJICAgIGZyZXFfYWRqICs9IHRpbWVfZnJlcTsKIAkJICAgIGZyZXFfYWRqID0gbWluKGZyZXFfYWRqLCAoczY0KU1BWEZSRVFfTlNFQyk7CiAJCSAgICB0aW1lX2ZyZXEgPSBtYXgoZnJlcV9hZGosIChzNjQpLU1BWEZSRVFfTlNFQyk7Ci0JCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIEhaKSA8PCBTSElGVF9VUERBVEU7CisJCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIE5UUF9JTlRFUlZBTF9GUkVRKQorCQkgICAgCQkJPDwgU0hJRlRfVVBEQVRFOwogCQl9IC8qIFNUQV9QTEwgKi8KIAkgICAgfSAvKiB0eGMtPm1vZGVzICYgQURKX09GRlNFVCAqLwogCSAgICBpZiAodHhjLT5tb2RlcyAmIEFESl9USUNLKQpAQCAtMzI0LDggKzMzMCwxMCBAQAogCWlmICgodHhjLT5tb2RlcyAmIEFESl9PRkZTRVRfU0lOR0xFU0hPVCkgPT0gQURKX09GRlNFVF9TSU5HTEVTSE9UKQogCSAgICB0eGMtPm9mZnNldAkgICA9IHNhdmVfYWRqdXN0OwogCWVsc2UKLQkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKSAqIEhaIC8gMTAwMDsKLQl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykgPDwgKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKKwkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKQorCSAgICAJCQkqIE5UUF9JTlRFUlZBTF9GUkVRIC8gMTAwMDsKKwl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykKKwkJCQk8PCAoU0hJRlRfVVNFQyAtIFNISUZUX05TRUMpOwogCXR4Yy0+bWF4ZXJyb3IJICAgPSB0aW1lX21heGVycm9yOwogCXR4Yy0+ZXN0ZXJyb3IJICAgPSB0aW1lX2VzdGVycm9yOwogCXR4Yy0+c3RhdHVzCSAgID0gdGltZV9zdGF0dXM7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIzZWZlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIGVtdWxhdGUgYSBsb2NhbCBjbG9jay1ldmVudAorICogZGV2aWNlIHZpYSBhIGJyb2FkY2FzdCBldmVudCBzb3VyY2UuCisgKgorICogQ29weXJpZ2h0KEMpIDIwMDUtMjAwNiwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogQ29weXJpZ2h0KEMpIDIwMDYtMjAwNywgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCisgKgorICogVGhpcyBjb2RlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyLiBGb3IgZGV0YWlscyBzZWUKKyAqIGtlcm5lbC1iYXNlL0NPUFlJTkcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogQnJvYWRjYXN0IHN1cHBvcnQgZm9yIGJyb2tlbiB4ODYgaGFyZHdhcmUsIHdoZXJlIHRoZSBsb2NhbCBhcGljCisgKiB0aW1lciBzdG9wcyBpbiBDMyBzdGF0ZS4KKyAqLworCitzdHJ1Y3QgdGlja19kZXZpY2UgdGlja19icm9hZGNhc3RfZGV2aWNlOworc3RhdGljIGNwdW1hc2tfdCB0aWNrX2Jyb2FkY2FzdF9tYXNrOworc3RhdGljIERFRklORV9TUElOTE9DSyh0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKworLyoKKyAqIERlYnVnZ2luZzogc2VlIHRpbWVyX2xpc3QuYworICovCitzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCkKK3sKKwlyZXR1cm4gJnRpY2tfYnJvYWRjYXN0X2RldmljZTsKK30KKworY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3RfbWFzazsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBkZXZpY2UgaW4gcGVyaW9kaWMgbW9kZQorICovCitzdGF0aWMgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMgJiYgYmMtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pCisJCXRpY2tfc2V0dXBfcGVyaW9kaWMoYmMsIDEpOworfQorCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgY2FuIGJlIHV0aWxpemVkIGFzIGJyb2FkY2FzdCBkZXZpY2U6CisgKi8KK2ludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2IHx8CisJICAgIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QKSkKKwkJcmV0dXJuIDA7CisKKwljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKKwl0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2ID0gZGV2OworCWlmICghY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJdGlja19icm9hZGNhc3Rfc3RhcnRfcGVyaW9kaWMoZGV2KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK2ludCB0aWNrX2lzX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXJldHVybiAoZGV2ICYmIHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXYgPT0gZGV2KTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIGRpc2Z1bmN0aW9uYWwgYW5kIGEgcGxhY2UgaG9sZGVyLCB3aGljaAorICogbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgYnJvYWRjYXN0IGRldmljZS4KKyAqLworaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRGV2aWNlcyBtaWdodCBiZSByZWdpc3RlcmVkIHdpdGggYm90aCBwZXJpb2RpYyBhbmQgb25lc2hvdAorCSAqIG1vZGUgZGlzYWJsZWQuIFRoaXMgc2lnbmFscywgdGhhdCB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlCisJICogb3BlcmF0ZWQgZnJvbSB0aGUgYnJvYWRjYXN0IGRldmljZSBhbmQgaXMgYSBwbGFjZWhvbGRlciBmb3IKKwkgKiB0aGUgY3B1IGxvY2FsIGRldmljZS4KKwkgKi8KKwlpZiAoIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkgeworCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwkJY3B1X3NldChjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQl0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2KTsKKwkJcmV0ID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEJyb2FkY2FzdCB0aGUgZXZlbnQgdG8gdGhlIGNwdXMsIHdoaWNoIGFyZSBzZXQgaW4gdGhlIG1hc2sKKyAqLworaW50IHRpY2tfZG9fYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworCWludCByZXQgPSAwLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKworCS8qCisJICogQ2hlY2ssIGlmIHRoZSBjdXJyZW50IGNwdSBpcyBpbiB0aGUgbWFzaworCSAqLworCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSkgeworCQljcHVfY2xlYXIoY3B1LCBtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmV2ZW50X2hhbmRsZXIodGQtPmV2dGRldik7CisJCXJldCA9IDE7CisJfQorCisJaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7CisJCS8qCisJCSAqIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBhY3R1YWxseSBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2VzCisJCSAqIGhhdmUgZGlmZmVyZW50IGJyb2FkY2FzdCBmdW5jdGlvbnMuIEZvciBub3csIGp1c3QgdXNlIHRoZQorCQkgKiBvbmUgb2YgdGhlIGZpcnN0IGRldmljZS4gVGhpcyB3b3JrcyBhcyBsb25nIGFzIHdlIGhhdmUgdGhpcworCQkgKiBtaXNmZWF0dXJlIG9ubHkgb24geDg2IChsYXBpYykKKwkJICovCisJCWNwdSA9IGZpcnN0X2NwdShtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmJyb2FkY2FzdChtYXNrKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmlvZGljIGJyb2FkY2FzdDoKKyAqIC0gaW52b2tlIHRoZSBicm9hZGNhc3QgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qodm9pZCkKK3sKKwljcHVtYXNrX3QgbWFzazsKKworCXNwaW5fbG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisKKwljcHVzX2FuZChtYXNrLCBjcHVfb25saW5lX21hcCwgdGlja19icm9hZGNhc3RfbWFzayk7CisJdGlja19kb19icm9hZGNhc3QobWFzayk7CisKKwlzcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyBicm9hZGNhc3QgdGlja3MKKyAqLworc3RhdGljIHZvaWQgdGlja19oYW5kbGVfcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKKworCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CisJICovCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisJfQorfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19icm9hZGNhc3Rfb25fb2ZmKHZvaWQgKndoeSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsICpyZWFzb24gPSB3aHk7CisJaW50IGNwdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisKKwkvKgorCSAqIElzIHRoZSBkZXZpY2UgaW4gYnJvYWRjYXN0IG1vZGUgZm9yZXZlciBvciBpcyBpdCBub3QKKwkgKiBhZmZlY3RlZCBieSB0aGUgcG93ZXJzdGF0ZSA/CisJICovCisJaWYgKCFkZXYgfHwgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSB8fAorCSAgICAhKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmICgqcmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OKSB7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9zZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKKwkJCWlmICh0ZC0+bW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCisJCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LAorCQkJCQkJICAgICBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9jbGVhcihjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQkJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCQl0aWNrX3NldHVwX3BlcmlvZGljKGRldiwgMCk7CisJCX0KKwl9CisKKwlpZiAoY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwllbHNlIHsKKwkJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCXRpY2tfYnJvYWRjYXN0X3N0YXJ0X3BlcmlvZGljKGJjKTsKKwkJZWxzZQorCQkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBvd2Vyc3RhdGUgaW5mb3JtYXRpb246IFRoZSBzeXN0ZW0gZW50ZXJzL2xlYXZlcyBhIHN0YXRlLCB3aGVyZQorICogYWZmZWN0ZWQgZGV2aWNlcyBtaWdodCBzdG9wLgorICovCit2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCisJaWYgKGNwdSA9PSAqb25jcHUpCisJCXRpY2tfZG9fYnJvYWRjYXN0X29uX29mZigmcmVhc29uKTsKKwllbHNlCisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgqb25jcHUsIHRpY2tfZG9fYnJvYWRjYXN0X29uX29mZiwKKwkJCQkJICZyZWFzb24sIDEsIDEpOworCXB1dF9jcHUoKTsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBkZXBlbmRpbmcgb24gYnJvYWRjYXN0IG9uL29mZgorICovCit2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KQoreworCWlmICghYnJvYWRjYXN0KQorCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwllbHNlCisJCWRldi0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX3BlcmlvZGljX2Jyb2FkY2FzdDsKK30KKworLyoKKyAqIFJlbW92ZSBhIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSAqY3B1cDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJY3B1X2NsZWFyKGNwdSwgdGlja19icm9hZGNhc3RfbWFzayk7CisKKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spKQorCQkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisKK3N0YXRpYyBjcHVtYXNrX3QgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK2NwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworfQorCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3NldF9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJa3RpbWVfdCBub3cgPSBrdGltZV9nZXQoKTsKKwlpbnQgcmVzOworCisJZm9yKDs7KSB7CisJCXJlcyA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIG5vdyk7CisJCWlmICghcmVzIHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXM7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGJjLT5taW5fZGVsdGFfbnMpKTsKKwl9Cit9CisKKy8qCisgKiBSZXByb2dyYW0gdGhlIGJyb2FkY2FzdCBkZXZpY2U6CisgKgorICogQ2FsbGVkIHdpdGggdGlja19icm9hZGNhc3RfbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSh2b2lkKQoreworCWt0aW1lX3QgZXhwaXJlcyA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHU7CisKKwkvKgorCSAqIEZpbmQgdGhlIGV2ZW50IHdoaWNoIGV4cGlyZXMgbmV4dDoKKwkgKi8KKwlmb3IgKGNwdSA9IGZpcnN0X2NwdSh0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOyBjcHUgIT0gTlJfQ1BVUzsKKwkgICAgIGNwdSA9IG5leHRfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgeworCQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwkJaWYgKHRkLT5ldnRkZXYtPm5leHRfZXZlbnQudHY2NCA8IGV4cGlyZXMudHY2NCkKKwkJCWV4cGlyZXMgPSB0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50OworCX0KKworCWlmIChleHBpcmVzLnR2NjQgPT0gS1RJTUVfTUFYKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBIYW5kbGUgb25lc2hvdCBtb2RlIGJyb2FkY2FzdGluZworICovCitzdGF0aWMgdm9pZCB0aWNrX2hhbmRsZV9vbmVzaG90X2Jyb2FkY2FzdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwljcHVtYXNrX3QgbWFzazsKKwlrdGltZV90IG5vdzsKKwlpbnQgY3B1OworCisJc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKK2FnYWluOgorCWRldi0+bmV4dF9ldmVudC50djY0ID0gS1RJTUVfTUFYOworCW1hc2sgPSBDUFVfTUFTS19OT05FOworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qIEZpbmQgYWxsIGV4cGlyZWQgZXZlbnRzICovCisJZm9yIChjcHUgPSBmaXJzdF9jcHUodGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsgY3B1ICE9IE5SX0NQVVM7CisJICAgICBjcHUgPSBuZXh0X2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpIHsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCWlmICh0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50LnR2NjQgPD0gbm93LnR2NjQpCisJCQljcHVfc2V0KGNwdSwgbWFzayk7CisJfQorCisJLyoKKwkgKiBXYWtldXAgdGhlIGNwdXMgd2hpY2ggaGF2ZSBhbiBleHBpcmVkIGV2ZW50LiBUaGUgYnJvYWRjYXN0CisJICogZGV2aWNlIGlzIHJlcHJvZ3JhbW1lZCBpbiB0aGUgcmV0dXJuIGZyb20gaWRsZSBjb2RlLgorCSAqLworCWlmICghdGlja19kb19icm9hZGNhc3QobWFzaykpIHsKKwkJLyoKKwkJICogVGhlIGdsb2JhbCBldmVudCBkaWQgbm90IGV4cGlyZSBhbnkgQ1BVIGxvY2FsCisJCSAqIGV2ZW50cy4gVGhpcyBoYXBwZW5zIGluIGR5bnRpY2sgbW9kZSwgYXMgdGhlCisJCSAqIG1heGltdW0gUElUIGRlbHRhIGlzIHF1aXRlIHNtYWxsLgorCQkgKi8KKwkJaWYgKHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSgpKQorCQkJZ290byBhZ2FpbjsKKwl9CisJc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLwordm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsICpkZXY7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBQZXJpb2RpYyBtb2RlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVudGVyL2V4aXQgb2YgcG93ZXIKKwkgKiBzdGF0ZXMKKwkgKi8KKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQorCQlnb3RvIG91dDsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKworCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmIChyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIpIHsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfc2V0KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsKKwkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJaWYgKGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKKwkJCQl0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZGV2LT5uZXh0X2V2ZW50LCAxKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwkJCWlmIChkZXYtPm5leHRfZXZlbnQudHY2NCAhPSBLVElNRV9NQVgpCisJCQkJdGlja19wcm9ncmFtX2V2ZW50KGRldi0+bmV4dF9ldmVudCwgMSk7CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogdGlja19icm9hZGNhc3Rfc2V0dXBfaGlnaHJlcyAtIHNldHVwIHRoZSBicm9hZGNhc3QgZGV2aWNlIGZvciBoaWdocmVzCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkgeworCQliYy0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0OworCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJCWJjLT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisJfQorfQorCisvKgorICogU2VsZWN0IG9uZXNob3Qgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCXRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID0gVElDS0RFVl9NT0RFX09ORVNIT1Q7CisJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OworCWlmIChiYykKKwkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBSZW1vdmUgYSBkZWFkIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNwdSA9ICpjcHVwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCisJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9PTkVTSE9UKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpCisJCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTAwZTM0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJhc2UgZnVuY3Rpb25zIHRvIG1hbmFnZSBwZXJpb2RpYyB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qCisgKiBUaWNrIGRldmljZXMKKyAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRpY2tfZGV2aWNlLCB0aWNrX2NwdV9kZXZpY2UpOworLyoKKyAqIFRpY2sgbmV4dCBldmVudDoga2VlcHMgdHJhY2sgb2YgdGhlIHRpY2sgdGltZQorICovCitrdGltZV90IHRpY2tfbmV4dF9wZXJpb2Q7CitrdGltZV90IHRpY2tfcGVyaW9kOworc3RhdGljIGludCB0aWNrX2RvX3RpbWVyX2NwdSA9IC0xOworREVGSU5FX1NQSU5MT0NLKHRpY2tfZGV2aWNlX2xvY2spOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK3N0cnVjdCB0aWNrX2RldmljZSAqdGlja19nZXRfZGV2aWNlKGludCBjcHUpCit7CisJcmV0dXJuICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKK30KKworLyoqCisgKiB0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlIC0gY2hlY2sgZm9yIGEgb25lc2hvdCBjYXBhYmxlIGV2ZW50IGRldmljZQorICovCitpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IF9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKS5ldnRkZXY7CisKKwlyZXR1cm4gZGV2ICYmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCk7Cit9CisKKy8qCisgKiBQZXJpb2RpYyB0aWNrCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfcGVyaW9kaWMoaW50IGNwdSkKK3sKKwlpZiAodGlja19kb190aW1lcl9jcHUgPT0gY3B1KSB7CisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIG5leHQgdGljayBldmVudCAqLworCQl0aWNrX25leHRfcGVyaW9kID0ga3RpbWVfYWRkKHRpY2tfbmV4dF9wZXJpb2QsIHRpY2tfcGVyaW9kKTsKKworCQlkb190aW1lcigxKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwl9CisKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyB0aWNrcworICovCit2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJdGlja19wZXJpb2RpYyhjcHUpOworCisJaWYgKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlyZXR1cm47CisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfcGVyaW9kaWMoY3B1KTsKKwl9Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgZGV2aWNlIGZvciBhIHBlcmlvZGljIHRpY2sKKyAqLwordm9pZCB0aWNrX3NldHVwX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCkKK3sKKwl0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKGRldiwgYnJvYWRjYXN0KTsKKworCS8qIEJyb2FkY2FzdCBzZXR1cCA/ICovCisJaWYgKCF0aWNrX2RldmljZV9pc19mdW5jdGlvbmFsKGRldikpCisJCXJldHVybjsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBzZXE7CisJCWt0aW1lX3QgbmV4dDsKKworCQlkbyB7CisJCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJCW5leHQgPSB0aWNrX25leHRfcGVyaW9kOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCQljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX09ORVNIT1QpOworCisJCWZvciAoOzspIHsKKwkJCWlmICghY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIG5leHQsIGt0aW1lX2dldCgpKSkKKwkJCQlyZXR1cm47CisJCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldHVwIHRoZSB0aWNrIGRldmljZQorICovCitzdGF0aWMgdm9pZCB0aWNrX3NldHVwX2RldmljZShzdHJ1Y3QgdGlja19kZXZpY2UgKnRkLAorCQkJICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2LCBpbnQgY3B1LAorCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJa3RpbWVfdCBuZXh0X2V2ZW50OworCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopID0gTlVMTDsKKworCS8qCisJICogRmlyc3QgZGV2aWNlIHNldHVwID8KKwkgKi8KKwlpZiAoIXRkLT5ldnRkZXYpIHsKKwkJLyoKKwkJICogSWYgbm8gY3B1IHRvb2sgdGhlIGRvX3RpbWVyIHVwZGF0ZSwgYXNzaWduIGl0IHRvCisJCSAqIHRoaXMgY3B1OgorCQkgKi8KKwkJaWYgKHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSB7CisJCQl0aWNrX2RvX3RpbWVyX2NwdSA9IGNwdTsKKwkJCXRpY2tfbmV4dF9wZXJpb2QgPSBrdGltZV9nZXQoKTsKKwkJCXRpY2tfcGVyaW9kID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQyAvIEhaKTsKKwkJfQorCisJCS8qCisJCSAqIFN0YXJ0dXAgaW4gcGVyaW9kaWMgbW9kZSBmaXJzdC4KKwkJICovCisJCXRkLT5tb2RlID0gVElDS0RFVl9NT0RFX1BFUklPRElDOworCX0gZWxzZSB7CisJCWhhbmRsZXIgPSB0ZC0+ZXZ0ZGV2LT5ldmVudF9oYW5kbGVyOworCQluZXh0X2V2ZW50ID0gdGQtPmV2dGRldi0+bmV4dF9ldmVudDsKKwl9CisKKwl0ZC0+ZXZ0ZGV2ID0gbmV3ZGV2OworCisJLyoKKwkgKiBXaGVuIHRoZSBkZXZpY2UgaXMgbm90IHBlciBjcHUsIHBpbiB0aGUgaW50ZXJydXB0IHRvIHRoZQorCSAqIGN1cnJlbnQgY3B1OgorCSAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKQorCQlpcnFfc2V0X2FmZmluaXR5KG5ld2Rldi0+aXJxLCBjcHVtYXNrKTsKKworCS8qCisJICogV2hlbiBnbG9iYWwgYnJvYWRjYXN0aW5nIGlzIGFjdGl2ZSwgY2hlY2sgaWYgdGhlIGN1cnJlbnQKKwkgKiBkZXZpY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBicm9hZGNhc3QgbW9kZS4KKwkgKiBUaGlzIGFsbG93cyB1cyB0byBoYW5kbGUgdGhpcyB4ODYgbWlzZmVhdHVyZSBpbiBhIGdlbmVyaWMKKwkgKiB3YXkuCisJICovCisJaWYgKHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KG5ld2RldiwgY3B1KSkKKwkJcmV0dXJuOworCisJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJdGlja19zZXR1cF9wZXJpb2RpYyhuZXdkZXYsIDApOworCWVsc2UKKwkJdGlja19zZXR1cF9vbmVzaG90KG5ld2RldiwgaGFuZGxlciwgbmV4dF9ldmVudCk7Cit9CisKKy8qCisgKiBDaGVjaywgaWYgdGhlIG5ldyByZWdpc3RlcmVkIGRldmljZSBzaG91bGQgYmUgdXNlZC4KKyAqLworc3RhdGljIGludCB0aWNrX2NoZWNrX25ld19kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1cmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHUsIHJldCA9IE5PVElGWV9PSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNwdW1hc2tfdCBjcHVtYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIWNwdV9pc3NldChjcHUsIG5ld2Rldi0+Y3B1bWFzaykpCisJCWdvdG8gb3V0OworCisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJY3VyZGV2ID0gdGQtPmV2dGRldjsKKwljcHVtYXNrID0gY3B1bWFza19vZl9jcHUoY3B1KTsKKworCS8qIGNwdSBsb2NhbCBkZXZpY2UgPyAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKSB7CisKKwkJLyoKKwkJICogSWYgdGhlIGNwdSBhZmZpbml0eSBvZiB0aGUgZGV2aWNlIGludGVycnVwdCBjYW4gbm90CisJCSAqIGJlIHNldCwgaWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKCFpcnFfY2FuX3NldF9hZmZpbml0eShuZXdkZXYtPmlycSkpCisJCQlnb3RvIG91dF9iYzsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgY3B1IGxvY2FsIGRldmljZSBhbHJlYWR5LCBkbyBub3QgcmVwbGFjZSBpdAorCQkgKiBieSBhIG5vbiBjcHUgbG9jYWwgZGV2aWNlCisJCSAqLworCQlpZiAoY3VyZGV2ICYmIGNwdXNfZXF1YWwoY3VyZGV2LT5jcHVtYXNrLCBjcHVtYXNrKSkKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlLCB0aGVuIGNoZWNrIHRoZSByYXRpbmcgYW5kIHRoZSBvbmVzaG90CisJICogZmVhdHVyZS4KKwkgKi8KKwlpZiAoY3VyZGV2KSB7CisJCS8qCisJCSAqIFByZWZlciBvbmUgc2hvdCBjYXBhYmxlIGRldmljZXMgIQorCQkgKi8KKwkJaWYgKChjdXJkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgJiYKKwkJICAgICEobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpKQorCQkJZ290byBvdXRfYmM7CisJCS8qCisJCSAqIENoZWNrIHRoZSByYXRpbmcKKwkJICovCisJCWlmIChjdXJkZXYtPnJhdGluZyA+PSBuZXdkZXYtPnJhdGluZykKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogUmVwbGFjZSB0aGUgZXZlbnR1YWxseSBleGlzdGluZyBkZXZpY2UgYnkgdGhlIG5ldworCSAqIGRldmljZS4gSWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlLCBkbworCSAqIG5vdCBnaXZlIGl0IGJhY2sgdG8gdGhlIGNsb2NrZXZlbnRzIGxheWVyICEKKwkgKi8KKwlpZiAodGlja19pc19icm9hZGNhc3RfZGV2aWNlKGN1cmRldikpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoY3VyZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCWN1cmRldiA9IE5VTEw7CisJfQorCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShjdXJkZXYsIG5ld2Rldik7CisJdGlja19zZXR1cF9kZXZpY2UodGQsIG5ld2RldiwgY3B1LCBjcHVtYXNrKTsKKwlpZiAobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpCisJCXRpY2tfb25lc2hvdF9ub3RpZnkoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gTk9USUZZX1NUT1A7CisKK291dF9iYzoKKwkvKgorCSAqIENhbiB0aGUgbmV3IGRldmljZSBiZSB1c2VkIGFzIGEgYnJvYWRjYXN0IGRldmljZSA/CisJICovCisJaWYgKHRpY2tfY2hlY2tfYnJvYWRjYXN0X2RldmljZShuZXdkZXYpKQorCQlyZXQgPSBOT1RJRllfU1RPUDsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2RldmljZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2h1dGRvd24gYW4gZXZlbnQgZGV2aWNlIG9uIGEgZ2l2ZW4gY3B1OgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uIGEgbGlmZSBDUFUsIHdoZW4gYSBDUFUgaXMgZGVhZC4gU28gd2UgY2Fubm90CisgKiBhY2Nlc3MgdGhlIGhhcmR3YXJlIGRldmljZSBpdHNlbGYuCisgKiBXZSBqdXN0IHNldCB0aGUgbW9kZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCB0aWNrX3NodXRkb3duKHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJnBlcl9jcHUodGlja19jcHVfZGV2aWNlLCAqY3B1cCk7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gdGQtPmV2dGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9QRVJJT0RJQzsKKwlpZiAoZGV2KSB7CisJCS8qCisJCSAqIFByZXZlbnQgdGhhdCB0aGUgY2xvY2sgZXZlbnRzIGxheWVyIHRyaWVzIHRvIGNhbGwKKwkJICogdGhlIHNldCBtb2RlIGZ1bmN0aW9uIQorCQkgKi8KKwkJZGV2LT5tb2RlID0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEOworCQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoZGV2LCBOVUxMKTsKKwkJdGQtPmV2dGRldiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBhYm91dCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgdGlja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyByZWFzb24sCisJCQkgICAgICAgdm9pZCAqZGV2KQoreworCXN3aXRjaCAocmVhc29uKSB7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQUREOgorCQlyZXR1cm4gdGlja19jaGVja19uZXdfZGV2aWNlKGRldik7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OOgorCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGOgorCQl0aWNrX2Jyb2FkY2FzdF9vbl9vZmYocmVhc29uLCBkZXYpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVI6CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOgorCQl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQ1BVX0RFQUQ6CisJCXRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bl9icm9hZGNhc3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bihkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGlja19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRpY2tfbm90aWZ5LAorfTsKKworLyoqCisgKiB0aWNrX2luaXQgLSBpbml0aWFsaXplIHRoZSB0aWNrIGNvbnRyb2wKKyAqCisgKiBSZWdpc3RlciB0aGUgbm90aWZpZXIgd2l0aCB0aGUgY2xvY2tldmVudHMgZnJhbWV3b3JrCisgKi8KK3ZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKQoreworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aWNrX25vdGlmaWVyKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaCBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg2MWEwCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogdGljayBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgZnVuY3Rpb25zIHVzZWQgYnkgbG93L2hpZ2ggcmVzIGNvZGUKKyAqLworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB0aWNrX2RldmljZSwgdGlja19jcHVfZGV2aWNlKTsKK2V4dGVybiBzcGlubG9ja190IHRpY2tfZGV2aWNlX2xvY2s7CitleHRlcm4ga3RpbWVfdCB0aWNrX25leHRfcGVyaW9kOworZXh0ZXJuIGt0aW1lX3QgdGlja19wZXJpb2Q7CisKK2V4dGVybiB2b2lkIHRpY2tfc2V0dXBfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKK2V4dGVybiB2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBOT19IWiAvIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzaGFyZWQgY29kZQorICovCisjaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ld2RldiwKKwkJCSAgICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCSAgICAgICBrdGltZV90IG5leHRldnQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19vbmVzaG90X25vdGlmeSh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSk7CisKKyMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKK2V4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKTsKKyMgZWxzZSAvKiBCUk9BRENBU1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQoreworCUJVRygpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQorIyBlbmRpZiAvKiAhQlJPQURDQVNUICovCisKKyNlbHNlIC8qICFPTkVTSE9UICovCitzdGF0aWMgaW5saW5lCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dGV2dCkKK3sKKwlCVUcoKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfcHJvZ3JhbV9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX29uZXNob3Rfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3NldHVwX29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCit7CisJQlVHKCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCkgeyB9CisjZW5kaWYgLyogIVRJQ0tfT05FU0hPVCAqLworCisvKgorICogQnJvYWRjYXN0aW5nIHN1cHBvcnQKKyAqLworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorZXh0ZXJuIGludCB0aWNrX2RvX2Jyb2FkY2FzdChjcHVtYXNrX3QgbWFzayk7CisKK2V4dGVybiBpbnQgdGlja19kZXZpY2VfdXNlc19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgY3B1KTsKK2V4dGVybiBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCk7CisKK2V4dGVybiB2b2lkCit0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCk7CisKKyNlbHNlIC8qICFCUk9BRENBU1QgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGlja19pc19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBpbnQgY3B1KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGludCBicm9hZGNhc3QpCit7CisJZGV2LT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfcGVyaW9kaWM7Cit9CisjZW5kaWYgLyogIUJST0FEQ0FTVCAqLworCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgZnVuY3Rpb25hbCBvciBhIGR1bW15IGZvciBicm9hZGNhc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jIGIva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YjdmZgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS90aWNrLW9uZXNob3QuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggbWFuYWdlIGhpZ2ggcmVzb2x1dGlvbiB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qKgorICogdGlja19wcm9ncmFtX2V2ZW50CisgKi8KK2ludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpLmV2dGRldjsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBleHBpcmVzLCBub3cpOworCisJCWlmICghcmV0IHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXQ7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGRldi0+bWluX2RlbHRhX25zKSk7CisJfQorfQorCisvKioKKyAqIHRpY2tfc2V0dXBfb25lc2hvdCAtIHNldHVwIHRoZSBldmVudCBkZXZpY2UgZm9yIG9uZXNob3QgbW9kZSAoaHJlcyBvciBub2h6KQorICovCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dF9ldmVudCkKK3sKKwluZXdkZXYtPmV2ZW50X2hhbmRsZXIgPSBoYW5kbGVyOworCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ld2RldiwgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChuZXdkZXYsIG5leHRfZXZlbnQsIGt0aW1lX2dldCgpKTsKK30KKworLyoqCisgKiB0aWNrX3N3aXRjaF90b19vbmVzaG90IC0gc3dpdGNoIHRvIG9uZXNob3QgbW9kZQorICovCitpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYgPSB0ZC0+ZXZ0ZGV2OworCisJaWYgKCFkZXYgfHwgIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgfHwKKwkgICAgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9PTkVTSE9UOworCWRldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7CisJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwl0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworLyoqCisgKiB0aWNrX2luaXRfaGlnaHJlcyAtIHN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK2ludCB0aWNrX2luaXRfaGlnaHJlcyh2b2lkKQoreworCXJldHVybiB0aWNrX3N3aXRjaF90b19vbmVzaG90KGhydGltZXJfaW50ZXJydXB0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTQxZjdmCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCkBAIC0wLDAgKzEsNTYzIEBACisvKgorICogIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworICoKKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA2LTIwMDcgIFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lcgorICoKKyAqICBObyBpZGxlIHRpY2sgaW1wbGVtZW50YXRpb24gZm9yIGxvdyBhbmQgaGlnaCByZXNvbHV0aW9uIHRpbWVycworICoKKyAqICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogUGVyIGNwdSBub2h6IGNvbnRyb2wgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGlja19zY2hlZCwgdGlja19jcHVfc2NoZWQpOworCisvKgorICogVGhlIHRpbWUsIHdoZW4gdGhlIGxhc3QgamlmZnkgdXBkYXRlIGhhcHBlbmVkLiBQcm90ZWN0ZWQgYnkgeHRpbWVfbG9jay4KKyAqLworc3RhdGljIGt0aW1lX3QgbGFzdF9qaWZmaWVzX3VwZGF0ZTsKKworc3RydWN0IHRpY2tfc2NoZWQgKnRpY2tfZ2V0X3RpY2tfc2NoZWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgIQorICovCitzdGF0aWMgdm9pZCB0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQoa3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrcyA9IDA7CisJa3RpbWVfdCBkZWx0YTsKKworCS8qIFJlZXZhbHV0ZSB3aXRoIHh0aW1lX2xvY2sgaGVsZCAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCBsYXN0X2ppZmZpZXNfdXBkYXRlKTsKKwlpZiAoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSB7CisKKwkJZGVsdGEgPSBrdGltZV9zdWIoZGVsdGEsIHRpY2tfcGVyaW9kKTsKKwkJbGFzdF9qaWZmaWVzX3VwZGF0ZSA9IGt0aW1lX2FkZChsYXN0X2ppZmZpZXNfdXBkYXRlLAorCQkJCQkJdGlja19wZXJpb2QpOworCisJCS8qIFNsb3cgcGF0aCBmb3IgbG9uZyB0aW1lb3V0cyAqLworCQlpZiAodW5saWtlbHkoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSkgeworCQkJczY0IGluY3IgPSBrdGltZV90b19ucyh0aWNrX3BlcmlvZCk7CisKKwkJCXRpY2tzID0ga3RpbWVfZGl2bnMoZGVsdGEsIGluY3IpOworCisJCQlsYXN0X2ppZmZpZXNfdXBkYXRlID0ga3RpbWVfYWRkX25zKGxhc3RfamlmZmllc191cGRhdGUsCisJCQkJCQkJICAgaW5jciAqIHRpY2tzKTsKKwkJfQorCQlkb190aW1lcigrK3RpY2tzKTsKKwl9CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIHJldHVybiByZXRyaWV2ZSB0aGUgamlmZmllcyB1cGRhdGUuCisgKi8KK3N0YXRpYyBrdGltZV90IHRpY2tfaW5pdF9qaWZmeV91cGRhdGUodm9pZCkKK3sKKwlrdGltZV90IHBlcmlvZDsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCS8qIERpZCB3ZSBzdGFydCB0aGUgamlmZmllcyB1cGRhdGUgeWV0ID8gKi8KKwlpZiAobGFzdF9qaWZmaWVzX3VwZGF0ZS50djY0ID09IDApCisJCWxhc3RfamlmZmllc191cGRhdGUgPSB0aWNrX25leHRfcGVyaW9kOworCXBlcmlvZCA9IGxhc3RfamlmZmllc191cGRhdGU7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlyZXR1cm4gcGVyaW9kOworfQorCisvKgorICogTk9IWiAtIGFrYSBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0eQorICovCisjaWZkZWYgQ09ORklHX05PX0haCisvKgorICogTk8gSFogZW5hYmxlZCA/CisgKi8KK3N0YXRpYyBpbnQgdGlja19ub2h6X2VuYWJsZWQgX19yZWFkX21vc3RseSAgPSAxOworCisvKgorICogRW5hYmxlIC8gRGlzYWJsZSB0aWNrbGVzcyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3RpY2tfbm9oeihjaGFyICpzdHIpCit7CisJaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMDsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIm9uIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMTsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2h6PSIsIHNldHVwX3RpY2tfbm9oeik7CisKKy8qKgorICogdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzIC0gdXBkYXRlIGppZmZpZXMgd2hlbiBpZGxlIHdhcyBpbnRlcnJ1cHRlZAorICoKKyAqIENhbGxlZCBmcm9tIGludGVycnVwdCBlbnRyeSB3aGVuIHRoZSBDUFUgd2FzIGlkbGUKKyAqCisgKiBJbiBjYXNlIHRoZSBzY2hlZF90aWNrIHdhcyBzdG9wcGVkIG9uIHRoaXMgQ1BVLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGppZmZpZXMKKyAqIG11c3QgYmUgdXBkYXRlZC4gT3RoZXJ3aXNlIGFuIGludGVycnVwdCBoYW5kbGVyIGNvdWxkIHVzZSBhIHN0YWxlIGppZmZ5CisgKiB2YWx1ZS4gV2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkgb24gYW55IGNwdSwgYXMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZQorICogY3B1LCB3aGljaCBoYXMgdGhlIHVwZGF0ZSB0YXNrIGFzc2lnbmVkIGlzIGluIGEgbG9uZyBzbGVlcC4KKyAqLwordm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa3RpbWVfdCBub3c7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCW5vdyA9IGt0aW1lX2dldCgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFdoZW4gdGhlIG5leHQgZXZlbnQgaXMgbW9yZSB0aGFuIGEgdGljayBpbnRvIHRoZSBmdXR1cmUsIHN0b3AgdGhlIGlkbGUgdGljaworICogQ2FsbGVkIGVpdGhlciBmcm9tIHRoZSBpZGxlIGxvb3Agb3IgZnJvbSBpcnFfZXhpdCgpIHdoZW4gYW4gaWRsZSBwZXJpb2Qgd2FzCisgKiBqdXN0IGludGVycnVwdGVkIGJ5IGFuIGludGVycnVwdCB3aGljaCBkaWQgbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4KKyAqLwordm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzZXEsIGxhc3RfamlmZmllcywgbmV4dF9qaWZmaWVzLCBkZWx0YV9qaWZmaWVzLCBmbGFnczsKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHM7CisJa3RpbWVfdCBsYXN0X3VwZGF0ZSwgZXhwaXJlcywgbm93LCBkZWx0YTsKKwlpbnQgY3B1OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodW5saWtlbHkodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSU5BQ1RJVkUpKQorCQlnb3RvIGVuZDsKKworCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJZ290byBlbmQ7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJQlVHX09OKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKTsKKworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qCisJICogV2hlbiBjYWxsZWQgZnJvbSBpcnFfZXhpdCB3ZSBuZWVkIHRvIGFjY291bnQgdGhlIGlkbGUgc2xlZXAgdGltZQorCSAqIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkgeworCQlkZWx0YSA9IGt0aW1lX3N1Yihub3csIHRzLT5pZGxlX2VudHJ5dGltZSk7CisJCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKwl9CisKKwl0cy0+aWRsZV9lbnRyeXRpbWUgPSBub3c7CisJdHMtPmlkbGVfY2FsbHMrKzsKKworCS8qIFJlYWQgamlmZmllcyBhbmQgdGhlIHRpbWUgd2hlbiBqaWZmaWVzIHdlcmUgdXBkYXRlZCBsYXN0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJbGFzdF91cGRhdGUgPSBsYXN0X2ppZmZpZXNfdXBkYXRlOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJLyogR2V0IHRoZSBuZXh0IHRpbWVyIHdoZWVsIHRpbWVyICovCisJbmV4dF9qaWZmaWVzID0gZ2V0X25leHRfdGltZXJfaW50ZXJydXB0KGxhc3RfamlmZmllcyk7CisJZGVsdGFfamlmZmllcyA9IG5leHRfamlmZmllcyAtIGxhc3RfamlmZmllczsKKworCS8qCisJICogRG8gbm90IHN0b3AgdGhlIHRpY2ssIGlmIHdlIGFyZSBvbmx5IG9uZSBvZmYKKwkgKiBvciBpZiB0aGUgY3B1IGlzIHJlcXVpcmVkIGZvciByY3UKKwkgKi8KKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQgJiYgKGRlbHRhX2ppZmZpZXMgPT0gMSB8fCByY3VfbmVlZHNfY3B1KGNwdSkpKQorCQlnb3RvIG91dDsKKworCS8qIFNjaGVkdWxlIHRoZSB0aWNrLCBpZiB3ZSBhcmUgYXQgbGVhc3Qgb25lIGppZmZpZSBvZmYgKi8KKwlpZiAoKGxvbmcpZGVsdGFfamlmZmllcyA+PSAxKSB7CisKKwkJaWYgKHJjdV9uZWVkc19jcHUoY3B1KSkKKwkJCWRlbHRhX2ppZmZpZXMgPSAxOworCQllbHNlCisJCQljcHVfc2V0KGNwdSwgbm9oel9jcHVfbWFzayk7CisJCS8qCisJCSAqIG5vaHpfc3RvcF9zY2hlZF90aWNrIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBiZWZvcmUKKwkJICogdGhlIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIGlzIGNhbGxlZC4gVGhpcyBoYXBwZW5zIHdoZW4KKwkJICogaW50ZXJydXB0cyBhcnJpdmUgd2hpY2ggZG8gbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4gSW4gdGhlCisJCSAqIGZpcnN0IGNhbGwgd2Ugc2F2ZSB0aGUgY3VycmVudCB0aWNrIHRpbWUsIHNvIHdlIGNhbiByZXN0YXJ0CisJCSAqIHRoZSBzY2hlZHVsZXIgdGljayBpbiBub2h6X3Jlc3RhcnRfc2NoZWRfdGljay4KKwkJICovCisJCWlmICghdHMtPnRpY2tfc3RvcHBlZCkgeworCQkJdHMtPmlkbGVfdGljayA9IHRzLT5zY2hlZF90aW1lci5leHBpcmVzOworCQkJdHMtPnRpY2tfc3RvcHBlZCA9IDE7CisJCQl0cy0+aWRsZV9qaWZmaWVzID0gbGFzdF9qaWZmaWVzOworCQl9CisJCS8qCisJCSAqIGNhbGN1bGF0ZSB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSBuZXh0IHRpbWVyIHdoZWVsCisJCSAqIHRpbWVyCisJCSAqLworCQlleHBpcmVzID0ga3RpbWVfYWRkX25zKGxhc3RfdXBkYXRlLCB0aWNrX3BlcmlvZC50djY0ICoKKwkJCQkgICAgICAgZGVsdGFfamlmZmllcyk7CisJCXRzLT5pZGxlX2V4cGlyZXMgPSBleHBpcmVzOworCQl0cy0+aWRsZV9zbGVlcHMrKzsKKworCQlpZiAodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSElHSFJFUykgeworCQkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCBleHBpcmVzLAorCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkJLyogQ2hlY2ssIGlmIHRoZSB0aW1lciB3YXMgYWxyZWFkeSBpbiB0aGUgcGFzdCAqLworCQkJaWYgKGhydGltZXJfYWN0aXZlKCZ0cy0+c2NoZWRfdGltZXIpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYoIXRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKSkKKwkJCQlnb3RvIG91dDsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgdGhlIGV2ZW50IGFscmVhZHkuIFNvIHdlIGNyb3NzZWQgYQorCQkgKiBqaWZmaWUgYm91bmRhcnkuIFVwZGF0ZSBqaWZmaWVzIGFuZCByYWlzZSB0aGUKKwkJICogc29mdGlycS4KKwkJICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChrdGltZV9nZXQoKSk7CisJCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCX0KKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihUSU1FUl9TT0ZUSVJRKTsKK291dDoKKwl0cy0+bmV4dF9qaWZmaWVzID0gbmV4dF9qaWZmaWVzOworCXRzLT5sYXN0X2ppZmZpZXMgPSBsYXN0X2ppZmZpZXM7CitlbmQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIC0gcmVzdGFydCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFJlc3RhcnQgdGhlIGlkbGUgdGljayB3aGVuIHRoZSBDUFUgaXMgd29rZW4gdXAgZnJvbSBpZGxlCisgKi8KK3ZvaWQgdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisJdW5zaWduZWQgbG9uZyB0aWNrczsKKwlrdGltZV90IG5vdywgZGVsdGE7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCS8qIFVwZGF0ZSBqaWZmaWVzIGZpcnN0ICovCisJbm93ID0ga3RpbWVfZ2V0KCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCisJLyogQWNjb3VudCB0aGUgaWRsZSB0aW1lICovCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCB0cy0+aWRsZV9lbnRyeXRpbWUpOworCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKworCS8qCisJICogV2Ugc3RvcHBlZCB0aGUgdGljayBpbiBpZGxlLiBVcGRhdGUgcHJvY2VzcyB0aW1lcyB3b3VsZCBtaXNzIHRoZQorCSAqIHRpbWUgd2Ugc2xlcHQgYXMgdXBkYXRlX3Byb2Nlc3NfdGltZXMgZG9lcyBvbmx5IGEgMSB0aWNrCisJICogYWNjb3VudGluZy4gRW5mb3JjZSB0aGF0IHRoaXMgaXMgYWNjb3VudGVkIHRvIGlkbGUgIQorCSAqLworCXRpY2tzID0gamlmZmllcyAtIHRzLT5pZGxlX2ppZmZpZXM7CisJLyoKKwkgKiBXZSBtaWdodCBiZSBvbmUgb2ZmLiBEbyBub3QgcmFuZG9tbHkgYWNjb3VudCBhIGh1Z2UgbnVtYmVyIG9mIHRpY2tzIQorCSAqLworCWlmICh0aWNrcyAmJiB0aWNrcyA8IExPTkdfTUFYKSB7CisJCWFkZF9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwkJYWNjb3VudF9zeXN0ZW1fdGltZShjdXJyZW50LCBIQVJESVJRX09GRlNFVCwKKwkJCQkgICAgamlmZmllc190b19jcHV0aW1lKHRpY2tzKSk7CisJCXN1Yl9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwl9CisKKwkvKgorCSAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHRpbWVyIGFuZCByZXN0b3JlIHRoZSB0aWNrCisJICovCisJdHMtPnRpY2tfc3RvcHBlZCAgPSAwOworCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gdHMtPmlkbGVfdGljazsKKworCXdoaWxlICgxKSB7CisJCS8qIEZvcndhcmQgdGhlIHRpbWUgdG8gZXhwaXJlIGluIHRoZSBmdXR1cmUgKi8KKwkJaHJ0aW1lcl9mb3J3YXJkKCZ0cy0+c2NoZWRfdGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJCWlmICh0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9ISUdIUkVTKSB7CisJCQlocnRpbWVyX3N0YXJ0KCZ0cy0+c2NoZWRfdGltZXIsCisJCQkJICAgICAgdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMsCisJCQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisJCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCQlpZiAoaHJ0aW1lcl9hY3RpdmUoJnRzLT5zY2hlZF90aW1lcikpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoIXRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCkpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogVXBkYXRlIGppZmZpZXMgYW5kIHJlcmVhZCB0aW1lICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW50IHRpY2tfbm9oel9yZXByb2dyYW0oc3RydWN0IHRpY2tfc2NoZWQgKnRzLCBrdGltZV90IG5vdykKK3sKKwlocnRpbWVyX2ZvcndhcmQoJnRzLT5zY2hlZF90aW1lciwgbm93LCB0aWNrX3BlcmlvZCk7CisJcmV0dXJuIHRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBUaGUgbm9oeiBsb3cgcmVzIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogV2hlbiB3ZSBhcmUgaWRsZSBhbmQgdGhlIHRpY2sgaXMgc3RvcHBlZCwgd2UgaGF2ZSB0byB0b3VjaAorCSAqIHRoZSB3YXRjaGRvZyBhcyB3ZSBtaWdodCBub3Qgc2NoZWR1bGUgZm9yIGEgcmVhbGx5IGxvbmcKKwkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCSAqIHdhaXRpbmcgb24gdGhlIGxvZ2luIHByb21wdC4gV2UgYWxzbyBpbmNyZW1lbnQgdGhlICJzdGFydAorCSAqIG9mIGlkbGUiIGppZmZ5IHN0YW1wIHNvIHRoZSBpZGxlIGFjY291bnRpbmcgYWRqdXN0bWVudCB3ZQorCSAqIGRvIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCSAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKSB7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJdHMtPmlkbGVfamlmZmllcysrOworCX0KKworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOworCisJLyogRG8gbm90IHJlc3RhcnQsIHdoZW4gd2UgYXJlIGluIHRoZSBpZGxlIGxvb3AgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHRpY2tfbm9oel9yZXByb2dyYW0odHMsIG5vdykpIHsKKwkJbm93ID0ga3RpbWVfZ2V0KCk7CisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCX0KK30KKworLyoqCisgKiB0aWNrX25vaHpfc3dpdGNoX3RvX25vaHogLSBzd2l0Y2ggdG8gbm9oeiBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9zd2l0Y2hfdG9fbm9oeih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5leHQ7CisKKwlpZiAoIXRpY2tfbm9oel9lbmFibGVkKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmICh0aWNrX3N3aXRjaF90b19vbmVzaG90KHRpY2tfbm9oel9oYW5kbGVyKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybjsKKwl9CisKKwl0cy0+bm9oel9tb2RlID0gTk9IWl9NT0RFX0xPV1JFUzsKKworCS8qCisJICogUmVjeWNsZSB0aGUgaHJ0aW1lciBpbiB0cywgc28gd2UgY2FuIHNoYXJlIHRoZQorCSAqIGhydGltZXJfZm9yd2FyZCB3aXRoIHRoZSBoaWdocmVzIGNvZGUuCisJICovCisJaHJ0aW1lcl9pbml0KCZ0cy0+c2NoZWRfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisJLyogR2V0IHRoZSBuZXh0IHBlcmlvZCAqLworCW5leHQgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gbmV4dDsKKwkJaWYgKCF0aWNrX3Byb2dyYW1fZXZlbnQobmV4dCwgMCkpCisJCQlicmVhazsKKwkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIE5PSHogbW9kZSBvbiBDUFUgIyVkXG4iLAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3N3aXRjaF90b19ub2h6KHZvaWQpIHsgfQorCisjZW5kaWYgLyogTk9fSFogKi8KKworLyoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzcGVjaWZpYyBjb2RlCisgKi8KKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisvKgorICogV2UgcmVhcm0gdGhlIHRpbWVyIHVudGlsIHdlIGdldCBkaXNhYmxlZCBieSB0aGUgaWRsZSBjb2RlCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB0aW1lci0+YmFzZS0+Y3B1X2Jhc2UtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHRpY2tfc2NoZWRfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9CisJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHRpY2tfc2NoZWQsIHNjaGVkX3RpbWVyKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlLT5jcHVfYmFzZTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogRG8gbm90IGNhbGwsIHdoZW4gd2UgYXJlIG5vdCBpbiBpcnEgY29udGV4dCBhbmQgaGF2ZQorCSAqIG5vIHZhbGlkIHJlZ3MgcG9pbnRlcgorCSAqLworCWlmIChyZWdzKSB7CisJCS8qCisJCSAqIFdoZW4gd2UgYXJlIGlkbGUgYW5kIHRoZSB0aWNrIGlzIHN0b3BwZWQsIHdlIGhhdmUgdG8gdG91Y2gKKwkJICogdGhlIHdhdGNoZG9nIGFzIHdlIG1pZ2h0IG5vdCBzY2hlZHVsZSBmb3IgYSByZWFsbHkgbG9uZworCQkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCQkgKiB3YWl0aW5nIG9uIHRoZSBsb2dpbiBwcm9tcHQuIFdlIGFsc28gaW5jcmVtZW50IHRoZSAic3RhcnQgb2YKKwkJICogaWRsZSIgamlmZnkgc3RhbXAgc28gdGhlIGlkbGUgYWNjb3VudGluZyBhZGp1c3RtZW50IHdlIGRvCisJCSAqIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCQkgKi8KKwkJaWYgKHRzLT50aWNrX3N0b3BwZWQpIHsKKwkJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJCXRzLT5pZGxlX2ppZmZpZXMrKzsKKwkJfQorCQkvKgorCQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIG1pZ2h0IHRha2UgdGFza2xpc3RfbG9jaywgaGVuY2UKKwkJICogZHJvcCB0aGUgYmFzZSBsb2NrLiBzY2hlZC10aWNrIGhydGltZXJzIGFyZSBwZXItQ1BVIGFuZAorCQkgKiBuZXZlciBhY2Nlc3NpYmxlIGJ5IHVzZXJzcGFjZSBBUElzLCBzbyB0aGlzIGlzIHNhZmUgdG8gZG8uCisJCSAqLworCQlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKKwkJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwl9CisKKwkvKiBEbyBub3QgcmVzdGFydCwgd2hlbiB3ZSBhcmUgaW4gdGhlIGlkbGUgbG9vcCAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlocnRpbWVyX2ZvcndhcmQodGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKK30KKworLyoqCisgKiB0aWNrX3NldHVwX3NjaGVkX3RpbWVyIC0gc2V0dXAgdGhlIHRpY2sgZW11bGF0aW9uIHRpbWVyCisgKi8KK3ZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJLyoKKwkgKiBFbXVsYXRlIHRpY2sgcHJvY2Vzc2luZyB2aWEgcGVyLUNQVSBocnRpbWVyczoKKwkgKi8KKwlocnRpbWVyX2luaXQoJnRzLT5zY2hlZF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwl0cy0+c2NoZWRfdGltZXIuZnVuY3Rpb24gPSB0aWNrX3NjaGVkX3RpbWVyOworCXRzLT5zY2hlZF90aW1lci5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE7CisKKwkvKiBHZXQgdGhlIG5leHQgcGVyaW9kICovCisJdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCWhydGltZXJfZm9yd2FyZCgmdHMtPnNjaGVkX3RpbWVyLCBub3csIHRpY2tfcGVyaW9kKTsKKwkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCB0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCWlmIChocnRpbWVyX2FjdGl2ZSgmdHMtPnNjaGVkX3RpbWVyKSkKKwkJCWJyZWFrOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTk9fSFoKKwlpZiAodGlja19ub2h6X2VuYWJsZWQpCisJCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSElHSFJFUzsKKyNlbmRpZgorfQorCit2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpCit7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodHMtPnNjaGVkX3RpbWVyLmJhc2UpCisJCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT50aWNrX3N0b3BwZWQgPSAwOworCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSU5BQ1RJVkU7Cit9CisjZW5kaWYgLyogSElHSF9SRVNfVElNRVJTICovCisKKy8qKgorICogQXN5bmMgbm90aWZpY2F0aW9uIGFib3V0IGNsb2Nrc291cmNlIGNoYW5nZXMKKyAqLwordm9pZCB0aWNrX2Nsb2NrX25vdGlmeSh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlzZXRfYml0KDAsICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpLmNoZWNrX2Nsb2Nrcyk7Cit9CisKKy8qCisgKiBBc3luYyBub3RpZmljYXRpb24gYWJvdXQgY2xvY2sgZXZlbnQgY2hhbmdlcworICovCit2b2lkIHRpY2tfb25lc2hvdF9ub3RpZnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisKKwlzZXRfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKTsKK30KKworLyoqCisgKiBDaGVjaywgaWYgYSBjaGFuZ2UgaGFwcGVuZWQsIHdoaWNoIG1ha2VzIG9uZXNob3QgcG9zc2libGUuCisgKgorICogQ2FsbGVkIGN5Y2xpYyBmcm9tIHRoZSBocnRpbWVyIHNvZnRpcnEgKGRyaXZlbiBieSB0aGUgdGltZXIKKyAqIHNvZnRpcnEpIGFsbG93X25vaHogc2lnbmFscywgdGhhdCB3ZSBjYW4gc3dpdGNoIGludG8gbG93LXJlcyBub2h6CisgKiBtb2RlLCBiZWNhdXNlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGRpc2FibGVkIChlaXRoZXIgY29tcGlsZQorICogb3IgcnVudGltZSkuCisgKi8KK2ludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHMtPm5vaHpfbW9kZSAhPSBOT0haX01PREVfSU5BQ1RJVkUpCisJCXJldHVybiAwOworCisJaWYgKCF0aW1la2VlcGluZ19pc19jb250aW51b3VzKCkgfHwgIXRpY2tfaXNfb25lc2hvdF9hdmFpbGFibGUoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFsbG93X25vaHopCisJCXJldHVybiAxOworCisJdGlja19ub2h6X3N3aXRjaF90b19ub2h6KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYzYzNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIGtlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworICoKKyAqIExpc3QgcGVuZGluZyB0aW1lcnMKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCit0eXBlZGVmIHZvaWQgKCpwcmludF9mbl90KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSwgaHJ0aW1lcl9iYXNlcyk7CisKKy8qCisgKiBUaGlzIGFsbG93cyBwcmludGluZyBib3RoIHRvIC9wcm9jL3RpbWVyX2xpc3QgYW5kCisgKiB0byB0aGUgY29uc29sZSAob24gU3lzUnEtUSk6CisgKi8KKyNkZWZpbmUgU0VRX3ByaW50ZihtLCB4Li4uKQkJCVwKKyBkbyB7CQkJCQkJXAorCWlmIChtKQkJCQkJXAorCQlzZXFfcHJpbnRmKG0sIHgpOwkJXAorCWVsc2UJCQkJCVwKKwkJcHJpbnRrKHgpOwkJCVwKKyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnN5bSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylzeW07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlTRVFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCVNFUV9wcmludGYobSwgIjwlcD4iLCBzeW0pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdGltZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGludCBpZHgsIHU2NCBub3cpCit7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJY2hhciB0bXBbVEFTS19DT01NX0xFTiArIDFdOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAiICMlZDogIiwgaWR4KTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lcik7CisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+ZnVuY3Rpb24pOworCVNFUV9wcmludGYobSwgIiwgUzolMDJseCIsIHRpbWVyLT5zdGF0ZSk7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+c3RhcnRfc2l0ZSk7CisJbWVtY3B5KHRtcCwgdGltZXItPnN0YXJ0X2NvbW0sIFRBU0tfQ09NTV9MRU4pOworCXRtcFtUQVNLX0NPTU1fTEVOXSA9IDA7CisJU0VRX3ByaW50ZihtLCAiLCAlcy8lZCIsIHRtcCwgdGltZXItPnN0YXJ0X3BpZCk7CisjZW5kaWYKKwlTRVFfcHJpbnRmKG0sICJcbiIpOworCVNFUV9wcmludGYobSwgIiAjIGV4cGlyZXMgYXQgJUxkIG5zZWNzIFtpbiAlTGQgbnNlY3NdXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKHRpbWVyLT5leHBpcmVzKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykoa3RpbWVfdG9fbnModGltZXItPmV4cGlyZXMpIC0gbm93KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hY3RpdmVfdGltZXJzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwKKwkJICAgIHU2NCBub3cpCit7CisJc3RydWN0IGhydGltZXIgKnRpbWVyLCB0bXA7CisJdW5zaWduZWQgbG9uZyBuZXh0ID0gMCwgaTsKKwlzdHJ1Y3QgcmJfbm9kZSAqY3VycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCituZXh0X29uZToKKwlpID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCWN1cnIgPSBiYXNlLT5maXJzdDsKKwkvKgorCSAqIENydWRlIGJ1dCB3ZSBoYXZlIHRvIGRvIHRoaXMgTyhOKk4pIHRoaW5nLCBiZWNhdXNlCisJICogd2UgaGF2ZSB0byB1bmxvY2sgdGhlIGJhc2Ugd2hlbiBwcmludGluZzoKKwkgKi8KKwl3aGlsZSAoY3VyciAmJiBpIDwgbmV4dCkgeworCQljdXJyID0gcmJfbmV4dChjdXJyKTsKKwkJaSsrOworCX0KKworCWlmIChjdXJyKSB7CisKKwkJdGltZXIgPSByYl9lbnRyeShjdXJyLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCXRtcCA9ICp0aW1lcjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCQlwcmludF90aW1lcihtLCAmdG1wLCBpLCBub3cpOworCQluZXh0Kys7CisJCWdvdG8gbmV4dF9vbmU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9iYXNlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgdTY0IG5vdykKK3sKKwlTRVFfcHJpbnRmKG0sICIgIC5pbmRleDogICAgICAlZFxuIiwKKwkJCWJhc2UtPmluZGV4KTsKKwlTRVFfcHJpbnRmKG0sICIgIC5yZXNvbHV0aW9uOiAlTGQgbnNlY3NcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKGJhc2UtPnJlc29sdXRpb24pKTsKKwlTRVFfcHJpbnRmKG0sICAgIiAgLmdldF90aW1lOiAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGJhc2UtPmdldF90aW1lKTsKKwlTRVFfcHJpbnRmKG0sICAgIlxuIik7CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCVNFUV9wcmludGYobSwgIiAgLm9mZnNldDogICAgICVMZCBuc2Vjc1xuIiwKKwkJCWt0aW1lX3RvX25zKGJhc2UtPm9mZnNldCkpOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAgICJhY3RpdmUgdGltZXJzOlxuIik7CisJcHJpbnRfYWN0aXZlX3RpbWVycyhtLCBiYXNlLCBub3cpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jcHUoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1LCB1NjQgbm93KQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJaW50IGk7CisKKwlTRVFfcHJpbnRmKG0sICJcbmNwdTogJWRcbiIsIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJU0VRX3ByaW50ZihtLCAiIGNsb2NrICVkOlxuIiwgaSk7CisJCXByaW50X2Jhc2UobSwgY3B1X2Jhc2UtPmNsb2NrX2Jhc2UgKyBpLCBub3cpOworCX0KKyNkZWZpbmUgUCh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZFxuIiwgI3gsICh1NjQpKGNwdV9iYXNlLT54KSkKKyNkZWZpbmUgUF9ucyh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZCBuc2Vjc1xuIiwgI3gsIFwKKwkJKHU2NCkoa3RpbWVfdG9fbnMoY3B1X2Jhc2UtPngpKSkKKworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlQX25zKGV4cGlyZXNfbmV4dCk7CisJUChocmVzX2FjdGl2ZSk7CisJUChucl9ldmVudHMpOworI2VuZGlmCisjdW5kZWYgUAorI3VuZGVmIFBfbnMKKworI2lmZGVmIENPTkZJR19USUNLX09ORVNIT1QKKyMgZGVmaW5lIFAoeCkgXAorCVNFUV9wcmludGYobSwgIiAgLiUtMTVzOiAlTGRcbiIsICN4LCAodTY0KSh0cy0+eCkpCisjIGRlZmluZSBQX25zKHgpIFwKKwlTRVFfcHJpbnRmKG0sICIgIC4lLTE1czogJUxkIG5zZWNzXG4iLCAjeCwgXAorCQkodTY0KShrdGltZV90b19ucyh0cy0+eCkpKQorCXsKKwkJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gdGlja19nZXRfdGlja19zY2hlZChjcHUpOworCQlQKG5vaHpfbW9kZSk7CisJCVBfbnMoaWRsZV90aWNrKTsKKwkJUCh0aWNrX3N0b3BwZWQpOworCQlQKGlkbGVfamlmZmllcyk7CisJCVAoaWRsZV9jYWxscyk7CisJCVAoaWRsZV9zbGVlcHMpOworCQlQX25zKGlkbGVfZW50cnl0aW1lKTsKKwkJUF9ucyhpZGxlX3NsZWVwdGltZSk7CisJCVAobGFzdF9qaWZmaWVzKTsKKwkJUChuZXh0X2ppZmZpZXMpOworCQlQX25zKGlkbGVfZXhwaXJlcyk7CisJCVNFUV9wcmludGYobSwgImppZmZpZXM6ICVMZFxuIiwgKHU2NClqaWZmaWVzKTsKKwl9CisjZW5kaWYKKworI3VuZGVmIFAKKyN1bmRlZiBQX25zCit9CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworc3RhdGljIHZvaWQKK3ByaW50X3RpY2tkZXZpY2Uoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGlja19kZXZpY2UgKnRkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IHRkLT5ldnRkZXY7CisKKwlTRVFfcHJpbnRmKG0sICJcblRpY2sgRGV2aWNlOiBtb2RlOiAgICAgJWRcbiIsIHRkLT5tb2RlKTsKKworCVNFUV9wcmludGYobSwgIkNsb2NrIEV2ZW50IERldmljZTogIik7CisJaWYgKCFkZXYpIHsKKwkJU0VRX3ByaW50ZihtLCAiPE5VTEw+XG4iKTsKKwkJcmV0dXJuOworCX0KKwlTRVFfcHJpbnRmKG0sICIlc1xuIiwgZGV2LT5uYW1lKTsKKwlTRVFfcHJpbnRmKG0sICIgbWF4X2RlbHRhX25zOiAgICVsZFxuIiwgZGV2LT5tYXhfZGVsdGFfbnMpOworCVNFUV9wcmludGYobSwgIiBtaW5fZGVsdGFfbnM6ICAgJWxkXG4iLCBkZXYtPm1pbl9kZWx0YV9ucyk7CisJU0VRX3ByaW50ZihtLCAiIG11bHQ6ICAgICAgICAgICAlbGRcbiIsIGRldi0+bXVsdCk7CisJU0VRX3ByaW50ZihtLCAiIHNoaWZ0OiAgICAgICAgICAlZFxuIiwgZGV2LT5zaGlmdCk7CisJU0VRX3ByaW50ZihtLCAiIG1vZGU6ICAgICAgICAgICAlZFxuIiwgZGV2LT5tb2RlKTsKKwlTRVFfcHJpbnRmKG0sICIgbmV4dF9ldmVudDogICAgICVMZCBuc2Vjc1xuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykga3RpbWVfdG9fbnMoZGV2LT5uZXh0X2V2ZW50KSk7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X25leHRfZXZlbnQ6ICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X25leHRfZXZlbnQpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X21vZGU6ICAgICAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X21vZGUpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgZXZlbnRfaGFuZGxlcjogICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+ZXZlbnRfaGFuZGxlcik7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlpbnQgY3B1OworCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCisJcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9icm9hZGNhc3RfZGV2aWNlKCkpOworCVNFUV9wcmludGYobSwgInRpY2tfYnJvYWRjYXN0X21hc2s6ICUwOGx4XG4iLAorCQkgICB0aWNrX2dldF9icm9hZGNhc3RfbWFzaygpLT5iaXRzWzBdKTsKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisJU0VRX3ByaW50ZihtLCAidGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOiAlMDhseFxuIiwKKwkJICAgdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzaygpLT5iaXRzWzBdKTsKKyNlbmRpZgorCVNFUV9wcmludGYobSwgIlxuIik7CisjZW5kaWYKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJICAgcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9kZXZpY2UoY3B1KSk7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0aW1lcl9saXN0X3Nob3dfdGlja2RldmljZXMoc3RydWN0IHNlcV9maWxlICptKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJdTY0IG5vdyA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlpbnQgY3B1OworCisJU0VRX3ByaW50ZihtLCAiVGltZXIgTGlzdCBWZXJzaW9uOiB2MC4zXG4iKTsKKwlTRVFfcHJpbnRmKG0sICJIUlRJTUVSX01BWF9DTE9DS19CQVNFUzogJWRcbiIsIEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTKTsKKwlTRVFfcHJpbnRmKG0sICJub3cgYXQgJUxkIG5zZWNzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW5vdyk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJcHJpbnRfY3B1KG0sIGNwdSwgbm93KTsKKworCVNFUV9wcmludGYobSwgIlxuIik7CisJdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKG0pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3lzcnFfdGltZXJfbGlzdF9zaG93KHZvaWQpCit7CisJdGltZXJfbGlzdF9zaG93KE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdGltZXJfbGlzdF9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGltZXJfbGlzdF9mb3BzID0geworCS5vcGVuCQk9IHRpbWVyX2xpc3Rfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9saXN0X3Byb2Nmcyh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisKKwlwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ0aW1lcl9saXN0IiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRpbWVyX2xpc3RfZm9wczsKKworCXJldHVybiAwOworfQorX19pbml0Y2FsbChpbml0X3RpbWVyX2xpc3RfcHJvY2ZzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICoga2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYworICoKKyAqIENvbGxlY3QgdGltZXIgdXNhZ2Ugc3RhdGlzdGljcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIENvcHlyaWdodChDKSAyMDA2IFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lciA8dGdseEB0aW1lc3lzLmNvbT4KKyAqCisgKiB0aW1lcl9zdGF0cyBpcyBiYXNlZCBvbiB0aW1lcl90b3AsIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHdoaWNoIHdhcyBwYXJ0IG9mCisgKiBDb24gS29saXZhcyBkeW50aWNrIHBhdGNoIHNldC4gSXQgd2FzIGRldmVsb3BlZCBieSBEYW5pZWwgUGV0cmluaSBhdCB0aGUKKyAqIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cy4gdGltZXJfdG9wJ3MgZGVzaWduIHdhcyBiYXNlZAorICogb24gZHluYW1pYyBhbGxvY2F0aW9uIG9mIHRoZSBzdGF0aXN0aWNzIGVudHJpZXMgYW5kIGxpbmVhciBzZWFyY2ggYmFzZWQKKyAqIGxvb2t1cCBjb21iaW5lZCB3aXRoIGEgZ2xvYmFsIGxvY2ssIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMgYXJyYXksIGhhc2gKKyAqIGFuZCBwZXItQ1BVIGxvY2tpbmcgd2hpY2ggaXMgdXNlZCBieSB0aW1lcl9zdGF0cy4gSXQgd2FzIHdyaXR0ZW4gZm9yIHRoZQorICogcHJlIGhydGltZXIga2VybmVsIGNvZGUgYW5kIHRoZXJlZm9yZSBkaWQgbm90IHRha2UgaHJ0aW1lcnMgaW50byBhY2NvdW50LgorICogTmV2ZXJ0aGVsZXNzIGl0IHByb3ZpZGVkIHRoZSBiYXNlIGZvciB0aGUgdGltZXJfc3RhdHMgaW1wbGVtZW50YXRpb24gYW5kCisgKiB3YXMgYSBoZWxwZnVsIHNvdXJjZSBvZiBpbnNwaXJhdGlvbi4gS3Vkb3MgdG8gRGFuaWVsIGFuZCB0aGUgTm9raWEgZm9sa3MKKyAqIGZvciB0aGlzIGVmZm9ydC4KKyAqCisgKiB0aW1lcl90b3AuYyBpcworICoJQ29weXJpZ2h0IChDKSAyMDA1IEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cworICoJV3JpdHRlbiBieSBEYW5pZWwgUGV0cmluaSA8ZC5wZW5zYXRvckBnbWFpbC5jb20+CisgKgl0aW1lcl90b3AuYyB3YXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICoKKyAqIFdlIGV4cG9ydCB0aGUgYWRkcmVzc2VzIGFuZCBjb3VudGluZyBvZiB0aW1lciBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkLAorICogdGhlIHBpZCBhbmQgY21kbGluZSBmcm9tIHRoZSBvd25lciBwcm9jZXNzIGlmIGFwcGxpY2FibGUuCisgKgorICogU3RhcnQvc3RvcCBkYXRhIGNvbGxlY3Rpb246CisgKiAjIGVjaG8gMVswXSA+L3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgc28gZmFyOgorICogIyBjYXQgL3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBUaGlzIGlzIG91ciBiYXNpYyB1bml0IG9mIGludGVyZXN0OiBhIHRpbWVyIGV4cGlyeSBldmVudCBpZGVudGlmaWVkCisgKiBieSB0aGUgdGltZXIsIGl0cyBzdGFydC9leHBpcmUgZnVuY3Rpb25zIGFuZCB0aGUgUElEIG9mIHRoZSB0YXNrIHRoYXQKKyAqIHN0YXJ0ZWQgdGhlIHRpbWVyLiBXZSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGV2ZW50IGhhcHBlbnM6CisgKi8KK3N0cnVjdCBlbnRyeSB7CisJLyoKKwkgKiBIYXNoIGxpc3Q6CisJICovCisJc3RydWN0IGVudHJ5CQkqbmV4dDsKKworCS8qCisJICogSGFzaCBrZXlzOgorCSAqLworCXZvaWQJCQkqdGltZXI7CisJdm9pZAkJCSpzdGFydF9mdW5jOworCXZvaWQJCQkqZXhwaXJlX2Z1bmM7CisJcGlkX3QJCQlwaWQ7CisKKwkvKgorCSAqIE51bWJlciBvZiB0aW1lb3V0IGV2ZW50czoKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQljb3VudDsKKworCS8qCisJICogV2Ugc2F2ZSB0aGUgY29tbWFuZC1saW5lIHN0cmluZyB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gcGFzdCB0YXNrIGV4aXQ6CisJICovCisJY2hhcgkJCWNvbW1bVEFTS19DT01NX0xFTiArIDFdOworCit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKy8qCisgKiBTcGlubG9jayBwcm90ZWN0aW5nIHRoZSB0YWJsZXMgLSBub3QgdGFrZW4gZHVyaW5nIGxvb2t1cDoKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh0YWJsZV9sb2NrKTsKKworLyoKKyAqIFBlci1DUFUgbG9va3VwIGxvY2tzIGZvciBmYXN0IGhhc2ggbG9va3VwOgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbG9va3VwX2xvY2spOworCisvKgorICogTXV0ZXggdG8gc2VyaWFsaXplIHN0YXRlIGNoYW5nZXMgd2l0aCBzaG93LXN0YXRzIGFjdGl2aXRpZXM6CisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoc2hvd19tdXRleCk7CisKKy8qCisgKiBDb2xsZWN0aW9uIHN0YXR1cywgYWN0aXZlL2luYWN0aXZlOgorICovCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgYWN0aXZlOworCisvKgorICogQmVnaW5uaW5nL2VuZCB0aW1lc3RhbXBzIG9mIG1lYXN1cmVtZW50OgorICovCitzdGF0aWMga3RpbWVfdCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3A7CisKKy8qCisgKiB0c3RhdCBlbnRyeSBzdHJ1Y3RzIG9ubHkgZ2V0IGFsbG9jYXRlZCB3aGlsZSBjb2xsZWN0aW9uIGlzCisgKiBhY3RpdmUgYW5kIG5ldmVyIGZyZWVkIGR1cmluZyB0aGF0IHRpbWUgLSB0aGlzIHNpbXBsaWZpZXMKKyAqIHRoaW5ncyBxdWl0ZSBhIGJpdC4KKyAqCisgKiBUaGV5IGdldCBmcmVlZCB3aGVuIGEgbmV3IGNvbGxlY3Rpb24gcGVyaW9kIGlzIHN0YXJ0ZWQuCisgKi8KKyNkZWZpbmUgTUFYX0VOVFJJRVNfQklUUwkxMAorI2RlZmluZSBNQVhfRU5UUklFUwkJKDFVTCA8PCBNQVhfRU5UUklFU19CSVRTKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9lbnRyaWVzOworc3RhdGljIHN0cnVjdCBlbnRyeSBlbnRyaWVzW01BWF9FTlRSSUVTXTsKKworc3RhdGljIGF0b21pY190IG92ZXJmbG93X2NvdW50OworCitzdGF0aWMgdm9pZCByZXNldF9lbnRyaWVzKHZvaWQpCit7CisJbnJfZW50cmllcyA9IDA7CisJbWVtc2V0KGVudHJpZXMsIDAsIHNpemVvZihlbnRyaWVzKSk7CisJYXRvbWljX3NldCgmb3ZlcmZsb3dfY291bnQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICphbGxvY19lbnRyeSh2b2lkKQoreworCWlmIChucl9lbnRyaWVzID49IE1BWF9FTlRSSUVTKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyaWVzICsgbnJfZW50cmllcysrOworfQorCisvKgorICogVGhlIGVudHJpZXMgYXJlIGluIGEgaGFzaC10YWJsZSwgZm9yIGZhc3QgbG9va3VwOgorICovCisjZGVmaW5lIFRTVEFUX0hBU0hfQklUUwkJKE1BWF9FTlRSSUVTX0JJVFMgLSAxKQorI2RlZmluZSBUU1RBVF9IQVNIX1NJWkUJCSgxVUwgPDwgVFNUQVRfSEFTSF9CSVRTKQorI2RlZmluZSBUU1RBVF9IQVNIX01BU0sJCShUU1RBVF9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIF9fdHN0YXRfaGFzaGZuKGVudHJ5KQkJCQkJCVwKKwkoKCh1bnNpZ25lZCBsb25nKShlbnRyeSktPnRpbWVyICAgICAgIF4JCQkJXAorCSAgKHVuc2lnbmVkIGxvbmcpKGVudHJ5KS0+c3RhcnRfZnVuYyAgXgkJCQlcCisJICAodW5zaWduZWQgbG9uZykoZW50cnkpLT5leHBpcmVfZnVuYyBeCQkJCVwKKwkgICh1bnNpZ25lZCBsb25nKShlbnRyeSktPnBpZAkJKSAmIFRTVEFUX0hBU0hfTUFTSykKKworI2RlZmluZSB0c3RhdF9oYXNoZW50cnkoZW50cnkpCSh0c3RhdF9oYXNoX3RhYmxlICsgX190c3RhdF9oYXNoZm4oZW50cnkpKQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9oYXNoX3RhYmxlW1RTVEFUX0hBU0hfU0laRV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIGludCBtYXRjaF9lbnRyaWVzKHN0cnVjdCBlbnRyeSAqZW50cnkxLCBzdHJ1Y3QgZW50cnkgKmVudHJ5MikKK3sKKwlyZXR1cm4gZW50cnkxLT50aW1lciAgICAgICA9PSBlbnRyeTItPnRpbWVyCSAgJiYKKwkgICAgICAgZW50cnkxLT5zdGFydF9mdW5jICA9PSBlbnRyeTItPnN0YXJ0X2Z1bmMgICYmCisJICAgICAgIGVudHJ5MS0+ZXhwaXJlX2Z1bmMgPT0gZW50cnkyLT5leHBpcmVfZnVuYyAmJgorCSAgICAgICBlbnRyeTEtPnBpZAkgICA9PSBlbnRyeTItPnBpZDsKK30KKworLyoKKyAqIExvb2sgdXAgd2hldGhlciBhbiBlbnRyeSBtYXRjaGluZyB0aGlzIGl0ZW0gaXMgcHJlc2VudAorICogaW4gdGhlIGhhc2ggYWxyZWFkeS4gTXVzdCBiZSBjYWxsZWQgd2l0aCBpcnFzIG9mZiBhbmQgdGhlCisgKiBsb29rdXAgbG9jayBoZWxkOgorICovCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9sb29rdXAoc3RydWN0IGVudHJ5ICplbnRyeSwgY2hhciAqY29tbSkKK3sKKwlzdHJ1Y3QgZW50cnkgKipoZWFkLCAqY3VyciwgKnByZXY7CisKKwloZWFkID0gdHN0YXRfaGFzaGVudHJ5KGVudHJ5KTsKKwljdXJyID0gKmhlYWQ7CisKKwkvKgorCSAqIFRoZSBmYXN0cGF0aCBpcyB3aGVuIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGhhc2hlZCwKKwkgKiB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvb2t1cCBsb2NrIGhlbGQsIGJ1dCB3aXRoIHRoZQorCSAqIHRhYmxlIGxvY2sgbm90IGhlbGQ6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJcmV0dXJuIGN1cnI7CisKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCS8qCisJICogU2xvd3BhdGg6IGFsbG9jYXRlLCBzZXQgdXAgYW5kIGxpbmsgYSBuZXcgaGFzaCBlbnRyeToKKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwljdXJyID0gKmhlYWQ7CisKKwlzcGluX2xvY2soJnRhYmxlX2xvY2spOworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgbm90IHJhY2VkIHdpdGggYW5vdGhlciBDUFU6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXByZXYgPSBjdXJyOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwljdXJyID0gYWxsb2NfZW50cnkoKTsKKwlpZiAoY3VycikgeworCQkqY3VyciA9ICplbnRyeTsKKwkJY3Vyci0+Y291bnQgPSAwOworCQltZW1jcHkoY3Vyci0+Y29tbSwgY29tbSwgVEFTS19DT01NX0xFTik7CisJCWlmIChwcmV2KQorCQkJcHJldi0+bmV4dCA9IGN1cnI7CisJCWVsc2UKKwkJCSpoZWFkID0gY3VycjsKKwkJY3Vyci0+bmV4dCA9IE5VTEw7CisJfQorIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGN1cnI7Cit9CisKKy8qKgorICogdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZvciBhIHRpbWVyLgorICogQHRpbWVyOglwb2ludGVyIHRvIGVpdGhlciBhIHRpbWVyX2xpc3Qgb3IgYSBocnRpbWVyCisgKiBAcGlkOgl0aGUgcGlkIG9mIHRoZSB0YXNrIHdoaWNoIHNldCB1cCB0aGUgdGltZXIKKyAqIEBzdGFydGY6CXBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIGRpZCB0aGUgdGltZXIgc2V0dXAKKyAqIEB0aW1lcmY6CXBvaW50ZXIgdG8gdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSB0aW1lcgorICogQGNvbW06CW5hbWUgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggc2V0IHVwIHRoZSB0aW1lcgorICoKKyAqIFdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiB0aGUgZXZlbnQgY291bnRlciBpcworICogaW5jcmVtZW50ZWQuIE90aGVyd2lzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBpbiBhIGZyZWUgc2xvdC4KKyAqLwordm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAorCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSkKK3sKKwkvKgorCSAqIEl0IGRvZXNudCBtYXR0ZXIgd2hpY2ggbG9jayB3ZSB0YWtlOgorCSAqLworCXNwaW5sb2NrX3QgKmxvY2sgPSAmcGVyX2NwdShsb29rdXBfbG9jaywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IGVudHJ5ICplbnRyeSwgaW5wdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlucHV0LnRpbWVyID0gdGltZXI7CisJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKKwlpbnB1dC5leHBpcmVfZnVuYyA9IHRpbWVyZjsKKwlpbnB1dC5waWQgPSBwaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJaWYgKCFhY3RpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVudHJ5ID0gdHN0YXRfbG9va3VwKCZpbnB1dCwgY29tbSk7CisJaWYgKGxpa2VseShlbnRyeSkpCisJCWVudHJ5LT5jb3VudCsrOworCWVsc2UKKwkJYXRvbWljX2luYygmb3ZlcmZsb3dfY291bnQpOworCisgb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlzZXFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIjwlcD4iLCAodm9pZCAqKWFkZHIpOworfQorCitzdGF0aWMgaW50IHRzdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgcGVyaW9kOworCXN0cnVjdCBlbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBtczsKKwlsb25nIGV2ZW50cyA9IDA7CisJa3RpbWVfdCB0aW1lOworCWludCBpOworCisJbXV0ZXhfbG9jaygmc2hvd19tdXRleCk7CisJLyoKKwkgKiBJZiBzdGlsbCBhY3RpdmUgdGhlbiBjYWxjdWxhdGUgdXAgdG8gbm93OgorCSAqLworCWlmIChhY3RpdmUpCisJCXRpbWVfc3RvcCA9IGt0aW1lX2dldCgpOworCisJdGltZSA9IGt0aW1lX3N1Yih0aW1lX3N0b3AsIHRpbWVfc3RhcnQpOworCisJcGVyaW9kID0ga3RpbWVfdG9fdGltZXNwZWModGltZSk7CisJbXMgPSBwZXJpb2QudHZfbnNlYyAvIDEwMDAwMDA7CisKKwlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMVxuIik7CisJc2VxX3ByaW50ZihtLCAiU2FtcGxlIHBlcmlvZDogJWxkLiUwM2xkIHNcbiIsIHBlcmlvZC50dl9zZWMsIG1zKTsKKwlpZiAoYXRvbWljX3JlYWQoJm92ZXJmbG93X2NvdW50KSkKKwkJc2VxX3ByaW50ZihtLCAiT3ZlcmZsb3c6ICVkIGVudHJpZXNcbiIsCisJCQlhdG9taWNfcmVhZCgmb3ZlcmZsb3dfY291bnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspIHsKKwkJZW50cnkgPSBlbnRyaWVzICsgaTsKKwkJc2VxX3ByaW50ZihtLCAiJTRsdSwgJTVkICUtMTZzICIsCisJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPnN0YXJ0X2Z1bmMpOworCQlzZXFfcHV0cyhtLCAiICgiKTsKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPmV4cGlyZV9mdW5jKTsKKwkJc2VxX3B1dHMobSwgIilcbiIpOworCisJCWV2ZW50cyArPSBlbnRyeS0+Y291bnQ7CisJfQorCisJbXMgKz0gcGVyaW9kLnR2X3NlYyAqIDEwMDA7CisJaWYgKCFtcykKKwkJbXMgPSAxOworCisJaWYgKGV2ZW50cyAmJiBwZXJpb2QudHZfc2VjKQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzLCAlbGQuJWxkIGV2ZW50cy9zZWNcbiIsIGV2ZW50cywKKwkJCSAgIGV2ZW50cyAvIHBlcmlvZC50dl9zZWMsIGV2ZW50cyAqIDEwMDAgLyBtcyk7CisJZWxzZQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzXG4iLCBldmVudHMpOworCisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogQWZ0ZXIgYSBzdGF0ZSBjaGFuZ2UsIG1ha2Ugc3VyZSBhbGwgY29uY3VycmVudCBsb29rdXAvdXBkYXRlCisgKiBhY3Rpdml0aWVzIGhhdmUgc3RvcHBlZDoKKyAqLworc3RhdGljIHZvaWQgc3luY19hY2Nlc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsb29rdXBfbG9jaywgY3B1KSwgZmxhZ3MpOworCQkvKiBub3RoaW5nICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSksIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcykKK3sKKwljaGFyIGN0bFsyXTsKKworCWlmIChjb3VudCAhPSAyIHx8ICpvZmZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjdGwsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW11dGV4X2xvY2soJnNob3dfbXV0ZXgpOworCXN3aXRjaCAoY3RsWzBdKSB7CisJY2FzZSAnMCc6CisJCWlmIChhY3RpdmUpIHsKKwkJCWFjdGl2ZSA9IDA7CisJCQl0aW1lX3N0b3AgPSBrdGltZV9nZXQoKTsKKwkJCXN5bmNfYWNjZXNzKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnMSc6CisJCWlmICghYWN0aXZlKSB7CisJCQlyZXNldF9lbnRyaWVzKCk7CisJCQl0aW1lX3N0YXJ0ID0ga3RpbWVfZ2V0KCk7CisJCQlhY3RpdmUgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvdW50ID0gLUVJTlZBTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB0c3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdHN0YXRzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0c3RhdHNfZm9wcyA9IHsKKwkub3BlbgkJPSB0c3RhdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gdHN0YXRzX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCit2b2lkIF9faW5pdCBpbml0X3RpbWVyX3N0YXRzKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGxvb2t1cF9sb2NrLCBjcHUpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF90c3RhdHNfcHJvY2ZzKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKKworCXBlID0gY3JlYXRlX3Byb2NfZW50cnkoInRpbWVyX3N0YXRzIiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRzdGF0c19mb3BzOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKGluaXRfdHN0YXRzX3Byb2Nmcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDQ5MDIxODEuLmNiMWI4NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0yNjIsNiArMjY0LDE4IEBACiAJbGlzdF9hZGRfdGFpbCgmdGltZXItPmVudHJ5LCB2ZWMpOwogfQogCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCB2b2lkICphZGRyKQoreworCWlmICh0aW1lci0+c3RhcnRfc2l0ZSkKKwkJcmV0dXJuOworCisJdGltZXItPnN0YXJ0X3NpdGUgPSBhZGRyOworCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKK30KKyNlbmRpZgorCiAvKioKICAqIGluaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIuCiAgKiBAdGltZXI6IHRoZSB0aW1lciB0byBiZSBpbml0aWFsaXplZApAQCAtMjczLDExICsyODcsMTYgQEAKIHsKIAl0aW1lci0+ZW50cnkubmV4dCA9IE5VTEw7CiAJdGltZXItPmJhc2UgPSBfX3Jhd19nZXRfY3B1X3Zhcih0dmVjX2Jhc2VzKTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7CisJdGltZXItPnN0YXJ0X3BpZCA9IC0xOworCW1lbXNldCh0aW1lci0+c3RhcnRfY29tbSwgMCwgVEFTS19DT01NX0xFTik7CisjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woaW5pdF90aW1lcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXRhY2hfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAotCQkJCQlpbnQgY2xlYXJfcGVuZGluZykKKwkJCQlpbnQgY2xlYXJfcGVuZGluZykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZ0aW1lci0+ZW50cnk7CiAKQEAgLTMyNCw2ICszNDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lcik7CiAJQlVHX09OKCF0aW1lci0+ZnVuY3Rpb24pOwogCiAJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKQEAgLTM3NCw2ICszOTQsNyBAQAogCXR2ZWNfYmFzZV90ICpiYXNlID0gcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpOwogICAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKICAgCUJVR19PTih0aW1lcl9wZW5kaW5nKHRpbWVyKSB8fCAhdGltZXItPmZ1bmN0aW9uKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwogCXRpbWVyLT5iYXNlID0gYmFzZTsKQEAgLTQwNiw2ICs0MjcsNyBAQAogewogCUJVR19PTighdGltZXItPmZ1bmN0aW9uKTsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAkvKgogCSAqIFRoaXMgaXMgYSBjb21tb24gb3B0aW1pemF0aW9uIHRyaWdnZXJlZCBieSB0aGUKIAkgKiBuZXR3b3JraW5nIGNvZGUgLSBpZiB0aGUgdGltZXIgaXMgcmUtbW9kaWZpZWQKQEAgLTQzNiw2ICs0NTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAodGltZXJfcGVuZGluZyh0aW1lcikpIHsKIAkJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAkJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKSB7CkBAIC01NjksNiArNTkyLDggQEAKICAJCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKICAJCQlkYXRhID0gdGltZXItPmRhdGE7CiAKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIodGltZXIpOworCiAJCQlzZXRfcnVubmluZ190aW1lcihiYXNlLCB0aW1lcik7CiAJCQlkZXRhY2hfdGltZXIodGltZXIsIDEpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKQEAgLTU5MSwxMDUgKzYxNiwxMjQgQEAKIAlzcGluX3VubG9ja19pcnEoJmJhc2UtPmxvY2spOwogfQogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qCiAgKiBGaW5kIG91dCB3aGVuIHRoZSBuZXh0IHRpbWVyIGV2ZW50IGlzIGR1ZSB0byBoYXBwZW4uIFRoaXMKICAqIGlzIHVzZWQgb24gUy8zOTAgdG8gc3RvcCBhbGwgYWN0aXZpdHkgd2hlbiBhIGNwdXMgaXMgaWRsZS4KICAqIFRoaXMgZnVuY3Rpb25zIG5lZWRzIHRvIGJlIGNhbGxlZCBkaXNhYmxlZC4KICAqLwotdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19uZXh0X3RpbWVyX2ludGVycnVwdCh0dmVjX2Jhc2VfdCAqYmFzZSkKIHsKLQl0dmVjX2Jhc2VfdCAqYmFzZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXVuc2lnbmVkIGxvbmcgdGltZXJfamlmZmllcyA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gdGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKKwlpbnQgaW5kZXgsIHNsb3QsIGFycmF5LCBmb3VuZCA9IDA7CiAJc3RydWN0IHRpbWVyX2xpc3QgKm50ZTsKLQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7Ci0JdW5zaWduZWQgbG9uZyBocl9leHBpcmVzID0gTUFYX0pJRkZZX09GRlNFVDsKLQlrdGltZV90IGhyX2RlbHRhOwogCXR2ZWNfdCAqdmFycmF5WzRdOwotCWludCBpLCBqOwotCi0JaHJfZGVsdGEgPSBocnRpbWVyX2dldF9uZXh0X2V2ZW50KCk7Ci0JaWYgKGhyX2RlbHRhLnR2NjQgIT0gS1RJTUVfTUFYKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0c2RlbHRhOwotCQl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOwotCQlocl9leHBpcmVzID0gdGltZXNwZWNfdG9famlmZmllcygmdHNkZWx0YSk7Ci0JCWlmIChocl9leHBpcmVzIDwgMykKLQkJCXJldHVybiBocl9leHBpcmVzICsgamlmZmllczsKLQl9Ci0JaHJfZXhwaXJlcyArPSBqaWZmaWVzOwotCi0JYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7Ci0Jc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKLQlleHBpcmVzID0gYmFzZS0+dGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKLQlsaXN0ID0gTlVMTDsKIAogCS8qIExvb2sgZm9yIHRpbWVyIGV2ZW50cyBpbiB0djEuICovCi0JaiA9IGJhc2UtPnRpbWVyX2ppZmZpZXMgJiBUVlJfTUFTSzsKKwlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZSX01BU0s7CiAJZG8gewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgYmFzZS0+dHYxLnZlYyArIGosIGVudHJ5KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobnRlLCBiYXNlLT50djEudmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCWZvdW5kID0gMTsKIAkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChiYXNlLT50aW1lcl9qaWZmaWVzICYgVFZSX01BU0spKQotCQkJCWxpc3QgPSBiYXNlLT50djIudmVjICsgKElOREVYKDApKTsKLQkJCWdvdG8gZm91bmQ7CisJCQkvKiBMb29rIGF0IHRoZSBjYXNjYWRlIGJ1Y2tldChzKT8gKi8KKwkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCWdvdG8gY2FzY2FkZTsKKwkJCXJldHVybiBleHBpcmVzOwogCQl9Ci0JCWogPSAoaiArIDEpICYgVFZSX01BU0s7Ci0JfSB3aGlsZSAoaiAhPSAoYmFzZS0+dGltZXJfamlmZmllcyAmIFRWUl9NQVNLKSk7CisJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZSX01BU0s7CisJfSB3aGlsZSAoc2xvdCAhPSBpbmRleCk7CisKK2Nhc2NhZGU6CisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IGNhc2NhZGUgZXZlbnQgKi8KKwlpZiAoaW5kZXgpCisJCXRpbWVyX2ppZmZpZXMgKz0gVFZSX1NJWkUgLSBpbmRleDsKKwl0aW1lcl9qaWZmaWVzID4+PSBUVlJfQklUUzsKIAogCS8qIENoZWNrIHR2Mi10djUuICovCiAJdmFycmF5WzBdID0gJmJhc2UtPnR2MjsKIAl2YXJyYXlbMV0gPSAmYmFzZS0+dHYzOwogCXZhcnJheVsyXSA9ICZiYXNlLT50djQ7CiAJdmFycmF5WzNdID0gJmJhc2UtPnR2NTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWogPSBJTkRFWChpKTsKKworCWZvciAoYXJyYXkgPSAwOyBhcnJheSA8IDQ7IGFycmF5KyspIHsKKwkJdHZlY190ICp2YXJwID0gdmFycmF5W2FycmF5XTsKKworCQlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZOX01BU0s7CiAJCWRvIHsKLQkJCWlmIChsaXN0X2VtcHR5KHZhcnJheVtpXS0+dmVjICsgaikpIHsKLQkJCQlqID0gKGogKyAxKSAmIFRWTl9NQVNLOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIHZhcnJheVtpXS0+dmVjICsgaiwgZW50cnkpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgdmFycC0+dmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCQlmb3VuZCA9IDE7CiAJCQkJaWYgKHRpbWVfYmVmb3JlKG50ZS0+ZXhwaXJlcywgZXhwaXJlcykpCiAJCQkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChJTkRFWChpKSkgJiYgaSA8IDMpCi0JCQkJbGlzdCA9IHZhcnJheVtpICsgMV0tPnZlYyArIChJTkRFWChpICsgMSkpOwotCQkJZ290byBmb3VuZDsKLQkJfSB3aGlsZSAoaiAhPSAoSU5ERVgoaSkpKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBEbyB3ZSBzdGlsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCB0aW1lciBvciBhcmUKKwkJCSAqIHdlIGxvb2tpbmcgdXAgdGhlIGNhc2NhZGUgYnVja2V0cyA/CisJCQkgKi8KKwkJCWlmIChmb3VuZCkgeworCQkJCS8qIExvb2sgYXQgdGhlIGNhc2NhZGUgYnVja2V0KHMpPyAqLworCQkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCQlicmVhazsKKwkJCQlyZXR1cm4gZXhwaXJlczsKKwkJCX0KKwkJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZOX01BU0s7CisJCX0gd2hpbGUgKHNsb3QgIT0gaW5kZXgpOworCisJCWlmIChpbmRleCkKKwkJCXRpbWVyX2ppZmZpZXMgKz0gVFZOX1NJWkUgLSBpbmRleDsKKwkJdGltZXJfamlmZmllcyA+Pj0gVFZOX0JJVFM7CiAJfQotZm91bmQ6Ci0JaWYgKGxpc3QpIHsKLQkJLyoKLQkJICogVGhlIHNlYXJjaCB3cmFwcGVkLiBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5leHQgbGlzdAotCQkgKiBmcm9tIG5leHQgdHYgZWxlbWVudCB0aGF0IHdvdWxkIGNhc2NhZGUgaW50byB0diBlbGVtZW50Ci0JCSAqIHdoZXJlIHdlIGZvdW5kIHRoZSB0aW1lciBlbGVtZW50LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIGxpc3QsIGVudHJ5KSB7Ci0JCQlpZiAodGltZV9iZWZvcmUobnRlLT5leHBpcmVzLCBleHBpcmVzKSkKLQkJCQlleHBpcmVzID0gbnRlLT5leHBpcmVzOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQotCS8qCi0JICogSXQgY2FuIGhhcHBlbiB0aGF0IG90aGVyIENQVXMgc2VydmljZSB0aW1lciBJUlFzIGFuZCBpbmNyZW1lbnQKLQkgKiBqaWZmaWVzLCBidXQgd2UgaGF2ZSBub3QgeWV0IGdvdCBhIGxvY2FsIHRpbWVyIHRpY2sgdG8gcHJvY2VzcwotCSAqIHRoZSB0aW1lciB3aGVlbHMuICBJbiB0aGF0IGNhc2UsIHRoZSBleHBpcnkgdGltZSBjYW4gYmUgYmVmb3JlCi0JICogamlmZmllcywgYnV0IHNpbmNlIHRoZSBoaWdoLXJlc29sdXRpb24gdGltZXIgaGVyZSBpcyByZWxhdGl2ZSB0bwotCSAqIGppZmZpZXMsIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gd2hlbiBoaWdoLXJlc29sdXRpb24gdGltZXJzIGFyZQotCSAqIG5vdCBhY3RpdmUsCi0JICoKLQkgKiAgIHRpbWVfYmVmb3JlKE1BWF9KSUZGWV9PRkZTRVQgKyBqaWZmaWVzLCBleHBpcmVzKQotCSAqCi0JICogd291bGQgZmFsc2VseSBldmFsdWF0ZSB0byB0cnVlLiAgSWYgdGhhdCBpcyB0aGUgY2FzZSwganVzdAotCSAqIHJldHVybiBqaWZmaWVzIHNvIHRoYXQgd2UgY2FuIGltbWVkaWF0ZWx5IGZpcmUgdGhlIGxvY2FsIHRpbWVyCi0JICovCi0JaWYgKHRpbWVfYmVmb3JlKGV4cGlyZXMsIGppZmZpZXMpKQotCQlyZXR1cm4gamlmZmllczsKLQotCWlmICh0aW1lX2JlZm9yZShocl9leHBpcmVzLCBleHBpcmVzKSkKLQkJcmV0dXJuIGhyX2V4cGlyZXM7Ci0KIAlyZXR1cm4gZXhwaXJlczsKIH0KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgbmV4dCBocnRpbWVyIGV2ZW50IGlzIGJlZm9yZSB0aGUgbmV4dCB0aW1lciB3aGVlbAorICogZXZlbnQ6CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNtcF9uZXh0X2hydGltZXJfZXZlbnQodW5zaWduZWQgbG9uZyBub3csCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisJa3RpbWVfdCBocl9kZWx0YSA9IGhydGltZXJfZ2V0X25leHRfZXZlbnQoKTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNkZWx0YTsKKworCWlmIChocl9kZWx0YS50djY0ID09IEtUSU1FX01BWCkKKwkJcmV0dXJuIGV4cGlyZXM7CisKKwlpZiAoaHJfZGVsdGEudHY2NCA8PSBUSUNLX05TRUMpCisJCXJldHVybiBub3c7CisKKwl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOworCW5vdyArPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0c2RlbHRhKTsKKwlpZiAodGltZV9iZWZvcmUobm93LCBleHBpcmVzKSkKKwkJcmV0dXJuIG5vdzsKKwlyZXR1cm4gZXhwaXJlczsKK30KKworLyoqCisgKiBuZXh0X3RpbWVyX2ludGVycnVwdCAtIHJldHVybiB0aGUgamlmZnkgb2YgdGhlIG5leHQgcGVuZGluZyB0aW1lcgorICovCit1bnNpZ25lZCBsb25nIGdldF9uZXh0X3RpbWVyX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIG5vdykKK3sKKwl0dmVjX2Jhc2VfdCAqYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzOworCisJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwlleHBpcmVzID0gX19uZXh0X3RpbWVyX2ludGVycnVwdChiYXNlKTsKKwlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisKKwlpZiAodGltZV9iZWZvcmVfZXEoZXhwaXJlcywgbm93KSkKKwkJcmV0dXJuIG5vdzsKKworCXJldHVybiBjbXBfbmV4dF9ocnRpbWVyX2V2ZW50KG5vdywgZXhwaXJlcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgordW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQoreworCXJldHVybiBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQoamlmZmllcyk7Cit9CisjZW5kaWYKKwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MzIsMzIgKzg3NiwzNSBAQAogICoKICAqIEFjY3VtdWxhdGVzIGN1cnJlbnQgdGltZSBpbnRlcnZhbCBhbmQgaW5pdGlhbGl6ZXMgbmV3IGNsb2Nrc291cmNlCiAgKi8KLXN0YXRpYyBpbnQgY2hhbmdlX2Nsb2Nrc291cmNlKHZvaWQpCitzdGF0aWMgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKIHsKIAlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5ldzsKIAljeWNsZV90IG5vdzsKIAl1NjQgbnNlYzsKLQluZXcgPSBjbG9ja3NvdXJjZV9nZXRfbmV4dCgpOwotCWlmIChjbG9jayAhPSBuZXcpIHsKLQkJbm93ID0gY2xvY2tzb3VyY2VfcmVhZChuZXcpOwotCQluc2VjID0gIF9fZ2V0X25zZWNfb2Zmc2V0KCk7Ci0JCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOwogCi0JCWNsb2NrID0gbmV3OwotCQljbG9jay0+Y3ljbGVfbGFzdCA9IG5vdzsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZTogJXMgY2xvY2tzb3VyY2UgaGFzIGJlZW4gaW5zdGFsbGVkLlxuIiwKLQkJICAgICAgIGNsb2NrLT5uYW1lKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChjbG9jay0+dXBkYXRlX2NhbGxiYWNrKSB7Ci0JCXJldHVybiBjbG9jay0+dXBkYXRlX2NhbGxiYWNrKCk7Ci0JfQotCXJldHVybiAwOworCW5ldyA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7CisKKwlpZiAoY2xvY2sgPT0gbmV3KQorCQlyZXR1cm47CisKKwlub3cgPSBjbG9ja3NvdXJjZV9yZWFkKG5ldyk7CisJbnNlYyA9ICBfX2dldF9uc2VjX29mZnNldCgpOworCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOworCisJY2xvY2sgPSBuZXc7CisJY2xvY2stPmN5Y2xlX2xhc3QgPSBub3c7CisKKwljbG9jay0+ZXJyb3IgPSAwOworCWNsb2NrLT54dGltZV9uc2VjID0gMDsKKwljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIE5UUF9JTlRFUlZBTF9MRU5HVEgpOworCisJdGlja19jbG9ja19ub3RpZnkoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlRpbWU6ICVzIGNsb2Nrc291cmNlIGhhcyBiZWVuIGluc3RhbGxlZC5cbiIsCisJICAgICAgIGNsb2NrLT5uYW1lKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkgeyB9CiAjZW5kaWYKIAogLyoqCkBAIC04NzEsMzMgKzkxOCw1NiBAQAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CiAKLQkJcmV0ID0gY2xvY2stPmlzX2NvbnRpbnVvdXM7CisJCXJldCA9IGNsb2NrLT5mbGFncyAmIENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUzsKIAogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiByZWFkX3BlcnNpc3RlbnRfY2xvY2sgLSAgUmV0dXJuIHRpbWUgaW4gc2Vjb25kcyBmcm9tIHRoZSBwZXJzaXN0ZW50IGNsb2NrLgorICoKKyAqIFdlYWsgZHVtbXkgZnVuY3Rpb24gZm9yIGFyY2hlcyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydCBpdC4KKyAqIFJldHVybnMgc2Vjb25kcyBmcm9tIGVwb2NoIHVzaW5nIHRoZSBiYXR0ZXJ5IGJhY2tlZCBwZXJzaXN0ZW50IGNsb2NrLgorICogUmV0dXJucyB6ZXJvIGlmIHVuc3VwcG9ydGVkLgorICoKKyAqICBYWFggLSBEbyBiZSBzdXJlIHRvIHJlbW92ZSBpdCBvbmNlIGFsbCBhcmNoZXMgaW1wbGVtZW50IGl0LgorICovCit1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKHdlYWspKSByZWFkX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHRpbWVrZWVwaW5nX2luaXQgLSBJbml0aWFsaXplcyB0aGUgY2xvY2tzb3VyY2UgYW5kIGNvbW1vbiB0aW1la2VlcGluZyB2YWx1ZXMKICAqLwogdm9pZCBfX2luaXQgdGltZWtlZXBpbmdfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzZWMgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCiAJbnRwX2NsZWFyKCk7CiAKIAljbG9jayA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7Ci0JY2xvY2tzb3VyY2VfY2FsY3VsYXRlX2ludGVydmFsKGNsb2NrLCB0aWNrX25zZWMpOworCWNsb2Nrc291cmNlX2NhbGN1bGF0ZV9pbnRlcnZhbChjbG9jaywgTlRQX0lOVEVSVkFMX0xFTkdUSCk7CiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAorCXh0aW1lLnR2X3NlYyA9IHNlYzsKKwl4dGltZS50dl9uc2VjID0gMDsKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CiAKLQorLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCiBzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3N1c3BlbmRlZDsKKy8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKwogLyoqCiAgKiB0aW1la2VlcGluZ19yZXN1bWUgLSBSZXN1bWVzIHRoZSBnZW5lcmljIHRpbWVrZWVwaW5nIHN1YnN5c3RlbS4KICAqIEBkZXY6CXVudXNlZApAQCAtOTA5LDEzICs5NzksMjYgQEAKIHN0YXRpYyBpbnQgdGltZWtlZXBpbmdfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IHJlYWRfcGVyc2lzdGVudF9jbG9jaygpOwogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JLyogcmVzdGFydCB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLworCisJaWYgKG5vdyAmJiAobm93ID4gdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKSkgeworCQl1bnNpZ25lZCBsb25nIHNsZWVwX2xlbmd0aCA9IG5vdyAtIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKworCQl4dGltZS50dl9zZWMgKz0gc2xlZXBfbGVuZ3RoOworCQl3YWxsX3RvX21vbm90b25pYy50dl9zZWMgLT0gc2xlZXBfbGVuZ3RoOworCX0KKwkvKiByZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAljbG9jay0+ZXJyb3IgPSAwOwogCXRpbWVrZWVwaW5nX3N1c3BlbmRlZCA9IDA7CiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkvKiBSZXN1bWUgaHJ0aW1lcnMgKi8KKwljbG9ja193YXNfc2V0KCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTI1LDYgKzEwMDgsNyBAQAogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiAJdGltZWtlZXBpbmdfc3VzcGVuZGVkID0gMTsKKwl0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMTA4OSwxMSArMTE3Myw4IEBACiAJY2xvY2stPnh0aW1lX25zZWMgLT0gKHM2NCl4dGltZS50dl9uc2VjIDw8IGNsb2NrLT5zaGlmdDsKIAogCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ldyBjbG9ja3NvdXJjZSB0byB1c2UgKi8KLQlpZiAoY2hhbmdlX2Nsb2Nrc291cmNlKCkpIHsKLQkJY2xvY2stPmVycm9yID0gMDsKLQkJY2xvY2stPnh0aW1lX25zZWMgPSAwOwotCQljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIHRpY2tfbnNlYyk7Ci0JfQorCWNoYW5nZV9jbG9ja3NvdXJjZSgpOworCXVwZGF0ZV92c3lzY2FsbCgmeHRpbWUsIGNsb2NrKTsKIH0KIAogLyoKQEAgLTExNzMsNyArMTI1NCw4IEBACiB7CiAJdHZlY19iYXNlX3QgKmJhc2UgPSBfX2dldF9jcHVfdmFyKHR2ZWNfYmFzZXMpOwogCi0gCWhydGltZXJfcnVuX3F1ZXVlcygpOworCWhydGltZXJfcnVuX3F1ZXVlcygpOworCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpCiAJCV9fcnVuX3RpbWVycyhiYXNlKTsKIH0KQEAgLTE2MTksNiArMTcwMSw4IEBACiAJaW50IGVyciA9IHRpbWVyX2NwdV9ub3RpZnkoJnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCiAJCQkJKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCisJaW5pdF90aW1lcl9zdGF0cygpOworCiAJQlVHX09OKGVyciA9PSBOT1RJRllfQkFEKTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnRpbWVyc19uYik7CiAJb3Blbl9zb2Z0aXJxKFRJTUVSX1NPRlRJUlEsIHJ1bl90aW1lcl9zb2Z0aXJxLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCBiYWFjYzM2Li42NThmNjM4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAotCi0jZGVmaW5lIFVTRUNfUEVSX1RJQ0sJKFVTRUNfUEVSX1NFQy9IWikKIC8qCiAgKiBmaWxsIGluIGJhc2ljIGFjY291bnRpbmcgZmllbGRzCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCAwMjBkMWZmLi5iNmZhNWU2IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHF1ZXVlX3dvcmspOwogCi1zdGF0aWMgdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCit2b2lkIGRlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIF9fZGF0YSkKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IChzdHJ1Y3QgZGVsYXllZF93b3JrICopX19kYXRhOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGdldF93cV9kYXRhKCZkd29yay0+d29yayk7CkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmZHdvcmstPnRpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICZkd29yay0+d29yazsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAoZGVsYXkgPT0gMCkKIAkJcmV0dXJuIHF1ZXVlX3dvcmsod3EsIHdvcmspOwogCkBAIC01OTMsOCArNTk0LDEwIEBACiAgKiBBZnRlciB3YWl0aW5nIGZvciBhIGdpdmVuIHRpbWUgdGhpcyBwdXRzIGEgam9iIGluIHRoZSBrZXJuZWwtZ2xvYmFsCiAgKiB3b3JrcXVldWUuCiAgKi8KLWludCBmYXN0Y2FsbCBzY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCitpbnQgZmFzdGNhbGwgc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrLAorCQkJCQl1bnNpZ25lZCBsb25nIGRlbGF5KQogeworCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKCZkd29yay0+dGltZXIpOwogCXJldHVybiBxdWV1ZV9kZWxheWVkX3dvcmsoa2V2ZW50ZF93cSwgZHdvcmssIGRlbGF5KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGVfZGVsYXllZF93b3JrKTsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggNjNmMDRjMS4uNDQ0OGY5MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTEzNCw2ICsxMzQsMTcgQEAKIAkgIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHNheSBOIHRvIGF2b2lkIHRoZSB2ZXJ5IHNsaWdodCBvdmVyaGVhZAogCSAgdGhpcyBhZGRzLgogCitjb25maWcgVElNRVJfU1RBVFMKKwlib29sICJDb2xsZWN0IGtlcm5lbCB0aW1lcnMgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUk9DX0ZTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlCisJICB0aW1lciByb3V0aW5lcyB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQga2VybmVsIHRpbWVycyBiZWluZworCSAgcmVwcm9ncmFtbWVkLiBUaGUgc3RhdGlzdGljcyBjYW4gYmUgcmVhZCBmcm9tIC9wcm9jL3RpbWVyX3N0YXRzLgorCSAgVGhlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBpcyBzdGFydGVkIGJ5IHdyaXRpbmcgMSB0byAvcHJvYy90aW1lcl9zdGF0cywKKwkgIHdyaXRpbmcgMCBzdG9wcyBpdC4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB0byBjb2xsZWN0IGluZm9ybWF0aW9uCisJICBhYm91dCB0aW1lciB1c2FnZSBwYXR0ZXJucyBpbiBrZXJuZWwgYW5kIHVzZXJzcGFjZS4KKwogY29uZmlnIERFQlVHX1NMQUIKIAlib29sICJEZWJ1ZyBzbGFiIG1lbW9yeSBhbGxvY2F0aW9ucyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBTTEFCCmRpZmYgLS1naXQgYS9saWIvZGV2cmVzLmMgYi9saWIvZGV2cmVzLmMKaW5kZXggMmE2NjhkZC4uZWIzODg0OSAxMDA2NDQKLS0tIGEvbGliL2RldnJlcy5jCisrKyBiL2xpYi9kZXZyZXMuYwpAQCAtMjc0LDIxICsyNzQsMjEgQEAKIAogCQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBpLCBuYW1lKTsKIAkJaWYgKHJjKQotCQkJZ290byBlcnJfcmVnaW9uOworCQkJZ290byBlcnJfaW52YWw7CiAKIAkJcmMgPSAtRU5PTUVNOwogCQlpZiAoIXBjaW1faW9tYXAocGRldiwgaSwgMCkpCi0JCQlnb3RvIGVycl9pb21hcDsKKwkJCWdvdG8gZXJyX3JlZ2lvbjsKIAl9CiAKIAlyZXR1cm4gMDsKIAotIGVycl9pb21hcDoKLQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogIGVycl9yZWdpb246CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOwogIGVycl9pbnZhbDoKIAl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOwogCQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDAwNDE0ODQuLmQxMDYwYjggMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTIwNzksMjEgKzIwNzksMjcgQEAKIAkJLyogTGltaXQgdGhlIHNpemUgb2YgdGhlIGNvcHkgdG8gdGhlIGNhbGxlcidzIHdyaXRlIHNpemUgKi8KIAkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQkvKgotCQkgKiBMaW1pdCB0aGUgc2l6ZSBvZiB0aGUgY29weSB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCi0JCSAqIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0IGtub3cgaG93IHRvIHdhbGsKLQkJICogc2VnbWVudHMuCisJCS8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCBwcmVmYXVsdGluZyB3aGVuIHdyaXRlcyBhcmUgZnJvbQorCQkgKiB1c2VyLXNwYWNlLiAgTkZTZCB1c2VzIHZmc193cml0ZXYgd2l0aCBzZXZlcmFsIG5vbi1hbGlnbmVkCisJCSAqIHNlZ21lbnRzIGluIHRoZSB2ZWN0b3IsIGFuZCBsaW1pdGluZyB0byBvbmUgc2VnbWVudCBhIHRpbWUgaXMKKwkJICogYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGZvciByZS13cml0ZQogCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3ZfYmFzZSk7CisJCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQkJLyoKKwkJCSAqIExpbWl0IHRoZSBzaXplIG9mIHRoZSBjb3B5IHRvIHRoYXQgb2YgdGhlIGN1cnJlbnQKKwkJCSAqIHNlZ21lbnQsIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0CisJCQkgKiBrbm93IGhvdyB0byB3YWxrIHNlZ21lbnRzLgorCQkJICovCisJCQlieXRlcyA9IG1pbihieXRlcywgY3VyX2lvdi0+aW92X2xlbiAtIGlvdl9iYXNlKTsKIAotCQkvKgotCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20gX2ZpcnN0Xy4KLQkJICogT3RoZXJ3aXNlIHRoZXJlJ3MgYSBuYXN0eSBkZWFkbG9jayBvbiBjb3B5aW5nIGZyb20gdGhlCi0JCSAqIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLCB3aXRob3V0IGl0IGJlaW5nIG1hcmtlZAotCQkgKiB1cC10by1kYXRlLgotCQkgKi8KLQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7Ci0KKwkJCS8qCisJCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20KKwkJCSAqIF9maXJzdF8uICBPdGhlcndpc2UgdGhlcmUncyBhIG5hc3R5IGRlYWRsb2NrIG9uCisJCQkgKiBjb3B5aW5nIGZyb20gdGhlIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLAorCQkJICogd2l0aG91dCBpdCBiZWluZyBtYXJrZWQgdXAtdG8tZGF0ZS4KKwkJCSAqLworCQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisJCX0KIAkJcGFnZSA9IF9fZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsaW5kZXgsJmNhY2hlZF9wYWdlLCZscnVfcHZlYyk7CiAJCWlmICghcGFnZSkgewogCQkJc3RhdHVzID0gLUVOT01FTTsK